biovision-base 0.5.170614

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 (271) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +42 -0
  4. data/Rakefile +26 -0
  5. data/app/assets/config/biovision_base_manifest.js +0 -0
  6. data/app/assets/images/biovision/base/icons/alert.svg +15 -0
  7. data/app/assets/images/biovision/base/icons/back.svg +28 -0
  8. data/app/assets/images/biovision/base/icons/create.svg +1 -0
  9. data/app/assets/images/biovision/base/icons/destroy.svg +3 -0
  10. data/app/assets/images/biovision/base/icons/edit.svg +22 -0
  11. data/app/assets/images/biovision/base/icons/exit.svg +1 -0
  12. data/app/assets/images/biovision/base/icons/foreign/facebook.svg +1 -0
  13. data/app/assets/images/biovision/base/icons/gear.svg +4 -0
  14. data/app/assets/images/biovision/base/icons/lock-closed.svg +1 -0
  15. data/app/assets/images/biovision/base/icons/lock-open.svg +1 -0
  16. data/app/assets/images/biovision/base/icons/notice.svg +1 -0
  17. data/app/assets/images/biovision/base/icons/return.svg +1 -0
  18. data/app/assets/images/biovision/base/icons/warning.svg +43 -0
  19. data/app/assets/images/biovision/base/icons/world.svg +4 -0
  20. data/app/assets/images/biovision/base/placeholders/image.svg +19 -0
  21. data/app/assets/images/biovision/base/placeholders/photo.svg +23 -0
  22. data/app/assets/images/biovision/base/placeholders/user.svg +21 -0
  23. data/app/assets/javascripts/biovision/base/biovision.js +238 -0
  24. data/app/assets/stylesheets/biovision/base/admin.scss +58 -0
  25. data/app/assets/stylesheets/biovision/base/biovision.scss +472 -0
  26. data/app/assets/stylesheets/biovision/base/buttons.scss +90 -0
  27. data/app/assets/stylesheets/biovision/base/default.scss +45 -0
  28. data/app/assets/stylesheets/biovision/base/filters.scss +53 -0
  29. data/app/assets/stylesheets/biovision/base/fonts.scss +9 -0
  30. data/app/assets/stylesheets/biovision/base/message-box.scss +60 -0
  31. data/app/assets/stylesheets/biovision/base/pagination.scss +42 -0
  32. data/app/assets/stylesheets/biovision/base/tootik.scss +385 -0
  33. data/app/assets/stylesheets/biovision/base/track.scss +28 -0
  34. data/app/controllers/admin/agents_controller.rb +30 -0
  35. data/app/controllers/admin/browsers_controller.rb +30 -0
  36. data/app/controllers/admin/codes_controller.rb +25 -0
  37. data/app/controllers/admin/editable_pages_controller.rb +25 -0
  38. data/app/controllers/admin/index_controller.rb +5 -0
  39. data/app/controllers/admin/metrics_controller.rb +29 -0
  40. data/app/controllers/admin/privilege_groups_controller.rb +48 -0
  41. data/app/controllers/admin/privileges_controller.rb +5 -0
  42. data/app/controllers/admin/tokens_controller.rb +28 -0
  43. data/app/controllers/admin/users_controller.rb +87 -0
  44. data/app/controllers/admin_controller.rb +10 -0
  45. data/app/controllers/agents_controller.rb +67 -0
  46. data/app/controllers/authentication_controller.rb +70 -0
  47. data/app/controllers/browsers_controller.rb +63 -0
  48. data/app/controllers/codes_controller.rb +60 -0
  49. data/app/controllers/concerns/authentication.rb +19 -0
  50. data/app/controllers/concerns/biovision/admin/privileges.rb +34 -0
  51. data/app/controllers/concerns/entity_priority.rb +7 -0
  52. data/app/controllers/concerns/lockable_entity.rb +23 -0
  53. data/app/controllers/concerns/toggleable_entity.rb +7 -0
  54. data/app/controllers/editable_pages_controller.rb +60 -0
  55. data/app/controllers/index_controller.rb +5 -0
  56. data/app/controllers/metrics_controller.rb +33 -0
  57. data/app/controllers/my/confirmations_controller.rb +37 -0
  58. data/app/controllers/my/index_controller.rb +7 -0
  59. data/app/controllers/my/profiles_controller.rb +81 -0
  60. data/app/controllers/my/recoveries_controller.rb +68 -0
  61. data/app/controllers/privilege_groups_controller.rb +57 -0
  62. data/app/controllers/privileges_controller.rb +74 -0
  63. data/app/controllers/profiles_controller.rb +22 -0
  64. data/app/controllers/tokens_controller.rb +60 -0
  65. data/app/controllers/users_controller.rb +57 -0
  66. data/app/helpers/biovision_helper.rb +81 -0
  67. data/app/helpers/biovision_users_helper.rb +52 -0
  68. data/app/helpers/codes_helper.rb +10 -0
  69. data/app/helpers/editable_pages_helper.rb +20 -0
  70. data/app/helpers/privileges_helper.rb +11 -0
  71. data/app/helpers/tracking_helper.rb +17 -0
  72. data/app/jobs/application_job.rb +7 -0
  73. data/app/jobs/clean_tokens_job.rb +8 -0
  74. data/app/mailers/code_sender.rb +15 -0
  75. data/app/models/agent.rb +38 -0
  76. data/app/models/application_record.rb +3 -0
  77. data/app/models/browser.rb +22 -0
  78. data/app/models/code.rb +58 -0
  79. data/app/models/code_type.rb +11 -0
  80. data/app/models/concerns/biovision/privilege_base.rb +143 -0
  81. data/app/models/concerns/biovision/user_base.rb +124 -0
  82. data/app/models/concerns/biovision/user_privilege_base.rb +46 -0
  83. data/app/models/concerns/has_owner.rb +19 -0
  84. data/app/models/concerns/required_unique_name.rb +13 -0
  85. data/app/models/concerns/required_unique_slug.rb +12 -0
  86. data/app/models/concerns/toggleable.rb +29 -0
  87. data/app/models/editable_page.rb +30 -0
  88. data/app/models/foreign_site.rb +75 -0
  89. data/app/models/foreign_user.rb +26 -0
  90. data/app/models/metric.rb +67 -0
  91. data/app/models/metric_value.rb +15 -0
  92. data/app/models/privilege.rb +3 -0
  93. data/app/models/privilege_group.rb +50 -0
  94. data/app/models/privilege_group_privilege.rb +6 -0
  95. data/app/models/token.rb +75 -0
  96. data/app/models/user.rb +3 -0
  97. data/app/models/user_privilege.rb +3 -0
  98. data/app/services/canonizer.rb +29 -0
  99. data/app/services/code_manager.rb +16 -0
  100. data/app/services/code_manager/confirmation.rb +26 -0
  101. data/app/services/code_manager/invitation.rb +27 -0
  102. data/app/services/code_manager/recovery.rb +31 -0
  103. data/app/uploaders/avatar_uploader.rb +62 -0
  104. data/app/uploaders/editable_page_image_uploader.rb +38 -0
  105. data/app/views/admin/agents/_filter.html.erb +16 -0
  106. data/app/views/admin/agents/_list.html.erb +17 -0
  107. data/app/views/admin/agents/_nav_item.html.erb +6 -0
  108. data/app/views/admin/agents/_toggleable.html.erb +7 -0
  109. data/app/views/admin/agents/entity/_in_list.html.erb +13 -0
  110. data/app/views/admin/agents/index.html.erb +17 -0
  111. data/app/views/admin/agents/show.html.erb +28 -0
  112. data/app/views/admin/browsers/_list.html.erb +17 -0
  113. data/app/views/admin/browsers/_nav_item.html.erb +6 -0
  114. data/app/views/admin/browsers/_toggleable.html.erb +7 -0
  115. data/app/views/admin/browsers/agents/_add.html.erb +79 -0
  116. data/app/views/admin/browsers/entity/_in_list.html.erb +13 -0
  117. data/app/views/admin/browsers/index.html.erb +17 -0
  118. data/app/views/admin/browsers/show.html.erb +29 -0
  119. data/app/views/admin/codes/_list.html.erb +11 -0
  120. data/app/views/admin/codes/_nav_item.html.erb +6 -0
  121. data/app/views/admin/codes/entity/_in_list.html.erb +24 -0
  122. data/app/views/admin/codes/index.html.erb +16 -0
  123. data/app/views/admin/codes/show.html.erb +51 -0
  124. data/app/views/admin/editable_pages/_list.html.erb +11 -0
  125. data/app/views/admin/editable_pages/_nav_item.html.erb +6 -0
  126. data/app/views/admin/editable_pages/entity/_in_list.html.erb +13 -0
  127. data/app/views/admin/editable_pages/index.html.erb +14 -0
  128. data/app/views/admin/editable_pages/show.html.erb +47 -0
  129. data/app/views/admin/index/index.html.erb +25 -0
  130. data/app/views/admin/metrics/_list.html.erb +26 -0
  131. data/app/views/admin/metrics/_nav_item.html.erb +6 -0
  132. data/app/views/admin/metrics/data.jbuilder +6 -0
  133. data/app/views/admin/metrics/index.html.erb +14 -0
  134. data/app/views/admin/metrics/show.html.erb +52 -0
  135. data/app/views/admin/privilege_groups/_list.html.erb +11 -0
  136. data/app/views/admin/privilege_groups/_nav_item.html.erb +6 -0
  137. data/app/views/admin/privilege_groups/entity/_in_list.html.erb +10 -0
  138. data/app/views/admin/privilege_groups/index.html.erb +14 -0
  139. data/app/views/admin/privilege_groups/show.html.erb +31 -0
  140. data/app/views/admin/privileges/_list.html.erb +15 -0
  141. data/app/views/admin/privileges/_nav_item.html.erb +6 -0
  142. data/app/views/admin/privileges/entity/_groups.html.erb +34 -0
  143. data/app/views/admin/privileges/entity/_in_list.html.erb +25 -0
  144. data/app/views/admin/privileges/index.html.erb +20 -0
  145. data/app/views/admin/privileges/show.html.erb +66 -0
  146. data/app/views/admin/privileges/users.html.erb +24 -0
  147. data/app/views/admin/tokens/_filter.html.erb +17 -0
  148. data/app/views/admin/tokens/_list.html.erb +11 -0
  149. data/app/views/admin/tokens/_nav_item.html.erb +6 -0
  150. data/app/views/admin/tokens/_toggleable.html.erb +7 -0
  151. data/app/views/admin/tokens/entity/_in_list.html.erb +25 -0
  152. data/app/views/admin/tokens/index.html.erb +19 -0
  153. data/app/views/admin/tokens/show.html.erb +43 -0
  154. data/app/views/admin/users/_filter.html.erb +22 -0
  155. data/app/views/admin/users/_list.html.erb +17 -0
  156. data/app/views/admin/users/_nav_item.html.erb +6 -0
  157. data/app/views/admin/users/_search.html.erb +5 -0
  158. data/app/views/admin/users/_toggleable.html.erb +7 -0
  159. data/app/views/admin/users/codes.html.erb +24 -0
  160. data/app/views/admin/users/entity/_in_list.html.erb +24 -0
  161. data/app/views/admin/users/entity/_privilege.html.erb +10 -0
  162. data/app/views/admin/users/entity/_privilege_tree.html.erb +17 -0
  163. data/app/views/admin/users/index.html.erb +19 -0
  164. data/app/views/admin/users/privileges.html.erb +35 -0
  165. data/app/views/admin/users/search.jbuilder +10 -0
  166. data/app/views/admin/users/search/_results.html.erb +11 -0
  167. data/app/views/admin/users/show.html.erb +94 -0
  168. data/app/views/admin/users/tokens.html.erb +24 -0
  169. data/app/views/agents/_agent.jbuilder +20 -0
  170. data/app/views/agents/_filter.html.erb +53 -0
  171. data/app/views/agents/_form.html.erb +33 -0
  172. data/app/views/agents/edit.html.erb +17 -0
  173. data/app/views/agents/index.jbuilder +5 -0
  174. data/app/views/agents/new.html.erb +15 -0
  175. data/app/views/agents/show.jbuilder +3 -0
  176. data/app/views/application/not_found.html.erb +9 -0
  177. data/app/views/application/not_found.jbuilder +3 -0
  178. data/app/views/application/service_unavailable.html.erb +9 -0
  179. data/app/views/application/unauthorized.html.erb +11 -0
  180. data/app/views/application/unauthorized.jbuilder +3 -0
  181. data/app/views/authentication/_form.html.erb +16 -0
  182. data/app/views/authentication/_info.html.erb +8 -0
  183. data/app/views/authentication/new.html.erb +10 -0
  184. data/app/views/browsers/_form.html.erb +28 -0
  185. data/app/views/browsers/edit.html.erb +17 -0
  186. data/app/views/browsers/new.html.erb +15 -0
  187. data/app/views/code_sender/email.text.erb +9 -0
  188. data/app/views/code_sender/password.text.erb +10 -0
  189. data/app/views/codes/_form.html.erb +49 -0
  190. data/app/views/codes/edit.html.erb +17 -0
  191. data/app/views/codes/new.html.erb +15 -0
  192. data/app/views/editable_pages/_form.html.erb +63 -0
  193. data/app/views/editable_pages/edit.html.erb +17 -0
  194. data/app/views/editable_pages/form/_ckeditor.html.erb +11 -0
  195. data/app/views/editable_pages/new.html.erb +15 -0
  196. data/app/views/index/index.html.erb +5 -0
  197. data/app/views/layouts/admin.html.erb +23 -0
  198. data/app/views/layouts/admin/_footer.html.erb +0 -0
  199. data/app/views/layouts/admin/_header.html.erb +11 -0
  200. data/app/views/layouts/admin/header/_logo.html.erb +3 -0
  201. data/app/views/metrics/_form.html.erb +41 -0
  202. data/app/views/metrics/edit.html.erb +17 -0
  203. data/app/views/metrics/index.jbuilder +7 -0
  204. data/app/views/metrics/show.jbuilder +3 -0
  205. data/app/views/my/confirmations/show.html.erb +30 -0
  206. data/app/views/my/index/index.html.erb +17 -0
  207. data/app/views/my/profiles/edit.html.erb +10 -0
  208. data/app/views/my/profiles/edit/_form.html.erb +70 -0
  209. data/app/views/my/profiles/new.html.erb +7 -0
  210. data/app/views/my/profiles/new/_form.html.erb +34 -0
  211. data/app/views/my/profiles/show.html.erb +3 -0
  212. data/app/views/my/recoveries/show.html.erb +39 -0
  213. data/app/views/privilege_groups/_form.html.erb +25 -0
  214. data/app/views/privilege_groups/edit.html.erb +17 -0
  215. data/app/views/privilege_groups/new.html.erb +15 -0
  216. data/app/views/privileges/_form.html.erb +42 -0
  217. data/app/views/privileges/edit.html.erb +21 -0
  218. data/app/views/privileges/new.html.erb +14 -0
  219. data/app/views/profiles/_profile.html.erb +48 -0
  220. data/app/views/profiles/show.html.erb +4 -0
  221. data/app/views/shared/_flash_messages.html.erb +7 -0
  222. data/app/views/shared/_list_of_errors.html.erb +11 -0
  223. data/app/views/shared/_meta_texts.html.erb +17 -0
  224. data/app/views/shared/_nothing_found.html.erb +1 -0
  225. data/app/views/shared/_track.html.erb +10 -0
  226. data/app/views/shared/actions/_locks.html.erb +4 -0
  227. data/app/views/shared/actions/_priority_changer.html.erb +4 -0
  228. data/app/views/shared/admin/_breadcrumbs.html.erb +6 -0
  229. data/app/views/shared/editable_pages/_body.html.erb +12 -0
  230. data/app/views/shared/filter/_flag.html.erb +17 -0
  231. data/app/views/tokens/_form.html.erb +30 -0
  232. data/app/views/tokens/edit.html.erb +17 -0
  233. data/app/views/tokens/new.html.erb +15 -0
  234. data/app/views/users/_form.html.erb +78 -0
  235. data/app/views/users/edit.html.erb +18 -0
  236. data/app/views/users/new.html.erb +15 -0
  237. data/config/initializers/carrierwave.rb +22 -0
  238. data/config/initializers/pluralization.rb +2 -0
  239. data/config/locales/common-ru.yml +96 -0
  240. data/config/locales/editable-pages-ru.yml +43 -0
  241. data/config/locales/plurals.rb +17 -0
  242. data/config/locales/track-ru.yml +102 -0
  243. data/config/locales/users-ru.yml +324 -0
  244. data/config/routes.rb +92 -0
  245. data/db/migrate/20170301000001_create_metrics.rb +23 -0
  246. data/db/migrate/20170301000002_create_metric_values.rb +19 -0
  247. data/db/migrate/20170301000101_create_browsers.rb +22 -0
  248. data/db/migrate/20170301000102_create_agents.rb +22 -0
  249. data/db/migrate/20170302000001_create_users.rb +52 -0
  250. data/db/migrate/20170302000002_create_tokens.rb +23 -0
  251. data/db/migrate/20170302000003_create_code_types.rb +20 -0
  252. data/db/migrate/20170302000004_create_codes.rb +24 -0
  253. data/db/migrate/20170302000101_create_privileges.rb +34 -0
  254. data/db/migrate/20170302000102_create_user_privileges.rb +17 -0
  255. data/db/migrate/20170302000103_create_privilege_groups.rb +23 -0
  256. data/db/migrate/20170302000104_create_privilege_group_privileges.rb +24 -0
  257. data/db/migrate/20170320000000_create_editable_pages.rb +22 -0
  258. data/db/migrate/20170425000001_create_foreign_sites.rb +18 -0
  259. data/db/migrate/20170425000002_create_foreign_users.rb +23 -0
  260. data/lib/biovision/base.rb +9 -0
  261. data/lib/biovision/base/base_methods.rb +96 -0
  262. data/lib/biovision/base/engine.rb +17 -0
  263. data/lib/biovision/base/privilege_methods.rb +35 -0
  264. data/lib/biovision/base/version.rb +5 -0
  265. data/lib/tasks/biovision/agents.rake +38 -0
  266. data/lib/tasks/biovision/base_tasks.rake +4 -0
  267. data/lib/tasks/biovision/browsers.rake +38 -0
  268. data/lib/tasks/biovision/codes.rake +49 -0
  269. data/lib/tasks/biovision/tokens.rake +54 -0
  270. data/lib/tasks/biovision/users.rake +67 -0
  271. metadata +467 -0
