adeia 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -23
  3. data/app/assets/javascripts/adeia/application.js +13 -0
  4. data/app/assets/stylesheets/adeia/application.css +15 -0
  5. data/app/controllers/adeia/application_controller.rb +4 -0
  6. data/app/helpers/adeia/application_helper.rb +4 -0
  7. data/app/models/adeia/action.rb +5 -0
  8. data/app/models/adeia/action_permission.rb +6 -0
  9. data/app/models/adeia/element.rb +3 -0
  10. data/app/models/adeia/group.rb +3 -0
  11. data/app/models/adeia/group_user.rb +4 -0
  12. data/app/models/adeia/permission.rb +4 -0
  13. data/app/models/adeia/token.rb +5 -0
  14. data/config/locales/en.yml +6 -0
  15. data/config/locales/fr.yml +6 -0
  16. data/config/routes.rb +2 -2
  17. data/db/migrate/20151003144041_create_adeia_elements.rb +9 -0
  18. data/db/migrate/20151003144208_create_adeia_permissions.rb +16 -0
  19. data/db/migrate/20151003144650_create_adeia_groups.rb +9 -0
  20. data/db/migrate/20151003144706_create_adeia_group_users.rb +10 -0
  21. data/db/migrate/20151003150524_create_adeia_tokens.rb +12 -0
  22. data/db/migrate/20151003150747_create_adeia_actions.rb +9 -0
  23. data/db/migrate/20151003150806_create_adeia_action_permissions.rb +10 -0
  24. data/lib/adeia/authorization.rb +48 -0
  25. data/lib/adeia/controller_methods.rb +43 -0
  26. data/lib/adeia/controller_resource.rb +84 -0
  27. data/lib/adeia/database.rb +52 -0
  28. data/lib/adeia/engine.rb +8 -0
  29. data/lib/adeia/exceptions.rb +33 -0
  30. data/lib/adeia/version.rb +1 -1
  31. data/test/dummy/app/assets/javascripts/sessions.js +2 -0
  32. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  33. data/test/dummy/app/assets/stylesheets/sessions.css +4 -0
  34. data/test/dummy/app/controllers/application_controller.rb +2 -0
  35. data/test/dummy/app/controllers/articles_controller.rb +55 -0
  36. data/test/dummy/app/controllers/sessions_controller.rb +22 -0
  37. data/test/dummy/app/helpers/sessions_helper.rb +32 -0
  38. data/test/dummy/app/models/article.rb +3 -0
  39. data/test/dummy/app/models/user.rb +13 -0
  40. data/test/dummy/app/views/articles/_form.html.erb +25 -0
  41. data/test/dummy/app/views/articles/edit.html.erb +6 -0
  42. data/test/dummy/app/views/articles/index.html.erb +31 -0
  43. data/test/dummy/app/views/articles/new.html.erb +5 -0
  44. data/test/dummy/app/views/articles/show.html.erb +19 -0
  45. data/test/dummy/app/views/layouts/application.html.erb +8 -0
  46. data/test/dummy/app/views/sessions/new.html.erb +19 -0
  47. data/test/dummy/config/routes.rb +6 -51
  48. data/test/dummy/db/development.sqlite3 +0 -0
  49. data/test/dummy/db/migrate/20150930161522_create_users.rb +11 -0
  50. data/test/dummy/db/migrate/20150930161532_create_articles.rb +11 -0
  51. data/test/dummy/db/migrate/20151003145900_create_adeia_elements.adeia.rb +10 -0
  52. data/test/dummy/db/migrate/20151003145901_create_adeia_permissions.adeia.rb +17 -0
  53. data/test/dummy/db/migrate/20151003145902_create_adeia_groups.adeia.rb +10 -0
  54. data/test/dummy/db/migrate/20151003145903_create_adeia_group_users.adeia.rb +11 -0
  55. data/test/dummy/db/migrate/20151003150941_create_adeia_tokens.adeia.rb +13 -0
  56. data/test/dummy/db/migrate/20151003150942_create_adeia_actions.adeia.rb +10 -0
  57. data/test/dummy/db/migrate/20151003150943_create_adeia_action_permissions.adeia.rb +11 -0
  58. data/test/dummy/db/schema.rb +100 -0
  59. data/test/dummy/lib/tasks/init.rake +8 -0
  60. data/test/dummy/log/development.log +4656 -0
  61. data/test/dummy/test/controllers/articles_controller_test.rb +49 -0
  62. data/test/dummy/test/controllers/sessions_controller_test.rb +7 -0
  63. data/test/dummy/test/controllers/users_controller_test.rb +49 -0
  64. data/test/dummy/test/fixtures/articles.yml +11 -0
  65. data/test/dummy/test/fixtures/users.yml +9 -0
  66. data/test/{integration/navigation_test.rb → dummy/test/models/article_test.rb} +1 -2
  67. data/test/dummy/test/models/user_test.rb +7 -0
  68. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/007YZnzCZDb7P0xbxiEkmAM6-xSsxmYu_W7vnrvcDOs.cache +0 -0
  69. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1GiUoKAP-7ewZyzr_eCTMX0R8ML5Z_VN2bfQ05RAW30.cache +1 -0
  70. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +2 -0
  71. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6n6yNyR4eQhIVjw5Anxur-SLgdDc_rzuMuZKj6Q4FqE.cache +0 -0
  72. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/80nWjD2uxLBuIN1R5NawmTsgZWCB6nln8WXf_5gHri4.cache +1 -0
  73. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9Fw_WnCC15QnXUQZ4eYTYLOBv20at5Z5gL-WJx_QsR4.cache +1 -0
  74. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/D4VyPOMG_wXgPRZtj-mbRdONJXbdgOZKcuwSm-lNNIA.cache +2 -0
  75. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/DmmfrCpXtt74Hr6NO54lxyOCDv6klnDyBqeDFR7oDU8.cache +2 -0
  76. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HggfmBmV-rmvrvzJjqvjmDpwB2BTEQvh6krp0CcrI0U.cache +1 -0
  77. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +2 -0
  78. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/P1NOTKHlk-FIwqlw0wiyLanpgNyubwQi850S1aonsbQ.cache +1 -0
  79. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PKcbfub75wwU6UzvVnSMFn_6wsaaPUoXMtWTnyyh5jM.cache +1 -0
  80. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/S4dXPkh6wlupsMUb-GvZ2Q5PwAZmplTCkViWCnVWWw0.cache +2 -0
  81. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/UuBE6kIOXtWOmnrnywPI98bzHE-L84SteUEfzexxVtA.cache +1 -0
  82. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Xa5LZJIrW7sSuOWWFwCAhDkDQ71pA_cHp6H5kiTZS6E.cache +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eQqoU12FSWEA4BsL-PjwTnIUr1bZsu27SOzFHPomG4c.cache +1 -0
  84. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/f3V_hqqK4rH7Z51LFX1Wk9hrWGjYABTZmgSeYvWKgLs.cache +2 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gXIpNlfbH4G7-D0grgt2EuWuwHwTymznc1rlxJ1-C0A.cache +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hX4wt6FzyI47gW66iiVyl2C722yfwvx3KafFEYkreEY.cache +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +2 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nZCCAAO-XWnPS2Xr9yss0VhSONvnR3emOuEIc_b-1OY.cache +1 -0
  89. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
  90. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/r5qzpye5vWgzwRnRhhSYkUslyNZ11pyYXQZqGe8o930.cache +1 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/t0GCJAJcd_7X2F172TjwwDZ6rfNJc2FRbDTV5-jSqY0.cache +1 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/t92Y0f7B0gH-r5W-iNadtkzgjm8gxyEyttnY6AWpdmw.cache +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tYGZjTIGEDMySqV7qHf43dq0_aB7TuSEhhZtN_9xW54.cache +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wMjI0_cDi3gmsOV5xXr-QPQOfHCB_qea8St_udeflhE.cache +2 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/z2mRCA3647ZviK5pXi1_qLwdxkiCaoIfZj7jHoMfLiI.cache +1 -0
  96. metadata +179 -12
  97. data/README.rdoc +0 -3
  98. data/lib/tasks/adeia_tasks.rake +0 -3
  99. data/test/adeia_test.rb +0 -7
  100. data/test/dummy/README.rdoc +0 -28
  101. data/test/test_helper.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d503d070daefd2536b8e3a74ec468c47c85b45c6
