diff --git a/controllers/service.go b/controllers/service.go index 16ac59eb..97c84f1d 100644 --- a/controllers/service.go +++ b/controllers/service.go @@ -54,6 +54,11 @@ type NotificationForm struct { // @Success 200 {object} controllers.Response The Response object // @router /api/send-email [post] func (c *ApiController) SendEmail() { + user, ok := c.RequireSignedInUser() + if !ok { + return + } + var emailForm EmailForm err := json.Unmarshal(c.Ctx.Input.RequestBody, &emailForm) @@ -108,8 +113,13 @@ func (c *ApiController) SendEmail() { } code := "123456" + // "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes." - content := fmt.Sprintf(emailForm.Content, code) + content := strings.Replace(provider.Content, "%s", code, 1) + if user != nil { + content = strings.Replace(content, "%{user.friendlyName}", user.GetFriendlyName(), 1) + } + for _, receiver := range emailForm.Receivers { err = object.SendEmail(provider, emailForm.Title, content, receiver, emailForm.Sender) if err != nil { diff --git a/object/user.go b/object/user.go index 1243ce01..d2651c38 100644 --- a/object/user.go +++ b/object/user.go @@ -886,6 +886,18 @@ func (user *User) GetId() string { return fmt.Sprintf("%s/%s", user.Owner, user.Name) } +func (user *User) GetFriendlyName() string { + if user.FirstName != "" && user.LastName != "" { + return fmt.Sprintf("%s, %s", user.FirstName, user.LastName) + } else if user.DisplayName != "" { + return user.DisplayName + } else if user.Name != "" { + return user.Name + } else { + return user.Id + } +} + func isUserIdGlobalAdmin(userId string) bool { return strings.HasPrefix(userId, "built-in/") || strings.HasPrefix(userId, "app/") } diff --git a/object/verification.go b/object/verification.go index 6374add2..634417b2 100644 --- a/object/verification.go +++ b/object/verification.go @@ -89,7 +89,10 @@ func SendVerificationCodeToEmail(organization *Organization, user *User, provide } // "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes." - content := fmt.Sprintf(provider.Content, code) + content := strings.Replace(provider.Content, "%s", code, 1) + if user != nil { + content = strings.Replace(content, "%{user.friendlyName}", user.GetFriendlyName(), 1) + } if err := IsAllowSend(user, remoteAddr, provider.Category); err != nil { return err diff --git a/web/src/ProviderEditPage.js b/web/src/ProviderEditPage.js index 2794bd08..44e11b40 100644 --- a/web/src/ProviderEditPage.js +++ b/web/src/ProviderEditPage.js @@ -488,7 +488,7 @@ class ProviderEditPage extends React.Component { this.updateProviderField("port", 465); this.updateProviderField("disableSsl", false); this.updateProviderField("title", "Casdoor Verification Code"); - this.updateProviderField("content", "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes."); + this.updateProviderField("content", Setting.getDefaultHtmlEmailContent()); this.updateProviderField("receiver", this.props.account.email); } else if (value === "SMS") { this.updateProviderField("type", "Twilio SMS"); @@ -975,8 +975,11 @@ class ProviderEditPage extends React.Component {
%{user.friendlyName}, here is your verification code
+Use this code for your transaction. It's valid for 5 minutes
+Thanks
+Casbin Team
+