Skip to content

Commit 57771b2

Browse files
Merge branch 'main' into admin-ip-info
2 parents 2087b53 + 4dca869 commit 57771b2

File tree

20 files changed

+400
-314
lines changed

20 files changed

+400
-314
lines changed

models/fixtures/webhook.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
-
22
id: 1
33
repo_id: 1
4-
url: www.example.com/url1
4+
url: https://www.example.com/url1
55
content_type: 1 # json
66
events: '{"push_only":true,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":false}}'
77
is_active: true
88

99
-
1010
id: 2
1111
repo_id: 1
12-
url: www.example.com/url2
12+
url: https://www.example.com/url2
1313
content_type: 1 # json
1414
events: '{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}'
1515
is_active: false
@@ -18,15 +18,15 @@
1818
id: 3
1919
owner_id: 3
2020
repo_id: 3
21-
url: www.example.com/url3
21+
url: https://www.example.com/url3
2222
content_type: 1 # json
2323
events: '{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}'
2424
is_active: true
2525

2626
-
2727
id: 4
2828
repo_id: 2
29-
url: www.example.com/url4
29+
url: https://www.example.com/url4
3030
content_type: 1 # json
3131
events: '{"push_only":true,"branch_filter":"{master,feature*}"}'
3232
is_active: true
@@ -35,7 +35,7 @@
3535
id: 5
3636
repo_id: 0
3737
owner_id: 0
38-
url: www.example.com/url5
38+
url: https://www.example.com/url5
3939
content_type: 1 # json
4040
events: '{"push_only":true,"branch_filter":"{master,feature*}"}'
4141
is_active: true
@@ -45,7 +45,7 @@
4545
id: 6
4646
repo_id: 0
4747
owner_id: 0
48-
url: www.example.com/url6
48+
url: https://www.example.com/url6
4949
content_type: 1 # json
5050
events: '{"push_only":true,"branch_filter":"{master,feature*}"}'
5151
is_active: true

