func CompleteSwitchWithOAuth(c *Context, w http.ResponseWriter, r *http.Request, service string, userData io.ReadCloser, email string) { authData := "" ssoEmail := "" provider := einterfaces.GetOauthProvider(service) if provider == nil { c.Err = model.NewLocAppError("CompleteClaimWithOAuth", "api.user.complete_switch_with_oauth.unavailable.app_error", map[string]interface{}{"Service": strings.Title(service)}, "") return } else { ssoUser := provider.GetUserFromJson(userData) ssoEmail = ssoUser.Email if ssoUser.AuthData != nil { authData = *ssoUser.AuthData } } if len(authData) == 0 { c.Err = model.NewLocAppError("CompleteClaimWithOAuth", "api.user.complete_switch_with_oauth.parse.app_error", map[string]interface{}{"Service": service}, "") return } if len(email) == 0 { c.Err = model.NewLocAppError("CompleteClaimWithOAuth", "api.user.complete_switch_with_oauth.blank_email.app_error", nil, "") return } var user *model.User if result := <-Srv.Store.User().GetByEmail(email); result.Err != nil { c.Err = result.Err return } else { user = result.Data.(*model.User) } RevokeAllSession(c, user.Id) if c.Err != nil { return } if result := <-Srv.Store.User().UpdateAuthData(user.Id, service, &authData, ssoEmail, true); result.Err != nil { c.Err = result.Err return } go sendSignInChangeEmail(c, user.Email, c.GetSiteURL(), strings.Title(service)+" SSO") }
func CreateOAuthUser(service string, userData io.Reader, teamId string) (*model.User, *model.AppError) { var user *model.User provider := einterfaces.GetOauthProvider(service) if provider == nil { return nil, model.NewLocAppError("CreateOAuthUser", "api.user.create_oauth_user.not_available.app_error", map[string]interface{}{"Service": strings.Title(service)}, "") } else { user = provider.GetUserFromJson(userData) } if user == nil { return nil, model.NewLocAppError("CreateOAuthUser", "api.user.create_oauth_user.create.app_error", map[string]interface{}{"Service": service}, "") } suchan := Srv.Store.User().GetByAuth(user.AuthData, service) euchan := Srv.Store.User().GetByEmail(user.Email) found := true count := 0 for found { if found = IsUsernameTaken(user.Username); found { user.Username = user.Username + strconv.Itoa(count) count += 1 } } if result := <-suchan; result.Err == nil { return nil, model.NewLocAppError("CreateOAuthUser", "api.user.create_oauth_user.already_used.app_error", map[string]interface{}{"Service": service}, "email="+user.Email) } if result := <-euchan; result.Err == nil { authService := result.Data.(*model.User).AuthService if authService == "" { return nil, model.NewLocAppError("CreateOAuthUser", "api.user.create_oauth_user.already_attached.app_error", map[string]interface{}{"Service": service, "Auth": model.USER_AUTH_SERVICE_EMAIL}, "email="+user.Email) } else { return nil, model.NewLocAppError("CreateOAuthUser", "api.user.create_oauth_user.already_attached.app_error", map[string]interface{}{"Service": service, "Auth": authService}, "email="+user.Email) } } user.EmailVerified = true ruser, err := CreateUser(user) if err != nil { return nil, err } if len(teamId) > 0 { err = JoinUserToTeamById(teamId, user) if err != nil { return nil, err } err = AddDirectChannels(teamId, user) if err != nil { l4g.Error(err.Error()) } } return ruser, nil }