cmor_rbac 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +37 -0
  4. data/Rakefile +19 -0
  5. data/app/assets/javascripts/cmor/rbac/application.js +13 -0
  6. data/app/assets/stylesheets/cmor/rbac/application.css +14 -0
  7. data/app/controllers/cmor/rbac/application_controller.rb +6 -0
  8. data/app/helpers/cmor/rbac/application_helper.rb +6 -0
  9. data/app/models/cmor/rbac/permission.rb +45 -0
  10. data/app/models/cmor/rbac/role.rb +43 -0
  11. data/app/models/cmor/rbac/role_permission.rb +22 -0
  12. data/app/models/cmor/rbac/user_role.rb +20 -0
  13. data/app/models/concerns/model/cmor/rbac/user_concern.rb +55 -0
  14. data/app/models/concerns/model/flag_from_time_range_concern.rb +26 -0
  15. data/app/services/cmor/rbac/application_service.rb +8 -0
  16. data/app/services/cmor/rbac/import_default_permissions_service.rb +151 -0
  17. data/app/views/cmor/rbac/_current_user_additional_table_rows.haml +2 -0
  18. data/app/views/layouts/cmor/rbac/application.html.erb +14 -0
  19. data/config/initializers/inject_user_concern.rb +10 -0
  20. data/config/locales/de.yml +58 -0
  21. data/config/locales/en.yml +58 -0
  22. data/config/routes.rb +6 -0
  23. data/db/migrate/20160301103116_create_cmor_rbac_roles.rb +11 -0
  24. data/db/migrate/20160301103202_create_cmor_rbac_user_roles.rb +10 -0
  25. data/db/migrate/20160301103219_create_cmor_rbac_permissions.rb +11 -0
  26. data/db/migrate/20160301103240_create_cmor_rbac_role_permissions.rb +10 -0
  27. data/lib/active_model/validations/file_readability_validator.rb +25 -0
  28. data/lib/cmor/rbac/configuration.rb +21 -0
  29. data/lib/cmor/rbac/engine.rb +8 -0
  30. data/lib/cmor/rbac/version.rb +7 -0
  31. data/lib/cmor/rbac.rb +14 -0
  32. data/lib/cmor_rbac.rb +4 -0
  33. data/lib/generators/cmor/rbac/install/install_generator.rb +23 -0
  34. data/lib/generators/cmor/rbac/install/templates/initializer.rb +20 -0
  35. data/lib/tasks/cmor/rbac_tasks.rake +4 -0
  36. data/spec/factories/cmor/rbac/permissions.rb +5 -0
  37. data/spec/factories/cmor/rbac/role_permissions.rb +6 -0
  38. data/spec/factories/cmor/rbac/roles.rb +5 -0
  39. data/spec/factories/cmor/rbac/user_roles.rb +6 -0
  40. metadata +361 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9b7d1cecf282129f154e661caf8196bb82526122a45838ed7ad52f73dda51b21
