Introduce new [moderation] ENABLED config (default false).

When defined within app.ini and the value is true, it will be possible to report abusive content.
This commit is contained in:
floss4good 2025-03-09 22:57:47 +02:00
parent 24c8d105f1
commit 3afae67e11
No known key found for this signature in database
GPG key ID: 5B948B4F4DAF819D
14 changed files with 42 additions and 5 deletions

View file

@ -0,0 +1,15 @@
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package setting
// Moderation settings
var Moderation = struct {
Enabled bool `ini:"ENABLED"`
}{
Enabled: false,
}
func loadModerationFrom(rootCfg ConfigProvider) {
mustMapSetting(rootCfg, "moderation", &Moderation)
}

View file

@ -227,6 +227,7 @@ func LoadSettings() {
loadProjectFrom(CfgProvider)
loadMimeTypeMapFrom(CfgProvider)
loadF3From(CfgProvider)
loadModerationFrom(CfgProvider)
}
// LoadSettingsForInstall initializes the settings for install

View file

@ -3484,6 +3484,8 @@ config.access_log_mode = Access log mode
config.access_log_template = Access log template
config.xorm_log_sql = Log SQL
config.moderation_config = Moderation configuration
config.set_setting_failed = Set setting %s failed
monitor.stats = Stats

View file

@ -145,6 +145,7 @@ func Config(ctx *context.Context) {
ctx.Data["Service"] = setting.Service
ctx.Data["DbCfg"] = setting.Database
ctx.Data["Webhook"] = setting.Webhook
ctx.Data["Moderation"] = setting.Moderation
ctx.Data["MailerEnabled"] = false
if setting.MailService != nil {

View file

@ -1475,6 +1475,7 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["IssueType"] = "all"
}
ctx.Data["IsModerationEnabled"] = setting.Moderation.Enabled
ctx.Data["IsProjectsEnabled"] = ctx.Repo.CanRead(unit.TypeProjects)
ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled
upload.AddUploadContext(ctx, "comment")

View file

@ -38,6 +38,7 @@ func prepareContextForCommonProfile(ctx *context.Context) {
func PrepareContextForProfileBigAvatar(ctx *context.Context) {
prepareContextForCommonProfile(ctx)
ctx.Data["IsModerationEnabled"] = setting.Moderation.Enabled
ctx.Data["IsBlocked"] = ctx.Doer != nil && user_model.IsBlocked(ctx, ctx.Doer.ID, ctx.ContextUser.ID)
ctx.Data["IsFollowing"] = ctx.Doer != nil && user_model.IsFollowing(ctx, ctx.Doer.ID, ctx.ContextUser.ID)
ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate

View file

@ -481,8 +481,10 @@ func registerRoutes(m *web.Route) {
m.Get("/search", repo.SearchIssues)
}, reqSignIn)
m.Get("/-/abuse_reports/new", reqSignIn, moderation.NewReport)
m.Post("/-/abuse_reports/new", reqSignIn, web.Bind(forms.ReportAbuseForm{}), moderation.CreatePost)
if setting.Moderation.Enabled {
m.Get("/-/abuse_reports/new", reqSignIn, moderation.NewReport)
m.Post("/-/abuse_reports/new", reqSignIn, web.Bind(forms.ReportAbuseForm{}), moderation.CreatePost)
}
m.Get("/pulls", reqSignIn, user.Pulls)
m.Get("/milestones", reqSignIn, reqMilestonesDashboardPageEnabled, user.Milestones)

View file

@ -165,6 +165,7 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
ctx.Data["IsModerationEnabled"] = setting.Moderation.Enabled
ctx.Data["IsPublicMember"] = func(uid int64) bool {
is, _ := organization.IsPublicMembership(ctx, ctx.Org.Organization.ID, uid)
return is

View file

@ -591,6 +591,7 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
ctx.Data["CanWriteIssues"] = ctx.Repo.CanWrite(unit_model.TypeIssues)
ctx.Data["CanWritePulls"] = ctx.Repo.CanWrite(unit_model.TypePullRequests)
ctx.Data["CanWriteActions"] = ctx.Repo.CanWrite(unit_model.TypeActions)
ctx.Data["IsModerationEnabled"] = setting.Moderation.Enabled
canSignedUserFork, err := repo_module.CanUserForkRepo(ctx, ctx.Doer, ctx.Repo.Repository)
if err != nil {

View file

@ -247,6 +247,16 @@
</dl>
</div>
<h4 class="ui top attached header">
{{ctx.Locale.Tr "admin.config.moderation_config"}}
</h4>
<div class="ui attached table segment">
<dl class="admin-dl-horizontal">
<dt>{{ctx.Locale.Tr "enabled"}}</dt>
<dd>{{if .Moderation.Enabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}</dd>
</dl>
</div>
<h4 class="ui top attached header">
{{ctx.Locale.Tr "admin.config.cache_config"}}
</h4>

View file

@ -21,7 +21,7 @@
{{if .IsOrganizationMember}}
<a class="ui basic button tw-mr-0" href="{{.OrgLink}}/dashboard">{{ctx.Locale.Tr "org.open_dashboard"}}</a>
{{end}}
{{if and .IsSigned (not .IsOrganizationOwner)}}
{{if and .IsModerationEnabled .IsSigned (not .IsOrganizationOwner)}}
<button class="ui dropdown icon button" data-tooltip-content="{{ctx.Locale.Tr "repo.more_operations"}}" aria-label="{{ctx.Locale.Tr "toggle_menu"}}">
{{svg "octicon-kebab-horizontal" 14}}
<div class="menu top left">

View file

@ -67,7 +67,7 @@
{{if not $.DisableForks}}
{{template "repo/header_fork" $}}
{{end}}
{{if and $.IsSigned (not $.IsRepositoryAdmin)}}
{{if and $.IsModerationEnabled $.IsSigned (not $.IsRepositoryAdmin)}}
<button class="ui small compact jump dropdown icon button" data-tooltip-content="{{ctx.Locale.Tr "repo.more_operations"}}" aria-label="{{ctx.Locale.Tr "toggle_menu"}}">
{{svg "octicon-kebab-horizontal"}}
<div class="menu top left">

View file

@ -23,7 +23,7 @@
{{end}}
{{end}}
{{end}}
{{if and .ctxData.IsSigned (not .IsCommentPoster)}}
{{if and .ctxData.IsModerationEnabled .ctxData.IsSigned (not .IsCommentPoster)}}
{{$contentType := "comment"}}
{{if eq .item .ctxData.Issue}}
{{if .ctxData.Issue.IsPull}} {{$contentType = "pull"}} {{else}} {{$contentType = "issue"}} {{end}}

View file

@ -123,10 +123,12 @@
</button>
{{end}}
</li>
{{if .IsModerationEnabled}}
<li class="block" hx-target="#profile-avatar-card" hx-indicator="#profile-avatar-card">
<a class="ui basic orange button" href="/-/abuse_reports/new?type=user&id={{.ContextUser.ID}}">{{ctx.Locale.Tr "moderation.report_abuse"}}</a>
</li>
{{end}}
{{end}}
</ul>
</div>
</div>