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,220 @@
1
+ module Anubis
2
+ module Output
3
+ ##
4
+ # Output subclass that represents data for menu action
5
+ class Menu < Basic
6
+ # @!attribute [rw] items
7
+ # @return [Array] the array of menu elements {Anubis::Output::MenuItem}.
8
+ class_attribute :items
9
+
10
+ # @!attribute [rw] keys
11
+ # @return [Hash] the hash of menu elements {Anubis::Output::MenuItem} with 'mode' as a key.
12
+ class_attribute :keys
13
+
14
+ # @!attribute [rw] user
15
+ # @return [Hash] the hash of user information.
16
+ class_attribute :user
17
+
18
+ ##
19
+ # Initializes menu output data. Generates default values.
20
+ def initialize
21
+ super
22
+ self.items = []
23
+ self.keys = {}
24
+ self.user = {}
25
+ end
26
+
27
+ ##
28
+ # Adds new element into menu hash
29
+ # @param [Hash] options the menu element options
30
+ # @option options [String] :title The title of the menu element.
31
+ # @option options [String] :page_title The page title of the menu element.
32
+ # @option options [String] :short_title The short title of the menu element.
33
+ # @option options [String] :mode The mode of the menu element.
34
+ # @option options [String] :action The action type of the menu element ('menu', 'data').
35
+ # @option options [Number] :position The position of the menu element in current level.
36
+ # @option options [Number] :tab The level of the menu element.
37
+ # @option options [String] :state The show state of the menu element ('visible', 'hidden').
38
+ # @option options [String] :access The access to the menu element for current user ('read', 'write').
39
+ def addElement(options)
40
+ if options.has_key? :parent
41
+ if !self.keys.has_key? options[:parent].to_s.to_sym
42
+ options[:parent] = nil
43
+ end
44
+ end
45
+ menu = MenuItem.new options
46
+ self.items.push menu
47
+ self.keys[menu.mode.to_s.to_sym] = self.items[self.items.count-1]
48
+ end
49
+
50
+ ##
51
+ # Generates hash representation of output class
52
+ # @return [Hash] hash representation of all data
53
+ def to_h
54
+ result = super.to_h
55
+ return result if self.result != 0
56
+ result[:menu] = []
57
+ self.items.each { |item|
58
+ result[:menu].push(item.to_h) if item
59
+ }
60
+ result[:user] = self.user
61
+ result
62
+ end
63
+
64
+ ##
65
+ # Generates output message based on {#result self.result} variable.
66
+ # @return [String] output message
67
+ def message
68
+ case self.result
69
+ when 0
70
+ return I18n.t('success')
71
+ else
72
+ return I18n.t('invalid_menu_output')
73
+ end
74
+ end
75
+
76
+ ##
77
+ # Returns menu element
78
+ # @param mode [String] the mode of returned menu element
79
+ # @return [MenuItem | nil] menu element or nil if element isn't exists
80
+ def key(mode)
81
+ if self.keys.has_key? mode.to_s.to_sym
82
+
83
+ return self.keys[mode.to_s.to_sym]
84
+ else
85
+ return nil
86
+ end
87
+ end
88
+ end
89
+
90
+ ##
91
+ # Subclass of menu element.
92
+ class MenuItem
93
+ # @!attribute [rw] mode
94
+ # @return [String] the mode of the menu element. Identificator represents path of controller.
95
+ class_attribute :mode
96
+
97
+ # @!attribute [rw] title
98
+ # @return [String] the title of the menu element.
99
+ class_attribute :title
100
+
101
+ # @!attribute [rw] page_title
102
+ # @return [String] the page title of the menu element. Uses for show in page title.
103
+ class_attribute :page_title
104
+
105
+ # @!attribute [rw] short_title
106
+ # @return [String] the short title of the menu element. Uses for short menu link.
107
+ class_attribute :short_title
108
+
109
+ # @!attribute [rw] position
110
+ # @return [Number] the position of the menu element in current level.
111
+ class_attribute :position
112
+
113
+ # @!attribute [rw] tab
114
+ # @return [Number] the level of the menu element.
115
+ class_attribute :tab
116
+
117
+ # @!attribute [rw] action
118
+ # @return [String] the action type of the menu element ('menu', 'data').
119
+ class_attribute :action
120
+
121
+ # @!attribute [rw] access
122
+ # @return [String] the access to the menu element for current user ('read', 'write').
123
+ class_attribute :access
124
+
125
+ # @!attribute [rw] state
126
+ # @return [String] the show state of the menu element ('visible', 'hidden').
127
+ class_attribute :state
128
+
129
+ # @!attribute [rw] parent
130
+ # @return [String] the mode of parent menu of the menu element when tab more then 0.
131
+ class_attribute :parent
132
+
133
+ ##
134
+ # Initializes menu element data. Generates default values.
135
+ def initialize(options = {})
136
+ if options.has_key? :mode
137
+ self.mode = options[:mode]
138
+ else
139
+ self.mode = ''
140
+ end
141
+
142
+ if options.has_key? :title
143
+ self.title = options[:title]
144
+ else
145
+ self.title = ''
146
+ end
147
+
148
+ if options.has_key? :page_title
149
+ self.page_title = options[:page_title]
150
+ else
151
+ self.page_title = ''
152
+ end
153
+
154
+ if options.has_key? :short_title
155
+ self.short_title = options[:short_title]
156
+ else
157
+ self.short_title = ''
158
+ end
159
+
160
+ if options.has_key? :position
161
+ self.position = options[:position]
162
+ else
163
+ self.position = 0
164
+ end
165
+
166
+ if options.has_key? :tab
167
+ self.tab = options[:tab]
168
+ else
169
+ self.tab = 0
170
+ end
171
+
172
+ if options.has_key? :action
173
+ self.action = options[:action]
174
+ else
175
+ self.action = 'data'
176
+ end
177
+
178
+ if options.has_key? :access
179
+ self.access = options[:access]
180
+ else
181
+ self.access = 'read'
182
+ end
183
+
184
+ if options.has_key? :state
185
+ self.state = options[:state]
186
+ else
187
+ self.state = 'visible'
188
+ end
189
+
190
+ if options.has_key? :parent
191
+ if options[:parent]
192
+ self.parent = options[:parent]
193
+ else
194
+ self.parent = ''
195
+ end
196
+ else
197
+ self.parent = ''
198
+ end
199
+ end
200
+
201
+ ##
202
+ # Generates hash representation of output class
203
+ # @return [Hash] hash representation of all data
204
+ def to_h
205
+ {
206
+ mode: self.mode,
207
+ title: self.title,
208
+ page_title: self.page_title,
209
+ short_title: self.short_title,
210
+ position: self.position,
211
+ tab: self.tab,
212
+ action: self.action,
213
+ access: self.access,
214
+ state:self.state,
215
+ parent: self.parent
216
+ }
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,43 @@
1
+ module Anubis
2
+ module Output
3
+ ##
4
+ # Output subclass that represents data for update or create action
5
+ class Update < Basic
6
+ # @!attribute [rw]
7
+ # @return [Hash] the hash of defined fields.
8
+ class_attribute :values, default: {}
9
+
10
+ # @!attribute [rw]
11
+ # @return [Array<String>] hash of errors
12
+ class_attribute :errors, default: []
13
+
14
+ # @!attribute [rw]
15
+ # @return [String] resulting post action
16
+ class_attribute :action, default: ''
17
+
18
+ ##
19
+ # Initializes menu output data. Generates default values.
20
+ def initialize
21
+ super
22
+ self.values = {}
23
+ self.errors = []
24
+ self.action = ''
25
+ self.messages[:'-3'] = I18n.t('errors.update_error')
26
+ end
27
+
28
+ ##
29
+ # Generates hash representation of output class
30
+ # @return [Hash] hash representation of all data
31
+ def to_h
32
+ result = super.to_h
33
+ result[:errors] = self.errors if self.errors.length > 0
34
+ return result if self.result != 0
35
+ result.merge!({
36
+ values: self.values,
37
+ action: self.action
38
+ })
39
+ result
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,139 @@
1
+ class Anubis::Sso::Client::ApplicationController < Anubis::Core::ApplicationController
2
+
3
+ def sso_server
4
+ Rails.configuration.sso_server
5
+ end
6
+
7
+ def sso_system_uuid
8
+ Rails.configuration.sso_system_uuid
9
+ end
10
+
11
+ def sso_system_secret
12
+ Rails.configuration.sso_system_secret
13
+ end
14
+
15
+ def user_model
16
+ begin
17
+ model = Rails.configuration.user_model.classify.constantize
18
+ rescue
19
+ model = Anubis::Sso::Server::User
20
+ end
21
+
22
+ model
23
+ end
24
+
25
+ def authentication
26
+ if !self.token
27
+ self.error_exit({ error: I18n.t('errors.authentication_required') })
28
+ return false
29
+ end
30
+
31
+ session = self.redis.get(self.redis_prefix + 'session:' + self.token)
32
+
33
+ if !session
34
+ session = self.get_session_from_sso_server self.token
35
+ else
36
+ session = JSON.parse(session,{ symbolize_names: true })
37
+ end
38
+
39
+ if !session
40
+ self.error_exit({ error: I18n.t('errors.authentication_required') })
41
+ return false
42
+ end
43
+
44
+ if session[:update].to_datetime + 300.seconds < Time.now
45
+ session = self.get_session_from_sso_server self.token
46
+ end
47
+
48
+ if !session
49
+ self.redis.del self.redis_prefix + 'session:' + self.token
50
+ self.error_exit({ error: I18n.t('errors.authentication_required') })
51
+ return false
52
+ end
53
+
54
+ if session[:time].to_datetime + session[:timeout].to_f / 86400 < Time.now
55
+ self.redis.del self.redis_prefix + 'session:' + self.token
56
+ self.error_exit({ error: I18n.t('errors.authentication_required') })
57
+ return false
58
+ end
59
+
60
+ session[:time] = Time.now
61
+
62
+ self.redis.set(self.redis_prefix + 'session:' + self.token, session.to_json, ex: session[:timeout])
63
+
64
+ begin
65
+ self.current_user = self.user_model.new(self.user_model.load_cache(self.redis, session[:uuid]))
66
+ rescue
67
+ self.current_user = nil
68
+ end
69
+
70
+ true
71
+ end
72
+
73
+ def get_session_from_sso_server(session)
74
+ #require 'rest-client'
75
+
76
+ #session = JSON.parse(RestClient.get(self.sso_server + 'api/1/login/' + session + '?sso_system=' + self.sso_system_uuid + '&secret_key=' + self.sso_system_secret + '&locale=' + self.locale), { symbolize_names: true })
77
+ begin
78
+ ses_data = JSON.parse(RestClient.get(self.sso_server + 'api/1/login/' + session + '?sso_system=' + self.sso_system_uuid + '&secret_key=' + self.sso_system_secret + '&locale=' + self.locale), { symbolize_names: true })
79
+ rescue
80
+ return nil
81
+ end
82
+
83
+ return nil if ses_data[:result] != 0
84
+
85
+
86
+ user_data = self.get_user_data_by_uuid ses_data[:uuid], ses_data, true
87
+
88
+
89
+ return {
90
+ uuid: user_data.uuid,
91
+ login: ses_data[:login_time],
92
+ time: Time.now,
93
+ timeout: user_data.timeout,
94
+ update: Time.now
95
+ }
96
+ end
97
+
98
+ ##
99
+ # Returns user data by UUI
100
+ def get_user_data_by_uuid(uuid, sso_data = nil, force = false)
101
+ unless force
102
+ begin
103
+ user_data = self.user_model.new(JSON.parse(self.redis.get(self.redis_prefix + 'user:' + uuid), { symbolize_names: true }))
104
+ rescue
105
+ user_data = nil
106
+ end
107
+ end
108
+
109
+ unless user_data
110
+ user_data = self.user_model.find_or_create_by(uuid: uuid)
111
+
112
+ user_data.save_cache(sso_data) if user_data
113
+ end
114
+
115
+ user_data
116
+ end
117
+
118
+ ##
119
+ # Return access status for current user
120
+ def menu_access(controller, exit = true)
121
+ menu_access_status = 'not'
122
+
123
+ if self.current_user
124
+ if self.current_user.menus
125
+ if self.current_user.menus.key? controller.to_s.to_sym
126
+ menu_access_status = self.current_user.menus[controller.to_s.to_sym]
127
+ end
128
+ end
129
+ end
130
+
131
+ if menu_access_status == 'not'
132
+ self.error_exit({ error: I18n.t('errors.access_not_allowed') }) if exit
133
+ return false
134
+ end
135
+
136
+ self.writer = true if menu_access_status == 'write'
137
+ true
138
+ end
139
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Module presents all default actions for for {DataController}.
3
+ module Anubis::Sso::Client::Data::Actions
4
+ include Anubis::Core::Data::Actions
5
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Module presents all callbacks called in actions.
3
+ module Anubis::Sso::Client::Data::Callbacks
4
+ include Anubis::Core::Data::Callbacks
5
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Data conversion moule between database and human representation
3
+ module Anubis::Sso::Client::Data::Convert
4
+ include Anubis::Core::Data::Convert
5
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Module sets default parameters for {DataController}.
3
+ module Anubis::Sso::Client::Data::Defaults
4
+ include Anubis::Core::Data::Defaults
5
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Module gets system data for {DataController}
3
+ module Anubis::Sso::Client::Data::Get
4
+ include Anubis::Core::Data::Get
5
+ end
@@ -0,0 +1,26 @@
1
+ ##
2
+ # Module loads data from external sources for {Anubis::Sso::Client::DataController}
3
+ module Anubis::Sso::Client::Data::Load
4
+ include Anubis::Core::Data::Load
5
+
6
+ def load_menu_data
7
+ menu_json = self.redis.get(self.redis_prefix + 'menu:' + params[:controller])
8
+
9
+ unless menu_json
10
+ menu = Anubis::Sso::Client::Menu.where(mode: params[:controller], status: 'enabled').first
11
+ self.redis.set(self.redis_prefix + 'menu:'+ params[:controller], menu.to_json) if menu
12
+ else
13
+ menu = Anubis::Sso::Client::Menu.new(JSON.parse(menu_json, { :symbolize_names => true }))
14
+ end
15
+
16
+ if menu
17
+ self.etc.menu = Anubis::Etc::Menu.new menu
18
+
19
+ if self.writer
20
+ self.etc.menu.access = 'write'
21
+ else
22
+ self.etc.menu.access = 'read'
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Module sets system data for {DataController}
3
+ module Anubis::Sso::Client::Data::Set
4
+ include Anubis::Core::Data::Set
5
+ end
@@ -0,0 +1,5 @@
1
+ ##
2
+ # Module setups system parameters for {DataController}
3
+ module Anubis::Sso::Client::Data::Setup
4
+ include Anubis::Core::Data::Setup
5
+ end
@@ -0,0 +1,21 @@
1
+ require_dependency "anubis/sso/client/application_controller"
2
+ require_dependency "anubis/sso/client/data/actions"
3
+ require_dependency "anubis/sso/client/data/load"
4
+ require_dependency "anubis/sso/client/data/get"
5
+ require_dependency "anubis/sso/client/data/set"
6
+ require_dependency "anubis/sso/client/data/setup"
7
+ require_dependency "anubis/sso/client/data/defaults"
8
+ require_dependency "anubis/sso/client/data/convert"
9
+ require_dependency "anubis/sso/client/data/callbacks"
10
+
11
+ # Controller consists all procedures and function for presents and modify models data.
12
+ class Anubis::Sso::Client::DataController < Anubis::Sso::Client::ApplicationController
13
+ include Anubis::Sso::Client::Data::Actions
14
+ include Anubis::Sso::Client::Data::Load
15
+ include Anubis::Sso::Client::Data::Get
16
+ include Anubis::Sso::Client::Data::Set
17
+ include Anubis::Sso::Client::Data::Setup
18
+ include Anubis::Sso::Client::Data::Defaults
19
+ include Anubis::Sso::Client::Data::Convert
20
+ include Anubis::Sso::Client::Data::Callbacks
21
+ end
@@ -0,0 +1,79 @@
1
+ module Anubis::Sso::Client::Index::Actions
2
+ def menu
3
+ self.output = Anubis::Output::Menu.new
4
+
5
+ if self.current_user
6
+ self.output.user = {
7
+ name: self.current_user.name,
8
+ surname: self.current_user.surname,
9
+ locale: self.current_user.locale
10
+ }
11
+ end
12
+
13
+ access = Anubis::Sso::Client::GroupMenu.accesses[:read].to_s+','+Anubis::Sso::Client::GroupMenu.accesses[:write].to_s
14
+ query = <<-SQL
15
+ SELECT `t`.* FROM
16
+ (
17
+ SELECT `t2`.`id`, `t2`.`mode`, `t2`.`action`, `t2`.`title_locale`, `t2`.`page_title_locale`, `t2`.`short_title_locale`,
18
+ `t2`.`position`, `t2`.`tab`, `t2`.`menu_id`, `t2`.`state`, MAX(`t2`.`access`) AS `access`,
19
+ `t2`.`user_id`, `t2`.`parent_mode`
20
+ FROM (
21
+ SELECT `menus`.`id`, `menus`.`id` AS `menu_id`, `menus`.`mode`, `menus`.`action`, `menus`.`title_locale`, `menus`.`page_title_locale`,
22
+ `menus`.`short_title_locale`, `menus`.`position`, `menus`.`tab`, `menus`.`menu_id` AS `parent_menu_id`, `menus`.`state`,
23
+ `group_menus`.`access`, `user_groups`.`user_id`, `parent_menu`.`mode` AS `parent_mode`
24
+ FROM (`menus`, `group_menus`, `groups`, `user_groups`)
25
+ LEFT JOIN `menus` AS `parent_menu` ON `menus`.`menu_id` = `parent_menu`.`id`
26
+ WHERE `menus`.`id` = `group_menus`.`menu_id` AND `menus`.`status` = 0 AND `group_menus`.`group_id` = `groups`.`id` AND
27
+ `groups`.`id` = `user_groups`.`group_id` AND `user_groups`.`user_id` = #{self.current_user.id}
28
+ ) AS `t2`
29
+ GROUP BY `t2`.`id`, `t2`.`mode`, `t2`.`action`, `t2`.`title_locale`, `t2`.`page_title_locale`, `t2`.`short_title_locale`,
30
+ `t2`.`position`, `t2`.`tab`, `t2`.`menu_id`, `t2`.`state`, `t2`.`user_id`, `t2`.`parent_mode`) AS `t`
31
+ WHERE `t`.access IN (#{access}
32
+ )
33
+ ORDER BY `t`.`menu_id`, `t`.`position`
34
+ SQL
35
+ Anubis::Sso::Client::GroupMenu.find_by_sql(query).each do |data|
36
+ self.output.addElement({
37
+ mode: data.mode,
38
+ title: data.title,
39
+ page_title: data.page_title,
40
+ short_title: data.short_title,
41
+ position: data.position,
42
+ tab: data.tab,
43
+ action: data.action,
44
+ access: data.access,
45
+ state: Anubis::Sso::Client::Menu.states.invert[data.state],
46
+ parent: data.parent_mode
47
+ })
48
+ #self.output[:data].push menu_id[data.id.to_s.to_sym]
49
+ end
50
+
51
+ self.before_menu_output
52
+
53
+ respond_to do |format|
54
+ format.json { render json: around_menu_output(self.output.to_h) }
55
+ end
56
+ end
57
+
58
+ def logout
59
+ self.output = Anubis::Output::Basic.new
60
+ self.output.result = 0
61
+
62
+ begin
63
+ RestClient.delete self.sso_server + 'api/1/login/' + self.token + '?sso_system=' + self.sso_system_uuid + '&secret_key=' + self.sso_system_secret
64
+ result = true
65
+ rescue
66
+ result = false
67
+ end
68
+
69
+ if result
70
+ self.redis.del self.redis_prefix + 'session:' + self.token
71
+ else
72
+ self.output.result = -1
73
+ end
74
+
75
+ respond_to do |format|
76
+ format.json { render json: around_menu_output(self.output.to_h) }
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,13 @@
1
+ module Anubis::Sso::Client::Index::Callbacks
2
+ ##
3
+ # Calls before menu output data.
4
+ def before_menu_output
5
+
6
+ end
7
+
8
+ ##
9
+ # Calls when menu data is being output
10
+ def around_menu_output(data)
11
+ data
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require_dependency "anubis/sso/client/index/actions"
2
+ require_dependency "anubis/sso/client/index/callbacks"
3
+
4
+ class Anubis::Sso::Client::IndexController < Anubis::Sso::Client::ApplicationController
5
+ include Anubis::Sso::Client::Index::Actions
6
+ include Anubis::Sso::Client::Index::Callbacks
7
+
8
+ ##
9
+ # Check if authentication required
10
+ def check_menu_access?
11
+ if controller_name == 'index'
12
+ if action_name == 'login' || action_name == 'menu' || action_name == 'logout'
13
+ return false
14
+ end
15
+ end
16
+ return true
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ class Anubis::Sso::Server::ApplicationController < Anubis::Core::ApplicationController
2
+ def user_model
3
+ begin
4
+ model = Rails.configuration.user_model.classify.constantize
5
+ rescue
6
+ model = Anubis::Sso::Server::User
7
+ end
8
+
9
+ model
10
+ end
11
+
12
+ def front_url
13
+ Rails.configuration.sso_front_url
14
+ end
15
+
16
+ def domain_url
17
+ Rails.configuration.sso_domain_url
18
+ end
19
+
20
+ ##
21
+ # Returns user data by UUI
22
+ def get_user_data_by_uuid(uuid)
23
+ begin
24
+ user_data = self.user_model.new(JSON.parse(self.redis.get(self.redis_prefix + 'user:' + uuid), { symbolize_names: true }))
25
+ rescue
26
+ user_data = nil
27
+ end
28
+
29
+ unless user_data
30
+ user_data = self.user_model.where(uuid: uuid, status: 'enabled').first
31
+
32
+ user_data.save_cache if user_data
33
+ end
34
+
35
+ user_data
36
+ end
37
+
38
+ ##
39
+ # Format user information to result hash
40
+ def format_user_output(user_data, result)
41
+ result[:uuid] = user_data.uuid
42
+ result[:name] = user_data.name
43
+ result[:surname] = user_data.surname
44
+ result[:login] = user_data.login
45
+ result[:locale] = user_data.locale
46
+ result[:timezone] = user_data.timezone
47
+ result[:timeout] = user_data.timeout
48
+ end
49
+ end