barkest_core 1.5.3.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 (308) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +22 -0
  4. data/Gemfile.lock +254 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +364 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/fonts/barkest_core/ArchivoNarrow-Bold.ttf +0 -0
  9. data/app/assets/fonts/barkest_core/ArchivoNarrow-BoldItalic.ttf +0 -0
  10. data/app/assets/fonts/barkest_core/ArchivoNarrow-Italic.ttf +0 -0
  11. data/app/assets/fonts/barkest_core/ArchivoNarrow-Regular.ttf +0 -0
  12. data/app/assets/images/barkest_core/.keep +0 -0
  13. data/app/assets/images/barkest_core/barcode-B.svg +181 -0
  14. data/app/assets/javascripts/barkest_core/.keep +0 -0
  15. data/app/assets/javascripts/barkest_core/application.js +22 -0
  16. data/app/assets/javascripts/barkest_core/bootstrap-datepicker.js +1800 -0
  17. data/app/assets/javascripts/barkest_core/field_init.js +7 -0
  18. data/app/assets/javascripts/barkest_core/jquery.doubleScroll.js +112 -0
  19. data/app/assets/javascripts/barkest_core/masked_edit.js +25 -0
  20. data/app/assets/javascripts/barkest_core/system_status.js.erb +201 -0
  21. data/app/assets/stylesheets/barkest_core/.keep +0 -0
  22. data/app/assets/stylesheets/barkest_core/application.css +17 -0
  23. data/app/assets/stylesheets/barkest_core/custom.css.scss +264 -0
  24. data/app/assets/stylesheets/barkest_core/datepicker3.css +790 -0
  25. data/app/controllers/.keep +0 -0
  26. data/app/controllers/access_groups_controller.rb +74 -0
  27. data/app/controllers/account_activations_controller.rb +29 -0
  28. data/app/controllers/application_controller.rb +5 -0
  29. data/app/controllers/barkest_core/application_controller_base.rb +113 -0
  30. data/app/controllers/barkest_core/engine_controller_base.rb +15 -0
  31. data/app/controllers/barkest_core/testsub_controller.rb +21 -0
  32. data/app/controllers/contact_controller.rb +32 -0
  33. data/app/controllers/log_view_controller.rb +31 -0
  34. data/app/controllers/password_resets_controller.rb +126 -0
  35. data/app/controllers/sessions_controller.rb +64 -0
  36. data/app/controllers/status_controller.rb +150 -0
  37. data/app/controllers/system_config_controller.rb +238 -0
  38. data/app/controllers/system_update_controller.rb +164 -0
  39. data/app/controllers/test_access_controller.rb +44 -0
  40. data/app/controllers/test_report_controller.rb +75 -0
  41. data/app/controllers/users_controller.rb +218 -0
  42. data/app/helpers/.keep +0 -0
  43. data/app/helpers/barkest_core/application_helper.rb +134 -0
  44. data/app/helpers/barkest_core/form_helper.rb +469 -0
  45. data/app/helpers/barkest_core/html_helper.rb +70 -0
  46. data/app/helpers/barkest_core/misc_helper.rb +68 -0
  47. data/app/helpers/barkest_core/pdf_helper.rb +180 -0
  48. data/app/helpers/barkest_core/recaptcha_helper.rb +115 -0
  49. data/app/helpers/barkest_core/sessions_helper.rb +94 -0
  50. data/app/helpers/barkest_core/status_helper.rb +118 -0
  51. data/app/helpers/barkest_core/users_helper.rb +32 -0
  52. data/app/mailers/.keep +0 -0
  53. data/app/mailers/application_mailer.rb +5 -0
  54. data/app/mailers/barkest_core/application_mailer_base.rb +30 -0
  55. data/app/mailers/barkest_core/contact_form.rb +20 -0
  56. data/app/mailers/barkest_core/user_mailer.rb +44 -0
  57. data/app/models/.keep +0 -0
  58. data/app/models/access_group.rb +121 -0
  59. data/app/models/access_group_group_member.rb +13 -0
  60. data/app/models/access_group_user_member.rb +11 -0
  61. data/app/models/barkest_core/auth_config.rb +95 -0
  62. data/app/models/barkest_core/authorize_failure.rb +7 -0
  63. data/app/models/barkest_core/contact_message.rb +37 -0
  64. data/app/models/barkest_core/database_config.rb +223 -0
  65. data/app/models/barkest_core/db_table.rb +21 -0
  66. data/app/models/barkest_core/email_config.rb +132 -0
  67. data/app/models/barkest_core/global_status.rb +267 -0
  68. data/app/models/barkest_core/log_entry.rb +101 -0
  69. data/app/models/barkest_core/log_view_options.rb +51 -0
  70. data/app/models/barkest_core/ms_sql_db_definition.rb +441 -0
  71. data/app/models/barkest_core/ms_sql_definition.rb +221 -0
  72. data/app/models/barkest_core/ms_sql_function.rb +423 -0
  73. data/app/models/barkest_core/not_logged_in.rb +7 -0
  74. data/app/models/barkest_core/pdf_table_builder.rb +407 -0
  75. data/app/models/barkest_core/self_update_config.rb +37 -0
  76. data/app/models/barkest_core/user_alert.rb +29 -0
  77. data/app/models/barkest_core/user_alert_generators.rb +58 -0
  78. data/app/models/barkest_core/user_manager.rb +404 -0
  79. data/app/models/barkest_core/work_path.rb +74 -0
  80. data/app/models/disable_user.rb +18 -0
  81. data/app/models/ldap_access_group.rb +15 -0
  82. data/app/models/system_config.rb +99 -0
  83. data/app/models/user.rb +405 -0
  84. data/app/models/user_login_history.rb +11 -0
  85. data/app/views/.keep +0 -0
  86. data/app/views/access_groups/_form.html.erb +19 -0
  87. data/app/views/access_groups/edit.html.erb +2 -0
  88. data/app/views/access_groups/index.html.erb +32 -0
  89. data/app/views/access_groups/new.html.erb +2 -0
  90. data/app/views/access_groups/show.html.erb +4 -0
  91. data/app/views/barkest_core/contact_form/contact.html.erb +16 -0
  92. data/app/views/barkest_core/contact_form/contact.text.erb +13 -0
  93. data/app/views/barkest_core/testsub/_links.html.erb +5 -0
  94. data/app/views/barkest_core/testsub/page1.html.erb +3 -0
  95. data/app/views/barkest_core/testsub/page2.html.erb +2 -0
  96. data/app/views/barkest_core/testsub/page3.html.erb +2 -0
  97. data/app/views/barkest_core/user_mailer/account_activation.html.erb +7 -0
  98. data/app/views/barkest_core/user_mailer/account_activation.text.erb +6 -0
  99. data/app/views/barkest_core/user_mailer/invalid_password_reset.html.erb +3 -0
  100. data/app/views/barkest_core/user_mailer/invalid_password_reset.text.erb +5 -0
  101. data/app/views/barkest_core/user_mailer/password_reset.html.erb +8 -0
  102. data/app/views/barkest_core/user_mailer/password_reset.text.erb +7 -0
  103. data/app/views/contact/index.html.erb +24 -0
  104. data/app/views/layouts/_footer_copyright.html.erb +1 -0
  105. data/app/views/layouts/_menu_admin.html.erb +5 -0
  106. data/app/views/layouts/_menu_anon.html.erb +0 -0
  107. data/app/views/layouts/_menu_auth.html.erb +3 -0
  108. data/app/views/layouts/_menu_footer.html.erb +1 -0
  109. data/app/views/layouts/_nav_logo.html.erb +1 -0
  110. data/app/views/layouts/application.html.erb +2 -0
  111. data/app/views/layouts/barkest_core/_application.html.erb +24 -0
  112. data/app/views/layouts/barkest_core/_footer.html.erb +18 -0
  113. data/app/views/layouts/barkest_core/_header.html.erb +38 -0
  114. data/app/views/layouts/barkest_core/_html_mailer.html.erb +11 -0
  115. data/app/views/layouts/barkest_core/_menu_account.html.erb +14 -0
  116. data/app/views/layouts/barkest_core/_menu_sample.html.erb +1 -0
  117. data/app/views/layouts/barkest_core/_messages.html.erb +4 -0
  118. data/app/views/layouts/barkest_core/_shim.html.erb +4 -0
  119. data/app/views/layouts/barkest_core/_subheader.html.erb +1 -0
  120. data/app/views/layouts/barkest_core/_text_mailer.text.erb +4 -0
  121. data/app/views/layouts/mailer.html.erb +1 -0
  122. data/app/views/layouts/mailer.text.erb +1 -0
  123. data/app/views/log_view/index.html.erb +100 -0
  124. data/app/views/password_resets/edit.html.erb +20 -0
  125. data/app/views/password_resets/new.html.erb +14 -0
  126. data/app/views/sessions/new.html.erb +27 -0
  127. data/app/views/shared/_error_messages.html.erb +29 -0
  128. data/app/views/shared/_generic_user_alert.html.erb +4 -0
  129. data/app/views/status/current.html.erb +34 -0
  130. data/app/views/status/test.html.erb +50 -0
  131. data/app/views/system_config/index.html.erb +25 -0
  132. data/app/views/system_config/show_auth.html.erb +28 -0
  133. data/app/views/system_config/show_database.html.erb +36 -0
  134. data/app/views/system_config/show_email.html.erb +21 -0
  135. data/app/views/system_config/show_self_update.html.erb +13 -0
  136. data/app/views/system_update/index.html.erb +31 -0
  137. data/app/views/system_update/new.html.erb +2 -0
  138. data/app/views/test_access/allow_anon.html.erb +2 -0
  139. data/app/views/test_access/require_admin.html.erb +2 -0
  140. data/app/views/test_access/require_group_x.html.erb +2 -0
  141. data/app/views/test_access/require_user.html.erb +2 -0
  142. data/app/views/test_report/index.csv.csvrb +23 -0
  143. data/app/views/test_report/index.html.erb +6 -0
  144. data/app/views/test_report/index.pdf.prawn +50 -0
  145. data/app/views/test_report/index.xlsx.axlsx +28 -0
  146. data/app/views/users/_user.html.erb +57 -0
  147. data/app/views/users/_user_details.html.erb +15 -0
  148. data/app/views/users/_user_details_for_list.html.erb +1 -0
  149. data/app/views/users/_user_form.html.erb +13 -0
  150. data/app/views/users/disable_confirm.html.erb +19 -0
  151. data/app/views/users/edit.html.erb +15 -0
  152. data/app/views/users/index.html.erb +9 -0
  153. data/app/views/users/new.html.erb +10 -0
  154. data/app/views/users/show.html.erb +46 -0
  155. data/bin/rails +12 -0
  156. data/config/routes.rb +3 -0
  157. data/db/migrate/20160617172539_create_access_groups.rb +10 -0
  158. data/db/migrate/20160617172725_create_users.rb +26 -0
  159. data/db/migrate/20160617172833_create_user_login_histories.rb +12 -0
  160. data/db/migrate/20160622151720_create_access_group_user_members.rb +9 -0
  161. data/db/migrate/20160622151925_create_access_group_group_members.rb +9 -0
  162. data/db/migrate/20160701005706_create_ldap_access_groups.rb +11 -0
  163. data/db/migrate/20161108155029_create_system_configs.rb +11 -0
  164. data/db/seeds/barkest_core_01_create_users.rb +42 -0
  165. data/db/seeds.rb +53 -0
  166. data/lib/barkest_core/concerns/association_with_defaults.rb +55 -0
  167. data/lib/barkest_core/concerns/boolean_parser.rb +88 -0
  168. data/lib/barkest_core/concerns/date_parser.rb +181 -0
  169. data/lib/barkest_core/concerns/email_tester.rb +55 -0
  170. data/lib/barkest_core/concerns/encrypted_fields.rb +156 -0
  171. data/lib/barkest_core/concerns/named_model.rb +73 -0
  172. data/lib/barkest_core/concerns/number_parser.rb +145 -0
  173. data/lib/barkest_core/concerns/utc_conversion.rb +60 -0
  174. data/lib/barkest_core/engine.rb +105 -0
  175. data/lib/barkest_core/extensions/active_record_extensions.rb +120 -0
  176. data/lib/barkest_core/extensions/application_configuration_extensions.rb +38 -0
  177. data/lib/barkest_core/extensions/application_extensions.rb +50 -0
  178. data/lib/barkest_core/extensions/axlsx_extenstions.rb +157 -0
  179. data/lib/barkest_core/extensions/fixture_set_extensions.rb +107 -0
  180. data/lib/barkest_core/extensions/generator_extensions.rb +271 -0
  181. data/lib/barkest_core/extensions/main_app_extensions.rb +35 -0
  182. data/lib/barkest_core/extensions/prawn_document_extensions.rb +367 -0
  183. data/lib/barkest_core/extensions/prawn_table_extensions.rb +131 -0
  184. data/lib/barkest_core/extensions/router_extensions.rb +106 -0
  185. data/lib/barkest_core/extensions/simple_formatter_extensions.rb +66 -0
  186. data/lib/barkest_core/extensions/test_case_extensions.rb +348 -0
  187. data/lib/barkest_core/extensions/time_extensions.rb +164 -0
  188. data/lib/barkest_core/handlers/csv_handler.rb +30 -0
  189. data/lib/barkest_core/version.rb +3 -0
  190. data/lib/barkest_core.rb +324 -0
  191. data/lib/generators/barkest/install_generator.rb +102 -0
  192. data/lib/generators/barkest_core/actions/01_patch_application_controller.rb +55 -0
  193. data/lib/generators/barkest_core/actions/02_patch_application_mailer.rb +56 -0
  194. data/lib/generators/barkest_core/actions/03_patch_assets.rb +62 -0
  195. data/lib/generators/barkest_core/actions/04_patch_layouts.rb +36 -0
  196. data/lib/generators/barkest_core/actions/05_patch_routes.rb +93 -0
  197. data/lib/generators/barkest_core/actions/06_patch_seeds.rb +60 -0
  198. data/lib/generators/barkest_core/actions/07_copy_migrations.rb +51 -0
  199. data/lib/generators/barkest_core/actions/08_configure_database.rb +52 -0
  200. data/lib/generators/barkest_core/actions/09_configure_secrets.rb +29 -0
  201. data/lib/generators/barkest_core/actions/99_patch_gitignore.rb +57 -0
  202. data/lib/generators/barkest_core/install_generator.rb +17 -0
  203. data/test/barkest_core_test.rb +83 -0
  204. data/test/controllers/access_groups_controller_test.rb +53 -0
  205. data/test/controllers/contact_controller_test.rb +10 -0
  206. data/test/controllers/sessions_controller_test.rb +10 -0
  207. data/test/controllers/users_controller_test.rb +10 -0
  208. data/test/dummy/.gitignore +10 -0
  209. data/test/dummy/README.rdoc +28 -0
  210. data/test/dummy/Rakefile +6 -0
  211. data/test/dummy/app/assets/images/.keep +0 -0
  212. data/test/dummy/app/assets/javascripts/application.js +14 -0
  213. data/test/dummy/app/assets/stylesheets/application.css +16 -0
  214. data/test/dummy/app/controllers/application_controller.rb +5 -0
  215. data/test/dummy/app/controllers/concerns/.keep +0 -0
  216. data/test/dummy/app/helpers/application_helper.rb +2 -0
  217. data/test/dummy/app/mailers/.keep +0 -0
  218. data/test/dummy/app/mailers/application_mailer.rb +3 -0
  219. data/test/dummy/app/models/.keep +0 -0
  220. data/test/dummy/app/models/concerns/.keep +0 -0
  221. data/test/dummy/app/views/layouts/application.html.erb +1 -0
  222. data/test/dummy/app/views/layouts/mailer.html.erb +1 -0
  223. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  224. data/test/dummy/app/views/system_config/show_fake.html.erb +3 -0
  225. data/test/dummy/bin/bundle +3 -0
  226. data/test/dummy/bin/rails +4 -0
  227. data/test/dummy/bin/rake +4 -0
  228. data/test/dummy/bin/setup +29 -0
  229. data/test/dummy/config/application.rb +27 -0
  230. data/test/dummy/config/boot.rb +5 -0
  231. data/test/dummy/config/environment.rb +5 -0
  232. data/test/dummy/config/environments/development.rb +47 -0
  233. data/test/dummy/config/environments/production.rb +79 -0
  234. data/test/dummy/config/environments/test.rb +44 -0
  235. data/test/dummy/config/initializers/assets.rb +11 -0
  236. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  237. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  238. data/test/dummy/config/initializers/db_updater_ext.rb +33 -0
  239. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  240. data/test/dummy/config/initializers/inflections.rb +16 -0
  241. data/test/dummy/config/initializers/mime_types.rb +4 -0
  242. data/test/dummy/config/initializers/session_store.rb +3 -0
  243. data/test/dummy/config/initializers/sys_config_ext.rb +12 -0
  244. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  245. data/test/dummy/config/locales/en.yml +23 -0
  246. data/test/dummy/config/routes.rb +60 -0
  247. data/test/dummy/config.ru +4 -0
  248. data/test/dummy/db/schema.rb +95 -0
  249. data/test/dummy/db/seeds/barkest_core_01_create_users.rb +42 -0
  250. data/test/dummy/db/seeds.rb +51 -0
  251. data/test/dummy/lib/assets/.keep +0 -0
  252. data/test/dummy/log/.keep +0 -0
  253. data/test/dummy/public/404.html +67 -0
  254. data/test/dummy/public/422.html +67 -0
  255. data/test/dummy/public/500.html +66 -0
  256. data/test/dummy/public/favicon.ico +0 -0
  257. data/test/dummy/sql/my_test_view.sql +3 -0
  258. data/test/fixtures/access_groups.yml +21 -0
  259. data/test/fixtures/users.yml +71 -0
  260. data/test/helpers/barkest_core/sessions_helper_test.rb +22 -0
  261. data/test/integration/access_group_mgmt_test.rb +33 -0
  262. data/test/integration/access_test.rb +24 -0
  263. data/test/integration/account_activations_access_test.rb +12 -0
  264. data/test/integration/contact_test.rb +98 -0
  265. data/test/integration/extra_partial_test.rb +41 -0
  266. data/test/integration/log_view_access_test.rb +12 -0
  267. data/test/integration/password_resets_test.rb +101 -0
  268. data/test/integration/reports_test.rb +53 -0
  269. data/test/integration/status_access_test.rb +27 -0
  270. data/test/integration/system_config_access_test.rb +24 -0
  271. data/test/integration/system_update_access_test.rb +19 -0
  272. data/test/integration/users_access_test.rb +34 -0
  273. data/test/integration/users_edit_test.rb +178 -0
  274. data/test/integration/users_index_test.rb +62 -0
  275. data/test/integration/users_login_test.rb +67 -0
  276. data/test/integration/users_signup_test.rb +54 -0
  277. data/test/mailers/.keep +0 -0
  278. data/test/mailers/barkest_core/contact_form_test.rb +28 -0
  279. data/test/mailers/barkest_core/user_mailer_test.rb +43 -0
  280. data/test/mailers/previews/barkest_core/contact_form_preview.rb +17 -0
  281. data/test/mailers/previews/barkest_core/user_mailer_preview.rb +26 -0
  282. data/test/models/access_group_group_member_test.rb +28 -0
  283. data/test/models/access_group_test.rb +114 -0
  284. data/test/models/access_group_user_member_test.rb +28 -0
  285. data/test/models/barkest_core/auth_config_test.rb +57 -0
  286. data/test/models/barkest_core/bool_parser_test.rb +28 -0
  287. data/test/models/barkest_core/contact_message_test.rb +61 -0
  288. data/test/models/barkest_core/database_config_test.rb +33 -0
  289. data/test/models/barkest_core/date_parser_test.rb +110 -0
  290. data/test/models/barkest_core/email_config_test.rb +57 -0
  291. data/test/models/barkest_core/global_status_test.rb +50 -0
  292. data/test/models/barkest_core/ms_sql_db_updater_test.rb +115 -0
  293. data/test/models/barkest_core/ms_sql_definition_test.rb +102 -0
  294. data/test/models/barkest_core/ms_sql_function_test.rb +131 -0
  295. data/test/models/barkest_core/number_parser_test.rb +29 -0
  296. data/test/models/barkest_core/self_update_config_test.rb +29 -0
  297. data/test/models/barkest_core/user_alert_test.rb +19 -0
  298. data/test/models/barkest_core/user_manager_test.rb +34 -0
  299. data/test/models/barkest_core/work_path_test.rb +26 -0
  300. data/test/models/disable_user_test.rb +27 -0
  301. data/test/models/generic_time_test.rb +66 -0
  302. data/test/models/ldap_access_group_test.rb +31 -0
  303. data/test/models/pdf_table_builder_test.rb +6 -0
  304. data/test/models/system_config_test.rb +78 -0
  305. data/test/models/user_login_history_test.rb +37 -0
  306. data/test/models/user_test.rb +130 -0
  307. data/test/test_helper.rb +63 -0
  308. metadata +798 -0
