mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-03 20:50:19 +08:00
Use signup table in Signup API.
This commit is contained in:
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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 == "" {
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user