Skip to content

Commit c620fa7

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: Fix possible bug when migrating issues/pull requests (go-gitea#33487) allow action user have read permission in public repo like other user (go-gitea#36095) [skip ci] Updated translations via Crowdin
2 parents 1fad02e + 69700f9 commit c620fa7

5 files changed

Lines changed: 84 additions & 1 deletion

File tree

models/perm/access/repo_permission.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,14 @@ func GetActionsUserRepoPermission(ctx context.Context, repo *repo_model.Reposito
276276
if !actionsCfg.IsCollaborativeOwner(taskRepo.OwnerID) || !taskRepo.IsPrivate {
277277
// The task repo can access the current repo only if the task repo is private and
278278
// the owner of the task repo is a collaborative owner of the current repo.
279-
// FIXME allow public repo read access if tokenless pull is enabled
280279
// FIXME should owner's visibility also be considered here?
280+
281+
// check permission like simple user but limit to read-only
282+
perm, err = GetUserRepoPermission(ctx, repo, user_model.NewActionsUser())
283+
if err != nil {
284+
return perm, err
285+
}
286+
perm.AccessMode = min(perm.AccessMode, perm_model.AccessModeRead)
281287
return perm, nil
282288
}
283289
accessMode = perm_model.AccessModeRead

options/locale/locale_ga-IE.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ more=Níos mó
215215
buttons.heading.tooltip=Cuir ceannteideal leis
216216
buttons.bold.tooltip=Cuir téacs trom leis
217217
buttons.italic.tooltip=Cuir téacs iodálach leis
218+
buttons.strikethrough.tooltip=Cuir téacs trína chéile
218219
buttons.quote.tooltip=Téacs luaigh
219220
buttons.code.tooltip=Cuir cód leis
220221
buttons.link.tooltip=Cuir nasc leis

options/locale/locale_pt-PT.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ more=Mais
215215
buttons.heading.tooltip=Adicionar cabeçalho
216216
buttons.bold.tooltip=Adicionar texto em negrito
217217
buttons.italic.tooltip=Adicionar texto em itálico
218+
buttons.strikethrough.tooltip=Adicionar texto rasurado
218219
buttons.quote.tooltip=Citar texto
219220
buttons.code.tooltip=Adicionar código-fonte
220221
buttons.link.tooltip=Adicionar uma ligação

services/migrations/migrate.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
repo_model "code.gitea.io/gitea/models/repo"
1717
system_model "code.gitea.io/gitea/models/system"
1818
user_model "code.gitea.io/gitea/models/user"
19+
"code.gitea.io/gitea/modules/container"
1920
"code.gitea.io/gitea/modules/git"
2021
"code.gitea.io/gitea/modules/hostmatcher"
2122
"code.gitea.io/gitea/modules/log"
@@ -327,6 +328,9 @@ func migrateRepository(ctx context.Context, doer *user_model.User, downloader ba
327328
messenger("repo.migrate.migrating_issues")
328329
issueBatchSize := uploader.MaxBatchInsertSize("issue")
329330

331+
// because when the migrating is running, some issues maybe removed, so after the next page
332+
// some of issue maybe duplicated, so we need to record the inserted issue indexes
333+
mapInsertedIssueIndexes := container.Set[int64]{}
330334
for i := 1; ; i++ {
331335
issues, isEnd, err := downloader.GetIssues(ctx, i, issueBatchSize)
332336
if err != nil {
@@ -336,6 +340,14 @@ func migrateRepository(ctx context.Context, doer *user_model.User, downloader ba
336340
log.Warn("migrating issues is not supported, ignored")
337341
break
338342
}
343+
for i := 0; i < len(issues); i++ {
344+
if mapInsertedIssueIndexes.Contains(issues[i].Number) {
345+
issues = append(issues[:i], issues[i+1:]...)
346+
i--
347+
continue
348+
}
349+
mapInsertedIssueIndexes.Add(issues[i].Number)
350+
}
339351

340352
if err := uploader.CreateIssues(ctx, issues...); err != nil {
341353
return err
@@ -381,6 +393,7 @@ func migrateRepository(ctx context.Context, doer *user_model.User, downloader ba
381393
log.Trace("migrating pull requests and comments")
382394
messenger("repo.migrate.migrating_pulls")
383395
prBatchSize := uploader.MaxBatchInsertSize("pullrequest")
396+
mapInsertedPRIndexes := container.Set[int64]{}
384397
for i := 1; ; i++ {
385398
prs, isEnd, err := downloader.GetPullRequests(ctx, i, prBatchSize)
386399
if err != nil {
@@ -390,6 +403,14 @@ func migrateRepository(ctx context.Context, doer *user_model.User, downloader ba
390403
log.Warn("migrating pull requests is not supported, ignored")
391404
break
392405
}
406+
for i := 0; i < len(prs); i++ {
407+
if mapInsertedPRIndexes.Contains(prs[i].Number) {
408+
prs = append(prs[:i], prs[i+1:]...)
409+
i--
410+
continue
411+
}
412+
mapInsertedPRIndexes.Add(prs[i].Number)
413+
}
393414

394415
if err := uploader.CreatePullRequests(ctx, prs...); err != nil {
395416
return err
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package integration
5+
6+
import (
7+
"net/http"
8+
"testing"
9+
10+
"code.gitea.io/gitea/modules/setting"
11+
api "code.gitea.io/gitea/modules/structs"
12+
"code.gitea.io/gitea/modules/test"
13+
"code.gitea.io/gitea/tests"
14+
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
func testActionUserSignIn(t *testing.T) {
19+
req := NewRequest(t, "GET", "/api/v1/user").
20+
AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a")
21+
resp := MakeRequest(t, req, http.StatusOK)
22+
23+
var u api.User
24+
DecodeJSON(t, resp, &u)
25+
assert.Equal(t, "gitea-actions", u.UserName)
26+
}
27+
28+
func testActionUserAccessPublicRepo(t *testing.T) {
29+
req := NewRequestf(t, "GET", "/api/v1/repos/user2/repo1/raw/README.md").
30+
AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a")
31+
resp := MakeRequest(t, req, http.StatusOK)
32+
assert.Equal(t, "file", resp.Header().Get("x-gitea-object-type"))
33+
34+
defer test.MockVariableValue(&setting.Service.RequireSignInViewStrict, true)()
35+
36+
req = NewRequestf(t, "GET", "/api/v1/repos/user2/repo1/raw/README.md").
37+
AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a")
38+
resp = MakeRequest(t, req, http.StatusOK)
39+
assert.Equal(t, "file", resp.Header().Get("x-gitea-object-type"))
40+
}
41+
42+
func testActionUserNoAccessOtherPrivateRepo(t *testing.T) {
43+
req := NewRequestf(t, "GET", "/api/v1/repos/user2/repo2/raw/README.md").
44+
AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a")
45+
MakeRequest(t, req, http.StatusNotFound)
46+
}
47+
48+
func TestActionUserAccessPermission(t *testing.T) {
49+
defer tests.PrepareTestEnv(t)()
50+
51+
t.Run("ActionUserSignIn", testActionUserSignIn)
52+
t.Run("ActionUserAccessPublicRepo", testActionUserAccessPublicRepo)
53+
t.Run("ActionUserNoAccessOtherPrivateRepo", testActionUserNoAccessOtherPrivateRepo)
54+
}

0 commit comments

Comments
 (0)