| 
									
										
										
										
											2019-03-16 09:37:35 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							| 
									
										
										
										
											2019-03-15 01:32:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2023-01-01 06:19:35 +00:00
										 |  |  | # Copyright (C) 2006-2023  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | # as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | # of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  | # This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with this program; if not, write to the Free Software | 
					
						
							|  |  |  | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Redmine | 
					
						
							|  |  |  |   module AccessControl | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |     class << self | 
					
						
							|  |  |  |       def map | 
					
						
							|  |  |  |         mapper = Mapper.new | 
					
						
							|  |  |  |         yield mapper | 
					
						
							|  |  |  |         @permissions ||= [] | 
					
						
							|  |  |  |         @permissions += mapper.mapped_permissions | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def permissions | 
					
						
							|  |  |  |         @permissions | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-25 18:51:03 +00:00
										 |  |  |       # Returns the permission of given name or nil if it wasn't found | 
					
						
							|  |  |  |       # Argument should be a symbol | 
					
						
							|  |  |  |       def permission(name) | 
					
						
							|  |  |  |         permissions.detect {|p| p.name == name} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-25 18:51:03 +00:00
										 |  |  |       # Returns the actions that are allowed by the permission of given name | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def allowed_actions(permission_name) | 
					
						
							| 
									
										
										
										
											2008-09-25 18:51:03 +00:00
										 |  |  |         perm = permission(permission_name) | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |         perm ? perm.actions : [] | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def public_permissions | 
					
						
							|  |  |  |         @public_permissions ||= @permissions.select {|p| p.public?} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def members_only_permissions | 
					
						
							|  |  |  |         @members_only_permissions ||= @permissions.select {|p| p.require_member?} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def loggedin_only_permissions | 
					
						
							|  |  |  |         @loggedin_only_permissions ||= @permissions.select {|p| p.require_loggedin?} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-25 17:49:35 +00:00
										 |  |  |       def read_action?(action) | 
					
						
							|  |  |  |         if action.is_a?(Symbol) | 
					
						
							|  |  |  |           perm = permission(action) | 
					
						
							|  |  |  |           !perm.nil? && perm.read? | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |         elsif action.is_a?(Hash) | 
					
						
							| 
									
										
										
										
											2012-06-25 17:49:35 +00:00
										 |  |  |           s = "#{action[:controller]}/#{action[:action]}" | 
					
						
							| 
									
										
										
										
											2014-01-11 11:47:26 +00:00
										 |  |  |           permissions.detect {|p| p.actions.include?(s) && p.read?}.present? | 
					
						
							| 
									
										
										
										
											2014-10-22 17:37:16 +00:00
										 |  |  |         else | 
					
						
							|  |  |  |           raise ArgumentError.new("Symbol or a Hash expected, #{action.class.name} given: #{action}") | 
					
						
							| 
									
										
										
										
											2012-06-25 17:49:35 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-14 11:34:08 +00:00
										 |  |  |       def available_project_modules | 
					
						
							|  |  |  |         @available_project_modules ||= @permissions.collect(&:project_module).uniq.compact | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-14 11:34:08 +00:00
										 |  |  |       def modules_permissions(modules) | 
					
						
							|  |  |  |         @permissions.select {|p| p.project_module.nil? || modules.include?(p.project_module.to_s)} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |     class Mapper | 
					
						
							| 
									
										
										
										
											2007-09-14 11:34:08 +00:00
										 |  |  |       def initialize | 
					
						
							|  |  |  |         @project_module = nil | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def permission(name, hash, options={}) | 
					
						
							|  |  |  |         @permissions ||= [] | 
					
						
							| 
									
										
										
										
											2024-02-05 13:39:02 +00:00
										 |  |  |         @permissions.reject! {|p| p.name == name} | 
					
						
							| 
									
										
										
										
											2020-10-24 05:33:23 +00:00
										 |  |  |         options[:project_module] = @project_module | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |         @permissions << Permission.new(name, hash, options) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-14 11:34:08 +00:00
										 |  |  |       def project_module(name, options={}) | 
					
						
							|  |  |  |         @project_module = name | 
					
						
							|  |  |  |         yield self | 
					
						
							|  |  |  |         @project_module = nil | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def mapped_permissions | 
					
						
							|  |  |  |         @permissions | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |     class Permission | 
					
						
							| 
									
										
										
										
											2007-09-14 11:34:08 +00:00
										 |  |  |       attr_reader :name, :actions, :project_module | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def initialize(name, hash, options) | 
					
						
							|  |  |  |         @name = name | 
					
						
							|  |  |  |         @actions = [] | 
					
						
							|  |  |  |         @public = options[:public] || false | 
					
						
							|  |  |  |         @require = options[:require] | 
					
						
							| 
									
										
										
										
											2012-06-25 17:49:35 +00:00
										 |  |  |         @read = options[:read] || false | 
					
						
							| 
									
										
										
										
											2007-09-14 11:34:08 +00:00
										 |  |  |         @project_module = options[:project_module] | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |         hash.each do |controller, actions| | 
					
						
							|  |  |  |           if actions.is_a? Array | 
					
						
							|  |  |  |             @actions << actions.collect {|action| "#{controller}/#{action}"} | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             @actions << "#{controller}/#{actions}" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2008-09-25 18:51:03 +00:00
										 |  |  |         @actions.flatten! | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def public? | 
					
						
							|  |  |  |         @public | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def require_member? | 
					
						
							|  |  |  |         @require && @require == :member | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |       def require_loggedin? | 
					
						
							|  |  |  |         @require && (@require == :member || @require == :loggedin) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2012-06-25 17:49:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       def read? | 
					
						
							|  |  |  |         @read | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2011-09-20 02:45:43 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2007-08-29 16:52:35 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | end |