github.com/spreadshirt/mattermost-server@v5.3.2-0.20180927191755-a257d501df3d+incompatible/api4/team.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  	"bytes"
     8  	"encoding/base64"
     9  	"fmt"
    10  	"io"
    11  	"io/ioutil"
    12  	"net/http"
    13  	"strconv"
    14  
    15  	"github.com/mattermost/mattermost-server/model"
    16  )
    17  
    18  const (
    19  	MAX_ADD_MEMBERS_BATCH    = 20
    20  	MAXIMUM_BULK_IMPORT_SIZE = 10 * 1024 * 1024
    21  )
    22  
    23  func (api *API) InitTeam() {
    24  	api.BaseRoutes.Teams.Handle("", api.ApiSessionRequired(createTeam)).Methods("POST")
    25  	api.BaseRoutes.Teams.Handle("", api.ApiSessionRequired(getAllTeams)).Methods("GET")
    26  	api.BaseRoutes.Teams.Handle("/{team_id:[A-Za-z0-9]+}/scheme", api.ApiSessionRequired(updateTeamScheme)).Methods("PUT")
    27  	api.BaseRoutes.Teams.Handle("/search", api.ApiSessionRequired(searchTeams)).Methods("POST")
    28  	api.BaseRoutes.TeamsForUser.Handle("", api.ApiSessionRequired(getTeamsForUser)).Methods("GET")
    29  	api.BaseRoutes.TeamsForUser.Handle("/unread", api.ApiSessionRequired(getTeamsUnreadForUser)).Methods("GET")
    30  
    31  	api.BaseRoutes.Team.Handle("", api.ApiSessionRequired(getTeam)).Methods("GET")
    32  	api.BaseRoutes.Team.Handle("", api.ApiSessionRequired(updateTeam)).Methods("PUT")
    33  	api.BaseRoutes.Team.Handle("", api.ApiSessionRequired(deleteTeam)).Methods("DELETE")
    34  	api.BaseRoutes.Team.Handle("/patch", api.ApiSessionRequired(patchTeam)).Methods("PUT")
    35  	api.BaseRoutes.Team.Handle("/stats", api.ApiSessionRequired(getTeamStats)).Methods("GET")
    36  
    37  	api.BaseRoutes.Team.Handle("/image", api.ApiSessionRequiredTrustRequester(getTeamIcon)).Methods("GET")
    38  	api.BaseRoutes.Team.Handle("/image", api.ApiSessionRequired(setTeamIcon)).Methods("POST")
    39  	api.BaseRoutes.Team.Handle("/image", api.ApiSessionRequired(removeTeamIcon)).Methods("DELETE")
    40  
    41  	api.BaseRoutes.TeamMembers.Handle("", api.ApiSessionRequired(getTeamMembers)).Methods("GET")
    42  	api.BaseRoutes.TeamMembers.Handle("/ids", api.ApiSessionRequired(getTeamMembersByIds)).Methods("POST")
    43  	api.BaseRoutes.TeamMembersForUser.Handle("", api.ApiSessionRequired(getTeamMembersForUser)).Methods("GET")
    44  	api.BaseRoutes.TeamMembers.Handle("", api.ApiSessionRequired(addTeamMember)).Methods("POST")
    45  	api.BaseRoutes.Teams.Handle("/members/invite", api.ApiSessionRequired(addUserToTeamFromInvite)).Methods("POST")
    46  	api.BaseRoutes.TeamMembers.Handle("/batch", api.ApiSessionRequired(addTeamMembers)).Methods("POST")
    47  	api.BaseRoutes.TeamMember.Handle("", api.ApiSessionRequired(removeTeamMember)).Methods("DELETE")
    48  
    49  	api.BaseRoutes.TeamForUser.Handle("/unread", api.ApiSessionRequired(getTeamUnread)).Methods("GET")
    50  
    51  	api.BaseRoutes.TeamByName.Handle("", api.ApiSessionRequired(getTeamByName)).Methods("GET")
    52  	api.BaseRoutes.TeamMember.Handle("", api.ApiSessionRequired(getTeamMember)).Methods("GET")
    53  	api.BaseRoutes.TeamByName.Handle("/exists", api.ApiSessionRequired(teamExists)).Methods("GET")
    54  	api.BaseRoutes.TeamMember.Handle("/roles", api.ApiSessionRequired(updateTeamMemberRoles)).Methods("PUT")
    55  	api.BaseRoutes.TeamMember.Handle("/schemeRoles", api.ApiSessionRequired(updateTeamMemberSchemeRoles)).Methods("PUT")
    56  	api.BaseRoutes.Team.Handle("/import", api.ApiSessionRequired(importTeam)).Methods("POST")
    57  	api.BaseRoutes.Team.Handle("/invite/email", api.ApiSessionRequired(inviteUsersToTeam)).Methods("POST")
    58  	api.BaseRoutes.Teams.Handle("/invite/{invite_id:[A-Za-z0-9]+}", api.ApiHandler(getInviteInfo)).Methods("GET")
    59  }
    60  
    61  func createTeam(c *Context, w http.ResponseWriter, r *http.Request) {
    62  	team := model.TeamFromJson(r.Body)
    63  	if team == nil {
    64  		c.SetInvalidParam("team")
    65  		return
    66  	}
    67  
    68  	if !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_CREATE_TEAM) {
    69  		c.Err = model.NewAppError("createTeam", "api.team.is_team_creation_allowed.disabled.app_error", nil, "", http.StatusForbidden)
    70  		return
    71  	}
    72  
    73  	rteam, err := c.App.CreateTeamWithUser(team, c.Session.UserId)
    74  	if err != nil {
    75  		c.Err = err
    76  		return
    77  	}
    78  
    79  	// Don't sanitize the team here since the user will be a team admin and their session won't reflect that yet
    80  
    81  	w.WriteHeader(http.StatusCreated)
    82  	w.Write([]byte(rteam.ToJson()))
    83  }
    84  
    85  func getTeam(c *Context, w http.ResponseWriter, r *http.Request) {
    86  	c.RequireTeamId()
    87  	if c.Err != nil {
    88  		return
    89  	}
    90  
    91  	team, err := c.App.GetTeam(c.Params.TeamId)
    92  	if err != nil {
    93  		c.Err = err
    94  		return
    95  	}
    96  
    97  	if (!team.AllowOpenInvite || team.Type != model.TEAM_OPEN) && !c.App.SessionHasPermissionToTeam(c.Session, team.Id, model.PERMISSION_VIEW_TEAM) {
    98  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
    99  		return
   100  	}
   101  
   102  	c.App.SanitizeTeam(c.Session, team)
   103  	w.Write([]byte(team.ToJson()))
   104  }
   105  
   106  func getTeamByName(c *Context, w http.ResponseWriter, r *http.Request) {
   107  	c.RequireTeamName()
   108  	if c.Err != nil {
   109  		return
   110  	}
   111  
   112  	team, err := c.App.GetTeamByName(c.Params.TeamName)
   113  	if err != nil {
   114  		c.Err = err
   115  		return
   116  	}
   117  
   118  	if (!team.AllowOpenInvite || team.Type != model.TEAM_OPEN) && !c.App.SessionHasPermissionToTeam(c.Session, team.Id, model.PERMISSION_VIEW_TEAM) {
   119  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   120  		return
   121  	}
   122  
   123  	c.App.SanitizeTeam(c.Session, team)
   124  	w.Write([]byte(team.ToJson()))
   125  }
   126  
   127  func updateTeam(c *Context, w http.ResponseWriter, r *http.Request) {
   128  	c.RequireTeamId()
   129  	if c.Err != nil {
   130  		return
   131  	}
   132  
   133  	team := model.TeamFromJson(r.Body)
   134  
   135  	if team == nil {
   136  		c.SetInvalidParam("team")
   137  		return
   138  	}
   139  
   140  	// The team being updated in the payload must be the same one as indicated in the URL.
   141  	if team.Id != c.Params.TeamId {
   142  		c.SetInvalidParam("team_id")
   143  		return
   144  	}
   145  
   146  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
   147  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
   148  		return
   149  	}
   150  
   151  	updatedTeam, err := c.App.UpdateTeam(team)
   152  	if err != nil {
   153  		c.Err = err
   154  		return
   155  	}
   156  
   157  	c.App.SanitizeTeam(c.Session, updatedTeam)
   158  	w.Write([]byte(updatedTeam.ToJson()))
   159  }
   160  
   161  func patchTeam(c *Context, w http.ResponseWriter, r *http.Request) {
   162  	c.RequireTeamId()
   163  	if c.Err != nil {
   164  		return
   165  	}
   166  
   167  	team := model.TeamPatchFromJson(r.Body)
   168  
   169  	if team == nil {
   170  		c.SetInvalidParam("team")
   171  		return
   172  	}
   173  
   174  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
   175  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
   176  		return
   177  	}
   178  
   179  	patchedTeam, err := c.App.PatchTeam(c.Params.TeamId, team)
   180  
   181  	if err != nil {
   182  		c.Err = err
   183  		return
   184  	}
   185  
   186  	c.App.SanitizeTeam(c.Session, patchedTeam)
   187  
   188  	c.LogAudit("")
   189  	w.Write([]byte(patchedTeam.ToJson()))
   190  }
   191  
   192  func deleteTeam(c *Context, w http.ResponseWriter, r *http.Request) {
   193  	c.RequireTeamId()
   194  	if c.Err != nil {
   195  		return
   196  	}
   197  
   198  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
   199  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
   200  		return
   201  	}
   202  
   203  	var err *model.AppError
   204  	if c.Params.Permanent && *c.App.Config().ServiceSettings.EnableAPITeamDeletion {
   205  		err = c.App.PermanentDeleteTeamId(c.Params.TeamId)
   206  	} else {
   207  		err = c.App.SoftDeleteTeam(c.Params.TeamId)
   208  	}
   209  
   210  	if err != nil {
   211  		c.Err = err
   212  		return
   213  	}
   214  
   215  	ReturnStatusOK(w)
   216  }
   217  
   218  func getTeamsForUser(c *Context, w http.ResponseWriter, r *http.Request) {
   219  	c.RequireUserId()
   220  	if c.Err != nil {
   221  		return
   222  	}
   223  
   224  	if c.Session.UserId != c.Params.UserId && !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   225  		c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
   226  		return
   227  	}
   228  
   229  	teams, err := c.App.GetTeamsForUser(c.Params.UserId)
   230  	if err != nil {
   231  		c.Err = err
   232  		return
   233  	}
   234  
   235  	c.App.SanitizeTeams(c.Session, teams)
   236  	w.Write([]byte(model.TeamListToJson(teams)))
   237  }
   238  
   239  func getTeamsUnreadForUser(c *Context, w http.ResponseWriter, r *http.Request) {
   240  	c.RequireUserId()
   241  	if c.Err != nil {
   242  		return
   243  	}
   244  
   245  	if c.Session.UserId != c.Params.UserId && !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   246  		c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
   247  		return
   248  	}
   249  
   250  	// optional team id to be excluded from the result
   251  	teamId := r.URL.Query().Get("exclude_team")
   252  
   253  	unreadTeamsList, err := c.App.GetTeamsUnreadForUser(teamId, c.Params.UserId)
   254  	if err != nil {
   255  		c.Err = err
   256  		return
   257  	}
   258  
   259  	w.Write([]byte(model.TeamsUnreadToJson(unreadTeamsList)))
   260  }
   261  
   262  func getTeamMember(c *Context, w http.ResponseWriter, r *http.Request) {
   263  	c.RequireTeamId().RequireUserId()
   264  	if c.Err != nil {
   265  		return
   266  	}
   267  
   268  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
   269  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   270  		return
   271  	}
   272  
   273  	team, err := c.App.GetTeamMember(c.Params.TeamId, c.Params.UserId)
   274  	if err != nil {
   275  		c.Err = err
   276  		return
   277  	}
   278  
   279  	w.Write([]byte(team.ToJson()))
   280  }
   281  
   282  func getTeamMembers(c *Context, w http.ResponseWriter, r *http.Request) {
   283  	c.RequireTeamId()
   284  	if c.Err != nil {
   285  		return
   286  	}
   287  
   288  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
   289  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   290  		return
   291  	}
   292  
   293  	members, err := c.App.GetTeamMembers(c.Params.TeamId, c.Params.Page*c.Params.PerPage, c.Params.PerPage)
   294  	if err != nil {
   295  		c.Err = err
   296  		return
   297  	}
   298  
   299  	w.Write([]byte(model.TeamMembersToJson(members)))
   300  }
   301  
   302  func getTeamMembersForUser(c *Context, w http.ResponseWriter, r *http.Request) {
   303  	c.RequireUserId()
   304  	if c.Err != nil {
   305  		return
   306  	}
   307  
   308  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   309  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   310  		return
   311  	}
   312  
   313  	members, err := c.App.GetTeamMembersForUser(c.Params.UserId)
   314  	if err != nil {
   315  		c.Err = err
   316  		return
   317  	}
   318  
   319  	w.Write([]byte(model.TeamMembersToJson(members)))
   320  }
   321  
   322  func getTeamMembersByIds(c *Context, w http.ResponseWriter, r *http.Request) {
   323  	c.RequireTeamId()
   324  	if c.Err != nil {
   325  		return
   326  	}
   327  
   328  	userIds := model.ArrayFromJson(r.Body)
   329  
   330  	if len(userIds) == 0 {
   331  		c.SetInvalidParam("user_ids")
   332  		return
   333  	}
   334  
   335  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
   336  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   337  		return
   338  	}
   339  
   340  	members, err := c.App.GetTeamMembersByIds(c.Params.TeamId, userIds)
   341  	if err != nil {
   342  		c.Err = err
   343  		return
   344  	}
   345  
   346  	w.Write([]byte(model.TeamMembersToJson(members)))
   347  }
   348  
   349  func addTeamMember(c *Context, w http.ResponseWriter, r *http.Request) {
   350  	c.RequireTeamId()
   351  	if c.Err != nil {
   352  		return
   353  	}
   354  
   355  	var err *model.AppError
   356  	member := model.TeamMemberFromJson(r.Body)
   357  	if member.TeamId != c.Params.TeamId {
   358  		c.SetInvalidParam("team_id")
   359  		return
   360  	}
   361  
   362  	if len(member.UserId) != 26 {
   363  		c.SetInvalidParam("user_id")
   364  		return
   365  	}
   366  
   367  	if !c.App.SessionHasPermissionToTeam(c.Session, member.TeamId, model.PERMISSION_ADD_USER_TO_TEAM) {
   368  		c.SetPermissionError(model.PERMISSION_ADD_USER_TO_TEAM)
   369  		return
   370  	}
   371  
   372  	member, err = c.App.AddTeamMember(member.TeamId, member.UserId)
   373  
   374  	if err != nil {
   375  		c.Err = err
   376  		return
   377  	}
   378  
   379  	w.WriteHeader(http.StatusCreated)
   380  	w.Write([]byte(member.ToJson()))
   381  }
   382  
   383  func addUserToTeamFromInvite(c *Context, w http.ResponseWriter, r *http.Request) {
   384  	tokenId := r.URL.Query().Get("token")
   385  	inviteId := r.URL.Query().Get("invite_id")
   386  
   387  	var member *model.TeamMember
   388  	var err *model.AppError
   389  
   390  	if len(tokenId) > 0 {
   391  		member, err = c.App.AddTeamMemberByToken(c.Session.UserId, tokenId)
   392  	} else if len(inviteId) > 0 {
   393  		member, err = c.App.AddTeamMemberByInviteId(inviteId, c.Session.UserId)
   394  	} else {
   395  		err = model.NewAppError("addTeamMember", "api.team.add_user_to_team.missing_parameter.app_error", nil, "", http.StatusBadRequest)
   396  	}
   397  
   398  	if err != nil {
   399  		c.Err = err
   400  		return
   401  	}
   402  
   403  	w.WriteHeader(http.StatusCreated)
   404  	w.Write([]byte(member.ToJson()))
   405  }
   406  
   407  func addTeamMembers(c *Context, w http.ResponseWriter, r *http.Request) {
   408  	c.RequireTeamId()
   409  	if c.Err != nil {
   410  		return
   411  	}
   412  
   413  	var err *model.AppError
   414  	members := model.TeamMembersFromJson(r.Body)
   415  
   416  	if len(members) > MAX_ADD_MEMBERS_BATCH || len(members) == 0 {
   417  		c.SetInvalidParam("too many members in batch")
   418  		return
   419  	}
   420  
   421  	var userIds []string
   422  	for _, member := range members {
   423  		if member.TeamId != c.Params.TeamId {
   424  			c.SetInvalidParam("team_id for member with user_id=" + member.UserId)
   425  			return
   426  		}
   427  
   428  		if len(member.UserId) != 26 {
   429  			c.SetInvalidParam("user_id")
   430  			return
   431  		}
   432  
   433  		userIds = append(userIds, member.UserId)
   434  	}
   435  
   436  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_ADD_USER_TO_TEAM) {
   437  		c.SetPermissionError(model.PERMISSION_ADD_USER_TO_TEAM)
   438  		return
   439  	}
   440  
   441  	members, err = c.App.AddTeamMembers(c.Params.TeamId, userIds, c.Session.UserId)
   442  
   443  	if err != nil {
   444  		c.Err = err
   445  		return
   446  	}
   447  
   448  	w.WriteHeader(http.StatusCreated)
   449  	w.Write([]byte(model.TeamMembersToJson(members)))
   450  }
   451  
   452  func removeTeamMember(c *Context, w http.ResponseWriter, r *http.Request) {
   453  	c.RequireTeamId().RequireUserId()
   454  	if c.Err != nil {
   455  		return
   456  	}
   457  
   458  	if c.Session.UserId != c.Params.UserId {
   459  		if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_REMOVE_USER_FROM_TEAM) {
   460  			c.SetPermissionError(model.PERMISSION_REMOVE_USER_FROM_TEAM)
   461  			return
   462  		}
   463  	}
   464  
   465  	if err := c.App.RemoveUserFromTeam(c.Params.TeamId, c.Params.UserId, c.Session.UserId); err != nil {
   466  		c.Err = err
   467  		return
   468  	}
   469  
   470  	ReturnStatusOK(w)
   471  }
   472  
   473  func getTeamUnread(c *Context, w http.ResponseWriter, r *http.Request) {
   474  	c.RequireTeamId().RequireUserId()
   475  	if c.Err != nil {
   476  		return
   477  	}
   478  
   479  	if !c.App.SessionHasPermissionToUser(c.Session, c.Params.UserId) {
   480  		c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
   481  		return
   482  	}
   483  
   484  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
   485  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   486  		return
   487  	}
   488  
   489  	unreadTeam, err := c.App.GetTeamUnread(c.Params.TeamId, c.Params.UserId)
   490  	if err != nil {
   491  		c.Err = err
   492  		return
   493  	}
   494  
   495  	w.Write([]byte(unreadTeam.ToJson()))
   496  }
   497  
   498  func getTeamStats(c *Context, w http.ResponseWriter, r *http.Request) {
   499  	c.RequireTeamId()
   500  	if c.Err != nil {
   501  		return
   502  	}
   503  
   504  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
   505  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   506  		return
   507  	}
   508  
   509  	stats, err := c.App.GetTeamStats(c.Params.TeamId)
   510  	if err != nil {
   511  		c.Err = err
   512  		return
   513  	}
   514  
   515  	w.Write([]byte(stats.ToJson()))
   516  }
   517  
   518  func updateTeamMemberRoles(c *Context, w http.ResponseWriter, r *http.Request) {
   519  	c.RequireTeamId().RequireUserId()
   520  	if c.Err != nil {
   521  		return
   522  	}
   523  
   524  	props := model.MapFromJson(r.Body)
   525  
   526  	newRoles := props["roles"]
   527  	if !model.IsValidUserRoles(newRoles) {
   528  		c.SetInvalidParam("team_member_roles")
   529  		return
   530  	}
   531  
   532  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM_ROLES) {
   533  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM_ROLES)
   534  		return
   535  	}
   536  
   537  	if _, err := c.App.UpdateTeamMemberRoles(c.Params.TeamId, c.Params.UserId, newRoles); err != nil {
   538  		c.Err = err
   539  		return
   540  	}
   541  
   542  	ReturnStatusOK(w)
   543  }
   544  
   545  func updateTeamMemberSchemeRoles(c *Context, w http.ResponseWriter, r *http.Request) {
   546  	c.RequireTeamId().RequireUserId()
   547  	if c.Err != nil {
   548  		return
   549  	}
   550  
   551  	schemeRoles := model.SchemeRolesFromJson(r.Body)
   552  	if schemeRoles == nil {
   553  		c.SetInvalidParam("scheme_roles")
   554  		return
   555  	}
   556  
   557  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM_ROLES) {
   558  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM_ROLES)
   559  		return
   560  	}
   561  
   562  	if _, err := c.App.UpdateTeamMemberSchemeRoles(c.Params.TeamId, c.Params.UserId, schemeRoles.SchemeUser, schemeRoles.SchemeAdmin); err != nil {
   563  		c.Err = err
   564  		return
   565  	}
   566  
   567  	ReturnStatusOK(w)
   568  }
   569  
   570  func getAllTeams(c *Context, w http.ResponseWriter, r *http.Request) {
   571  	var teams []*model.Team
   572  	var err *model.AppError
   573  
   574  	if c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   575  		teams, err = c.App.GetAllTeamsPage(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
   576  	} else {
   577  		teams, err = c.App.GetAllOpenTeamsPage(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
   578  	}
   579  
   580  	if err != nil {
   581  		c.Err = err
   582  		return
   583  	}
   584  
   585  	c.App.SanitizeTeams(c.Session, teams)
   586  
   587  	w.Write([]byte(model.TeamListToJson(teams)))
   588  }
   589  
   590  func searchTeams(c *Context, w http.ResponseWriter, r *http.Request) {
   591  	props := model.TeamSearchFromJson(r.Body)
   592  	if props == nil {
   593  		c.SetInvalidParam("team_search")
   594  		return
   595  	}
   596  
   597  	if len(props.Term) == 0 {
   598  		c.SetInvalidParam("term")
   599  		return
   600  	}
   601  
   602  	var teams []*model.Team
   603  	var err *model.AppError
   604  
   605  	if c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
   606  		teams, err = c.App.SearchAllTeams(props.Term)
   607  	} else {
   608  		teams, err = c.App.SearchOpenTeams(props.Term)
   609  	}
   610  
   611  	if err != nil {
   612  		c.Err = err
   613  		return
   614  	}
   615  
   616  	c.App.SanitizeTeams(c.Session, teams)
   617  
   618  	w.Write([]byte(model.TeamListToJson(teams)))
   619  }
   620  
   621  func teamExists(c *Context, w http.ResponseWriter, r *http.Request) {
   622  	c.RequireTeamName()
   623  	if c.Err != nil {
   624  		return
   625  	}
   626  
   627  	resp := make(map[string]bool)
   628  
   629  	if _, err := c.App.GetTeamByName(c.Params.TeamName); err != nil {
   630  		resp["exists"] = false
   631  	} else {
   632  		resp["exists"] = true
   633  	}
   634  
   635  	w.Write([]byte(model.MapBoolToJson(resp)))
   636  }
   637  
   638  func importTeam(c *Context, w http.ResponseWriter, r *http.Request) {
   639  	c.RequireTeamId()
   640  	if c.Err != nil {
   641  		return
   642  	}
   643  
   644  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_IMPORT_TEAM) {
   645  		c.SetPermissionError(model.PERMISSION_IMPORT_TEAM)
   646  		return
   647  	}
   648  
   649  	if err := r.ParseMultipartForm(MAXIMUM_BULK_IMPORT_SIZE); err != nil {
   650  		c.Err = model.NewAppError("importTeam", "api.team.import_team.parse.app_error", nil, err.Error(), http.StatusInternalServerError)
   651  		return
   652  	}
   653  
   654  	importFromArray, ok := r.MultipartForm.Value["importFrom"]
   655  	if !ok || len(importFromArray) < 1 {
   656  		c.Err = model.NewAppError("importTeam", "api.team.import_team.no_import_from.app_error", nil, "", http.StatusBadRequest)
   657  		return
   658  	}
   659  	importFrom := importFromArray[0]
   660  
   661  	fileSizeStr, ok := r.MultipartForm.Value["filesize"]
   662  	if !ok || len(fileSizeStr) < 1 {
   663  		c.Err = model.NewAppError("importTeam", "api.team.import_team.unavailable.app_error", nil, "", http.StatusBadRequest)
   664  		return
   665  	}
   666  
   667  	fileSize, err := strconv.ParseInt(fileSizeStr[0], 10, 64)
   668  	if err != nil {
   669  		c.Err = model.NewAppError("importTeam", "api.team.import_team.integer.app_error", nil, "", http.StatusBadRequest)
   670  		return
   671  	}
   672  
   673  	fileInfoArray, ok := r.MultipartForm.File["file"]
   674  	if !ok {
   675  		c.Err = model.NewAppError("importTeam", "api.team.import_team.no_file.app_error", nil, "", http.StatusBadRequest)
   676  		return
   677  	}
   678  
   679  	if len(fileInfoArray) <= 0 {
   680  		c.Err = model.NewAppError("importTeam", "api.team.import_team.array.app_error", nil, "", http.StatusBadRequest)
   681  		return
   682  	}
   683  
   684  	fileInfo := fileInfoArray[0]
   685  
   686  	fileData, err := fileInfo.Open()
   687  	if err != nil {
   688  		c.Err = model.NewAppError("importTeam", "api.team.import_team.open.app_error", nil, err.Error(), http.StatusBadRequest)
   689  		return
   690  	}
   691  	defer fileData.Close()
   692  
   693  	var log *bytes.Buffer
   694  	switch importFrom {
   695  	case "slack":
   696  		var err *model.AppError
   697  		if err, log = c.App.SlackImport(fileData, fileSize, c.Params.TeamId); err != nil {
   698  			c.Err = err
   699  			c.Err.StatusCode = http.StatusBadRequest
   700  		}
   701  	}
   702  
   703  	data := map[string]string{}
   704  	data["results"] = base64.StdEncoding.EncodeToString([]byte(log.Bytes()))
   705  	if c.Err != nil {
   706  		w.WriteHeader(c.Err.StatusCode)
   707  	}
   708  	w.Write([]byte(model.MapToJson(data)))
   709  }
   710  
   711  func inviteUsersToTeam(c *Context, w http.ResponseWriter, r *http.Request) {
   712  	c.RequireTeamId()
   713  	if c.Err != nil {
   714  		return
   715  	}
   716  
   717  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_INVITE_USER) {
   718  		c.SetPermissionError(model.PERMISSION_INVITE_USER)
   719  		return
   720  	}
   721  
   722  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_ADD_USER_TO_TEAM) {
   723  		c.SetPermissionError(model.PERMISSION_INVITE_USER)
   724  		return
   725  	}
   726  
   727  	emailList := model.ArrayFromJson(r.Body)
   728  
   729  	if len(emailList) == 0 {
   730  		c.SetInvalidParam("user_email")
   731  		return
   732  	}
   733  
   734  	err := c.App.InviteNewUsersToTeam(emailList, c.Params.TeamId, c.Session.UserId)
   735  	if err != nil {
   736  		c.Err = err
   737  		return
   738  	}
   739  
   740  	ReturnStatusOK(w)
   741  }
   742  
   743  func getInviteInfo(c *Context, w http.ResponseWriter, r *http.Request) {
   744  	c.RequireInviteId()
   745  	if c.Err != nil {
   746  		return
   747  	}
   748  
   749  	team, err := c.App.GetTeamByInviteId(c.Params.InviteId)
   750  	if err != nil {
   751  		c.Err = err
   752  		return
   753  	}
   754  
   755  	if !(team.Type == model.TEAM_OPEN) {
   756  		c.Err = model.NewAppError("getInviteInfo", "api.team.get_invite_info.not_open_team", nil, "id="+c.Params.InviteId, http.StatusForbidden)
   757  		return
   758  	}
   759  
   760  	result := map[string]string{}
   761  	result["display_name"] = team.DisplayName
   762  	result["description"] = team.Description
   763  	result["name"] = team.Name
   764  	result["id"] = team.Id
   765  	w.Write([]byte(model.MapToJson(result)))
   766  }
   767  
   768  func getTeamIcon(c *Context, w http.ResponseWriter, r *http.Request) {
   769  	c.RequireTeamId()
   770  	if c.Err != nil {
   771  		return
   772  	}
   773  
   774  	team, err := c.App.GetTeam(c.Params.TeamId)
   775  
   776  	if err != nil {
   777  		c.Err = err
   778  		return
   779  	}
   780  
   781  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_VIEW_TEAM) &&
   782  		(team.Type != model.TEAM_OPEN || team.AllowOpenInvite) {
   783  		c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
   784  		return
   785  	}
   786  
   787  	etag := strconv.FormatInt(team.LastTeamIconUpdate, 10)
   788  
   789  	if c.HandleEtag(etag, "Get Team Icon", w, r) {
   790  		return
   791  	}
   792  
   793  	img, err := c.App.GetTeamIcon(team)
   794  	if err != nil {
   795  		c.Err = err
   796  		return
   797  	}
   798  
   799  	w.Header().Set("Content-Type", "image/png")
   800  	w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%v, public", 24*60*60)) // 24 hrs
   801  	w.Header().Set(model.HEADER_ETAG_SERVER, etag)
   802  	w.Write(img)
   803  }
   804  
   805  func setTeamIcon(c *Context, w http.ResponseWriter, r *http.Request) {
   806  	defer io.Copy(ioutil.Discard, r.Body)
   807  
   808  	c.RequireTeamId()
   809  	if c.Err != nil {
   810  		return
   811  	}
   812  
   813  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
   814  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
   815  		return
   816  	}
   817  
   818  	if r.ContentLength > *c.App.Config().FileSettings.MaxFileSize {
   819  		c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.too_large.app_error", nil, "", http.StatusBadRequest)
   820  		return
   821  	}
   822  
   823  	if err := r.ParseMultipartForm(*c.App.Config().FileSettings.MaxFileSize); err != nil {
   824  		c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.parse.app_error", nil, err.Error(), http.StatusBadRequest)
   825  		return
   826  	}
   827  
   828  	m := r.MultipartForm
   829  
   830  	imageArray, ok := m.File["image"]
   831  	if !ok {
   832  		c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.no_file.app_error", nil, "", http.StatusBadRequest)
   833  		return
   834  	}
   835  
   836  	if len(imageArray) <= 0 {
   837  		c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.array.app_error", nil, "", http.StatusBadRequest)
   838  		return
   839  	}
   840  
   841  	imageData := imageArray[0]
   842  
   843  	if err := c.App.SetTeamIcon(c.Params.TeamId, imageData); err != nil {
   844  		c.Err = err
   845  		return
   846  	}
   847  
   848  	c.LogAudit("")
   849  	ReturnStatusOK(w)
   850  }
   851  
   852  func removeTeamIcon(c *Context, w http.ResponseWriter, r *http.Request) {
   853  	c.RequireTeamId()
   854  	if c.Err != nil {
   855  		return
   856  	}
   857  
   858  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
   859  		c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
   860  		return
   861  	}
   862  
   863  	if err := c.App.RemoveTeamIcon(c.Params.TeamId); err != nil {
   864  		c.Err = err
   865  		return
   866  	}
   867  
   868  	c.LogAudit("")
   869  	ReturnStatusOK(w)
   870  }
   871  
   872  func updateTeamScheme(c *Context, w http.ResponseWriter, r *http.Request) {
   873  	c.RequireTeamId()
   874  	if c.Err != nil {
   875  		return
   876  	}
   877  
   878  	schemeID := model.SchemeIDFromJson(r.Body)
   879  	if schemeID == nil || (len(*schemeID) != 26 && *schemeID != "") {
   880  		c.SetInvalidParam("scheme_id")
   881  		return
   882  	}
   883  
   884  	if c.App.License() == nil {
   885  		c.Err = model.NewAppError("Api4.UpdateTeamScheme", "api.team.update_team_scheme.license.error", nil, "", http.StatusNotImplemented)
   886  		return
   887  	}
   888  
   889  	if !c.App.SessionHasPermissionToTeam(c.Session, c.Params.TeamId, model.PERMISSION_MANAGE_SYSTEM) {
   890  		c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
   891  		return
   892  	}
   893  
   894  	if *schemeID != "" {
   895  		scheme, err := c.App.GetScheme(*schemeID)
   896  		if err != nil {
   897  			c.Err = err
   898  			return
   899  		}
   900  
   901  		if scheme.Scope != model.SCHEME_SCOPE_TEAM {
   902  			c.Err = model.NewAppError("Api4.UpdateTeamScheme", "api.team.update_team_scheme.scheme_scope.error", nil, "", http.StatusBadRequest)
   903  			return
   904  		}
   905  	}
   906  
   907  	team, err := c.App.GetTeam(c.Params.TeamId)
   908  	if err != nil {
   909  		c.Err = err
   910  		return
   911  	}
   912  
   913  	team.SchemeId = schemeID
   914  
   915  	_, err = c.App.UpdateTeamScheme(team)
   916  	if err != nil {
   917  		c.Err = err
   918  		return
   919  	}
   920  
   921  	ReturnStatusOK(w)
   922  }