Commit ccc9bed89365fd4a13253d2491ab45345f04a5c3
1 parent
7a9fc480
Exists in
master
and in
4 other branches
Abilities refactoring
Showing
7 changed files
with
83 additions
and
8 deletions
Show diff stats
app/controllers/issues_controller.rb
... | ... | @@ -6,8 +6,18 @@ class IssuesController < ApplicationController |
6 | 6 | |
7 | 7 | # Authorize |
8 | 8 | before_filter :add_project_abilities |
9 | + | |
10 | + # Allow read any issue | |
9 | 11 | before_filter :authorize_read_issue! |
10 | - before_filter :authorize_write_issue!, :only => [:new, :create, :close, :edit, :update, :sort] | |
12 | + | |
13 | + # Allow write(create) issue | |
14 | + before_filter :authorize_write_issue!, :only => [:new, :create] | |
15 | + | |
16 | + # Allow modify issue | |
17 | + before_filter :authorize_modify_issue!, :only => [:close, :edit, :update, :sort] | |
18 | + | |
19 | + # Allow destroy issue | |
20 | + before_filter :authorize_admin_issue!, :only => [:destroy] | |
11 | 21 | |
12 | 22 | respond_to :js, :html |
13 | 23 | |
... | ... | @@ -115,4 +125,13 @@ class IssuesController < ApplicationController |
115 | 125 | def issue |
116 | 126 | @issue ||= @project.issues.find(params[:id]) |
117 | 127 | end |
128 | + | |
129 | + def authorize_modify_issue! | |
130 | + can?(current_user, :modify_issue, @issue) || | |
131 | + @issue.assignee == current_user | |
132 | + end | |
133 | + | |
134 | + def authorize_admin_issue! | |
135 | + can?(current_user, :admin_issue, @issue) | |
136 | + end | |
118 | 137 | end | ... | ... |
app/controllers/merge_requests_controller.rb
... | ... | @@ -6,8 +6,18 @@ class MergeRequestsController < ApplicationController |
6 | 6 | |
7 | 7 | # Authorize |
8 | 8 | before_filter :add_project_abilities |
9 | - before_filter :authorize_read_project! | |
10 | - before_filter :authorize_write_project!, :only => [:new, :create, :edit, :update] | |
9 | + | |
10 | + # Allow read any merge_request | |
11 | + before_filter :authorize_read_merge_request! | |
12 | + | |
13 | + # Allow write(create) merge_request | |
14 | + before_filter :authorize_write_merge_request!, :only => [:new, :create] | |
15 | + | |
16 | + # Allow modify merge_request | |
17 | + before_filter :authorize_modify_merge_request!, :only => [:close, :edit, :update, :sort] | |
18 | + | |
19 | + # Allow destroy merge_request | |
20 | + before_filter :authorize_admin_merge_request!, :only => [:destroy] | |
11 | 21 | |
12 | 22 | def index |
13 | 23 | @merge_requests = @project.merge_requests |
... | ... | @@ -85,4 +95,13 @@ class MergeRequestsController < ApplicationController |
85 | 95 | def merge_request |
86 | 96 | @merge_request ||= @project.merge_requests.find(params[:id]) |
87 | 97 | end |
98 | + | |
99 | + def authorize_modify_merge_request! | |
100 | + can?(current_user, :modify_merge_request, @merge_request) || | |
101 | + @merge_request.assignee == current_user | |
102 | + end | |
103 | + | |
104 | + def authorize_admin_merge_request! | |
105 | + can?(current_user, :admin_merge_request, @merge_request) | |
106 | + end | |
88 | 107 | end | ... | ... |
app/controllers/notes_controller.rb
app/controllers/snippets_controller.rb
... | ... | @@ -5,8 +5,18 @@ class SnippetsController < ApplicationController |
5 | 5 | |
6 | 6 | # Authorize |
7 | 7 | before_filter :add_project_abilities |
8 | + | |
9 | + # Allow read any snippet | |
8 | 10 | before_filter :authorize_read_snippet! |
9 | - before_filter :authorize_write_snippet!, :only => [:new, :create, :close, :edit, :update, :sort] | |
11 | + | |
12 | + # Allow write(create) snippet | |
13 | + before_filter :authorize_write_snippet!, :only => [:new, :create] | |
14 | + | |
15 | + # Allow modify snippet | |
16 | + before_filter :authorize_modify_snippet!, :only => [:edit, :update] | |
17 | + | |
18 | + # Allow destroy snippet | |
19 | + before_filter :authorize_admin_snippet!, :only => [:destroy] | |
10 | 20 | |
11 | 21 | respond_to :html |
12 | 22 | |
... | ... | @@ -60,4 +70,14 @@ class SnippetsController < ApplicationController |
60 | 70 | |
61 | 71 | redirect_to project_snippets_path(@project) |
62 | 72 | end |
73 | + | |
74 | + protected | |
75 | + | |
76 | + def authorize_modify_snippet! | |
77 | + can?(current_user, :modify_snippet, @snippet) | |
78 | + end | |
79 | + | |
80 | + def authorize_admin_snippet! | |
81 | + can?(current_user, :admin_snippet, @snippet) | |
82 | + end | |
63 | 83 | end | ... | ... |
app/controllers/team_members_controller.rb
... | ... | @@ -5,7 +5,7 @@ class TeamMembersController < ApplicationController |
5 | 5 | # Authorize |
6 | 6 | before_filter :add_project_abilities |
7 | 7 | before_filter :authorize_read_project! |
8 | - before_filter :authorize_admin_project!, :only => [:new, :create, :destroy, :update] | |
8 | + before_filter :authorize_admin_project!, :except => [:show] | |
9 | 9 | |
10 | 10 | def show |
11 | 11 | @team_member = project.users_projects.find(params[:id]) | ... | ... |
app/models/ability.rb
... | ... | @@ -19,7 +19,7 @@ class Ability |
19 | 19 | :read_team_member, |
20 | 20 | :read_merge_request, |
21 | 21 | :read_note |
22 | - ] if project.readers.include?(user) | |
22 | + ] if project.allow_read_for?(user) | |
23 | 23 | |
24 | 24 | rules << [ |
25 | 25 | :write_project, |
... | ... | @@ -27,16 +27,18 @@ class Ability |
27 | 27 | :write_snippet, |
28 | 28 | :write_merge_request, |
29 | 29 | :write_note |
30 | - ] if project.writers.include?(user) | |
30 | + ] if project.allow_write_for?(user) | |
31 | 31 | |
32 | 32 | rules << [ |
33 | + :modify_issue, | |
34 | + :modify_snippet, | |
33 | 35 | :admin_project, |
34 | 36 | :admin_issue, |
35 | 37 | :admin_snippet, |
36 | 38 | :admin_team_member, |
37 | 39 | :admin_merge_request, |
38 | 40 | :admin_note |
39 | - ] if project.admins.include?(user) | |
41 | + ] if project.allow_admin_for?(user) | |
40 | 42 | |
41 | 43 | rules.flatten |
42 | 44 | end |
... | ... | @@ -48,6 +50,7 @@ class Ability |
48 | 50 | [ |
49 | 51 | :"read_#{name}", |
50 | 52 | :"write_#{name}", |
53 | + :"modify_#{name}", | |
51 | 54 | :"admin_#{name}" |
52 | 55 | ] |
53 | 56 | else | ... | ... |
app/models/project.rb
... | ... | @@ -161,6 +161,18 @@ class Project < ActiveRecord::Base |
161 | 161 | @admins ||= users_projects.includes(:user).where(:project_access => PROJECT_RWA).map(&:user) |
162 | 162 | end |
163 | 163 | |
164 | + def allow_read_for?(user) | |
165 | + !users_projects.where(:user_id => user.id, :project_access => [PROJECT_R, PROJECT_RW, PROJECT_RWA]).empty? | |
166 | + end | |
167 | + | |
168 | + def allow_write_for?(user) | |
169 | + !users_projects.where(:user_id => user.id, :project_access => [PROJECT_RW, PROJECT_RWA]).empty? | |
170 | + end | |
171 | + | |
172 | + def allow_admin_for?(user) | |
173 | + !users_projects.where(:user_id => user.id, :project_access => [PROJECT_RWA]).empty? || owner_id == user.id | |
174 | + end | |
175 | + | |
164 | 176 | def root_ref |
165 | 177 | default_branch || "master" |
166 | 178 | end | ... | ... |