models/webhook/webhook_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestWebhook_EventsArray(t *testing.T) {
9090
func TestCreateWebhook(t *testing.T) {
9191
hook := &Webhook{
9292
RepoID: 3,
93-
URL: "www.example.com/unit_test",
93+
URL: "https://www.example.com/unit_test",
9494
ContentType: ContentTypeJSON,
9595
Events: `{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}`,
9696
}

modules/repository/create.go

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,9 @@ import (
88
"fmt"
99
"os"
1010
"path/filepath"
11-
"strings"
1211

13-
activities_model "code.gitea.io/gitea/models/activities"
14-
"code.gitea.io/gitea/models/db"
1512
git_model "code.gitea.io/gitea/models/git"
16-
access_model "code.gitea.io/gitea/models/perm/access"
1713
repo_model "code.gitea.io/gitea/models/repo"
18-
issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
19-
"code.gitea.io/gitea/modules/log"
20-
api "code.gitea.io/gitea/modules/structs"
21-
"code.gitea.io/gitea/modules/util"
2214
)
2315

2416
const notRegularFileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular
@@ -63,97 +55,3 @@ func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error {
6355

6456
return repo_model.UpdateRepoSize(ctx, repo.ID, size, lfsSize)
6557
}
66-
67-
// CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon...
68-
func CheckDaemonExportOK(ctx context.Context, repo *repo_model.Repository) error {
69-
if err := repo.LoadOwner(ctx); err != nil {
70-
return err
71-
}
72-
73-
// Create/Remove git-daemon-export-ok for git-daemon...
74-
daemonExportFile := filepath.Join(repo.RepoPath(), `git-daemon-export-ok`)
75-
76-
isExist, err := util.IsExist(daemonExportFile)
77-
if err != nil {
78-
log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err)
79-
return err
80-
}
81-
82-
isPublic := !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePublic
83-
if !isPublic && isExist {
84-
if err = util.Remove(daemonExportFile); err != nil {
85-
log.Error("Failed to remove %s: %v", daemonExportFile, err)
86-
}
87-
} else if isPublic && !isExist {
88-
if f, err := os.Create(daemonExportFile); err != nil {
89-
log.Error("Failed to create %s: %v", daemonExportFile, err)
90-
} else {
91-
f.Close()
92-
}
93-
}
94-
95-
return nil
96-
}
97-
98-
// UpdateRepository updates a repository with db context
99-
func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibilityChanged bool) (err error) {
100-
repo.LowerName = strings.ToLower(repo.Name)
101-
102-
e := db.GetEngine(ctx)
103-
104-
if _, err = e.ID(repo.ID).AllCols().Update(repo); err != nil {
105-
return fmt.Errorf("update: %w", err)
106-
}
107-
108-
if err = UpdateRepoSize(ctx, repo); err != nil {
109-
log.Error("Failed to update size for repository: %v", err)
110-
}
111-
112-
if visibilityChanged {
113-
if err = repo.LoadOwner(ctx); err != nil {
114-
return fmt.Errorf("LoadOwner: %w", err)
115-
}
116-
if repo.Owner.IsOrganization() {
117-
// Organization repository need to recalculate access table when visibility is changed.
118-
if err = access_model.RecalculateTeamAccesses(ctx, repo, 0); err != nil {
119-
return fmt.Errorf("recalculateTeamAccesses: %w", err)
120-
}
121-
}
122-
123-
// If repo has become private, we need to set its actions to private.
124-
if repo.IsPrivate {
125-
_, err = e.Where("repo_id = ?", repo.ID).Cols("is_private").Update(&activities_model.Action{
126-
IsPrivate: true,
127-
})
128-
if err != nil {
129-
return err
130-
}
131-
132-
if err = repo_model.ClearRepoStars(ctx, repo.ID); err != nil {
133-
return err
134-
}
135-
}
136-
137-
// Create/Remove git-daemon-export-ok for git-daemon...
138-
if err := CheckDaemonExportOK(ctx, repo); err != nil {
139-
return err
140-
}
141-
142-
forkRepos, err := repo_model.GetRepositoriesByForkID(ctx, repo.ID)
143-
if err != nil {
144-
return fmt.Errorf("getRepositoriesByForkID: %w", err)
145-
}
146-
for i := range forkRepos {
147-
forkRepos[i].IsPrivate = repo.IsPrivate || repo.Owner.Visibility == api.VisibleTypePrivate
148-
if err = UpdateRepository(ctx, forkRepos[i], true); err != nil {
149-
return fmt.Errorf("updateRepository[%d]: %w", forkRepos[i].ID, err)
150-
}
151-
}
152-
153-
// If visibility is changed, we need to update the issue indexer.
154-
// Since the data in the issue indexer have field to indicate if the repo is public or not.
155-
issue_indexer.UpdateRepoIndexer(ctx, repo.ID)
156-
}
157-
158-
return nil
159-
}

modules/repository/create_test.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,13 @@ package repository
66
import (
77
"testing"
88

9-
activities_model "code.gitea.io/gitea/models/activities"
109
"code.gitea.io/gitea/models/db"
1110
repo_model "code.gitea.io/gitea/models/repo"
1211
"code.gitea.io/gitea/models/unittest"
1312

1413
"github.com/stretchr/testify/assert"
1514
)
1615

