mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix #857
This commit is contained in:
		@@ -398,7 +398,7 @@ func runWeb(ctx *cli.Context) {
 | 
			
		||||
		m.Group("/settings", func() {
 | 
			
		||||
			m.Combo("").Get(repo.Settings).
 | 
			
		||||
				Post(bindIgnErr(auth.RepoSettingForm{}), repo.SettingsPost)
 | 
			
		||||
			m.Route("/collaboration", "GET,POST", repo.Collaboration)
 | 
			
		||||
			m.Combo("/collaboration").Get(repo.Collaboration).Post(repo.CollaborationPost)
 | 
			
		||||
 | 
			
		||||
			m.Group("/hooks", func() {
 | 
			
		||||
				m.Get("", repo.Webhooks)
 | 
			
		||||
 
 | 
			
		||||
@@ -612,6 +612,7 @@ settings.add_collaborator = Add New Collaborator
 | 
			
		||||
settings.add_collaborator_success = New collaborator has been added.
 | 
			
		||||
settings.remove_collaborator_success = Collaborator has been removed.
 | 
			
		||||
settings.search_user_placeholder = Search user...
 | 
			
		||||
settings.org_not_allowed_to_be_collaborator = Organization is not allowed to be added as a collaborator.
 | 
			
		||||
settings.user_is_org_member = User is organization member who cannot be added as a collaborator.
 | 
			
		||||
settings.add_webhook = Add Webhook
 | 
			
		||||
settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gogs, we will handle the notification to the target host you specify. Learn more in this <a target="_blank" href="%s">Webhooks Guide</a>.
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -233,48 +233,6 @@ func Collaboration(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["Title"] = ctx.Tr("repo.settings")
 | 
			
		||||
	ctx.Data["PageIsSettingsCollaboration"] = true
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		u, err := models.GetUserByName(name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if models.IsErrUserNotExist(err) {
 | 
			
		||||
				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 = ctx.Repo.Repository.AddCollaborator(u); err != nil {
 | 
			
		||||
			ctx.Handle(500, "AddCollaborator", 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 {
 | 
			
		||||
@@ -302,6 +260,54 @@ func Collaboration(ctx *middleware.Context) {
 | 
			
		||||
	ctx.HTML(200, COLLABORATION)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CollaborationPost(ctx *middleware.Context) {
 | 
			
		||||
	name := strings.ToLower(ctx.Query("collaborator"))
 | 
			
		||||
	if len(name) == 0 || ctx.Repo.Owner.LowerName == name {
 | 
			
		||||
		ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u, err := models.GetUserByName(name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrUserNotExist(err) {
 | 
			
		||||
			ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
 | 
			
		||||
			ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Handle(500, "GetUserByName", err)
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Organization is not allowed to be added as a collaborator.
 | 
			
		||||
	if u.IsOrganization() {
 | 
			
		||||
		ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator"))
 | 
			
		||||
		ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
 | 
			
		||||
		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 = ctx.Repo.Repository.AddCollaborator(u); err != nil {
 | 
			
		||||
		ctx.Handle(500, "AddCollaborator", 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)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseOwnerAndRepo(ctx *middleware.Context) (*models.User, *models.Repository) {
 | 
			
		||||
	owner, err := models.GetUserByName(ctx.Params(":username"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
						<div class="inline field ui left">
 | 
			
		||||
							<div id="search-user-box">
 | 
			
		||||
								<div class="ui input">
 | 
			
		||||
									<input class="prompt" name="collaborator" placeholder="{{.i18n.Tr "repo.settings.search_user_placeholder"}}" autocomplete="off" required>
 | 
			
		||||
									<input class="prompt" name="collaborator" placeholder="{{.i18n.Tr "repo.settings.search_user_placeholder"}}" autocomplete="off" autofocus required>
 | 
			
		||||
								</div>
 | 
			
		||||
								<div class="ui segment results hide"></div>
 | 
			
		||||
							</div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user