To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / lib / redmine / access_control.rb @ 1298:4f746d8966dd
History | View | Annotate | Download (3.72 KB)
| 1 | 909:cbb26bc654de | Chris | # Redmine - project management software
|
|---|---|---|---|
| 2 | 1295:622f24f53b42 | Chris | # Copyright (C) 2006-2013 Jean-Philippe Lang
|
| 3 | 0:513646585e45 | Chris | #
|
| 4 | # This program is free software; you can redistribute it and/or
|
||
| 5 | # modify it under the terms of the GNU General Public License
|
||
| 6 | # as published by the Free Software Foundation; either version 2
|
||
| 7 | # of the License, or (at your option) any later version.
|
||
| 8 | 909:cbb26bc654de | Chris | #
|
| 9 | 0:513646585e45 | Chris | # This program is distributed in the hope that it will be useful,
|
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
| 12 | # GNU General Public License for more details.
|
||
| 13 | 909:cbb26bc654de | Chris | #
|
| 14 | 0:513646585e45 | Chris | # You should have received a copy of the GNU General Public License
|
| 15 | # along with this program; if not, write to the Free Software
|
||
| 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
| 17 | |||
| 18 | module Redmine |
||
| 19 | module AccessControl |
||
| 20 | 909:cbb26bc654de | Chris | |
| 21 | 0:513646585e45 | Chris | class << self |
| 22 | def map |
||
| 23 | mapper = Mapper.new
|
||
| 24 | yield mapper
|
||
| 25 | @permissions ||= []
|
||
| 26 | @permissions += mapper.mapped_permissions
|
||
| 27 | end
|
||
| 28 | 909:cbb26bc654de | Chris | |
| 29 | 0:513646585e45 | Chris | def permissions |
| 30 | @permissions
|
||
| 31 | end
|
||
| 32 | 909:cbb26bc654de | Chris | |
| 33 | 0:513646585e45 | Chris | # Returns the permission of given name or nil if it wasn't found
|
| 34 | # Argument should be a symbol
|
||
| 35 | def permission(name) |
||
| 36 | permissions.detect {|p| p.name == name}
|
||
| 37 | end
|
||
| 38 | 909:cbb26bc654de | Chris | |
| 39 | 0:513646585e45 | Chris | # Returns the actions that are allowed by the permission of given name
|
| 40 | def allowed_actions(permission_name) |
||
| 41 | perm = permission(permission_name) |
||
| 42 | perm ? perm.actions : [] |
||
| 43 | end
|
||
| 44 | 909:cbb26bc654de | Chris | |
| 45 | 0:513646585e45 | Chris | def public_permissions |
| 46 | @public_permissions ||= @permissions.select {|p| p.public?} |
||
| 47 | end
|
||
| 48 | 909:cbb26bc654de | Chris | |
| 49 | 0:513646585e45 | Chris | def members_only_permissions |
| 50 | @members_only_permissions ||= @permissions.select {|p| p.require_member?} |
||
| 51 | end
|
||
| 52 | 909:cbb26bc654de | Chris | |
| 53 | 0:513646585e45 | Chris | def loggedin_only_permissions |
| 54 | @loggedin_only_permissions ||= @permissions.select {|p| p.require_loggedin?} |
||
| 55 | end
|
||
| 56 | 909:cbb26bc654de | Chris | |
| 57 | 1115:433d4f72a19b | Chris | def read_action?(action) |
| 58 | if action.is_a?(Symbol) |
||
| 59 | perm = permission(action) |
||
| 60 | !perm.nil? && perm.read? |
||
| 61 | else
|
||
| 62 | s = "#{action[:controller]}/#{action[:action]}"
|
||
| 63 | permissions.detect {|p| p.actions.include?(s) && !p.read?}.nil?
|
||
| 64 | end
|
||
| 65 | end
|
||
| 66 | |||
| 67 | 0:513646585e45 | Chris | def available_project_modules |
| 68 | @available_project_modules ||= @permissions.collect(&:project_module).uniq.compact |
||
| 69 | end
|
||
| 70 | 909:cbb26bc654de | Chris | |
| 71 | 0:513646585e45 | Chris | def modules_permissions(modules) |
| 72 | @permissions.select {|p| p.project_module.nil? || modules.include?(p.project_module.to_s)}
|
||
| 73 | end
|
||
| 74 | end
|
||
| 75 | 909:cbb26bc654de | Chris | |
| 76 | 0:513646585e45 | Chris | class Mapper |
| 77 | def initialize |
||
| 78 | @project_module = nil |
||
| 79 | end
|
||
| 80 | 909:cbb26bc654de | Chris | |
| 81 | 0:513646585e45 | Chris | def permission(name, hash, options={}) |
| 82 | @permissions ||= []
|
||
| 83 | options.merge!(:project_module => @project_module) |
||
| 84 | @permissions << Permission.new(name, hash, options) |
||
| 85 | end
|
||
| 86 | 909:cbb26bc654de | Chris | |
| 87 | 0:513646585e45 | Chris | def project_module(name, options={}) |
| 88 | @project_module = name
|
||
| 89 | yield self |
||
| 90 | @project_module = nil |
||
| 91 | end
|
||
| 92 | 909:cbb26bc654de | Chris | |
| 93 | 0:513646585e45 | Chris | def mapped_permissions |
| 94 | @permissions
|
||
| 95 | end
|
||
| 96 | end
|
||
| 97 | 909:cbb26bc654de | Chris | |
| 98 | 0:513646585e45 | Chris | class Permission |
| 99 | attr_reader :name, :actions, :project_module |
||
| 100 | 909:cbb26bc654de | Chris | |
| 101 | 0:513646585e45 | Chris | def initialize(name, hash, options) |
| 102 | @name = name
|
||
| 103 | @actions = []
|
||
| 104 | @public = options[:public] || false |
||
| 105 | @require = options[:require] |
||
| 106 | 1115:433d4f72a19b | Chris | @read = options[:read] || false |
| 107 | 0:513646585e45 | Chris | @project_module = options[:project_module] |
| 108 | hash.each do |controller, actions|
|
||
| 109 | if actions.is_a? Array |
||
| 110 | @actions << actions.collect {|action| "#{controller}/#{action}"} |
||
| 111 | else
|
||
| 112 | @actions << "#{controller}/#{actions}" |
||
| 113 | end
|
||
| 114 | end
|
||
| 115 | @actions.flatten!
|
||
| 116 | end
|
||
| 117 | 909:cbb26bc654de | Chris | |
| 118 | 0:513646585e45 | Chris | def public? |
| 119 | @public
|
||
| 120 | end
|
||
| 121 | 909:cbb26bc654de | Chris | |
| 122 | 0:513646585e45 | Chris | def require_member? |
| 123 | @require && @require == :member |
||
| 124 | end
|
||
| 125 | 909:cbb26bc654de | Chris | |
| 126 | 0:513646585e45 | Chris | def require_loggedin? |
| 127 | @require && (@require == :member || @require == :loggedin) |
||
| 128 | end
|
||
| 129 | 1115:433d4f72a19b | Chris | |
| 130 | def read? |
||
| 131 | @read
|
||
| 132 | end
|
||
| 133 | 909:cbb26bc654de | Chris | end
|
| 134 | 0:513646585e45 | Chris | end
|
| 135 | end |