diff --git a/controllers/auth.go b/controllers/auth.go index 763c9305..11e4387f 100644 --- a/controllers/auth.go +++ b/controllers/auth.go @@ -910,11 +910,20 @@ func (c *ApiController) Login() { return } - err = mfaUtil.Verify(authForm.Passcode) + passed, err := c.checkOrgMasterVerificationCode(user, authForm.Passcode) if err != nil { c.ResponseError(err.Error()) return } + + if !passed { + err = mfaUtil.Verify(authForm.Passcode) + if err != nil { + c.ResponseError(err.Error()) + return + } + } + c.SetSession("verificationCodeType", "") } else if authForm.RecoveryCode != "" { err = object.MfaRecover(user, authForm.RecoveryCode) diff --git a/controllers/verification.go b/controllers/verification.go index f23abd82..1fb1f62f 100644 --- a/controllers/verification.go +++ b/controllers/verification.go @@ -510,20 +510,28 @@ func (c *ApiController) VerifyCode() { } } - result, err := object.CheckVerificationCode(checkDest, authForm.Code, c.GetAcceptLanguage()) + passed, err := c.checkOrgMasterVerificationCode(user, authForm.Code) if err != nil { c.ResponseError(c.T(err.Error())) return } - if result.Code != object.VerificationSuccess { - c.ResponseError(result.Msg) - return - } - err = object.DisableVerificationCode(checkDest) - if err != nil { - c.ResponseError(err.Error()) - return + if !passed { + result, err := object.CheckVerificationCode(checkDest, authForm.Code, c.GetAcceptLanguage()) + if err != nil { + c.ResponseError(err.Error()) + return + } + if result.Code != object.VerificationSuccess { + c.ResponseError(result.Msg) + return + } + + err = object.DisableVerificationCode(checkDest) + if err != nil { + c.ResponseError(err.Error()) + return + } } c.SetSession("verifiedCode", authForm.Code) diff --git a/controllers/verification_util.go b/controllers/verification_util.go new file mode 100644 index 00000000..201b0d84 --- /dev/null +++ b/controllers/verification_util.go @@ -0,0 +1,36 @@ +// Copyright 2025 The Casdoor Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package controllers + +import ( + "fmt" + + "github.com/casdoor/casdoor/object" +) + +func (c *ApiController) checkOrgMasterVerificationCode(user *object.User, code string) (bool, error) { + organization, err := object.GetOrganizationByUser(user) + if err != nil { + return false, err + } + if organization == nil { + return false, fmt.Errorf("The organization: %s does not exist", user.Owner) + } + + if organization.MasterVerificationCode != "" && organization.MasterVerificationCode == code { + return true, nil + } + return false, nil +}