lib/cbac.rb in cbac-0.6.1 vs lib/cbac.rb in cbac-0.6.2
- old
+ new
@@ -1,132 +1,132 @@
-# TODO: Check the permission table for double entries, ie: both an entry in the
-# generic_role_id field and an entry in the context_role field. Solution: solve
-# via model. Update model & add test
-require "cbac/setup"
-require "cbac/config"
-require "cbac/context_role"
-require "cbac/generic_role"
-require "cbac/known_permission"
-require "cbac/membership"
-require "cbac/permission"
-require "cbac/privilege"
-require "cbac/privilege_new_api"
-require "cbac/privilege_set"
-require "cbac/privilege_set_record"
-require "cbac/cbac_pristine/pristine"
-require "cbac/cbac_pristine/pristine_file"
-require "cbac/cbac_pristine/pristine_permission"
-require "cbac/cbac_pristine/pristine_role"
-
-# The following code contains configuration options. You can turn them on for
-# gem development. For actual usage, it is advisable to set the configuration
-# options in the environment files.
-Cbac::Config.verbose = true
-
-# Module containing the bootstrap code
-module Cbac
- def cbac_boot!
- if Cbac::Setup.check
- puts "CBAC properly installed"
-
- require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/privilege'))
- require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/privilege_set'))
- require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/context_role'))
- require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/cbac_pristine/pristine'))
- require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/cbac_pristine/pristine_file'))
- require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/cbac_pristine/pristine_permission'))
-
- # check performs a check to see if the user is allowed to access the given
- # resource. Example: authorization_check("BlogController", "index", :get)
- def authorization_check(controller, action, request, context = {})
- # Determine the controller to look for
- controller_method = [controller, action].join("/")
- # Get the privilegesets
- privilege_sets = Privilege.select(controller_method, request)
- # Check the privilege sets
- check_privilege_sets(privilege_sets, context)
- end
-
- # Check the given privilege_set symbol
- # TODO following code is not yet tested
- def check_privilege_set(privilege_set, context = {})
- check_privilege_sets([PrivilegeSet.sets[privilege_set.to_sym]], context)
- end
-
- # Check the given privilege_sets
- def check_privilege_sets(privilege_sets, context = {})
- # Check the generic roles
- return true if privilege_sets.any? { |set| Cbac::GenericRole.find(:all, :conditions => ["user_id= ? AND privilege_set_id = ?", current_user, set.id],:joins => [:generic_role_members, :permissions]).length > 0 }
- # Check the context roles Get the permissions
- privilege_sets.collect{|privilege_set|Cbac::Permission.find(:all, :conditions => ["privilege_set_id = ? AND generic_role_id = 0", privilege_set.id.to_s])}.flatten.each do |permission|
- puts "Checking for context_role:#{permission.context_role} on privilege_set:#{permission.privilege_set.name}" if Cbac::Config.verbose
- eval_string = ContextRole.roles[permission.context_role.to_sym]
- begin
- return true if eval_string.call(context)
- rescue Exception => e
- puts "Error in context role: #{permission.context_role} on privilege_set: #{permission.privilege_set.name}. Context: #{context}"
- raise e if RAILS_ENV == "development" or RAILS_ENV == "test" # In development mode, this should crash as hard as possible, but in further stages, it should not
- end
- end
- # not authorized
- puts "Not authorized for: #{privilege_sets.to_s}" if Cbac::Config.verbose
- false
- end
-
- # Code that performs authorization
- def authorize
- authorization_check(params[:controller], params[:action], request.request_method.downcase, self) || unauthorized
- end
-
- # Default unauthorized method Override this method to supply your own code
- # for incorrect authorization
- def unauthorized
- render :text => "You are not authorized to perform this action", :status => 401
- end
-
- # Default implementation of the current_user method
- def current_user_id
- session[:currentuser].to_i
- end
-
- # Load controller classes and methods
- def load_controller_methods
- begin
- Dir.glob("app/controllers/**/*.rb").each{|file| require file}
- rescue LoadError
- raise "Could not load controller classes"
- end
- # Make this iterative TODO
- @classes = ApplicationController.subclasses
- end
-
- # Extracts the class name from the filename
- def extract_class_name(filename)
- File.basename(filename).chomp(".rb").camelize
- end
-
- # ### Initializer Include privileges file - contains the privilege and
- # privilege definitions
- begin
- require File.join(::Rails.root.to_s, "config", "cbac", "privileges.rb")
- rescue MissingSourceFile
- puts "CBAC warning: Could not load config/cbac/privileges.rb (Did you run ./script/generate cbac?)"
- end
- # Include context roles file - contains the context role definitions
- begin
- require File.join(::Rails.root.to_s, "config", "cbac", "context_roles.rb")
- rescue MissingSourceFile
- puts "CBAC warning: Could not load config/cbac/context_roles.rb (Did you run ./script/generate cbac?)"
- end
-
- # ### Database autoload code
- else
- # This is the code that is executed if CBAc is not properly installed/
- # configured. It includes a different authorize method, aimes at refusing
- # all authorizations
- def authorize
- render :text => "Authorization error", :status => 401
- false
- end
- end
- end
-end
+# TODO: Check the permission table for double entries, ie: both an entry in the
+# generic_role_id field and an entry in the context_role field. Solution: solve
+# via model. Update model & add test
+require "cbac/setup"
+require "cbac/config"
+require "cbac/context_role"
+require "cbac/generic_role"
+require "cbac/known_permission"
+require "cbac/membership"
+require "cbac/permission"
+require "cbac/privilege"
+require "cbac/privilege_new_api"
+require "cbac/privilege_set"
+require "cbac/privilege_set_record"
+require "cbac/cbac_pristine/pristine"
+require "cbac/cbac_pristine/pristine_file"
+require "cbac/cbac_pristine/pristine_permission"
+require "cbac/cbac_pristine/pristine_role"
+
+# The following code contains configuration options. You can turn them on for
+# gem development. For actual usage, it is advisable to set the configuration
+# options in the environment files.
+Cbac::Config.verbose = true
+
+# Module containing the bootstrap code
+module Cbac
+ def cbac_boot!
+ if Cbac::Setup.check
+ puts "CBAC properly installed"
+
+ require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/privilege'))
+ require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/privilege_set'))
+ require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/context_role'))
+ require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/cbac_pristine/pristine'))
+ require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/cbac_pristine/pristine_file'))
+ require File.expand_path(File.join(File.dirname(__FILE__), '/cbac/cbac_pristine/pristine_permission'))
+
+ # check performs a check to see if the user is allowed to access the given
+ # resource. Example: authorization_check("BlogController", "index", :get)
+ def authorization_check(controller, action, request, context = {})
+ # Determine the controller to look for
+ controller_method = [controller, action].join("/")
+ # Get the privilegesets
+ privilege_sets = Privilege.select(controller_method, request)
+ # Check the privilege sets
+ check_privilege_sets(privilege_sets, context)
+ end
+
+ # Check the given privilege_set symbol
+ # TODO following code is not yet tested
+ def check_privilege_set(privilege_set, context = {})
+ check_privilege_sets([PrivilegeSet.sets[privilege_set.to_sym]], context)
+ end
+
+ # Check the given privilege_sets
+ def check_privilege_sets(privilege_sets, context = {})
+ # Check the generic roles
+ return true if privilege_sets.any? { |set| Cbac::GenericRole.find(:all, :conditions => ["user_id= ? AND privilege_set_id = ?", current_user, set.id],:joins => [:generic_role_members, :permissions]).length > 0 }
+ # Check the context roles Get the permissions
+ privilege_sets.collect{|privilege_set|Cbac::Permission.find(:all, :conditions => ["privilege_set_id = ? AND generic_role_id = 0", privilege_set.id.to_s])}.flatten.each do |permission|
+ puts "Checking for context_role:#{permission.context_role} on privilege_set:#{permission.privilege_set.name}" if Cbac::Config.verbose
+ eval_string = ContextRole.roles[permission.context_role.to_sym]
+ begin
+ return true if eval_string.call(context)
+ rescue Exception => e
+ puts "Error in context role: #{permission.context_role} on privilege_set: #{permission.privilege_set.name}. Context: #{context}"
+ raise e if RAILS_ENV == "development" or RAILS_ENV == "test" # In development mode, this should crash as hard as possible, but in further stages, it should not
+ end
+ end
+ # not authorized
+ puts "Not authorized for: #{privilege_sets.to_s}" if Cbac::Config.verbose
+ false
+ end
+
+ # Code that performs authorization
+ def authorize
+ authorization_check(params[:controller], params[:action], request.request_method.downcase, self) || unauthorized
+ end
+
+ # Default unauthorized method Override this method to supply your own code
+ # for incorrect authorization
+ def unauthorized
+ render :text => "You are not authorized to perform this action", :status => 401
+ end
+
+ # Default implementation of the current_user method
+ def current_user_id
+ session[:currentuser].to_i
+ end
+
+ # Load controller classes and methods
+ def load_controller_methods
+ begin
+ Dir.glob("app/controllers/**/*.rb").each{|file| require file}
+ rescue LoadError
+ raise "Could not load controller classes"
+ end
+ # Make this iterative TODO
+ @classes = ApplicationController.subclasses
+ end
+
+ # Extracts the class name from the filename
+ def extract_class_name(filename)
+ File.basename(filename).chomp(".rb").camelize
+ end
+
+ # ### Initializer Include privileges file - contains the privilege and
+ # privilege definitions
+ begin
+ require File.join(::Rails.root.to_s, "config", "cbac", "privileges.rb")
+ rescue MissingSourceFile
+ puts "CBAC warning: Could not load config/cbac/privileges.rb (Did you run ./script/generate cbac?)"
+ end
+ # Include context roles file - contains the context role definitions
+ begin
+ require File.join(::Rails.root.to_s, "config", "cbac", "context_roles.rb")
+ rescue MissingSourceFile
+ puts "CBAC warning: Could not load config/cbac/context_roles.rb (Did you run ./script/generate cbac?)"
+ end
+
+ # ### Database autoload code
+ else
+ # This is the code that is executed if CBAc is not properly installed/
+ # configured. It includes a different authorize method, aimes at refusing
+ # all authorizations
+ def authorize
+ render :text => "Authorization error", :status => 401
+ false
+ end
+ end
+ end
+end