github.com/demisto/mattermost-server@v4.9.0-rc3+incompatible/api4/user.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"strconv"
    10  	"time"
    11  
    12  	l4g "github.com/alecthomas/log4go"
    13  	"github.com/mattermost/mattermost-server/app"
    14  	"github.com/mattermost/mattermost-server/model"
    15  	"github.com/mattermost/mattermost-server/store"
    16  )
    17  
    18  func (api *API) InitUser() {
    19  	api.BaseRoutes.Users.Handle("", api.ApiHandler(createUser)).Methods("POST")
    20  	api.BaseRoutes.Users.Handle("", api.ApiSessionRequired(getUsers)).Methods("GET")
    21  	api.BaseRoutes.Users.Handle("/ids", api.ApiSessionRequired(getUsersByIds)).Methods("POST")
    22  	api.BaseRoutes.Users.Handle("/usernames", api.ApiSessionRequired(getUsersByNames)).Methods("POST")
    23  	api.BaseRoutes.Users.Handle("/search", api.ApiSessionRequired(searchUsers)).Methods("POST")
    24  	api.BaseRoutes.Users.Handle("/autocomplete", api.ApiSessionRequired(autocompleteUsers)).Methods("GET")
    25  
    26  	api.BaseRoutes.User.Handle("", api.ApiSessionRequired(getUser)).Methods("GET")
    27  	api.BaseRoutes.User.Handle("/image", api.ApiSessionRequiredTrustRequester(getProfileImage)).Methods("GET")
    28  	api.BaseRoutes.User.Handle("/image", api.ApiSessionRequired(setProfileImage)).Methods("POST")
    29  	api.BaseRoutes.User.Handle("", api.ApiSessionRequired(updateUser)).Methods("PUT")
    30  	api.BaseRoutes.User.Handle("/patch", api.ApiSessionRequired(patchUser)).Methods("PUT")
    31  	api.BaseRoutes.User.Handle("", api.ApiSessionRequired(deleteUser)).Methods("DELETE")
    32  	api.BaseRoutes.User.Handle("/roles", api.ApiSessionRequired(updateUserRoles)).Methods("PUT")
    33  	api.BaseRoutes.User.Handle("/active", api.ApiSessionRequired(updateUserActive)).Methods("PUT")
    34  	api.BaseRoutes.User.Handle("/password", api.ApiSessionRequired(updatePassword)).Methods("PUT")
    35  	api.BaseRoutes.Users.Handle("/password/reset", api.ApiHandler(resetPassword)).Methods("POST")
    36  	api.BaseRoutes.Users.Handle("/password/reset/send", api.ApiHandler(sendPasswordReset)).Methods("POST")
    37  	api.BaseRoutes.Users.Handle("/email/verify", api.ApiHandler(verifyUserEmail)).Methods("POST")
    38  	api.BaseRoutes.Users.Handle("/email/verify/send", api.ApiHandler(sendVerificationEmail)).Methods("POST")
    39  
    40  	api.BaseRoutes.User.Handle("/auth", api.ApiSessionRequiredTrustRequester(updateUserAuth)).Methods("PUT")
    41  
    42  	api.BaseRoutes.Users.Handle("/mfa", api.ApiHandler(checkUserMfa)).Methods("POST")
    43  	api.BaseRoutes.User.Handle("/mfa", api.ApiSessionRequiredMfa(updateUserMfa)).Methods("PUT")
    44  	api.BaseRoutes.User.Handle("/mfa/generate", api.ApiSessionRequiredMfa(generateMfaSecret)).Methods("POST")
    45  
    46  	api.BaseRoutes.Users.Handle("/login", api.ApiHandler(login)).Methods("POST")
    47  	api.BaseRoutes.Users.Handle("/login/switch", api.ApiHandler(switchAccountType)).Methods("POST")
    48  	api.BaseRoutes.Users.Handle("/logout", api.ApiHandler(logout)).Methods("POST")
    49  
    50  	api.BaseRoutes.UserByUsername.Handle("", api.ApiSessionRequired(getUserByUsername)).Methods("GET")
    51  	api.BaseRoutes.UserByEmail.Handle("", api.ApiSessionRequired(getUserByEmail)).Methods("GET")
    52  
    53  	api.BaseRoutes.User.Handle("/sessions", api.ApiSessionRequired(getSessions)).Methods("GET")
    54  	api.BaseRoutes.User.Handle("/sessions/revoke", api.ApiSessionRequired(revokeSession)).Methods("POST")
    55  	api.BaseRoutes.User.Handle("/sessions/revoke/all", api.ApiSessionRequired(revokeAllSessionsForUser)).Methods("POST")
    56  	api.BaseRoutes.Users.Handle("/sessions/device", api.ApiSessionRequired(attachDeviceId)).Methods("PUT")
    57  	api.BaseRoutes.User.Handle("/audits", api.ApiSessionRequired(getUserAudits)).Methods("GET")
    58  
    59  	api.BaseRoutes.User.Handle("/tokens", api.ApiSessionRequired(createUserAccessToken)).Methods("POST")
    60  	api.BaseRoutes.User.Handle("/tokens", api.ApiSessionRequired(getUserAccessTokensForUser)).Methods("GET")
    61  	api.BaseRoutes.Users.Handle("/tokens", api.ApiSessionRequired(getUserAccessTokens)).Methods("GET")
    62  	api.BaseRoutes.Users.Handle("/tokens/search", api.ApiSessionRequired(searchUserAccessTokens)).Methods("POST")
    63  	api.BaseRoutes.Users.Handle("/tokens/{token_id:[A-Za-z0-9]+}", api.ApiSessionRequired(getUserAccessToken)).Methods("GET")
    64  	api.BaseRoutes.Users.Handle("/tokens/revoke", api.ApiSessionRequired(revokeUserAccessToken)).Methods("POST")
    65  	api.BaseRoutes.Users.Handle("/tokens/disable", api.ApiSessionRequired(disableUserAccessToken)).Methods("POST")
    66  	api.BaseRoutes.Users.Handle("/tokens/enable", api.ApiSessionRequired(enableUserAccessToken)).Methods("POST")
    67  }
    68  
    69  func createUser(c *Context, w http.ResponseWriter, r *http.Request) {
    70  	user := model.UserFromJson(r.Body)
    71  	if user == nil {
    72  		c.SetInvalidParam("user")
    73  		return
    74  	}
    75  
    76  	hash := r.URL.Query().Get("h")
    77  	inviteId := r.URL.Query().Get("iid")
    78  
    79  	// No permission check required
    80  
    81  	var ruser *model.User
    82  	var err *model.AppError
    83  	if len(hash) > 0 {
    84  		ruser, err = c.App.CreateUserWithHash(user, hash, r.URL.Query().Get("d"))
    85  	} else if len(inviteId) > 0 {
    86  		ruser, err = c.App.CreateUserWithInviteId(user, inviteId)
    87  	} else if c.IsSystemAdmin() {
    88  		ruser, err = c.App.CreateUserAsAdmin(user)
    89  	} else {
    90  		ruser, err = c.App.CreateUserFromSignup(user)
    91  	}
    92  
    93  	if err != nil {
    94  		c.Err = err
    95  		return
    96  	}
    97  
    98  	w.WriteHeader(http.StatusCreated)
    99  	w.Write([]byte(ruser.ToJson()))
   100  }
   101  
   102  func getUser(c *Context, w http.ResponseWriter, r *http.Request) {
   103  	c.RequireUserId()
   104  	if c.Err != nil {
   105  		return
   106  	}
   107  
   108  	// No permission check required
   109  
   110  	var user *model.User
   111  	var err *model.AppError
   112  
   113  	if user, err = c.App.GetUser(c.Params.UserId); err != nil {
   114  		c.Err = err
   115  		return
   116  	}
   117  
   118  	etag := user.Etag(c.App.Config().PrivacySettings.ShowFullName, c.App.Config().PrivacySettings.ShowEmailAddress)
   119  
   120  	if c.HandleEtag(etag, "Get User", w, r) {
   121  		return
   122  	} else {
   123  		if c.Session.UserId == user.Id {
   124  			user.Sanitize(map[string]bool{})
   125  		} else {
   126  			c.App.SanitizeProfile(user, c.IsSystemAdmin())
   127  		}
   128  		c.App.UpdateLastActivityAtIfNeeded(c.Session)
   129  		w.Header().Set(model.HEADER_ETAG_SERVER, etag)
   130  		w.Write([]byte(user.ToJson()))
   131  		return
   132  	}
   133  }
   134  
   135  func getUserByUsername(c *Context, w http.ResponseWriter, r *http.Request) {
   136  	c.RequireUsername()
   137  	if c.Err != nil {
   138  		return
   139  	}
   140  
   141  	// No permission check required
   142  
   143  	var user *model.User
   144  	var err *model.AppError
   145  
   146  	if user, err = c.App.GetUserByUsername(c.Params.Username); err != nil {
   147  		c.Err = err
   148  		return
   149  	}
   150  
   151  	etag := user.Etag(c.App.Config().PrivacySettings.ShowFullName, c.App.Config().PrivacySettings.ShowEmailAddress)
   152  
   153  	if c.HandleEtag(etag, "Get User", w, r) {
   154  		return
   155  	} else {
   156  		c.App.SanitizeProfile(user, c.IsSystemAdmin())
   157  		w.Header().Set(model.HEADER_ETAG_SERVER, etag)
   158  		w.Write([]byte(user.ToJson()))
   159  		return
   160  	}
   161  }
   162  
   163  func getUserByEmail(c *Context, w http.ResponseWriter, r *http.Request) {
   164  	c.RequireEmail()
   165  	if c.Err != nil {
   166  		return
   167  	}
   168  
   169  	// No permission check required
   170  
   171  	var user *model.User
   172  	var err *model.AppError
   173  
   174  	if user, err = c.App.GetUserByEmail(c.Params.Email); err != nil {
   175  		c.Err = err
   176  		return
   177  	}
   178  
   179  	etag := user.Etag(c.App.Config().PrivacySettings.ShowFullName, c.App.Config().PrivacySettings.ShowEmailAddress)
   180  
   181  	if c.HandleEtag(etag, "Get User", w, r) {
   182  		return
   183  	} else {
   184  		c.App.SanitizeProfile(user, c.IsSystemAdmin())
   185  		w.Header().Set(model.HEADER_ETAG_SERVER, etag)
   186  		w.Write([]byte(user.ToJson()))
   187  		return
   188  	}
   189  }
   190  
   191  func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
   192  	c.RequireUserId()
   193  	if c.Err != nil {
   194  		return
   195  	}
   196  
   197  	if users, err := c.App.GetUsersByIds([]string{c.Params.UserId}, c.IsSystemAdmin()); err != nil {
   198  		c.Err = err
   199  		return
   200  	} else {
   201  		if len(users) == 0 {
   202  			c.Err = err
   203  		}
   204  
   205  		user := users[0]
   206  		etag := strconv.FormatInt(user.LastPictureUpdate, 10)
   207  		if c.HandleEtag(etag, "Get Profile Image", w, r) {
   208  			return
   209  		}
   210  
   211  		var img []byte
   212  		img, readFailed, err := c.App.GetProfileImage(user)
   213  		if err != nil {
   214  			c.Err = err
   215  			return
   216  		}
   217  
   218  		if readFailed {
   219  			w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%v, public", 5*60)) // 5 mins
   220  		} else {
   221  			w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%v, public", 24*60*60)) // 24 hrs
   222  			w.Header().Set(model.HEADER_ETAG_SERVER, etag)
   223  		}
   224  
   225  		w.Header().Set("Content-Type", "image/png")
   226  		w.Write(img)
   227  	}
   228  }
   229  
   230  func setProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
   231  	c.RequireUserId()
   232  	if c.Err != nil {
   233  		return
   234  	}
   235  
   236  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   237  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   238  		return
   239  	}
   240  
   241  	if len(*c.App.Config().FileSettings.DriverName) == 0 {
   242  		c.Err = model.NewAppError("uploadProfileImage", "api.user.upload_profile_user.storage.app_error", nil, "", http.StatusNotImplemented)
   243  		return
   244  	}
   245  
   246  	if r.ContentLength > *c.App.Config().FileSettings.MaxFileSize {
   247  		c.Err = model.NewAppError("uploadProfileImage", "api.user.upload_profile_user.too_large.app_error", nil, "", http.StatusRequestEntityTooLarge)
   248  		return
   249  	}
   250  
   251  	if err := r.ParseMultipartForm(*c.App.Config().FileSettings.MaxFileSize); err != nil {
   252  		c.Err = model.NewAppError("uploadProfileImage", "api.user.upload_profile_user.parse.app_error", nil, err.Error(), http.StatusInternalServerError)
   253  		return
   254  	}
   255  
   256  	m := r.MultipartForm
   257  
   258  	imageArray, ok := m.File["image"]
   259  	if !ok {
   260  		c.Err = model.NewAppError("uploadProfileImage", "api.user.upload_profile_user.no_file.app_error", nil, "", http.StatusBadRequest)
   261  		return
   262  	}
   263  
   264  	if len(imageArray) <= 0 {
   265  		c.Err = model.NewAppError("uploadProfileImage", "api.user.upload_profile_user.array.app_error", nil, "", http.StatusBadRequest)
   266  		return
   267  	}
   268  
   269  	imageData := imageArray[0]
   270  
   271  	if err := c.App.SetProfileImage(c.Params.UserId, imageData); err != nil {
   272  		c.Err = err
   273  		return
   274  	}
   275  
   276  	c.LogAudit("")
   277  	ReturnStatusOK(w)
   278  }
   279  
   280  func getUsers(c *Context, w http.ResponseWriter, r *http.Request) {
   281  	inTeamId := r.URL.Query().Get("in_team")
   282  	notInTeamId := r.URL.Query().Get("not_in_team")
   283  	inChannelId := r.URL.Query().Get("in_channel")
   284  	notInChannelId := r.URL.Query().Get("not_in_channel")
   285  	withoutTeam := r.URL.Query().Get("without_team")
   286  	sort := r.URL.Query().Get("sort")
   287  
   288  	if len(notInChannelId) > 0 && len(inTeamId) == 0 {
   289  		c.SetInvalidUrlParam("team_id")
   290  		return
   291  	}
   292  
   293  	if sort != "" && sort != "last_activity_at" && sort != "create_at" && sort != "status" {
   294  		c.SetInvalidUrlParam("sort")
   295  		return
   296  	}
   297  
   298  	// Currently only supports sorting on a team
   299  	// or sort="status" on inChannelId
   300  	if (sort == "last_activity_at" || sort == "create_at") && (inTeamId == "" || notInTeamId != "" || inChannelId != "" || notInChannelId != "" || withoutTeam != "") {
   301  		c.SetInvalidUrlParam("sort")
   302  		return
   303  	}
   304  	if sort == "status" && inChannelId == "" {
   305  		c.SetInvalidUrlParam("sort")
   306  		return
   307  	}
   308  
   309  	var profiles []*model.User
   310  	var err *model.AppError
   311  	etag := ""
   312  
   313  	if withoutTeamBool, _ := strconv.ParseBool(withoutTeam); withoutTeamBool {
   314  		// Use a special permission for now
   315  		if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_LIST_USERS_WITHOUT_TEAM) {
   316  			c.SetPermissionError(model.PERMISSION_LIST_USERS_WITHOUT_TEAM)
   317  			return
   318  		}
   319  
   320  		profiles, err = c.App.GetUsersWithoutTeamPage(c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   321  	} else if len(notInChannelId) > 0 {
   322  		if !c.App.SessionHasPermissionToChannel(c.Session, notInChannelId, model.PERMISSION_READ_CHANNEL) {
   323  			c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
   324  			return
   325  		}
   326  
   327  		profiles, err = c.App.GetUsersNotInChannelPage(inTeamId, notInChannelId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   328  	} else if len(notInTeamId) > 0 {
   329  		if !c.App.SessionHasPermissionToTeam(c.Session, notInTeamId, model.PERMISSION_VIEW_TEAM) {
   330  			c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   331  			return
   332  		}
   333  
   334  		etag = c.App.GetUsersNotInTeamEtag(inTeamId)
   335  		if c.HandleEtag(etag, "Get Users Not in Team", w, r) {
   336  			return
   337  		}
   338  
   339  		profiles, err = c.App.GetUsersNotInTeamPage(notInTeamId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   340  	} else if len(inTeamId) > 0 {
   341  		if !c.App.SessionHasPermissionToTeam(c.Session, inTeamId, model.PERMISSION_VIEW_TEAM) {
   342  			c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   343  			return
   344  		}
   345  
   346  		if sort == "last_activity_at" {
   347  			profiles, err = c.App.GetRecentlyActiveUsersForTeamPage(inTeamId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   348  		} else if sort == "create_at" {
   349  			profiles, err = c.App.GetNewUsersForTeamPage(inTeamId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   350  		} else {
   351  			etag = c.App.GetUsersInTeamEtag(inTeamId)
   352  			if c.HandleEtag(etag, "Get Users in Team", w, r) {
   353  				return
   354  			}
   355  
   356  			profiles, err = c.App.GetUsersInTeamPage(inTeamId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   357  		}
   358  	} else if len(inChannelId) > 0 {
   359  		if !c.App.SessionHasPermissionToChannel(c.Session, inChannelId, model.PERMISSION_READ_CHANNEL) {
   360  			c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
   361  			return
   362  		}
   363  		if sort == "status" {
   364  			profiles, err = c.App.GetUsersInChannelPageByStatus(inChannelId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   365  		} else {
   366  			profiles, err = c.App.GetUsersInChannelPage(inChannelId, c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   367  		}
   368  	} else {
   369  		// No permission check required
   370  
   371  		etag = c.App.GetUsersEtag()
   372  		if c.HandleEtag(etag, "Get Users", w, r) {
   373  			return
   374  		}
   375  		profiles, err = c.App.GetUsersPage(c.Params.Page, c.Params.PerPage, c.IsSystemAdmin())
   376  	}
   377  
   378  	if err != nil {
   379  		c.Err = err
   380  		return
   381  	} else {
   382  		if len(etag) > 0 {
   383  			w.Header().Set(model.HEADER_ETAG_SERVER, etag)
   384  		}
   385  		c.App.UpdateLastActivityAtIfNeeded(c.Session)
   386  		w.Write([]byte(model.UserListToJson(profiles)))
   387  	}
   388  }
   389  
   390  func getUsersByIds(c *Context, w http.ResponseWriter, r *http.Request) {
   391  	userIds := model.ArrayFromJson(r.Body)
   392  
   393  	if len(userIds) == 0 {
   394  		c.SetInvalidParam("user_ids")
   395  		return
   396  	}
   397  
   398  	// No permission check required
   399  
   400  	if users, err := c.App.GetUsersByIds(userIds, c.IsSystemAdmin()); err != nil {
   401  		c.Err = err
   402  		return
   403  	} else {
   404  		w.Write([]byte(model.UserListToJson(users)))
   405  	}
   406  }
   407  
   408  func getUsersByNames(c *Context, w http.ResponseWriter, r *http.Request) {
   409  	usernames := model.ArrayFromJson(r.Body)
   410  
   411  	if len(usernames) == 0 {
   412  		c.SetInvalidParam("usernames")
   413  		return
   414  	}
   415  
   416  	// No permission check required
   417  
   418  	if users, err := c.App.GetUsersByUsernames(usernames, c.IsSystemAdmin()); err != nil {
   419  		c.Err = err
   420  		return
   421  	} else {
   422  		w.Write([]byte(model.UserListToJson(users)))
   423  	}
   424  }
   425  
   426  func searchUsers(c *Context, w http.ResponseWriter, r *http.Request) {
   427  	props := model.UserSearchFromJson(r.Body)
   428  	if props == nil {
   429  		c.SetInvalidParam("")
   430  		return
   431  	}
   432  
   433  	if len(props.Term) == 0 {
   434  		c.SetInvalidParam("term")
   435  		return
   436  	}
   437  
   438  	if props.TeamId == "" && props.NotInChannelId != "" {
   439  		c.SetInvalidParam("team_id")
   440  		return
   441  	}
   442  
   443  	if props.InChannelId != "" && !c.App.SessionHasPermissionToChannel(c.Session, props.InChannelId, model.PERMISSION_READ_CHANNEL) {
   444  		c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
   445  		return
   446  	}
   447  
   448  	if props.NotInChannelId != "" && !c.App.SessionHasPermissionToChannel(c.Session, props.NotInChannelId, model.PERMISSION_READ_CHANNEL) {
   449  		c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
   450  		return
   451  	}
   452  
   453  	if props.TeamId != "" && !c.App.SessionHasPermissionToTeam(c.Session, props.TeamId, model.PERMISSION_VIEW_TEAM) {
   454  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   455  		return
   456  	}
   457  
   458  	if props.NotInTeamId != "" && !c.App.SessionHasPermissionToTeam(c.Session, props.NotInTeamId, model.PERMISSION_VIEW_TEAM) {
   459  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   460  		return
   461  	}
   462  
   463  	searchOptions := map[string]bool{}
   464  	searchOptions[store.USER_SEARCH_OPTION_ALLOW_INACTIVE] = props.AllowInactive
   465  
   466  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   467  		hideFullName := !c.App.Config().PrivacySettings.ShowFullName
   468  		hideEmail := !c.App.Config().PrivacySettings.ShowEmailAddress
   469  
   470  		if hideFullName && hideEmail {
   471  			searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY_NO_FULL_NAME] = true
   472  		} else if hideFullName {
   473  			searchOptions[store.USER_SEARCH_OPTION_ALL_NO_FULL_NAME] = true
   474  		} else if hideEmail {
   475  			searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY] = true
   476  		}
   477  	}
   478  
   479  	if profiles, err := c.App.SearchUsers(props, searchOptions, c.IsSystemAdmin()); err != nil {
   480  		c.Err = err
   481  		return
   482  	} else {
   483  		w.Write([]byte(model.UserListToJson(profiles)))
   484  	}
   485  }
   486  
   487  func autocompleteUsers(c *Context, w http.ResponseWriter, r *http.Request) {
   488  	channelId := r.URL.Query().Get("in_channel")
   489  	teamId := r.URL.Query().Get("in_team")
   490  	name := r.URL.Query().Get("name")
   491  
   492  	autocomplete := new(model.UserAutocomplete)
   493  	var err *model.AppError
   494  
   495  	searchOptions := map[string]bool{}
   496  
   497  	hideFullName := !c.App.Config().PrivacySettings.ShowFullName
   498  	if hideFullName && !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   499  		searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY_NO_FULL_NAME] = true
   500  	} else {
   501  		searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY] = true
   502  	}
   503  
   504  	if len(channelId) > 0 {
   505  		if !c.App.SessionHasPermissionToChannel(c.Session, channelId, model.PERMISSION_READ_CHANNEL) {
   506  			c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
   507  			return
   508  		}
   509  
   510  		result, _ := c.App.AutocompleteUsersInChannel(teamId, channelId, name, searchOptions, c.IsSystemAdmin())
   511  		autocomplete.Users = result.InChannel
   512  		autocomplete.OutOfChannel = result.OutOfChannel
   513  	} else if len(teamId) > 0 {
   514  		if !c.App.SessionHasPermissionToTeam(c.Session, teamId, model.PERMISSION_VIEW_TEAM) {
   515  			c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   516  			return
   517  		}
   518  
   519  		result, _ := c.App.AutocompleteUsersInTeam(teamId, name, searchOptions, c.IsSystemAdmin())
   520  		autocomplete.Users = result.InTeam
   521  	} else {
   522  		// No permission check required
   523  		result, _ := c.App.SearchUsersInTeam("", name, searchOptions, c.IsSystemAdmin())
   524  		autocomplete.Users = result
   525  	}
   526  
   527  	if err != nil {
   528  		c.Err = err
   529  		return
   530  	} else {
   531  		w.Write([]byte((autocomplete.ToJson())))
   532  	}
   533  }
   534  
   535  func updateUser(c *Context, w http.ResponseWriter, r *http.Request) {
   536  	c.RequireUserId()
   537  	if c.Err != nil {
   538  		return
   539  	}
   540  
   541  	user := model.UserFromJson(r.Body)
   542  	if user == nil {
   543  		c.SetInvalidParam("user")
   544  		return
   545  	}
   546  
   547  	if !c.App.SessionHasPermissionToUser(c.Session, user.Id) {
   548  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   549  		return
   550  	}
   551  
   552  	if c.Session.IsOAuth {
   553  		ouser, err := c.App.GetUser(user.Id)
   554  		if err != nil {
   555  			c.Err = err
   556  			return
   557  		}
   558  
   559  		if ouser.Email != user.Email {
   560  			c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   561  			c.Err.DetailedError += ", attempted email update by oauth app"
   562  			return
   563  		}
   564  	}
   565  
   566  	if ruser, err := c.App.UpdateUserAsUser(user, c.IsSystemAdmin()); err != nil {
   567  		c.Err = err
   568  		return
   569  	} else {
   570  		c.LogAudit("")
   571  		w.Write([]byte(ruser.ToJson()))
   572  	}
   573  }
   574  
   575  func patchUser(c *Context, w http.ResponseWriter, r *http.Request) {
   576  	c.RequireUserId()
   577  	if c.Err != nil {
   578  		return
   579  	}
   580  
   581  	patch := model.UserPatchFromJson(r.Body)
   582  	if patch == nil {
   583  		c.SetInvalidParam("user")
   584  		return
   585  	}
   586  
   587  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   588  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   589  		return
   590  	}
   591  
   592  	if c.Session.IsOAuth && patch.Email != nil {
   593  		ouser, err := c.App.GetUser(c.Params.UserId)
   594  		if err != nil {
   595  			c.Err = err
   596  			return
   597  		}
   598  
   599  		if ouser.Email != *patch.Email {
   600  			c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   601  			c.Err.DetailedError += ", attempted email update by oauth app"
   602  			return
   603  		}
   604  	}
   605  
   606  	if ruser, err := c.App.PatchUser(c.Params.UserId, patch, c.IsSystemAdmin()); err != nil {
   607  		c.Err = err
   608  		return
   609  	} else {
   610  		c.LogAudit("")
   611  		w.Write([]byte(ruser.ToJson()))
   612  	}
   613  }
   614  
   615  func deleteUser(c *Context, w http.ResponseWriter, r *http.Request) {
   616  	c.RequireUserId()
   617  	if c.Err != nil {
   618  		return
   619  	}
   620  
   621  	userId := c.Params.UserId
   622  
   623  	if !c.App.SessionHasPermissionToUser(c.Session, userId) {
   624  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   625  		return
   626  	}
   627  
   628  	var user *model.User
   629  	var err *model.AppError
   630  
   631  	if user, err = c.App.GetUser(userId); err != nil {
   632  		c.Err = err
   633  		return
   634  	}
   635  
   636  	if _, err := c.App.UpdateActive(user, false); err != nil {
   637  		c.Err = err
   638  		return
   639  	}
   640  
   641  	ReturnStatusOK(w)
   642  }
   643  
   644  func updateUserRoles(c *Context, w http.ResponseWriter, r *http.Request) {
   645  	c.RequireUserId()
   646  	if c.Err != nil {
   647  		return
   648  	}
   649  
   650  	props := model.MapFromJson(r.Body)
   651  
   652  	newRoles := props["roles"]
   653  	if !model.IsValidUserRoles(newRoles) {
   654  		c.SetInvalidParam("roles")
   655  		return
   656  	}
   657  
   658  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_ROLES) {
   659  		c.SetPermissionError(model.PERMISSION_MANAGE_ROLES)
   660  		return
   661  	}
   662  
   663  	if _, err := c.App.UpdateUserRoles(c.Params.UserId, newRoles, true); err != nil {
   664  		c.Err = err
   665  		return
   666  	} else {
   667  		c.LogAuditWithUserId(c.Params.UserId, "roles="+newRoles)
   668  	}
   669  
   670  	ReturnStatusOK(w)
   671  }
   672  
   673  func updateUserActive(c *Context, w http.ResponseWriter, r *http.Request) {
   674  	c.RequireUserId()
   675  	if c.Err != nil {
   676  		return
   677  	}
   678  
   679  	props := model.StringInterfaceFromJson(r.Body)
   680  
   681  	active, ok := props["active"].(bool)
   682  	if !ok {
   683  		c.SetInvalidParam("active")
   684  		return
   685  	}
   686  
   687  	// true when you're trying to de-activate yourself
   688  	isSelfDeactive := !active && c.Params.UserId == c.Session.UserId
   689  
   690  	if !isSelfDeactive && !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   691  		c.Err = model.NewAppError("updateUserActive", "api.user.update_active.permissions.app_error", nil, "userId="+c.Params.UserId, http.StatusForbidden)
   692  		return
   693  	}
   694  
   695  	var user *model.User
   696  	var err *model.AppError
   697  
   698  	if user, err = c.App.GetUser(c.Params.UserId); err != nil {
   699  		c.Err = err
   700  		return
   701  	}
   702  
   703  	if _, err := c.App.UpdateActive(user, active); err != nil {
   704  		c.Err = err
   705  	} else {
   706  		c.LogAuditWithUserId(user.Id, fmt.Sprintf("active=%v", active))
   707  		ReturnStatusOK(w)
   708  	}
   709  }
   710  
   711  func updateUserAuth(c *Context, w http.ResponseWriter, r *http.Request) {
   712  	if !c.IsSystemAdmin() {
   713  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   714  		return
   715  	}
   716  
   717  	c.RequireUserId()
   718  	if c.Err != nil {
   719  		return
   720  	}
   721  
   722  	userAuth := model.UserAuthFromJson(r.Body)
   723  	if userAuth == nil {
   724  		c.SetInvalidParam("user")
   725  		return
   726  	}
   727  
   728  	if user, err := c.App.UpdateUserAuth(c.Params.UserId, userAuth); err != nil {
   729  		c.Err = err
   730  	} else {
   731  		c.LogAuditWithUserId(c.Params.UserId, fmt.Sprintf("updated user auth to service=%v", user.AuthService))
   732  		w.Write([]byte(user.ToJson()))
   733  	}
   734  }
   735  
   736  func checkUserMfa(c *Context, w http.ResponseWriter, r *http.Request) {
   737  	props := model.MapFromJson(r.Body)
   738  
   739  	loginId := props["login_id"]
   740  	if len(loginId) == 0 {
   741  		c.SetInvalidParam("login_id")
   742  		return
   743  	}
   744  
   745  	resp := map[string]interface{}{}
   746  	resp["mfa_required"] = false
   747  
   748  	if license := c.App.License(); license == nil || !*license.Features.MFA || !*c.App.Config().ServiceSettings.EnableMultifactorAuthentication {
   749  		w.Write([]byte(model.StringInterfaceToJson(resp)))
   750  		return
   751  	}
   752  
   753  	if user, err := c.App.GetUserForLogin(loginId, false); err == nil {
   754  		resp["mfa_required"] = user.MfaActive
   755  	}
   756  
   757  	w.Write([]byte(model.StringInterfaceToJson(resp)))
   758  }
   759  
   760  func updateUserMfa(c *Context, w http.ResponseWriter, r *http.Request) {
   761  	c.RequireUserId()
   762  	if c.Err != nil {
   763  		return
   764  	}
   765  
   766  	if c.Session.IsOAuth {
   767  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   768  		c.Err.DetailedError += ", attempted access by oauth app"
   769  		return
   770  	}
   771  
   772  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   773  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   774  		return
   775  	}
   776  
   777  	props := model.StringInterfaceFromJson(r.Body)
   778  
   779  	activate, ok := props["activate"].(bool)
   780  	if !ok {
   781  		c.SetInvalidParam("activate")
   782  		return
   783  	}
   784  
   785  	code := ""
   786  	if activate {
   787  		code, ok = props["code"].(string)
   788  		if !ok || len(code) == 0 {
   789  			c.SetInvalidParam("code")
   790  			return
   791  		}
   792  	}
   793  
   794  	c.LogAudit("attempt")
   795  
   796  	if err := c.App.UpdateMfa(activate, c.Params.UserId, code); err != nil {
   797  		c.Err = err
   798  		return
   799  	}
   800  
   801  	c.LogAudit("success - mfa updated")
   802  	ReturnStatusOK(w)
   803  }
   804  
   805  func generateMfaSecret(c *Context, w http.ResponseWriter, r *http.Request) {
   806  	c.RequireUserId()
   807  	if c.Err != nil {
   808  		return
   809  	}
   810  
   811  	if c.Session.IsOAuth {
   812  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   813  		c.Err.DetailedError += ", attempted access by oauth app"
   814  		return
   815  	}
   816  
   817  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   818  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   819  		return
   820  	}
   821  
   822  	secret, err := c.App.GenerateMfaSecret(c.Params.UserId)
   823  	if err != nil {
   824  		c.Err = err
   825  		return
   826  	}
   827  
   828  	w.Header().Set("Cache-Control", "no-cache")
   829  	w.Header().Set("Pragma", "no-cache")
   830  	w.Header().Set("Expires", "0")
   831  	w.Write([]byte(secret.ToJson()))
   832  }
   833  
   834  func updatePassword(c *Context, w http.ResponseWriter, r *http.Request) {
   835  	c.RequireUserId()
   836  	if c.Err != nil {
   837  		return
   838  	}
   839  
   840  	props := model.MapFromJson(r.Body)
   841  
   842  	newPassword := props["new_password"]
   843  
   844  	c.LogAudit("attempted")
   845  
   846  	var err *model.AppError
   847  	if c.Params.UserId == c.Session.UserId {
   848  		currentPassword := props["current_password"]
   849  		if len(currentPassword) <= 0 {
   850  			c.SetInvalidParam("current_password")
   851  			return
   852  		}
   853  
   854  		err = c.App.UpdatePasswordAsUser(c.Params.UserId, currentPassword, newPassword)
   855  	} else if c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   856  		err = c.App.UpdatePasswordByUserIdSendEmail(c.Params.UserId, newPassword, c.T("api.user.reset_password.method"))
   857  	} else {
   858  		err = model.NewAppError("updatePassword", "api.user.update_password.context.app_error", nil, "", http.StatusForbidden)
   859  	}
   860  
   861  	if err != nil {
   862  		c.LogAudit("failed")
   863  		c.Err = err
   864  		return
   865  	} else {
   866  		c.LogAudit("completed")
   867  		ReturnStatusOK(w)
   868  	}
   869  }
   870  
   871  func resetPassword(c *Context, w http.ResponseWriter, r *http.Request) {
   872  	props := model.MapFromJson(r.Body)
   873  
   874  	token := props["token"]
   875  	if len(token) != model.TOKEN_SIZE {
   876  		c.SetInvalidParam("token")
   877  		return
   878  	}
   879  
   880  	newPassword := props["new_password"]
   881  
   882  	c.LogAudit("attempt - token=" + token)
   883  
   884  	if err := c.App.ResetPasswordFromToken(token, newPassword); err != nil {
   885  		c.LogAudit("fail - token=" + token)
   886  		c.Err = err
   887  		return
   888  	}
   889  
   890  	c.LogAudit("success - token=" + token)
   891  
   892  	ReturnStatusOK(w)
   893  }
   894  
   895  func sendPasswordReset(c *Context, w http.ResponseWriter, r *http.Request) {
   896  	props := model.MapFromJson(r.Body)
   897  
   898  	email := props["email"]
   899  	if len(email) == 0 {
   900  		c.SetInvalidParam("email")
   901  		return
   902  	}
   903  
   904  	if sent, err := c.App.SendPasswordReset(email, c.App.GetSiteURL()); err != nil {
   905  		c.Err = err
   906  		return
   907  	} else if sent {
   908  		c.LogAudit("sent=" + email)
   909  	}
   910  
   911  	ReturnStatusOK(w)
   912  }
   913  
   914  func login(c *Context, w http.ResponseWriter, r *http.Request) {
   915  	props := model.MapFromJson(r.Body)
   916  
   917  	id := props["id"]
   918  	loginId := props["login_id"]
   919  	password := props["password"]
   920  	mfaToken := props["token"]
   921  	deviceId := props["device_id"]
   922  	ldapOnly := props["ldap_only"] == "true"
   923  
   924  	c.LogAuditWithUserId(id, "attempt - login_id="+loginId)
   925  	user, err := c.App.AuthenticateUserForLogin(id, loginId, password, mfaToken, deviceId, ldapOnly)
   926  	if err != nil {
   927  		c.LogAuditWithUserId(id, "failure - login_id="+loginId)
   928  		c.Err = err
   929  		return
   930  	}
   931  
   932  	c.LogAuditWithUserId(user.Id, "authenticated")
   933  
   934  	var session *model.Session
   935  	session, err = c.App.DoLogin(w, r, user, deviceId)
   936  	if err != nil {
   937  		c.Err = err
   938  		return
   939  	}
   940  
   941  	c.LogAuditWithUserId(user.Id, "success")
   942  
   943  	c.Session = *session
   944  
   945  	user.Sanitize(map[string]bool{})
   946  
   947  	w.Write([]byte(user.ToJson()))
   948  }
   949  
   950  func logout(c *Context, w http.ResponseWriter, r *http.Request) {
   951  	data := make(map[string]string)
   952  	data["user_id"] = c.Session.UserId
   953  
   954  	Logout(c, w, r)
   955  
   956  }
   957  
   958  func Logout(c *Context, w http.ResponseWriter, r *http.Request) {
   959  	c.LogAudit("")
   960  	c.RemoveSessionCookie(w, r)
   961  	if c.Session.Id != "" {
   962  		if err := c.App.RevokeSessionById(c.Session.Id); err != nil {
   963  			c.Err = err
   964  			return
   965  		}
   966  	}
   967  
   968  	ReturnStatusOK(w)
   969  }
   970  
   971  func getSessions(c *Context, w http.ResponseWriter, r *http.Request) {
   972  	c.RequireUserId()
   973  	if c.Err != nil {
   974  		return
   975  	}
   976  
   977  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   978  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   979  		return
   980  	}
   981  
   982  	if sessions, err := c.App.GetSessions(c.Params.UserId); err != nil {
   983  		c.Err = err
   984  		return
   985  	} else {
   986  		for _, session := range sessions {
   987  			session.Sanitize()
   988  		}
   989  
   990  		w.Write([]byte(model.SessionsToJson(sessions)))
   991  		return
   992  	}
   993  }
   994  
   995  func revokeSession(c *Context, w http.ResponseWriter, r *http.Request) {
   996  	c.RequireUserId()
   997  	if c.Err != nil {
   998  		return
   999  	}
  1000  
  1001  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
  1002  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1003  		return
  1004  	}
  1005  
  1006  	props := model.MapFromJson(r.Body)
  1007  	sessionId := props["session_id"]
  1008  
  1009  	if sessionId == "" {
  1010  		c.SetInvalidParam("session_id")
  1011  		return
  1012  	}
  1013  
  1014  	var session *model.Session
  1015  	var err *model.AppError
  1016  	if session, err = c.App.GetSessionById(sessionId); err != nil {
  1017  		c.Err = err
  1018  		return
  1019  	}
  1020  
  1021  	if session.UserId != c.Params.UserId {
  1022  		c.SetInvalidUrlParam("user_id")
  1023  		return
  1024  	}
  1025  
  1026  	if err := c.App.RevokeSession(session); err != nil {
  1027  		c.Err = err
  1028  		return
  1029  	}
  1030  
  1031  	ReturnStatusOK(w)
  1032  }
  1033  
  1034  func revokeAllSessionsForUser(c *Context, w http.ResponseWriter, r *http.Request) {
  1035  	c.RequireUserId()
  1036  	if c.Err != nil {
  1037  		return
  1038  	}
  1039  
  1040  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
  1041  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1042  		return
  1043  	}
  1044  
  1045  	if err := c.App.RevokeAllSessions(c.Params.UserId); err != nil {
  1046  		c.Err = err
  1047  		return
  1048  	}
  1049  
  1050  	ReturnStatusOK(w)
  1051  }
  1052  
  1053  func attachDeviceId(c *Context, w http.ResponseWriter, r *http.Request) {
  1054  	props := model.MapFromJson(r.Body)
  1055  
  1056  	deviceId := props["device_id"]
  1057  	if len(deviceId) == 0 {
  1058  		c.SetInvalidParam("device_id")
  1059  		return
  1060  	}
  1061  
  1062  	// A special case where we logout of all other sessions with the same device id
  1063  	if err := c.App.RevokeSessionsForDeviceId(c.Session.UserId, deviceId, c.Session.Id); err != nil {
  1064  		c.Err = err
  1065  		return
  1066  	}
  1067  
  1068  	c.App.ClearSessionCacheForUser(c.Session.UserId)
  1069  	c.Session.SetExpireInDays(*c.App.Config().ServiceSettings.SessionLengthMobileInDays)
  1070  
  1071  	maxAge := *c.App.Config().ServiceSettings.SessionLengthMobileInDays * 60 * 60 * 24
  1072  
  1073  	secure := false
  1074  	if app.GetProtocol(r) == "https" {
  1075  		secure = true
  1076  	}
  1077  
  1078  	expiresAt := time.Unix(model.GetMillis()/1000+int64(maxAge), 0)
  1079  	sessionCookie := &http.Cookie{
  1080  		Name:     model.SESSION_COOKIE_TOKEN,
  1081  		Value:    c.Session.Token,
  1082  		Path:     "/",
  1083  		MaxAge:   maxAge,
  1084  		Expires:  expiresAt,
  1085  		HttpOnly: true,
  1086  		Domain:   c.App.GetCookieDomain(),
  1087  		Secure:   secure,
  1088  	}
  1089  
  1090  	http.SetCookie(w, sessionCookie)
  1091  
  1092  	if err := c.App.AttachDeviceId(c.Session.Id, deviceId, c.Session.ExpiresAt); err != nil {
  1093  		c.Err = err
  1094  		return
  1095  	}
  1096  
  1097  	c.LogAudit("")
  1098  	ReturnStatusOK(w)
  1099  }
  1100  
  1101  func getUserAudits(c *Context, w http.ResponseWriter, r *http.Request) {
  1102  	c.RequireUserId()
  1103  	if c.Err != nil {
  1104  		return
  1105  	}
  1106  
  1107  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
  1108  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1109  		return
  1110  	}
  1111  
  1112  	if audits, err := c.App.GetAuditsPage(c.Params.UserId, c.Params.Page, c.Params.PerPage); err != nil {
  1113  		c.Err = err
  1114  		return
  1115  	} else {
  1116  		w.Write([]byte(audits.ToJson()))
  1117  		return
  1118  	}
  1119  }
  1120  
  1121  func verifyUserEmail(c *Context, w http.ResponseWriter, r *http.Request) {
  1122  	props := model.MapFromJson(r.Body)
  1123  
  1124  	token := props["token"]
  1125  	if len(token) != model.TOKEN_SIZE {
  1126  		c.SetInvalidParam("token")
  1127  		return
  1128  	}
  1129  
  1130  	if err := c.App.VerifyEmailFromToken(token); err != nil {
  1131  		c.Err = model.NewAppError("verifyUserEmail", "api.user.verify_email.bad_link.app_error", nil, err.Error(), http.StatusBadRequest)
  1132  		return
  1133  	} else {
  1134  		c.LogAudit("Email Verified")
  1135  		ReturnStatusOK(w)
  1136  		return
  1137  	}
  1138  }
  1139  
  1140  func sendVerificationEmail(c *Context, w http.ResponseWriter, r *http.Request) {
  1141  	props := model.MapFromJson(r.Body)
  1142  
  1143  	email := props["email"]
  1144  	if len(email) == 0 {
  1145  		c.SetInvalidParam("email")
  1146  		return
  1147  	}
  1148  
  1149  	user, err := c.App.GetUserForLogin(email, false)
  1150  	if err != nil {
  1151  		// Don't want to leak whether the email is valid or not
  1152  		ReturnStatusOK(w)
  1153  		return
  1154  	}
  1155  
  1156  	err = c.App.SendEmailVerification(user)
  1157  	if err != nil {
  1158  		// Don't want to leak whether the email is valid or not
  1159  		l4g.Error(err.Error())
  1160  		ReturnStatusOK(w)
  1161  		return
  1162  	}
  1163  
  1164  	ReturnStatusOK(w)
  1165  }
  1166  
  1167  func switchAccountType(c *Context, w http.ResponseWriter, r *http.Request) {
  1168  	switchRequest := model.SwitchRequestFromJson(r.Body)
  1169  	if switchRequest == nil {
  1170  		c.SetInvalidParam("switch_request")
  1171  		return
  1172  	}
  1173  
  1174  	link := ""
  1175  	var err *model.AppError
  1176  
  1177  	if switchRequest.EmailToOAuth() {
  1178  		link, err = c.App.SwitchEmailToOAuth(w, r, switchRequest.Email, switchRequest.Password, switchRequest.MfaCode, switchRequest.NewService)
  1179  	} else if switchRequest.OAuthToEmail() {
  1180  		c.SessionRequired()
  1181  		if c.Err != nil {
  1182  			return
  1183  		}
  1184  
  1185  		link, err = c.App.SwitchOAuthToEmail(switchRequest.Email, switchRequest.NewPassword, c.Session.UserId)
  1186  	} else if switchRequest.EmailToLdap() {
  1187  		link, err = c.App.SwitchEmailToLdap(switchRequest.Email, switchRequest.Password, switchRequest.MfaCode, switchRequest.LdapId, switchRequest.NewPassword)
  1188  	} else if switchRequest.LdapToEmail() {
  1189  		link, err = c.App.SwitchLdapToEmail(switchRequest.Password, switchRequest.MfaCode, switchRequest.Email, switchRequest.NewPassword)
  1190  	} else {
  1191  		c.SetInvalidParam("switch_request")
  1192  		return
  1193  	}
  1194  
  1195  	if err != nil {
  1196  		c.Err = err
  1197  		return
  1198  	}
  1199  
  1200  	c.LogAudit("success")
  1201  	w.Write([]byte(model.MapToJson(map[string]string{"follow_link": link})))
  1202  }
  1203  
  1204  func createUserAccessToken(c *Context, w http.ResponseWriter, r *http.Request) {
  1205  	c.RequireUserId()
  1206  	if c.Err != nil {
  1207  		return
  1208  	}
  1209  
  1210  	if c.Session.IsOAuth {
  1211  		c.SetPermissionError(model.PERMISSION_CREATE_USER_ACCESS_TOKEN)
  1212  		c.Err.DetailedError += ", attempted access by oauth app"
  1213  		return
  1214  	}
  1215  
  1216  	accessToken := model.UserAccessTokenFromJson(r.Body)
  1217  	if accessToken == nil {
  1218  		c.SetInvalidParam("user_access_token")
  1219  		return
  1220  	}
  1221  
  1222  	if accessToken.Description == "" {
  1223  		c.SetInvalidParam("description")
  1224  		return
  1225  	}
  1226  
  1227  	c.LogAudit("")
  1228  
  1229  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_CREATE_USER_ACCESS_TOKEN) {
  1230  		c.SetPermissionError(model.PERMISSION_CREATE_USER_ACCESS_TOKEN)
  1231  		return
  1232  	}
  1233  
  1234  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
  1235  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1236  		return
  1237  	}
  1238  
  1239  	accessToken.UserId = c.Params.UserId
  1240  	accessToken.Token = ""
  1241  
  1242  	var err *model.AppError
  1243  	accessToken, err = c.App.CreateUserAccessToken(accessToken)
  1244  	if err != nil {
  1245  		c.Err = err
  1246  		return
  1247  	}
  1248  
  1249  	c.LogAudit("success - token_id=" + accessToken.Id)
  1250  	w.Write([]byte(accessToken.ToJson()))
  1251  }
  1252  
  1253  func searchUserAccessTokens(c *Context, w http.ResponseWriter, r *http.Request) {
  1254  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
  1255  		c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  1256  		return
  1257  	}
  1258  	props := model.UserAccessTokenSearchFromJson(r.Body)
  1259  	if props == nil {
  1260  		c.SetInvalidParam("user_access_token_search")
  1261  		return
  1262  	}
  1263  
  1264  	if len(props.Term) == 0 {
  1265  		c.SetInvalidParam("term")
  1266  		return
  1267  	}
  1268  	accessTokens, err := c.App.SearchUserAccessTokens(props.Term)
  1269  	if err != nil {
  1270  		c.Err = err
  1271  		return
  1272  	}
  1273  
  1274  	w.Write([]byte(model.UserAccessTokenListToJson(accessTokens)))
  1275  }
  1276  
  1277  func getUserAccessTokens(c *Context, w http.ResponseWriter, r *http.Request) {
  1278  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
  1279  		c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  1280  		return
  1281  	}
  1282  
  1283  	accessTokens, err := c.App.GetUserAccessTokens(c.Params.Page, c.Params.PerPage)
  1284  	if err != nil {
  1285  		c.Err = err
  1286  		return
  1287  	}
  1288  
  1289  	w.Write([]byte(model.UserAccessTokenListToJson(accessTokens)))
  1290  }
  1291  
  1292  func getUserAccessTokensForUser(c *Context, w http.ResponseWriter, r *http.Request) {
  1293  	c.RequireUserId()
  1294  	if c.Err != nil {
  1295  		return
  1296  	}
  1297  
  1298  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_READ_USER_ACCESS_TOKEN) {
  1299  		c.SetPermissionError(model.PERMISSION_READ_USER_ACCESS_TOKEN)
  1300  		return
  1301  	}
  1302  
  1303  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
  1304  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1305  		return
  1306  	}
  1307  
  1308  	accessTokens, err := c.App.GetUserAccessTokensForUser(c.Params.UserId, c.Params.Page, c.Params.PerPage)
  1309  	if err != nil {
  1310  		c.Err = err
  1311  		return
  1312  	}
  1313  
  1314  	w.Write([]byte(model.UserAccessTokenListToJson(accessTokens)))
  1315  }
  1316  
  1317  func getUserAccessToken(c *Context, w http.ResponseWriter, r *http.Request) {
  1318  	c.RequireTokenId()
  1319  	if c.Err != nil {
  1320  		return
  1321  	}
  1322  
  1323  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_READ_USER_ACCESS_TOKEN) {
  1324  		c.SetPermissionError(model.PERMISSION_READ_USER_ACCESS_TOKEN)
  1325  		return
  1326  	}
  1327  
  1328  	accessToken, err := c.App.GetUserAccessToken(c.Params.TokenId, true)
  1329  	if err != nil {
  1330  		c.Err = err
  1331  		return
  1332  	}
  1333  
  1334  	if !c.App.SessionHasPermissionToUser(c.Session, accessToken.UserId) {
  1335  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1336  		return
  1337  	}
  1338  
  1339  	w.Write([]byte(accessToken.ToJson()))
  1340  }
  1341  
  1342  func revokeUserAccessToken(c *Context, w http.ResponseWriter, r *http.Request) {
  1343  	props := model.MapFromJson(r.Body)
  1344  	tokenId := props["token_id"]
  1345  
  1346  	if tokenId == "" {
  1347  		c.SetInvalidParam("token_id")
  1348  	}
  1349  
  1350  	c.LogAudit("")
  1351  
  1352  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_REVOKE_USER_ACCESS_TOKEN) {
  1353  		c.SetPermissionError(model.PERMISSION_REVOKE_USER_ACCESS_TOKEN)
  1354  		return
  1355  	}
  1356  
  1357  	accessToken, err := c.App.GetUserAccessToken(tokenId, false)
  1358  	if err != nil {
  1359  		c.Err = err
  1360  		return
  1361  	}
  1362  
  1363  	if !c.App.SessionHasPermissionToUser(c.Session, accessToken.UserId) {
  1364  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1365  		return
  1366  	}
  1367  
  1368  	err = c.App.RevokeUserAccessToken(accessToken)
  1369  	if err != nil {
  1370  		c.Err = err
  1371  		return
  1372  	}
  1373  
  1374  	c.LogAudit("success - token_id=" + accessToken.Id)
  1375  	ReturnStatusOK(w)
  1376  }
  1377  
  1378  func disableUserAccessToken(c *Context, w http.ResponseWriter, r *http.Request) {
  1379  	props := model.MapFromJson(r.Body)
  1380  	tokenId := props["token_id"]
  1381  
  1382  	if tokenId == "" {
  1383  		c.SetInvalidParam("token_id")
  1384  	}
  1385  
  1386  	c.LogAudit("")
  1387  
  1388  	// No separate permission for this action for now
  1389  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_REVOKE_USER_ACCESS_TOKEN) {
  1390  		c.SetPermissionError(model.PERMISSION_REVOKE_USER_ACCESS_TOKEN)
  1391  		return
  1392  	}
  1393  
  1394  	accessToken, err := c.App.GetUserAccessToken(tokenId, false)
  1395  	if err != nil {
  1396  		c.Err = err
  1397  		return
  1398  	}
  1399  
  1400  	if !c.App.SessionHasPermissionToUser(c.Session, accessToken.UserId) {
  1401  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1402  		return
  1403  	}
  1404  
  1405  	err = c.App.DisableUserAccessToken(accessToken)
  1406  	if err != nil {
  1407  		c.Err = err
  1408  		return
  1409  	}
  1410  
  1411  	c.LogAudit("success - token_id=" + accessToken.Id)
  1412  	ReturnStatusOK(w)
  1413  }
  1414  
  1415  func enableUserAccessToken(c *Context, w http.ResponseWriter, r *http.Request) {
  1416  	props := model.MapFromJson(r.Body)
  1417  	tokenId := props["token_id"]
  1418  
  1419  	if tokenId == "" {
  1420  		c.SetInvalidParam("token_id")
  1421  	}
  1422  
  1423  	c.LogAudit("")
  1424  
  1425  	// No separate permission for this action for now
  1426  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_CREATE_USER_ACCESS_TOKEN) {
  1427  		c.SetPermissionError(model.PERMISSION_CREATE_USER_ACCESS_TOKEN)
  1428  		return
  1429  	}
  1430  
  1431  	accessToken, err := c.App.GetUserAccessToken(tokenId, false)
  1432  	if err != nil {
  1433  		c.Err = err
  1434  		return
  1435  	}
  1436  
  1437  	if !c.App.SessionHasPermissionToUser(c.Session, accessToken.UserId) {
  1438  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  1439  		return
  1440  	}
  1441  
  1442  	err = c.App.EnableUserAccessToken(accessToken)
  1443  	if err != nil {
  1444  		c.Err = err
  1445  		return
  1446  	}
  1447  
  1448  	c.LogAudit("success - token_id=" + accessToken.Id)
  1449  	ReturnStatusOK(w)
  1450  }