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.
- 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
|