Files
mattermost/api/user_test.go
Jesse Hallam 81e67f8759 ABC-179: check email verification last (#8172)
* ABC-179: check email verification last

This change changes the authentication checks to be:
* "preflight checks"
** mfa
** not disabled
** login attempts
* password
* "postflight checks"
** email verified

Checking whether the email is verified or not last avoids the weird edge
case where entering any bogus password for an account with an unverified
email shows a message about verifying the email and offering to resend.

* fix invalid unit test assertion

Client.CreateUser returns a user whose password has been sanitized.
Adopt the pattern in the previous assertions to use a new variable name
and test the password on the original model.User object. This didn't
expose any underlying broken behaviour, but the test wouldn't have
caught it if it had regressed.

Also fix a minor typo.
2018-02-05 10:54:13 -05:00

2744 lines
79 KiB
Go

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
package api
import (
"bytes"
"fmt"
"image"
"image/color"
"io"
"mime/multipart"
"net/http"
"os"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/mattermost/mattermost-server/app"
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store"
"github.com/mattermost/mattermost-server/utils"
)
func TestCreateUser(t *testing.T) {
th := Setup()
defer th.TearDown()
Client := th.CreateClient()
user := model.User{Email: strings.ToLower("success+"+model.NewId()) + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "hello1", Username: "n" + model.NewId()}
ruser, err := Client.CreateUser(&user, "")
if err != nil {
t.Fatal(err)
}
Client.Login(user.Email, user.Password)
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
if ruser.Data.(*model.User).Nickname != user.Nickname {
t.Fatal("nickname didn't match")
}
if ruser.Data.(*model.User).Password != "" {
t.Fatal("password wasn't blank")
}
if _, err := Client.CreateUser(ruser.Data.(*model.User), ""); err == nil {
t.Fatal("Cannot create an existing")
}
ruser.Data.(*model.User).Id = ""
ruser.Data.(*model.User).Username = "n" + model.NewId()
ruser.Data.(*model.User).Password = "passwd1"
if _, err := Client.CreateUser(ruser.Data.(*model.User), ""); err != nil {
if err.Message != "An account with that email already exists." {
t.Fatal(err)
}
}
ruser.Data.(*model.User).Email = "success+" + model.NewId() + "@simulator.amazonses.com"
ruser.Data.(*model.User).Username = user.Username
if _, err := Client.CreateUser(ruser.Data.(*model.User), ""); err != nil {
if err.Message != "An account with that username already exists." {
t.Fatal(err)
}
}
ruser.Data.(*model.User).Email = ""
if _, err := Client.CreateUser(ruser.Data.(*model.User), ""); err != nil {
if err.Message != "Invalid email" {
t.Fatal(err)
}
}
if _, err := Client.DoApiPost("/users/create", "garbage"); err == nil {
t.Fatal("should have been an error")
}
}
func TestLogin(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.EmailSettings.EnableSignInWithEmail = false
*cfg.EmailSettings.EnableSignInWithUsername = false
*cfg.LdapSettings.Enable = false
})
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
team2 := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_INVITE}
rteam2 := Client.Must(Client.CreateTeam(&team2))
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Username: "corey" + model.NewId(), Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
if result, err := Client.LoginById(ruser.Data.(*model.User).Id, user.Password); err != nil {
t.Fatal(err)
} else {
if result.Data.(*model.User).Email != user.Email {
t.Fatal("emails didn't match")
}
}
if _, err := Client.Login(user.Email, user.Password); err == nil {
t.Fatal("shouldn't be able to log in by email when disabled")
}
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.EmailSettings.EnableSignInWithEmail = true })
if result, err := Client.Login(user.Email, user.Password); err != nil {
t.Fatal(err)
} else {
if result.Data.(*model.User).Email != user.Email {
t.Fatal("emails didn't match")
}
}
if _, err := Client.Login(user.Username, user.Password); err == nil {
t.Fatal("shouldn't be able to log in by username when disabled")
}
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.EmailSettings.EnableSignInWithUsername = true })
if result, err := Client.Login(user.Username, user.Password); err != nil {
t.Fatal(err)
} else {
if result.Data.(*model.User).Email != user.Email {
t.Fatal("emails didn't match")
}
}
if _, err := Client.Login(user.Email, user.Password+"invalid"); err == nil {
t.Fatal("Invalid Password")
}
if _, err := Client.Login(user.Username, user.Password+"invalid"); err == nil {
t.Fatal("Invalid Password")
}
if _, err := Client.Login("", user.Password); err == nil {
t.Fatal("should have failed")
}
if _, err := Client.Login("", user.Password); err == nil {
t.Fatal("should have failed")
}
authToken := Client.AuthToken
Client.AuthToken = "invalid"
if _, err := Client.GetUser(ruser.Data.(*model.User).Id, ""); err == nil {
t.Fatal("should have failed")
}
Client.AuthToken = ""
user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
if _, err := Client.CreateUserFromSignup(&user2, "junk", "1231312"); err == nil {
t.Fatal("Should have errored, signed up without hashed email")
}
props := make(map[string]string)
props["email"] = user2.Email
props["id"] = rteam2.Data.(*model.Team).Id
props["display_name"] = rteam2.Data.(*model.Team).DisplayName
props["time"] = fmt.Sprintf("%v", model.GetMillis())
data := model.MapToJson(props)
hash := utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt))
ruser2, err := Client.CreateUserFromSignup(&user2, data, hash)
if err != nil {
t.Fatal(err)
}
if _, err := Client.Login(ruser2.Data.(*model.User).Email, user2.Password); err != nil {
t.Fatal("From verified hash")
}
Client.AuthToken = authToken
user3 := &model.User{
Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com",
Nickname: "Corey Hulen",
Username: "corey" + model.NewId(),
Password: "passwd1",
AuthService: model.USER_AUTH_SERVICE_LDAP,
}
ruser3 := Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser3.Id))
if _, err := Client.Login(ruser3.Id, user3.Password); err == nil {
t.Fatal("AD/LDAP user should not be able to log in with AD/LDAP disabled")
}
}
func TestLoginUnverifiedEmail(t *testing.T) {
assert := assert.New(t)
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
th.App.UpdateConfig(func(cfg *model.Config) {
*cfg.EmailSettings.EnableSignInWithEmail = true
cfg.EmailSettings.RequireEmailVerification = true
})
Client.Logout()
user := &model.User{
Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com",
Nickname: "Corey Hulen",
Username: "corey" + model.NewId(),
Password: "passwd1",
EmailVerified: false,
}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
_, err := Client.Login(user.Email, user.Password+"invalid")
if assert.NotNil(err) {
assert.Equal("api.user.check_user_password.invalid.app_error", err.Id)
}
_, err = Client.Login(user.Email, "passwd1")
if assert.NotNil(err) {
assert.Equal("api.user.login.not_verified.app_error", err.Id)
}
}
func TestLoginByLdap(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Username: "corey" + model.NewId(), Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
if _, err := Client.LoginByLdap(ruser.Data.(*model.User).Id, user.Password); err == nil {
t.Fatal("should have failed to log in with non AD/LDAP user")
}
}
func TestLoginWithDeviceId(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
user := th.BasicUser
Client.Must(Client.Logout())
deviceId := model.NewId()
if result, err := Client.LoginWithDevice(user.Email, user.Password, deviceId); err != nil {
t.Fatal(err)
} else {
ruser := result.Data.(*model.User)
if ssresult, err := Client.GetSessions(ruser.Id); err != nil {
t.Fatal(err)
} else {
sessions := ssresult.Data.([]*model.Session)
if _, err := Client.LoginWithDevice(user.Email, user.Password, deviceId); err != nil {
t.Fatal(err)
}
if sresult := <-th.App.Srv.Store.Session().Get(sessions[0].Id); sresult.Err == nil {
t.Fatal("session should have been removed")
}
}
}
}
func TestPasswordGuessLockout(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
user := th.BasicUser
Client.Must(Client.Logout())
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.EmailSettings.EnableSignInWithEmail = true })
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.MaximumLoginAttempts = 2 })
// OK to log in
if _, err := Client.Login(user.Username, user.Password); err != nil {
t.Fatal(err)
}
Client.Must(Client.Logout())
// Fail twice
if _, err := Client.Login(user.Email, "notthepassword"); err == nil {
t.Fatal("Shouldn't be able to login with bad password.")
}
if _, err := Client.Login(user.Email, "notthepassword"); err == nil {
t.Fatal("Shouldn't be able to login with bad password.")
}
// Locked out
if _, err := Client.Login(user.Email, user.Password); err == nil {
t.Fatal("Shouldn't be able to login with password when account is locked out.")
}
}
func TestSessions(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
user := th.BasicUser
Client.Must(Client.Logout())
deviceId := model.NewId()
Client.LoginWithDevice(user.Email, user.Password, deviceId)
Client.Login(user.Email, user.Password)
r1, err := Client.GetSessions(user.Id)
if err != nil {
t.Fatal(err)
}
sessions := r1.Data.([]*model.Session)
otherSession := ""
if len(sessions) != 2 {
t.Fatal("invalid number of sessions")
}
for _, session := range sessions {
if session.DeviceId == deviceId {
otherSession = session.Id
}
if len(session.Token) != 0 {
t.Fatal("shouldn't return session tokens")
}
}
if _, err := Client.RevokeSession(otherSession); err != nil {
t.Fatal(err)
}
r2, err := Client.GetSessions(user.Id)
if err != nil {
t.Fatal(err)
}
sessions2 := r2.Data.([]*model.Session)
if len(sessions2) != 1 {
t.Fatal("invalid number of sessions")
}
}
func TestGetUser(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
team2 := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam2, _ := Client.CreateTeam(&team2)
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1", FirstName: "Corey", LastName: "Hulen"}
ruser2, _ := Client.CreateUser(&user2, "")
th.LinkUserToTeam(ruser2.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser2.Data.(*model.User).Id))
user3 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser3, _ := Client.CreateUser(&user3, "")
th.LinkUserToTeam(ruser3.Data.(*model.User), rteam2.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser3.Data.(*model.User).Id))
Client.Login(user.Email, user.Password)
rId := ruser.Data.(*model.User).Id
if result, err := Client.GetUser(rId, ""); err != nil {
t.Fatal("Failed to get user")
} else {
if result.Data.(*model.User).Password != "" {
t.Fatal("User shouldn't have any password data once set")
}
if cache_result, err := Client.GetUser(rId, result.Etag); err != nil {
t.Fatal(err)
} else if cache_result.Data.(*model.User) != nil {
t.Fatal("cache should be empty")
}
}
if result, err := Client.GetMe(""); err != nil {
t.Fatal("Failed to get user")
} else {
if result.Data.(*model.User).Password != "" {
t.Fatal("User shouldn't have any password data once set")
}
}
if _, err := Client.GetUser("FORBIDDENERROR", ""); err == nil {
t.Fatal("shouldn't exist")
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = false })
if result, err := Client.GetUser(ruser2.Data.(*model.User).Id, ""); err != nil {
t.Fatal(err)
} else {
u := result.Data.(*model.User)
if u.Password != "" {
t.Fatal("password must be empty")
}
if *u.AuthData != "" {
t.Fatal("auth data must be empty")
}
if u.Email != "" {
t.Fatal("email should be sanitized")
}
if u.FirstName != "" {
t.Fatal("full name should be sanitized")
}
if u.LastName != "" {
t.Fatal("full name should be sanitized")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = true })
if result, err := Client.GetUser(ruser2.Data.(*model.User).Id, ""); err != nil {
t.Fatal(err)
} else {
u := result.Data.(*model.User)
if u.Email == "" {
t.Fatal("email should not be sanitized")
}
if u.FirstName == "" {
t.Fatal("full name should not be sanitized")
}
if u.LastName == "" {
t.Fatal("full name should not be sanitized")
}
}
if userMap, err := Client.GetProfilesInTeam(rteam.Data.(*model.Team).Id, 0, 100, ""); err != nil {
t.Fatal(err)
} else if len(userMap.Data.(map[string]*model.User)) != 3 {
t.Fatal("should have been 3")
} else if userMap.Data.(map[string]*model.User)[rId].Id != rId {
t.Fatal("should have been valid")
} else {
// test etag caching
if cache_result, err := Client.GetProfilesInTeam(rteam.Data.(*model.Team).Id, 0, 100, userMap.Etag); err != nil {
t.Fatal(err)
} else if cache_result.Data.(map[string]*model.User) != nil {
t.Log(cache_result.Data)
t.Fatal("cache should be empty")
}
}
if userMap, err := Client.GetProfilesInTeam(rteam.Data.(*model.Team).Id, 0, 1, ""); err != nil {
t.Fatal(err)
} else if len(userMap.Data.(map[string]*model.User)) != 1 {
t.Fatal("should have been 1")
}
if userMap, err := Client.GetProfilesInTeam(rteam.Data.(*model.Team).Id, 1, 1, ""); err != nil {
t.Fatal(err)
} else if len(userMap.Data.(map[string]*model.User)) != 1 {
t.Fatal("should have been 1")
}
if userMap, err := Client.GetProfilesInTeam(rteam.Data.(*model.Team).Id, 10, 10, ""); err != nil {
t.Fatal(err)
} else if len(userMap.Data.(map[string]*model.User)) != 0 {
t.Fatal("should have been 0")
}
if _, err := Client.GetProfilesInTeam(rteam2.Data.(*model.Team).Id, 0, 100, ""); err == nil {
t.Fatal("shouldn't have access")
}
Client.AuthToken = ""
if _, err := Client.GetUser(ruser2.Data.(*model.User).Id, ""); err == nil {
t.Fatal("shouldn't have accss")
}
th.App.UpdateUserRoles(ruser.Data.(*model.User).Id, model.SYSTEM_ADMIN_ROLE_ID, false)
Client.Login(user.Email, "passwd1")
if _, err := Client.GetProfilesInTeam(rteam2.Data.(*model.Team).Id, 0, 100, ""); err != nil {
t.Fatal(err)
}
}
func TestGetProfiles(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
th.BasicClient.Must(th.BasicClient.CreateDirectChannel(th.BasicUser2.Id))
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
if result, err := th.BasicClient.GetProfiles(0, 100, ""); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) < 1 {
t.Fatal("map was wrong length")
}
for _, user := range users {
if user.Email == "" {
t.Fatal("problem with show email")
}
}
// test etag caching
if cache_result, err := th.BasicClient.GetProfiles(0, 100, result.Etag); err != nil {
t.Fatal(err)
} else if cache_result.Data.(map[string]*model.User) != nil {
t.Log(cache_result.Etag)
t.Log(result.Etag)
t.Fatal("cache should be empty")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
if result, err := th.BasicClient.GetProfiles(0, 100, ""); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) < 1 {
t.Fatal("map was wrong length")
}
for _, user := range users {
if user.Email != "" {
t.Fatal("problem with show email")
}
}
}
}
func TestGetProfilesByIds(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
if result, err := th.BasicClient.GetProfilesByIds([]string{th.BasicUser.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) != 1 {
t.Fatal("map was wrong length")
}
for _, user := range users {
if user.Email == "" {
t.Fatal("problem with show email")
}
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
if result, err := th.BasicClient.GetProfilesByIds([]string{th.BasicUser.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) != 1 {
t.Fatal("map was wrong length")
}
for _, user := range users {
if user.Email != "" {
t.Fatal("problem with show email")
}
}
}
if result, err := th.BasicClient.GetProfilesByIds([]string{th.BasicUser.Id, th.BasicUser2.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) != 2 {
t.Fatal("map was wrong length")
}
}
}
func TestGetAudits(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
time.Sleep(100 * time.Millisecond)
Client.Login(user.Email, user.Password)
time.Sleep(100 * time.Millisecond)
if result, err := Client.GetAudits(ruser.Data.(*model.User).Id, ""); err != nil {
t.Fatal(err)
} else {
if len(result.Data.(model.Audits)) != 1 {
t.Fatal(result.Data.(model.Audits))
}
if cache_result, err := Client.GetAudits(ruser.Data.(*model.User).Id, result.Etag); err != nil {
t.Fatal(err)
} else if cache_result.Data.(model.Audits) != nil {
t.Fatal("cache should be empty")
}
}
if _, err := Client.GetAudits("FORBIDDENERROR", ""); err == nil {
t.Fatal("audit log shouldn't exist")
}
}
func TestUserCreateImage(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
b, err := app.CreateProfileImage("Corey Hulen", "eo1zkdr96pdj98pjmq8zy35wba", th.App.Config().FileSettings.InitialFont)
if err != nil {
t.Fatal(err)
}
rdr := bytes.NewReader(b)
img, _, err2 := image.Decode(rdr)
if err2 != nil {
t.Fatal(err)
}
colorful := color.RGBA{116, 49, 196, 255}
if img.At(1, 1) != colorful {
t.Fatal("Failed to create correct color")
}
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
Client.Login(user.Email, "passwd1")
if resp, err := Client.DoApiGet("/users/"+user.Id+"/image", "", ""); err != nil {
t.Fatal(err)
} else {
etag := resp.Header.Get(model.HEADER_ETAG_SERVER)
resp2, _ := Client.DoApiGet("/users/"+user.Id+"/image", "", etag)
if resp2.StatusCode == 304 {
t.Fatal("Shouldn't have hit etag")
}
}
if *th.App.Config().FileSettings.DriverName == model.IMAGE_DRIVER_S3 {
endpoint := th.App.Config().FileSettings.AmazonS3Endpoint
accessKey := th.App.Config().FileSettings.AmazonS3AccessKeyId
secretKey := th.App.Config().FileSettings.AmazonS3SecretAccessKey
secure := *th.App.Config().FileSettings.AmazonS3SSL
signV2 := *th.App.Config().FileSettings.AmazonS3SignV2
region := th.App.Config().FileSettings.AmazonS3Region
s3Clnt, err := s3New(endpoint, accessKey, secretKey, secure, signV2, region)
if err != nil {
t.Fatal(err)
}
bucket := th.App.Config().FileSettings.AmazonS3Bucket
if err = s3Clnt.RemoveObject(bucket, "/users/"+user.Id+"/profile.png"); err != nil {
t.Fatal(err)
}
} else {
path := th.App.Config().FileSettings.Directory + "/users/" + user.Id + "/profile.png"
if err := os.Remove(path); err != nil {
t.Fatal("Couldn't remove file at " + path)
}
}
}
func TestUserUploadProfileImage(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
Client.Logout()
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
if *th.App.Config().FileSettings.DriverName != "" {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
if _, upErr := Client.UploadProfileFile(body.Bytes(), writer.FormDataContentType()); upErr == nil {
t.Fatal("Should have errored")
}
Client.Login(user.Email, "passwd1")
Client.SetTeamId(team.Id)
if _, upErr := Client.UploadProfileFile(body.Bytes(), writer.FormDataContentType()); upErr == nil {
t.Fatal("Should have errored")
}
part, err := writer.CreateFormFile("blargh", "test.png")
if err != nil {
t.Fatal(err)
}
path, _ := utils.FindDir("tests")
file, err := os.Open(path + "/test.png")
if err != nil {
t.Fatal(err)
}
defer file.Close()
_, err = io.Copy(part, file)
if err != nil {
t.Fatal(err)
}
if err := writer.Close(); err != nil {
t.Fatal(err)
}
if _, upErr := Client.UploadProfileFile(body.Bytes(), writer.FormDataContentType()); upErr == nil {
t.Fatal("Should have errored")
}
file2, err := os.Open(path + "/test.png")
if err != nil {
t.Fatal(err)
}
defer file2.Close()
body = &bytes.Buffer{}
writer = multipart.NewWriter(body)
part, err = writer.CreateFormFile("image", "test.png")
if err != nil {
t.Fatal(err)
}
if _, err := io.Copy(part, file2); err != nil {
t.Fatal(err)
}
if err := writer.Close(); err != nil {
t.Fatal(err)
}
if _, upErr := Client.UploadProfileFile(body.Bytes(), writer.FormDataContentType()); upErr != nil {
t.Fatal(upErr)
}
Client.DoApiGet("/users/"+user.Id+"/image", "", "")
if *th.App.Config().FileSettings.DriverName == model.IMAGE_DRIVER_S3 {
endpoint := th.App.Config().FileSettings.AmazonS3Endpoint
accessKey := th.App.Config().FileSettings.AmazonS3AccessKeyId
secretKey := th.App.Config().FileSettings.AmazonS3SecretAccessKey
secure := *th.App.Config().FileSettings.AmazonS3SSL
signV2 := *th.App.Config().FileSettings.AmazonS3SignV2
region := th.App.Config().FileSettings.AmazonS3Region
s3Clnt, err := s3New(endpoint, accessKey, secretKey, secure, signV2, region)
if err != nil {
t.Fatal(err)
}
bucket := th.App.Config().FileSettings.AmazonS3Bucket
if err = s3Clnt.RemoveObject(bucket, "/users/"+user.Id+"/profile.png"); err != nil {
t.Fatal(err)
}
} else {
path := th.App.Config().FileSettings.Directory + "users/" + user.Id + "/profile.png"
if err := os.Remove(path); err != nil {
t.Fatal("Couldn't remove file at " + path)
}
}
} else {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
if _, upErr := Client.UploadProfileFile(body.Bytes(), writer.FormDataContentType()); upErr.StatusCode != http.StatusNotImplemented {
t.Fatal("Should have failed with 501 - Not Implemented")
}
}
}
func TestUserUpdate(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
Client.Logout()
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1", Roles: ""}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
if _, err := Client.UpdateUser(user); err == nil {
t.Fatal("Should have errored")
}
Client.Login(user.Email, "passwd1")
Client.SetTeamId(team.Id)
user.Nickname = "Jim Jimmy"
user.Roles = model.SYSTEM_ADMIN_ROLE_ID
user.LastPasswordUpdate = 123
if result, err := Client.UpdateUser(user); err != nil {
t.Fatal(err)
} else {
if result.Data.(*model.User).Nickname != "Jim Jimmy" {
t.Fatal("Nickname did not update properly")
}
if result.Data.(*model.User).Roles != model.SYSTEM_USER_ROLE_ID {
t.Fatal("Roles should not have updated")
}
if result.Data.(*model.User).LastPasswordUpdate == 123 {
t.Fatal("LastPasswordUpdate should not have updated")
}
}
user2 := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
th.LinkUserToTeam(user2, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user2.Id))
Client.Login(user2.Email, "passwd1")
Client.SetTeamId(team.Id)
user.Nickname = "Tim Timmy"
if _, err := Client.UpdateUser(user); err == nil {
t.Fatal("Should have errored")
}
}
func TestUserUpdatePassword(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
Client.Logout()
Client.SetTeamId(team.Id)
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
if _, err := Client.UpdateUserPassword(user.Id, "passwd1", "newpasswd1"); err == nil {
t.Fatal("Should have errored")
}
Client.Login(user.Email, "passwd1")
if _, err := Client.UpdateUserPassword("123", "passwd1", "newpwd"); err == nil {
t.Fatal("Should have errored")
}
if _, err := Client.UpdateUserPassword(user.Id, "", "newpwd"); err == nil {
t.Fatal("Should have errored")
}
if _, err := Client.UpdateUserPassword(user.Id, "passwd1", "npwd"); err == nil {
t.Fatal("Should have errored")
}
if _, err := Client.UpdateUserPassword("12345678901234567890123456", "passwd1", "newpwd1"); err == nil {
t.Fatal("Should have errored")
}
if _, err := Client.UpdateUserPassword(user.Id, "badpwd", "newpwd"); err == nil {
t.Fatal("Should have errored")
}
if _, err := Client.UpdateUserPassword(user.Id, "passwd1", "newpwd1"); err != nil {
t.Fatal(err)
}
updatedUser := Client.Must(Client.GetUser(user.Id, "")).Data.(*model.User)
if updatedUser.LastPasswordUpdate == user.LastPasswordUpdate {
t.Fatal("LastPasswordUpdate should have changed")
}
if _, err := Client.Login(user.Email, "newpwd1"); err != nil {
t.Fatal(err)
}
// Test lockout
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.MaximumLoginAttempts = 2 })
// Fail twice
if _, err := Client.UpdateUserPassword(user.Id, "badpwd", "newpwd"); err == nil {
t.Fatal("Should have errored")
}
if _, err := Client.UpdateUserPassword(user.Id, "badpwd", "newpwd"); err == nil {
t.Fatal("Should have errored")
}
// Should fail because account is locked out
if _, err := Client.UpdateUserPassword(user.Id, "newpwd1", "newpwd2"); err == nil {
t.Fatal("Should have errored")
}
user2 := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
th.LinkUserToTeam(user2, team)
Client.Login(user2.Email, "passwd1")
if _, err := Client.UpdateUserPassword(user.Id, "passwd1", "newpwd"); err == nil {
t.Fatal("Should have errored")
}
}
func TestUserUpdateRoles(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
Client.Logout()
user := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
user2 := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
th.LinkUserToTeam(user2, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user2.Id))
if _, err := Client.UpdateUserRoles(user.Id, ""); err == nil {
t.Fatal("Should have errored, not logged in")
}
Client.Login(user2.Email, "passwd1")
Client.SetTeamId(team.Id)
if _, err := Client.UpdateUserRoles(user.Id, ""); err == nil {
t.Fatal("Should have errored, not admin")
}
team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user3 := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
th.LinkUserToTeam(user3, team2)
store.Must(th.App.Srv.Store.User().VerifyEmail(user3.Id))
Client.Login(user3.Email, "passwd1")
Client.SetTeamId(team2.Id)
if _, err := Client.UpdateUserRoles(user2.Id, ""); err == nil {
t.Fatal("Should have errored, wrong team")
}
Client.Login(user.Email, "passwd1")
if _, err := Client.UpdateUserRoles("junk", ""); err == nil {
t.Fatal("Should have errored, bad id")
}
if _, err := Client.UpdateUserRoles("system_admin", ""); err == nil {
t.Fatal("Should have errored, we want to avoid this mistake")
}
if _, err := Client.UpdateUserRoles("12345678901234567890123456", ""); err == nil {
t.Fatal("Should have errored, bad id")
}
if _, err := Client.UpdateUserRoles(user2.Id, "junk"); err == nil {
t.Fatal("Should have errored, bad role")
}
}
func TestUserUpdateRolesMoreCases(t *testing.T) {
th := Setup().InitSystemAdmin().InitBasic()
defer th.TearDown()
th.SystemAdminClient.SetTeamId(th.BasicTeam.Id)
th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam)
const BASIC_USER = "system_user"
const SYSTEM_ADMIN = "system_user system_admin"
// user 1 is trying to promote user 2
if _, err := th.BasicClient.UpdateUserRoles(th.BasicUser2.Id, SYSTEM_ADMIN); err == nil {
t.Fatal("Should have errored, basic user is not a system admin")
}
// user 1 is trying to demote system admin
if _, err := th.BasicClient.UpdateUserRoles(th.SystemAdminUser.Id, BASIC_USER); err == nil {
t.Fatal("Should have errored, can only be system admin")
}
// user 1 is trying to promote himself
if _, err := th.BasicClient.UpdateUserRoles(th.BasicUser.Id, SYSTEM_ADMIN); err == nil {
t.Fatal("Should have errored, can only be system admin")
}
// System admin promoting user 2
if _, err := th.SystemAdminClient.UpdateUserRoles(th.BasicUser2.Id, SYSTEM_ADMIN); err != nil {
t.Fatal("Should have succeeded since they are system admin")
}
// System admin demoting user 2
if _, err := th.SystemAdminClient.UpdateUserRoles(th.BasicUser2.Id, BASIC_USER); err != nil {
t.Fatal("Should have succeeded since they are system admin")
}
// Setting user to team admin should have no effect on results
th.BasicClient.Must(th.SystemAdminClient.UpdateTeamRoles(th.BasicUser.Id, "team_user team_admin"))
// user 1 is trying to promote user 2
if _, err := th.BasicClient.UpdateUserRoles(th.BasicUser2.Id, SYSTEM_ADMIN); err == nil {
t.Fatal("Should have errored, basic user is not a system admin")
}
// user 1 is trying to demote system admin
if _, err := th.BasicClient.UpdateUserRoles(th.SystemAdminUser.Id, BASIC_USER); err == nil {
t.Fatal("Should have errored, can only be system admin")
}
// user 1 is trying to promote himself
if _, err := th.BasicClient.UpdateUserRoles(th.BasicUser.Id, SYSTEM_ADMIN); err == nil {
t.Fatal("Should have errored, can only be system admin")
}
// system admin demoting himself
if _, err := th.SystemAdminClient.UpdateUserRoles(th.SystemAdminUser.Id, BASIC_USER); err != nil {
t.Fatal("Should have succeeded since they are system admin")
}
}
func TestUserUpdateDeviceId(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
Client.Login(user.Email, "passwd1")
Client.SetTeamId(team.Id)
deviceId := model.PUSH_NOTIFY_APPLE + ":1234567890"
if _, err := Client.AttachDeviceId(deviceId); err != nil {
t.Fatal(err)
}
if result := <-th.App.Srv.Store.Session().GetSessions(user.Id); result.Err != nil {
t.Fatal(result.Err)
} else {
sessions := result.Data.([]*model.Session)
if sessions[0].DeviceId != deviceId {
t.Fatal("Missing device Id")
}
}
}
func TestUserUpdateDeviceId2(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
Client.Login(user.Email, "passwd1")
Client.SetTeamId(team.Id)
deviceId := model.PUSH_NOTIFY_APPLE_REACT_NATIVE + ":1234567890"
if _, err := Client.AttachDeviceId(deviceId); err != nil {
t.Fatal(err)
}
if result := <-th.App.Srv.Store.Session().GetSessions(user.Id); result.Err != nil {
t.Fatal(result.Err)
} else {
sessions := result.Data.([]*model.Session)
if sessions[0].DeviceId != deviceId {
t.Fatal("Missing device Id")
}
}
}
func TestUserUpdateActive(t *testing.T) {
th := Setup().InitBasic().InitSystemAdmin()
defer th.TearDown()
Client := th.BasicClient
SystemAdminClient := th.SystemAdminClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
Client.Logout()
user := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
user2 := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
th.LinkUserToTeam(user2, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user2.Id))
if _, err := Client.UpdateActive(user.Id, false); err == nil {
t.Fatal("Should have errored, not logged in")
}
Client.Login(user2.Email, "passwd1")
Client.SetTeamId(team.Id)
if _, err := Client.UpdateActive(user.Id, false); err == nil {
t.Fatal("Should have errored, not admin")
}
Client.Must(Client.Logout())
user3 := &model.User{Email: "success+" + model.NewId() + "@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
th.LinkUserToTeam(user2, team2)
store.Must(th.App.Srv.Store.User().VerifyEmail(user3.Id))
Client.Login(user3.Email, "passwd1")
Client.SetTeamId(team2.Id)
if _, err := Client.UpdateActive(user.Id, false); err == nil {
t.Fatal("Should have errored, not yourself")
}
Client.Login(user.Email, "passwd1")
Client.SetTeamId(team.Id)
if _, err := Client.UpdateActive("junk", false); err == nil {
t.Fatal("Should have errored, bad id")
}
if _, err := Client.UpdateActive("12345678901234567890123456", false); err == nil {
t.Fatal("Should have errored, bad id")
}
th.App.SetStatusOnline(user3.Id, "", false)
if _, err := SystemAdminClient.UpdateActive(user3.Id, false); err != nil {
t.Fatal(err)
}
if status, err := th.App.GetStatus(user3.Id); err != nil {
t.Fatal(err)
} else if status.Status != model.STATUS_OFFLINE {
t.Fatal("status should have been set to offline")
}
}
func TestUserPermDelete(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{Email: model.NewId() + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
th.LinkUserToTeam(user1, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user1.Id))
Client.Login(user1.Email, "passwd1")
Client.SetTeamId(team.Id)
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "zz" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
post1 := &model.Post{ChannelId: channel1.Id, Message: "search for post1"}
post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post)
post2 := &model.Post{ChannelId: channel1.Id, Message: "search for post2"}
post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post)
post3 := &model.Post{ChannelId: channel1.Id, Message: "#hashtag search for post3"}
post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post)
post4 := &model.Post{ChannelId: channel1.Id, Message: "hashtag for post4"}
post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post)
c := &Context{}
c.RequestId = model.NewId()
c.IpAddress = "test"
err := th.App.PermanentDeleteUser(user1)
if err != nil {
t.Fatal(err)
}
Client.ClearOAuthToken()
}
func TestSendPasswordReset(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
Client.Logout()
if result, err := Client.SendPasswordReset(user.Email); err != nil {
t.Fatal(err)
} else {
resp := result.Data.(map[string]string)
if resp["email"] != user.Email {
t.Fatal("wrong email")
}
}
if _, err := Client.SendPasswordReset("junk@junk.com"); err != nil {
t.Fatal("Should have errored - bad email")
}
if _, err := Client.SendPasswordReset(""); err == nil {
t.Fatal("Should have errored - no email")
}
authData := model.NewId()
user2 := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", AuthData: &authData, AuthService: "random"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
th.LinkUserToTeam(user2, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user2.Id))
if _, err := Client.SendPasswordReset(user2.Email); err == nil {
t.Fatal("should have errored - SSO user can't send reset password link")
}
}
/*func TestResetPassword(t *testing.T) {
th := Setup().InitSystemAdmin()
Client := th.SystemAdminClient
team := th.SystemAdminTeam
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
//Delete all the messages before check the reset password
utils.DeleteMailBox(user.Email)
Client.Must(Client.SendPasswordReset(user.Email))
//Check if the email was send to the rigth email address and the recovery key match
var resultsMailbox utils.JSONMessageHeaderInbucket
err := utils.RetryInbucket(5, func() error {
var err error
resultsMailbox, err = utils.GetMailBox(user.Email)
return err
})
if err != nil {
t.Log(err)
t.Log("No email was received, maybe due load on the server. Disabling this verification")
}
var recoveryTokenString string
if err == nil && len(resultsMailbox) > 0 {
if !strings.ContainsAny(resultsMailbox[0].To[0], user.Email) {
t.Fatal("Wrong To recipient")
} else {
if resultsEmail, err := utils.GetMessageFromMailbox(user.Email, resultsMailbox[0].ID); err == nil {
loc := strings.Index(resultsEmail.Body.Text, "token=")
if loc == -1 {
t.Log(recoveryTokenString)
t.Log(resultsEmail.Body.Text)
t.Fatal("Code not found in email")
}
loc += 6
recoveryTokenString = resultsEmail.Body.Text[loc : loc+model.TOKEN_SIZE]
t.Log(resultsEmail.Body.Text)
}
}
}
var recoveryToken *model.Token
if result := <-th.App.Srv.Store.Token().GetByToken(recoveryTokenString); result.Err != nil {
t.Log(recoveryTokenString)
t.Fatal(result.Err)
} else {
recoveryToken = result.Data.(*model.Token)
}
if recoveryToken.Token != recoveryTokenString {
t.Fatal("Did not send the correct token. DB: "+recoveryToken.Token, " Sent: "+recoveryTokenString)
}
if _, err := Client.ResetPassword(recoveryToken.Token, ""); err == nil {
t.Fatal("Should have errored - no password")
}
if _, err := Client.ResetPassword(recoveryToken.Token, "newp"); err == nil {
t.Fatal("Should have errored - password too short")
}
if _, err := Client.ResetPassword("", "newpwd"); err == nil {
t.Fatal("Should have errored - no code")
}
if _, err := Client.ResetPassword("junk", "newpwd"); err == nil {
t.Fatal("Should have errored - bad code")
}
code := ""
for i := 0; i < model.TOKEN_SIZE; i++ {
code += "a"
}
if _, err := Client.ResetPassword(code, "newpwd1"); err == nil {
t.Fatal("Should have errored - bad code")
}
if _, err := Client.ResetPassword(recoveryToken.Token, "newpwd1"); err != nil {
t.Log(recoveryToken.Token)
t.Fatal(err)
}
}*/
func TestUserUpdateNotify(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
Client.Logout()
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1", Roles: ""}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, team)
store.Must(th.App.Srv.Store.User().VerifyEmail(user.Id))
data := make(map[string]string)
data["user_id"] = user.Id
data["email"] = "true"
data["desktop"] = "all"
data["desktop_sound"] = "false"
data["comments"] = "any"
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - not logged in")
}
Client.Login(user.Email, "passwd1")
Client.SetTeamId(team.Id)
if result, err := Client.UpdateUserNotify(data); err != nil {
t.Fatal(err)
} else {
if result.Data.(*model.User).NotifyProps["desktop"] != data["desktop"] {
t.Fatal("NotifyProps did not update properly - desktop")
}
if result.Data.(*model.User).NotifyProps["desktop_sound"] != data["desktop_sound"] {
t.Fatal("NotifyProps did not update properly - desktop_sound")
}
if result.Data.(*model.User).NotifyProps["email"] != data["email"] {
t.Fatal("NotifyProps did not update properly - email")
}
if result.Data.(*model.User).NotifyProps["comments"] != data["comments"] {
t.Fatal("NotifyProps did not update properly - comments")
}
}
if _, err := Client.UpdateUserNotify(nil); err == nil {
t.Fatal("Should have errored")
}
data["user_id"] = "junk"
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - junk user id")
}
data["user_id"] = "12345678901234567890123456"
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - bad user id")
}
data["user_id"] = user.Id
data["desktop"] = ""
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - empty desktop notify")
}
data["desktop"] = "all"
data["desktop_sound"] = ""
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - empty desktop sound")
}
data["desktop_sound"] = "false"
data["email"] = ""
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - empty email")
}
data["email"] = "true"
data["comments"] = ""
if _, err := Client.UpdateUserNotify(data); err == nil {
t.Fatal("Should have errored - empty comments")
}
}
func TestFuzzyUserCreate(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
Client.Logout()
for i := 0; i < len(utils.FUZZY_STRINGS_NAMES) || i < len(utils.FUZZY_STRINGS_EMAILS); i++ {
testName := "Name"
testEmail := "test@nowhere.com"
if i < len(utils.FUZZY_STRINGS_NAMES) {
testName = utils.FUZZY_STRINGS_NAMES[i]
}
if i < len(utils.FUZZY_STRINGS_EMAILS) {
testEmail = utils.FUZZY_STRINGS_EMAILS[i]
}
user := model.User{Email: strings.ToLower(model.NewId()) + testEmail, Nickname: testName, Password: "hello1"}
ruser, err := Client.CreateUser(&user, "")
if err != nil {
t.Fatal(err)
}
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
}
}
func TestEmailToOAuth(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser := Client.Must(Client.CreateUser(&user, "")).Data.(*model.User)
th.LinkUserToTeam(ruser, rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Id))
m := map[string]string{}
if _, err := Client.EmailToOAuth(m); err == nil {
t.Fatal("should have failed - empty data")
}
m["password"] = "passwd1"
_, err := Client.EmailToOAuth(m)
if err == nil {
t.Fatal("should have failed - missing team_name, service, email")
}
m["team_name"] = team.Name
if _, err := Client.EmailToOAuth(m); err == nil {
t.Fatal("should have failed - missing service, email")
}
m["service"] = "someservice"
if _, err := Client.EmailToOAuth(m); err == nil {
t.Fatal("should have failed - missing email")
}
m["team_name"] = "junk"
if _, err := Client.EmailToOAuth(m); err == nil {
t.Fatal("should have failed - bad team name")
}
m["team_name"] = team.Name
m["email"] = "junk"
if _, err := Client.EmailToOAuth(m); err == nil {
t.Fatal("should have failed - bad email")
}
m["email"] = ruser.Email
m["password"] = "junk"
if _, err := Client.EmailToOAuth(m); err == nil {
t.Fatal("should have failed - bad password")
}
}
func TestOAuthToEmail(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser := Client.Must(Client.CreateUser(&user, "")).Data.(*model.User)
th.LinkUserToTeam(ruser, rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Id))
user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser2 := Client.Must(Client.CreateUser(&user2, "")).Data.(*model.User)
th.LinkUserToTeam(ruser2, rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser2.Id))
m := map[string]string{}
if _, err := Client.OAuthToEmail(m); err == nil {
t.Fatal("should have failed - not logged in")
}
Client.Login(user.Email, user.Password)
if _, err := Client.OAuthToEmail(m); err == nil {
t.Fatal("should have failed - empty data")
}
m["password"] = "passwd1"
_, err := Client.OAuthToEmail(m)
if err == nil {
t.Fatal("should have failed - missing team_name, service, email")
}
m["team_name"] = team.Name
if _, err := Client.OAuthToEmail(m); err == nil {
t.Fatal("should have failed - missing email")
}
m["team_name"] = team.Name
m["email"] = "junk"
if _, err := Client.OAuthToEmail(m); err == nil {
t.Fatal("should have failed - bad email")
}
m["email"] = ruser2.Email
if _, err := Client.OAuthToEmail(m); err == nil {
t.Fatal("should have failed - wrong user")
}
}
func TestLDAPToEmail(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser := Client.Must(Client.CreateUser(&user, "")).Data.(*model.User)
th.LinkUserToTeam(ruser, rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Id))
Client.Login(user.Email, user.Password)
m := map[string]string{}
if _, err := Client.LDAPToEmail(m); err == nil {
t.Fatal("should have failed - empty data")
}
m["email_password"] = "passwd1"
_, err := Client.LDAPToEmail(m)
if err == nil {
t.Fatal("should have failed - missing team_name, ldap_password, email")
}
m["team_name"] = team.Name
if _, err := Client.LDAPToEmail(m); err == nil {
t.Fatal("should have failed - missing email, ldap_password")
}
m["ldap_password"] = "passwd1"
if _, err := Client.LDAPToEmail(m); err == nil {
t.Fatal("should have failed - missing email")
}
m["email"] = ruser.Email
m["team_name"] = "junk"
if _, err := Client.LDAPToEmail(m); err == nil {
t.Fatal("should have failed - bad team name")
}
m["team_name"] = team.Name
m["email"] = "junk"
if _, err := Client.LDAPToEmail(m); err == nil {
t.Fatal("should have failed - bad email")
}
m["email"] = user.Email
if _, err := Client.LDAPToEmail(m); err == nil {
t.Fatal("should have failed - user is not an AD/LDAP user")
}
}
func TestEmailToLDAP(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser := Client.Must(Client.CreateUser(&user, "")).Data.(*model.User)
th.LinkUserToTeam(ruser, rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Id))
Client.Login(user.Email, user.Password)
m := map[string]string{}
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - empty data")
}
m["email_password"] = "passwd1"
_, err := Client.EmailToLDAP(m)
if err == nil {
t.Fatal("should have failed - missing team_name, ldap_id, ldap_password, email")
}
m["team_name"] = team.Name
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - missing email, ldap_password, ldap_id")
}
m["ldap_id"] = "someid"
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - missing email, ldap_password")
}
m["ldap_password"] = "passwd1"
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - missing email")
}
m["email"] = ruser.Email
m["team_name"] = "junk"
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - bad team name")
}
m["team_name"] = team.Name
m["email"] = "junk"
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - bad email")
}
m["email"] = user.Email
m["email_password"] = "junk"
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - bad password")
}
m["email_password"] = "passwd1"
if _, err := Client.EmailToLDAP(m); err == nil {
t.Fatal("should have failed - missing ldap bits or user")
}
}
func TestMeInitialLoad(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
if result, err := th.BasicClient.GetInitialLoad(); err != nil {
t.Fatal(err)
} else {
il := result.Data.(*model.InitialLoad)
if il.User == nil {
t.Fatal("should be valid")
}
if il.Preferences == nil {
t.Fatal("should be valid")
}
if len(il.Teams) != 1 {
t.Fatal("should be valid")
}
if len(il.TeamMembers) != 1 {
t.Fatal("should be valid")
}
if len(il.ClientCfg) == 0 {
t.Fatal("should be valid")
}
if len(il.LicenseCfg) == 0 {
t.Fatal("should be valid")
}
}
th.BasicClient.Logout()
if result, err := th.BasicClient.GetInitialLoad(); err != nil {
t.Fatal(err)
} else {
il := result.Data.(*model.InitialLoad)
if il.User != nil {
t.Fatal("should be valid")
}
if il.Preferences != nil {
t.Fatal("should be valid")
}
if len(il.Teams) != 0 {
t.Fatal("should be valid")
}
if len(il.TeamMembers) != 0 {
t.Fatal("should be valid")
}
if len(il.ClientCfg) == 0 {
t.Fatal("should be valid")
}
if len(il.LicenseCfg) == 0 {
t.Fatal("should be valid")
}
}
}
func TestGenerateMfaSecret(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
Client.Logout()
if _, err := Client.GenerateMfaSecret(); err == nil {
t.Fatal("should have failed - not logged in")
}
Client.Login(user.Email, user.Password)
if _, err := Client.GenerateMfaSecret(); err == nil {
t.Fatal("should have failed - not licensed")
}
// need to add more test cases when license and config can be configured for tests
}
func TestUpdateMfa(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
isLicensed := utils.IsLicensed()
license := utils.License()
defer func() {
utils.SetIsLicensed(isLicensed)
utils.SetLicense(license)
}()
utils.SetIsLicensed(false)
utils.SetLicense(&model.License{Features: &model.Features{}})
if utils.License().Features.MFA == nil {
utils.License().Features.MFA = new(bool)
}
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
Client.Logout()
if _, err := Client.UpdateMfa(true, "123456"); err == nil {
t.Fatal("should have failed - not logged in")
}
Client.Login(user.Email, user.Password)
if _, err := Client.UpdateMfa(true, ""); err == nil {
t.Fatal("should have failed - no token")
}
if _, err := Client.UpdateMfa(true, "123456"); err == nil {
t.Fatal("should have failed - not licensed")
}
utils.SetIsLicensed(true)
*utils.License().Features.MFA = true
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableMultifactorAuthentication = true })
if _, err := Client.UpdateMfa(true, "123456"); err == nil {
t.Fatal("should have failed - bad token")
}
// need to add more test cases when enterprise bits can be loaded into tests
}
func TestCheckMfa(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team)
Client.Logout()
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
ruser, _ := Client.CreateUser(&user, "")
th.LinkUserToTeam(ruser.Data.(*model.User), rteam.Data.(*model.Team))
store.Must(th.App.Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
if result, err := Client.CheckMfa(user.Email); err != nil {
t.Fatal(err)
} else {
resp := result.Data.(map[string]string)
if resp["mfa_required"] != "false" {
t.Fatal("mfa should not be required")
}
}
// need to add more test cases when enterprise bits can be loaded into tests
}
func TestUserTyping(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
WebSocketClient, err := th.CreateWebSocketClient()
if err != nil {
t.Fatal(err)
}
defer WebSocketClient.Close()
WebSocketClient.Listen()
time.Sleep(300 * time.Millisecond)
if resp := <-WebSocketClient.ResponseChannel; resp.Status != model.STATUS_OK {
t.Fatal("should have responded OK to authentication challenge")
}
WebSocketClient.UserTyping("", "")
time.Sleep(300 * time.Millisecond)
if resp := <-WebSocketClient.ResponseChannel; resp.Error.Id != "api.websocket_handler.invalid_param.app_error" {
t.Fatal("should have been invalid param response")
}
th.LoginBasic2()
Client.Must(Client.JoinChannel(th.BasicChannel.Id))
WebSocketClient2, err2 := th.CreateWebSocketClient()
if err2 != nil {
t.Fatal(err2)
}
defer WebSocketClient2.Close()
WebSocketClient2.Listen()
time.Sleep(300 * time.Millisecond)
WebSocketClient.UserTyping(th.BasicChannel.Id, "")
time.Sleep(300 * time.Millisecond)
stop := make(chan bool)
eventHit := false
go func() {
for {
select {
case resp := <-WebSocketClient2.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_TYPING && resp.Data["user_id"].(string) == th.BasicUser.Id {
eventHit = true
}
case <-stop:
return
}
}
}()
time.Sleep(1000 * time.Millisecond)
stop <- true
if !eventHit {
t.Fatal("did not receive typing event")
}
WebSocketClient.UserTyping(th.BasicChannel.Id, "someparentid")
time.Sleep(300 * time.Millisecond)
eventHit = false
go func() {
for {
select {
case resp := <-WebSocketClient2.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_TYPING && resp.Data["parent_id"] == "someparentid" {
eventHit = true
}
case <-stop:
return
}
}
}()
time.Sleep(300 * time.Millisecond)
stop <- true
if !eventHit {
t.Fatal("did not receive typing event")
}
}
func TestGetProfilesInChannel(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
if result, err := Client.GetProfilesInChannel(th.BasicChannel.Id, 0, 100, ""); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) < 1 {
t.Fatal("map was wrong length")
}
for _, user := range users {
if user.Email == "" {
t.Fatal("problem with show email")
}
}
}
th.LoginBasic2()
if _, err := Client.GetProfilesInChannel(th.BasicChannel.Id, 0, 100, ""); err == nil {
t.Fatal("should not have access")
}
Client.Must(Client.JoinChannel(th.BasicChannel.Id))
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
if result, err := Client.GetProfilesInChannel(th.BasicChannel.Id, 0, 100, ""); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) < 1 {
t.Fatal("map was wrong length")
}
found := false
for _, user := range users {
if user.Email != "" {
t.Fatal("problem with show email")
}
if user.Id == th.BasicUser2.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
Client.Must(Client.CreateUser(&user, ""))
Client.Login(user.Email, "passwd1")
Client.SetTeamId("junk")
if _, err := Client.GetProfilesInChannel(th.BasicChannel.Id, 0, 100, ""); err == nil {
t.Fatal("should not have access")
}
}
func TestGetProfilesNotInChannel(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
if result, err := Client.GetProfilesNotInChannel(th.BasicChannel.Id, 0, 100, ""); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) < 1 {
t.Fatal("map was wrong length")
}
found := false
for _, user := range users {
if user.Email == "" {
t.Fatal("problem with show email")
}
if user.Id == th.BasicUser2.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
user := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
th.LinkUserToTeam(user, th.BasicTeam)
th.LoginBasic2()
if _, err := Client.GetProfilesNotInChannel(th.BasicChannel.Id, 0, 100, ""); err == nil {
t.Fatal("should not have access")
}
Client.Must(Client.JoinChannel(th.BasicChannel.Id))
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
if result, err := Client.GetProfilesNotInChannel(th.BasicChannel.Id, 0, 100, ""); err != nil {
t.Fatal(err)
} else {
users := result.Data.(map[string]*model.User)
if len(users) < 1 {
t.Fatal("map was wrong length")
}
found := false
for _, user := range users {
if user.Email != "" {
t.Fatal("problem with show email")
}
if user.Id == th.BasicUser2.Id {
found = true
}
}
if found {
t.Fatal("should not have found profile")
}
}
user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"}
Client.Must(Client.CreateUser(&user2, ""))
Client.Login(user2.Email, "passwd1")
Client.SetTeamId(th.BasicTeam.Id)
if _, err := Client.GetProfilesNotInChannel(th.BasicChannel.Id, 0, 100, ""); err == nil {
t.Fatal("should not have access")
}
}
func TestSearchUsers(t *testing.T) {
th := Setup().InitBasic().InitSystemAdmin()
defer th.TearDown()
Client := th.BasicClient
inactiveUser := th.CreateUser(Client)
th.LinkUserToTeam(inactiveUser, th.BasicTeam)
th.SystemAdminClient.Must(th.SystemAdminClient.UpdateActive(inactiveUser.Id, false))
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == th.BasicUser.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: inactiveUser.Username, TeamId: th.BasicTeam.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == inactiveUser.Id {
found = true
}
}
if found {
t.Fatal("should not have found inactive user")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: inactiveUser.Username, TeamId: th.BasicTeam.Id, AllowInactive: true}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == inactiveUser.Id {
found = true
}
}
if !found {
t.Fatal("should have found inactive user")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username, InChannelId: th.BasicChannel.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 1 {
t.Fatal("map was wrong length")
}
found := false
for _, user := range users {
if user.Id == th.BasicUser.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser2.Username, NotInChannelId: th.BasicChannel.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 1 {
t.Fatal("map was wrong length")
}
found1 := false
found2 := false
for _, user := range users {
if user.Id == th.BasicUser.Id {
found1 = true
} else if user.Id == th.BasicUser2.Id {
found2 = true
}
}
if found1 {
t.Fatal("should not have found profile")
}
if !found2 {
t.Fatal("should have found profile")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser2.Username, TeamId: th.BasicTeam.Id, NotInChannelId: th.BasicChannel.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 1 {
t.Fatal("map was wrong length")
}
found1 := false
found2 := false
for _, user := range users {
if user.Id == th.BasicUser.Id {
found1 = true
} else if user.Id == th.BasicUser2.Id {
found2 = true
}
}
if found1 {
t.Fatal("should not have found profile")
}
if !found2 {
t.Fatal("should have found profile")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username, TeamId: "junk", NotInChannelId: th.BasicChannel.Id}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 0 {
t.Fatal("map was wrong length")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = false })
privacyEmailPrefix := strings.ToLower(model.NewId())
privacyUser := &model.User{Email: privacyEmailPrefix + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1", FirstName: model.NewId(), LastName: "Jimmers"}
privacyUser = Client.Must(Client.CreateUser(privacyUser, "")).Data.(*model.User)
th.LinkUserToTeam(privacyUser, th.BasicTeam)
if result, err := Client.SearchUsers(model.UserSearch{Term: privacyUser.FirstName}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == privacyUser.Id {
found = true
}
}
if found {
t.Fatal("should not have found profile")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
if result, err := Client.SearchUsers(model.UserSearch{Term: privacyUser.FirstName}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == privacyUser.Id {
found = true
}
}
if found {
t.Fatal("should not have found profile")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = true })
if result, err := Client.SearchUsers(model.UserSearch{Term: privacyUser.FirstName}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == privacyUser.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: privacyEmailPrefix}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == privacyUser.Id {
found = true
}
}
if found {
t.Fatal("should not have found profile")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = true })
if result, err := Client.SearchUsers(model.UserSearch{Term: privacyEmailPrefix}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == privacyUser.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
th.LoginBasic2()
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == th.BasicUser.Id {
found = true
}
}
if !found {
t.Fatal("should have found profile")
}
}
if _, err := Client.SearchUsers(model.UserSearch{}); err == nil {
t.Fatal("should have errored - blank term")
}
if _, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username, InChannelId: th.BasicChannel.Id}); err == nil {
t.Fatal("should not have access")
}
if _, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username, NotInChannelId: th.BasicChannel.Id}); err == nil {
t.Fatal("should not have access")
}
userWithoutTeam := th.CreateUser(Client)
if result, err := Client.SearchUsers(model.UserSearch{Term: userWithoutTeam.Username}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == userWithoutTeam.Id {
found = true
}
}
if !found {
t.Fatal("should have found user without team")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: userWithoutTeam.Username, WithoutTeam: true}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == userWithoutTeam.Id {
found = true
}
}
if !found {
t.Fatal("should have found user without team")
}
}
if result, err := Client.SearchUsers(model.UserSearch{Term: th.BasicUser.Username, WithoutTeam: true}); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
found := false
for _, user := range users {
if user.Id == th.BasicUser.Id {
found = true
}
}
if found {
t.Fatal("should not have found user with team")
}
}
}
func TestAutocompleteUsers(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
if result, err := Client.AutocompleteUsers(th.BasicUser.Username); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 1 {
t.Fatal("should have returned 1 user in")
}
}
if result, err := Client.AutocompleteUsers("amazonses"); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 0 {
t.Fatal("should have returned 0 users - email should not autocomplete")
}
}
if result, err := Client.AutocompleteUsers(""); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) == 0 {
t.Fatal("should have many users")
}
}
notInTeamUser := th.CreateUser(Client)
if result, err := Client.AutocompleteUsers(notInTeamUser.Username); err != nil {
t.Fatal(err)
} else {
users := result.Data.([]*model.User)
if len(users) != 1 {
t.Fatal("should have returned 1 user in")
}
}
if result, err := Client.AutocompleteUsersInTeam(notInTeamUser.Username); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInTeam)
if len(autocomplete.InTeam) != 0 {
t.Fatal("should have returned 0 users")
}
}
if result, err := Client.AutocompleteUsersInTeam(th.BasicUser.Username); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInTeam)
if len(autocomplete.InTeam) != 1 {
t.Fatal("should have returned 1 user in")
}
}
if result, err := Client.AutocompleteUsersInTeam(th.BasicUser.Username[0:5]); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInTeam)
if len(autocomplete.InTeam) < 1 {
t.Fatal("should have returned at least 1 user in")
}
}
if result, err := Client.AutocompleteUsersInChannel(th.BasicUser.Username, th.BasicChannel.Id); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInChannel)
if len(autocomplete.InChannel) != 1 {
t.Fatal("should have returned 1 user in")
}
if len(autocomplete.OutOfChannel) != 0 {
t.Fatal("should have returned no users out")
}
}
if result, err := Client.AutocompleteUsersInChannel("", th.BasicChannel.Id); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInChannel)
if len(autocomplete.InChannel) != 1 && autocomplete.InChannel[0].Id != th.BasicUser2.Id {
t.Fatal("should have returned at 1 user in")
}
if len(autocomplete.OutOfChannel) != 1 && autocomplete.OutOfChannel[0].Id != th.BasicUser2.Id {
t.Fatal("should have returned 1 user out")
}
}
if result, err := Client.AutocompleteUsersInTeam(""); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInTeam)
if len(autocomplete.InTeam) != 2 {
t.Fatal("should have returned 2 users in")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = false })
privacyUser := &model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1", FirstName: model.NewId(), LastName: "Jimmers"}
privacyUser = Client.Must(Client.CreateUser(privacyUser, "")).Data.(*model.User)
th.LinkUserToTeam(privacyUser, th.BasicTeam)
if result, err := Client.AutocompleteUsersInChannel(privacyUser.FirstName, th.BasicChannel.Id); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInChannel)
if len(autocomplete.InChannel) != 0 {
t.Fatal("should have returned no users")
}
if len(autocomplete.OutOfChannel) != 0 {
t.Fatal("should have returned no users")
}
}
if result, err := Client.AutocompleteUsersInTeam(privacyUser.FirstName); err != nil {
t.Fatal(err)
} else {
autocomplete := result.Data.(*model.UserAutocompleteInTeam)
if len(autocomplete.InTeam) != 0 {
t.Fatal("should have returned no users")
}
}
if _, err := Client.AutocompleteUsersInChannel("", "junk"); err == nil {
t.Fatal("should have errored - bad channel id")
}
Client.SetTeamId("junk")
if _, err := Client.AutocompleteUsersInChannel("", th.BasicChannel.Id); err == nil {
t.Fatal("should have errored - bad team id")
}
if _, err := Client.AutocompleteUsersInTeam(""); err == nil {
t.Fatal("should have errored - bad team id")
}
}
func TestGetByUsername(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
if result, err := Client.GetByUsername(th.BasicUser.Username, ""); err != nil {
t.Fatal("Failed to get user")
} else {
if result.Data.(*model.User).Password != "" {
t.Fatal("User shouldn't have any password data once set")
}
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = false })
if result, err := Client.GetByUsername(th.BasicUser2.Username, ""); err != nil {
t.Fatal(err)
} else {
u := result.Data.(*model.User)
if u.Password != "" {
t.Fatal("password must be empty")
}
if *u.AuthData != "" {
t.Fatal("auth data must be empty")
}
if u.Email != "" {
t.Fatal("email should be sanitized")
}
}
}
func TestGetByEmail(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
Client := th.BasicClient
if _, respMetdata := Client.GetByEmail(th.BasicUser.Email, ""); respMetdata.Error != nil {
t.Fatal("Failed to get user by email")
}
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowEmailAddress = false })
th.App.UpdateConfig(func(cfg *model.Config) { cfg.PrivacySettings.ShowFullName = false })
if user, respMetdata := Client.GetByEmail(th.BasicUser2.Email, ""); respMetdata.Error != nil {
t.Fatal(respMetdata.Error)
} else {
if user.Password != "" {
t.Fatal("password must be empty")
}
if *user.AuthData != "" {
t.Fatal("auth data must be empty")
}
if user.Email != "" {
t.Fatal("email should be sanitized")
}
}
}