team.go 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552
  1. // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
  2. // See LICENSE.txt for license information.
  3. package api4
  4. import (
  5. "bytes"
  6. "encoding/base64"
  7. "encoding/json"
  8. "fmt"
  9. "io"
  10. "io/ioutil"
  11. "net/http"
  12. "regexp"
  13. "strconv"
  14. "strings"
  15. "github.com/mattermost/mattermost-server/v5/audit"
  16. "github.com/mattermost/mattermost-server/v5/model"
  17. )
  18. const (
  19. MAX_ADD_MEMBERS_BATCH = 20
  20. MAXIMUM_BULK_IMPORT_SIZE = 10 * 1024 * 1024
  21. groupIDsParamPattern = "[^a-zA-Z0-9,]*"
  22. )
  23. var groupIDsQueryParamRegex *regexp.Regexp
  24. func init() {
  25. groupIDsQueryParamRegex = regexp.MustCompile(groupIDsParamPattern)
  26. }
  27. func (api *API) InitTeam() {
  28. api.BaseRoutes.Teams.Handle("", api.ApiSessionRequired(createTeam)).Methods("POST")
  29. api.BaseRoutes.Teams.Handle("", api.ApiSessionRequired(getAllTeams)).Methods("GET")
  30. api.BaseRoutes.Teams.Handle("/{team_id:[A-Za-z0-9]+}/scheme", api.ApiSessionRequired(updateTeamScheme)).Methods("PUT")
  31. api.BaseRoutes.Teams.Handle("/search", api.ApiSessionRequiredDisableWhenBusy(searchTeams)).Methods("POST")
  32. api.BaseRoutes.TeamsForUser.Handle("", api.ApiSessionRequired(getTeamsForUser)).Methods("GET")
  33. api.BaseRoutes.TeamsForUser.Handle("/unread", api.ApiSessionRequired(getTeamsUnreadForUser)).Methods("GET")
  34. api.BaseRoutes.Team.Handle("", api.ApiSessionRequired(getTeam)).Methods("GET")
  35. api.BaseRoutes.Team.Handle("", api.ApiSessionRequired(updateTeam)).Methods("PUT")
  36. api.BaseRoutes.Team.Handle("", api.ApiSessionRequired(deleteTeam)).Methods("DELETE")
  37. api.BaseRoutes.Team.Handle("/patch", api.ApiSessionRequired(patchTeam)).Methods("PUT")
  38. api.BaseRoutes.Team.Handle("/restore", api.ApiSessionRequired(restoreTeam)).Methods("POST")
  39. api.BaseRoutes.Team.Handle("/privacy", api.ApiSessionRequired(updateTeamPrivacy)).Methods("PUT")
  40. api.BaseRoutes.Team.Handle("/stats", api.ApiSessionRequired(getTeamStats)).Methods("GET")
  41. api.BaseRoutes.Team.Handle("/regenerate_invite_id", api.ApiSessionRequired(regenerateTeamInviteId)).Methods("POST")
  42. api.BaseRoutes.Team.Handle("/image", api.ApiSessionRequiredTrustRequester(getTeamIcon)).Methods("GET")
  43. api.BaseRoutes.Team.Handle("/image", api.ApiSessionRequired(setTeamIcon)).Methods("POST")
  44. api.BaseRoutes.Team.Handle("/image", api.ApiSessionRequired(removeTeamIcon)).Methods("DELETE")
  45. api.BaseRoutes.TeamMembers.Handle("", api.ApiSessionRequired(getTeamMembers)).Methods("GET")
  46. api.BaseRoutes.TeamMembers.Handle("/ids", api.ApiSessionRequired(getTeamMembersByIds)).Methods("POST")
  47. api.BaseRoutes.TeamMembersForUser.Handle("", api.ApiSessionRequired(getTeamMembersForUser)).Methods("GET")
  48. api.BaseRoutes.TeamMembers.Handle("", api.ApiSessionRequired(addTeamMember)).Methods("POST")
  49. api.BaseRoutes.Teams.Handle("/members/invite", api.ApiSessionRequired(addUserToTeamFromInvite)).Methods("POST")
  50. api.BaseRoutes.TeamMembers.Handle("/batch", api.ApiSessionRequired(addTeamMembers)).Methods("POST")
  51. api.BaseRoutes.TeamMember.Handle("", api.ApiSessionRequired(removeTeamMember)).Methods("DELETE")
  52. api.BaseRoutes.TeamForUser.Handle("/unread", api.ApiSessionRequired(getTeamUnread)).Methods("GET")
  53. api.BaseRoutes.TeamByName.Handle("", api.ApiSessionRequired(getTeamByName)).Methods("GET")
  54. api.BaseRoutes.TeamMember.Handle("", api.ApiSessionRequired(getTeamMember)).Methods("GET")
  55. api.BaseRoutes.TeamByName.Handle("/exists", api.ApiSessionRequired(teamExists)).Methods("GET")
  56. api.BaseRoutes.TeamMember.Handle("/roles", api.ApiSessionRequired(updateTeamMemberRoles)).Methods("PUT")
  57. api.BaseRoutes.TeamMember.Handle("/schemeRoles", api.ApiSessionRequired(updateTeamMemberSchemeRoles)).Methods("PUT")
  58. api.BaseRoutes.Team.Handle("/import", api.ApiSessionRequired(importTeam)).Methods("POST")
  59. api.BaseRoutes.Team.Handle("/invite/email", api.ApiSessionRequired(inviteUsersToTeam)).Methods("POST")
  60. api.BaseRoutes.Team.Handle("/invite-guests/email", api.ApiSessionRequired(inviteGuestsToChannels)).Methods("POST")
  61. api.BaseRoutes.Teams.Handle("/invites/email", api.ApiSessionRequired(invalidateAllEmailInvites)).Methods("DELETE")
  62. api.BaseRoutes.Teams.Handle("/invite/{invite_id:[A-Za-z0-9]+}", api.ApiHandler(getInviteInfo)).Methods("GET")
  63. api.BaseRoutes.Teams.Handle("/{team_id:[A-Za-z0-9]+}/members_minus_group_members", api.ApiSessionRequired(teamMembersMinusGroupMembers)).Methods("GET")
  64. }
  65. func createTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  66. team := model.TeamFromJson(r.Body)
  67. if team == nil {
  68. c.SetInvalidParam("team")
  69. return
  70. }
  71. team.Email = strings.ToLower(team.Email)
  72. auditRec := c.MakeAuditRecord("createTeam", audit.Fail)
  73. defer c.LogAuditRec(auditRec)
  74. auditRec.AddMeta("team", team)
  75. if !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_CREATE_TEAM) {
  76. c.Err = model.NewAppError("createTeam", "api.team.is_team_creation_allowed.disabled.app_error", nil, "", http.StatusForbidden)
  77. return
  78. }
  79. rteam, err := c.App.CreateTeamWithUser(team, c.App.Session().UserId)
  80. if err != nil {
  81. c.Err = err
  82. return
  83. }
  84. // Don't sanitize the team here since the user will be a team admin and their session won't reflect that yet
  85. auditRec.Success()
  86. auditRec.AddMeta("team", team) // overwrite meta
  87. w.WriteHeader(http.StatusCreated)
  88. w.Write([]byte(rteam.ToJson()))
  89. }
  90. func getTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  91. c.RequireTeamId()
  92. if c.Err != nil {
  93. return
  94. }
  95. team, err := c.App.GetTeam(c.Params.TeamId)
  96. if err != nil {
  97. c.Err = err
  98. return
  99. }
  100. if (!team.AllowOpenInvite || team.Type != model.TEAM_OPEN) && !c.App.SessionHasPermissionToTeam(*c.App.Session(), team.Id, model.PERMISSION_VIEW_TEAM) {
  101. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  102. return
  103. }
  104. c.App.SanitizeTeam(*c.App.Session(), team)
  105. w.Write([]byte(team.ToJson()))
  106. }
  107. func getTeamByName(c *Context, w http.ResponseWriter, r *http.Request) {
  108. c.RequireTeamName()
  109. if c.Err != nil {
  110. return
  111. }
  112. team, err := c.App.GetTeamByName(c.Params.TeamName)
  113. if err != nil {
  114. c.Err = err
  115. return
  116. }
  117. if (!team.AllowOpenInvite || team.Type != model.TEAM_OPEN) && !c.App.SessionHasPermissionToTeam(*c.App.Session(), team.Id, model.PERMISSION_VIEW_TEAM) {
  118. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  119. return
  120. }
  121. c.App.SanitizeTeam(*c.App.Session(), team)
  122. w.Write([]byte(team.ToJson()))
  123. }
  124. func updateTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  125. c.RequireTeamId()
  126. if c.Err != nil {
  127. return
  128. }
  129. team := model.TeamFromJson(r.Body)
  130. if team == nil {
  131. c.SetInvalidParam("team")
  132. return
  133. }
  134. team.Email = strings.ToLower(team.Email)
  135. // The team being updated in the payload must be the same one as indicated in the URL.
  136. if team.Id != c.Params.TeamId {
  137. c.SetInvalidParam("id")
  138. return
  139. }
  140. auditRec := c.MakeAuditRecord("updateTeam", audit.Fail)
  141. defer c.LogAuditRec(auditRec)
  142. auditRec.AddMeta("team", team)
  143. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  144. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  145. return
  146. }
  147. updatedTeam, err := c.App.UpdateTeam(team)
  148. if err != nil {
  149. c.Err = err
  150. return
  151. }
  152. auditRec.Success()
  153. auditRec.AddMeta("update", updatedTeam)
  154. c.App.SanitizeTeam(*c.App.Session(), updatedTeam)
  155. w.Write([]byte(updatedTeam.ToJson()))
  156. }
  157. func patchTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  158. c.RequireTeamId()
  159. if c.Err != nil {
  160. return
  161. }
  162. team := model.TeamPatchFromJson(r.Body)
  163. if team == nil {
  164. c.SetInvalidParam("team")
  165. return
  166. }
  167. auditRec := c.MakeAuditRecord("patchTeam", audit.Fail)
  168. defer c.LogAuditRec(auditRec)
  169. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  170. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  171. return
  172. }
  173. if oldTeam, err := c.App.GetTeam(c.Params.TeamId); err == nil {
  174. auditRec.AddMeta("team", oldTeam)
  175. }
  176. patchedTeam, err := c.App.PatchTeam(c.Params.TeamId, team)
  177. if err != nil {
  178. c.Err = err
  179. return
  180. }
  181. c.App.SanitizeTeam(*c.App.Session(), patchedTeam)
  182. auditRec.Success()
  183. auditRec.AddMeta("patched", patchedTeam)
  184. c.LogAudit("")
  185. w.Write([]byte(patchedTeam.ToJson()))
  186. }
  187. func restoreTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  188. c.RequireTeamId()
  189. if c.Err != nil {
  190. return
  191. }
  192. auditRec := c.MakeAuditRecord("restoreTeam", audit.Fail)
  193. defer c.LogAuditRec(auditRec)
  194. auditRec.AddMeta("team_id", c.Params.TeamId)
  195. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  196. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  197. return
  198. }
  199. err := c.App.RestoreTeam(c.Params.TeamId)
  200. if err != nil {
  201. c.Err = err
  202. return
  203. }
  204. // Return the restored team to be consistent with RestoreChannel.
  205. team, err := c.App.GetTeam(c.Params.TeamId)
  206. if err != nil {
  207. c.Err = err
  208. return
  209. }
  210. auditRec.AddMeta("team", team)
  211. auditRec.Success()
  212. w.Write([]byte(team.ToJson()))
  213. }
  214. func updateTeamPrivacy(c *Context, w http.ResponseWriter, r *http.Request) {
  215. c.RequireTeamId()
  216. if c.Err != nil {
  217. return
  218. }
  219. props := model.StringInterfaceFromJson(r.Body)
  220. privacy, ok := props["privacy"].(string)
  221. if !ok {
  222. c.SetInvalidParam("privacy")
  223. return
  224. }
  225. var openInvite bool
  226. switch privacy {
  227. case model.TEAM_OPEN:
  228. openInvite = true
  229. case model.TEAM_INVITE:
  230. openInvite = false
  231. default:
  232. c.SetInvalidParam("privacy")
  233. return
  234. }
  235. auditRec := c.MakeAuditRecord("updateTeamPrivacy", audit.Fail)
  236. defer c.LogAuditRec(auditRec)
  237. auditRec.AddMeta("privacy", privacy)
  238. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  239. auditRec.AddMeta("team_id", c.Params.TeamId)
  240. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  241. return
  242. }
  243. if err := c.App.UpdateTeamPrivacy(c.Params.TeamId, privacy, openInvite); err != nil {
  244. c.Err = err
  245. return
  246. }
  247. // Return the updated team to be consistent with UpdateChannelPrivacy
  248. team, err := c.App.GetTeam(c.Params.TeamId)
  249. if err != nil {
  250. c.Err = err
  251. return
  252. }
  253. auditRec.AddMeta("team", team)
  254. auditRec.Success()
  255. w.Write([]byte(team.ToJson()))
  256. }
  257. func regenerateTeamInviteId(c *Context, w http.ResponseWriter, r *http.Request) {
  258. c.RequireTeamId()
  259. if c.Err != nil {
  260. return
  261. }
  262. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  263. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  264. return
  265. }
  266. auditRec := c.MakeAuditRecord("regenerateTeamInviteId", audit.Fail)
  267. defer c.LogAuditRec(auditRec)
  268. patchedTeam, err := c.App.RegenerateTeamInviteId(c.Params.TeamId)
  269. if err != nil {
  270. c.Err = err
  271. return
  272. }
  273. c.App.SanitizeTeam(*c.App.Session(), patchedTeam)
  274. auditRec.Success()
  275. auditRec.AddMeta("team", patchedTeam)
  276. c.LogAudit("")
  277. w.Write([]byte(patchedTeam.ToJson()))
  278. }
  279. func deleteTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  280. c.RequireTeamId()
  281. if c.Err != nil {
  282. return
  283. }
  284. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  285. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  286. return
  287. }
  288. auditRec := c.MakeAuditRecord("deleteTeam", audit.Fail)
  289. defer c.LogAuditRec(auditRec)
  290. if team, err := c.App.GetTeam(c.Params.TeamId); err == nil {
  291. auditRec.AddMeta("team", team)
  292. }
  293. var err *model.AppError
  294. if c.Params.Permanent {
  295. if *c.App.Config().ServiceSettings.EnableAPITeamDeletion {
  296. err = c.App.PermanentDeleteTeamId(c.Params.TeamId)
  297. } else {
  298. err = model.NewAppError("deleteTeam", "api.user.delete_team.not_enabled.app_error", nil, "teamId="+c.Params.TeamId, http.StatusUnauthorized)
  299. }
  300. } else {
  301. err = c.App.SoftDeleteTeam(c.Params.TeamId)
  302. }
  303. if err != nil {
  304. c.Err = err
  305. return
  306. }
  307. auditRec.Success()
  308. ReturnStatusOK(w)
  309. }
  310. func getTeamsForUser(c *Context, w http.ResponseWriter, r *http.Request) {
  311. c.RequireUserId()
  312. if c.Err != nil {
  313. return
  314. }
  315. if c.App.Session().UserId != c.Params.UserId && !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_SYSTEM) {
  316. c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  317. return
  318. }
  319. teams, err := c.App.GetTeamsForUser(c.Params.UserId)
  320. if err != nil {
  321. c.Err = err
  322. return
  323. }
  324. c.App.SanitizeTeams(*c.App.Session(), teams)
  325. w.Write([]byte(model.TeamListToJson(teams)))
  326. }
  327. func getTeamsUnreadForUser(c *Context, w http.ResponseWriter, r *http.Request) {
  328. c.RequireUserId()
  329. if c.Err != nil {
  330. return
  331. }
  332. if c.App.Session().UserId != c.Params.UserId && !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_SYSTEM) {
  333. c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  334. return
  335. }
  336. // optional team id to be excluded from the result
  337. teamId := r.URL.Query().Get("exclude_team")
  338. unreadTeamsList, err := c.App.GetTeamsUnreadForUser(teamId, c.Params.UserId)
  339. if err != nil {
  340. c.Err = err
  341. return
  342. }
  343. w.Write([]byte(model.TeamsUnreadToJson(unreadTeamsList)))
  344. }
  345. func getTeamMember(c *Context, w http.ResponseWriter, r *http.Request) {
  346. c.RequireTeamId().RequireUserId()
  347. if c.Err != nil {
  348. return
  349. }
  350. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
  351. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  352. return
  353. }
  354. canSee, err := c.App.UserCanSeeOtherUser(c.App.Session().UserId, c.Params.UserId)
  355. if err != nil {
  356. c.Err = err
  357. return
  358. }
  359. if !canSee {
  360. c.SetPermissionError(model.PERMISSION_VIEW_MEMBERS)
  361. return
  362. }
  363. team, err := c.App.GetTeamMember(c.Params.TeamId, c.Params.UserId)
  364. if err != nil {
  365. c.Err = err
  366. return
  367. }
  368. w.Write([]byte(team.ToJson()))
  369. }
  370. func getTeamMembers(c *Context, w http.ResponseWriter, r *http.Request) {
  371. c.RequireTeamId()
  372. if c.Err != nil {
  373. return
  374. }
  375. sort := r.URL.Query().Get("sort")
  376. excludeDeletedUsers := r.URL.Query().Get("exclude_deleted_users")
  377. excludeDeletedUsersBool, _ := strconv.ParseBool(excludeDeletedUsers)
  378. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
  379. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  380. return
  381. }
  382. restrictions, err := c.App.GetViewUsersRestrictions(c.App.Session().UserId)
  383. if err != nil {
  384. c.Err = err
  385. return
  386. }
  387. teamMembersGetOptions := &model.TeamMembersGetOptions{
  388. Sort: sort,
  389. ExcludeDeletedUsers: excludeDeletedUsersBool,
  390. ViewRestrictions: restrictions,
  391. }
  392. members, err := c.App.GetTeamMembers(c.Params.TeamId, c.Params.Page*c.Params.PerPage, c.Params.PerPage, teamMembersGetOptions)
  393. if err != nil {
  394. c.Err = err
  395. return
  396. }
  397. w.Write([]byte(model.TeamMembersToJson(members)))
  398. }
  399. func getTeamMembersForUser(c *Context, w http.ResponseWriter, r *http.Request) {
  400. c.RequireUserId()
  401. if c.Err != nil {
  402. return
  403. }
  404. if !c.App.SessionHasPermissionToUser(*c.App.Session(), c.Params.UserId) {
  405. c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  406. return
  407. }
  408. canSee, err := c.App.UserCanSeeOtherUser(c.App.Session().UserId, c.Params.UserId)
  409. if err != nil {
  410. c.Err = err
  411. return
  412. }
  413. if !canSee {
  414. c.SetPermissionError(model.PERMISSION_VIEW_MEMBERS)
  415. return
  416. }
  417. members, err := c.App.GetTeamMembersForUser(c.Params.UserId)
  418. if err != nil {
  419. c.Err = err
  420. return
  421. }
  422. w.Write([]byte(model.TeamMembersToJson(members)))
  423. }
  424. func getTeamMembersByIds(c *Context, w http.ResponseWriter, r *http.Request) {
  425. c.RequireTeamId()
  426. if c.Err != nil {
  427. return
  428. }
  429. userIds := model.ArrayFromJson(r.Body)
  430. if len(userIds) == 0 {
  431. c.SetInvalidParam("user_ids")
  432. return
  433. }
  434. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
  435. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  436. return
  437. }
  438. restrictions, err := c.App.GetViewUsersRestrictions(c.App.Session().UserId)
  439. if err != nil {
  440. c.Err = err
  441. return
  442. }
  443. members, err := c.App.GetTeamMembersByIds(c.Params.TeamId, userIds, restrictions)
  444. if err != nil {
  445. c.Err = err
  446. return
  447. }
  448. w.Write([]byte(model.TeamMembersToJson(members)))
  449. }
  450. func addTeamMember(c *Context, w http.ResponseWriter, r *http.Request) {
  451. c.RequireTeamId()
  452. if c.Err != nil {
  453. return
  454. }
  455. var err *model.AppError
  456. member := model.TeamMemberFromJson(r.Body)
  457. if member.TeamId != c.Params.TeamId {
  458. c.SetInvalidParam("team_id")
  459. return
  460. }
  461. if !model.IsValidId(member.UserId) {
  462. c.SetInvalidParam("user_id")
  463. return
  464. }
  465. auditRec := c.MakeAuditRecord("addTeamMember", audit.Fail)
  466. defer c.LogAuditRec(auditRec)
  467. auditRec.AddMeta("member", member)
  468. if member.UserId == c.App.Session().UserId {
  469. var team *model.Team
  470. team, err = c.App.GetTeam(member.TeamId)
  471. if err != nil {
  472. c.Err = err
  473. return
  474. }
  475. if team.AllowOpenInvite && !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_JOIN_PUBLIC_TEAMS) {
  476. c.SetPermissionError(model.PERMISSION_JOIN_PUBLIC_TEAMS)
  477. return
  478. }
  479. if !team.AllowOpenInvite && !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_JOIN_PRIVATE_TEAMS) {
  480. c.SetPermissionError(model.PERMISSION_JOIN_PRIVATE_TEAMS)
  481. return
  482. }
  483. } else {
  484. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), member.TeamId, model.PERMISSION_ADD_USER_TO_TEAM) {
  485. c.SetPermissionError(model.PERMISSION_ADD_USER_TO_TEAM)
  486. return
  487. }
  488. }
  489. team, err := c.App.GetTeam(member.TeamId)
  490. if err != nil {
  491. c.Err = err
  492. return
  493. }
  494. auditRec.AddMeta("team", team)
  495. if team.IsGroupConstrained() {
  496. nonMembers, err := c.App.FilterNonGroupTeamMembers([]string{member.UserId}, team)
  497. if err != nil {
  498. if v, ok := err.(*model.AppError); ok {
  499. c.Err = v
  500. } else {
  501. c.Err = model.NewAppError("addTeamMember", "api.team.add_members.error", nil, err.Error(), http.StatusBadRequest)
  502. }
  503. return
  504. }
  505. if len(nonMembers) > 0 {
  506. c.Err = model.NewAppError("addTeamMember", "api.team.add_members.user_denied", map[string]interface{}{"UserIDs": nonMembers}, "", http.StatusBadRequest)
  507. return
  508. }
  509. }
  510. member, err = c.App.AddTeamMember(member.TeamId, member.UserId)
  511. if err != nil {
  512. c.Err = err
  513. return
  514. }
  515. auditRec.Success()
  516. w.WriteHeader(http.StatusCreated)
  517. w.Write([]byte(member.ToJson()))
  518. }
  519. func addUserToTeamFromInvite(c *Context, w http.ResponseWriter, r *http.Request) {
  520. tokenId := r.URL.Query().Get("token")
  521. inviteId := r.URL.Query().Get("invite_id")
  522. var member *model.TeamMember
  523. var err *model.AppError
  524. auditRec := c.MakeAuditRecord("addUserToTeamFromInvite", audit.Fail)
  525. defer c.LogAuditRec(auditRec)
  526. auditRec.AddMeta("invite_id", inviteId)
  527. if len(tokenId) > 0 {
  528. member, err = c.App.AddTeamMemberByToken(c.App.Session().UserId, tokenId)
  529. } else if len(inviteId) > 0 {
  530. if c.App.Session().Props[model.SESSION_PROP_IS_GUEST] == "true" {
  531. c.Err = model.NewAppError("addUserToTeamFromInvite", "api.team.add_user_to_team_from_invite.guest.app_error", nil, "", http.StatusForbidden)
  532. return
  533. }
  534. member, err = c.App.AddTeamMemberByInviteId(inviteId, c.App.Session().UserId)
  535. } else {
  536. err = model.NewAppError("addTeamMember", "api.team.add_user_to_team.missing_parameter.app_error", nil, "", http.StatusBadRequest)
  537. }
  538. if err != nil {
  539. c.Err = err
  540. return
  541. }
  542. auditRec.Success()
  543. if member != nil {
  544. auditRec.AddMeta("member", member)
  545. }
  546. w.WriteHeader(http.StatusCreated)
  547. w.Write([]byte(member.ToJson()))
  548. }
  549. func addTeamMembers(c *Context, w http.ResponseWriter, r *http.Request) {
  550. graceful := r.URL.Query().Get("graceful") != ""
  551. c.RequireTeamId()
  552. if c.Err != nil {
  553. return
  554. }
  555. var err *model.AppError
  556. members := model.TeamMembersFromJson(r.Body)
  557. if len(members) > MAX_ADD_MEMBERS_BATCH {
  558. c.SetInvalidParam("too many members in batch")
  559. return
  560. }
  561. if len(members) == 0 {
  562. c.SetInvalidParam("no members in batch")
  563. return
  564. }
  565. auditRec := c.MakeAuditRecord("addTeamMembers", audit.Fail)
  566. defer c.LogAuditRec(auditRec)
  567. auditRec.AddMeta("count", len(members))
  568. var memberIDs []string
  569. for _, member := range members {
  570. memberIDs = append(memberIDs, member.UserId)
  571. }
  572. auditRec.AddMeta("user_ids", memberIDs)
  573. team, err := c.App.GetTeam(c.Params.TeamId)
  574. if err != nil {
  575. c.Err = err
  576. return
  577. }
  578. auditRec.AddMeta("team", team)
  579. if team.IsGroupConstrained() {
  580. nonMembers, err := c.App.FilterNonGroupTeamMembers(memberIDs, team)
  581. if err != nil {
  582. if v, ok := err.(*model.AppError); ok {
  583. c.Err = v
  584. } else {
  585. c.Err = model.NewAppError("addTeamMembers", "api.team.add_members.error", nil, err.Error(), http.StatusBadRequest)
  586. }
  587. return
  588. }
  589. if len(nonMembers) > 0 {
  590. c.Err = model.NewAppError("addTeamMembers", "api.team.add_members.user_denied", map[string]interface{}{"UserIDs": nonMembers}, "", http.StatusBadRequest)
  591. return
  592. }
  593. }
  594. var userIds []string
  595. for _, member := range members {
  596. if member.TeamId != c.Params.TeamId {
  597. c.SetInvalidParam("team_id for member with user_id=" + member.UserId)
  598. return
  599. }
  600. if !model.IsValidId(member.UserId) {
  601. c.SetInvalidParam("user_id")
  602. return
  603. }
  604. userIds = append(userIds, member.UserId)
  605. }
  606. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_ADD_USER_TO_TEAM) {
  607. c.SetPermissionError(model.PERMISSION_ADD_USER_TO_TEAM)
  608. return
  609. }
  610. membersWithErrors, err := c.App.AddTeamMembers(c.Params.TeamId, userIds, c.App.Session().UserId, graceful)
  611. if membersWithErrors != nil {
  612. errList := make([]string, 0, len(membersWithErrors))
  613. for _, m := range membersWithErrors {
  614. if m.Error != nil {
  615. errList = append(errList, model.TeamMemberWithErrorToString(m))
  616. }
  617. }
  618. auditRec.AddMeta("errors", errList)
  619. }
  620. if err != nil {
  621. c.Err = err
  622. return
  623. }
  624. auditRec.Success()
  625. w.WriteHeader(http.StatusCreated)
  626. if graceful {
  627. // in 'graceful' mode we allow a different return value, notifying the client which users were not added
  628. w.Write([]byte(model.TeamMembersWithErrorToJson(membersWithErrors)))
  629. } else {
  630. w.Write([]byte(model.TeamMembersToJson(model.TeamMembersWithErrorToTeamMembers(membersWithErrors))))
  631. }
  632. }
  633. func removeTeamMember(c *Context, w http.ResponseWriter, r *http.Request) {
  634. c.RequireTeamId().RequireUserId()
  635. if c.Err != nil {
  636. return
  637. }
  638. auditRec := c.MakeAuditRecord("removeTeamMember", audit.Fail)
  639. defer c.LogAuditRec(auditRec)
  640. if c.App.Session().UserId != c.Params.UserId {
  641. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_REMOVE_USER_FROM_TEAM) {
  642. c.SetPermissionError(model.PERMISSION_REMOVE_USER_FROM_TEAM)
  643. return
  644. }
  645. }
  646. team, err := c.App.GetTeam(c.Params.TeamId)
  647. if err != nil {
  648. c.Err = err
  649. return
  650. }
  651. auditRec.AddMeta("team", team)
  652. user, err := c.App.GetUser(c.Params.UserId)
  653. if err != nil {
  654. c.Err = err
  655. return
  656. }
  657. auditRec.AddMeta("user", user)
  658. if team.IsGroupConstrained() && (c.Params.UserId != c.App.Session().UserId) && !user.IsBot {
  659. c.Err = model.NewAppError("removeTeamMember", "api.team.remove_member.group_constrained.app_error", nil, "", http.StatusBadRequest)
  660. return
  661. }
  662. if err := c.App.RemoveUserFromTeam(c.Params.TeamId, c.Params.UserId, c.App.Session().UserId); err != nil {
  663. c.Err = err
  664. return
  665. }
  666. auditRec.Success()
  667. ReturnStatusOK(w)
  668. }
  669. func getTeamUnread(c *Context, w http.ResponseWriter, r *http.Request) {
  670. c.RequireTeamId().RequireUserId()
  671. if c.Err != nil {
  672. return
  673. }
  674. if !c.App.SessionHasPermissionToUser(*c.App.Session(), c.Params.UserId) {
  675. c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
  676. return
  677. }
  678. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
  679. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  680. return
  681. }
  682. unreadTeam, err := c.App.GetTeamUnread(c.Params.TeamId, c.Params.UserId)
  683. if err != nil {
  684. c.Err = err
  685. return
  686. }
  687. w.Write([]byte(unreadTeam.ToJson()))
  688. }
  689. func getTeamStats(c *Context, w http.ResponseWriter, r *http.Request) {
  690. c.RequireTeamId()
  691. if c.Err != nil {
  692. return
  693. }
  694. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_VIEW_TEAM) {
  695. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  696. return
  697. }
  698. restrictions, err := c.App.GetViewUsersRestrictions(c.App.Session().UserId)
  699. if err != nil {
  700. c.Err = err
  701. return
  702. }
  703. stats, err := c.App.GetTeamStats(c.Params.TeamId, restrictions)
  704. if err != nil {
  705. c.Err = err
  706. return
  707. }
  708. w.Write([]byte(stats.ToJson()))
  709. }
  710. func updateTeamMemberRoles(c *Context, w http.ResponseWriter, r *http.Request) {
  711. c.RequireTeamId().RequireUserId()
  712. if c.Err != nil {
  713. return
  714. }
  715. props := model.MapFromJson(r.Body)
  716. newRoles := props["roles"]
  717. if !model.IsValidUserRoles(newRoles) {
  718. c.SetInvalidParam("team_member_roles")
  719. return
  720. }
  721. auditRec := c.MakeAuditRecord("updateTeamMemberRoles", audit.Fail)
  722. defer c.LogAuditRec(auditRec)
  723. auditRec.AddMeta("roles", newRoles)
  724. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM_ROLES) {
  725. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM_ROLES)
  726. return
  727. }
  728. teamMember, err := c.App.UpdateTeamMemberRoles(c.Params.TeamId, c.Params.UserId, newRoles)
  729. if err != nil {
  730. c.Err = err
  731. return
  732. }
  733. auditRec.Success()
  734. auditRec.AddMeta("member", teamMember)
  735. ReturnStatusOK(w)
  736. }
  737. func updateTeamMemberSchemeRoles(c *Context, w http.ResponseWriter, r *http.Request) {
  738. c.RequireTeamId().RequireUserId()
  739. if c.Err != nil {
  740. return
  741. }
  742. schemeRoles := model.SchemeRolesFromJson(r.Body)
  743. if schemeRoles == nil {
  744. c.SetInvalidParam("scheme_roles")
  745. return
  746. }
  747. auditRec := c.MakeAuditRecord("updateTeamMemberSchemeRoles", audit.Fail)
  748. defer c.LogAuditRec(auditRec)
  749. auditRec.AddMeta("roles", schemeRoles)
  750. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM_ROLES) {
  751. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM_ROLES)
  752. return
  753. }
  754. teamMember, err := c.App.UpdateTeamMemberSchemeRoles(c.Params.TeamId, c.Params.UserId, schemeRoles.SchemeGuest, schemeRoles.SchemeUser, schemeRoles.SchemeAdmin)
  755. if err != nil {
  756. c.Err = err
  757. return
  758. }
  759. auditRec.Success()
  760. auditRec.AddMeta("member", teamMember)
  761. ReturnStatusOK(w)
  762. }
  763. func getAllTeams(c *Context, w http.ResponseWriter, r *http.Request) {
  764. teams := []*model.Team{}
  765. var err *model.AppError
  766. var teamsWithCount *model.TeamsWithCount
  767. listPrivate := c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PRIVATE_TEAMS)
  768. listPublic := c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PUBLIC_TEAMS)
  769. if listPrivate && listPublic {
  770. if c.Params.IncludeTotalCount {
  771. teamsWithCount, err = c.App.GetAllTeamsPageWithCount(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
  772. } else {
  773. teams, err = c.App.GetAllTeamsPage(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
  774. }
  775. } else if listPrivate {
  776. if c.Params.IncludeTotalCount {
  777. teamsWithCount, err = c.App.GetAllPrivateTeamsPageWithCount(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
  778. } else {
  779. teams, err = c.App.GetAllPrivateTeamsPage(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
  780. }
  781. } else if listPublic {
  782. if c.Params.IncludeTotalCount {
  783. teamsWithCount, err = c.App.GetAllPublicTeamsPageWithCount(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
  784. } else {
  785. teams, err = c.App.GetAllPublicTeamsPage(c.Params.Page*c.Params.PerPage, c.Params.PerPage)
  786. }
  787. } else {
  788. // The user doesn't have permissions to list private as well as public teams.
  789. err = model.NewAppError("getAllTeams", "api.team.get_all_teams.insufficient_permissions", nil, "", http.StatusForbidden)
  790. }
  791. if err != nil {
  792. c.Err = err
  793. return
  794. }
  795. c.App.SanitizeTeams(*c.App.Session(), teams)
  796. var resBody []byte
  797. if c.Params.IncludeTotalCount {
  798. resBody = model.TeamsWithCountToJson(teamsWithCount)
  799. } else {
  800. resBody = []byte(model.TeamListToJson(teams))
  801. }
  802. w.Write(resBody)
  803. }
  804. func searchTeams(c *Context, w http.ResponseWriter, r *http.Request) {
  805. props := model.TeamSearchFromJson(r.Body)
  806. if props == nil {
  807. c.SetInvalidParam("team_search")
  808. return
  809. }
  810. var teams []*model.Team
  811. var totalCount int64
  812. var err *model.AppError
  813. if c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PRIVATE_TEAMS) && c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PUBLIC_TEAMS) {
  814. teams, totalCount, err = c.App.SearchAllTeams(props)
  815. } else if c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PRIVATE_TEAMS) {
  816. if props.Page != nil || props.PerPage != nil {
  817. c.Err = model.NewAppError("searchTeams", "api.team.search_teams.pagination_not_implemented.private_team_search", nil, "", http.StatusNotImplemented)
  818. return
  819. }
  820. teams, err = c.App.SearchPrivateTeams(props.Term)
  821. } else if c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PUBLIC_TEAMS) {
  822. if props.Page != nil || props.PerPage != nil {
  823. c.Err = model.NewAppError("searchTeams", "api.team.search_teams.pagination_not_implemented.public_team_search", nil, "", http.StatusNotImplemented)
  824. return
  825. }
  826. teams, err = c.App.SearchPublicTeams(props.Term)
  827. } else {
  828. teams = []*model.Team{}
  829. }
  830. if err != nil {
  831. c.Err = err
  832. return
  833. }
  834. c.App.SanitizeTeams(*c.App.Session(), teams)
  835. var payload []byte
  836. if props.Page != nil && props.PerPage != nil {
  837. twc := &model.TeamsWithCount{Teams: teams, TotalCount: totalCount}
  838. payload = model.TeamsWithCountToJson(twc)
  839. } else {
  840. payload = []byte(model.TeamListToJson(teams))
  841. }
  842. w.Write(payload)
  843. }
  844. func teamExists(c *Context, w http.ResponseWriter, r *http.Request) {
  845. c.RequireTeamName()
  846. if c.Err != nil {
  847. return
  848. }
  849. team, err := c.App.GetTeamByName(c.Params.TeamName)
  850. if err != nil && err.StatusCode != http.StatusNotFound {
  851. c.Err = err
  852. return
  853. }
  854. exists := false
  855. if team != nil {
  856. var teamMember *model.TeamMember
  857. teamMember, err = c.App.GetTeamMember(team.Id, c.App.Session().UserId)
  858. if err != nil && err.StatusCode != http.StatusNotFound {
  859. c.Err = err
  860. return
  861. }
  862. // Verify that the user can see the team (be a member or have the permission to list the team)
  863. if (teamMember != nil && teamMember.DeleteAt == 0) ||
  864. (team.AllowOpenInvite && c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PUBLIC_TEAMS)) ||
  865. (!team.AllowOpenInvite && c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_LIST_PRIVATE_TEAMS)) {
  866. exists = true
  867. }
  868. }
  869. resp := map[string]bool{"exists": exists}
  870. w.Write([]byte(model.MapBoolToJson(resp)))
  871. }
  872. func importTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  873. c.RequireTeamId()
  874. if c.Err != nil {
  875. return
  876. }
  877. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_IMPORT_TEAM) {
  878. c.SetPermissionError(model.PERMISSION_IMPORT_TEAM)
  879. return
  880. }
  881. if err := r.ParseMultipartForm(MAXIMUM_BULK_IMPORT_SIZE); err != nil {
  882. c.Err = model.NewAppError("importTeam", "api.team.import_team.parse.app_error", nil, err.Error(), http.StatusInternalServerError)
  883. return
  884. }
  885. importFromArray, ok := r.MultipartForm.Value["importFrom"]
  886. if !ok || len(importFromArray) < 1 {
  887. c.Err = model.NewAppError("importTeam", "api.team.import_team.no_import_from.app_error", nil, "", http.StatusBadRequest)
  888. return
  889. }
  890. importFrom := importFromArray[0]
  891. fileSizeStr, ok := r.MultipartForm.Value["filesize"]
  892. if !ok || len(fileSizeStr) < 1 {
  893. c.Err = model.NewAppError("importTeam", "api.team.import_team.unavailable.app_error", nil, "", http.StatusBadRequest)
  894. return
  895. }
  896. fileSize, err := strconv.ParseInt(fileSizeStr[0], 10, 64)
  897. if err != nil {
  898. c.Err = model.NewAppError("importTeam", "api.team.import_team.integer.app_error", nil, "", http.StatusBadRequest)
  899. return
  900. }
  901. fileInfoArray, ok := r.MultipartForm.File["file"]
  902. if !ok {
  903. c.Err = model.NewAppError("importTeam", "api.team.import_team.no_file.app_error", nil, "", http.StatusBadRequest)
  904. return
  905. }
  906. if len(fileInfoArray) <= 0 {
  907. c.Err = model.NewAppError("importTeam", "api.team.import_team.array.app_error", nil, "", http.StatusBadRequest)
  908. return
  909. }
  910. auditRec := c.MakeAuditRecord("importTeam", audit.Fail)
  911. defer c.LogAuditRec(auditRec)
  912. auditRec.AddMeta("team_id", c.Params.TeamId)
  913. fileInfo := fileInfoArray[0]
  914. fileData, err := fileInfo.Open()
  915. if err != nil {
  916. c.Err = model.NewAppError("importTeam", "api.team.import_team.open.app_error", nil, err.Error(), http.StatusBadRequest)
  917. return
  918. }
  919. defer fileData.Close()
  920. auditRec.AddMeta("filename", fileInfo.Filename)
  921. auditRec.AddMeta("filesize", fileSize)
  922. auditRec.AddMeta("from", importFrom)
  923. var log *bytes.Buffer
  924. data := map[string]string{}
  925. switch importFrom {
  926. case "slack":
  927. var err *model.AppError
  928. if err, log = c.App.SlackImport(fileData, fileSize, c.Params.TeamId); err != nil {
  929. c.Err = err
  930. c.Err.StatusCode = http.StatusBadRequest
  931. }
  932. data["results"] = base64.StdEncoding.EncodeToString(log.Bytes())
  933. default:
  934. c.Err = model.NewAppError("importTeam", "api.team.import_team.unknown_import_from.app_error", nil, "", http.StatusBadRequest)
  935. }
  936. if c.Err != nil {
  937. w.WriteHeader(c.Err.StatusCode)
  938. return
  939. }
  940. auditRec.Success()
  941. w.Write([]byte(model.MapToJson(data)))
  942. }
  943. func inviteUsersToTeam(c *Context, w http.ResponseWriter, r *http.Request) {
  944. graceful := r.URL.Query().Get("graceful") != ""
  945. c.RequireTeamId()
  946. if c.Err != nil {
  947. return
  948. }
  949. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_INVITE_USER) {
  950. c.SetPermissionError(model.PERMISSION_INVITE_USER)
  951. return
  952. }
  953. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_ADD_USER_TO_TEAM) {
  954. c.SetPermissionError(model.PERMISSION_INVITE_USER)
  955. return
  956. }
  957. emailList := model.ArrayFromJson(r.Body)
  958. for i := range emailList {
  959. emailList[i] = strings.ToLower(emailList[i])
  960. }
  961. if len(emailList) == 0 {
  962. c.SetInvalidParam("user_email")
  963. return
  964. }
  965. auditRec := c.MakeAuditRecord("inviteUsersToTeam", audit.Fail)
  966. defer c.LogAuditRec(auditRec)
  967. auditRec.AddMeta("team_id", c.Params.TeamId)
  968. auditRec.AddMeta("count", len(emailList))
  969. auditRec.AddMeta("emails", emailList)
  970. if graceful {
  971. invitesWithError, err := c.App.InviteNewUsersToTeamGracefully(emailList, c.Params.TeamId, c.App.Session().UserId)
  972. if invitesWithError != nil {
  973. errList := make([]string, 0, len(invitesWithError))
  974. for _, inv := range invitesWithError {
  975. if inv.Error != nil {
  976. errList = append(errList, model.EmailInviteWithErrorToString(inv))
  977. }
  978. }
  979. auditRec.AddMeta("errors", errList)
  980. }
  981. if err != nil {
  982. c.Err = err
  983. return
  984. }
  985. // in graceful mode we return both the successful ones and the failed ones
  986. w.Write([]byte(model.EmailInviteWithErrorToJson(invitesWithError)))
  987. } else {
  988. err := c.App.InviteNewUsersToTeam(emailList, c.Params.TeamId, c.App.Session().UserId)
  989. if err != nil {
  990. c.Err = err
  991. return
  992. }
  993. ReturnStatusOK(w)
  994. }
  995. auditRec.Success()
  996. }
  997. func inviteGuestsToChannels(c *Context, w http.ResponseWriter, r *http.Request) {
  998. graceful := r.URL.Query().Get("graceful") != ""
  999. if c.App.Srv().License() == nil {
  1000. c.Err = model.NewAppError("Api4.InviteGuestsToChannels", "api.team.invate_guests_to_channels.license.error", nil, "", http.StatusNotImplemented)
  1001. return
  1002. }
  1003. if !*c.App.Config().GuestAccountsSettings.Enable {
  1004. c.Err = model.NewAppError("Api4.InviteGuestsToChannels", "api.team.invate_guests_to_channels.disabled.error", nil, "", http.StatusNotImplemented)
  1005. return
  1006. }
  1007. c.RequireTeamId()
  1008. if c.Err != nil {
  1009. return
  1010. }
  1011. auditRec := c.MakeAuditRecord("inviteGuestsToChannels", audit.Fail)
  1012. defer c.LogAuditRec(auditRec)
  1013. auditRec.AddMeta("team_id", c.Params.TeamId)
  1014. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_INVITE_GUEST) {
  1015. c.SetPermissionError(model.PERMISSION_INVITE_GUEST)
  1016. return
  1017. }
  1018. guestsInvite := model.GuestsInviteFromJson(r.Body)
  1019. for i, email := range guestsInvite.Emails {
  1020. guestsInvite.Emails[i] = strings.ToLower(email)
  1021. }
  1022. if err := guestsInvite.IsValid(); err != nil {
  1023. c.Err = err
  1024. return
  1025. }
  1026. auditRec.AddMeta("email_count", len(guestsInvite.Emails))
  1027. auditRec.AddMeta("emails", guestsInvite.Emails)
  1028. auditRec.AddMeta("channel_count", len(guestsInvite.Channels))
  1029. auditRec.AddMeta("channels", guestsInvite.Channels)
  1030. if graceful {
  1031. invitesWithError, err := c.App.InviteGuestsToChannelsGracefully(c.Params.TeamId, guestsInvite, c.App.Session().UserId)
  1032. if err != nil {
  1033. errList := make([]string, 0, len(invitesWithError))
  1034. for _, inv := range invitesWithError {
  1035. errList = append(errList, model.EmailInviteWithErrorToString(inv))
  1036. }
  1037. auditRec.AddMeta("errors", errList)
  1038. c.Err = err
  1039. return
  1040. }
  1041. // in graceful mode we return both the successful ones and the failed ones
  1042. w.Write([]byte(model.EmailInviteWithErrorToJson(invitesWithError)))
  1043. } else {
  1044. err := c.App.InviteGuestsToChannels(c.Params.TeamId, guestsInvite, c.App.Session().UserId)
  1045. if err != nil {
  1046. c.Err = err
  1047. return
  1048. }
  1049. ReturnStatusOK(w)
  1050. }
  1051. auditRec.Success()
  1052. }
  1053. func getInviteInfo(c *Context, w http.ResponseWriter, r *http.Request) {
  1054. c.RequireInviteId()
  1055. if c.Err != nil {
  1056. return
  1057. }
  1058. team, err := c.App.GetTeamByInviteId(c.Params.InviteId)
  1059. if err != nil {
  1060. c.Err = err
  1061. return
  1062. }
  1063. if team.Type != model.TEAM_OPEN {
  1064. c.Err = model.NewAppError("getInviteInfo", "api.team.get_invite_info.not_open_team", nil, "id="+c.Params.InviteId, http.StatusForbidden)
  1065. return
  1066. }
  1067. result := map[string]string{}
  1068. result["display_name"] = team.DisplayName
  1069. result["description"] = team.Description
  1070. result["name"] = team.Name
  1071. result["id"] = team.Id
  1072. w.Write([]byte(model.MapToJson(result)))
  1073. }
  1074. func invalidateAllEmailInvites(c *Context, w http.ResponseWriter, r *http.Request) {
  1075. if !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_SYSTEM) {
  1076. c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  1077. return
  1078. }
  1079. auditRec := c.MakeAuditRecord("invalidateAllEmailInvites", audit.Fail)
  1080. defer c.LogAuditRec(auditRec)
  1081. if err := c.App.InvalidateAllEmailInvites(); err != nil {
  1082. c.Err = err
  1083. return
  1084. }
  1085. auditRec.Success()
  1086. ReturnStatusOK(w)
  1087. }
  1088. func getTeamIcon(c *Context, w http.ResponseWriter, r *http.Request) {
  1089. c.RequireTeamId()
  1090. if c.Err != nil {
  1091. return
  1092. }
  1093. team, err := c.App.GetTeam(c.Params.TeamId)
  1094. if err != nil {
  1095. c.Err = err
  1096. return
  1097. }
  1098. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_VIEW_TEAM) &&
  1099. (team.Type != model.TEAM_OPEN || !team.AllowOpenInvite) {
  1100. c.SetPermissionError(model.PERMISSION_VIEW_TEAM)
  1101. return
  1102. }
  1103. etag := strconv.FormatInt(team.LastTeamIconUpdate, 10)
  1104. if c.HandleEtag(etag, "Get Team Icon", w, r) {
  1105. return
  1106. }
  1107. img, err := c.App.GetTeamIcon(team)
  1108. if err != nil {
  1109. c.Err = err
  1110. return
  1111. }
  1112. w.Header().Set("Content-Type", "image/png")
  1113. w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%v, public", 24*60*60)) // 24 hrs
  1114. w.Header().Set(model.HEADER_ETAG_SERVER, etag)
  1115. w.Write(img)
  1116. }
  1117. func setTeamIcon(c *Context, w http.ResponseWriter, r *http.Request) {
  1118. defer io.Copy(ioutil.Discard, r.Body)
  1119. c.RequireTeamId()
  1120. if c.Err != nil {
  1121. return
  1122. }
  1123. auditRec := c.MakeAuditRecord("setTeamIcon", audit.Fail)
  1124. defer c.LogAuditRec(auditRec)
  1125. auditRec.AddMeta("team_id", c.Params.TeamId)
  1126. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  1127. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  1128. return
  1129. }
  1130. if r.ContentLength > *c.App.Config().FileSettings.MaxFileSize {
  1131. c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.too_large.app_error", nil, "", http.StatusBadRequest)
  1132. return
  1133. }
  1134. if err := r.ParseMultipartForm(*c.App.Config().FileSettings.MaxFileSize); err != nil {
  1135. c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.parse.app_error", nil, err.Error(), http.StatusBadRequest)
  1136. return
  1137. }
  1138. m := r.MultipartForm
  1139. imageArray, ok := m.File["image"]
  1140. if !ok {
  1141. c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.no_file.app_error", nil, "", http.StatusBadRequest)
  1142. return
  1143. }
  1144. if len(imageArray) <= 0 {
  1145. c.Err = model.NewAppError("setTeamIcon", "api.team.set_team_icon.array.app_error", nil, "", http.StatusBadRequest)
  1146. return
  1147. }
  1148. imageData := imageArray[0]
  1149. if err := c.App.SetTeamIcon(c.Params.TeamId, imageData); err != nil {
  1150. c.Err = err
  1151. return
  1152. }
  1153. auditRec.Success()
  1154. c.LogAudit("")
  1155. ReturnStatusOK(w)
  1156. }
  1157. func removeTeamIcon(c *Context, w http.ResponseWriter, r *http.Request) {
  1158. c.RequireTeamId()
  1159. if c.Err != nil {
  1160. return
  1161. }
  1162. auditRec := c.MakeAuditRecord("removeTeamIcon", audit.Fail)
  1163. defer c.LogAuditRec(auditRec)
  1164. auditRec.AddMeta("team_id", c.Params.TeamId)
  1165. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_TEAM) {
  1166. c.SetPermissionError(model.PERMISSION_MANAGE_TEAM)
  1167. return
  1168. }
  1169. if err := c.App.RemoveTeamIcon(c.Params.TeamId); err != nil {
  1170. c.Err = err
  1171. return
  1172. }
  1173. auditRec.Success()
  1174. c.LogAudit("")
  1175. ReturnStatusOK(w)
  1176. }
  1177. func updateTeamScheme(c *Context, w http.ResponseWriter, r *http.Request) {
  1178. c.RequireTeamId()
  1179. if c.Err != nil {
  1180. return
  1181. }
  1182. schemeID := model.SchemeIDFromJson(r.Body)
  1183. if schemeID == nil || (!model.IsValidId(*schemeID) && *schemeID != "") {
  1184. c.SetInvalidParam("scheme_id")
  1185. return
  1186. }
  1187. auditRec := c.MakeAuditRecord("updateTeamScheme", audit.Fail)
  1188. defer c.LogAuditRec(auditRec)
  1189. if c.App.Srv().License() == nil {
  1190. c.Err = model.NewAppError("Api4.UpdateTeamScheme", "api.team.update_team_scheme.license.error", nil, "", http.StatusNotImplemented)
  1191. return
  1192. }
  1193. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), c.Params.TeamId, model.PERMISSION_MANAGE_SYSTEM) {
  1194. c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  1195. return
  1196. }
  1197. if *schemeID != "" {
  1198. scheme, err := c.App.GetScheme(*schemeID)
  1199. if err != nil {
  1200. c.Err = err
  1201. return
  1202. }
  1203. auditRec.AddMeta("scheme", scheme)
  1204. if scheme.Scope != model.SCHEME_SCOPE_TEAM {
  1205. c.Err = model.NewAppError("Api4.UpdateTeamScheme", "api.team.update_team_scheme.scheme_scope.error", nil, "", http.StatusBadRequest)
  1206. return
  1207. }
  1208. }
  1209. team, err := c.App.GetTeam(c.Params.TeamId)
  1210. if err != nil {
  1211. c.Err = err
  1212. return
  1213. }
  1214. auditRec.AddMeta("team", team)
  1215. team.SchemeId = schemeID
  1216. _, err = c.App.UpdateTeamScheme(team)
  1217. if err != nil {
  1218. c.Err = err
  1219. return
  1220. }
  1221. auditRec.Success()
  1222. ReturnStatusOK(w)
  1223. }
  1224. func teamMembersMinusGroupMembers(c *Context, w http.ResponseWriter, r *http.Request) {
  1225. c.RequireTeamId()
  1226. if c.Err != nil {
  1227. return
  1228. }
  1229. groupIDsParam := groupIDsQueryParamRegex.ReplaceAllString(c.Params.GroupIDs, "")
  1230. if len(groupIDsParam) < 26 {
  1231. c.SetInvalidParam("group_ids")
  1232. return
  1233. }
  1234. groupIDs := []string{}
  1235. for _, gid := range strings.Split(c.Params.GroupIDs, ",") {
  1236. if !model.IsValidId(gid) {
  1237. c.SetInvalidParam("group_ids")
  1238. return
  1239. }
  1240. groupIDs = append(groupIDs, gid)
  1241. }
  1242. if !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_SYSTEM) {
  1243. c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
  1244. return
  1245. }
  1246. users, totalCount, err := c.App.TeamMembersMinusGroupMembers(
  1247. c.Params.TeamId,
  1248. groupIDs,
  1249. c.Params.Page,
  1250. c.Params.PerPage,
  1251. )
  1252. if err != nil {
  1253. c.Err = err
  1254. return
  1255. }
  1256. b, marshalErr := json.Marshal(&model.UsersWithGroupsAndCount{
  1257. Users: users,
  1258. Count: totalCount,
  1259. })
  1260. if marshalErr != nil {
  1261. c.Err = model.NewAppError("Api4.teamMembersMinusGroupMembers", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError)
  1262. return
  1263. }
  1264. w.Write(b)
  1265. }