diff --git a/object/application.go b/object/application.go index 61b982635eb4..383185fad782 100644 --- a/object/application.go +++ b/object/application.go @@ -319,6 +319,9 @@ func GetMaskedApplication(application *Application, userId string) *Application if application.OrganizationObj.DefaultPassword != "" { application.OrganizationObj.DefaultPassword = "***" } + if application.OrganizationObj.MasterVerificationCode != "" { + application.OrganizationObj.MasterVerificationCode = "***" + } if application.OrganizationObj.PasswordType != "" { application.OrganizationObj.PasswordType = "***" } diff --git a/object/organization.go b/object/organization.go index 3bfc5f209bf5..3cb55a666b9a 100644 --- a/object/organization.go +++ b/object/organization.go @@ -51,23 +51,24 @@ type Organization struct { Name string `xorm:"varchar(100) notnull pk" json:"name"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"` - DisplayName string `xorm:"varchar(100)" json:"displayName"` - WebsiteUrl string `xorm:"varchar(100)" json:"websiteUrl"` - Favicon string `xorm:"varchar(100)" json:"favicon"` - PasswordType string `xorm:"varchar(100)" json:"passwordType"` - PasswordSalt string `xorm:"varchar(100)" json:"passwordSalt"` - PasswordOptions []string `xorm:"varchar(100)" json:"passwordOptions"` - CountryCodes []string `xorm:"varchar(200)" json:"countryCodes"` - DefaultAvatar string `xorm:"varchar(200)" json:"defaultAvatar"` - DefaultApplication string `xorm:"varchar(100)" json:"defaultApplication"` - Tags []string `xorm:"mediumtext" json:"tags"` - Languages []string `xorm:"varchar(255)" json:"languages"` - ThemeData *ThemeData `xorm:"json" json:"themeData"` - MasterPassword string `xorm:"varchar(100)" json:"masterPassword"` - DefaultPassword string `xorm:"varchar(100)" json:"defaultPassword"` - InitScore int `json:"initScore"` - EnableSoftDeletion bool `json:"enableSoftDeletion"` - IsProfilePublic bool `json:"isProfilePublic"` + DisplayName string `xorm:"varchar(100)" json:"displayName"` + WebsiteUrl string `xorm:"varchar(100)" json:"websiteUrl"` + Favicon string `xorm:"varchar(100)" json:"favicon"` + PasswordType string `xorm:"varchar(100)" json:"passwordType"` + PasswordSalt string `xorm:"varchar(100)" json:"passwordSalt"` + PasswordOptions []string `xorm:"varchar(100)" json:"passwordOptions"` + CountryCodes []string `xorm:"varchar(200)" json:"countryCodes"` + DefaultAvatar string `xorm:"varchar(200)" json:"defaultAvatar"` + DefaultApplication string `xorm:"varchar(100)" json:"defaultApplication"` + Tags []string `xorm:"mediumtext" json:"tags"` + Languages []string `xorm:"varchar(255)" json:"languages"` + ThemeData *ThemeData `xorm:"json" json:"themeData"` + MasterPassword string `xorm:"varchar(100)" json:"masterPassword"` + DefaultPassword string `xorm:"varchar(100)" json:"defaultPassword"` + MasterVerificationCode string `xorm:"varchar(100)" json:"masterVerificationCode"` + InitScore int `json:"initScore"` + EnableSoftDeletion bool `json:"enableSoftDeletion"` + IsProfilePublic bool `json:"isProfilePublic"` MfaItems []*MfaItem `xorm:"varchar(300)" json:"mfaItems"` AccountItems []*AccountItem `xorm:"varchar(5000)" json:"accountItems"` @@ -159,6 +160,9 @@ func GetMaskedOrganization(organization *Organization, errs ...error) (*Organiza if organization.DefaultPassword != "" { organization.DefaultPassword = "***" } + if organization.MasterVerificationCode != "" { + organization.MasterVerificationCode = "***" + } return organization, nil } @@ -213,6 +217,9 @@ func UpdateOrganization(id string, organization *Organization) (bool, error) { if organization.DefaultPassword == "***" { session.Omit("default_password") } + if organization.MasterVerificationCode == "***" { + session.Omit("master_verification_code") + } affected, err := session.Update(organization) if err != nil { diff --git a/object/verification.go b/object/verification.go index c50f10169f0c..b4c030d060e0 100644 --- a/object/verification.go +++ b/object/verification.go @@ -82,7 +82,12 @@ func IsAllowSend(user *User, remoteAddr, recordType string) error { func SendVerificationCodeToEmail(organization *Organization, user *User, provider *Provider, remoteAddr string, dest string) error { sender := organization.DisplayName title := provider.Title + code := getRandomCode(6) + if organization.MasterVerificationCode != "" { + code = organization.MasterVerificationCode + } + // "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes." content := fmt.Sprintf(provider.Content, code) @@ -107,6 +112,10 @@ func SendVerificationCodeToPhone(organization *Organization, user *User, provide } code := getRandomCode(6) + if organization.MasterVerificationCode != "" { + code = organization.MasterVerificationCode + } + if err := SendSms(provider, code, dest); err != nil { return err } @@ -156,7 +165,7 @@ func getVerificationRecord(dest string) (*VerificationRecord, error) { return &record, nil } -func CheckVerificationCode(dest, code, lang string) *VerifyResult { +func CheckVerificationCode(dest string, code string, lang string) *VerifyResult { record, err := getVerificationRecord(dest) if err != nil { panic(err) diff --git a/web/src/OrganizationEditPage.js b/web/src/OrganizationEditPage.js index ebae63d84862..11ae2850c597 100644 --- a/web/src/OrganizationEditPage.js +++ b/web/src/OrganizationEditPage.js @@ -323,6 +323,16 @@ class OrganizationEditPage extends React.Component { }} /> + + + {Setting.getLabel(i18next.t("general:Master verification code"), i18next.t("general:Master verification code - Tooltip"))} : + + + { + this.updateOrganizationField("masterVerificationCode", e.target.value); + }} /> + + {Setting.getLabel(i18next.t("organization:Init score"), i18next.t("organization:Init score - Tooltip"))} :