4
- data.tar.gz: 8d2a6441982294cc3f7eaf2a978dc29bf964f7a6
3
+ metadata.gz: 4532656038bf240c25749082f7be357f05f7e355
4
+ data.tar.gz: f0df2615b74907c8fa22038531358c040726a0a2
5
5
  SHA512:
6
- metadata.gz: 939b3b1926065df7ac32492a2e6dd14299ef0e80af7feed5a0fc745a9e221fac4e6d731fe2bc266125a7ebec5d1992650d88b212b9c7bdb60fbe6c0c6ea20248
7
- data.tar.gz: b3cd32b31f5e51274366799d2bf4220c7fa09afb1d276fe5870ed7eef15e95d6ef17d2f461166920071f6fa0f99b2e9dbedef851dfed47f24bf43691fe2821e6
6
+ metadata.gz: 3d14df596215915a2101d4cdeb2d8ef7138a76aa3ce9371cb44ff3e09ba1f2521e4a028c9abea9550f3bcdeea9799e07bef822790f543bfbfc383c634fdcfb4d
7
+ data.tar.gz: a90b37a268eaf2eba9c7bcd22deda19378450d7bbfc292ca7d2999bd106b4313c11d43cfafeef8bfbfc00afee53fe41a421982d7a771691d70f772eba9afda79
data/Rakefile CHANGED
@@ -4,15 +4,6 @@ rescue LoadError
4
4
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
5
  end