17-
func TestUpdateRepositoryVisibilityChanged(t *testing.T) {
18-
assert.NoError(t, unittest.PrepareTestDatabase())
19-
20-
// Get sample repo and change visibility
21-
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 9)
22-
assert.NoError(t, err)
23-
repo.IsPrivate = true
24-
25-
// Update it
26-
err = UpdateRepository(db.DefaultContext, repo, true)
27-
assert.NoError(t, err)
28-
29-
// Check visibility of action has become private
30-
act := activities_model.Action{}
31-
_, err = db.GetEngine(db.DefaultContext).ID(3).Get(&act)
32-
33-
assert.NoError(t, err)
34-
assert.True(t, act.IsPrivate)
35-
}
36-
3716
func TestGetDirectorySize(t *testing.T) {
3817
assert.NoError(t, unittest.PrepareTestDatabase())
3918
repo, err := repo_model.GetRepositoryByID(db.DefaultContext, 1)

options/locale/locale_fr-FR.ini

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,8 @@ public_profile=Profil public
730730
biography_placeholder=Parlez-nous un peu de vous ! (Vous pouvez utiliser Markdown)
731731
location_placeholder=Partagez votre position approximative avec d'autres personnes
732732
profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
733+
password_username_disabled=Vous n’êtes pas autorisé à modifier votre nom d’utilisateur. Veuillez contacter l’administrateur de votre site pour plus de détails.
734+
password_full_name_disabled=Vous n’êtes pas autorisé à modifier votre nom complet. Veuillez contacter l’administrateur du site pour plus de détails.
733735
full_name=Nom complet
734736
website=Site Web
735737
location=Localisation
@@ -924,6 +926,9 @@ permission_not_set=Non défini
924926
permission_no_access=Aucun accès
925927
permission_read=Lecture
926928
permission_write=Lecture et écriture
929+
permission_anonymous_read=Consultation anonyme
930+
permission_everyone_read=Consultation collective
931+
permission_everyone_write=Participation collective
927932
access_token_desc=Les autorisations des jetons sélectionnées se limitent aux <a %s>routes API</a> correspondantes. Lisez la <a %s>documentation</a> pour plus d’informations.
928933
at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton.
929934
permissions_list=Autorisations :
@@ -1136,6 +1141,7 @@ transfer.no_permission_to_reject=Vous n’êtes pas autorisé à rejeter ce tran
11361141
11371142
desc.private=Privé
11381143
desc.public=Publique
1144+
desc.public_access=Accès public
11391145
desc.template=Modèle
11401146
desc.internal=Interne
11411147
desc.archived=Archivé
@@ -1648,6 +1654,8 @@ issues.label_archived_filter=Afficher les labels archivés
16481654
issues.label_archive_tooltip=Les labels archivés sont par défaut exclus des suggestions lors de la recherche par label.
16491655
issues.label_exclusive_desc=Remarque : pour rendre des labels mutuellement exclusifs, préfixez leur nom d’une portée au format <code>portée/label</code>.
16501656
issues.label_exclusive_warning=Tout label d'une portée en conflit sera retiré lors de la modification des labels d’un ticket ou d’une demande d’ajout.
1657+
issues.label_exclusive_order=Ordre de tri
1658+
issues.label_exclusive_order_tooltip=Les labels exclusifs partageant la même portée seront triées selon cet ordre numérique.
16511659
issues.label_count=%d labels
16521660
issues.label_open_issues=%d tickets ouverts
16531661
issues.label_edit=Éditer
@@ -2130,6 +2138,12 @@ contributors.contribution_type.deletions=Suppressions
21302138
settings=Paramètres
21312139
settings.desc=Les paramètres sont l'endroit où gérer les options du dépôt
21322140
settings.options=Dépôt
2141+
settings.public_access=Accès public
2142+
settings.public_access_desc=Configurer les permissions des visiteurs publics remplaçant les valeurs par défaut de ce dépôt.
2143+
settings.public_access.docs.not_set=Non défini : ne donne aucune permission supplémentaire. Les règles du dépôt et les permissions des utilisateurs font foi.
2144+
settings.public_access.docs.anonymous_read=Lecture anonyme : les utilisateurs qui ne sont pas connectés peuvent consulter la ressource.
2145+
settings.public_access.docs.everyone_read=Consultation publique : tous les utilisateurs connectés peuvent consulter la ressource. Mettre les tickets et demandes d’ajouts en accès public signifie que les utilisateurs connectés peuvent en créer.
2146+
settings.public_access.docs.everyone_write=Participation publique : tous les utilisateurs connectés ont la permission d’écrire sur la ressource. Seule le Wiki supporte cette autorisation.
21332147
settings.collaboration=Collaborateurs
21342148
settings.collaboration.admin=Administrateur
21352149
settings.collaboration.write=Écriture

options/locale/locale_pt-PT.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,8 @@ issues.label_archived_filter=Mostrar rótulos arquivados
16541654
issues.label_archive_tooltip=Os rótulos arquivados são, por norma, excluídos das sugestões ao pesquisar por rótulo.
16551655
issues.label_exclusive_desc=Nomeie o rótulo <code>âmbito/item</code> para torná-lo mutuamente exclusivo com outros rótulos do <code>âmbito/</code>.
16561656
issues.label_exclusive_warning=Quaisquer rótulos com âmbito que estejam em conflito irão ser removidos ao editar os rótulos de uma questão ou de um pedido de integração.
1657+
issues.label_exclusive_order=Ordenação
1658+
issues.label_exclusive_order_tooltip=Rótulos exclusivos no mesmo âmbito serão ordenados de acordo com esta ordem numérica.
16571659
issues.label_count=%d rótulos
16581660
issues.label_open_issues=%d questões abertas
16591661
issues.label_edit=Editar

options/locale/locale_zh-CN.ini

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,8 @@ permission_no_access=无访问权限
927927
permission_read=可读
928928
permission_write=读写
929929
permission_anonymous_read=匿名读
930+
permission_everyone_read=所有人可读
931+
permission_everyone_write=所有人可写
930932
access_token_desc=所选令牌权限仅限于对应的 <a %s>API</a> 路由的授权。阅读 <a %s>文档</a> 以获取更多信息。
931933
at_least_one_permission=你需要选择至少一个权限才能创建令牌
932934
permissions_list=权限:
@@ -1646,12 +1648,14 @@ issues.save=保存
16461648
issues.label_title=标签名称
16471649
issues.label_description=标签描述
16481650
issues.label_color=标签颜色
1649-
issues.label_exclusive=独有
1651+
issues.label_exclusive=互斥标签
16501652
issues.label_archive=归档标签
16511653
issues.label_archived_filter=显示存档标签
16521654
issues.label_archive_tooltip=在标签搜索时,默认情况下存档标签将被排除在外。
16531655
issues.label_exclusive_desc=命名标签为 <code>scope/item</code> 以使其与其他以 <code>scope/</code> 开头的标签互斥。
16541656
issues.label_exclusive_warning=在编辑工单或合并请求的标签时,任何冲突的范围标签都将被删除。
1657+
issues.label_exclusive_order=排序顺序
1658+
issues.label_exclusive_order_tooltip=在同一个范围内的互斥标签将按照这个数字进行排序
16551659
issues.label_count=%d 个标签
16561660
issues.label_open_issues=%d 个开启的工单
16571661
issues.label_edit=编辑
@@ -1711,8 +1715,11 @@ issues.start_tracking_history=`开始工作 %s`
17111715
issues.tracker_auto_close=当此工单关闭时,自动停止计时器
17121716
issues.tracking_already_started=`你已经开始对 <a href="%s">另一个工单</a> 进行时间跟踪!`
17131717
issues.stop_tracking=停止计时器
1718+
issues.stop_tracking_history=工作 <b>%[1]s</b> 于 %[2]s 停止
1719+
issues.cancel_tracking=取消
17141720
issues.cancel_tracking_history=`取消时间跟踪 %s`
17151721
issues.del_time=删除此时间跟踪日志
1722+
issues.add_time_history=已于 %[2]s 添加计时 <b>%[1]</b>
17161723
issues.del_time_history=`已删除时间 %s`
17171724
issues.add_time_manually=手动添加时间
17181725
issues.add_time_hours=小时
@@ -1971,6 +1978,7 @@ pulls.upstream_diverging_prompt_behind_1=该分支落后于 %[2]s %[1]d 个提
19711978
pulls.upstream_diverging_prompt_behind_n=该分支落后于 %[2]s %[1]d 个提交
19721979
pulls.upstream_diverging_prompt_base_newer=基础分支 %s 有新的更改
19731980
pulls.upstream_diverging_merge=同步派生
1981+
pulls.upstream_diverging_merge_confirm=要将 %[1]s 合并到 %[2]s 吗?
19741982

19751983
pull.deleted_branch=(已删除): %s
19761984
pull.agit_documentation=查看有关 AGit 的文档
@@ -2131,6 +2139,11 @@ settings=设置
21312139
settings.desc=设置是你可以管理仓库设置的地方
21322140
settings.options=仓库
21332141
settings.public_access=公开访问
2142+
settings.public_access_desc=配置公共访客访问权限以覆盖此存储库的默认值。
2143+
settings.public_access.docs.not_set=未设置:没有额外的公共访问权限。访客权限遵循存储库的可见性和成员权限。
2144+
settings.public_access.docs.anonymous_read=匿名可读:未登录的用户可以通过读取权限访问单元。
2145+
settings.public_access.docs.everyone_read=所有人可读:所有登录用户都可以通过读取权限访问单元。读取问题/拉取请求单元的权限也意味着用户可以创建新的问题/拉取请求。
2146+
settings.public_access.docs.everyone_write=所有人可写:所有登录用户都有写入权限。只有百科支持此权限。
21342147
settings.collaboration=协作者
21352148
settings.collaboration.admin=管理员
21362149
settings.collaboration.write=可写权限
@@ -2385,6 +2398,7 @@ settings.event_pull_request_approvals=合并请求批准
23852398
settings.event_pull_request_merge=合并请求合并
23862399
settings.event_header_workflow=工作流程事件
23872400
settings.event_workflow_job=工作流任务
2401+
settings.event_workflow_job_desc=Gitea Actions 工作流队列中、等待中、正在进行或已完成任务。
23882402
settings.event_package=软件包
23892403
settings.event_package_desc=软件包已在仓库中被创建或删除。
23902404
settings.branch_filter=分支过滤
@@ -2900,6 +2914,9 @@ worktime.date_range_start=起始日期
29002914
worktime.date_range_end=结束日期
29012915
worktime.query=查询
29022916
worktime.time=时间
2917+
worktime.by_repositories=按仓库
2918+
worktime.by_milestones=按里程碑
2919+
worktime.by_members=按成员
29032920

29042921
[admin]
29052922
maintenance=维护

routers/api/v1/org/member.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/url"
99

1010
"code.gitea.io/gitea/models/organization"
11+
user_model "code.gitea.io/gitea/models/user"
1112
"code.gitea.io/gitea/modules/setting"
1213
api "code.gitea.io/gitea/modules/structs"
1314
"code.gitea.io/gitea/routers/api/v1/user"
@@ -210,6 +211,20 @@ func IsPublicMember(ctx *context.APIContext) {
210211
}
211212
}
212213

