anoubis 1.0.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 (188) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +38 -0
  5. data/app/controllers/anoubis/application_controller.rb +78 -0
  6. data/app/controllers/anoubis/core/application_controller.rb +343 -0
  7. data/app/controllers/anoubis/core/data/actions.rb +962 -0
  8. data/app/controllers/anoubis/core/data/callbacks.rb +68 -0
  9. data/app/controllers/anoubis/core/data/convert.rb +407 -0
  10. data/app/controllers/anoubis/core/data/defaults.rb +217 -0
  11. data/app/controllers/anoubis/core/data/get.rb +531 -0
  12. data/app/controllers/anoubis/core/data/load.rb +89 -0
  13. data/app/controllers/anoubis/core/data/set.rb +49 -0
  14. data/app/controllers/anoubis/core/data/setup.rb +104 -0
  15. data/app/controllers/anoubis/core/data_controller.rb +28 -0
  16. data/app/controllers/anoubis/core/index/actions.rb +53 -0
  17. data/app/controllers/anoubis/core/index/callbacks.rb +23 -0
  18. data/app/controllers/anoubis/core/index_controller.rb +36 -0
  19. data/app/controllers/anoubis/etc/base.rb +52 -0
  20. data/app/controllers/anoubis/etc/data.rb +89 -0
  21. data/app/controllers/anoubis/etc/field.rb +468 -0
  22. data/app/controllers/anoubis/etc/field_options.rb +83 -0
  23. data/app/controllers/anoubis/etc/field_order.rb +51 -0
  24. data/app/controllers/anoubis/etc/filter.rb +251 -0
  25. data/app/controllers/anoubis/etc/menu.rb +101 -0
  26. data/app/controllers/anoubis/etc/model.rb +67 -0
  27. data/app/controllers/anoubis/etc/tab_item.rb +91 -0
  28. data/app/controllers/anoubis/etc.rb +8 -0
  29. data/app/controllers/anoubis/export.rb +47 -0
  30. data/app/controllers/anoubis/output/autocomplete.rb +30 -0
  31. data/app/controllers/anoubis/output/basic.rb +86 -0
  32. data/app/controllers/anoubis/output/data.rb +101 -0
  33. data/app/controllers/anoubis/output/delete.rb +41 -0
  34. data/app/controllers/anoubis/output/edit.rb +55 -0
  35. data/app/controllers/anoubis/output/frame.rb +227 -0
  36. data/app/controllers/anoubis/output/login.rb +71 -0
  37. data/app/controllers/anoubis/output/menu.rb +220 -0
  38. data/app/controllers/anoubis/output/update.rb +43 -0
  39. data/app/controllers/anoubis/sso/client/application_controller.rb +139 -0
  40. data/app/controllers/anoubis/sso/client/data/actions.rb +5 -0
  41. data/app/controllers/anoubis/sso/client/data/callbacks.rb +5 -0
  42. data/app/controllers/anoubis/sso/client/data/convert.rb +5 -0
  43. data/app/controllers/anoubis/sso/client/data/defaults.rb +5 -0
  44. data/app/controllers/anoubis/sso/client/data/get.rb +5 -0
  45. data/app/controllers/anoubis/sso/client/data/load.rb +26 -0
  46. data/app/controllers/anoubis/sso/client/data/set.rb +5 -0
  47. data/app/controllers/anoubis/sso/client/data/setup.rb +5 -0
  48. data/app/controllers/anoubis/sso/client/data_controller.rb +21 -0
  49. data/app/controllers/anoubis/sso/client/index/actions.rb +79 -0
  50. data/app/controllers/anoubis/sso/client/index/callbacks.rb +13 -0
  51. data/app/controllers/anoubis/sso/client/index_controller.rb +18 -0
  52. data/app/controllers/anoubis/sso/server/application_controller.rb +49 -0
  53. data/app/controllers/anoubis/sso/server/login_controller.rb +342 -0
  54. data/app/controllers/anoubis/sso/server/user_controller.rb +142 -0
  55. data/app/controllers/anoubis/tenant/application_controller.rb +54 -0
  56. data/app/controllers/anoubis/tenant/data/actions.rb +11 -0
  57. data/app/controllers/anoubis/tenant/data/callbacks.rb +11 -0
  58. data/app/controllers/anoubis/tenant/data/convert.rb +11 -0
  59. data/app/controllers/anoubis/tenant/data/defaults.rb +11 -0
  60. data/app/controllers/anoubis/tenant/data/get.rb +11 -0
  61. data/app/controllers/anoubis/tenant/data/load.rb +52 -0
  62. data/app/controllers/anoubis/tenant/data/set.rb +11 -0
  63. data/app/controllers/anoubis/tenant/data/setup.rb +11 -0
  64. data/app/controllers/anoubis/tenant/data_controller.rb +28 -0
  65. data/app/controllers/anoubis/tenant/index/actions.rb +191 -0
  66. data/app/controllers/anoubis/tenant/index/callbacks.rb +11 -0
  67. data/app/controllers/anoubis/tenant/index_controller.rb +38 -0
  68. data/app/controllers/anoubis/tenants_controller.rb +7 -0
  69. data/app/controllers/anoubis/users_controller.rb +7 -0
  70. data/app/jobs/anoubis/application_job.rb +6 -0
  71. data/app/mailers/anoubis/application_mailer.rb +8 -0
  72. data/app/models/anoubis/application_record.rb +45 -0
  73. data/app/models/anoubis/core/application_record.rb +250 -0
  74. data/app/models/anoubis/core/locales.rb +27 -0
  75. data/app/models/anoubis/sso/client/application_record.rb +3 -0
  76. data/app/models/anoubis/sso/client/group.rb +19 -0
  77. data/app/models/anoubis/sso/client/group_menu.rb +109 -0
  78. data/app/models/anoubis/sso/client/menu.rb +145 -0
  79. data/app/models/anoubis/sso/client/user.rb +81 -0
  80. data/app/models/anoubis/sso/client/user_group.rb +32 -0
  81. data/app/models/anoubis/sso/server/system.rb +36 -0
  82. data/app/models/anoubis/sso/server/user.rb +79 -0
  83. data/app/models/anoubis/tenant/application_record.rb +41 -0
  84. data/app/models/anoubis/tenant/group.rb +95 -0
  85. data/app/models/anoubis/tenant/group_locale.rb +19 -0
  86. data/app/models/anoubis/tenant/group_menu.rb +84 -0
  87. data/app/models/anoubis/tenant/menu.rb +156 -0
  88. data/app/models/anoubis/tenant/menu_locale.rb +27 -0
  89. data/app/models/anoubis/tenant/system.rb +127 -0
  90. data/app/models/anoubis/tenant/system_locale.rb +19 -0
  91. data/app/models/anoubis/tenant/system_menu.rb +51 -0
  92. data/app/models/anoubis/tenant/tenant.rb +107 -0
  93. data/app/models/anoubis/tenant/tenant_system.rb +19 -0
  94. data/app/models/anoubis/tenant/user.rb +225 -0
  95. data/app/models/anoubis/tenant/user_group.rb +32 -0
  96. data/app/services/anoubis/core_service.rb +16 -0
  97. data/app/services/anoubis/session_service.rb +17 -0
  98. data/app/validators/presence_in_tenant_validator.rb +20 -0
  99. data/config/initializers/mime_type.rb +1 -0
  100. data/config/locales/en.yml +120 -0
  101. data/config/locales/ru.yml +245 -0
  102. data/config/routes.rb +74 -0
  103. data/db/migrate/20181018085843_create_tenants.rb +13 -0
  104. data/db/migrate/20181018111217_create_systems.rb +10 -0
  105. data/db/migrate/20181018111713_create_tenant_systems.rb +11 -0
  106. data/db/migrate/20181018111925_create_groups.rb +13 -0
  107. data/db/migrate/20181018112151_create_users.rb +25 -0
  108. data/db/migrate/20181018115737_add_title_to_users.rb +10 -0
  109. data/db/migrate/20181022060211_create_menus.rb +18 -0
  110. data/db/migrate/20181115055245_create_group_menus.rb +12 -0
  111. data/db/migrate/20181115060830_create_system_menus.rb +11 -0
  112. data/db/migrate/20181122062131_create_user_groups.rb +11 -0
  113. data/db/migrate/20181221060727_create_menu_locales.rb +14 -0
  114. data/db/migrate/20181225062303_create_system_locales.rb +11 -0
  115. data/db/migrate/20181225062339_create_group_locales.rb +11 -0
  116. data/db/seeds.rb +268 -0
  117. data/lib/anoubis/engine.rb +13 -0
  118. data/lib/anoubis/version.rb +5 -0
  119. data/lib/anoubis.rb +213 -0
  120. data/lib/tasks/anubis_tasks.rake +10 -0
  121. data/lib/tasks/sessions/clear_sessions.rake +10 -0
  122. data/spec/anubis_spec.rb +5 -0
  123. data/spec/controllers/anoubis/index_controller_spec.rb +77 -0
  124. data/spec/dummy/Rakefile +3 -0
  125. data/spec/dummy/app/assets/config/manifest.js +2 -0
  126. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  127. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  128. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  129. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  130. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  131. data/spec/dummy/app/jobs/application_job.rb +2 -0
  132. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  133. data/spec/dummy/app/models/application_record.rb +3 -0
  134. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  135. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  136. data/spec/dummy/bin/bundle +3 -0
  137. data/spec/dummy/bin/rails +4 -0
  138. data/spec/dummy/bin/rake +4 -0
  139. data/spec/dummy/bin/setup +33 -0
  140. data/spec/dummy/bin/update +28 -0
  141. data/spec/dummy/config/application.rb +14 -0
  142. data/spec/dummy/config/boot.rb +5 -0
  143. data/spec/dummy/config/cable.yml +10 -0
  144. data/spec/dummy/config/database.yml +54 -0
  145. data/spec/dummy/config/environment.rb +5 -0
  146. data/spec/dummy/config/environments/development.rb +54 -0
  147. data/spec/dummy/config/environments/production.rb +85 -0
  148. data/spec/dummy/config/environments/test.rb +46 -0
  149. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  150. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  151. data/spec/dummy/config/initializers/cors.rb +16 -0
  152. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  153. data/spec/dummy/config/initializers/inflections.rb +16 -0
  154. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  155. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  156. data/spec/dummy/config/locales/en.yml +33 -0
  157. data/spec/dummy/config/puma.rb +34 -0
  158. data/spec/dummy/config/routes.rb +3 -0
  159. data/spec/dummy/config/spring.rb +6 -0
  160. data/spec/dummy/config/storage.yml +34 -0
  161. data/spec/dummy/config.ru +5 -0
  162. data/spec/dummy/db/schema.rb +167 -0
  163. data/spec/dummy/db/seeds.rb +1 -0
  164. data/spec/factories/anubis_group_locales.rb +7 -0
  165. data/spec/factories/anubis_group_menus.rb +7 -0
  166. data/spec/factories/anubis_groups.rb +6 -0
  167. data/spec/factories/anubis_menu_locales.rb +9 -0
  168. data/spec/factories/anubis_menus.rb +6 -0
  169. data/spec/factories/anubis_system_locales.rb +7 -0
  170. data/spec/factories/anubis_system_menus.rb +6 -0
  171. data/spec/factories/anubis_systems.rb +5 -0
  172. data/spec/factories/anubis_tenants.rb +7 -0
  173. data/spec/factories/anubis_users.rb +10 -0
  174. data/spec/integration/navigation_test.rb +7 -0
  175. data/spec/models/anoubis/group_locale_spec.rb +25 -0
  176. data/spec/models/anoubis/group_menu_spec.rb +50 -0
  177. data/spec/models/anoubis/group_spec.rb +52 -0
  178. data/spec/models/anoubis/menu_locale_spec.rb +31 -0
  179. data/spec/models/anoubis/menu_spec.rb +48 -0
  180. data/spec/models/anoubis/system_locale_spec.rb +20 -0
  181. data/spec/models/anoubis/system_menu_spec.rb +49 -0
  182. data/spec/models/anoubis/system_spec.rb +53 -0
  183. data/spec/models/anoubis/tenant_spec.rb +67 -0
  184. data/spec/models/anoubis/user_spec.rb +57 -0
  185. data/spec/rails_helper.rb +32 -0
  186. data/spec/requests/anoubis/users_request_spec.rb +5 -0
  187. data/spec/spec_helper.rb +13 -0
  188. metadata +408 -0
