anoubis 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +38 -0
- data/app/controllers/anoubis/application_controller.rb +78 -0
- data/app/controllers/anoubis/core/application_controller.rb +343 -0
- data/app/controllers/anoubis/core/data/actions.rb +962 -0
- data/app/controllers/anoubis/core/data/callbacks.rb +68 -0
- data/app/controllers/anoubis/core/data/convert.rb +407 -0
- data/app/controllers/anoubis/core/data/defaults.rb +217 -0
- data/app/controllers/anoubis/core/data/get.rb +531 -0
- data/app/controllers/anoubis/core/data/load.rb +89 -0
- data/app/controllers/anoubis/core/data/set.rb +49 -0
- data/app/controllers/anoubis/core/data/setup.rb +104 -0
- data/app/controllers/anoubis/core/data_controller.rb +28 -0
- data/app/controllers/anoubis/core/index/actions.rb +53 -0
- data/app/controllers/anoubis/core/index/callbacks.rb +23 -0
- data/app/controllers/anoubis/core/index_controller.rb +36 -0
- data/app/controllers/anoubis/etc/base.rb +52 -0
- data/app/controllers/anoubis/etc/data.rb +89 -0
- data/app/controllers/anoubis/etc/field.rb +468 -0
- data/app/controllers/anoubis/etc/field_options.rb +83 -0
- data/app/controllers/anoubis/etc/field_order.rb +51 -0
- data/app/controllers/anoubis/etc/filter.rb +251 -0
- data/app/controllers/anoubis/etc/menu.rb +101 -0
- data/app/controllers/anoubis/etc/model.rb +67 -0
- data/app/controllers/anoubis/etc/tab_item.rb +91 -0
- data/app/controllers/anoubis/etc.rb +8 -0
- data/app/controllers/anoubis/export.rb +47 -0
- data/app/controllers/anoubis/output/autocomplete.rb +30 -0
- data/app/controllers/anoubis/output/basic.rb +86 -0
- data/app/controllers/anoubis/output/data.rb +101 -0
- data/app/controllers/anoubis/output/delete.rb +41 -0
- data/app/controllers/anoubis/output/edit.rb +55 -0
- data/app/controllers/anoubis/output/frame.rb +227 -0
- data/app/controllers/anoubis/output/login.rb +71 -0
- data/app/controllers/anoubis/output/menu.rb +220 -0
- data/app/controllers/anoubis/output/update.rb +43 -0
- data/app/controllers/anoubis/sso/client/application_controller.rb +139 -0
- data/app/controllers/anoubis/sso/client/data/actions.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/callbacks.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/convert.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/defaults.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/get.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/load.rb +26 -0
- data/app/controllers/anoubis/sso/client/data/set.rb +5 -0
- data/app/controllers/anoubis/sso/client/data/setup.rb +5 -0
- data/app/controllers/anoubis/sso/client/data_controller.rb +21 -0
- data/app/controllers/anoubis/sso/client/index/actions.rb +79 -0
- data/app/controllers/anoubis/sso/client/index/callbacks.rb +13 -0
- data/app/controllers/anoubis/sso/client/index_controller.rb +18 -0
- data/app/controllers/anoubis/sso/server/application_controller.rb +49 -0
- data/app/controllers/anoubis/sso/server/login_controller.rb +342 -0
- data/app/controllers/anoubis/sso/server/user_controller.rb +142 -0
- data/app/controllers/anoubis/tenant/application_controller.rb +54 -0
- data/app/controllers/anoubis/tenant/data/actions.rb +11 -0
- data/app/controllers/anoubis/tenant/data/callbacks.rb +11 -0
- data/app/controllers/anoubis/tenant/data/convert.rb +11 -0
- data/app/controllers/anoubis/tenant/data/defaults.rb +11 -0
- data/app/controllers/anoubis/tenant/data/get.rb +11 -0
- data/app/controllers/anoubis/tenant/data/load.rb +52 -0
- data/app/controllers/anoubis/tenant/data/set.rb +11 -0
- data/app/controllers/anoubis/tenant/data/setup.rb +11 -0
- data/app/controllers/anoubis/tenant/data_controller.rb +28 -0
- data/app/controllers/anoubis/tenant/index/actions.rb +191 -0
- data/app/controllers/anoubis/tenant/index/callbacks.rb +11 -0
- data/app/controllers/anoubis/tenant/index_controller.rb +38 -0
- data/app/controllers/anoubis/tenants_controller.rb +7 -0
- data/app/controllers/anoubis/users_controller.rb +7 -0
- data/app/jobs/anoubis/application_job.rb +6 -0
- data/app/mailers/anoubis/application_mailer.rb +8 -0
- data/app/models/anoubis/application_record.rb +45 -0
- data/app/models/anoubis/core/application_record.rb +250 -0
- data/app/models/anoubis/core/locales.rb +27 -0
- data/app/models/anoubis/sso/client/application_record.rb +3 -0
- data/app/models/anoubis/sso/client/group.rb +19 -0
- data/app/models/anoubis/sso/client/group_menu.rb +109 -0
- data/app/models/anoubis/sso/client/menu.rb +145 -0
- data/app/models/anoubis/sso/client/user.rb +81 -0
- data/app/models/anoubis/sso/client/user_group.rb +32 -0
- data/app/models/anoubis/sso/server/system.rb +36 -0
- data/app/models/anoubis/sso/server/user.rb +79 -0
- data/app/models/anoubis/tenant/application_record.rb +41 -0
- data/app/models/anoubis/tenant/group.rb +95 -0
- data/app/models/anoubis/tenant/group_locale.rb +19 -0
- data/app/models/anoubis/tenant/group_menu.rb +84 -0
- data/app/models/anoubis/tenant/menu.rb +156 -0
- data/app/models/anoubis/tenant/menu_locale.rb +27 -0
- data/app/models/anoubis/tenant/system.rb +127 -0
- data/app/models/anoubis/tenant/system_locale.rb +19 -0
- data/app/models/anoubis/tenant/system_menu.rb +51 -0
- data/app/models/anoubis/tenant/tenant.rb +107 -0
- data/app/models/anoubis/tenant/tenant_system.rb +19 -0
- data/app/models/anoubis/tenant/user.rb +225 -0
- data/app/models/anoubis/tenant/user_group.rb +32 -0
- data/app/services/anoubis/core_service.rb +16 -0
- data/app/services/anoubis/session_service.rb +17 -0
- data/app/validators/presence_in_tenant_validator.rb +20 -0
- data/config/initializers/mime_type.rb +1 -0
- data/config/locales/en.yml +120 -0
- data/config/locales/ru.yml +245 -0
- data/config/routes.rb +74 -0
- data/db/migrate/20181018085843_create_tenants.rb +13 -0
- data/db/migrate/20181018111217_create_systems.rb +10 -0
- data/db/migrate/20181018111713_create_tenant_systems.rb +11 -0
- data/db/migrate/20181018111925_create_groups.rb +13 -0
- data/db/migrate/20181018112151_create_users.rb +25 -0
- data/db/migrate/20181018115737_add_title_to_users.rb +10 -0
- data/db/migrate/20181022060211_create_menus.rb +18 -0
- data/db/migrate/20181115055245_create_group_menus.rb +12 -0
- data/db/migrate/20181115060830_create_system_menus.rb +11 -0
- data/db/migrate/20181122062131_create_user_groups.rb +11 -0
- data/db/migrate/20181221060727_create_menu_locales.rb +14 -0
- data/db/migrate/20181225062303_create_system_locales.rb +11 -0
- data/db/migrate/20181225062339_create_group_locales.rb +11 -0
- data/db/seeds.rb +268 -0
- data/lib/anoubis/engine.rb +13 -0
- data/lib/anoubis/version.rb +5 -0
- data/lib/anoubis.rb +213 -0
- data/lib/tasks/anubis_tasks.rake +10 -0
- data/lib/tasks/sessions/clear_sessions.rake +10 -0
- data/spec/anubis_spec.rb +5 -0
- data/spec/controllers/anoubis/index_controller_spec.rb +77 -0
- data/spec/dummy/Rakefile +3 -0
- data/spec/dummy/app/assets/config/manifest.js +2 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +33 -0
- data/spec/dummy/bin/update +28 -0
- data/spec/dummy/config/application.rb +14 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/spec/dummy/config/database.yml +54 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +85 -0
- data/spec/dummy/config/environments/test.rb +46 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cors.rb +16 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +33 -0
- data/spec/dummy/config/puma.rb +34 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config/storage.yml +34 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/db/schema.rb +167 -0
- data/spec/dummy/db/seeds.rb +1 -0
- data/spec/factories/anubis_group_locales.rb +7 -0
- data/spec/factories/anubis_group_menus.rb +7 -0
- data/spec/factories/anubis_groups.rb +6 -0
- data/spec/factories/anubis_menu_locales.rb +9 -0
- data/spec/factories/anubis_menus.rb +6 -0
- data/spec/factories/anubis_system_locales.rb +7 -0
- data/spec/factories/anubis_system_menus.rb +6 -0
- data/spec/factories/anubis_systems.rb +5 -0
- data/spec/factories/anubis_tenants.rb +7 -0
- data/spec/factories/anubis_users.rb +10 -0
- data/spec/integration/navigation_test.rb +7 -0
- data/spec/models/anoubis/group_locale_spec.rb +25 -0
- data/spec/models/anoubis/group_menu_spec.rb +50 -0
- data/spec/models/anoubis/group_spec.rb +52 -0
- data/spec/models/anoubis/menu_locale_spec.rb +31 -0
- data/spec/models/anoubis/menu_spec.rb +48 -0
- data/spec/models/anoubis/system_locale_spec.rb +20 -0
- data/spec/models/anoubis/system_menu_spec.rb +49 -0
- data/spec/models/anoubis/system_spec.rb +53 -0
- data/spec/models/anoubis/tenant_spec.rb +67 -0
- data/spec/models/anoubis/user_spec.rb +57 -0
- data/spec/rails_helper.rb +32 -0
- data/spec/requests/anoubis/users_request_spec.rb +5 -0
- data/spec/spec_helper.rb +13 -0
- metadata +408 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c2ef6417845dbb20f56a6bb3bdd5e304b442f681928f9f64765d68d1bf5f4c57
|
4
|
+
data.tar.gz: d2a87698442e6d1807ae9ed3104a706053f45654f80da248db873bc7a0a16a80
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9bba0811a68af029fbe976c8369372e7026d328386895892c9300d2e5f4f448863f3e5fb54e123d2987e1d214620cde0d7fa9d43244a64ab7438110949e91ad0
|
7
|
+
data.tar.gz: a588b8aff9758aa25f20e709ceb2f86d72090a3d281b7cdb71ad97ac93fe9d771414b09daa571e7511c2049e723b8a32e92d894dc8c4cd4ec29c3af1eaecb470
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2018 Andrey Ryabov
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Anoubis
|
2
|
+
Short description and motivation.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
How to use my plugin.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'anoubis'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
```bash
|
21
|
+
$ gem install anoubis
|
22
|
+
```
|
23
|
+
|
24
|
+
## Contributing
|
25
|
+
Contribution directions go here.
|
26
|
+
|
27
|
+
## License
|
28
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Anoubis'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
load 'rails/tasks/statistics.rake'
|
21
|
+
|
22
|
+
require 'bundler/gem_tasks'
|
23
|
+
|
24
|
+
desc "Run all specs in spec directory (excluding plugin specs)"
|
25
|
+
#RSpec::Core::RakeTask.new(:spec => 'app:db:migrate')
|
26
|
+
#RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
|
27
|
+
|
28
|
+
#task :default => :spec
|
29
|
+
|
30
|
+
#require 'rake/testtask'
|
31
|
+
|
32
|
+
#Rake::TestTask.new(:test) do |t|
|
33
|
+
# t.libs << 'test'
|
34
|
+
# t.pattern = 'test/**/*_test.rb'
|
35
|
+
# t.verbose = false
|
36
|
+
#end
|
37
|
+
|
38
|
+
#task default: :test
|
@@ -0,0 +1,78 @@
|
|
1
|
+
## Main application controller class inherited from {https://api.rubyonrails.org/v6.1.4/classes/ActionController/API.html ActionController::API}
|
2
|
+
class Anoubis::ApplicationController < ActionController::API
|
3
|
+
prepend_before_action :pba_anoubis_application
|
4
|
+
|
5
|
+
include ActionController::Cookies
|
6
|
+
|
7
|
+
## Redis database variable
|
8
|
+
attr_accessor :redis
|
9
|
+
|
10
|
+
## Current used locale
|
11
|
+
attr_accessor :locale
|
12
|
+
|
13
|
+
##
|
14
|
+
# Returns default locale initialized in application configuration file. Variable is taken from {https://guides.rubyonrails.org/i18n.html Rails.configuration.i18n.default_locale} parameter
|
15
|
+
# @return [String] default locale
|
16
|
+
def default_locale
|
17
|
+
Rails.configuration.i18n.default_locale.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
## Returns {https://github.com/redis/redis-rb Redis} prefix for storing cache data
|
21
|
+
attr_accessor :redis_prefix
|
22
|
+
|
23
|
+
##
|
24
|
+
# Returns {https://github.com/redis/redis-rb Redis database} class
|
25
|
+
# @return [Class] {https://github.com/redis/redis-rb Redis} class reference
|
26
|
+
def redis
|
27
|
+
@redis ||= Redis.new
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Returns {https://github.com/redis/redis-rb Redis} prefix for storing cache data. Prefix can be set in Rails.configuration.anoubis_redis_prefix configuration parameter.
|
32
|
+
# @return [String] {https://github.com/redis/redis-rb Redis} prefix
|
33
|
+
def redis_prefix
|
34
|
+
@redis_prefix ||= get_redis_prefix
|
35
|
+
end
|
36
|
+
|
37
|
+
private def get_redis_prefix
|
38
|
+
begin
|
39
|
+
value = Rails.configuration.anoubis_redis_prefix
|
40
|
+
rescue
|
41
|
+
return ''
|
42
|
+
end
|
43
|
+
|
44
|
+
value + ':'
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Procedure fires before any action and setup default variables.
|
49
|
+
def pba_anoubis_application
|
50
|
+
self.locale = params[:locale] if params.has_key? :locale
|
51
|
+
self.locale = default_locale unless self.locale
|
52
|
+
self.locale = default_locale if self.locale == ''
|
53
|
+
begin
|
54
|
+
I18n.locale = locale
|
55
|
+
rescue
|
56
|
+
I18n.locale = default_locale
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Generates options headers for CORS requests
|
62
|
+
# @param methods [String] list of allowed HTTP actions separated by space <i>(e.g. 'GET POST DELETE')</i>
|
63
|
+
def options(methods = 'POST')
|
64
|
+
if check_origin
|
65
|
+
headers['Access-Control-Allow-Origin'] = request.headers['origin']
|
66
|
+
headers['Access-Control-Allow-Methods'] = methods
|
67
|
+
headers['Access-Control-Max-Age'] = '1000'
|
68
|
+
headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,Authorization'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Check current origin of header. By default origin always valid
|
74
|
+
# @return [Boolean] request host origin validation
|
75
|
+
def check_origin
|
76
|
+
true
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,343 @@
|
|
1
|
+
##
|
2
|
+
# Application controller for Anubis library.
|
3
|
+
class Anubis::Core::ApplicationController < ActionController::API
|
4
|
+
prepend_before_action :anubis_core_initialization
|
5
|
+
|
6
|
+
#include AbstractController::Translation
|
7
|
+
include ActionController::MimeResponds
|
8
|
+
#include ActionController::Parameters
|
9
|
+
#include ActionDispatch::Http::Parameters
|
10
|
+
#include ActionDispatch::Request
|
11
|
+
|
12
|
+
# @!attribute [rw] version
|
13
|
+
# @return [Integer] Specifies the api version. Parameters receive from URL <i>(defaults to: 0)</i>.
|
14
|
+
attr_accessor :version
|
15
|
+
|
16
|
+
# @!attribute [rw] locale
|
17
|
+
# @return [String] Specifies the current language locale <i>(defaults to: 'ru')</i>.
|
18
|
+
# Parameters receive from URL or user definition
|
19
|
+
attr_accessor :locale
|
20
|
+
|
21
|
+
# @!attribute [rw] current_user
|
22
|
+
# @return [ActiveRecord] Specifies current user <i>(defaults to: nil)</i>.
|
23
|
+
attr_accessor :current_user
|
24
|
+
|
25
|
+
# @!attribute [rw] output
|
26
|
+
# @return [Anubis::Output] standard output.
|
27
|
+
attr_accessor :output
|
28
|
+
|
29
|
+
# @!attribute [rw] writer
|
30
|
+
# @return [Object] Specifies access of current user to this controller <i>(defaults to: false)</i>.
|
31
|
+
attr_accessor :writer
|
32
|
+
|
33
|
+
# @!attribute [rw] etc
|
34
|
+
# @return [Anubis::Etc::Base] global system parameters
|
35
|
+
attr_accessor :etc
|
36
|
+
|
37
|
+
# @!attribute [rw] exports
|
38
|
+
# @return [Anubis::Export] Export data class
|
39
|
+
attr_accessor :exports
|
40
|
+
|
41
|
+
##
|
42
|
+
# Returns redis database class
|
43
|
+
def redis
|
44
|
+
@redis ||= Redis.new
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Sets default parameters for application controller.
|
49
|
+
def anubis_core_initialization
|
50
|
+
self.version = 0
|
51
|
+
|
52
|
+
if defined? params
|
53
|
+
self.etc = Anubis::Etc::Base.new({ params: params })
|
54
|
+
else
|
55
|
+
self.etc = Anubis::Etc::Base.new
|
56
|
+
end
|
57
|
+
self.output = nil
|
58
|
+
self.exports = nil
|
59
|
+
self.writer = false
|
60
|
+
|
61
|
+
self.current_user = nil
|
62
|
+
self.locale = params[:locale] if params.has_key? :locale
|
63
|
+
self.locale = 'ru' unless self.locale
|
64
|
+
self.locale = 'ru' if self.locale == ''
|
65
|
+
begin
|
66
|
+
I18n.locale = self.locale
|
67
|
+
rescue
|
68
|
+
I18n.locale = 'ru'
|
69
|
+
end
|
70
|
+
|
71
|
+
return if request.method == 'OPTIONS'
|
72
|
+
|
73
|
+
if !params.has_key? :version
|
74
|
+
self.error_exit({ error: I18n.t('errors.no_api_version') })
|
75
|
+
return
|
76
|
+
end
|
77
|
+
|
78
|
+
if self.access_allowed?
|
79
|
+
self.set_access_control_headers
|
80
|
+
else
|
81
|
+
self.error_exit({ error: I18n.t('errors.access_not_allowed') })
|
82
|
+
end
|
83
|
+
|
84
|
+
self.version = params[:version]
|
85
|
+
|
86
|
+
if self.authenticate?
|
87
|
+
if self.authentication
|
88
|
+
if self.check_menu_access?
|
89
|
+
return if !self.menu_access params[:controller]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
#self.user_time_zone if self.current_user
|
95
|
+
Time.zone = self.current_user.timezone if self.current_user
|
96
|
+
self.after_initialization
|
97
|
+
end
|
98
|
+
|
99
|
+
##
|
100
|
+
# Calls after first controller initialization
|
101
|
+
def after_initialization
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
##
|
107
|
+
# Gracefully terminate script execution with code 422 (Unprocessable entity). And JSON data
|
108
|
+
# @param data [Hash] Resulting data
|
109
|
+
# @option data [Integer] :code resulting error code
|
110
|
+
# @option data [String] :error resulting error message
|
111
|
+
def error_exit(data)
|
112
|
+
result = {
|
113
|
+
result: -1,
|
114
|
+
message: 'Error'
|
115
|
+
}
|
116
|
+
result[:result] = data[:code] if data.has_key? :code
|
117
|
+
result[:message] = data[:error] if data.has_key? :error
|
118
|
+
respond_to do |format|
|
119
|
+
format.json { render json: result, status: :unprocessable_entity }
|
120
|
+
end
|
121
|
+
begin
|
122
|
+
exit
|
123
|
+
rescue SystemExit => e
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
##
|
129
|
+
# Get current user model
|
130
|
+
# @return [ActiveRecord] defined user model. It is used for get current user data. May be redefined when user model is changed
|
131
|
+
def get_user_model
|
132
|
+
nil
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Get current user model filed json exception
|
137
|
+
# @return [Array] defined user exception for to_json function
|
138
|
+
def get_user_model_except
|
139
|
+
[]
|
140
|
+
end
|
141
|
+
|
142
|
+
##
|
143
|
+
# @!group Block of authorization
|
144
|
+
|
145
|
+
##
|
146
|
+
# Checks if needed user authentication.
|
147
|
+
# @return [Boolean] if true, then user must be authenticated.
|
148
|
+
def authenticate?
|
149
|
+
return true
|
150
|
+
end
|
151
|
+
|
152
|
+
##
|
153
|
+
# Authenticates user in the system
|
154
|
+
def authentication
|
155
|
+
if !self.token
|
156
|
+
self.error_exit({ error: I18n.t('errors.authentication_required') })
|
157
|
+
return false
|
158
|
+
end
|
159
|
+
|
160
|
+
# Check session presence
|
161
|
+
session = self.redis.get(self.redis_prefix + 'session:' + self.token)
|
162
|
+
if !session
|
163
|
+
self.error_exit({ error: I18n.t('errors.session_expired') })
|
164
|
+
return false
|
165
|
+
end
|
166
|
+
|
167
|
+
session = JSON.parse(session, { symbolize_names: true })
|
168
|
+
|
169
|
+
if !session.has_key?(:uuid) || !session.has_key?(:ttl)
|
170
|
+
self.error_exit({ error: I18n.t('errors.session_expired') })
|
171
|
+
return false
|
172
|
+
end
|
173
|
+
|
174
|
+
if session[:ttl] < Time.now
|
175
|
+
self.error_exit({ error: I18n.t('errors.session_expired') })
|
176
|
+
self.redis.del(self.redis_prefix + 'session:' + self.token)
|
177
|
+
return false
|
178
|
+
end
|
179
|
+
|
180
|
+
# Load user data from redis database
|
181
|
+
user_json = self.redis.get(self.redis_prefix + 'user:' + session[:uuid])
|
182
|
+
if !user_json
|
183
|
+
# Check user presence based on session user UUID
|
184
|
+
user = self.get_user_model.where(uuid_bin: self.uuid_to_bin(session[:uuid])).first
|
185
|
+
if !user
|
186
|
+
self.error_exit({ error: I18n.t('errors.authentication_required') })
|
187
|
+
return false
|
188
|
+
end
|
189
|
+
user_json = self.redis_save_user user
|
190
|
+
end
|
191
|
+
|
192
|
+
begin
|
193
|
+
self.current_user = self.get_user_model.new(JSON.parse(user_json,{ symbolize_names: true }))
|
194
|
+
rescue
|
195
|
+
self.current_user = nil
|
196
|
+
end
|
197
|
+
|
198
|
+
if !self.current_user
|
199
|
+
self.error_exit({ error: I18n.t('errors.authentication_required') })
|
200
|
+
return false
|
201
|
+
end
|
202
|
+
|
203
|
+
session[:time] = Time.now
|
204
|
+
session[:ttl] = session[:time] + self.current_user.timeout
|
205
|
+
self.redis.set(self.redis_prefix + 'session:' + self.token, session.to_json)
|
206
|
+
|
207
|
+
true
|
208
|
+
end
|
209
|
+
|
210
|
+
##
|
211
|
+
# Checks user must have access for current controller.
|
212
|
+
# @return [Boolean] if true, then user must have access for this controller.
|
213
|
+
def check_menu_access?
|
214
|
+
true
|
215
|
+
end
|
216
|
+
|
217
|
+
##
|
218
|
+
# Check menu access for current user of current controller
|
219
|
+
# @return [Boolean] if true, then user have access for this controller.
|
220
|
+
def menu_access(controller, exit = true)
|
221
|
+
self.writer = true
|
222
|
+
|
223
|
+
true
|
224
|
+
end
|
225
|
+
|
226
|
+
##
|
227
|
+
# Get current token based on HTTP Authorization
|
228
|
+
# @return [String] current token
|
229
|
+
def token
|
230
|
+
if Rails.env.development?
|
231
|
+
return params[:token] if params[:token]
|
232
|
+
end
|
233
|
+
request.env.fetch('HTTP_AUTHORIZATION', '').scan(/Bearer (.*)$/).flatten.last
|
234
|
+
end
|
235
|
+
|
236
|
+
# @!endgroup
|
237
|
+
|
238
|
+
##
|
239
|
+
# Check access for API.
|
240
|
+
# @return [Boolean] access for requested client
|
241
|
+
def access_allowed?
|
242
|
+
allowed_sites = [request.env['HTTP_ORIGIN']]
|
243
|
+
|
244
|
+
allowed_sites.include?(request.env['HTTP_ORIGIN'])
|
245
|
+
end
|
246
|
+
|
247
|
+
##
|
248
|
+
# Set allow header information for multi-domain requests. Requested for browsers when API is not in the same
|
249
|
+
# address as Frontend application.
|
250
|
+
def set_access_control_headers
|
251
|
+
headers['Access-Control-Allow-Origin'] = request.env['HTTP_ORIGIN']
|
252
|
+
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, DELETE, PUT, PATCH'
|
253
|
+
headers['Access-Control-Max-Age'] = '1000'
|
254
|
+
headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,Authorization'
|
255
|
+
end
|
256
|
+
|
257
|
+
##
|
258
|
+
# @!group Block of UUID functions
|
259
|
+
|
260
|
+
##
|
261
|
+
# Decodes binary UUID data into the UUID string
|
262
|
+
# @param data [Binary] binary representation of UUID
|
263
|
+
# @return [String, nil] string representation of UUID or nil if can't be decoded
|
264
|
+
def bin_to_uuid(data)
|
265
|
+
begin
|
266
|
+
data = data.unpack('H*')[0]
|
267
|
+
return data[0..7]+'-'+data[8..11]+'-'+data[12..15]+'-'+data[16..19]+'-'+data[20..31]
|
268
|
+
rescue
|
269
|
+
return nil
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
##
|
274
|
+
# Encodes string UUID data into the binary UUID
|
275
|
+
# @param data [Binary] string representation of UUID
|
276
|
+
# @return [Binary, nil] binary representation of UUID or nil if can't be encoded
|
277
|
+
def uuid_to_bin(data)
|
278
|
+
begin
|
279
|
+
return [data.delete('-')].pack('H*')
|
280
|
+
rescue
|
281
|
+
return nil
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
##
|
286
|
+
# Generates new UUID data
|
287
|
+
# @return [String] string representation of UUID
|
288
|
+
def new_uuid
|
289
|
+
SecureRandom.uuid
|
290
|
+
end
|
291
|
+
|
292
|
+
##
|
293
|
+
# Generates new session ID
|
294
|
+
# @return [string] string representation of session (64 bytes)
|
295
|
+
def new_session_id
|
296
|
+
SecureRandom.hex(32)
|
297
|
+
end
|
298
|
+
|
299
|
+
# @!endgroup
|
300
|
+
|
301
|
+
##
|
302
|
+
# Saves user data into redis database and returns user JSON representation
|
303
|
+
# @param user [ActiveRecord] current user data
|
304
|
+
# @return [String] JSON representation of user data
|
305
|
+
def redis_save_user(user)
|
306
|
+
user_json = user.to_json(except: self.get_user_model_except)
|
307
|
+
user_hash = JSON.parse user_json, { symbolize_names: true }
|
308
|
+
user_hash[:uuid] = user.uuid
|
309
|
+
user_json = user_hash.to_json
|
310
|
+
self.redis.set(self.redis_prefix + 'user:' + user.uuid, user_json)
|
311
|
+
|
312
|
+
user_json
|
313
|
+
end
|
314
|
+
|
315
|
+
##
|
316
|
+
# Returns defined application prefix for redis cache for controller. Default value ''
|
317
|
+
def redis_prefix
|
318
|
+
begin
|
319
|
+
value = Rails.configuration.redis_prefix
|
320
|
+
rescue
|
321
|
+
return ''
|
322
|
+
end
|
323
|
+
|
324
|
+
value + ':'
|
325
|
+
end
|
326
|
+
|
327
|
+
##
|
328
|
+
# Returns default defined locale
|
329
|
+
def default_locale
|
330
|
+
Rails.configuration.i18n.default_locale.to_s
|
331
|
+
end
|
332
|
+
|
333
|
+
##
|
334
|
+
# Default route for OPTIONS method
|
335
|
+
def options
|
336
|
+
if self.access_allowed?
|
337
|
+
self.set_access_control_headers
|
338
|
+
head :ok
|
339
|
+
else
|
340
|
+
head :forbidden
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|