214+
func checkCanChangeOrgUserStatus(ctx *context.APIContext, targetUser *user_model.User) {
215+
// allow user themselves to change their status, and allow admins to change any user
216+
if targetUser.ID == ctx.Doer.ID || ctx.Doer.IsAdmin {
217+
return
218+
}
219+
// allow org owners to change status of members
220+
isOwner, err := ctx.Org.Organization.IsOwnedBy(ctx, ctx.Doer.ID)
221+
if err != nil {
222+
ctx.APIError(http.StatusInternalServerError, err)
223+
} else if !isOwner {
224+
ctx.APIError(http.StatusForbidden, "Cannot change member visibility")
225+
}
226+
}
227+
213228
// PublicizeMember make a member's membership public
214229
func PublicizeMember(ctx *context.APIContext) {
215230
// swagger:operation PUT /orgs/{org}/public_members/{username} organization orgPublicizeMember
@@ -240,8 +255,8 @@ func PublicizeMember(ctx *context.APIContext) {
240255
if ctx.Written() {
241256
return
242257
}
243-
if userToPublicize.ID != ctx.Doer.ID {
244-
ctx.APIError(http.StatusForbidden, "Cannot publicize another member")
258+
checkCanChangeOrgUserStatus(ctx, userToPublicize)
259+
if ctx.Written() {
245260
return
246261
}
247262
err := organization.ChangeOrgUserStatus(ctx, ctx.Org.Organization.ID, userToPublicize.ID, true)
@@ -282,8 +297,8 @@ func ConcealMember(ctx *context.APIContext) {
282297
if ctx.Written() {
283298
return
284299
}
285-
if userToConceal.ID != ctx.Doer.ID {
286-
ctx.APIError(http.StatusForbidden, "Cannot conceal another member")
300+
checkCanChangeOrgUserStatus(ctx, userToConceal)
301+
if ctx.Written() {
287302
return
288303
}
289304
err := organization.ChangeOrgUserStatus(ctx, ctx.Org.Organization.ID, userToConceal.ID, false)

0 commit comments

Comments
 (0)