@@ -0,0 +1,342 @@
1
+ class Anubis::Sso::Server::LoginController < Anubis::Sso::Server::ApplicationController
2
+ include ActionController::Cookies
3
+
4
+ def authenticate?
5
+ false
6
+ end
7
+
8
+ def system
9
+ data = nil
10
+ if params.key? :sso_system
11
+ begin
12
+ data = JSON.parse self.redis.get(self.redis_prefix + 'system:' + params[:sso_system].to_s), { symbolize_names: true }
13
+ rescue
14
+ data = nil
15
+ end
16
+ end
17
+
18
+ data
19
+ end
20
+
21
+ def index
22
+ params[:prompt] = 'yes' unless params.key? :prompt
23
+
24
+ result = {
25
+ result: 0,
26
+ message: I18n.t('core.success')
27
+ }
28
+ code = 200
29
+
30
+ if self.system
31
+ session = nil
32
+ session = cookies[:session] if cookies.key? :session
33
+
34
+ unless session
35
+ redirect_to self.get_login_url
36
+ return
37
+ end
38
+
39
+ begin
40
+ ses_data = JSON.parse self.redis.get(self.redis_prefix + 'session:' + session), { symbolize_names: true }
41
+ rescue
42
+ ses_data = nil
43
+ end
44
+
45
+ if ses_data
46
+ ses_data = nil if ses_data[:ttl] < Time.now
47
+
48
+ if ses_data
49
+ ses_data[:time] = Time.now
50
+
51
+ user = self.user_model.load_cache self.redis, ses_data[:uuid]
52
+
53
+ if user
54
+ ses_data[:ttl] = Time.now + user[:timeout]
55
+ self.redis.set(self.redis_prefix + 'session:' + session, ses_data.to_json, ex: user[:timeout])
56
+ else
57
+ ses_data = nil
58
+ end
59
+ else
60
+ self.redis.del self.redis_prefix + 'session:' + session
61
+ end
62
+ end
63
+
64
+ unless ses_data
65
+ redirect_to self.get_login_url
66
+ return
67
+ end
68
+
69
+ unless ses_data.key? :ttl
70
+ redirect_to self.get_login_url
71
+ return
72
+ end
73
+
74
+ if ses_data[:ttl] < Time.now
75
+ redirect_to self.get_login_url
76
+ return
77
+ end
78
+
79
+ url = self.system[:host]
80
+
81
+ if params[:prompt] != 'none'
82
+ url += self.system[:callback]
83
+ else
84
+ url += self.system[:silent]
85
+ end
86
+
87
+ url += '?'
88
+
89
+ if params.key? :sso_path
90
+ url += params[:sso_path] + '&'
91
+ end
92
+ url += 'sso_session=' + cookies[:session] + '&locale=' + self.locale
93
+
94
+ redirect_to url
95
+ return
96
+ else
97
+ result[:result] = -1
98
+ result[:message] = I18n.t('core.errors.incorrect_system')
99
+ code = 400
100
+ end
101
+
102
+ respond_to do |format|
103
+ format.json { render json: result, status: code }
104
+ end
105
+ end
106
+
107
+ def create
108
+ result = {
109
+ result: 0,
110
+ message: I18n.t('core.success')
111
+ }
112
+ code = 200
113
+
114
+ if self.system
115
+ if params.has_key?(:login) && params.has_key?(:password)
116
+ user = self.user_model.where(login: params[:login].downcase, status: 1).first
117
+
118
+ if user && user.authenticate(params[:password])
119
+ if !user.auth_key
120
+ user.save_cache
121
+ cookies[:session] = {
122
+ value: SecureRandom.hex(32),
123
+ domain: self.domain_url
124
+ }
125
+ self.user_model.where(uuid: user.uuid).update_all(visited_at: Time.now)
126
+ self.redis.set(self.redis_prefix + 'session:' + cookies[:session], { uuid: user.uuid, login: Time.now, time: Time.now, ttl: Time.now + user.timeout, update: Time.now + 5.minutes }.to_json, ex: user.timeout)
127
+ result[:url] = self.system[:host] + '?'
128
+ if params.key? :sso_path
129
+ result[:url] += params[:sso_path] + '&'
130
+ end
131
+ result[:session] = cookies[:session]
132
+ result[:url] += 'sso_session=' + cookies[:session] + '&locale=' + self.locale
133
+ else
134
+ result[:result] = -4
135
+ result[:message] = I18n.t('login.errors.cant_login')
136
+ end
137
+ else
138
+ result[:result] = -3
139
+ result[:message] = I18n.t('login.errors.cant_login')
140
+ end
141
+ else
142
+ result[:result] = -2
143
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
144
+ end
145
+ else
146
+ result[:result] = -1
147
+ result[:message] = I18n.t('core.errors.incorrect_system')
148
+ end
149
+
150
+ respond_to do |format|
151
+ format.json { render json: result, status: code }
152
+ end
153
+ end
154
+
155
+ def update
156
+ result = {
157
+ result: 0,
158
+ message: I18n.t('core.success')
159
+ }
160
+
161
+ if self.system
162
+ begin
163
+ ses_data = JSON.parse self.redis.get(self.redis_prefix + 'session:' + params[:session]), { symbolize_names: true }
164
+ rescue
165
+ ses_data = nil
166
+ end
167
+
168
+ if ses_data
169
+ if ses_data[:ttl] > Time.now
170
+ if params.key? :secret_key
171
+ if self.system[:secret_key] == params[:secret_key]
172
+ user_data = self.get_user_data_by_uuid ses_data[:uuid]
173
+
174
+ if user_data
175
+ ses_data[:time] = Time.now
176
+ ses_data[:ttl] = Time.now + user_data.timeout
177
+ if ses_data[:update] < Time.now
178
+ ses_data[:update] = Time.now + 5.minutes
179
+ self.user_model.where(uuid: ses_data[:uuid]).update_all(visited_at: Time.now)
180
+ end
181
+ self.redis.set self.redis_prefix + 'session:' + params[:session], ses_data.to_json, ex: user_data.timeout
182
+ else
183
+ result[:result] = -5
184
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
185
+ end
186
+ else
187
+ result[:result] = -4
188
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
189
+ end
190
+ else
191
+ result[:result] = -3
192
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
193
+ end
194
+ else
195
+ self.redis.del self.redis_prefix + 'session:' + params[:session]
196
+ result[:result] = -6
197
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
198
+ end
199
+ else
200
+ result[:result] = -2
201
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
202
+ end
203
+ else
204
+ result[:result] = -1
205
+ result[:message] = I18n.t('core.errors.incorrect_system')
206
+ end
207
+
208
+ respond_to do |format|
209
+ format.json { render json: result }
210
+ end
211
+ end
212
+
213
+ def destroy
214
+ result = {
215
+ result: 0,
216
+ message: I18n.t('core.success')
217
+ }
218
+
219
+ begin
220
+ ses_data = JSON.parse self.redis.get(self.redis_prefix + 'session:' + params[:session]), { symbolize_names: true }
221
+ rescue
222
+ ses_data = nil
223
+ end
224
+
225
+ if ses_data
226
+ self.redis.del self.redis_prefix + 'session:' + params[:session]
227
+ else
228
+ result[:result] = -1
229
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
230
+ end
231
+
232
+ respond_to do |format|
233
+ format.json { render json: result }
234
+ end
235
+ end
236
+
237
+ ##
238
+ # REST action returns current user UUID from SSO server. This action also make prolongation of session life.
239
+ #
240
+ # <b>API request:</b>
241
+ # GET /api/<version>/login/:session
242
+ #
243
+ # <b>Parameters:</b>
244
+ # - <b>sso_system</b> (String) --- system UUID <i>(required value)</i>
245
+ # - <b>sso_secret</b> (String) --- system secret key <i>(required value)</i>
246
+ # - <b>locale</b> (String) --- the output language locale <i>(optional value)</i>
247
+ #
248
+ # <b>Request example:</b>
249
+ # curl --header "Content-Type: application/json" --header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/login/<session>?sso_system=<sso_system>&sso_secret=<sso_secret_key>
250
+ #
251
+ # <b>Results:</b>
252
+ #
253
+ # Resulting data returns in JSON format.
254
+ #
255
+ # <b>Examples:</b>
256
+ #
257
+ # <b>Success:</b> HTTP response code 200
258
+ # {
259
+ # "result": 0,
260
+ # "message": "Successful",
261
+ # "uuid": "9adc7c0a-45ca-4436-b706-1807de6192e0"
262
+ # }
263
+ def show
264
+ result = {
265
+ result: 0,
266
+ message: I18n.t('core.success')
267
+ }
268
+
269
+ if self.system
270
+ begin
271
+ ses_data = JSON.parse self.redis.get(self.redis_prefix + 'session:' + params[:session]), { symbolize_names: true }
272
+ rescue
273
+ ses_data = nil
274
+ end
275
+
276
+ if ses_data
277
+ if ses_data[:ttl] > Time.now
278
+ if params.key? :secret_key
279
+ if self.system[:secret_key] == params[:secret_key]
280
+ user_data = self.get_user_data_by_uuid ses_data[:uuid]
281
+
282
+ if user_data
283
+ self.format_user_output(user_data, result)
284
+ result[:login_time] = ses_data[:login]
285
+ ses_data[:time] = Time.now
286
+ ses_data[:ttl] = Time.now + user_data.timeout
287
+ if ses_data[:update] < Time.now
288
+ ses_data[:update] = Time.now + 5.minutes
289
+ self.user_model.where(uuid: ses_data[:uuid]).update_all(visited_at: Time.now)
290
+ end
291
+ self.redis.set self.redis_prefix + 'session:' + params[:session], ses_data.to_json, ex: user_data.timeout
292
+ else
293
+ result[:result] = -5
294
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
295
+ end
296
+ else
297
+ result[:result] = -4
298
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
299
+ end
300
+ else
301
+ result[:result] = -3
302
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
303
+ end
304
+ else
305
+ self.redis.del self.redis_prefix + 'session:' + params[:session]
306
+ result[:result] = -6
307
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
308
+ end
309
+ else
310
+ result[:result] = -2
311
+ result[:message] = I18n.t('core.errors.incorrect_parameters')
312
+ end
313
+ else
314
+ result[:result] = -1
315
+ result[:message] = I18n.t('core.errors.incorrect_system')
316
+ end
317
+
318
+ respond_to do |format|
319
+ format.json { render json: result }
320
+ end
321
+ end
322
+
323
+ def get_login_url
324
+ prompt = true
325
+ if params.key? :prompt
326
+ prompt = false if params[:prompt] == 'none'
327
+ end
328
+
329
+ if prompt
330
+ url = self.front_url + 'login?'
331
+ if params.key? :sso_path
332
+ url += 'sso_path=' + params[:sso_path] + '&'
333
+ end
334
+ url += 'sso_system=' + params[:sso_system] + '&locale=' + self.locale
335
+ else
336
+ url = self.system[:host] + self.system[:silent] + '?error=need-login'
337
+ end
338
+
339
+
340
+ return url
341
+ end
342
+ end
@@ -0,0 +1,142 @@
1
+ class Anubis::Sso::Server::UserController < Anubis::Sso::Server::ApplicationController
2
+ def authenticate?
3
+ false
4
+ end
5
+
6
+ def show
7
+ result = {
8
+ result: 0,
9
+ message: I18n.t('anubis.core.success')
10
+ }
11
+ code = 200
12
+
13
+ self.get_user_data result
14
+
15
+ respond_to do |format|
16
+ format.json { render json: result, status: code }
17
+ end
18
+ end
19
+
20
+ def show_current
21
+ self.get_user_from_session
22
+ self.show
23
+ end
24
+
25
+ def update
26
+ result = {
27
+ result: 0,
28
+ message: I18n.t('anubis.core.success')
29
+ }
30
+ code = 200
31
+
32
+ user_data = self.get_user_data result
33
+
34
+ if user_data
35
+ user_data.name = params[:name] if params.key? :name
36
+ user_data.surname = params[:surname] if params.key? :surname
37
+ user_data.timezone = params[:timezone] if params.key? :timezone
38
+ user_data.locale = params[:locale] if params.key? :locale
39
+ if params.key? :timeout
40
+ user_data.timeout = params[:timeout] if params[:timeout].to_s.to_i > 60 && params[:timeout].to_s.to_i <= 36000
41
+ end
42
+
43
+ if user_data.save
44
+ result[:uuid] = user_data.uuid
45
+ result[:name] = user_data.name
46
+ result[:surname] = user_data.surname
47
+ result[:login] = user_data.login
48
+ result[:locale] = user_data.locale
49
+ result[:timezone] = user_data.timezone
50
+ result[:timeout] = user_data.timeout
51
+ else
52
+ result[:uuid] = user_data.uuid_was
53
+ result[:name] = user_data.name_was
54
+ result[:surname] = user_data.surname_was
55
+ result[:login] = user_data.login_was
56
+ result[:locale] = user_data.locale_was
57
+ result[:timezone] = user_data.timezone_was
58
+ result[:timeout] = user_data.timeout_was
59
+ result[:errors] = user_data.errors.full_messages
60
+ result[:result] = -7
61
+ result[:message] = I18n.t('anubis.core.errors.error_changing_data')
62
+ end
63
+ end
64
+
65
+ respond_to do |format|
66
+ format.json { render json: result, status: code }
67
+ end
68
+ end
69
+
70
+ def update_current
71
+ self.get_user_from_session
72
+ self.update
73
+ end
74
+
75
+ def get_user_from_session
76
+ session = self.get_current_session
77
+ if session.key? :ttl
78
+ if session[:ttl] > Time.now
79
+ params[:uuid] = session[:uuid]
80
+ end
81
+ end
82
+ end
83
+
84
+ def get_current_session
85
+ begin
86
+ ses_data = JSON.parse self.redis.get(self.redis_prefix + 'session:' + params[:session]), { symbolize_names: true }
87
+ rescue
88
+ ses_data = { ttl: Time.now - 1.day }
89
+ end
90
+
91
+ ses_data
92
+ end
93
+
94
+ def get_user_data(result)
95
+ user_data = nil
96
+
97
+ if params.has_key? :session
98
+ ses_data = self.get_current_session
99
+
100
+ if ses_data[:ttl] > Time.now
101
+ user_data = self.user_model.where(uuid: params[:uuid]).first
102
+
103
+ if user_data
104
+ begin
105
+ adm_data = self.get_user_data_by_uuid ses_data[:uuid]
106
+ rescue
107
+ adm_data = nil
108
+ end
109
+
110
+ if adm_data
111
+ if adm_data.role == 'user_role'
112
+ if adm_data.id != user_data.id
113
+ user_data = nil
114
+ end
115
+ end
116
+
117
+ if user_data
118
+ self.format_user_output user_data, result
119
+ else
120
+ result[:result] = -6
121
+ result[:message] = I18n.t('anubis.core.errors.incorrect_parameters')
122
+ end
123
+ else
124
+ result[:result] = -5
125
+ result[:message] = I18n.t('anubis.core.errors.incorrect_parameters')
126
+ end
127
+ else
128
+ result[:result] = -4
129
+ result[:message] = I18n.t('anubis.core.errors.incorrect_parameters')
130
+ end
131
+ else
132
+ result[:result] = -3
133
+ result[:message] = I18n.t('anubis.core.errors.incorrect_parameters')
134
+ end
135
+ else
136
+ result[:result] = -2
137
+ result[:message] = I18n.t('anubis.core.errors.incorrect_parameters')
138
+ end
139
+
140
+ user_data
141
+ end
142
+ end
@@ -0,0 +1,54 @@
1
+ class Anubis::Tenant::ApplicationController < Anubis::Core::ApplicationController
2
+ ##
3
+ # Get current user model
4
+ # @return [ActiveRecord] defined user model. It is used for get current user data. May be redefined when user model is changed
5
+ def get_user_model
6
+ Anubis::Tenant::User
7
+ end
8
+
9
+ ##
10
+ # Get current user model filed json exception
11
+ # @return [Array] defined user exception for to_json function
12
+ def get_user_model_except
13
+ [:uuid_bin]
14
+ end
15
+
16
+ ##
17
+ # Check menu access for current user of current controller
18
+ # @return [Boolean] if true, then user have access for this controller.
19
+ def menu_access(controller, exit = true)
20
+ menu_access_status = redis.get self.redis_prefix + self.current_user.uuid+'_'+controller
21
+
22
+ if !menu_access_status
23
+ access = Anubis::Tenant::GroupMenu.accesses[:read].to_s+','+Anubis::Tenant::GroupMenu.accesses[:write].to_s
24
+ query = <<-SQL
25
+ SELECT `t`.* FROM
26
+ (SELECT `menus`.`id`, `menus`.`mode`, `menus`.`action`, `menus`.`menu_id`,
27
+ MAX(`group_menus`.`access`) AS `access`, `user_groups`.`user_id`
28
+ FROM `menus`, `group_menus`, `groups`, `user_groups`
29
+ WHERE `menus`.`mode` = '#{controller}' AND `menus`.`id` = `group_menus`.`menu_id` AND
30
+ `menus`.`status` = 0 AND `group_menus`.`group_id` = `groups`.`id` AND `groups`.`id` = `user_groups`.`group_id` AND
31
+ `user_groups`.`user_id` = #{self.current_user.id}
32
+ GROUP BY `menus`.`id`) AS `t`
33
+ WHERE `t`.`access` IN (#{access})
34
+ ORDER BY `t`.`menu_id`
35
+ SQL
36
+ menu = Anubis::Tenant::GroupMenu.find_by_sql(query).first
37
+ if (!menu)
38
+ redis.set self.redis_prefix + self.current_user.uuid+'_'+controller, 'not'
39
+ self.error_exit({ error: I18n.t('errors.access_not_allowed') }) if exit
40
+ return false
41
+ end
42
+
43
+ menu_access_status = menu.access
44
+ redis.set self.redis_prefix + self.current_user.uuid+'_'+controller, menu_access_status
45
+ else
46
+ if menu_access_status == 'not'
47
+ self.error_exit({ error: I18n.t('errors.access_not_allowed') }) if exit
48
+ return false
49
+ end
50
+ end
51
+ self.writer = true if menu_access_status == 'write'
52
+ return true
53
+ end
54
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module presents all default actions for for {DataController}.
6
+ module Actions
7
+ include Anubis::Core::Data::Actions
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module presents all callbacks called in actions.
6
+ module Callbacks
7
+ include Anubis::Core::Data::Callbacks
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Data conversion moule between database and human representation
6
+ module Convert
7
+ include Anubis::Core::Data::Convert
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module sets default parameters for {DataController}.
6
+ module Defaults
7
+ include Anubis::Core::Data::Defaults
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module gets system data for {DataController}
6
+ module Get
7
+ include Anubis::Core::Data::Get
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,52 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module loads data from external sources for {DataController}
6
+ module Load
7
+ include Anubis::Core::Data::Load
8
+
9
+ ##
10
+ # Loads current menu data. Procedure loads menu data from MySQL database or from Redis cache and places it in
11
+ # self.etc.menu {Anubis::Etc#menu}
12
+ def load_menu_data
13
+ menu_json = self.redis.get(self.redis_prefix + 'menu_' + params[:controller])
14
+ menu_locale_json = self.redis.get(self.redis_prefix + 'menu_'+params[:controller]+'_'+self.locale)
15
+ if !menu_json || !menu_locale_json
16
+ menu = Anubis::Tenant::MenuLocale.eager_load(menu: :menu).where(locale: Anubis::Tenant::MenuLocale.locales[self.locale.to_sym]).where(['menus.mode = ? AND menus.status = 0', params[:controller]]).first
17
+ if menu
18
+ menu_json = {
19
+ mode: menu.menu.mode,
20
+ menu_id: menu.menu_id,
21
+ parent_menu_id: menu.menu.menu_id,
22
+ action: menu.menu.action,
23
+ tab: menu.menu.tab,
24
+ position: menu.menu.position,
25
+ state: menu.menu.state
26
+ }
27
+ if menu.menu.menu
28
+ menu_json[:parent_mode] = menu.menu.menu.mode
29
+ end
30
+ menu_json = menu_json.to_json
31
+ self.redis.set(self.redis_prefix + 'menu_'+params[:controller], menu_json)
32
+ menu_locale_json = {
33
+ title: menu.title,
34
+ page_title: menu.page_title,
35
+ short_title: menu.short_title
36
+ }.to_json
37
+ self.redis.set(self.redis_prefix + 'menu_'+params[:controller]+'_'+self.locale, menu_locale_json)
38
+ end
39
+ end
40
+ if menu_json && menu_locale_json
41
+ self.etc.menu = Anubis::Etc::Menu.new JSON.parse(menu_json, {:symbolize_names => true}).merge(JSON.parse(menu_locale_json, {:symbolize_names => true}))
42
+ if self.writer
43
+ self.etc.menu.access = 'write'
44
+ else
45
+ self.etc.menu.access = 'read'
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module sets system data for {DataController}
6
+ module Set
7
+ include Anubis::Core::Data::Set
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Data
4
+ ##
5
+ # Module setups system parameters for {DataController}
6
+ module Setup
7
+ include Anubis::Core::Data::Setup
8
+ end
9
+ end
10
+ end
11
+ end