alberich 0.2.0

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.
Files changed (242) hide show
  1. data/Gemfile +18 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +37 -0
  4. data/Rakefile +34 -0
  5. data/alberich.gemspec +34 -0
  6. data/app/assets/javascripts/alberich/application.js +15 -0
  7. data/app/assets/javascripts/alberich/permissions.js +2 -0
  8. data/app/assets/javascripts/alberich/privileges.js +2 -0
  9. data/app/assets/javascripts/alberich/roles.js +2 -0
  10. data/app/assets/stylesheets/alberich/application.css +13 -0
  11. data/app/assets/stylesheets/alberich/permissions.css +4 -0
  12. data/app/assets/stylesheets/alberich/privileges.css +4 -0
  13. data/app/assets/stylesheets/alberich/roles.css +4 -0
  14. data/app/assets/stylesheets/scaffold.css +56 -0
  15. data/app/controllers/alberich/application_controller.rb +4 -0
  16. data/app/controllers/alberich/application_controller_helper.rb +118 -0
  17. data/app/controllers/alberich/permissions_controller.rb +211 -0
  18. data/app/controllers/alberich/privileges_controller.rb +105 -0
  19. data/app/controllers/alberich/roles_controller.rb +97 -0
  20. data/app/helpers/alberich/application_helper.rb +4 -0
  21. data/app/helpers/alberich/permissions_helper.rb +4 -0
  22. data/app/helpers/alberich/privileges_helper.rb +4 -0
  23. data/app/helpers/alberich/roles_helper.rb +4 -0
  24. data/app/models/alberich/base_permission_object.rb +42 -0
  25. data/app/models/alberich/derived_permission.rb +25 -0
  26. data/app/models/alberich/entity.rb +27 -0
  27. data/app/models/alberich/entity_target_observer.rb +16 -0
  28. data/app/models/alberich/permission.rb +59 -0
  29. data/app/models/alberich/permission_session.rb +33 -0
  30. data/app/models/alberich/permissioned_object.rb +139 -0
  31. data/app/models/alberich/privilege.rb +29 -0
  32. data/app/models/alberich/role.rb +37 -0
  33. data/app/models/alberich/session_entity.rb +15 -0
  34. data/app/views/alberich/permissions/_form.html.haml +27 -0
  35. data/app/views/alberich/permissions/_list.html.haml +1 -0
  36. data/app/views/alberich/permissions/_objects.html.haml +38 -0
  37. data/app/views/alberich/permissions/_permissions.html.haml +45 -0
  38. data/app/views/alberich/permissions/index.html.haml +2 -0
  39. data/app/views/alberich/permissions/new.html.haml +5 -0
  40. data/app/views/alberich/permissions/show.html.haml +12 -0
  41. data/app/views/alberich/privileges/_form.html.haml +19 -0
  42. data/app/views/alberich/privileges/_list.html.haml +17 -0
  43. data/app/views/alberich/privileges/create.html.haml +2 -0
  44. data/app/views/alberich/privileges/destroy.html.haml +2 -0
  45. data/app/views/alberich/privileges/edit.html.haml +5 -0
  46. data/app/views/alberich/privileges/index.html.haml +5 -0
  47. data/app/views/alberich/privileges/new.html.haml +5 -0
  48. data/app/views/alberich/privileges/show.html.haml +12 -0
  49. data/app/views/alberich/privileges/update.html.haml +2 -0
  50. data/app/views/alberich/roles/_form.html.haml +24 -0
  51. data/app/views/alberich/roles/edit.html.haml +7 -0
  52. data/app/views/alberich/roles/index.html.haml +23 -0
  53. data/app/views/alberich/roles/new.html.haml +5 -0
  54. data/app/views/alberich/roles/show.html.haml +16 -0
  55. data/app/views/layouts/alberich/application.html.erb +14 -0
  56. data/config/initializers/haml.rb +1 -0
  57. data/config/routes.rb +17 -0
  58. data/db/migrate/20120925162242_create_alberich_roles.rb +12 -0
  59. data/db/migrate/20121022223626_create_alberich_privileges.rb +12 -0
  60. data/db/migrate/20121023051301_create_alberich_base_permission_objects.rb +9 -0
  61. data/db/migrate/20121023233648_create_alberich_permission_sessions.rb +11 -0
  62. data/db/migrate/20121027023136_create_alberich_entities.rb +34 -0
  63. data/db/migrate/20121204205213_create_alberich_session_entities.rb +12 -0
  64. data/db/migrate/20121205180518_create_alberich_permissions.rb +13 -0
  65. data/db/migrate/20130107043252_create_alberich_derived_permissions.rb +18 -0
  66. data/lib/alberich.rb +10 -0
  67. data/lib/alberich/#version.rb# +3 -0
  68. data/lib/alberich/engine.rb +10 -0
  69. data/lib/alberich/version.rb +3 -0
  70. data/lib/generators/alberich/install_generator.rb +15 -0
  71. data/lib/generators/alberich/templates/README +6 -0
  72. data/lib/generators/alberich/templates/alberich.rb +11 -0
  73. data/lib/tasks/alberich_tasks.rake +4 -0
  74. data/spec/controllers/alberich/permissions_controller_spec.rb +112 -0
  75. data/spec/controllers/alberich/privileges_controller_spec.rb +131 -0
  76. data/spec/controllers/alberich/roles_controller_spec.rb +130 -0
  77. data/spec/factories/alberich/permission.rb +51 -0
  78. data/spec/factories/alberich/permission_session.rb +7 -0
  79. data/spec/factories/alberich/privilege.rb +6 -0
  80. data/spec/factories/alberich/role.rb +103 -0
  81. data/spec/factories/child_resource.rb +14 -0
  82. data/spec/factories/child_resource.rb~ +7 -0
  83. data/spec/factories/global_resource.rb +11 -0
  84. data/spec/factories/global_resource.rb~ +25 -0
  85. data/spec/factories/parent_resource.rb +12 -0
  86. data/spec/factories/parent_resource.rb~ +7 -0
  87. data/spec/factories/standalone_resource.rb +7 -0
  88. data/spec/factories/standalone_resource.rb~ +11 -0
  89. data/spec/factories/user.rb +30 -0
  90. data/spec/factories/user_group.rb +8 -0
  91. data/spec/models/alberich/derived_permission_spec.rb +34 -0
  92. data/spec/models/alberich/entity_spec.rb +15 -0
  93. data/spec/models/alberich/permission_spec.rb +133 -0
  94. data/spec/models/alberich/privilege_spec.rb +39 -0
  95. data/spec/models/alberich/role_spec.rb +33 -0
  96. data/spec/models/alberich/session_entity_spec.rb +24 -0
  97. data/spec/spec_helper.rb +81 -0
  98. data/spec/support/routes.rb +41 -0
  99. data/test/dummy/README.rdoc +261 -0
  100. data/test/dummy/Rakefile +7 -0
  101. data/test/dummy/app/assets/javascripts/application.js +15 -0
  102. data/test/dummy/app/assets/javascripts/child_resources.js +2 -0
  103. data/test/dummy/app/assets/javascripts/global_resources.js +2 -0
  104. data/test/dummy/app/assets/javascripts/parent_resources.js +2 -0
  105. data/test/dummy/app/assets/javascripts/standalone_resources.js +2 -0
  106. data/test/dummy/app/assets/javascripts/user_groups.js +2 -0
  107. data/test/dummy/app/assets/javascripts/users.js +2 -0
  108. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  109. data/test/dummy/app/assets/stylesheets/child_resources.css +4 -0
  110. data/test/dummy/app/assets/stylesheets/global_resources.css +4 -0
  111. data/test/dummy/app/assets/stylesheets/parent_resources.css +4 -0
  112. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  113. data/test/dummy/app/assets/stylesheets/standalone_resources.css +4 -0
  114. data/test/dummy/app/assets/stylesheets/user_groups.css +4 -0
  115. data/test/dummy/app/assets/stylesheets/users.css +4 -0
  116. data/test/dummy/app/controllers/application_controller.rb +73 -0
  117. data/test/dummy/app/controllers/child_resources_controller.rb +99 -0
  118. data/test/dummy/app/controllers/child_resources_controller.rb~ +83 -0
  119. data/test/dummy/app/controllers/global_resources_controller.rb +95 -0
  120. data/test/dummy/app/controllers/global_resources_controller.rb~ +83 -0
  121. data/test/dummy/app/controllers/parent_resources_controller.rb +101 -0
  122. data/test/dummy/app/controllers/parent_resources_controller.rb~ +83 -0
  123. data/test/dummy/app/controllers/standalone_resources_controller.rb +101 -0
  124. data/test/dummy/app/controllers/standalone_resources_controller.rb~ +83 -0
  125. data/test/dummy/app/controllers/user_groups_controller.rb +131 -0
  126. data/test/dummy/app/controllers/user_sessions_controller.rb +38 -0
  127. data/test/dummy/app/controllers/users_controller.rb +87 -0
  128. data/test/dummy/app/helpers/application_helper.rb +2 -0
  129. data/test/dummy/app/helpers/child_resources_helper.rb +2 -0
  130. data/test/dummy/app/helpers/global_resources_helper.rb +2 -0
  131. data/test/dummy/app/helpers/parent_resources_helper.rb +2 -0
  132. data/test/dummy/app/helpers/standalone_resources_helper.rb +2 -0
  133. data/test/dummy/app/helpers/user_groups_helper.rb +2 -0
  134. data/test/dummy/app/helpers/users_helper.rb +2 -0
  135. data/test/dummy/app/models/child_resource.rb +25 -0
  136. data/test/dummy/app/models/child_resource.rb~ +4 -0
  137. data/test/dummy/app/models/global_resource.rb +3 -0
  138. data/test/dummy/app/models/parent_resource.rb +32 -0
  139. data/test/dummy/app/models/parent_resource.rb~ +3 -0
  140. data/test/dummy/app/models/standalone_resource.rb +22 -0
  141. data/test/dummy/app/models/standalone_resource.rb~ +3 -0
  142. data/test/dummy/app/models/user.rb +80 -0
  143. data/test/dummy/app/models/user_group.rb +12 -0
  144. data/test/dummy/app/views/child_resources/_form.html.erb +30 -0
  145. data/test/dummy/app/views/child_resources/_form.html.erb~ +29 -0
  146. data/test/dummy/app/views/child_resources/edit.html.erb +6 -0
  147. data/test/dummy/app/views/child_resources/index.html.erb +25 -0
  148. data/test/dummy/app/views/child_resources/index.html.erb~ +27 -0
  149. data/test/dummy/app/views/child_resources/new.html.erb +5 -0
  150. data/test/dummy/app/views/child_resources/show.html.erb +20 -0
  151. data/test/dummy/app/views/child_resources/show.html.erb~ +20 -0
  152. data/test/dummy/app/views/global_resources/_form.html.erb +25 -0
  153. data/test/dummy/app/views/global_resources/edit.html.erb +6 -0
  154. data/test/dummy/app/views/global_resources/index.html.erb +25 -0
  155. data/test/dummy/app/views/global_resources/new.html.erb +5 -0
  156. data/test/dummy/app/views/global_resources/show.html.erb +15 -0
  157. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  158. data/test/dummy/app/views/parent_resources/_form.html.erb +25 -0
  159. data/test/dummy/app/views/parent_resources/edit.html.erb +6 -0
  160. data/test/dummy/app/views/parent_resources/index.html.erb +25 -0
  161. data/test/dummy/app/views/parent_resources/index.html.erb~ +25 -0
  162. data/test/dummy/app/views/parent_resources/new.html.erb +5 -0
  163. data/test/dummy/app/views/parent_resources/show.html.erb +44 -0
  164. data/test/dummy/app/views/parent_resources/show.html.erb~ +15 -0
  165. data/test/dummy/app/views/standalone_resources/_form.html.erb +25 -0
  166. data/test/dummy/app/views/standalone_resources/edit.html.erb +6 -0
  167. data/test/dummy/app/views/standalone_resources/index.html.erb +25 -0
  168. data/test/dummy/app/views/standalone_resources/new.html.erb +5 -0
  169. data/test/dummy/app/views/standalone_resources/show.html.erb +15 -0
  170. data/test/dummy/app/views/user_groups/_form.html.haml +9 -0
  171. data/test/dummy/app/views/user_groups/add_members.html.haml +18 -0
  172. data/test/dummy/app/views/user_groups/edit.html.haml +13 -0
  173. data/test/dummy/app/views/user_groups/index.html.haml +20 -0
  174. data/test/dummy/app/views/user_groups/new.html.haml +11 -0
  175. data/test/dummy/app/views/user_groups/show.html.haml +42 -0
  176. data/test/dummy/app/views/user_sessions/new.html.haml +26 -0
  177. data/test/dummy/app/views/users/_form.html.haml +25 -0
  178. data/test/dummy/app/views/users/edit.html.haml +14 -0
  179. data/test/dummy/app/views/users/index.html.haml +26 -0
  180. data/test/dummy/app/views/users/new.html.haml +11 -0
  181. data/test/dummy/app/views/users/show.html.haml +56 -0
  182. data/test/dummy/config.ru +4 -0
  183. data/test/dummy/config/application.rb +59 -0
  184. data/test/dummy/config/boot.rb +10 -0
  185. data/test/dummy/config/database.yml +25 -0
  186. data/test/dummy/config/environment.rb +5 -0
  187. data/test/dummy/config/environments/development.rb +37 -0
  188. data/test/dummy/config/environments/production.rb +67 -0
  189. data/test/dummy/config/environments/test.rb +37 -0
  190. data/test/dummy/config/initializers/alberich.rb +13 -0
  191. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  192. data/test/dummy/config/initializers/inflections.rb +15 -0
  193. data/test/dummy/config/initializers/mime_types.rb +5 -0
  194. data/test/dummy/config/initializers/secret_token.rb +7 -0
  195. data/test/dummy/config/initializers/session_store.rb +8 -0
  196. data/test/dummy/config/initializers/warden.rb +79 -0
  197. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  198. data/test/dummy/config/locales/en.yml +5 -0
  199. data/test/dummy/config/routes.rb +33 -0
  200. data/test/dummy/db/migrate/20120801010101_create_users.rb +20 -0
  201. data/test/dummy/db/migrate/20121121054319_create_user_groups.rb +16 -0
  202. data/test/dummy/db/migrate/20130220160811_create_global_resources.rb +10 -0
  203. data/test/dummy/db/migrate/20130220175258_create_standalone_resources.rb +10 -0
  204. data/test/dummy/db/migrate/20130226145412_create_parent_resources.rb +10 -0
  205. data/test/dummy/db/migrate/20130226151256_create_child_resources.rb +12 -0
  206. data/test/dummy/db/migrate/20130226151256_create_child_resources.rb~ +12 -0
  207. data/test/dummy/db/schema.rb +151 -0
  208. data/test/dummy/db/seeds.rb +65 -0
  209. data/test/dummy/lib/password.rb +58 -0
  210. data/test/dummy/public/404.html +26 -0
  211. data/test/dummy/public/422.html +26 -0
  212. data/test/dummy/public/500.html +25 -0
  213. data/test/dummy/public/favicon.ico +0 -0
  214. data/test/dummy/script/rails +6 -0
  215. data/test/dummy/test/fixtures/child_resources.yml +11 -0
  216. data/test/dummy/test/fixtures/global_resources.yml +9 -0
  217. data/test/dummy/test/fixtures/parent_resources.yml +9 -0
  218. data/test/dummy/test/fixtures/standalone_resources.yml +9 -0
  219. data/test/dummy/test/fixtures/user_groups.yml +9 -0
  220. data/test/dummy/test/fixtures/users.yml +37 -0
  221. data/test/dummy/test/functional/child_resources_controller_test.rb +49 -0
  222. data/test/dummy/test/functional/global_resources_controller_test.rb +49 -0
  223. data/test/dummy/test/functional/parent_resources_controller_test.rb +49 -0
  224. data/test/dummy/test/functional/standalone_resources_controller_test.rb +49 -0
  225. data/test/dummy/test/functional/user_groups_controller_test.rb +49 -0
  226. data/test/dummy/test/functional/users_controller_test.rb +39 -0
  227. data/test/dummy/test/unit/child_resource_test.rb +7 -0
  228. data/test/dummy/test/unit/global_resource_test.rb +7 -0
  229. data/test/dummy/test/unit/helpers/child_resources_helper_test.rb +4 -0
  230. data/test/dummy/test/unit/helpers/global_resources_helper_test.rb +4 -0
  231. data/test/dummy/test/unit/helpers/parent_resources_helper_test.rb +4 -0
  232. data/test/dummy/test/unit/helpers/standalone_resources_helper_test.rb +4 -0
  233. data/test/dummy/test/unit/helpers/user_groups_helper_test.rb +4 -0
  234. data/test/dummy/test/unit/helpers/users_helper_test.rb +4 -0
  235. data/test/dummy/test/unit/parent_resource_test.rb +7 -0
  236. data/test/dummy/test/unit/standalone_resource_test.rb +7 -0
  237. data/test/dummy/test/unit/user_group_test.rb +7 -0
  238. data/test/dummy/test/unit/user_test.rb +7 -0
  239. data/test/integration/alberich/permission_test.rb +7 -0
  240. data/test/integration/alberich/privilege_test.rb +7 -0
  241. data/test/integration/alberich/role_test.rb +7 -0
  242. metadata +639 -0
