func Collaboration(ctx *middleware.Context) { repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/") ctx.Data["IsRepoToolbarCollaboration"] = true ctx.Data["Title"] = repoLink + " - collaboration" // Delete collaborator. remove := strings.ToLower(ctx.Query("remove")) if len(remove) > 0 && remove != ctx.Repo.Owner.LowerName { if err := models.DeleteAccess(&models.Access{UserName: remove, RepoName: repoLink}); err != nil { ctx.Handle(500, "setting.Collaboration(DeleteAccess)", err) return } ctx.Flash.Success("Collaborator has been removed.") ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") return } names, err := models.GetCollaboratorNames(repoLink) if err != nil { ctx.Handle(500, "setting.Collaboration(GetCollaborators)", err) return } us := make([]*models.User, len(names)) for i, name := range names { us[i], err = models.GetUserByName(name) if err != nil { ctx.Handle(500, "setting.Collaboration(GetUserByName)", err) return } } ctx.Data["Collaborators"] = us ctx.HTML(200, "repo/collaboration") }
func SettingsCollaboration(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.settings") ctx.Data["PageIsSettingsCollaboration"] = true repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/") if ctx.Req.Method == "POST" { name := strings.ToLower(ctx.Query("collaborator")) if len(name) == 0 || ctx.Repo.Owner.LowerName == name { ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) return } has, err := models.HasAccess(name, repoLink, models.WRITABLE) if err != nil { ctx.Handle(500, "HasAccess", err) return } else if has { ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) return } u, err := models.GetUserByName(name) if err != nil { if err == models.ErrUserNotExist { ctx.Flash.Error(ctx.Tr("form.user_not_exist")) ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) } else { ctx.Handle(500, "GetUserByName", err) } return } // Check if user is organization member. if ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgMember(u.Id) { ctx.Flash.Info(ctx.Tr("repo.settings.user_is_org_member")) ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") return } if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink, Mode: models.WRITABLE}); err != nil { ctx.Handle(500, "AddAccess", err) return } if setting.Service.EnableNotifyMail { if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil { ctx.Handle(500, "SendCollaboratorMail", err) return } } ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success")) ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) return } // Delete collaborator. remove := strings.ToLower(ctx.Query("remove")) if len(remove) > 0 && remove != ctx.Repo.Owner.LowerName { needDelete := true if ctx.User.IsOrganization() { // Check if user belongs to a team that has access to this repository. auth, err := models.GetHighestAuthorize(ctx.Repo.Owner.Id, ctx.User.Id, ctx.Repo.Repository.Id, 0) if err != nil { ctx.Handle(500, "GetHighestAuthorize", err) return } if auth > 0 { needDelete = false } } if needDelete { if err := models.DeleteAccess(&models.Access{UserName: remove, RepoName: repoLink}); err != nil { ctx.Handle(500, "DeleteAccess", err) return } } ctx.Flash.Success(ctx.Tr("repo.settings.remove_collaborator_success")) ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") return } names, err := models.GetCollaboratorNames(repoLink) if err != nil { ctx.Handle(500, "GetCollaborators", err) return } collaborators := make([]*models.User, 0, len(names)) for _, name := range names { u, err := models.GetUserByName(name) if err != nil { ctx.Handle(500, "GetUserByName", err) return } // Does not show organization members. if ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgMember(u.Id) { continue } collaborators = append(collaborators, u) } ctx.Data["Collaborators"] = collaborators ctx.HTML(200, COLLABORATION) }