flexible_accessibility 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore CHANGED
@@ -2,8 +2,6 @@
2
2
  *.rbc
3
3
  .bundle
4
4
  .config
5
- *.sublime-project
6
- *.sublime-workspace
7
5
  coverage
8
6
  InstalledFiles
9
7
  lib/bundler/man
@@ -13,11 +11,7 @@ spec/reports
13
11
  test/tmp
14
12
  test/version_tmp
15
13
  tmp
16
- .rvmrc
17
- .DS_Store
18
- .idea
19
-
20
- # YARD artifacts
21
14
  .yardoc
22
15
  _yardoc
23
16
  doc/
17
+
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  source "http://rubygems.org"
2
+
2
3
  gemspec
3
4
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- flexible_accessibility (0.3.0)
4
+ flexible_accessibility (0.3.1)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2013 Sergey Awanesov
1
+ Copyright (c) 2012-2013 Sergey Awanesov and 7 Pikes, Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -10,9 +10,15 @@ Installation:
10
10
 
11
11
  gem "flexible_accessibility", "~> 0.3.0"
12
12
 
13
+ Do
14
+
15
+ rails g flexible_accessibility:install
16
+
17
+ to install migrations
18
+
13
19
  ======================
14
20
 
15
21
  ## Copyright
16
- Copyright (c) 2012 Sergey Awanesov and 7 Pikes, Inc.
22
+ Copyright (c) 2012-2013 Sergey Awanesov and 7 Pikes, Inc.
17
23
 
