func TestUserStoreSave(t *testing.T) { Setup() teamId := model.NewId() u1 := model.User{} u1.Email = model.NewId() u1.Username = model.NewId() if err := (<-store.User().Save(&u1)).Err; err != nil { t.Fatal("couldn't save user", err) } Must(store.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id})) if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("shouldn't be able to update user from save") } u1.Id = "" if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("should be unique email") } u1.Email = "" if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("should be unique username") } u1.Email = strings.Repeat("0123456789", 20) u1.Username = "" if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("should be unique username") } for i := 0; i < 50; i++ { u1.Id = "" u1.Email = model.NewId() u1.Username = model.NewId() if err := (<-store.User().Save(&u1)).Err; err != nil { t.Fatal("couldn't save item", err) } Must(store.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id})) } u1.Id = "" u1.Email = model.NewId() u1.Username = model.NewId() if err := (<-store.User().Save(&u1)).Err; err != nil { t.Fatal("couldn't save item", err) } if err := (<-store.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id})).Err; err == nil { t.Fatal("should be the limit") } }
func TestUserStoreGetByUsername(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() u1.Username = model.NewId() Must(store.User().Save(&u1)) if err := (<-store.User().GetByUsername(u1.TeamId, u1.Username)).Err; err != nil { t.Fatal(err) } if err := (<-store.User().GetByUsername("", "")).Err; err == nil { t.Fatal("Should have failed because of missing username") } }
func signupCompleteOAuth(c *api.Context, w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) service := params["service"] code := r.URL.Query().Get("code") state := r.URL.Query().Get("state") uri := c.GetSiteURL() + "/signup/" + service + "/complete" if body, team, err := api.AuthorizeOAuthUser(service, code, state, uri); err != nil { c.Err = err return } else { var user *model.User if service == model.USER_AUTH_SERVICE_GITLAB { glu := model.GitLabUserFromJson(body) user = model.UserFromGitLabUser(glu) } if user == nil { c.Err = model.NewAppError("signupCompleteOAuth", "Could not create user out of "+service+" user object", "") return } suchan := api.Srv.Store.User().GetByAuth(team.Id, user.AuthData, service) euchan := api.Srv.Store.User().GetByEmail(team.Id, user.Email) if team.Email == "" { team.Email = user.Email if result := <-api.Srv.Store.Team().Update(team); result.Err != nil { c.Err = result.Err return } } else { found := true count := 0 for found { if found = api.IsUsernameTaken(user.Username, team.Id); c.Err != nil { return } else if found { user.Username = user.Username + strconv.Itoa(count) count += 1 } } } if result := <-suchan; result.Err == nil { c.Err = model.NewAppError("signupCompleteOAuth", "This "+service+" account has already been used to sign up for team "+team.DisplayName, "email="+user.Email) return } if result := <-euchan; result.Err == nil { c.Err = model.NewAppError("signupCompleteOAuth", "Team "+team.DisplayName+" already has a user with the email address attached to your "+service+" account", "email="+user.Email) return } user.TeamId = team.Id user.EmailVerified = true ruser := api.CreateUser(c, team, user) if c.Err != nil { return } api.Login(c, w, r, ruser, "") if c.Err != nil { return } root(c, w, r) } }
func TestUserUnreadCount(t *testing.T) { Setup() teamId := model.NewId() c1 := model.Channel{} c1.TeamId = teamId c1.DisplayName = "Unread Messages" c1.Name = "unread-messages" c1.Type = model.CHANNEL_OPEN c2 := model.Channel{} c2.TeamId = teamId c2.DisplayName = "Unread Direct" c2.Name = "unread-direct" c2.Type = model.CHANNEL_DIRECT u1 := model.User{} u1.Email = model.NewId() u1.Username = "******" u1.TeamId = teamId Must(store.User().Save(&u1)) u2 := model.User{} u2.Email = model.NewId() u2.Username = "******" u2.TeamId = teamId Must(store.User().Save(&u2)) if err := (<-store.Channel().Save(&c1)).Err; err != nil { t.Fatal("couldn't save item", err) } m1 := model.ChannelMember{} m1.ChannelId = c1.Id m1.UserId = u1.Id m1.NotifyProps = model.GetDefaultChannelNotifyProps() m2 := model.ChannelMember{} m2.ChannelId = c1.Id m2.UserId = u2.Id m2.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m2)) m1.ChannelId = c2.Id m2.ChannelId = c2.Id if err := (<-store.Channel().SaveDirectChannel(&c2, &m1, &m2)).Err; err != nil { t.Fatal("couldn't save direct channel", err) } p1 := model.Post{} p1.ChannelId = c1.Id p1.UserId = u1.Id p1.Message = "this is a message for @" + u2.Username // Post one message with mention to open channel Must(store.Post().Save(&p1)) Must(store.Channel().IncrementMentionCount(c1.Id, u2.Id)) // Post 2 messages without mention to direct channel p2 := model.Post{} p2.ChannelId = c2.Id p2.UserId = u1.Id p2.Message = "first message" Must(store.Post().Save(&p2)) p3 := model.Post{} p3.ChannelId = c2.Id p3.UserId = u1.Id p3.Message = "second message" Must(store.Post().Save(&p3)) badge := (<-store.User().GetUnreadCount(u2.Id)).Data.(int64) if badge != 3 { t.Fatal("should have 3 unread messages") } }
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 }