6
6
 
7
- require 'rdoc/task'
8
-
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'Adeia'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.rdoc')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
16
7
 
17
8
  APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
9
  load 'rails/tasks/engine.rake'
@@ -21,17 +12,4 @@ load 'rails/tasks/engine.rake'
21
12
  load 'rails/tasks/statistics.rake'
22
13
 
23
14
 
24
-
25
- Bundler::GemHelper.install_tasks
26
-
27
- require 'rake/testtask'
28
-
29
- Rake::TestTask.new(:test) do |t|
30
- t.libs << 'lib'
31
- t.libs << 'test'
32
- t.pattern = 'test/**/*_test.rb'
33
- t.verbose = false
34
- end
35
-
36
-
37
- task default: :test
15
+ Bundler::GemHelper.install_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/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
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 styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module Adeia
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Adeia
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module Adeia
2
+ class Action < ActiveRecord::Base
3
+ has_many :action_permissions
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Adeia
2
+ class ActionPermission < ActiveRecord::Base
3
+ belongs_to :action
4
+ belongs_to :permission
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ class Adeia::Element < ActiveRecord::Base
2
+ has_many :permissions
3
+ end
@@ -0,0 +1,3 @@
1
+ class Adeia::Group < ActiveRecord::Base
2
+ has_many :group_users
3
+ end
@@ -0,0 +1,4 @@
1
+ class Adeia::GroupUser < ActiveRecord::Base
2
+ belongs_to :group
3
+ belongs_to :user
4
+ end
@@ -0,0 +1,4 @@
1
+ class Adeia::Permission < ActiveRecord::Base
2
+ belongs_to :owner
3
+ belongs_to :element
4
+ end
@@ -0,0 +1,5 @@
1
+ module Adeia
2
+ class Token < ActiveRecord::Base
3
+ belongs_to :permission
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ en:
2
+ exceptions:
3
+ messages:
4
+ login_required: "Please login before visiting this page !"
5
+ access_denied: "You don't have access to this page !"
6
+ missing_params: "params %{params} is missing !"
@@ -0,0 +1,6 @@
1
+ fr:
2
+ exceptions:
3
+ messages:
4
+ login_required: "Veuillez vous connecter pour accéder à cette page !"
5
+ access_denied: "Vous n'êtes pas autorisé à accéder à cette page !"
6
+ missing_params: "Le paramètre %{params} est manquant !"
data/config/routes.rb CHANGED
@@ -1,2 +1,2 @@
1
- Rails.application.routes.draw do
2
- end
1
+ Adeia::Engine.routes.draw do
2
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAdeiaElements < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_elements do |t|
4
+ t.string :name
5
+
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ class CreateAdeiaPermissions < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_permissions do |t|
4
+ t.references :owner, polymorphic: true, index: true
5
+ t.references :element, index: true, foreign_key: true
6
+ t.integer :permission_type
7
+ t.boolean :read_right
8
+ t.boolean :create_right
9
+ t.boolean :update_right
10
+ t.boolean :destroy_right
11
+ t.integer :resource_id
12
+
13
+ t.timestamps null: false
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAdeiaGroups < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_groups do |t|
4
+ t.string :name
5
+
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class CreateAdeiaGroupUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_group_users do |t|
4
+ t.references :group, index: true, foreign_key: true
5
+ t.references :user, index: true, foreign_key: true
6
+
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class CreateAdeiaTokens < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_tokens do |t|
4
+ t.string :token
5
+ t.boolean :valid
6
+ t.references :permission, index: true, foreign_key: true
7
+ t.date :exp_at
8
+
9
+ t.timestamps null: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAdeiaActions < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_actions do |t|
4
+ t.string :name
5
+
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class CreateAdeiaActionPermissions < ActiveRecord::Migration
2
+ def change
3
+ create_table :adeia_action_permissions do |t|
4
+ t.references :action, index: true, foreign_key: true
5
+ t.references :permission, index: true, foreign_key: true
6
+
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,48 @@
1
+ require 'adeia/database'
2
+ require 'adeia/exceptions'
3
+
4
+ module Adeia
5
+
6
+ class Authorization < Database
7
+
8
+ def authorize!
9
+ @rights = token_rights(right_name)
10
+ raise LoginRequired if @rights.empty? && @user.nil?
11
+ @rights.push(send("#{right_name}_rights")) if @user
12
+ raise AccessDenied unless authorize?
13
+ end
14
+
15
+ def can?
16
+ @rights = token_rights.push(send("#{right_name}_rights"))
17
+ authorize?
18
+ end
19
+
20
+ private
21
+
22
+ def authorize?
23
+ all_entries? || on_ownerships? || on_entry?
24
+ end
25
+
26
+ def all_entries?
27
+ @rights.any? { |r| r.permission_type == "all_entries" }
28
+ end
29
+
30
+ def on_ownerships?
31
+ @rights.any? { |r| r.permission_type == "on_ownerships" } && @user && @resource.try(:user) == @user
32
+ end
33
+
34
+ def on_entry?
35
+ @rights.pluck(:resource_id).compact.include? @resource.try(:id)
36
+ end
37
+
38
+ def right_names
39
+ {read: [:index, :show], create: [:new, :create], update: [:edit, :update], destroy: [:destroy]}
40
+ end
41
+
42
+ def right_name
43
+ right_names.select { |k, v| v.include? @action.to_sym }.keys[0] || :action
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,43 @@
1
+ require 'adeia/controller_resource'
2
+
3
+ module Adeia
4
+
5
+ module ControllerMethods
6
+
7
+ module ClassMethods
8
+
9
+ def load_and_authorize(**args)
10
+ ControllerResource.add_before_filter(self, :load_resoure_or_records_and_authorize, **args)
11
+ end
12
+
13
+ end
14
+
15
+ def self.included(base)
16
+ base.extend ClassMethods
17
+ base.helper_method :can?
18
+ end
19
+
20
+ def load_and_authorize!(**args)
21
+ controller_resource = ControllerResource.new(self, **args)
22
+ resource = controller_resource.load_resource
23
+ controller_resource.authorize!
24
+ return resource
25
+ end
26
+
27
+ def authorize_and_load_records!(**args)
28
+ controller_resource = ControllerResource.new(self, **args)
29
+ controller_resource.authorize!
30
+ return controller_resource.load_records
31
+ end
32
+
33
+ def authorize!(**args)
34
+ ControllerResource.new(self, **args).authorize!
35
+ end
36
+
37
+ def can?(action, controller=nil, resource=nil)
38
+ args = { action: action, controller: controller, resource: resource }
39
+ ControllerResource.new(self, **args).can?
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,84 @@
1
+ require 'adeia/authorization'
2
+ require 'adeia/exceptions'
3
+
4
+ module Adeia
5
+
6
+ class ControllerResource
7
+
8
+ def self.add_before_filter(controller_class, method, **args)
9
+ controller_class.send(:before_action, args.slice(:only, :except, :if, :unless)) do |controller|
10
+ ControllerResource.send(method, controller)
11
+ end
12
+ end
13
+
14
+ def self.load_resoure_or_records_and_authorize(controller)
15
+ if controller.action_name == "index"
16
+ controller.authorize_and_load_records!
17
+ else
18
+ controller.load_and_authorize!
19
+ end
20
+ end
21
+
22
+ def initialize(controller, **args)
23
+ @controller = controller
24
+ @action_name = args.fetch(:action, @controller.action_name)
25
+ @controller_name = args.fetch(:controller, @controller.controller_path)
26
+ @token = args.fetch(:token, @controller.params[:token])
27
+ @resource = args[:resource]
28
+ @user = @controller.current_user
29
+ end
30
+
31
+ def load_resource
32
+ begin
33
+ @resource = resource_class.find(@controller.params.fetch(:id))
34
+ @controller.instance_variable_set("@#{resource_name}", @resource)
35
+ rescue KeyError
36
+ raise MissingParams.new(:id)
37
+ end
38
+ end
39
+
40
+ def load_records
41
+ rights = authorization.read_rights + authorization.token_rights
42
+ resource_ids = rights.pluck(:resource_id).compact
43
+ @records ||= if rights.any? { |r| r.permission_type == "all_entries" }
44
+ resource_class.all
45
+ elsif rights.any? { |r| r.permission_type == "on_ownerships" }
46
+ resource_class.where(user_id: @user.id, id: resource_ids)
47
+ elsif rights.any? { |r| r.permission_type == "on_entry" }
48
+ resource_class.where(id: resource_ids)
49
+ else
50
+ resource_class.none
51
+ end
52
+ @controller.instance_variable_set("@#{resource_name.pluralize}", @records)
53
+ end
54
+
55
+ def authorization
56
+ @authorization ||= Authorization.new(@controller_name, @action_name, @token, @resource, @user)
57
+ end
58
+
59
+
60
+ def authorize!
61
+ authorization.authorize!
62
+ end
63
+
64
+ def can?
65
+ authorization.can?
66
+ end
67
+
68
+ private
69
+
70
+ def resource_class
71
+ begin
72
+ @controller.controller_path.classify.constantize
73
+ rescue NameError
74
+ @controller.controller_name.classify.constantize
75
+ end
76
+ end
77
+
78
+ def resource_name
79
+ resource_class.model_name.element
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,52 @@
1
+ module Adeia
2
+
3
+ class Database
4
+
5
+ def initialize(controller, action, token, resource, user)
6
+ @controller = controller
7
+ @action = action
8
+ @token = token
9
+ @resource = resource
10
+ @user = user
11
+ end
12
+
13
+ def read_rights
14
+ @read_rights ||= Adeia::Permission.joins(:element).where(owner: owners, read_right: true, elements: {name: @controller})
15
+ end
16
+
17
+ def create_rights
18
+ @create_rights ||= Adeia::Permission.joins(:element).where(owner: owners, create_right: true, elements: {name: @controller})
19
+ end
20
+
21
+ def update_rights
22
+ @update_rights ||= Adeia::Permission.joins(:element).where(owner: owners, update_right: true, elements: {name: @controller})
23
+ end
24
+
25
+ def destroy_rights
26
+ @destroy_rights ||= Adeia::Permission.joins(:element).where(owner: owners, destroy_right: true, elements: {name: @controller})
27
+ end
28
+
29
+ def action_rights
30
+ @action_rights ||= Adeia::Permission.joins(:actions, :element).where(owner: owners, elements: {name: @controller}, actions: {name: @action})
31
+ end
32
+
33
+ def token_rights(right_name)
34
+ @permission_token ||= Adeia::Token.find_by_token(@token)
35
+ if @permission_token && @permission_token.valid
36
+ @token_rights ||= Adeia::Permission.joins(:element).where("ownerships.id = ? AND elements.name = ? AND #{right_name}_right = ?", @permission_token.permission_id, @controller, true)
37
+ else
38
+ @token_rights ||= Adeia::Permission.none
39
+ end
40
+ end
41
+
42
+ def user_groups
43
+ @user_groups ||= Adeia::Group.joins(:group_users).where(adeia_group_users: { user_id: @user.id })
44
+ end
45
+
46
+ def owners
47
+ @owners ||= user_groups.push @user
48
+ end
49
+
50
+ end
51
+
52
+ end
data/lib/adeia/engine.rb CHANGED
@@ -1,4 +1,12 @@
1
+ require "adeia/controller_methods"
2
+
1
3
  module Adeia