18
24
  ![7pikes logo](https://github.com/7Pikes/flexible_accessibility/wiki/Logo.png)
data/README.rdoc ADDED
File without changes
data/Rakefile CHANGED
@@ -10,8 +10,8 @@ rescue Bundler::BundlerError => e
10
10
  $stderr.puts "Run `bundle install` to install missing gems"
11
11
  exit e.status_code
12
12
  end
13
- require 'rake'
14
13
 
14
+ require 'rake'
15
15
  require 'rake/testtask'
16
16
  Rake::TestTask.new(:test) do |test|
17
17
  test.libs << 'lib' << 'test'
@@ -2,9 +2,9 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "flexible_accessibility"
5
- s.version = "0.3.0"
5
+ s.version = "0.3.1"
6
6
  s.authors = ["Sergey Awanesov"]
7
- s.date = "2012-09-05"
7
+ s.date = "2013-09-30"
8
8
  s.summary = "Flexible access control system"
9
9
  s.description = "Flexible access control system for your rails application. Based on analysis of controller actions"
10
10
  s.email = "sergey.awanesov@gmail.com"
@@ -4,4 +4,6 @@ require 'flexible_accessibility/exceptions.rb'
4
4
  require 'flexible_accessibility/permission.rb'
5
5
  require 'flexible_accessibility/filters.rb'
6
6
  require 'flexible_accessibility/resource.rb'
7
- require 'flexible_accessibility/utils.rb'
7
+ require 'flexible_accessibility/utils.rb'
8
+ require 'flexible_accessibility/access_provider.rb'
9
+ require 'flexible_accessibility/access_rule.rb'
@@ -0,0 +1,16 @@
1
+ module FlexibleAccessibility
2
+ class AccessProvider
3
+ class << self
4
+ def preload_permissions(user)
5
+ if user.instance_variable_get(:@_available_permissions).nil?
6
+ user.instance_variable_set(:@_available_permissions, AccessRule.where(:owner => user.id).map(&:permission))
7
+ end
8
+ end
9
+
10
+ def is_action_permitted_for_user?(permission, user)
11
+ preload_permissions(user)
12
+ user.instance_variable_get(:@_available_permissions).include? permission
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module FlexibleAccessibility
2
+ class AccessRule < ActiveRecord::Base
3
+ end
4
+ end
@@ -7,7 +7,7 @@ module FlexibleAccessibility
7
7
  valid_arguments = parse_and_validate_arguments(args)
8
8
  self.instance_variable_set(:@_non_verifiable_routes, self.action_methods) if valid_arguments[:all]
9
9
  self.instance_variable_set(:@_non_verifiable_routes, valid_arguments[:on]) unless valid_arguments[:on].nil?
10
- self.instance_variable_set(:@_verifiable_routes, [])
10
+ self.instance_variable_set(:@_verifiable_routes, []) if self.instance_variable_get(:@_non_verifiable_routes).nil?
11
11
  end
12
12
 
13
13
  # Macro for define actions with authorization
@@ -16,9 +16,10 @@ module FlexibleAccessibility
16
16
  self.instance_variable_set(:@_verifiable_routes, valid_arguments[:only]) unless valid_arguments[:only].nil?
17
17
  self.instance_variable_set(:@_verifiable_routes, self.action_methods - valid_arguments[:except]) unless valid_arguments[:except].nil?
18
18
  self.instance_variable_set(:@_verifiable_routes, self.action_methods) if valid_arguments[:all]
19
- self.instance_variable_set(:@_non_verifiable_routes, [])
19
+ self.instance_variable_set(:@_non_verifiable_routes, []) if self.instance_variable_get(:@_non_verifiable_routes).nil?
20
+ # TODO: get info from routes
20
21
  end
21
-
22
+
22
23
  private
23
24
  # Parse arguments from macro calls
24
25
  def parse_and_validate_arguments(args={})
@@ -42,7 +43,8 @@ module FlexibleAccessibility
42
43
 
43
44
  # Check the url for each link in view to show it
44
45
  def has_access?(permission, user)
45
- Permission.is_action_permitted_for_user?(permission, user)
46
+ raise UnknownUserException if user.nil?
47
+ AccessProvider.is_action_permitted_for_user?(permission, user)
46
48
  end
47
49
  end
48
50
  end
@@ -50,6 +52,6 @@ end
50
52
  # Include methods in ActionController::Base
51
53
  if defined?(ActionController::Base)
52
54
  ActionController::Base.class_eval do
53
- include FlexibleAccessibility::ControllerMethods
55
+ include FlexibleAccessibility::ControllerMethods
54
56
  end
55
57
  end
@@ -21,11 +21,10 @@ module FlexibleAccessibility
21
21
  end
22
22
  end
23
23
 
24
-
25
24
  class AccessDeniedException < FlexibleAccessibilityException
26
25
  private
27
26
  def message
28
- I18n.t 'flexible_accessibility.errors.access_denied', :action => @action
27
+ I18n.t('flexible_accessibility.errors.access_denied', :action => @action)
29
28
  end
30
29
 
31
30
  def default_message
@@ -36,7 +35,7 @@ module FlexibleAccessibility
36
35
  class UserNotLoggedInException < FlexibleAccessibilityException
37
36
  private
38
37
  def message
39
- I18n.t 'flexible_accessibility.errors.user_is_not_logged_in'
38
+ I18n.t('flexible_accessibility.errors.user_is_not_logged_in')
40
39
  end
41
40
 
42
41
  def default_message
@@ -44,6 +43,28 @@ module FlexibleAccessibility
44
43
  end
45
44
  end
46
45
 
46
+ class NoWayToDetectLoggerUserException < FlexibleAccessibilityException
47
+ private
48
+ def message
49
+ I18n.t('flexible_accessibility.errors.no_way_to_detect_logged_user')
50
+ end
51
+
52
+ def default_message
53
+ "No way to detect a logged user - may you have forgot to define a current_user helper"
54
+ end
55
+ end
56
+
57
+ class UnknownUserException < FlexibleAccessibilityException
58
+ private
59
+ def message
60
+ I18n.t('flexible_accessibility.errors.unknown_user')
61
+ end
62
+
63
+ def default_message
64
+ "Probably you have forgot to send a user in has_access?"
65
+ end
66
+ end
67
+
47
68
  class ActionsValueException < FlexibleAccessibilityException
48
69
  private
49
70
  def message
@@ -6,7 +6,7 @@ module FlexibleAccessibility
6
6
  append_before_filter(:check_permission_to_route)
7
7
  append_before_filter(:check_if_route_is_permitted)
8
8
  end
9
-
9
+
10
10
  private
11
11
  # Detect current controller and action and return a permission
12
12
  def current_resource
@@ -23,11 +23,17 @@ module FlexibleAccessibility
23
23
  "#{current_resource}##{current_action}"
24
24
  end
25
25
 
26
- # We checks access to route and we expected the existing of current_user helper
26
+ # Expected the existing of current_user helper
27
+ def logged_user
28
+ return current_user if defined?(current_user)
29
+ raise NoWayToDetectLoggerUserException unless defined?(current_user)
30
+ end
31
+
32
+ # Check access to route and we expected the existing of current_user helper
27
33
  def check_permission_to_route
28
34
  if self.class.instance_variable_get(:@_verifiable_routes).include? current_action
29
- raise UserNotLoggedInException.new(current_route, nil) if current_user.nil?
30
- self.class.instance_variable_set(:@_route_permitted, Permission.is_action_permitted_for_user?(current_route, current_user))
35
+ raise UserNotLoggedInException.new(current_route, nil) if logged_user.nil?
36
+ self.class.instance_variable_set(:@_route_permitted, AccessProvider.is_action_permitted_for_user?(current_route, logged_user))
31
37
  elsif self.class.instance_variable_get(:@_non_verifiable_routes).include? current_action
32
38
  self.class.instance_variable_set(:@_route_permitted, true)
33
39
  else
@@ -35,7 +41,7 @@ module FlexibleAccessibility
35
41
  end
36
42
  end
37
43
 
38
- # We checks @authorized variable state
44
+ # Check the @authorized variable state
39
45
  def check_if_route_is_permitted
40
46
  raise AccessDeniedException.new(current_route, nil) unless self.class.instance_variable_get(:@_route_permitted)
41
47
  end
@@ -16,28 +16,19 @@ module FlexibleAccessibility
16
16
  ApplicationResource.new(self.resource).namespace
17
17
  end
18
18
 
19
- class << self
20
- # TODO: this function may be recursive because nesting may be existed
21
- def all
22
- permissions = []
23
- Utils.new.get_controllers.each do |scope|
24
- namespace = scope.first.to_s
25
- scope.last.each do |resource|
26
- resource = "#{namespace}/#{resource}" unless namespace == "default"
27
- permissions << Permission.new(:resource => resource.gsub(/_controller/, ""), :actions => ApplicationResource.new(resource).klass.instance_variable_get(:@_verifiable_routes))
28
- end
29
- end
30
- permissions
31
- end
32
-
33
- def is_action_permitted? permission
34
- self.is_action_permitted_for_user?(permission, current_user)
35
- end
36
-
37
- def is_action_permitted_for_user? permission, user
38
- # TODO: Avoid these code, maybe handle a callback included in application
39
- !AccessRule.where(["permission = ? and user_id = ?", permission, user.id]).empty?
40
- end
41
- end
19
+ # TODO: this function may be recursive because nesting may be existed
20
+ class << self
21
+ def all
22
+ permissions = []
23
+ Utils.new.get_controllers.each do |scope|
24
+ namespace = scope.first.to_s
25
+ scope.last.each do |resource|
26
+ resource = "#{namespace}/#{resource}" unless namespace == "default"
27
+ permissions << Permission.new(:resource => resource.gsub(/_controller/, ""), :actions => ApplicationResource.new(resource).klass.instance_variable_get(:@_verifiable_routes))
28
+ end
29
+ end
30
+ permissions
31
+ end
32
+ end
42
33
  end
43
34
  end
@@ -20,4 +20,4 @@ module FlexibleAccessibility
20
20
  @namespace == "default"
21
21
  end
22
22
  end
23
- end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails/generators/migration'
2
+
3
+ module FlexibleAccessibility
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+ source_root File.expand_path('../templates', __FILE__)
8
+ desc "Add the migrations"
9
+
10
+ def self.next_migration_number(path)
11
+ unless @prev_migration_nr
12
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
13
+ else
14
+ @prev_migration_nr += 1
15
+ end
16
+ @prev_migration_nr.to_s
17
+ end
18
+
19
+ def copy_migrations
20
+ migration_template "create_access_rules.rb", "db/migrate/create_access_rules.rb"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ class CreateAccessRules < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :access_rules do |t|
4
+ t.string :permission
5
+ t.integer :owner
6
+ t.timestamps
7
+
8
+ t.index [:owner], :name => "access_rules_index_on_owner"
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :access_rules
14
+ end
15
+ end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: flexible_accessibility
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.0
5
+ version: 0.3.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sergey Awanesov
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-05 00:00:00.000000000 Z
12
+ date: 2013-09-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  prerelease: false
@@ -87,16 +87,21 @@ files:
87
87
  - Gemfile.lock
88
88
  - LICENSE.txt
89
89
  - README.md
90
+ - README.rdoc
90
91
  - Rakefile
91
92
  - flexible_accessibility.gemspec
92
93
  - init.rb
93
94
  - lib/flexible_accessibility.rb
95
+ - lib/flexible_accessibility/access_provider.rb
96
+ - lib/flexible_accessibility/access_rule.rb
94
97
  - lib/flexible_accessibility/controller_methods.rb
95
98
  - lib/flexible_accessibility/exceptions.rb
96
99
  - lib/flexible_accessibility/filters.rb
97
100
  - lib/flexible_accessibility/permission.rb
98
101
  - lib/flexible_accessibility/resource.rb
99
102
  - lib/flexible_accessibility/utils.rb
103
+ - lib/generators/flexible_accessibility/install/install_generator.rb
104
+ - lib/generators/flexible_accessibility/install/templates/create_access_rules.rb
100
105
  - test/helper.rb
101
106
  - test/test_flexible_accessibility.rb
102
107
  homepage: http://github.com/mochnatiy/flexible_accessibility