4
+ data.tar.gz: faeb72045033cb84cb4bd0480d87e7e11d6a79dbe5133ecb88a4e96e309f6041
5
+ SHA512:
6
+ metadata.gz: d5cbd571abbe00af0a105b8ea916a453cdc564c6cfda079e654e9d7f00fb5dfd200251bdb18d4e1075f92622f4fae4df923a1d7068595313dfd703381436eeed
7
+ data.tar.gz: 05a719e8b3bec489d24cbcdf69d64467a6c836402cd571d51bfe4836d3f818ee902f6ad62f1f0ad4aef6d4c07b6d67cae127eedd9e76d6aa55dc65ffae2ed203
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2016 Roberto Vasquez Angel
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,37 @@
1
+ = Cmor::Rbac
2
+
3
+ This module implements role based access control on top of pundit.
4
+
5
+
6
+ = Why?
7
+
8
+ * Flexible handling of roles, role permissions, permissions and user permissions in the database.
9
+ * Automatic mapping of controllers and actions to permissions.
10
+
11
+
12
+ = Installation
13
+
14
+ Add it to your gemfile, bundle and run installer:
15
+
16
+ echo "\ngem 'cmor_rbac'" >> Gemfile
17
+ bundle
18
+ rails g cmor:rbac:install
19
+
20
+ The installer will add an initializer with configuration options in initializers/cmor_rbac.rb
21
+
22
+ Add the database migrations and migrate:
23
+
24
+ rake cmor_rbac:install:migrations
25
+ rake db:migrate
26
+
27
+
28
+ = Configuration
29
+
30
+ Possible options in the initializer:
31
+
32
+ * user_class_name: The class of the user model. Default is User.
33
+
34
+
35
+ = License
36
+
37
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Cmor::Rbac'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ Bundler::GemHelper.install_tasks
18
+
19
+ require 'rails/dummy/tasks'
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,14 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. It is generally better to create a new file per style scope.
11
+ *
12
+ *= require_tree .
13
+ *= require_self
14
+ */
@@ -0,0 +1,6 @@
1
+ module Cmor
2
+ module Rbac
3
+ class ApplicationController < ActionController::Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Cmor
2
+ module Rbac
3
+ module ApplicationHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,45 @@
1
+ require 'model/flag_from_time_range_concern'
2
+
3
+ module Cmor::Rbac
4
+ class Permission < ActiveRecord::Base
5
+ include Model::FlagFromTimeRangeConcern
6
+
7
+ DEFAULTS = {
8
+ enabled_from: '01.01.1900 00:00:00',
9
+ enabled_to: '31.12.9999 23:59:59'
10
+ }
11
+
12
+ # associations
13
+ has_many :role_permissions, class_name: 'Cmor::Rbac::RolePermission', dependent: :destroy
14
+ has_many :roles, class_name: 'Cmor::Rbac::Role', through: :role_permissions
15
+ has_many :user_roles, through: :roles, class_name: 'Cmor::Rbac::UserRole'
16
+ has_many :users, through: :user_roles, class_name: Cmor::Rbac::Configuration.user_class_name
17
+
18
+ has_many :enabled_roles, -> { enabled }, class_name: 'Cmor::Rbac::Role', through: :role_permissions, source: :permission
19
+ has_many :enabled_user_roles, class_name: 'Cmor::Rbac::UserRole', through: :enabled_roles, source: :role_permissions
20
+
21
+ has_many :enabled_users, through: :enabled_user_roles, class_name: Cmor::Rbac::Configuration.user_class_name, source: :user
22
+
23
+ flag_from_time_range :enabled?
24
+
25
+ # validations
26
+ validates :identifier, presence: true, uniqueness: true
27
+ validates :enabled_from, presence: true
28
+ validates :enabled_to, presence: true
29
+
30
+ # callbacks
31
+ after_initialize :set_defaults
32
+
33
+ def human
34
+ "#{self.class.model_name.human}: #{identifier}"
35
+ end
36
+
37
+ private
38
+
39
+ def set_defaults
40
+ return if persisted?
41
+ self.enabled_from = DEFAULTS[:enabled_from]
42
+ self.enabled_to = DEFAULTS[:enabled_to]
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,43 @@
1
+ require 'model/flag_from_time_range_concern'
2
+
3
+ module Cmor::Rbac
4
+ class Role < ActiveRecord::Base
5
+ include Model::FlagFromTimeRangeConcern
6
+
7
+ DEFAULTS = {
8
+ enabled_from: '01.01.1900 00:00:00',
9
+ enabled_to: '31.12.9999 23:59:59'
10
+ }
11
+
12
+ # associations
13
+ has_many :user_roles, class_name: 'Cmor::Rbac::UserRole', inverse_of: :role
14
+ has_many :users, through: :user_roles
15
+
16
+ has_many :role_permissions, class_name: 'Cmor::Rbac::RolePermission'
17
+ has_many :permissions, class_name: 'Cmor::Rbac::Permission', through: :role_permissions
18
+
19
+ has_many :enabled_permissions, -> { enabled }, class_name: 'Cmor::Rbac::Permission', through: :role_permissions, source: :role
20
+
21
+ flag_from_time_range :enabled?
22
+
23
+ # validations
24
+ validates :identifier, presence: true, uniqueness: true
25
+ validates :enabled_from, presence: true
26
+ validates :enabled_to, presence: true
27
+
28
+ # callbacks
29
+ after_initialize :set_defaults
30
+
31
+ def human
32
+ "#{self.class.model_name.human}: #{identifier}"
33
+ end
34
+
35
+ private
36
+
37
+ def set_defaults
38
+ return if persisted?
39
+ self.enabled_from = DEFAULTS[:enabled_from]
40
+ self.enabled_to = DEFAULTS[:enabled_to]
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,22 @@
1
+ module Cmor::Rbac
2
+ class RolePermission < ActiveRecord::Base
3
+ # associations
4
+ belongs_to :permission
5
+ belongs_to :role
6
+ has_many :user_roles, through: :role
7
+ has_many :users, through: :user_roles
8
+
9
+ if Rails.version >= '5.0.0'
10
+ belongs_to :enabled_role, -> { enabled }, foreign_key: 'role_id', class_name: 'Cmor::Rbac::Role', optional: true
11
+ else
12
+ belongs_to :enabled_role, -> { enabled }, foreign_key: 'role_id', class_name: 'Cmor::Rbac::Role'
13
+ end
14
+ has_many :enabled_user_roles, through: :enabled_role, source: :user_roles
15
+ has_many :enabled_users, through: :enabled_user_roles, source: :enabled_role_permissions
16
+
17
+ # validations
18
+ validates :permission, presence: true
19
+ validates :permission_id, uniqueness: { scope: :role_id }
20
+ validates :role, presence: true
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ module Cmor::Rbac
2
+ class UserRole < ActiveRecord::Base
3
+ # associations
4
+ belongs_to :user, class_name: Cmor::Rbac::Configuration.user_class_name, foreign_key: 'user_id', inverse_of: :user_roles
5
+ belongs_to :role, inverse_of: :user_roles
6
+
7
+ if Rails.version >= '5.0.0'
8
+ belongs_to :enabled_role, -> { enabled }, foreign_key: 'role_id', class_name: 'Cmor::Rbac::Role', optional: true
9
+ else
10
+ belongs_to :enabled_role, -> { enabled }, foreign_key: 'role_id', class_name: 'Cmor::Rbac::Role'
11
+ end
12
+ has_many :enabled_role_permissions, through: :enabled_role, source: :user_roles, class_name: 'Cmor::Rbac::RolePermission'
13
+ has_many :enabled_permissions, through: :enabled_role_permissions, class_name: 'Cmor::Rbac::Permission', source: :permission
14
+
15
+ # validations
16
+ validates :user, presence: true
17
+ validates :user_id, uniqueness: { scope: :role_id }
18
+ validates :role, presence: true
19
+ end
20
+ end
@@ -0,0 +1,55 @@
1
+ module Model
2
+ module Cmor
3
+ module Rbac
4
+ module UserConcern
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ # associations
9
+ has_many :user_roles, class_name: 'Cmor::Rbac::UserRole', inverse_of: :user, dependent: :destroy
10
+ has_many :roles, class_name: 'Cmor::Rbac::Role', through: :user_roles
11
+ has_many :role_permissions, class_name: 'Cmor::Rbac::RolePermission', through: :roles
12
+ has_many :permissions, through: :role_permissions, class_name: 'Cmor::Rbac::Permission'
13
+
14
+ has_many :enabled_roles, -> { enabled }, class_name: 'Cmor::Rbac::Role', through: :user_roles # , source: :user
15
+ has_many :enabled_role_permissions, class_name: 'Cmor::Rbac::RolePermission', through: :enabled_roles, source: :user_roles
16
+
17
+ has_many :enabled_permissions, through: :enabled_role_permissions, class_name: 'Cmor::Rbac::Permission', source: :permission
18
+ end
19
+
20
+ def allowed_to?(permission_identifier)
21
+ enabled_permissions.map(&:identifier).map(&:to_sym).include?(permission_identifier.to_sym)
22
+ end
23
+
24
+ def has_role?(role_identifier)
25
+ enabled_roles.map(&:identifier).map(&:to_sym).include?(role_identifier.to_sym)
26
+ end
27
+
28
+ def add_role(role_identifier)
29
+ role = ::Cmor::Rbac::Role.where(identifier: role_identifier).first
30
+ if role
31
+ roles << role
32
+ else
33
+ false
34
+ end
35
+ end
36
+
37
+ def roles_count
38
+ roles.count
39
+ end
40
+
41
+ def enabled_roles_count
42
+ enabled_roles.count
43
+ end
44
+
45
+ def permissions_count
46
+ permissions.count
47
+ end
48
+
49
+ def enabled_permissions_count
50
+ enabled_permissions.count
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ module Model
2
+ module FlagFromTimeRangeConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def flag_from_time_range(*args)
7
+ options = args.extract_options!
8
+ attributes = args
9
+
10
+ attributes.each do |attribute|
11
+ method_name_base = attribute.to_s.chomp('?')
12
+ define_method attribute do
13
+ time_range = (send("#{method_name_base}_from")..send("#{method_name_base}_to"))
14
+ time_range.cover? Time.zone.now
15
+ end
16
+
17
+ define_singleton_method method_name_base do
18
+ t = arel_table
19
+ now = Time.zone.now
20
+ where(t["#{method_name_base}_from"].lteq(now)).where(t["#{method_name_base}_to"].gteq(now))
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ module Cmor
2
+ module Rbac
3
+ class ApplicationService < Rao::Service::Base
4
+ class Result < Rao::Service::Result::Base
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,151 @@
1
+ # require_dependency 'itsf_services'
2
+ require_dependency 'active_model/validations/file_readability_validator'
3
+
4
+ module Cmor
5
+ module Rbac
6
+ # Example:
7
+ #
8
+ # # config/rbac.yml:
9
+ # defaults:
10
+ # permissions:
11
+ # - posts/index
12
+ # - posts/show
13
+ # roles:
14
+ # member:
15
+ # - posts/index
16
+ # - posts/show
17
+ #
18
+ # # rails console:
19
+ # Cmor::Rbac::ImportDefaultPermissionsService.call
20
+ # =>
21
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Performing...
22
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Validating input...
23
+ # [Cmor::Rbac::ImportDefaultPermissionsService] => Done
24
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Loaded YAML from /home/johndoe/rails_application/config/rbac.yml
25
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Checking for valid YAML structure
26
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Loaded 2 permissions
27
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Loaded 1 roles
28
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Saved 2 permissions
29
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Saved 1 roles
30
+ # [Cmor::Rbac::ImportDefaultPermissionsService] Saved 2 role permissions
31
+ # [Cmor::Rbac::ImportDefaultPermissionsService] => Done
32
+ #
33
+ class ImportDefaultPermissionsService < ApplicationService
34
+ class Result < ApplicationService::Result
35
+ attr_accessor :permissions, :roles, :role_permissions
36
+ end
37
+
38
+ attr_accessor :filename
39
+
40
+ validates :filename, file_readability: true
41
+
42
+ def _perform
43
+ # say 'Validating input' do
44
+ # unless valid?
45
+ # say "Inputs are invalid. Errors: #{errors.full_messages.to_sentence}"
46
+ # say 'Aborted'
47
+ # return
48
+ # end
49
+ # end
50
+
51
+ return unless load_yaml
52
+ return unless yaml_structure_valid?
53
+
54
+ load_permissions
55
+ load_roles
56
+
57
+ @result.permissions = create_or_update_permissions
58
+ @result.roles = create_or_update_roles
59
+ @result.role_permissions = create_or_update_role_permissions
60
+ end
61
+
62
+ private
63
+
64
+ def filename
65
+ @filename ||= Cmor::Rbac.default_permissions_filename.call
66
+ end
67
+
68
+ def create_or_update_permissions
69
+ permissions = @permissions.collect do |permission_identifier|
70
+ Cmor::Rbac::Permission.where(identifier: permission_identifier).first_or_initialize.tap do |permission|
71
+ permission.save!
72
+ end
73
+ end
74
+ say "Saved #{permissions.count} permissions"
75
+ permissions
76
+ end
77
+
78
+ def create_or_update_roles
79
+ roles = @roles.collect do |role_identifier, permissions|
80
+ Cmor::Rbac::Role.where(identifier: role_identifier).first_or_initialize.tap do |role|
81
+ role.save!
82
+ end
83
+ end
84
+ say "Saved #{roles.count} roles"
85
+ roles
86
+ end
87
+
88
+ def create_or_update_role_permissions
89
+ role_permissions = @roles.collect do |role_identifier, permissions|
90
+ role = Cmor::Rbac::Role.where(identifier: role_identifier).first
91
+ (permissions ||[]).collect do |permission_identifier|
92
+ permission = Cmor::Rbac::Permission.where(identifier: permission_identifier).first
93
+
94
+ Cmor::Rbac::RolePermission.where(role_id: role, permission_id: permission).first_or_initialize.tap do |role_permission|
95
+ role_permission.save!
96
+ end
97
+ end
98
+ end.flatten
99
+ say "Saved #{role_permissions.count} role permissions"
100
+ role_permissions
101
+ end
102
+
103
+ def load_permissions
104
+ @permissions = @yaml[:defaults][:permissions] || []
105
+ say "Loaded #{@permissions.size} permissions"
106
+ end
107
+
108
+ def load_roles
109
+ @roles = @yaml[:defaults][:roles] || []
110
+ say "Loaded #{@roles.size} roles"
111
+ end
112
+
113
+ def load_yaml
114
+ yaml = YAML.load_file(filename)
115
+ if yaml
116
+ say "Loaded YAML from #{filename}"
117
+ @yaml = yaml.with_indifferent_access
118
+ else
119
+ say "Could not load YAML from #{filename}"
120
+ @yaml = yaml
121
+ end
122
+ end
123
+
124
+ def yaml_structure_valid?
125
+ say "Checking for valid YAML structure"
126
+ unless @yaml.is_a?(Hash)
127
+ add_error_and_say(:yaml_file, "Expected file content of #{filename} to parse to a Hash, but was #{@yaml.class}")
128
+ return false
129
+ end
130
+
131
+ unless @yaml.has_key?(:defaults)
132
+ add_error_and_say(:yaml_file, "Expected yaml in #{filename} to have the key [defaults:].")
133
+ return false
134
+ end
135
+
136
+ unless @yaml[:defaults].has_key?(:roles)
137
+ add_error_and_say(:yaml_file, "Expected yaml in #{filename} to have the key [defaults:][roles:].")
138
+ return false
139
+ end
140
+
141
+
142
+ unless @yaml[:defaults].has_key?(:permissions)
143
+ add_error_and_say(:yaml_file, "Expected yaml in #{filename} to have the key [defaults:][permissions:].")
144
+ return false
145
+ end
146
+
147
+ return true
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,2 @@
1
+ = table.association Cmor::Rbac::Role.model_name.human(count: :other) do |resource|
2
+ - resource.roles.map(&:identifier).join(', ')
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Rbac</title>
5
+ <%= stylesheet_link_tag "cmor/rbac/application", media: "all" %>
6
+ <%= javascript_include_tag "cmor/rbac/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,10 @@
1
+ Rails.configuration.to_prepare do
2
+ begin
3
+ puts "Including Model::Cmor::Rbac::UserConcern in #{Cmor::Rbac.user_class_name}"
4
+ Cmor::Rbac.user_class_name.constantize.class_eval do
5
+ include Model::Cmor::Rbac::UserConcern
6
+ end
7
+ rescue NameError => e
8
+ "Could not include Model::Cmor::Rbac::UserConcern into #{Cmor::Rbac.user_class_name}. Error: #{e.message}"
9
+ end
10
+ end
@@ -0,0 +1,58 @@
1
+ de:
2
+ activemodel:
3
+ models:
4
+ cmor/rbac/import_default_permissions_service: "Dienst zum Einrichten von Berechtigungen"
5
+ attributes:
6
+ cmor/rbac/import_default_permissions_service:
7
+ filename: Datei
8
+ activerecord:
9
+ attributes:
10
+ cmor/rbac/permission:
11
+ id: ID
12
+ actions: Aktionen
13
+ created_at: Erstellt am
14
+ enabled?: Aktiv
15
+ enabled_from: Aktiv ab
16
+ enabled_to: Aktiv bis
17
+ identifier: Bezeichner
18
+ updated_at: Aktualisiert am
19
+ cmor/rbac/role:
20
+ id: ID
21
+ actions: Aktionen
22
+ created_at: Erstellt am
23
+ enabled?: Aktiv
24
+ enabled_from: Aktiv ab
25
+ enabled_to: Aktiv bis
26
+ identifier: Bezeichner
27
+ updated_at: Aktualisiert am
28
+ cmor/rbac/role_permission:
29
+ id: ID
30
+ role: Rolle
31
+ role_id: Rolle
32
+ permission: Berechtigung
33
+ permission_id: Berechtigung
34
+ created_at: Erstellt am
35
+ updated_at: Aktualisiert am
36
+ cmor/rbac/user_role:
37
+ id: ID
38
+ user: Benutzer
39
+ user_id: Benutzer
40
+ role: Rolle
41
+ role_id: Rolle
42
+ created_at: Erstellt am
43
+ updated_at: Aktualisiert am
44
+ models:
45
+ cmor/rbac/permission:
46
+ one: Berechtigung
47
+ other: Berechtigungen
48
+ cmor/rbac/role:
49
+ one: Rolle
50
+ other: Rollen
51
+ cmor/rbac/role_permission:
52
+ one: Rollen-Berechtigung
53
+ other: Rollen-Berechtigungen
54
+ cmor/rbac/user_role:
55
+ one: Benutzer-Rolle
56
+ other: Benutzer-Rollen
57
+ routes:
58
+ cmor_rbac_engine: rbac
@@ -0,0 +1,58 @@
1
+ en:
2
+ activemodel:
3
+ models:
4
+ cmor/rbac/import_default_permissions_service: "Import default permissions service"
5
+ attributes:
6
+ cmor/rbac/import_default_permissions_service:
7
+ filename: File
8
+ activerecord:
9
+ attributes:
10
+ cmor/rbac/permission:
11
+ id: ID
12
+ actions: Actions
13
+ created_at: Created at
14
+ enabled?: Active
15
+ enabled_from: Enabled from
16
+ enabled_to: Enabled to
17
+ identifier: Identifier
18
+ updated_at: Updated at
19
+ cmor/rbac/role:
20
+ id: ID
21
+ actions: Actions
22
+ created_at: Created at
23
+ enabled?: Active
24
+ enabled_from: Enabled from
25
+ enabled_to: Enabled to
26
+ identifier: Identifier
27
+ updated_at: Updated at
28
+ cmor/rbac/role_permission:
29
+ id: ID
30
+ role: Role
31
+ role_id: Role
32
+ permission: Permission
33
+ permission_id: Permission
34
+ created_at: Created at
35
+ updated_at: Updated at
36
+ cmor/rbac/user_role:
37
+ id: ID
38
+ user: User
39
+ user_id: User
40
+ role: Role
41
+ role_id: Role
42
+ created_at: Created at
43
+ updated_at: Updated at
44
+ models:
45
+ cmor/rbac/permission:
46
+ one: Permission
47
+ other: Permissions
48
+ cmor/rbac/role:
49
+ one: Role
50
+ other: Roles
51
+ cmor/rbac/role_permission:
52
+ one: Role Permission
53
+ other: Role Permissions
54
+ cmor/rbac/user_role:
55
+ one: User Role
56
+ other: User Roles
57
+ routes:
58
+ cmor_rbac_engine: rbac
data/config/routes.rb ADDED
@@ -0,0 +1,6 @@
1
+ Cmor::Rbac::Engine.routes.draw do
2
+ localized do
3
+ scope :cmor_rbac_engine do
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ class CreateCmorRbacRoles < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :cmor_rbac_roles do |t|
4
+ t.string :identifier
5
+ t.timestamp :enabled_from
6
+ t.timestamp :enabled_to
7
+
8
+ t.timestamps null: false
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class CreateCmorRbacUserRoles < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :cmor_rbac_user_roles do |t|
4
+ t.integer :user_id, index: true
5
+ t.integer :role_id, index: true
6
+
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateCmorRbacPermissions < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :cmor_rbac_permissions do |t|
4
+ t.string :identifier
5
+ t.timestamp :enabled_from
6
+ t.timestamp :enabled_to
7
+
8
+ t.timestamps null: false
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class CreateCmorRbacRolePermissions < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :cmor_rbac_role_permissions do |t|
4
+ t.integer :role_id, index: true
5
+ t.integer :permission_id, index: true
6
+
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class FileReadabilityValidator < ::ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ filename = File.expand_path(value) if !value.nil? && value.respond_to?(:to_s)
6
+ if filename.nil?
7
+ record.errors.add(attribute, options[:message] || :filename_is_nil)
8
+ return
9
+ end
10
+ unless File.exists?(filename)
11
+ record.errors.add(attribute, options[:message] || :file_not_existent, filename: filename)
12
+ return
13
+ end
14
+ unless File.file?(filename)
15
+ record.errors.add(attribute, options[:message] || :file_not_file, filename: filename)
16
+ return
17
+ end
18
+ unless File.readable?(filename)
19
+ record.errors.add(attribute, options[:message] || :file_not_readable, filename: filename)
20
+ return
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ require 'active_support/core_ext/module/delegation'
2
+ require 'active_support/core_ext/module/attribute_accessors'
3
+
4
+ module Cmor
5
+ module Rbac
6
+ module Configuration
7
+ def configure
8
+ yield self
9
+ end
10
+
11
+ mattr_accessor(:user_class_name) { 'User' }
12
+ mattr_accessor(:user_factory_name) { :user }
13
+
14
+ mattr_accessor(:default_permissions_filename) { -> { Rails.root.join('config', 'rbac.yml') } }
15
+
16
+ def self.user_class
17
+ user_class_name.constantize
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ module Cmor
2
+ module Rbac
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace Cmor::Rbac
5
+
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ require 'cmor/version'
2
+
3
+ module Cmor
4
+ module Rbac
5
+ VERSION = ::Cmor::VERSION
6
+ end
7
+ end
data/lib/cmor/rbac.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'cmor/rbac/configuration'
2
+ require 'cmor/rbac/engine'
3
+
4
+ module Cmor
5
+ module Rbac
6
+ extend Configuration
7
+
8
+ def self.table_name_prefix
9
+ 'cmor_rbac_'
10
+ end
11
+ end
12
+ end
13
+
14
+ Cmor.configure { |c| c.register_configuration(:rbac, Cmor::Rbac) }
data/lib/cmor_rbac.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'cmor_core'
2
+ require 'rao-service'
3
+
4
+ require 'cmor/rbac'
@@ -0,0 +1,23 @@
1
+ module Cmor
2
+ module Rbac
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+ desc 'Generates the intializer'
6
+
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ attr_reader :user_class_name, :user_factory_name
10
+
11
+ def initialize(*args)
12
+ super
13
+ @user_class_name = ENV.fetch('CMOR_RBAC_USER_CLASS_NAME') { 'User' }
14
+ @user_factory_name = ENV.fetch('CMOR_RBAC_USER_FACTORY_NAME') { 'user' }
15
+ end
16
+
17
+ def generate_initializer
18
+ template 'initializer.rb', 'config/initializers/cmor_rbac.rb'
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ Cmor::Rbac.configure do |config|
2
+ # Set the User class.
3
+ #
4
+ # Default: config.user_class_name = '<%= user_class_name %>'
5
+ #
6
+ config.user_class_name = '<%= user_class_name %>'
7
+
8
+ # Factory name to use for users.
9
+ #
10
+ # default: config.user_factory_name = '<%= user_factory_name %>'
11
+ #
12
+ config.user_factory_name = '<%= user_factory_name %>'
13
+
14
+ # Set the path of your default permissions file that will be used by
15
+ # Cmor::Rbac::ImportDefaultPermissionsService
16
+ #
17
+ # default: config.default_permissions_filename = -> { Rails.root.join('config', 'rbac.yml') }
18
+ #
19
+ config.default_permissions_filename = -> { Rails.root.join('config', 'rbac.yml') }
20
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :rbac do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :cmor_rbac_permission, class: Cmor::Rbac::Permission do
3
+ sequence(:identifier) { |i| "Permission ##{i}" }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :cmor_rbac_role_permission, class: Cmor::Rbac::RolePermission do
3
+ association(:role, factory: :cmor_rbac_role)
4
+ association(:permission, factory: :cmor_rbac_permission)
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :cmor_rbac_role, class: Cmor::Rbac::Role do
3
+ sequence(:identifier) { |i| "Permission ##{i}" }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :cmor_rbac_user_role, class: Cmor::Rbac::UserRole do
3
+ association(:user, factory: Cmor::Rbac::Configuration.user_factory_name)
4
+ association(:role, factory: :cmor_rbac_role)
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,361 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cmor_rbac
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre
5
+ platform: ruby
6
+ authors:
7
+ - Roberto Vasquez Angel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: cmor_core
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.1.pre
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.1.pre
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.6
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: capybara
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: factory_bot_rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: git_log_generator
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard-rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard-rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rao-shoulda_matchers
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rails-dummy
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rails-i18n
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rspec-rails
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: rubocop
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: shoulda-matchers
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: simplecov
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: simplecov-console
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: rao-service
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: 0.0.15.pre
286
+ type: :runtime
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: 0.0.15.pre
293
+ description: Cmor::Rbac Module.
294
+ email:
295
+ - roberto@vasquez-angel.de
296
+ executables: []
297
+ extensions: []
298
+ extra_rdoc_files: []
299
+ files:
300
+ - MIT-LICENSE
301
+ - README.rdoc
302
+ - Rakefile
303
+ - app/assets/javascripts/cmor/rbac/application.js
304
+ - app/assets/stylesheets/cmor/rbac/application.css
305
+ - app/controllers/cmor/rbac/application_controller.rb
306
+ - app/helpers/cmor/rbac/application_helper.rb
307
+ - app/models/cmor/rbac/permission.rb
308
+ - app/models/cmor/rbac/role.rb
309
+ - app/models/cmor/rbac/role_permission.rb
310
+ - app/models/cmor/rbac/user_role.rb
311
+ - app/models/concerns/model/cmor/rbac/user_concern.rb
312
+ - app/models/concerns/model/flag_from_time_range_concern.rb
313
+ - app/services/cmor/rbac/application_service.rb
314
+ - app/services/cmor/rbac/import_default_permissions_service.rb
315
+ - app/views/cmor/rbac/_current_user_additional_table_rows.haml
316
+ - app/views/layouts/cmor/rbac/application.html.erb
317
+ - config/initializers/inject_user_concern.rb
318
+ - config/locales/de.yml
319
+ - config/locales/en.yml
320
+ - config/routes.rb
321
+ - db/migrate/20160301103116_create_cmor_rbac_roles.rb
322
+ - db/migrate/20160301103202_create_cmor_rbac_user_roles.rb
323
+ - db/migrate/20160301103219_create_cmor_rbac_permissions.rb
324
+ - db/migrate/20160301103240_create_cmor_rbac_role_permissions.rb
325
+ - lib/active_model/validations/file_readability_validator.rb
326
+ - lib/cmor/rbac.rb
327
+ - lib/cmor/rbac/configuration.rb
328
+ - lib/cmor/rbac/engine.rb
329
+ - lib/cmor/rbac/version.rb
330
+ - lib/cmor_rbac.rb
331
+ - lib/generators/cmor/rbac/install/install_generator.rb
332
+ - lib/generators/cmor/rbac/install/templates/initializer.rb
333
+ - lib/tasks/cmor/rbac_tasks.rake
334
+ - spec/factories/cmor/rbac/permissions.rb
335
+ - spec/factories/cmor/rbac/role_permissions.rb
336
+ - spec/factories/cmor/rbac/roles.rb
337
+ - spec/factories/cmor/rbac/user_roles.rb
338
+ homepage: https://github.com/content-management-on-rails
339
+ licenses:
340
+ - MIT
341
+ metadata: {}
342
+ post_install_message:
343
+ rdoc_options: []
344
+ require_paths:
345
+ - lib
346
+ required_ruby_version: !ruby/object:Gem::Requirement
347
+ requirements:
348
+ - - ">="
349
+ - !ruby/object:Gem::Version
350
+ version: '0'
351
+ required_rubygems_version: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - ">"
354
+ - !ruby/object:Gem::Version
355
+ version: 1.3.1
356
+ requirements: []
357
+ rubygems_version: 3.0.3
358
+ signing_key:
359
+ specification_version: 4
360
+ summary: Cmor::Rbac.
361
+ test_files: []