@@ -0,0 +1,28 @@
1
+ #agents-filter {
2
+ .pages {
3
+ align-items: center;
4
+ display: flex;
5
+
6
+ button {
7
+ height: 1.2rem;
8
+ margin: 0;
9
+ padding: 0;
10
+ width: 2rem;
11
+ }
12
+ }
13
+ }
14
+
15
+ div.track {
16
+ border: .1rem dotted;
17
+ font-size: $small_font_size;
18
+ margin: .4rem;
19
+ padding: .4rem;
20
+ width: calc(100% - .8rem);
21
+
22
+ > div {
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+ white-space: nowrap;
26
+ width: 100%;
27
+ }
28
+ }
@@ -0,0 +1,30 @@
1
+ class Admin::AgentsController < AdminController
2
+ include LockableEntity
3
+ include ToggleableEntity
4
+
5
+ before_action :set_entity, except: [:index]
6
+ before_action :check_entity_lock, only: [:toggle]
7
+
8
+ # get /admin/agents
9
+ def index
10
+ @filter = params[:filter] || Hash.new
11
+ @collection = Agent.page_for_administration current_page, @filter
12
+ end
13
+
14
+ # get /admin/agents/:id
15
+ def show
16
+ end
17
+
18
+ protected
19
+
20
+ def restrict_access
21
+ require_privilege :administrator
22
+ end
23
+
24
+ def set_entity
25
+ @entity = Agent.find_by(id: params[:id], deleted: false)
26
+ if @entity.nil?
27
+ handle_http_404('Agent is not found or was deleted')
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ class Admin::BrowsersController < AdminController
2
+ include LockableEntity
3
+ include ToggleableEntity
4
+
5
+ before_action :set_entity, except: [:index]
6
+ before_action :check_entity_lock, only: [:toggle]
7
+
8
+ # get /admin/browsers
9
+ def index
10
+ @collection = Browser.page_for_administration(current_page)
11
+ end
12
+
13
+ # get /admin/browsers/:id
14
+ def show
15
+ @collection = @entity.agents.page_for_administration(current_page)
16
+ end
17
+
18
+ protected
19
+
20
+ def restrict_access
21
+ require_privilege :administrator
22
+ end
23
+
24
+ def set_entity
25
+ @entity = Browser.find_by(id: params[:id], deleted: false)
26
+ if @entity.nil?
27
+ handle_http_404('Browser is not found or was deleted')
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ class Admin::CodesController < AdminController
2
+ before_action :set_entity, except: [:index]
3
+
4
+ # get /admin/codes
5
+ def index
6
+ @collection = Code.page_for_administration current_page
7
+ end
8
+
9
+ # get /admin/codes/:id
10
+ def show
11
+ end
12
+
13
+ protected
14
+
15
+ def restrict_access
16
+ require_privilege :administrator
17
+ end
18
+
19
+ def set_entity
20
+ @entity = Code.find_by(id: params[:id])
21
+ if @entity.nil?
22
+ handle_http_404('Cannot find code')
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ class Admin::EditablePagesController < AdminController
2
+ before_action :set_entity, except: [:index]
3
+
4
+ # get /admin/editable_pages
5
+ def index
6
+ @collection = EditablePage.page_for_administration
7
+ end
8
+
9
+ # get /admin/editable_pages/:id
10
+ def show
11
+ end
12
+
13
+ private
14
+
15
+ def restrict_access
16
+ require_privilege :chief_editor
17
+ end
18
+
19
+ def set_entity
20
+ @entity = EditablePage.find_by(id: params[:id])
21
+ if @entity.nil?
22
+ handle_http_404("Cannot find editable_page #{params[:id]}")
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ class Admin::IndexController < AdminController
2
+ # get /admin
3
+ def index
4
+ end
5
+ end
@@ -0,0 +1,29 @@
1
+ class Admin::MetricsController < AdminController
2
+ before_action :set_entity, except: [:index]
3
+
4
+ # get /admin/metrics
5
+ def index
6
+ @collection = Metric.page_for_administration
7
+ end
8
+
9
+ # get /admin/metrics/:id
10
+ def show
11
+ end
12
+
13
+ # get /admin/metrics/:id/data
14
+ def data
15
+ end
16
+
17
+ protected
18
+
19
+ def restrict_access
20
+ require_privilege :metrics_manager
21
+ end
22
+
23
+ def set_entity
24
+ @entity = Metric.find_by(id: params[:id])
25
+ if @entity.nil?
26
+ handle_http_404('Cannot find metric')
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ class Admin::PrivilegeGroupsController < AdminController
2
+ before_action :set_entity, except: [:index]
3
+ before_action :set_privilege, only: [:add_privilege, :remove_privilege]
4
+
5
+ # get /admin/privilege_groups
6
+ def index
7
+ @collection = PrivilegeGroup.page_for_administration
8
+ end
9
+
10
+ # get /admin/privilege_groups/:id
11
+ def show
12
+ @collection = @entity.privileges.ordered_by_name
13
+ end
14
+
15
+ # put /admin/privilege_groups/:id/privileges/:privilege_id
16
+ def add_privilege
17
+ @entity.add_privilege(@privilege)
18
+
19
+ render json: { data: { privilege_ids: @entity.privilege_ids } }
20
+ end
21
+
22
+ # delete /admin/privilege_groups/:id/privileges/:privilege_id
23
+ def remove_privilege
24
+ @entity.remove_privilege(@privilege)
25
+
26
+ render json: { data: { privilege_ids: @entity.privilege_ids } }
27
+ end
28
+
29
+ protected
30
+
31
+ def restrict_access
32
+ require_privilege :administrator
33
+ end
34
+
35
+ def set_entity
36
+ @entity = PrivilegeGroup.find_by(id: params[:id])
37
+ if @entity.nil?
38
+ handle_http_404('Cannot find privilege group')
39
+ end
40
+ end
41
+
42
+ def set_privilege
43
+ @privilege = Privilege.find_by(id: params[:privilege_id])
44
+ if @entity.nil?
45
+ handle_http_404('Cannot find privilege')
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ class Admin::PrivilegesController < AdminController
2
+ include LockableEntity
3
+ include EntityPriority
4
+ include Biovision::Admin::Privileges
5
+ end
@@ -0,0 +1,28 @@
1
+ class Admin::TokensController < AdminController
2
+ include ToggleableEntity
3
+
4
+ before_action :set_entity, except: [:index]
5
+
6
+ # get /admin/tokens
7
+ def index
8
+ @filter = params[:filter] || {}
9
+ @collection = Token.page_for_administration(current_page, @filter)
10
+ end
11
+
12
+ # get /admin/tokens/:id
13
+ def show
14
+ end
15
+
16
+ protected
17
+
18
+ def restrict_access
19
+ require_privilege :administrator
20
+ end
21
+
22
+ def set_entity
23
+ @entity = Token.find_by(id: params[:id])
24
+ if @entity.nil?
25
+ handle_http_404('Cannot find token')
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,87 @@
1
+ class Admin::UsersController < AdminController
2
+ include Authentication
3
+ include ToggleableEntity
4
+
5
+ before_action :set_entity, except: [:index, :search]
6
+ before_action :set_privilege, only: [:grant_privilege, :revoke_privilege]
7
+
8
+ # get /admin/users
9
+ def index
10
+ @filter = params[:filter] || Hash.new
11
+ @collection = User.page_for_administration current_page, @filter
12
+ end
13
+
14
+ # get /admin/users/:id
15
+ def show
16
+ end
17
+
18
+ # get /admin/users/:id/tokens
19
+ def tokens
20
+ @collection = Token.owned_by(@entity).page_for_administration(current_page)
21
+ end
22
+
23
+ # get /admin/users/:id/codes
24
+ def codes
25
+ @collection = Code.owned_by(@entity).page_for_administration(current_page)
26
+ end
27
+
28
+ # get /admin/users/:id/privileges
29
+ def privileges
30
+ end
31
+
32
+ # put /admin/users/:id/privileges/:privilege_id
33
+ def grant_privilege
34
+ @privilege.grant(@entity)
35
+
36
+ render json: { data: { user_privilege_ids: @entity.user_privilege_ids } }
37
+ end
38
+
39
+ # delete /admin/users/:id/privileges/:privilege_id
40
+ def revoke_privilege
41
+ @privilege.revoke(@entity)
42
+
43
+ render json: { data: { user_privilege_ids: @entity.user_privilege_ids } }
44
+ end
45
+
46
+ # get /admin/users/search
47
+ def search
48
+ query = param_from_request(:q)
49
+ if query.blank?
50
+ @collection = []
51
+ else
52
+ @collection = User.search(query).order('slug asc').first(10)
53
+ end
54
+ end
55
+
56
+ # post /admin/users/:id/authenticate
57
+ def authenticate
58
+ cookies['pt'] = {
59
+ value: cookies['token'],
60
+ expires: 1.year.from_now,
61
+ domain: :all,
62
+ httponly: true
63
+ }
64
+ create_token_for_user(@entity)
65
+ redirect_to my_path
66
+ end
67
+
68
+ protected
69
+
70
+ def restrict_access
71
+ require_privilege :administrator
72
+ end
73
+
74
+ def set_entity
75
+ @entity = User.find_by(id: params[:id])
76
+ if @entity.nil?
77
+ handle_http_404('Cannot find user')
78
+ end
79
+ end
80
+
81
+ def set_privilege
82
+ @privilege = Privilege.find_by(id: params[:privilege_id], deleted: false)
83
+ if @privilege.nil?
84
+ handle_http_404("Cannot use privilege #{params[:privilege_id]}")
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,10 @@
1
+ class AdminController < ApplicationController
2
+ before_action :restrict_access
3
+
4
+ protected
5
+
6
+ def restrict_access
7
+ return if UserPrivilege.user_has_any_privilege?(current_user)
8
+ handle_http_401("User #{current_user&.id} has no privileges")
9
+ end
10
+ end
@@ -0,0 +1,67 @@
1
+ class AgentsController < AdminController
2
+ before_action :set_entity, only: [:edit, :update, :destroy]
3
+ before_action :restrict_editing, only: [:edit, :update, :destroy]
4
+
5
+ # get /agents/new
6
+ def new
7
+ @entity = Agent.new
8
+ end
9
+
10
+ # post /agents
11
+ def create
12
+ @entity = Agent.new entity_parameters
13
+ if @entity.save
14
+ redirect_to admin_agent_path(@entity)
15
+ else
16
+ render :new, status: :bad_request
17
+ end
18
+ end
19
+
20
+ # get /agents/:id
21
+ def show
22
+ end
23
+
24
+ # get /agents/:id/edit
25
+ def edit
26
+ end
27
+
28
+ # patch /agents/:id
29
+ def update
30
+ if @entity.update entity_parameters
31
+ redirect_to admin_agent_path(@entity), notice: t('agents.update.success')
32
+ else
33
+ render :edit, status: :bad_request
34
+ end
35
+ end
36
+
37
+ # delete /agents/:id
38
+ def destroy
39
+ if @entity.update! deleted: true
40
+ flash[:notice] = t('agents.destroy.success')
41
+ end
42
+ redirect_to admin_agents_path
43
+ end
44
+
45
+ private
46
+
47
+ def restrict_access
48
+ require_privilege :administrator
49
+ end
50
+
51
+ def set_entity
52
+ @entity = Agent.find_by(id: params[:id], deleted: false)
53
+ if @entity.nil?
54
+ handle_http_404('Agent is not found or was deleted')
55
+ end
56
+ end
57
+
58
+ def restrict_editing
59
+ if @entity.locked?
60
+ redirect_to admin_agent_path(@entity), alert: t('agents.edit.forbidden')
61
+ end
62
+ end
63
+
64
+ def entity_parameters
65
+ params.require(:agent).permit(Agent.entity_parameters)
66
+ end
67
+ end
@@ -0,0 +1,70 @@
1
+ class AuthenticationController < ApplicationController
2
+ include Authentication
3
+
4
+ before_action :redirect_authenticated_user, except: [:new, :destroy]
5
+ before_action :set_foreign_site, only: [:auth_callback]
6
+
7
+ # get /login
8
+ def new
9
+ end
10
+
11
+ # post /login
12
+ def create
13
+ user = User.find_by(slug: params[:login].to_s.downcase)
14
+ if user&.authenticate(params[:password].to_s) && user.allow_login?
15
+ create_token_for_user(user)
16
+ Metric.register(User::METRIC_AUTHENTICATION_SUCCESS)
17
+ redirect_to root_path
18
+ else
19
+ Metric.register(User::METRIC_AUTHENTICATION_FAILURE)
20
+ flash.now[:alert] = t(:could_not_log_in)
21
+ render :new, status: :unauthorized
22
+ end
23
+ end
24
+
25
+ # delete /logout
26
+ def destroy
27
+ deactivate_token if current_user
28
+ redirect_to root_path
29
+ end
30
+
31
+ # get /auth/:provider/callback
32
+ def auth_callback
33
+ data = request.env['omniauth.auth']
34
+ user = @foreign_site.authenticate(data, tracking_for_entity)
35
+ create_token_for_user(user) if user.allow_login?
36
+
37
+ redirect_to my_path
38
+ end
39
+
40
+ private
41
+
42
+ def deactivate_token
43
+ token = Token.find_by token: cookies['token'].split(':').last
44
+ token.update active: false
45
+ pop_token
46
+ end
47
+
48
+ def set_foreign_site
49
+ @foreign_site = ForeignSite.with_slug(params[:provider]).first
50
+ if @foreign_site.nil?
51
+ metric = Metric::METRIC_HTTP_503
52
+ status = :service_unavailable
53
+ handle_http_error('Cannot set foreign site', metric, status, status)
54
+ end
55
+ end
56
+
57
+ def pop_token
58
+ if cookies['pt']
59
+ cookies['token'] = {
60
+ value: cookies['pt'],
61
+ expires: 1.year.from_now,
62
+ domain: :all,
63
+ httponly: true
64
+ }
65
+ cookies['pt'] = nil
66
+ else
67
+ cookies['token'] = nil
68
+ end
69
+ end
70
+ end