diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2018-11-28 19:26:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-28 19:26:14 +0800 |
commit | eabbddcd98717ef20d8475e819f403c50f4a9787 (patch) | |
tree | efc525e7ec60d56d3bec72019febfa088a128b89 /models/issue.go | |
parent | 0222623be9fa4a56d870213f77b92139cefc2518 (diff) | |
download | gitea-eabbddcd98717ef20d8475e819f403c50f4a9787.tar.gz gitea-eabbddcd98717ef20d8475e819f403c50f4a9787.zip |
Restrict permission check on repositories and fix some problems (#5314)
* fix units permission problems
* fix some bugs and merge LoadUnits to repoAssignment
* refactor permission struct and add some copyright heads
* remove unused codes
* fix routes units check
* improve permission check
* add unit tests for permission
* fix typo
* fix tests
* fix some routes
* fix api permission check
* improve permission check
* fix some permission check
* fix tests
* fix tests
* improve some permission check
* fix some permission check
* refactor AccessLevel
* fix bug
* fix tests
* fix tests
* fix tests
* fix AccessLevel
* rename CanAccess
* fix tests
* fix comment
* fix bug
* add missing unit for test repos
* fix bug
* rename some functions
* fix routes check
Diffstat (limited to 'models/issue.go')
-rw-r--r-- | models/issue.go | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/models/issue.go b/models/issue.go index ab4fe3107b..26196274fe 100644 --- a/models/issue.go +++ b/models/issue.go @@ -385,7 +385,7 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) { return } - mode, _ := AccessLevel(issue.Poster.ID, issue.Repo) + mode, _ := AccessLevel(issue.Poster, issue.Repo) if issue.IsPull { if err = issue.loadPullRequest(x); err != nil { log.Error(4, "loadPullRequest: %v", err) @@ -468,9 +468,11 @@ func (issue *Issue) RemoveLabel(doer *User, label *Label) error { return err } - if has, err := HasAccess(doer.ID, issue.Repo, AccessModeWrite); err != nil { + perm, err := GetUserRepoPermission(issue.Repo, doer) + if err != nil { return err - } else if !has { + } + if !perm.CanWriteIssuesOrPulls(issue.IsPull) { return ErrLabelNotExist{} } @@ -511,9 +513,11 @@ func (issue *Issue) ClearLabels(doer *User) (err error) { return err } - if has, err := hasAccess(sess, doer.ID, issue.Repo, AccessModeWrite); err != nil { + perm, err := getUserRepoPermission(sess, issue.Repo, doer) + if err != nil { return err - } else if !has { + } + if !perm.CanWriteIssuesOrPulls(issue.IsPull) { return ErrLabelNotExist{} } @@ -529,7 +533,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) { return fmt.Errorf("loadPoster: %v", err) } - mode, _ := AccessLevel(issue.Poster.ID, issue.Repo) + mode, _ := AccessLevel(issue.Poster, issue.Repo) if issue.IsPull { err = issue.PullRequest.LoadIssue() if err != nil { @@ -723,7 +727,7 @@ func (issue *Issue) ChangeStatus(doer *User, repo *Repository, isClosed bool) (e } sess.Close() - mode, _ := AccessLevel(issue.Poster.ID, issue.Repo) + mode, _ := AccessLevel(issue.Poster, issue.Repo) if issue.IsPull { // Merge pull request calls issue.changeStatus so we need to handle separately. issue.PullRequest.Issue = issue @@ -785,7 +789,7 @@ func (issue *Issue) ChangeTitle(doer *User, title string) (err error) { return err } - mode, _ := AccessLevel(issue.Poster.ID, issue.Repo) + mode, _ := AccessLevel(issue.Poster, issue.Repo) if issue.IsPull { issue.PullRequest.Issue = issue err = PrepareWebhooks(issue.Repo, HookEventPullRequest, &api.PullRequestPayload{ @@ -851,7 +855,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) { return fmt.Errorf("UpdateIssueCols: %v", err) } - mode, _ := AccessLevel(issue.Poster.ID, issue.Repo) + mode, _ := AccessLevel(issue.Poster, issue.Repo) if issue.IsPull { issue.PullRequest.Issue = issue err = PrepareWebhooks(issue.Repo, HookEventPullRequest, &api.PullRequestPayload{ @@ -946,9 +950,13 @@ func newIssue(e *xorm.Session, doer *User, opts NewIssueOptions) (err error) { // Check for and validate assignees if len(opts.AssigneeIDs) > 0 { for _, assigneeID := range opts.AssigneeIDs { - valid, err := hasAccess(e, assigneeID, opts.Repo, AccessModeWrite) + user, err := getUserByID(e, assigneeID) + if err != nil { + return fmt.Errorf("getUserByID [user_id: %d, repo_id: %d]: %v", assigneeID, opts.Repo.ID, err) + } + valid, err := canBeAssigned(e, user, opts.Repo) if err != nil { - return fmt.Errorf("hasAccess [user_id: %d, repo_id: %d]: %v", assigneeID, opts.Repo.ID, err) + return fmt.Errorf("canBeAssigned [user_id: %d, repo_id: %d]: %v", assigneeID, opts.Repo.ID, err) } if !valid { return ErrUserDoesNotHaveAccessToRepo{UserID: assigneeID, RepoName: opts.Repo.Name} @@ -1071,7 +1079,7 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, assigneeIDs []in log.Error(4, "MailParticipants: %v", err) } - mode, _ := AccessLevel(issue.Poster.ID, issue.Repo) + mode, _ := AccessLevel(issue.Poster, issue.Repo) if err = PrepareWebhooks(repo, HookEventIssues, &api.IssuePayload{ Action: api.HookIssueOpened, Index: issue.Index, |