@@ -0,0 +1,164 @@
1
+ require 'net/ssh'
2
+ require 'barkest_ssh'
3
+ require 'rubygems'
4
+
5
+ ##
6
+ # An automatic update controller.
7
+ #
8
+ # This is performed via an SSH shell to the host to login as the configured user and then
9
+ # performing the various steps necessary to update the app from GIT, update the database, and precompile
10
+ # the assets. When that is all finished, it notifies Passenger to reload the application.
11
+ #
12
+ # The status is tracked using the SystemStatusController.
13
+ #
14
+ class SystemUpdateController < ApplicationController
15
+
16
+ before_action :require_admin
17
+
18
+ ##
19
+ # Perform a system update.
20
+ #
21
+ def new
22
+ cfg = BarkestCore::SelfUpdateConfig.load
23
+
24
+ if cfg.valid? || Rails.env.test?
25
+
26
+ @file_path = Rails.root.to_s
27
+ @app_root_url = root_path
28
+
29
+ show_system_status(
30
+ main_status: 'Updating application',
31
+ url_on_completion: system_update_url
32
+ ) do |status|
33
+ if status
34
+ unless Rails.env.test?
35
+ begin
36
+ File.open(BarkestCore::WorkPath.system_status_file, 'wt') do |f|
37
+ @status_log = f
38
+
39
+ log_header 'Creating session'
40
+
41
+ begin
42
+ BarkestSsh::SecureShell.new(
43
+ host: cfg.host,
44
+ user: cfg.user,
45
+ password: cfg.password,
46
+ port: cfg.port
47
+ ) do |shell|
48
+
49
+ log_data "Session has been created.\n"
50
+
51
+ tmp_data = shell.exec('which ruby')
52
+ log_data "[WARNING: Global ruby]\n" if tmp_data == '/usr/bin/ruby' || tmp_data == '/usr/local/bin/ruby'
53
+ log_data "Ruby Path: #{tmp_data}\n"
54
+
55
+ tmp_data = shell.exec('ruby -v')
56
+ tmp_v = /^ruby ([0-9]+\.[0-9]+)\..*$/.match(tmp_data)[1].to_s.to_f
57
+ log_data "[WARNING: Ruby less than 2.2.0]\n" if tmp_v < 2.2
58
+ log_data "Ruby Version: #{tmp_data}\n"
59
+
60
+ shell.exec "cd \"#{@file_path}\""
61
+
62
+ if Rails.env.production?
63
+
64
+ rtlog = Proc.new do |data, _|
65
+ log_data data
66
+ nil
67
+ end
68
+
69
+ send(:before_update, shell) if respond_to?(:before_update)
70
+ log_header 'Resetting app files'
71
+ shell.exec('git reset --hard origin/master', &rtlog)
72
+ shell.exec('git clean -fd', &rtlog)
73
+
74
+ send(:before_file_update, shell) if respond_to?(:before_file_update)
75
+ log_header 'Updating app files'
76
+ shell.exec('git pull origin master', &rtlog)
77
+ # Ensure bin files are executable.
78
+ # Files stored by git from WSL don't seem to always get the exec bit stored.
79
+ shell.exec('chmod +x bin/*', &rtlog)
80
+
81
+ send(:before_bundle, shell) if respond_to?(:before_bundle)
82
+ log_header 'Bundling gems'
83
+ shell.exec('bundle install --deployment', &rtlog)
84
+
85
+ send(:before_db_update, shell) if respond_to?(:before_db_update)
86
+ log_header 'Updating database'
87
+ %w(db:create db:migrate).each do |cmd|
88
+ cmd = "bundle exec rake #{cmd} RAILS_ENV=production"
89
+ shell.exec(cmd, &rtlog)
90
+ end
91
+
92
+ send(:before_db_seed, shell) if respond_to?(:before_db_seed)
93
+ log_header 'Seeding database'
94
+ cmd = 'db:seed'
95
+ cmd = "bundle exec rake #{cmd} RAILS_ENV=production"
96
+ shell.exec(cmd, &rtlog)
97
+ send(:after_db_seed, shell) if respond_to?(:after_db_seed)
98
+
99
+ log_header 'Generating assets'
100
+ cmd = "bundle exec rake assets:precompile RAILS_ENV=production RAILS_GROUPS=assets RAILS_RELATIVE_URL_ROOT=\"#{@app_root_url}\""
101
+ shell.exec(cmd, &rtlog)
102
+ send(:after_asset_gen, shell) if respond_to?(:after_asset_gen)
103
+
104
+ log_header 'Running automatic configuration'
105
+ cmd = "bundle exec rails generate barkest:install --force"
106
+ shell.exec(cmd, &rtlog)
107
+ send(:after_config, shell) if respond_to?(:after_config)
108
+
109
+ log_header 'Restarting app'
110
+ cmd = "bundle exec passenger-config restart-app \"#{@file_path}\""
111
+ shell.exec(cmd, &rtlog)
112
+ send(:after_update, shell) if respond_to?(:after_update)
113
+
114
+ else
115
+ log_data "Skipping actual update for non-production.\n"
116
+ end
117
+ end
118
+
119
+ log_data "\nUpdate process is complete.\n"
120
+ rescue Net::SSH::AuthenticationFailed => _
121
+ log_data "Failed to login to the session.\nPlease verify the update credentials in your configuration.\nUpdate is aborting.\n"
122
+ rescue StandardError => error
123
+ log_data "An unexpected error occurred.\n#{error}\nUpdate is aborting.\nManual application update may be required to restore functionality.\n"
124
+ rescue => error
125
+ log_data "A really unexpected error has occurred.\n#{error}\nUpdate is aborting.\nManual application update may be required to restore functionality.\n"
126
+ end
127
+ end
128
+ ensure
129
+ @status_log = nil
130
+ end
131
+ end
132
+ end
133
+ end
134
+ else
135
+ flash[:danger] = 'The "Self Update Settings" need to be configured before a system update can be performed.'
136
+ redirect_to system_config_self_update_url
137
+ end
138
+
139
+ end
140
+
141
+ ##
142
+ # Shows current information about the app.
143
+ #
144
+ def index
145
+ app_gem_name = Rails.application.class.parent_name.underscore
146
+ @additional = BarkestCore.gem_list(app_gem_name, true)
147
+ end
148
+
149
+ private
150
+
151
+ def require_admin
152
+ authorize! true
153
+ end
154
+
155
+ def log_header(label)
156
+ @status_log.write "\n" + ('=' * 20) + label.center(24) + ('=' * 20) + "\n"
157
+ @status_log.flush
158
+ end
159
+
160
+ def log_data(data)
161
+ @status_log.write data
162
+ @status_log.flush
163
+ end
164
+ end
@@ -0,0 +1,44 @@
1
+ ##
2
+ # A controller used specifically to test authentication and authorization.
3
+ class TestAccessController < ApplicationController
4
+
5
+ before_action :valid_user
6
+
7
+ ##
8
+ # Tests an action that doesn't require a user to be logged in.
9
+ def allow_anon
10
+ end
11
+
12
+ ##
13
+ # Tests an action that requires a user to be logged in.
14
+ def require_user
15
+ end
16
+
17
+ ##
18
+ # Tests an action that requires a user that is an administrator to be logged in.
19
+ def require_admin
20
+ end
21
+
22
+ ##
23
+ # Tests an action that requires a user that is a member of one of the groups to be logged in.
24
+ #
25
+ # The valid groups are 'group 1', 'group 2', and 'group 3'.
26
+ def require_group_x
27
+ end
28
+
29
+ private
30
+
31
+ def valid_user
32
+ case action_name.to_sym
33
+ when :require_user
34
+ authorize!
35
+ when :require_admin
36
+ authorize! true
37
+ when :require_group_x
38
+ authorize! 'group 1', 'group 2', 'group 3'
39
+ else
40
+ true
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,75 @@
1
+ class TestReportController < ApplicationController
2
+
3
+ class SampleObject
4
+ include ActiveModel::Model
5
+
6
+ attr_accessor :code, :name, :email, :date_of_birth, :hire_date, :pay_rate, :hours
7
+ end
8
+
9
+ private_constant :SampleObject
10
+
11
+ before_action :require_admin
12
+ before_action :load_sample_data
13
+
14
+ def index
15
+
16
+ end
17
+
18
+ # Test result: "Code,Name,Email,Date of Birth,Hire Date,Pay Rate,Hours\nSMIJOH,John Smith,j.smith@example.com,1980-01-01 00:00:00 UTC,2010-05-01 00:00:00 UTC,15.5,2260\n"
19
+ def csv
20
+ render formats: [ :csv ]
21
+ end
22
+
23
+ def xlsx
24
+ render formats: [ :xlsx ]
25
+ end
26
+
27
+ def pdf
28
+ render formats: [ :pdf ]
29
+ end
30
+
31
+ private
32
+
33
+ def require_admin
34
+ authorize! true
35
+ end
36
+
37
+ def load_sample_data
38
+ @data = []
39
+
40
+ if Rails.env.development? && params[:one].blank?
41
+ while @data.length < 100
42
+ fn = Faker::Name.first_name
43
+ ln = Faker::Name.last_name
44
+ code = ln[0...3] + fn[0...3]
45
+ bd = Faker::Date.between(65.years.ago, 19.years.ago).to_time
46
+ hd = Faker::Date.between(bd + 18.years, 6.months.ago).to_time
47
+ pr = (Random.rand(5600) + 900).to_f / 100
48
+ hr = (Random.rand(2000) + 1000)
49
+
50
+ @data << SampleObject.new(
51
+ code: code.upcase,
52
+ name: "#{fn} #{ln}",
53
+ email: "#{code.downcase}@example.com",
54
+ date_of_birth: bd,
55
+ hire_date: hd,
56
+ pay_rate: pr,
57
+ hours: hr
58
+ )
59
+ end
60
+ else
61
+ @data << SampleObject.new(
62
+ code: 'SMIJOH',
63
+ name: 'John Smith',
64
+ email: 'j.smith@example.com',
65
+ date_of_birth: Time.utc(1980, 1, 1),
66
+ hire_date: Time.utc(2010, 5, 1),
67
+ pay_rate: 15.50,
68
+ hours: 2260
69
+ )
70
+ end
71
+
72
+ @data.sort!{|a,b| a.code <=> b.code}
73
+ end
74
+
75
+ end
@@ -0,0 +1,218 @@
1
+ ##
2
+ # This is a user management controller.
3
+ #
4
+ # This includes all the actions necessary to create, list, edit, disable, and destroy users.
5
+ #
6
+ class UsersController < ApplicationController
7
+
8
+ before_action :not_logged_in, only: [ :new, :create ]
9
+ before_action :logged_in_user, except: [:new, :create]
10
+ before_action :load_user, except: [:index, :new, :create]
11
+ before_action :correct_user, only: [:edit, :update]
12
+ before_action :admin_user, only: [:destroy, :disable, :disable_confirm, :enable]
13
+ before_action :not_current, only: [:destroy, :disable, :disable_confirm, :enable]
14
+ before_action :not_anon, only: [:edit, :update, :destroy, :disable, :disable_confirm, :enable]
15
+ before_action :not_ldap, only: [:edit, :update]
16
+ before_action :index_filter, only: [:index]
17
+ before_action :show_filter, only: [:show]
18
+
19
+ ##
20
+ # Shows a list of all users.
21
+ #
22
+ # Admin users are shown all users including disabled and inactive.
23
+ # Other users only see the enabled users.
24
+ #
25
+ def index
26
+ @users = (current_user.system_admin? ? User.known.sorted : User.known.enabled.sorted).paginate(page: params[:page])
27
+ end
28
+
29
+ ##
30
+ # Shows a specific user profile.
31
+ #
32
+ def show
33
+
34
+ end
35
+
36
+ ##
37
+ # Shows the signup form for a new user.
38
+ #
39
+ def new
40
+ @user = User.new
41
+ end
42
+
43
+ ##
44
+ # Creates a new user account after verifying the user is not a robot.
45
+ #
46
+ def create
47
+ @user = User.new(user_params)
48
+ if @user.valid? && verify_recaptcha_challenge(@user)
49
+ if @user.save
50
+ @user.send_activation_email request.remote_ip
51
+ flash[:safe_info] = 'Your account has been created, but needs to be activated before you can use it.<br/>Please check your email to activate your account.'
52
+ redirect_to root_url and return
53
+ end
54
+ end
55
+ render 'new'
56
+ end
57
+
58
+ ##
59
+ # Shows a form to edit the user profile.
60
+ #
61
+ def edit
62
+
63
+ end
64
+
65
+ ##
66
+ # Updates a user profile.
67
+ #
68
+ def update
69
+ if @user.update_attributes(user_params)
70
+ flash[:success] = 'Your profile has been updated.'
71
+ redirect_to @user
72
+ else
73
+ render 'edit'
74
+ end
75
+ end
76
+
77
+ ##
78
+ # Destroys a user account that has been disabled for at least 15 days
79
+ # as long as the requesting user is an admin.
80
+ #
81
+ def destroy
82
+ if @user.enabled?
83
+ flash[:danger] = 'Cannot delete an enabled user.'
84
+ elsif @user.disabled_at.blank? || @user.disabled_at > 15.days.ago
85
+ flash[:danger] = 'Cannot delete a user within 15 days of being disabled.'
86
+ else
87
+ @user.destroy
88
+ flash[:success] = "User #{@user.name} has been deleted."
89
+ end
90
+ redirect_to users_path
91
+ end
92
+
93
+ ##
94
+ # Shows a form requesting a reason to disable a user and allowing
95
+ # the administrator a chance to cancel the action.
96
+ #
97
+ def disable_confirm
98
+ load_disable_user
99
+ unless @disable.user.enabled?
100
+ flash[:warning] = "User #{@disable.user.name} is already disabled."
101
+ redirect_to users_path
102
+ end
103
+ end
104
+
105
+ ##
106
+ # Disables a user account as long as the requesting user is an administrator
107
+ # and provides a reason the account is being disabled.
108
+ #
109
+ def disable
110
+ load_disable_user
111
+
112
+ if @disable.valid?
113
+ if @disable.user.disable(current_user, @disable.reason)
114
+ flash[:success] = "User #{@disable.user.name} has been disabled."
115
+ redirect_to users_path and return
116
+ else
117
+ @disable.errors.add(:user, 'was unable to be updated')
118
+ end
119
+ end
120
+
121
+ render 'disable_confirm'
122
+ end
123
+
124
+ ##
125
+ # Enables a previosly disabled user as long as the requesting user is an
126
+ # administrator.
127
+ #
128
+ def enable
129
+ if @user.enabled?
130
+ flash[:warning] = "User #{@user.name} is already enabled."
131
+ redirect_to users_path and return
132
+ end
133
+
134
+ if @user.enable
135
+ flash[:success] = "User #{@user.name} has been enabled."
136
+ else
137
+ flash[:danger] = "Failed to enable user #{@user.name}."
138
+ end
139
+
140
+ redirect_to users_path
141
+ end
142
+
143
+ private
144
+
145
+ # ensure we have an @user variable to work with.
146
+ def load_user
147
+ if system_admin?
148
+ @user = User.find_by(id: params[:id])
149
+ else
150
+ @user = User.where(id: params[:id], enabled: true, activated: true).first
151
+ end
152
+ @user ||= User.new(name: 'Invalid User', email: 'invalid-email')
153
+ end
154
+
155
+ def load_disable_user
156
+ @disable = DisableUser.new(params[:disable_user] ? disable_user_params : {})
157
+ @disable.user = @user
158
+ end
159
+
160
+ def user_params
161
+ params.require(:user).permit(:name, :email, :password, :password_confirmation)
162
+ end
163
+
164
+ def disable_user_params
165
+ params.require(:disable_user).permit(:reason)
166
+ end
167
+
168
+ def not_logged_in
169
+ if logged_in?
170
+ flash[:danger] = 'You are already logged in.'
171
+ redirect_to root_url
172
+ end
173
+ end
174
+
175
+ def logged_in_user
176
+ unless logged_in?
177
+ flash[:danger] = 'Please log in.'
178
+ store_location_and_redirect_to login_url
179
+ end
180
+ end
181
+
182
+ def correct_user
183
+ # the current user can edit their details, so can an admin.
184
+ redirect_to(root_url) unless current_user?(@user) || system_admin?
185
+ end
186
+
187
+ def admin_user
188
+ redirect_to(root_url) unless system_admin?
189
+ end
190
+
191
+ def not_anon
192
+ # anon user cannot be edited.
193
+ redirect_to(root_url) if @user.anonymous?
194
+ end
195
+
196
+ def not_ldap
197
+ if @user.ldap?
198
+ flash[:danger] = 'LDAP accounts cannot be edited.'
199
+ redirect_to @user
200
+ end
201
+ end
202
+
203
+ def not_current
204
+ if current_user?(@user)
205
+ flash[:warning] = 'You cannot perform this operation on yourself.'
206
+ redirect_to users_path
207
+ end
208
+ end
209
+
210
+ def index_filter
211
+ admin_user if BarkestCore.lock_down_users
212
+ end
213
+
214
+ def show_filter
215
+ correct_user if BarkestCore.lock_down_users
216
+ end
217
+
218
+ end