<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/controllers/authorization_usages_controller.rb</filename>
    </added>
    <added>
      <filename>app/views/authorization_usages/index.html.erb</filename>
    </added>
    <added>
      <filename>test/maintenance_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -29,7 +29,8 @@ module AuthorizationRulesHelper
   
   def navigation
     link_to(&quot;Rules&quot;, authorization_rules_path) &lt;&lt; ' | ' &lt;&lt;
-    link_to(&quot;Graphical view&quot;, graph_authorization_rules_path) #&lt;&lt; ' | ' &lt;&lt;
+    link_to(&quot;Graphical view&quot;, graph_authorization_rules_path) &lt;&lt; ' | ' &lt;&lt;
+    link_to(&quot;Usages&quot;, authorization_usages_path) #&lt;&lt; ' | ' &lt;&lt;
   #  'Edit | ' &lt;&lt;
   #  link_to(&quot;XACML export&quot;, :action =&gt; 'index', :format =&gt; 'xacml')
   end
@@ -48,4 +49,36 @@ module AuthorizationRulesHelper
   def role_fill_color (role)
     role_color(role, true)
   end
+
+  def auth_usage_info_classes (auth_info)
+    classes = []
+    if auth_info[:controller_permissions]
+      if auth_info[:controller_permissions][0]
+        classes &lt;&lt; &quot;catch-all&quot; if auth_info[:controller_permissions][0].actions.include?(:all)
+        classes &lt;&lt; &quot;default-privilege&quot; unless auth_info[:controller_permissions][0].privilege
+        classes &lt;&lt; &quot;default-context&quot; unless auth_info[:controller_permissions][0].context
+        classes &lt;&lt; &quot;no-attribute-check&quot; unless auth_info[:controller_permissions][0].attribute_check
+      end
+    else
+      classes &lt;&lt; &quot;unprotected&quot;
+    end
+    classes * &quot; &quot;
+  end
+
+  def auth_usage_info_title (auth_info)
+    titles = []
+    if auth_usage_info_classes(auth_info) =~ /unprotected/
+      titles &lt;&lt; &quot;No filter_access_to call protects this action&quot;
+    end
+    if auth_usage_info_classes(auth_info) =~ /no-attribute-check/
+      titles &lt;&lt; &quot;Action is not protected with attribute check&quot;
+    end
+    if auth_usage_info_classes(auth_info) =~ /default-privilege/
+      titles &lt;&lt; &quot;Privilege set automatically from action name by :all rule&quot;
+    end
+    if auth_usage_info_classes(auth_info) =~ /default-context/
+      titles &lt;&lt; &quot;Context set automatically from controller name by filter_access_to call without :context option&quot;
+    end
+    titles * &quot;. &quot;
+  end
 end</diff>
      <filename>app/helpers/authorization_rules_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 ActionController::Routing::Routes.draw do |map|
   if Authorization::activate_authorization_rules_browser?
     map.resources :authorization_rules, :only =&gt; :index, :collection =&gt; {:graph =&gt; :get}
+    map.resources :authorization_usages, :only =&gt; :index
   end
 end
\ No newline at end of file</diff>
      <filename>config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -245,7 +245,7 @@ module Authorization
   end
   
   class ControllerPermission # :nodoc:
-    attr_reader :actions, :privilege, :context
+    attr_reader :actions, :privilege, :context, :attribute_check
     def initialize (actions, privilege, context, attribute_check = false, 
                     load_object_model = nil, load_object_method = nil,
                     filter_block = nil)</diff>
      <filename>lib/in_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -87,7 +87,7 @@ module Authorization
             :include_read =&gt; false
           }.merge(options)
           context = (options[:context] || self.table_name).to_sym
-          
+
           class_eval do
             before_create do |object|
               Authorization::Engine.instance.permit!(:create, :object =&gt; object,</diff>
      <filename>lib/in_model.rb</filename>
    </modified>
    <modified>
      <diff>@@ -49,6 +49,62 @@ module Authorization
     ensure
       Authorization.current_user = prev_user
     end
+
+    # Module for grouping usage-related helper methods
+    module Usage
+      # Delivers a hash of {ControllerClass =&gt; usage_info_hash},
+      # where usage_info_hash has the form of
+      def self.usages_by_controller
+        # load each application controller
+        begin
+          Dir.foreach(File.join(RAILS_ROOT, %w{app controllers})) do |entry|
+            if entry =~ /^\w+_controller\.rb$/
+              require File.join(RAILS_ROOT, %w{app controllers}, entry)
+            end
+          end
+        rescue Errno::ENOENT
+        end
+        controllers = []
+        ObjectSpace.each_object(Class) do |obj|
+          controllers &lt;&lt; obj if obj.ancestors.include?(ActionController::Base) and
+                                !%w{ActionController::Base ApplicationController}.include?(obj.name)
+        end
+
+        controllers.inject({}) do |memo, controller|
+          catchall_permissions = []
+          permission_by_action = {}
+          controller.all_filter_access_permissions.each do |controller_permissions|
+            catchall_permissions &lt;&lt; controller_permissions if controller_permissions.actions.include?(:all)
+            controller_permissions.actions.reject {|action| action == :all}.each do |action|
+              permission_by_action[action] = controller_permissions
+            end
+          end
+
+          actions = controller.public_instance_methods(false) - controller.hidden_actions
+          memo[controller] = actions.inject({}) do |actions_memo, action|
+            action_sym = action.to_sym
+            actions_memo[action_sym] =
+              if permission_by_action[action_sym]
+                {
+                  :privilege =&gt; permission_by_action[action_sym].privilege,
+                  :context   =&gt; permission_by_action[action_sym].context,
+                  :controller_permissions =&gt; [permission_by_action[action_sym]]
+                }
+              elsif !catchall_permissions.empty?
+                {
+                  :privilege =&gt; catchall_permissions[0].privilege,
+                  :context   =&gt; catchall_permissions[0].context,
+                  :controller_permissions =&gt; catchall_permissions
+                }
+              else
+                {}
+              end
+            actions_memo
+          end
+          memo
+        end
+      end
+    end
   end
   
   # TestHelper provides assert methods and controller request methods which</diff>
      <filename>lib/maintenance.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2c200d272a0323d4b49a16320713685633d532ac</id>
    </parent>
  </parents>
  <author>
    <name>Steffen Bartsch</name>
    <email>sbartsch@tzi.org</email>
  </author>
  <url>http://github.com/stffn/declarative_authorization/commit/0f9ecaeaaa2b28840591587cc29cf155309480a6</url>
  <id>0f9ecaeaaa2b28840591587cc29cf155309480a6</id>
  <committed-date>2009-02-22T07:45:25-08:00</committed-date>
  <authored-date>2009-02-22T06:16:48-08:00</authored-date>
  <message>Authorization usage helper view</message>
  <tree>1da05daf7a735d06a60fcf8afef20ee294ae0f1d</tree>
  <committer>
    <name>Steffen Bartsch</name>
    <email>sbartsch@tzi.org</email>
  </committer>
</commit>
