Use signup table in Signup API.

This commit is contained in:
Yang Luo
2021-06-17 00:49:02 +08:00
parent 3274bd0c7c
commit b11b3b6021
5 changed files with 161 additions and 75 deletions

View File

@ -18,6 +18,7 @@ import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"fmt" "fmt"
"strconv"
"strings" "strings"
"github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/object"
@ -77,9 +78,7 @@ func (c *ApiController) Signup() {
var resp Response var resp Response
if c.GetSessionUser() != "" { if c.GetSessionUser() != "" {
resp = Response{Status: "error", Msg: "Please log out first before signing up", Data: c.GetSessionUser()} c.ResponseErrorWithData("Please sign out first before signing up", c.GetSessionUser())
c.Data["json"] = resp
c.ServeJSON()
return return
} }
@ -89,39 +88,56 @@ func (c *ApiController) Signup() {
panic(err) panic(err)
} }
checkResult := object.CheckVerificationCode(form.Email, form.EmailCode)
if len(checkResult) != 0 {
responseText := fmt.Sprintf("Email%s", checkResult)
c.ResponseError(responseText)
return
}
checkPhone := fmt.Sprintf("+%s%s", form.PhonePrefix, form.Phone)
checkResult = object.CheckVerificationCode(checkPhone, form.PhoneCode)
if len(checkResult) != 0 {
responseText := fmt.Sprintf("Phone%s", checkResult)
c.ResponseError(responseText)
return
}
application := object.GetApplication(fmt.Sprintf("admin/%s", form.Application)) application := object.GetApplication(fmt.Sprintf("admin/%s", form.Application))
if !application.EnableSignUp { if !application.EnableSignUp {
resp = Response{Status: "error", Msg: "The application does not allow to sign up new account", Data: c.GetSessionUser()} c.ResponseError("The application does not allow to sign up new account")
c.Data["json"] = resp
c.ServeJSON()
return return
} }
if application.IsSignupItemEnabled("Email") {
checkResult := object.CheckVerificationCode(form.Email, form.EmailCode)
if len(checkResult) != 0 {
c.ResponseError(fmt.Sprintf("Email%s", checkResult))
return
}
}
var checkPhone string
if application.IsSignupItemEnabled("Phone") {
checkPhone = fmt.Sprintf("+%s%s", form.PhonePrefix, form.Phone)
checkResult := object.CheckVerificationCode(checkPhone, form.PhoneCode)
if len(checkResult) != 0 {
c.ResponseError(fmt.Sprintf("Phone%s", checkResult))
return
}
}
userId := fmt.Sprintf("%s/%s", form.Organization, form.Username) userId := fmt.Sprintf("%s/%s", form.Organization, form.Username)
msg := object.CheckUserSignup(form.Organization, form.Username, form.Password, form.Name, form.Email, form.Phone, form.Affiliation)
organization := object.GetOrganization(fmt.Sprintf("%s/%s", "admin", form.Organization))
msg := object.CheckUserSignup(application, organization, form.Username, form.Password, form.Name, form.Email, form.Phone, form.Affiliation)
if msg != "" { if msg != "" {
resp = Response{Status: "error", Msg: msg, Data: ""} c.ResponseError(msg)
} else { return
}
id := util.GenerateId()
if application.GetSignupItemRule("ID") == "Incremental" {
lastUser := object.GetLastUser(form.Organization)
lastIdInt := util.ParseInt(lastUser.Id)
id = strconv.Itoa(lastIdInt + 1)
}
username := form.Username
if !application.IsSignupItemVisible("Username") {
username = id
}
user := &object.User{ user := &object.User{
Owner: form.Organization, Owner: form.Organization,
Name: form.Username, Name: username,
CreatedTime: util.GetCurrentTime(), CreatedTime: util.GetCurrentTime(),
Id: util.GenerateId(), Id: id,
Type: "normal-user", Type: "normal-user",
Password: form.Password, Password: form.Password,
DisplayName: form.Name, DisplayName: form.Name,
@ -140,10 +156,10 @@ func (c *ApiController) Signup() {
object.DisableVerificationCode(form.Email) object.DisableVerificationCode(form.Email)
object.DisableVerificationCode(checkPhone) object.DisableVerificationCode(checkPhone)
util.LogInfo(c.Ctx, "API: [%s] is signed up as new user", userId)
resp = Response{Status: "ok", Msg: "", Data: userId}
}
util.LogInfo(c.Ctx, "API: [%s] is signed up as new user", userId)
resp = Response{Status: "ok", Msg: "", Data: userId}
c.Data["json"] = resp c.Data["json"] = resp
c.ServeJSON() c.ServeJSON()
} }

View File

@ -58,6 +58,11 @@ func (c *ApiController) ResponseError(error string) {
c.ServeJSON() c.ServeJSON()
} }
func (c *ApiController) ResponseErrorWithData(error string, data interface{}) {
c.Data["json"] = Response{Status: "error", Msg: error, Data: data}
c.ServeJSON()
}
func (c *ApiController) RequireSignedIn() (string, bool) { func (c *ApiController) RequireSignedIn() (string, bool) {
userId := c.GetSessionUser() userId := c.GetSessionUser()
if userId == "" { if userId == "" {

View File

@ -208,3 +208,34 @@ func (application *Application) GetEmailProvider() *Provider {
func (application *Application) GetSmsProvider() *Provider { func (application *Application) GetSmsProvider() *Provider {
return application.getProviderByCategory("SMS") return application.getProviderByCategory("SMS")
} }
func (application *Application) getSignupItem(itemName string) *SignupItem {
for _, signupItem := range application.SignupItems {
if signupItem.Name == itemName {
return signupItem
}
}
return nil
}
func (application *Application) IsSignupItemEnabled(itemName string) bool {
return application.getSignupItem(itemName) != nil
}
func (application *Application) IsSignupItemVisible(itemName string) bool {
signupItem := application.getSignupItem(itemName)
if signupItem == nil {
return false
}
return signupItem.Visible
}
func (application *Application) GetSignupItemRule(itemName string) string {
signupItem := application.getSignupItem(itemName)
if signupItem == nil {
return ""
}
return signupItem.Rule
}

View File

@ -27,36 +27,56 @@ func init() {
reWhiteSpace, _ = regexp.Compile("\\s") reWhiteSpace, _ = regexp.Compile("\\s")
} }
func CheckUserSignup(organizationName string, username string, password string, displayName string, email string, phone string, affiliation string) string { func CheckUserSignup(application *Application, organization *Organization, username string, password string, displayName string, email string, phone string, affiliation string) string {
organization := getOrganization("admin", organizationName) if organization == nil {
if len(username) <= 2 {
return "username must have at least 3 characters"
} else if len(password) <= 5 {
return "password must have at least 6 characters"
} else if organization == nil {
return "organization does not exist" return "organization does not exist"
}
if application.IsSignupItemVisible("Username") {
if len(username) <= 1 {
return "username must have at least 2 characters"
} else if reWhiteSpace.MatchString(username) { } else if reWhiteSpace.MatchString(username) {
return "username cannot contain white spaces" return "username cannot contain white spaces"
} else if HasUserByField(organizationName, "name", username) { } else if HasUserByField(organization.Name, "name", username) {
return "username already exists" return "username already exists"
} else if HasUserByField(organizationName, "email", email) { }
}
if len(password) <= 5 {
return "password must have at least 6 characters"
}
if application.IsSignupItemVisible("Email") {
if HasUserByField(organization.Name, "email", email) {
return "email already exists" return "email already exists"
} else if HasUserByField(organizationName, "phone", phone) {
return "phone already exists"
} else if displayName == "" {
return "displayName cannot be blank"
} else if affiliation == "" {
return "affiliation cannot be blank"
} else if !util.IsEmailValid(email) { } else if !util.IsEmailValid(email) {
return "email is invalid" return "email is invalid"
}
}
if application.IsSignupItemVisible("Phone") {
if HasUserByField(organization.Name, "phone", phone) {
return "phone already exists"
} else if organization.PhonePrefix == "86" && !util.IsPhoneCnValid(phone) { } else if organization.PhonePrefix == "86" && !util.IsPhoneCnValid(phone) {
return "phone number is invalid" return "phone number is invalid"
} else {
return ""
} }
} }
if application.IsSignupItemVisible("Display name") {
if displayName == "" {
return "displayName cannot be blank"
}
}
if application.IsSignupItemVisible("Affiliation") {
if affiliation == "" {
return "affiliation cannot be blank"
}
}
return ""
}
func CheckPassword(user *User, password string) string { func CheckPassword(user *User, password string) string {
organization := GetOrganizationByUser(user) organization := GetOrganizationByUser(user)

View File

@ -114,6 +114,20 @@ func GetMaskedUsers(users []*User) []*User {
return users return users
} }
func GetLastUser(owner string) *User {
user := User{Owner: owner}
existed, err := adapter.Engine.Desc("created_time", "id").Get(&user)
if err != nil {
panic(err)
}
if existed {
return &user
} else {
return nil
}
}
func UpdateUser(id string, user *User) bool { func UpdateUser(id string, user *User) bool {
owner, name := util.GetOwnerAndNameFromId(id) owner, name := util.GetOwnerAndNameFromId(id)
if getUser(owner, name) == nil { if getUser(owner, name) == nil {