Skip to content

Commit 6e51df2

Browse files
committed
Merge branch 'main'
2 parents e3bb5eb + 08b9776 commit 6e51df2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+885
-596
lines changed

models/admin/task.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
repo_model "code.gitea.io/gitea/models/repo"
1212
user_model "code.gitea.io/gitea/models/user"
1313
"code.gitea.io/gitea/modules/json"
14+
"code.gitea.io/gitea/modules/log"
1415
"code.gitea.io/gitea/modules/migration"
1516
"code.gitea.io/gitea/modules/secret"
1617
"code.gitea.io/gitea/modules/setting"
@@ -123,17 +124,17 @@ func (task *Task) MigrateConfig() (*migration.MigrateOptions, error) {
123124
// decrypt credentials
124125
if opts.CloneAddrEncrypted != "" {
125126
if opts.CloneAddr, err = secret.DecryptSecret(setting.SecretKey, opts.CloneAddrEncrypted); err != nil {
126-
return nil, err
127+
log.Error("Unable to decrypt CloneAddr, maybe SECRET_KEY is wrong: %v", err)
127128
}
128129
}
129130
if opts.AuthPasswordEncrypted != "" {
130131
if opts.AuthPassword, err = secret.DecryptSecret(setting.SecretKey, opts.AuthPasswordEncrypted); err != nil {
131-
return nil, err
132+
log.Error("Unable to decrypt AuthPassword, maybe SECRET_KEY is wrong: %v", err)
132133
}
133134
}
134135
if opts.AuthTokenEncrypted != "" {
135136
if opts.AuthToken, err = secret.DecryptSecret(setting.SecretKey, opts.AuthTokenEncrypted); err != nil {
136-
return nil, err
137+
log.Error("Unable to decrypt AuthToken, maybe SECRET_KEY is wrong: %v", err)
137138
}
138139
}
139140

models/auth/twofactor.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@ func (t *TwoFactor) SetSecret(secretString string) error {
111111
func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) {
112112
decodedStoredSecret, err := base64.StdEncoding.DecodeString(t.Secret)
113113
if err != nil {
114-
return false, err
114+
return false, fmt.Errorf("ValidateTOTP invalid base64: %w", err)
115115
}
116116
secretBytes, err := secret.AesDecrypt(t.getEncryptionKey(), decodedStoredSecret)
117117
if err != nil {
118-
return false, err
118+
return false, fmt.Errorf("ValidateTOTP unable to decrypt (maybe SECRET_KEY is wrong): %w", err)
119119
}
120120
secretStr := string(secretBytes)
121121
return totp.Validate(passcode, secretStr), nil

models/git/lfs.go

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"fmt"
99

1010
"code.gitea.io/gitea/models/db"
11-
"code.gitea.io/gitea/models/perm"
1211
repo_model "code.gitea.io/gitea/models/repo"
1312
"code.gitea.io/gitea/models/unit"
1413
user_model "code.gitea.io/gitea/models/user"
@@ -42,30 +41,6 @@ func (err ErrLFSLockNotExist) Unwrap() error {
4241
return util.ErrNotExist
4342
}
4443

45-
// ErrLFSUnauthorizedAction represents a "LFSUnauthorizedAction" kind of error.
46-
type ErrLFSUnauthorizedAction struct {
47-
RepoID int64
48-
UserName string
49-
Mode perm.AccessMode
50-
}
51-
52-
// IsErrLFSUnauthorizedAction checks if an error is a ErrLFSUnauthorizedAction.
53-
func IsErrLFSUnauthorizedAction(err error) bool {
54-
_, ok := err.(ErrLFSUnauthorizedAction)
55-
return ok
56-
}
57-
58-
func (err ErrLFSUnauthorizedAction) Error() string {
59-
if err.Mode == perm.AccessModeWrite {
60-
return fmt.Sprintf("User %s doesn't have write access for lfs lock [rid: %d]", err.UserName, err.RepoID)
61-
}
62-
return fmt.Sprintf("User %s doesn't have read access for lfs lock [rid: %d]", err.UserName, err.RepoID)
63-
}
64-
65-
func (err ErrLFSUnauthorizedAction) Unwrap() error {
66-
return util.ErrPermissionDenied
67-
}
68-
6944
// ErrLFSLockAlreadyExist represents a "LFSLockAlreadyExist" kind of error.
7045
type ErrLFSLockAlreadyExist struct {
7146
RepoID int64
@@ -93,12 +68,6 @@ type ErrLFSFileLocked struct {
9368
UserName string
9469
}
9570

96-
// IsErrLFSFileLocked checks if an error is a ErrLFSFileLocked.
97-
func IsErrLFSFileLocked(err error) bool {
98-
_, ok := err.(ErrLFSFileLocked)
99-
return ok
100-
}
101-
10271
func (err ErrLFSFileLocked) Error() string {
10372
return fmt.Sprintf("File is lfs locked [repo: %d, locked by: %s, path: %s]", err.RepoID, err.UserName, err.Path)
10473
}

models/git/lfs_lock.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ import (
1111
"time"
1212

1313
"code.gitea.io/gitea/models/db"
14-
"code.gitea.io/gitea/models/perm"
15-
access_model "code.gitea.io/gitea/models/perm/access"
1614
repo_model "code.gitea.io/gitea/models/repo"
17-
"code.gitea.io/gitea/models/unit"
1815
user_model "code.gitea.io/gitea/models/user"
1916
"code.gitea.io/gitea/modules/setting"
2017
"code.gitea.io/gitea/modules/util"
@@ -71,10 +68,6 @@ func (l *LFSLock) LoadOwner(ctx context.Context) error {
7168
// CreateLFSLock creates a new lock.
7269
func CreateLFSLock(ctx context.Context, repo *repo_model.Repository, lock *LFSLock) (*LFSLock, error) {
7370
return db.WithTx2(ctx, func(ctx context.Context) (*LFSLock, error) {
74-
if err := CheckLFSAccessForRepo(ctx, lock.OwnerID, repo, perm.AccessModeWrite); err != nil {
75-
return nil, err
76-
}
77-
7871
lock.Path = util.PathJoinRel(lock.Path)
7972
lock.RepoID = repo.ID
8073

@@ -165,10 +158,6 @@ func DeleteLFSLockByID(ctx context.Context, id int64, repo *repo_model.Repositor
165158
return nil, err
166159
}
167160

168-
if err := CheckLFSAccessForRepo(ctx, u.ID, repo, perm.AccessModeWrite); err != nil {
169-
return nil, err
170-
}
171-
172161
if !force && u.ID != lock.OwnerID {
173162
return nil, errors.New("user doesn't own lock and force flag is not set")
174163
}
@@ -180,22 +169,3 @@ func DeleteLFSLockByID(ctx context.Context, id int64, repo *repo_model.Repositor
180169
return lock, nil
181170
})
182171
}
183-
184-
// CheckLFSAccessForRepo check needed access mode base on action
185-
func CheckLFSAccessForRepo(ctx context.Context, ownerID int64, repo *repo_model.Repository, mode perm.AccessMode) error {
186-
if ownerID == 0 {
187-
return ErrLFSUnauthorizedAction{repo.ID, "undefined", mode}
188-
}
189-
u, err := user_model.GetUserByID(ctx, ownerID)
190-
if err != nil {
191-
return err
192-
}
193-
perm, err := access_model.GetUserRepoPermission(ctx, repo, u)
194-
if err != nil {
195-
return err
196-
}
197-
if !perm.CanAccess(mode, unit.TypeCode) {
198-
return ErrLFSUnauthorizedAction{repo.ID, u.DisplayName(), mode}
199-
}
200-
return nil
201-
}

models/git/protected_branch.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package git
55

66
import (
77
"context"
8-
"errors"
98
"fmt"
109
"slices"
1110
"strings"
@@ -25,7 +24,7 @@ import (
2524
"xorm.io/builder"
2625
)
2726

28-
var ErrBranchIsProtected = errors.New("branch is protected")
27+
var ErrBranchIsProtected = util.ErrorWrap(util.ErrPermissionDenied, "branch is protected")
2928

3029
// ProtectedBranch struct
3130
type ProtectedBranch struct {

models/organization/org.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,10 @@ func HasOrgOrUserVisible(ctx context.Context, orgOrUser, user *user_model.User)
429429
return true
430430
}
431431

432+
if !setting.Service.RequireSignInViewStrict && orgOrUser.Visibility == structs.VisibleTypePublic {
433+
return true
434+
}
435+
432436
if (orgOrUser.Visibility == structs.VisibleTypePrivate || user.IsRestricted) && !OrgFromUser(orgOrUser).hasMemberWithUserID(ctx, user.ID) {
433437
return false
434438
}

models/organization/org_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import (
1313
repo_model "code.gitea.io/gitea/models/repo"
1414
"code.gitea.io/gitea/models/unittest"
1515
user_model "code.gitea.io/gitea/models/user"
16+
"code.gitea.io/gitea/modules/setting"
1617
"code.gitea.io/gitea/modules/structs"
18+
"code.gitea.io/gitea/modules/test"
1719

1820
"github.com/stretchr/testify/assert"
1921
"github.com/stretchr/testify/require"
@@ -382,6 +384,12 @@ func TestHasOrgVisibleTypePublic(t *testing.T) {
382384
assert.True(t, test1) // owner of org
383385
assert.True(t, test2) // user not a part of org
384386
assert.True(t, test3) // logged out user
387+
388+
restrictedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29, IsRestricted: true})
389+
require.True(t, restrictedUser.IsRestricted)
390+
assert.True(t, organization.HasOrgOrUserVisible(t.Context(), org.AsUser(), restrictedUser))
391+
defer test.MockVariableValue(&setting.Service.RequireSignInViewStrict, true)()
392+
assert.False(t, organization.HasOrgOrUserVisible(t.Context(), org.AsUser(), restrictedUser))
385393
}
386394

387395
func TestHasOrgVisibleTypeLimited(t *testing.T) {

models/perm/access/access.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"code.gitea.io/gitea/models/perm"
1414
repo_model "code.gitea.io/gitea/models/repo"
1515
user_model "code.gitea.io/gitea/models/user"
16+
"code.gitea.io/gitea/modules/setting"
17+
"code.gitea.io/gitea/modules/structs"
1618

1719
"xorm.io/builder"
1820
)
@@ -41,7 +43,12 @@ func accessLevel(ctx context.Context, user *user_model.User, repo *repo_model.Re
4143
restricted = user.IsRestricted
4244
}
4345

44-
if !restricted && !repo.IsPrivate {
46+
if err := repo.LoadOwner(ctx); err != nil {
47+
return mode, err
48+
}
49+
50+
repoIsFullyPublic := !setting.Service.RequireSignInViewStrict && repo.Owner.Visibility == structs.VisibleTypePublic && !repo.IsPrivate
51+
if (restricted && repoIsFullyPublic) || (!restricted && !repo.IsPrivate) {
4552
mode = perm.AccessModeRead
4653
}
4754

models/perm/access/access_test.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
repo_model "code.gitea.io/gitea/models/repo"
1313
"code.gitea.io/gitea/models/unittest"
1414
user_model "code.gitea.io/gitea/models/user"
15+
"code.gitea.io/gitea/modules/setting"
1516

1617
"github.com/stretchr/testify/assert"
1718
)
@@ -51,7 +52,14 @@ func TestAccessLevel(t *testing.T) {
5152
assert.NoError(t, err)
5253
assert.Equal(t, perm_model.AccessModeNone, level)
5354

54-
// restricted user has no access to a public repo
55+
// restricted user has default access to a public repo if no sign-in is required
56+
setting.Service.RequireSignInViewStrict = false
57+
level, err = access_model.AccessLevel(t.Context(), user29, repo1)
58+
assert.NoError(t, err)
59+
assert.Equal(t, perm_model.AccessModeRead, level)
60+
61+
// restricted user has no access to a public repo if sign-in is required
62+
setting.Service.RequireSignInViewStrict = true
5563
level, err = access_model.AccessLevel(t.Context(), user29, repo1)
5664
assert.NoError(t, err)
5765
assert.Equal(t, perm_model.AccessModeNone, level)

models/perm/access/repo_permission.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ package access
55

66
import (
77
"context"
8+
"errors"
89
"fmt"
910
"slices"
1011

12+
actions_model "code.gitea.io/gitea/models/actions"
1113
"code.gitea.io/gitea/models/db"
1214
"code.gitea.io/gitea/models/organization"
1315
perm_model "code.gitea.io/gitea/models/perm"
@@ -253,6 +255,42 @@ func finalProcessRepoUnitPermission(user *user_model.User, perm *Permission) {
253255
}
254256
}
255257

258+
// GetActionsUserRepoPermission returns the actions user permissions to the repository
259+
func GetActionsUserRepoPermission(ctx context.Context, repo *repo_model.Repository, actionsUser *user_model.User, taskID int64) (perm Permission, err error) {
260+
if actionsUser.ID != user_model.ActionsUserID {
261+
return perm, errors.New("api GetActionsUserRepoPermission can only be called by the actions user")
262+
}
263+
task, err := actions_model.GetTaskByID(ctx, taskID)
264+
if err != nil {
265+
return perm, err
266+
}
267+
268+
var accessMode perm_model.AccessMode
269+
if task.RepoID != repo.ID {
270+
taskRepo, exist, err := db.GetByID[repo_model.Repository](ctx, task.RepoID)
271+
if err != nil || !exist {
272+
return perm, err
273+
}
274+
actionsCfg := repo.MustGetUnit(ctx, unit.TypeActions).ActionsConfig()
275+
if !actionsCfg.IsCollaborativeOwner(taskRepo.OwnerID) || !taskRepo.IsPrivate {
276+
// The task repo can access the current repo only if the task repo is private and
277+
// the owner of the task repo is a collaborative owner of the current repo.
278+
return perm, nil
279+
}
280+
accessMode = perm_model.AccessModeRead
281+
} else if task.IsForkPullRequest {
282+
accessMode = perm_model.AccessModeRead
283+
} else {
284+
accessMode = perm_model.AccessModeWrite
285+
}
286+
287+
if err := repo.LoadUnits(ctx); err != nil {
288+
return perm, err
289+
}
290+
perm.SetUnitsWithDefaultAccessMode(repo.Units, accessMode)
291+
return perm, nil
292+
}
293+
256294
// GetUserRepoPermission returns the user permissions to the repository
257295
func GetUserRepoPermission(ctx context.Context, repo *repo_model.Repository, user *user_model.User) (perm Permission, err error) {
258296
defer func() {

0 commit comments

Comments
 (0)