Commit 8c40aab120dbc5507ab9cc8d7ad8e2519d6e9f25
1 parent
af82b677
Exists in
master
and in
4 other branches
Abilities extended. Resources security improved
Showing
16 changed files
with
51 additions
and
52 deletions
Show diff stats
app/controllers/application_controller.rb
@@ -48,6 +48,10 @@ class ApplicationController < ActionController::Base | @@ -48,6 +48,10 @@ class ApplicationController < ActionController::Base | ||
48 | return render_404 unless can?(current_user, action, project) | 48 | return render_404 unless can?(current_user, action, project) |
49 | end | 49 | end |
50 | 50 | ||
51 | + def authorize_code_access! | ||
52 | + return render_404 unless can?(current_user, :download_code, project) | ||
53 | + end | ||
54 | + | ||
51 | def access_denied! | 55 | def access_denied! |
52 | render_404 | 56 | render_404 |
53 | end | 57 | end |
app/controllers/commits_controller.rb
@@ -7,6 +7,7 @@ class CommitsController < ApplicationController | @@ -7,6 +7,7 @@ class CommitsController < ApplicationController | ||
7 | # Authorize | 7 | # Authorize |
8 | before_filter :add_project_abilities | 8 | before_filter :add_project_abilities |
9 | before_filter :authorize_read_project! | 9 | before_filter :authorize_read_project! |
10 | + before_filter :authorize_code_access! | ||
10 | before_filter :require_non_empty_project | 11 | before_filter :require_non_empty_project |
11 | before_filter :load_refs, :only => :index # load @branch, @tag & @ref | 12 | before_filter :load_refs, :only => :index # load @branch, @tag & @ref |
12 | before_filter :render_full_content | 13 | before_filter :render_full_content |
app/controllers/issues_controller.rb
@@ -126,12 +126,11 @@ class IssuesController < ApplicationController | @@ -126,12 +126,11 @@ class IssuesController < ApplicationController | ||
126 | end | 126 | end |
127 | 127 | ||
128 | def authorize_modify_issue! | 128 | def authorize_modify_issue! |
129 | - can?(current_user, :modify_issue, @issue) || | ||
130 | - @issue.assignee == current_user | 129 | + return render_404 unless can?(current_user, :modify_issue, @issue) |
131 | end | 130 | end |
132 | 131 | ||
133 | def authorize_admin_issue! | 132 | def authorize_admin_issue! |
134 | - can?(current_user, :admin_issue, @issue) | 133 | + return render_404 unless can?(current_user, :admin_issue, @issue) |
135 | end | 134 | end |
136 | 135 | ||
137 | def module_enabled | 136 | def module_enabled |
app/controllers/merge_requests_controller.rb
@@ -112,12 +112,11 @@ class MergeRequestsController < ApplicationController | @@ -112,12 +112,11 @@ class MergeRequestsController < ApplicationController | ||
112 | end | 112 | end |
113 | 113 | ||
114 | def authorize_modify_merge_request! | 114 | def authorize_modify_merge_request! |
115 | - can?(current_user, :modify_merge_request, @merge_request) || | ||
116 | - @merge_request.assignee == current_user | 115 | + return render_404 unless can?(current_user, :modify_merge_request, @merge_request) |
117 | end | 116 | end |
118 | 117 | ||
119 | def authorize_admin_merge_request! | 118 | def authorize_admin_merge_request! |
120 | - can?(current_user, :admin_merge_request, @merge_request) | 119 | + return render_404 unless can?(current_user, :admin_merge_request, @merge_request) |
121 | end | 120 | end |
122 | 121 | ||
123 | def module_enabled | 122 | def module_enabled |
app/controllers/refs_controller.rb
@@ -4,6 +4,7 @@ class RefsController < ApplicationController | @@ -4,6 +4,7 @@ class RefsController < ApplicationController | ||
4 | # Authorize | 4 | # Authorize |
5 | before_filter :add_project_abilities | 5 | before_filter :add_project_abilities |
6 | before_filter :authorize_read_project! | 6 | before_filter :authorize_read_project! |
7 | + before_filter :authorize_code_access! | ||
7 | before_filter :require_non_empty_project | 8 | before_filter :require_non_empty_project |
8 | 9 | ||
9 | before_filter :ref | 10 | before_filter :ref |
app/controllers/repositories_controller.rb
@@ -4,6 +4,7 @@ class RepositoriesController < ApplicationController | @@ -4,6 +4,7 @@ class RepositoriesController < ApplicationController | ||
4 | # Authorize | 4 | # Authorize |
5 | before_filter :add_project_abilities | 5 | before_filter :add_project_abilities |
6 | before_filter :authorize_read_project! | 6 | before_filter :authorize_read_project! |
7 | + before_filter :authorize_code_access! | ||
7 | before_filter :require_non_empty_project | 8 | before_filter :require_non_empty_project |
8 | before_filter :render_full_content | 9 | before_filter :render_full_content |
9 | 10 |
app/controllers/snippets_controller.rb
1 | class SnippetsController < ApplicationController | 1 | class SnippetsController < ApplicationController |
2 | before_filter :authenticate_user! | 2 | before_filter :authenticate_user! |
3 | before_filter :project | 3 | before_filter :project |
4 | + before_filter :snippet, :only => [:show, :edit, :destroy, :update] | ||
4 | layout "project" | 5 | layout "project" |
5 | 6 | ||
6 | # Authorize | 7 | # Authorize |
@@ -41,11 +42,9 @@ class SnippetsController < ApplicationController | @@ -41,11 +42,9 @@ class SnippetsController < ApplicationController | ||
41 | end | 42 | end |
42 | 43 | ||
43 | def edit | 44 | def edit |
44 | - @snippet = @project.snippets.find(params[:id]) | ||
45 | end | 45 | end |
46 | 46 | ||
47 | def update | 47 | def update |
48 | - @snippet = @project.snippets.find(params[:id]) | ||
49 | @snippet.update_attributes(params[:snippet]) | 48 | @snippet.update_attributes(params[:snippet]) |
50 | 49 | ||
51 | if @snippet.valid? | 50 | if @snippet.valid? |
@@ -56,15 +55,12 @@ class SnippetsController < ApplicationController | @@ -56,15 +55,12 @@ class SnippetsController < ApplicationController | ||
56 | end | 55 | end |
57 | 56 | ||
58 | def show | 57 | def show |
59 | - @snippet = @project.snippets.find(params[:id]) | ||
60 | @notes = @snippet.notes | 58 | @notes = @snippet.notes |
61 | @note = @project.notes.new(:noteable => @snippet) | 59 | @note = @project.notes.new(:noteable => @snippet) |
62 | render_full_content | 60 | render_full_content |
63 | end | 61 | end |
64 | 62 | ||
65 | def destroy | 63 | def destroy |
66 | - @snippet = @project.snippets.find(params[:id]) | ||
67 | - | ||
68 | return access_denied! unless can?(current_user, :admin_snippet, @snippet) | 64 | return access_denied! unless can?(current_user, :admin_snippet, @snippet) |
69 | 65 | ||
70 | @snippet.destroy | 66 | @snippet.destroy |
@@ -73,12 +69,15 @@ class SnippetsController < ApplicationController | @@ -73,12 +69,15 @@ class SnippetsController < ApplicationController | ||
73 | end | 69 | end |
74 | 70 | ||
75 | protected | 71 | protected |
72 | + def snippet | ||
73 | + @snippet ||= @project.snippets.find(params[:id]) | ||
74 | + end | ||
76 | 75 | ||
77 | def authorize_modify_snippet! | 76 | def authorize_modify_snippet! |
78 | - can?(current_user, :modify_snippet, @snippet) | 77 | + return render_404 unless can?(current_user, :modify_snippet, @snippet) |
79 | end | 78 | end |
80 | 79 | ||
81 | def authorize_admin_snippet! | 80 | def authorize_admin_snippet! |
82 | - can?(current_user, :admin_snippet, @snippet) | 81 | + return render_404 unless can?(current_user, :admin_snippet, @snippet) |
83 | end | 82 | end |
84 | end | 83 | end |
app/controllers/wikis_controller.rb
@@ -2,7 +2,7 @@ class WikisController < ApplicationController | @@ -2,7 +2,7 @@ class WikisController < ApplicationController | ||
2 | before_filter :project | 2 | before_filter :project |
3 | before_filter :add_project_abilities | 3 | before_filter :add_project_abilities |
4 | before_filter :authorize_read_wiki! | 4 | before_filter :authorize_read_wiki! |
5 | - before_filter :authorize_write_wiki!, :except => [:show, :destroy] | 5 | + before_filter :authorize_write_wiki!, :only => [:edit, :create, :history] |
6 | before_filter :authorize_admin_wiki!, :only => :destroy | 6 | before_filter :authorize_admin_wiki!, :only => :destroy |
7 | layout "project" | 7 | layout "project" |
8 | 8 | ||
@@ -12,6 +12,11 @@ class WikisController < ApplicationController | @@ -12,6 +12,11 @@ class WikisController < ApplicationController | ||
12 | else | 12 | else |
13 | @wiki = @project.wikis.where(:slug => params[:id]).order("created_at").last | 13 | @wiki = @project.wikis.where(:slug => params[:id]).order("created_at").last |
14 | end | 14 | end |
15 | + | ||
16 | + unless @wiki | ||
17 | + return render_404 unless can?(current_user, :write_wiki, @project) | ||
18 | + end | ||
19 | + | ||
15 | respond_to do |format| | 20 | respond_to do |format| |
16 | if @wiki | 21 | if @wiki |
17 | format.html | 22 | format.html |
@@ -51,18 +56,4 @@ class WikisController < ApplicationController | @@ -51,18 +56,4 @@ class WikisController < ApplicationController | ||
51 | format.html { redirect_to project_wiki_path(@project, :index), notice: "Page was successfully deleted" } | 56 | format.html { redirect_to project_wiki_path(@project, :index), notice: "Page was successfully deleted" } |
52 | end | 57 | end |
53 | end | 58 | end |
54 | - | ||
55 | - protected | ||
56 | - | ||
57 | - def authorize_read_wiki! | ||
58 | - can?(current_user, :read_wiki, @project) | ||
59 | - end | ||
60 | - | ||
61 | - def authorize_write_wiki! | ||
62 | - can?(current_user, :write_wiki, @project) | ||
63 | - end | ||
64 | - | ||
65 | - def authorize_admin_wiki! | ||
66 | - can?(current_user, :admin_wiki, @project) | ||
67 | - end | ||
68 | end | 59 | end |
app/models/ability.rb
@@ -5,7 +5,7 @@ class Ability | @@ -5,7 +5,7 @@ class Ability | ||
5 | when "Issue" then issue_abilities(object, subject) | 5 | when "Issue" then issue_abilities(object, subject) |
6 | when "Note" then note_abilities(object, subject) | 6 | when "Note" then note_abilities(object, subject) |
7 | when "Snippet" then snippet_abilities(object, subject) | 7 | when "Snippet" then snippet_abilities(object, subject) |
8 | - when "Wiki" then wiki_abilities(object, subject) | 8 | + when "MergeRequest" then merge_request_abilities(object, subject) |
9 | else [] | 9 | else [] |
10 | end | 10 | end |
11 | end | 11 | end |
@@ -23,13 +23,13 @@ class Ability | @@ -23,13 +23,13 @@ class Ability | ||
23 | :read_note, | 23 | :read_note, |
24 | :write_project, | 24 | :write_project, |
25 | :write_issue, | 25 | :write_issue, |
26 | - :write_snippet, | ||
27 | - :write_merge_request, | ||
28 | :write_note | 26 | :write_note |
29 | ] if project.guest_access_for?(user) | 27 | ] if project.guest_access_for?(user) |
30 | 28 | ||
31 | rules << [ | 29 | rules << [ |
32 | :download_code, | 30 | :download_code, |
31 | + :write_merge_request, | ||
32 | + :write_snippet | ||
33 | ] if project.report_access_for?(user) | 33 | ] if project.report_access_for?(user) |
34 | 34 | ||
35 | rules << [ | 35 | rules << [ |
@@ -39,7 +39,7 @@ class Ability | @@ -39,7 +39,7 @@ class Ability | ||
39 | rules << [ | 39 | rules << [ |
40 | :modify_issue, | 40 | :modify_issue, |
41 | :modify_snippet, | 41 | :modify_snippet, |
42 | - :modify_wiki, | 42 | + :modify_merge_request, |
43 | :admin_project, | 43 | :admin_project, |
44 | :admin_issue, | 44 | :admin_issue, |
45 | :admin_snippet, | 45 | :admin_snippet, |
@@ -47,7 +47,7 @@ class Ability | @@ -47,7 +47,7 @@ class Ability | ||
47 | :admin_merge_request, | 47 | :admin_merge_request, |
48 | :admin_note, | 48 | :admin_note, |
49 | :admin_wiki | 49 | :admin_wiki |
50 | - ] if project.master_access_for?(user) | 50 | + ] if project.master_access_for?(user) || project.owner == user |
51 | 51 | ||
52 | 52 | ||
53 | rules.flatten | 53 | rules.flatten |
@@ -63,6 +63,12 @@ class Ability | @@ -63,6 +63,12 @@ class Ability | ||
63 | :"modify_#{name}", | 63 | :"modify_#{name}", |
64 | :"admin_#{name}" | 64 | :"admin_#{name}" |
65 | ] | 65 | ] |
66 | + elsif subject.respond_to?(:assignee) && subject.assignee == user | ||
67 | + [ | ||
68 | + :"read_#{name}", | ||
69 | + :"write_#{name}", | ||
70 | + :"modify_#{name}", | ||
71 | + ] | ||
66 | else | 72 | else |
67 | subject.respond_to?(:project) ? | 73 | subject.respond_to?(:project) ? |
68 | project_abilities(user, subject.project) : [] | 74 | project_abilities(user, subject.project) : [] |
app/models/project.rb
@@ -188,7 +188,7 @@ class Project < ActiveRecord::Base | @@ -188,7 +188,7 @@ class Project < ActiveRecord::Base | ||
188 | elsif access.include?(:write) | 188 | elsif access.include?(:write) |
189 | { :project_access => UsersProject::DEVELOPER } | 189 | { :project_access => UsersProject::DEVELOPER } |
190 | else | 190 | else |
191 | - { :project_access => UsersProject::GUEST } | 191 | + { :project_access => UsersProject::REPORTER } |
192 | end | 192 | end |
193 | opts = { :user => user } | 193 | opts = { :user => user } |
194 | opts.merge!(access) | 194 | opts.merge!(access) |
app/views/help/permissions.html.haml
@@ -4,15 +4,17 @@ | @@ -4,15 +4,17 @@ | ||
4 | %h4 Guest | 4 | %h4 Guest |
5 | %ul | 5 | %ul |
6 | %li Create new issue | 6 | %li Create new issue |
7 | - %li Create new merge request | 7 | + %li Leave comments |
8 | %li Write on project wall | 8 | %li Write on project wall |
9 | 9 | ||
10 | %h4 Reporter | 10 | %h4 Reporter |
11 | %ul | 11 | %ul |
12 | %li Pull project code | 12 | %li Pull project code |
13 | + %li Download project | ||
13 | %li Create new issue | 14 | %li Create new issue |
14 | %li Create new merge request | 15 | %li Create new merge request |
15 | %li Write on project wall | 16 | %li Write on project wall |
17 | + %li Create a code snippets | ||
16 | 18 | ||
17 | 19 | ||
18 | %h4 Developer | 20 | %h4 Developer |
@@ -25,6 +27,7 @@ | @@ -25,6 +27,7 @@ | ||
25 | %li Create new issue | 27 | %li Create new issue |
26 | %li Create new merge request | 28 | %li Create new merge request |
27 | %li Write on project wall | 29 | %li Write on project wall |
30 | + %li Write a wiki | ||
28 | 31 | ||
29 | %h4 Master | 32 | %h4 Master |
30 | %ul | 33 | %ul |
app/views/issues/_show.html.haml
1 | %li.wll{ :id => dom_id(issue), :class => "issue #{issue.critical ? "critical" : ""}", :url => project_issue_path(issue.project, issue) } | 1 | %li.wll{ :id => dom_id(issue), :class => "issue #{issue.critical ? "critical" : ""}", :url => project_issue_path(issue.project, issue) } |
2 | .right | 2 | .right |
3 | - - if can? current_user, :write_issue, issue | 3 | + - if can? current_user, :modify_issue, issue |
4 | - if issue.closed | 4 | - if issue.closed |
5 | = link_to 'Reopen', project_issue_path(issue.project, issue, :issue => {:closed => false }, :status_only => true), :method => :put, :class => "btn small", :remote => true | 5 | = link_to 'Reopen', project_issue_path(issue.project, issue, :issue => {:closed => false }, :status_only => true), :method => :put, :class => "btn small", :remote => true |
6 | - else | 6 | - else |
7 | = link_to 'Resolve', project_issue_path(issue.project, issue, :issue => {:closed => true }, :status_only => true), :method => :put, :class => "success btn small", :remote => true | 7 | = link_to 'Resolve', project_issue_path(issue.project, issue, :issue => {:closed => true }, :status_only => true), :method => :put, :class => "success btn small", :remote => true |
8 | - - if can? current_user, :write_issue, issue | ||
9 | = link_to 'Edit', edit_project_issue_path(issue.project, issue), :class => "btn small edit-issue-link", :remote => true | 8 | = link_to 'Edit', edit_project_issue_path(issue.project, issue), :class => "btn small edit-issue-link", :remote => true |
10 | -#- if can?(current_user, :admin_issue, @project) || issue.author == current_user | 9 | -#- if can?(current_user, :admin_issue, @project) || issue.author == current_user |
11 | = link_to 'Remove', [issue.project, issue], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "danger btn small delete-issue", :id => "destroy_issue_#{issue.id}" | 10 | = link_to 'Remove', [issue.project, issue], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "danger btn small delete-issue", :id => "destroy_issue_#{issue.id}" |
app/views/layouts/_project_menu.html.haml
@@ -4,8 +4,9 @@ | @@ -4,8 +4,9 @@ | ||
4 | Project | 4 | Project |
5 | 5 | ||
6 | - if @project.repo_exists? | 6 | - if @project.repo_exists? |
7 | - = link_to "Files", tree_project_ref_path(@project, @project.root_ref), :class => tree_tab_class | ||
8 | - = link_to "Commits", project_commits_path(@project), :class => commit_tab_class | 7 | + - if can? current_user, :download_code, @project |
8 | + = link_to "Files", tree_project_ref_path(@project, @project.root_ref), :class => tree_tab_class | ||
9 | + = link_to "Commits", project_commits_path(@project), :class => commit_tab_class | ||
9 | 10 | ||
10 | = link_to "Network", graph_project_path(@project), :class => current_page?(:controller => "projects", :action => "graph", :id => @project) ? "current" : nil | 11 | = link_to "Network", graph_project_path(@project), :class => current_page?(:controller => "projects", :action => "graph", :id => @project) ? "current" : nil |
11 | - if @project.issues_enabled | 12 | - if @project.issues_enabled |
app/views/merge_requests/show.html.haml
@@ -10,12 +10,11 @@ | @@ -10,12 +10,11 @@ | ||
10 | = @merge_request.created_at.stamp("Aug 21, 2011") | 10 | = @merge_request.created_at.stamp("Aug 21, 2011") |
11 | 11 | ||
12 | %span.right | 12 | %span.right |
13 | - - if can?(current_user, :admin_project, @project) || @merge_request.author == current_user | 13 | + - if can?(current_user, :modify_merge_request, @merge_request) |
14 | - if @merge_request.closed | 14 | - if @merge_request.closed |
15 | = link_to 'Reopen', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => false }, :status_only => true), :method => :put, :class => "btn" | 15 | = link_to 'Reopen', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => false }, :status_only => true), :method => :put, :class => "btn" |
16 | - else | 16 | - else |
17 | = link_to 'Close', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => true }, :status_only => true), :method => :put, :class => "btn", :title => "Close merge request" | 17 | = link_to 'Close', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => true }, :status_only => true), :method => :put, :class => "btn", :title => "Close merge request" |
18 | - - if can?(current_user, :admin_project, @project) || @merge_request.author == current_user | ||
19 | = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small" do | 18 | = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small" do |
20 | Edit | 19 | Edit |
21 | 20 |
app/views/widgets/_project_member.html.haml
@@ -11,23 +11,19 @@ | @@ -11,23 +11,19 @@ | ||
11 | %p | 11 | %p |
12 | - if @project.issues_enabled | 12 | - if @project.issues_enabled |
13 | %span | 13 | %span |
14 | - Assigned issues: | 14 | + Assigned Issues: |
15 | = current_user.assigned_issues.opened.count | 15 | = current_user.assigned_issues.opened.count |
16 | %br | 16 | %br |
17 | - if @project.merge_requests_enabled | 17 | - if @project.merge_requests_enabled |
18 | %span | 18 | %span |
19 | - Assigned merge request: | ||
20 | - = current_user.assigned_merge_requests.opened.count | ||
21 | - %br | ||
22 | - %span | ||
23 | - Your merge requests: | 19 | + Assigned Requests: |
24 | = current_user.assigned_merge_requests.opened.count | 20 | = current_user.assigned_merge_requests.opened.count |
25 | %br | 21 | %br |
26 | %br | 22 | %br |
27 | - - if @project.merge_requests_enabled | 23 | + - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) |
28 | = link_to new_project_merge_request_path(@project), :title => "New Merge Request", :class => "btn small padded" do | 24 | = link_to new_project_merge_request_path(@project), :title => "New Merge Request", :class => "btn small padded" do |
29 | Merge Request | 25 | Merge Request |
30 | - - if @project.issues_enabled | 26 | + - if @project.issues_enabled && can?(current_user, :write_issue, @project) |
31 | = link_to new_project_issue_path(@project), :title => "New Issue", :class => "btn small" do | 27 | = link_to new_project_issue_path(@project), :title => "New Issue", :class => "btn small" do |
32 | Issue | 28 | Issue |
33 | 29 |
app/views/wikis/show.html.haml
@@ -4,13 +4,13 @@ | @@ -4,13 +4,13 @@ | ||
4 | - if can? current_user, :write_wiki, @project | 4 | - if can? current_user, :write_wiki, @project |
5 | = link_to history_project_wiki_path(@project, @wiki), :class => "btn small padded" do | 5 | = link_to history_project_wiki_path(@project, @wiki), :class => "btn small padded" do |
6 | History | 6 | History |
7 | - = link_to edit_project_wiki_path(@project, @wiki), :class => "btn small" do | ||
8 | - Edit | 7 | + = link_to edit_project_wiki_path(@project, @wiki), :class => "btn small" do |
8 | + Edit | ||
9 | %hr | 9 | %hr |
10 | 10 | ||
11 | = markdown_to_html @wiki.content | 11 | = markdown_to_html @wiki.content |
12 | 12 | ||
13 | %p.time Last edited by #{@wiki.user.name}, in #{time_ago_in_words @wiki.created_at} | 13 | %p.time Last edited by #{@wiki.user.name}, in #{time_ago_in_words @wiki.created_at} |
14 | -- if can? current_user, :write_wiki, @project | 14 | +- if can? current_user, :admin_wiki, @project |
15 | = link_to project_wiki_path(@project, @wiki), :confirm => "Are you sure you want to delete this page?", :method => :delete do | 15 | = link_to project_wiki_path(@project, @wiki), :confirm => "Are you sure you want to delete this page?", :method => :delete do |
16 | Delete this page | 16 | Delete this page |