2
4
  class Engine < ::Rails::Engine
5
+ isolate_namespace Adeia
6
+
7
+ initializer 'Adeia.controller' do |app|
8
+ ActionController::Base.send :include, Adeia::ControllerMethods
9
+ end
10
+
3
11
  end
4
12
  end
@@ -0,0 +1,33 @@
1
+ module Adeia
2
+
3
+ class Error < StandardError; end
4
+
5
+ class LoginRequired < Error
6
+
7
+ def to_s
8
+ I18n.t("exceptions.messages.login_required")
9
+ end
10
+
11
+ end
12
+
13
+ class AccessDenied < Error
14
+
15
+ def to_s
16
+ I18n.t("exceptions.messages.access_denied")
17
+ end
18
+
19
+ end
20
+
21
+ class MissingParams < Error
22
+
23
+ def initialize(params)
24
+ @params = params
25
+ end
26
+
27
+ def to_s
28
+ I18n.t("exceptions.messages.missing_params", params: @params)
29
+ end
30
+
31
+ end
32
+
33
+ end
data/lib/adeia/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Adeia
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,56 @@
1
+ body { background-color: #fff; color: #333; }
2
+
3
+ body, p, ol, ul, td {
4
+ font-family: verdana, arial, helvetica, sans-serif;
5
+ font-size: 13px;
6
+ line-height: 18px;
7
+ }
8
+
9
+ pre {
10
+ background-color: #eee;
11
+ padding: 10px;
12
+ font-size: 11px;
13
+ }
14
+
15
+ a { color: #000; }
16
+ a:visited { color: #666; }
17
+ a:hover { color: #fff; background-color:#000; }
18
+
19
+ div.field, div.actions {
20
+ margin-bottom: 10px;
21
+ }
22
+
23
+ #notice {
24
+ color: green;
25
+ }
26
+
27
+ .field_with_errors {
28
+ padding: 2px;
29
+ background-color: red;
30
+ display: table;
31
+ }
32
+
33
+ #error_explanation {
34
+ width: 450px;
35
+ border: 2px solid red;
36
+ padding: 7px;
37
+ padding-bottom: 0;
38
+ margin-bottom: 20px;
39
+ background-color: #f0f0f0;
40
+ }
41
+
42
+ #error_explanation h2 {
43
+ text-align: left;
44
+ font-weight: bold;
45
+ padding: 5px 5px 5px 15px;
46
+ font-size: 12px;
47
+ margin: -7px;
48
+ margin-bottom: 0px;
49
+ background-color: #c00;
50
+ color: #fff;
51
+ }
52
+
53
+ #error_explanation ul li {
54
+ font-size: 12px;
55
+ list-style: square;
56
+ }
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -2,4 +2,6 @@ class ApplicationController < ActionController::Base
2
2
  # Prevent CSRF attacks by raising an exception.
