mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-21 16:03:50 +08:00
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
df2a5681cc | |||
ac102480c7 |
@ -393,6 +393,20 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if oldUser.Address == nil {
|
||||
oldUser.Address = []string{}
|
||||
}
|
||||
oldUserAddressJson, _ := json.Marshal(oldUser.Address)
|
||||
|
||||
if newUser.Address == nil {
|
||||
newUser.Address = []string{}
|
||||
}
|
||||
newUserAddressJson, _ := json.Marshal(newUser.Address)
|
||||
if string(oldUserAddressJson) != string(newUserAddressJson) {
|
||||
item := GetAccountItemByName("Address", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if newUser.FaceIds != nil {
|
||||
item := GetAccountItemByName("Face ID", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
@ -426,6 +440,31 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if oldUser.Karma != newUser.Karma {
|
||||
item := GetAccountItemByName("Karma", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if oldUser.Language != newUser.Language {
|
||||
item := GetAccountItemByName("Language", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if oldUser.Ranking != newUser.Ranking {
|
||||
item := GetAccountItemByName("Ranking", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if oldUser.Currency != newUser.Currency {
|
||||
item := GetAccountItemByName("Currency", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
if oldUser.Hash != newUser.Hash {
|
||||
item := GetAccountItemByName("Hash", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
|
||||
for _, accountItem := range itemsChanged {
|
||||
|
||||
if pass, err := CheckAccountItemModifyRule(accountItem, isAdmin, lang); !pass {
|
||||
|
@ -18,6 +18,7 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/casdoor/casdoor/conf"
|
||||
"github.com/casdoor/casdoor/object"
|
||||
@ -27,6 +28,14 @@ import (
|
||||
"layeh.com/radius/rfc2866"
|
||||
)
|
||||
|
||||
var StateMap map[string]AccessStateContent
|
||||
|
||||
const StateExpiredTime = time.Second * 120
|
||||
|
||||
type AccessStateContent struct {
|
||||
ExpiredAt time.Time
|
||||
}
|
||||
|
||||
func StartRadiusServer() {
|
||||
secret := conf.GetConfigString("radiusSecret")
|
||||
server := radius.PacketServer{
|
||||
@ -55,6 +64,7 @@ func handleAccessRequest(w radius.ResponseWriter, r *radius.Request) {
|
||||
username := rfc2865.UserName_GetString(r.Packet)
|
||||
password := rfc2865.UserPassword_GetString(r.Packet)
|
||||
organization := rfc2865.Class_GetString(r.Packet)
|
||||
state := rfc2865.State_GetString(r.Packet)
|
||||
log.Printf("handleAccessRequest() username=%v, org=%v, password=%v", username, organization, password)
|
||||
|
||||
if organization == "" {
|
||||
@ -62,12 +72,75 @@ func handleAccessRequest(w radius.ResponseWriter, r *radius.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
_, err := object.CheckUserPassword(organization, username, password, "en")
|
||||
var user *object.User
|
||||
var err error
|
||||
|
||||
if state == "" {
|
||||
user, err = object.CheckUserPassword(organization, username, password, "en")
|
||||
} else {
|
||||
user, err = object.GetUser(fmt.Sprintf("%s/%s", organization, username))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
if user.IsMfaEnabled() {
|
||||
mfaProp := user.GetMfaProps(object.TotpType, false)
|
||||
if mfaProp == nil {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
if StateMap == nil {
|
||||
StateMap = map[string]AccessStateContent{}
|
||||
}
|
||||
|
||||
if state != "" {
|
||||
stateContent, ok := StateMap[state]
|
||||
if !ok {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
delete(StateMap, state)
|
||||
if stateContent.ExpiredAt.Before(time.Now()) {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
mfaUtil := object.GetMfaUtil(mfaProp.MfaType, mfaProp)
|
||||
if mfaUtil.Verify(password) != nil {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
w.Write(r.Response(radius.CodeAccessAccept))
|
||||
return
|
||||
}
|
||||
|
||||
responseState := util.GenerateId()
|
||||
StateMap[responseState] = AccessStateContent{
|
||||
time.Now().Add(StateExpiredTime),
|
||||
}
|
||||
|
||||
err = rfc2865.State_Set(r.Packet, []byte(responseState))
|
||||
if err != nil {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
err = rfc2865.ReplyMessage_Set(r.Packet, []byte("please enter OTP"))
|
||||
if err != nil {
|
||||
w.Write(r.Response(radius.CodeAccessReject))
|
||||
return
|
||||
}
|
||||
|
||||
r.Packet.Code = radius.CodeAccessChallenge
|
||||
w.Write(r.Packet)
|
||||
}
|
||||
|
||||
w.Write(r.Response(radius.CodeAccessAccept))
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user