diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/access.go | 8 | ||||
-rw-r--r-- | models/issue.go | 2 | ||||
-rw-r--r-- | models/repo.go | 3 | ||||
-rw-r--r-- | models/repo_collaboration.go | 22 | ||||
-rw-r--r-- | models/user.go | 2 |
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 { |