From a4f836ee946153d48497bd262db28ea3840e23df Mon Sep 17 00:00:00 2001 From: Roobtyan Date: Tue, 31 May 2022 21:49:56 +0800 Subject: [PATCH] fix: handle WeChat username conflicts (#771) * handle username conflicts * Update auth.go Co-authored-by: roobtyan Co-authored-by: Yang Luo --- controllers/auth.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/controllers/auth.go b/controllers/auth.go index 6bae47d472a6..4918f99bc0a3 100644 --- a/controllers/auth.go +++ b/controllers/auth.go @@ -28,6 +28,7 @@ import ( "github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/proxy" "github.com/casdoor/casdoor/util" + "github.com/google/uuid" ) func codeToResponse(code *object.Code) *Response { @@ -252,7 +253,7 @@ func (c *ApiController) Login() { record := object.NewRecord(c.Ctx) record.Organization = application.Organization record.User = user.Name - util.SafeGoroutine(func() {object.AddRecord(record)}) + util.SafeGoroutine(func() { object.AddRecord(record) }) } } else if form.Provider != "" { application := object.GetApplication(fmt.Sprintf("admin/%s", form.Application)) @@ -345,7 +346,7 @@ func (c *ApiController) Login() { record := object.NewRecord(c.Ctx) record.Organization = application.Organization record.User = user.Name - util.SafeGoroutine(func() {object.AddRecord(record)}) + util.SafeGoroutine(func() { object.AddRecord(record) }) } else if provider.Category == "OAuth" { // Sign up via OAuth if !application.EnableSignUp { @@ -358,6 +359,19 @@ func (c *ApiController) Login() { return } + // Handle username conflicts + tmpUser := object.GetUser(fmt.Sprintf("%s/%s", application.Organization, userInfo.Username)) + if tmpUser != nil { + uid, err := uuid.NewRandom() + if err != nil { + c.ResponseError(err.Error()) + return + } + + uidStr := strings.Split(uid.String(), "-") + userInfo.Username = fmt.Sprintf("%s_%s", userInfo.Username, uidStr[1]) + } + properties := map[string]string{} properties["no"] = strconv.Itoa(len(object.GetUsers(application.Organization)) + 2) user = &object.User{ @@ -394,7 +408,7 @@ func (c *ApiController) Login() { record := object.NewRecord(c.Ctx) record.Organization = application.Organization record.User = user.Name - util.SafeGoroutine(func() {object.AddRecord(record)}) + util.SafeGoroutine(func() { object.AddRecord(record) }) } else if provider.Category == "SAML" { resp = &Response{Status: "error", Msg: "The account does not exist"} }