@@ -0,0 +1,105 @@
1
+ require_dependency "alberich/application_controller"
2
+
3
+ module Alberich
4
+ class PrivilegesController < Alberich::ApplicationController
5
+ # GET /privileges
6
+ # GET /privileges.json
7
+ def index
8
+ require_privilege(Privilege::PERM_VIEW)
9
+ @privileges = Privilege.all
10
+
11
+ respond_to do |format|
12
+ format.html # index.html.erb
13
+ format.json { render json: @privileges }
14
+ end
15
+ end
16
+
17
+ # GET /privileges/1
18
+ # GET /privileges/1.json
19
+ def show
20
+ require_privilege(Privilege::PERM_VIEW)
21
+ @privilege = Privilege.find(params[:id])
22
+
23
+ respond_to do |format|
24
+ format.html # show.html.erb
25
+ format.json { render json: @role }
26
+ end
27
+ end
28
+
29
+ # GET /privileges/new
30
+ # GET /privileges/new.json
31
+ def new
32
+ require_privilege(Privilege::PERM_SET)
33
+ @privilege = Privilege.new(:role_id => params[:role_id])
34
+ @target_type_list = Privilege::TARGET_TYPES
35
+ @action_list = Privilege::ACTIONS
36
+ respond_to do |format|
37
+ format.html # new.html.erb
38
+ format.json { render json: @privilege }
39
+ end
40
+ end
41
+
42
+ # POST /privileges
43
+ # POST /privileges.json
44
+ def create
45
+ require_privilege(Privilege::PERM_SET)
46
+ @privilege = Privilege.new(params[:privilege])
47
+ @target_type_list = Privilege::TARGET_TYPES
48
+ @action_list = Privilege::ACTIONS
49
+
50
+ respond_to do |format|
51
+ if @privilege.save
52
+ format.html { redirect_to @privilege.role, notice: "New privilege added" }
53
+ format.json { render json: @privilege, status: :created, location: @privilege }
54
+ else
55
+ format.html { render action: "new" }
56
+ format.json { render json: @privilege.errors, status: :unprocessable_entity }
57
+ end
58
+ end
59
+ end
60
+
61
+ # GET /privileges/1/edit
62
+ def edit
63
+ require_privilege(Privilege::PERM_SET)
64
+ @privilege = Privilege.find(params[:id])
65
+ @target_type_list = Privilege::TARGET_TYPES
66
+ @action_list = Privilege::ACTIONS
67
+ respond_to do |format|
68
+ format.html # new.html.erb
69
+ format.json { render json: @privilege }
70
+ end
71
+ end
72
+
73
+ # PUT /privileges/1
74
+ # PUT /privileges/1.json
75
+ def update
76
+ require_privilege(Privilege::PERM_SET)
77
+ @privilege = Privilege.find(params[:id])
78
+ @target_type_list = Privilege::TARGET_TYPES
79
+ @action_list = Privilege::ACTIONS
80
+ respond_to do |format|
81
+ if @privilege.update_attributes(params[:privilege])
82
+ format.html { redirect_to @privilege.role, notice: "New privilege added"}
83
+ format.json { head :no_content }
84
+ else
85
+ format.html { render action: "edit" }
86
+ format.json { render json: @privilege.errors, status: :unprocessable_entity }
87
+ end
88
+ end
89
+ end
90
+
91
+ # DELETE /privileges/1
92
+ # DELETE /privileges/1.json
93
+ def destroy
94
+ require_privilege(Privilege::PERM_SET)
95
+ @privilege = Privilege.find(params[:id])
96
+ role = @privilege.role
97
+ @privilege.destroy
98
+
99
+ respond_to do |format|
100
+ format.html { redirect_to role }
101
+ format.json { head :no_content }
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,97 @@
1
+ require_dependency "alberich/application_controller"
2
+
3
+ module Alberich
4
+ class RolesController < Alberich::ApplicationController
5
+
6
+ before_filter :require_user
7
+ # GET /roles
8
+ # GET /roles.json
9
+ def index
10
+ require_privilege(Privilege::PERM_VIEW)
11
+ @roles = Role.all
12
+
13
+ respond_to do |format|
14
+ format.html # index.html.erb
15
+ format.json { render json: @roles }
16
+ end
17
+ end
18
+
19
+ # GET /roles/1
20
+ # GET /roles/1.json
21
+ def show
22
+ require_privilege(Privilege::PERM_VIEW)
23
+ @role = Role.find(params[:id])
24
+
25
+ respond_to do |format|
26
+ format.html # show.html.erb
27
+ format.json { render json: @role }
28
+ end
29
+ end
30
+
31
+ # GET /roles/new
32
+ # GET /roles/new.json
33
+ def new
34
+ require_privilege(Privilege::PERM_SET)
35
+ @role = Role.new
36
+ @scope_list = Role::VALID_SCOPES
37
+ respond_to do |format|
38
+ format.html # new.html.erb
39
+ format.json { render json: @role }
40
+ end
41
+ end
42
+
43
+ # GET /roles/1/edit
44
+ def edit
45
+ require_privilege(Privilege::PERM_SET)
46
+ @role = Role.find(params[:id])
47
+ @scope_list = Role::VALID_SCOPES
48
+ end
49
+
50
+ # POST /roles
51
+ # POST /roles.json
52
+ def create
53
+ require_privilege(Privilege::PERM_SET)
54
+ @role = Role.new(params[:role])
55
+
56
+ respond_to do |format|
57
+ if @role.save
58
+ format.html { redirect_to @role, notice: "New role added"}
59
+ format.json { render json: @role, status: :created, location: @role }
60
+ else
61
+ format.html { render action: "new" }
62
+ format.json { render json: @role.errors, status: :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ # PUT /roles/1
68
+ # PUT /roles/1.json
69
+ def update
70
+ require_privilege(Privilege::PERM_SET)
71
+ @role = Role.find(params[:id])
72
+
73
+ respond_to do |format|
74
+ if @role.update_attributes(params[:role])
75
+ format.html { redirect_to @role, notice: "Role updated successfully"}
76
+ format.json { head :no_content }
77
+ else
78
+ format.html { render action: "edit" }
79
+ format.json { render json: @role.errors, status: :unprocessable_entity }
80
+ end
81
+ end
82
+ end
83
+
84
+ # DELETE /roles/1
85
+ # DELETE /roles/1.json
86
+ def destroy
87
+ require_privilege(Privilege::PERM_SET)
88
+ @role = Role.find(params[:id])
89
+ @role.destroy
90
+
91
+ respond_to do |format|
92
+ format.html { redirect_to roles_url }
93
+ format.json { head :no_content }
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,4 @@
1
+ module Alberich
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Alberich
2
+ module PermissionsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Alberich
2
+ module PrivilegesHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Alberich
2
+ module RolesHelper
3
+ end
4
+ end
@@ -0,0 +1,42 @@
1
+ module Alberich
2
+ class BasePermissionObject < ActiveRecord::Base
3
+ attr_accessible :name
4
+
5
+ include Alberich::PermissionedObject
6
+ validates_presence_of :name
7
+ validates_uniqueness_of :name
8
+
9
+ GENERAL_PERMISSION_SCOPE = "general_permission_scope"
10
+
11
+ def self.general_permission_scope
12
+ base_permission = self.find_by_name(GENERAL_PERMISSION_SCOPE)
13
+ unless base_permission
14
+ base_permission = self.create!(:name => GENERAL_PERMISSION_SCOPE)
15
+ end
16
+ base_permission
17
+ end
18
+
19
+ def permissions_for_type(obj_type)
20
+ role_ids = Role.where(:scope => "BasePermissionObject").
21
+ select { |role| role.privilege_target_match(obj_type)}.collect {|r| r.id}
22
+ permissions.where("role_id in (:role_ids)", {:role_ids => role_ids})
23
+ end
24
+
25
+ def self.additional_privilege_target_types
26
+ Alberich.permissioned_object_classes.collect {|x| Kernel.const_get(x)}
27
+ end
28
+
29
+ def self.global_admin_permission_count
30
+ self.general_permission_scope.permissions.includes(:role => :privileges).
31
+ where("alberich_privileges.target_type" => "Alberich::BasePermissionObject",
32
+ "alberich_privileges.action" => Privilege::PERM_SET).size
33
+ end
34
+
35
+ def self.is_global_admin_perm(permission)
36
+ permission.role.privileges.where("alberich_privileges.target_type" =>
37
+ "Alberich::BasePermissionObject",
38
+ "alberich_privileges.action" =>
39
+ Privilege::PERM_SET).size > 0
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ module Alberich
2
+ class DerivedPermission < ActiveRecord::Base
3
+ attr_accessible :entity_id, :permission_id, :role_id, :permission_object
4
+ attr_accessible :permission
5
+
6
+ # the source permission for the denormalized object
7
+ belongs_to :permission
8
+ validates_presence_of :permission_id
9
+
10
+ # this is the object used for permission checks
11
+ belongs_to :permission_object, :polymorphic => true
12
+
13
+ belongs_to :role
14
+ validates_presence_of :role_id
15
+
16
+ # entity is copied from source permission
17
+ belongs_to :entity
18
+ validates_presence_of :entity_id
19
+
20
+ validates_uniqueness_of :permission_id, :scope => [:permission_object_id,
21
+ :permission_object_type]
22
+
23
+
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Alberich
2
+ class Entity < ActiveRecord::Base
3
+ attr_accessible :entity_target, :entity_target_id, :name
4
+
5
+ belongs_to :entity_target, :polymorphic => true
6
+ validates_presence_of :entity_target_id
7
+ has_many :session_entities, :dependent => :destroy
8
+ has_many :permissions, :dependent => :destroy
9
+ has_many :derived_permissions, :dependent => :destroy
10
+
11
+ # type-specific associations
12
+ belongs_to :user, :class_name => Alberich.user_class, :foreign_key => "entity_target_id"
13
+ belongs_to :user_group, :class_name => Alberich.user_group_class,
14
+ :foreign_key => "entity_target_id"
15
+
16
+ def self.for_target(obj)
17
+ self.find_by_entity_target_id_and_entity_target_type(obj.id,
18
+ obj.class.name)
19
+ end
20
+
21
+ def self.find_or_create_for_target(obj)
22
+ self.find_or_create_by_entity_target_id_and_entity_target_type(obj.id,
23
+ obj.class.name)
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module Alberich
2
+ class EntityTargetObserver < ActiveRecord::Observer
3
+ observe Alberich.user_class.underscore.to_sym, Alberich.user_group_class.underscore.to_sym
4
+
5
+ def after_save(obj)
6
+ entity = Entity.find_or_create_for_target(obj)
7
+ entity.name = obj.to_s
8
+ entity.save!
9
+ end
10
+
11
+ def after_destroy(obj)
12
+ entity = Entity.for_target(obj)
13
+ entity.destroy if entity
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,59 @@
1
+ module Alberich
2
+ class Permission < ActiveRecord::Base
3
+ attr_accessible :entity, :role, :entity_id, :role_id, :permission_object
4
+
5
+ belongs_to :role
6
+ belongs_to :entity
7
+
8
+ validates_presence_of :role_id
9
+
10
+ validates_presence_of :entity_id
11
+ validates_uniqueness_of :entity_id, :scope => [:permission_object_id,
12
+ :permission_object_type,
13
+ :role_id]
14
+
15
+ belongs_to :permission_object, :polymorphic => true
16
+ # type-specific associations (FIXME: do we still need this?
17
+ belongs_to :base_permission_object, :class_name => "BasePermissionObject",
18
+ :foreign_key => "permission_object_id"
19
+
20
+ has_many :derived_permissions, :dependent => :destroy
21
+
22
+ after_save :update_derived_permissions
23
+
24
+ def user
25
+ entity.user
26
+ end
27
+ def user_group
28
+ entity.user_group
29
+ end
30
+
31
+ def update_derived_permissions
32
+ new_derived_permission_objects = permission_object.derived_subtree(role)
33
+ old_derived_permissions = derived_permissions
34
+ old_derived_permissions.each do |derived_perm|
35
+ if new_derived_permission_objects.delete(derived_perm.permission_object)
36
+ # object is in both old and new list -- update as necessary
37
+ derived_perm.role = role
38
+ derived_perm.entity_id = entity_id
39
+ derived_perm.save!
40
+ else
41
+ # object is in old but not new list -- remove it
42
+ derived_perm.destroy
43
+ end
44
+ end
45
+ new_derived_permission_objects.each do |perm_obj|
46
+ unless DerivedPermission.where(:permission_id => id,
47
+ :permission_object_id => perm_obj.id,
48
+ :permission_object_type =>
49
+ perm_obj.class.name).any?
50
+ derived_perm = DerivedPermission.new(:entity_id => entity_id,
51
+ :role_id => role_id,
52
+ :permission_object => perm_obj,
53
+ :permission => self)
54
+ derived_perm.save!
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,33 @@
1
+ module Alberich
2
+ class PermissionSession < ActiveRecord::Base
3
+ attr_accessible :session_id, :user_id, :user
4
+
5
+ belongs_to :user, :class_name => Alberich.user_class
6
+ has_many :session_entities
7
+
8
+ validates_presence_of :user_id
9
+ validates_presence_of :session_id
10
+
11
+ def update_session_entities(user)
12
+ SessionEntity.transaction do
13
+ # skips callbacks, which should be fine here
14
+ SessionEntity.delete_all(:permission_session_id => self.id)
15
+ add_to_session(user)
16
+ end
17
+ end
18
+
19
+ def add_to_session(user)
20
+ return unless user
21
+ # create mapping for user-level permissions
22
+ SessionEntity.create!(:permission_session_id => self.id,
23
+ :user => user,
24
+ :entity => Entity.for_target(user))
25
+ # create mappings for groups
26
+ user.send(Alberich.groups_for_user_method).each do |ug|
27
+ SessionEntity.create!(:permission_session_id => self.id,
28
+ :user => user,
29
+ :entity => Entity.for_target(ug))
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,139 @@
1
+ module Alberich
2
+ module PermissionedObject
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ has_many :permissions, :as => :permission_object,
6
+ :class_name => 'Alberich::Permission',
7
+ :dependent => :destroy,
8
+ :include => [:role],
9
+ :order => "alberich_permissions.id ASC"
10
+
11
+ has_many :derived_permissions, :as => :permission_object,
12
+ :class_name => 'Alberich::DerivedPermission',
13
+ :dependent => :destroy,
14
+ :include => [:role],
15
+ :order => "alberich_derived_permissions.id ASC"
16
+ end
17
+
18
+ def has_privilege(permission_session, user, action, target_type=nil)
19
+ return false if permission_session.nil? or user.nil? or action.nil?
20
+ target_type = self.class.default_privilege_target_type if target_type.nil?
21
+ if derived_permissions.includes(:role => :privileges,
22
+ :entity => :session_entities).where(
23
+ ["alberich_session_entities.user_id=:user and
24
+ alberich_session_entities.permission_session_id=:permission_session_id and
25
+ alberich_privileges.target_type=:target_type and
26
+ alberich_privileges.action=:action",
27
+ { :user => user.id,
28
+ :permission_session_id => permission_session.id,
29
+ :target_type => target_type.name,
30
+ :action => action}]).any?
31
+ return true
32
+ else
33
+ BasePermissionObject.general_permission_scope.permissions.
34
+ includes(:role => :privileges,
35
+ :entity => :session_entities).where(
36
+ ["alberich_session_entities.user_id=:user and
37
+ alberich_session_entities.permission_session_id=:permission_session_id and
38
+ alberich_privileges.target_type=:target_type and
39
+ alberich_privileges.action=:action",
40
+ { :user => user.id,
41
+ :permission_session_id => permission_session,
42
+ :target_type => target_type.name,
43
+ :action => action}]).any?
44
+ end
45
+ end
46
+
47
+ # Returns the list of objects to check for permissions on -- by default
48
+ # this is empty (we don't denormalize Global permissions as they're
49
+ # handled as a separate case.)
50
+ def perm_ancestors
51
+ []
52
+ end
53
+ # Returns the list of objects to generate derived permissions for
54
+ # -- by default just this object
55
+ def derived_subtree(role = nil)
56
+ [self]
57
+ end
58
+ # on obj creation, set inherited permissions for new object
59
+ def update_derived_permissions_for_ancestors
60
+ # for create hook this should normally be empty
61
+ old_derived_permissions = Hash[derived_permissions.map{|p| [p.permission.id,p]}]
62
+ perm_ancestors.each do |perm_obj|
63
+ perm_obj.permissions.each do |permission|
64
+ if permission.role.privilege_target_match(self.class.default_privilege_target_type)
65
+ unless old_derived_permissions.delete(permission.id)
66
+ derived_permissions.create(:entity_id => permission.entity_id,
67
+ :role_id => permission.role_id,
68
+ :permission => permission)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ # anything remaining in old_derived_permissions should be removed,
74
+ # as would be expected if this hook is triggered by removing a
75
+ # catalog entry for a deployable
76
+ old_derived_permissions.each do |id, derived_perm|
77
+ derived_perm.destroy
78
+ end
79
+ #reload
80
+ end
81
+ # assign owner role so that the creating user has permissions on the object
82
+ # Any roles defined on default_privilege_target_type with assign_to_owner==true
83
+ # will be assigned to the passed-in user on this object
84
+ def assign_owner_roles(user)
85
+ roles = Role.find(:all, :conditions => ["assign_to_owner =:assign and scope=:scope",
86
+ { :assign => true,
87
+ :scope => self.class.default_privilege_target_type.name}])
88
+ roles.each do |role|
89
+ Permission.create!(:role => role, :entity => Entity.for_target(user),
90
+ :permission_object => self)
91
+ end
92
+ self.reload
93
+ end
94
+
95
+ # Any methods here will be able to use the context of the
96
+ # ActiveRecord model the module is included in.
97
+ def self.included(base)
98
+ base.class_eval do
99
+ after_create :update_derived_permissions_for_ancestors
100
+
101
+ # Returns the list of privilege target types that are relevant for
102
+ # permission checking purposes. This is used in setting derived
103
+ # permissions -- there's no need to create denormalized permissions
104
+ # for a role which only grants Provider privileges on a Pool
105
+ # object. By default, this is just the current object's type
106
+ def self.active_privilege_target_types
107
+ [self.default_privilege_target_type] + self.additional_privilege_target_types
108
+ end
109
+ def self.additional_privilege_target_types
110
+ []
111
+ end
112
+ def self.default_privilege_target_type
113
+ self
114
+ end
115
+ def self.list_for_user(permission_session, user, action,
116
+ target_type=self.default_privilege_target_type)
117
+ if permission_session.nil? or user.nil? or action.nil? or target_type.nil?
118
+ return where("1=0")
119
+ end
120
+ if BasePermissionObject.general_permission_scope.
121
+ has_privilege(permission_session, user, action, target_type)
122
+ scoped
123
+ else
124
+ includes([:derived_permissions => {:role => :privileges,
125
+ :entity => :session_entities}]).
126
+ where("alberich_session_entities.user_id=:user and
127
+ alberich_session_entities.permission_session_id=:permission_session_id and
128
+ alberich_privileges.target_type=:target_type and
129
+ alberich_privileges.action=:action",
130
+ {:user => user.id,
131
+ :permission_session_id => permission_session.id,
132
+ :target_type => target_type.name,
133
+ :action => action})
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end