aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/access.go8
-rw-r--r--models/issue.go2
-rw-r--r--models/repo.go3
-rw-r--r--models/repo_collaboration.go22
-rw-r--r--models/user.go2
5 files changed, 23 insertions, 14 deletions
diff --git a/models/access.go b/models/access.go
index 0b114376..e780c3d0 100644
--- a/models/access.go
+++ b/models/access.go
@@ -146,16 +146,8 @@ func maxAccessMode(modes ...AccessMode) AccessMode {
// FIXME: do corss-comparison so reduce deletions and additions to the minimum?
func (repo *Repository) refreshAccesses(e Engine, accessMap map[int64]AccessMode) (err error) {
- minMode := ACCESS_MODE_READ
- if !repo.IsPrivate {
- minMode = ACCESS_MODE_WRITE
- }
-
newAccesses := make([]Access, 0, len(accessMap))
for userID, mode := range accessMap {
- if mode < minMode {
- continue
- }
newAccesses = append(newAccesses, Access{
UserID: userID,
RepoID: repo.ID,
diff --git a/models/issue.go b/models/issue.go
index caaabe42..76032668 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -618,7 +618,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
// Assume assignee is invalid and drop silently.
opts.Issue.AssigneeID = 0
if assignee != nil {
- valid, err := hasAccess(e, assignee, opts.Repo, ACCESS_MODE_WRITE)
+ valid, err := hasAccess(e, assignee, opts.Repo, ACCESS_MODE_READ)
if err != nil {
return fmt.Errorf("hasAccess [user_id: %d, repo_id: %d]: %v", assignee.ID, opts.Repo.ID, err)
}
diff --git a/models/repo.go b/models/repo.go
index 71bc2b44..c788611d 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -328,13 +328,14 @@ func (repo *Repository) DeleteWiki() {
}
}
+// getAssignees returns a list of users who can be assigned to issues in this repository.
func (repo *Repository) getAssignees(e Engine) (_ []*User, err error) {
if err = repo.getOwner(e); err != nil {
return nil, err
}
accesses := make([]*Access, 0, 10)
- if err = e.Where("repo_id = ? AND mode >= ?", repo.ID, ACCESS_MODE_WRITE).Find(&accesses); err != nil {
+ if err = e.Where("repo_id = ? AND mode >= ?", repo.ID, ACCESS_MODE_READ).Find(&accesses); err != nil {
return nil, err
}
diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go
index 73ec7ada..889ff4ce 100644
--- a/models/repo_collaboration.go
+++ b/models/repo_collaboration.go
@@ -126,7 +126,7 @@ func (repo *Repository) GetCollaborators() ([]*Collaborator, error) {
}
// ChangeCollaborationAccessMode sets new access mode for the collaboration.
-func (repo *Repository) ChangeCollaborationAccessMode(uid int64, mode AccessMode) error {
+func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode) error {
// Discard invalid input
if mode <= ACCESS_MODE_NONE || mode > ACCESS_MODE_OWNER {
return nil
@@ -134,7 +134,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(uid int64, mode AccessMode
collaboration := &Collaboration{
RepoID: repo.ID,
- UserID: uid,
+ UserID: userID,
}
has, err := x.Get(collaboration)
if err != nil {
@@ -156,7 +156,23 @@ func (repo *Repository) ChangeCollaborationAccessMode(uid int64, mode AccessMode
if _, err = sess.Id(collaboration.ID).AllCols().Update(collaboration); err != nil {
return fmt.Errorf("update collaboration: %v", err)
- } else if _, err = sess.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, uid, repo.ID); err != nil {
+ }
+
+ access := Access{
+ UserID: userID,
+ RepoID: repo.ID,
+ }
+ has, err = sess.Get(access)
+ if err != nil {
+ return fmt.Errorf("get access record: %v", err)
+ }
+ if has {
+ _, err = sess.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, userID, repo.ID)
+ } else {
+ access.Mode = mode
+ _, err = sess.Insert(access)
+ }
+ if err != nil {
return fmt.Errorf("update access table: %v", err)
}
diff --git a/models/user.go b/models/user.go
index f6697e38..a5b1f9f5 100644
--- a/models/user.go
+++ b/models/user.go
@@ -911,7 +911,7 @@ func GetUserByID(id int64) (*User, error) {
// GetAssigneeByID returns the user with write access of repository by given ID.
func GetAssigneeByID(repo *Repository, userID int64) (*User, error) {
- has, err := HasAccess(&User{ID: userID}, repo, ACCESS_MODE_WRITE)
+ has, err := HasAccess(&User{ID: userID}, repo, ACCESS_MODE_READ)
if err != nil {
return nil, err
} else if !has {