3
3
  # For APIs, you may want to use :null_session instead.
4
4
  protect_from_forgery with: :exception
5
+
6
+ include SessionsHelper
5
7
  end
@@ -0,0 +1,55 @@
1
+ class ArticlesController < ApplicationController
2
+ before_action :set_article, only: [:show, :edit, :update, :destroy]
3
+ load_and_authorize
4
+
5
+ def index
6
+ #@articles = Article.all
7
+ #authorize_and_load_records!
8
+ end
9
+
10
+ def show
11
+ #load_and_authorize!
12
+ end
13
+
14
+ def new
15
+ #authorize!
16
+ @article = Article.new
17
+ end
18
+
19
+ def edit
20
+ #load_and_authorize!
21
+ end
22
+
23
+ def create
24
+ @article = Article.new(article_params)
25
+ @article.user = current_user
26
+ if @article.save
27
+ redirect_to @article, notice: 'Article was successfully created.'
28
+ else
29
+ render :new
30
+ end
31
+ end
32
+
33
+ def update
34
+ if @article.update(article_params)
35
+ redirect_to @article, notice: 'Article was successfully updated.'
36
+ else
37
+ render :edit
38
+ end
39
+ end
40
+
41
+ def destroy
42
+ @article.destroy
43
+ redirect_to articles_url, notice: 'Article was successfully destroyed.'
44
+ end
45
+
46
+ private
47
+
48
+ def set_article
49
+ @article = Article.find(params[:id])
50
+ end
51
+
52
+ def article_params
53
+ params.require(:article).permit(:title, :content)
54
+ end
55
+ end