aboutsummaryrefslogtreecommitdiff
path: root/internal/db/user.go
diff options
context:
space:
mode:
authorᴜɴᴋɴᴡᴏɴ <u@gogs.io>2020-10-06 15:43:28 +0800
committerGitHub <noreply@github.com>2020-10-06 15:43:28 +0800
commit2eaf1d693ae08c0312dd1f977f81675f418f3770 (patch)
treeb42a26180e813918a05a676bd18e13a3a1bb73ec /internal/db/user.go
parenta92d818aa35583594a6b3098f4e1e1f4edec17dd (diff)
db: migrate access table to use GORM (#6371)
Diffstat (limited to 'internal/db/user.go')
-rw-r--r--internal/db/user.go74
1 files changed, 58 insertions, 16 deletions
diff --git a/internal/db/user.go b/internal/db/user.go
index 22f25b5d..0e3c106e 100644
--- a/internal/db/user.go
+++ b/internal/db/user.go
@@ -369,20 +369,22 @@ func (u *User) DeleteAvatar() error {
// IsAdminOfRepo returns true if user has admin or higher access of repository.
func (u *User) IsAdminOfRepo(repo *Repository) bool {
- has, err := HasAccess(u.ID, repo, AccessModeAdmin)
- if err != nil {
- log.Error("HasAccess: %v", err)
- }
- return has
+ return Perms.Authorize(u.ID, repo.ID, AccessModeAdmin,
+ AccessModeOptions{
+ OwnerID: repo.OwnerID,
+ Private: repo.IsPrivate,
+ },
+ )
}
// IsWriterOfRepo returns true if user has write access to given repository.
func (u *User) IsWriterOfRepo(repo *Repository) bool {
- has, err := HasAccess(u.ID, repo, AccessModeWrite)
- if err != nil {
- log.Error("HasAccess: %v", err)
- }
- return has
+ return Perms.Authorize(u.ID, repo.ID, AccessModeWrite,
+ AccessModeOptions{
+ OwnerID: repo.OwnerID,
+ Private: repo.IsPrivate,
+ },
+ )
}
// IsOrganization returns true if user is actually a organization.
@@ -937,15 +939,17 @@ func GetUserByID(id int64) (*User, error) {
return getUserByID(x, id)
}
-// GetAssigneeByID returns the user with write access of repository by given ID.
+// GetAssigneeByID returns the user with read access of repository by given ID.
func GetAssigneeByID(repo *Repository, userID int64) (*User, error) {
- has, err := HasAccess(userID, repo, AccessModeRead)
- if err != nil {
- return nil, err
- } else if !has {
+ if !Perms.Authorize(userID, repo.ID, AccessModeRead,
+ AccessModeOptions{
+ OwnerID: repo.OwnerID,
+ Private: repo.IsPrivate,
+ },
+ ) {
return nil, ErrUserNotExist{args: map[string]interface{}{"userID": userID}}
}
- return GetUserByID(userID)
+ return Users.GetByID(userID)
}
// GetUserByName returns a user by given name.
@@ -1171,3 +1175,41 @@ func UnfollowUser(userID, followID int64) (err error) {
}
return sess.Commit()
}
+
+// GetRepositoryAccesses finds all repositories with their access mode where a user has access but does not own.
+func (u *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) {
+ accesses := make([]*Access, 0, 10)
+ if err := x.Find(&accesses, &Access{UserID: u.ID}); err != nil {
+ return nil, err
+ }
+
+ repos := make(map[*Repository]AccessMode, len(accesses))
+ for _, access := range accesses {
+ repo, err := GetRepositoryByID(access.RepoID)
+ if err != nil {
+ if IsErrRepoNotExist(err) {
+ log.Error("Failed to get repository by ID: %v", err)
+ continue
+ }
+ return nil, err
+ }
+ if repo.OwnerID == u.ID {
+ continue
+ }
+ repos[repo] = access.Mode
+ }
+ return repos, nil
+}
+
+// GetAccessibleRepositories finds repositories which the user has access but does not own.
+// If limit is smaller than 1 means returns all found results.
+func (user *User) GetAccessibleRepositories(limit int) (repos []*Repository, _ error) {
+ sess := x.Where("owner_id !=? ", user.ID).Desc("updated_unix")
+ if limit > 0 {
+ sess.Limit(limit)
+ repos = make([]*Repository, 0, limit)
+ } else {
+ repos = make([]*Repository, 0, 10)
+ }
+ return repos, sess.Join("INNER", "access", "access.user_id = ? AND access.repo_id = repository.id", user.ID).Find(&repos)
+}