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 }