virtuatable-core 1.2.2 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2c522c5694270544ff7aa08e434bc1af1978dbd4b8c5488eac48158e4ae18c7
4
- data.tar.gz: 8490c9d478c1cf2d2b505312bd8824ce67bc759fce490ea980517ac8ec4cf1df
3
+ metadata.gz: bb7485c8bb6e781dcf4b6d3299d3065769a4556e01421fba08eb2404a3d982a5
4
+ data.tar.gz: 281cce31ddad58a7ffb44e8fd78de1bdefdc5d5f1f2f6b53f8a89e9125e8792e
5
5
  SHA512:
6
- metadata.gz: 2dd843cd275f9f9d5b0ee563a500069fa0af65c0ea716ad470147b87acfa62b2d369e122b36080a976567dee381bf2a4625b27b4b17d9faa485315463d945fa8
7
- data.tar.gz: c0707af825058224eab8297cc92e370ed78be96ebe55876e99010c3a0603f3ea68f848e4f6171839a06a6241c36dcae7a4387cadb921f992f1a3dfc6116d38b6
6
+ metadata.gz: 2df4695bf1450c3c99cc3d86e5cee1cc91050275b6f54e40c587553376e93bd9752aac1683692a556c3265c16bab9fb06daa530b30645b3b4fdb6748a5e741ec
7
+ data.tar.gz: eee4af9a5591e1ef3fa5a7a5a1071791680a02af442df91bcfb03d5f4f63cc334ea6fe78edfbfb848a358af3d0df9327fb13429b0d104637e9622ae71c568d64
@@ -13,8 +13,9 @@ module Core
13
13
  # Includes the custom errors throwers and responses helpers.
14
14
  include Core::Helpers::Errors
15
15
  include Core::Helpers::Responses
16
- # Includes the checking methods for sessions.
17
- include Core::Helpers::Sessions
16
+ # Includes the checking methods for access tokens.
17
+ include Core::Helpers::Tokens
18
+ include Core::Helpers::Scopes
18
19
  # Include the checkers and getters for OAuth apps
19
20
  include Core::Helpers::Applications
20
21
  # Include checkers for field requirement and check
@@ -10,8 +10,8 @@ module Core
10
10
  def account
11
11
  return @account unless @account.nil?
12
12
 
13
- session_id_required if !respond_to?(:session) || session.nil?
14
- @account = session.account
13
+ @account = token.authorization.account
14
+ @account
15
15
  end
16
16
 
17
17
  def account_id_not_found
@@ -10,10 +10,10 @@ module Core
10
10
  def application(premium: false)
11
11
  return @application unless @application.nil?
12
12
 
13
- check_presence 'app_key'
14
- @application = application_model.find_by(key: params['app_key'])
15
- api_not_found 'app_key.unknown' if @application.nil?
16
- api_forbidden 'app_key.forbidden' if premium && !@application.premium
13
+ check_presence 'client_id'
14
+ @application = application_model.find_by(client_id: params['client_id'])
15
+ api_not_found 'client_id.unknown' if @application.nil?
16
+ api_forbidden 'client_id.forbidden' if premium && !@application.premium
17
17
 
18
18
  @application
19
19
  end
@@ -6,9 +6,6 @@ module Core
6
6
  # to declare routes whithin a service, performing needed checks and filters.
7
7
  # @author Vincent Courtois <courtois.vincent@outlook.com>
8
8
  module Declarators
9
- # @!attribute [r] routes
10
- # @return [Array<Core::Models::Permissions::Route>] the currently declared routes.
11
- attr_reader :api_routes
12
9
 
13
10
  # Main method to declare new routes, persisting them in the database and
14
11
  # declaring it in the Sinatra application with the needed before checks.
@@ -16,68 +13,15 @@ module Core
16
13
  # @param verb [String] the HTTP method for the route.
17
14
  # @param path [String] the whole URI with parameters for the route.
18
15
  # @param options [Hash] the additional options for the route.
19
- def api_route(verb, path, options: {}, &block)
20
- options = default_options.merge(options)
21
- route = add_route(verb: verb, path: path, options: options)
22
-
23
- # TODO : do everything in the #send itself to avoid
24
- # route reload issues when premium is changed. It will
25
- # add some treatments but avoid many problems if route.premium
26
- send(route.verb, route.path) do
27
- application(premium: current_route.premium)
28
- session if current_route.authenticated
16
+ def api_route(verb, path, premium: false, scopes: ['data::usage'], &block)
17
+ send(verb, path) do
18
+ scope_objects = fetch_scopes(scopes)
19
+ appli = application(premium: premium)
20
+ check_app_scopes(appli, scope_objects)
21
+ check_token_scopes(token, scope_objects)
29
22
  instance_eval(&block)
30
23
  end
31
24
  end
32
-
33
- # Add a route to the database, then to the routes array.
34
- # @param verb [String] the HTTP method used to request this route.
35
- # @param path [String] the path used to request this route.
36
- # @return [Core::Models::Permissions::Route] the created route.
37
- def add_route(verb:, path:, options:)
38
- route = Core::Models::Permissions::Route.find_or_create_by!(
39
- path: path,
40
- verb: verb.downcase,
41
- premium: options[:premium],
42
- authenticated: options[:authenticated]
43
- )
44
- api_routes.nil? ? @api_routes = [route] : push_route(route)
45
- add_permissions(route)
46
- route
47
- end
48
-
49
- # Pushes the route in the api routes list, by creating it if needed
50
- # @param route [Core::Models::Permissions::Route] the route to push in the list of routes.
51
- def push_route(route)
52
- @api_routes << route if api_routes.none? do |tmp_route|
53
- route.id == tmp_route.id
54
- end
55
- end
56
-
57
- # Add the default access permissions to a route. Any group tagged superuser
58
- # can automatically access any newly declared_route.
59
- # params route [Core::Models::Permissions::Route] the route to add the permissions to.
60
- def add_permissions(route)
61
- groups = Core::Models::Permissions::Group.where(is_superuser: true)
62
- groups.each do |group|
63
- unless route.groups.where(id: group.id).exists?
64
- route.groups << group
65
- route.save!
66
- end
67
- end
68
- end
69
-
70
- # The default options for a route, being the most used value for each key.
71
- # @return [Hash] the default options as a hash.
72
- def default_options
73
- {
74
- # If TRUE the application MUST be premium to access the route.
75
- # Mainly used to protect administration routes against illegal accesses.
76
- premium: false,
77
- # If TRUE the user MUST be authenticated to access the route.
78
- authenticated: true
79
- }
80
- end
81
25
  end
82
26
  end
83
27
  end
@@ -0,0 +1,22 @@
1
+ module Core
2
+ module Helpers
3
+ module Scopes
4
+
5
+ def fetch_scopes(names)
6
+ (names.map { |n| Core::Models::OAuth::Scope.find_by(name: n) }).select { |s| !s.nil? }
7
+ end
8
+
9
+ def check_token_scopes(token, scopes)
10
+ scopes.each do |scope|
11
+ api_forbidden 'scope.forbidden' if !token.scopes.include? scope
12
+ end
13
+ end
14
+
15
+ def check_app_scopes(application, scopes)
16
+ scopes.each do |scope|
17
+ api_forbidden 'scope.forbidden' if !application.scopes.include? scope
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Helpers
5
+ # This helper aims at providing vanity methods concerning OAuth tokens.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ module Tokens
8
+ # Returns the database object representing the current OAuth token, or
9
+ # raises an error if the token seems to be invalid for any reason.
10
+ # @return [Core::Models::Oauth::AccessToken] the token if everything went well.
11
+ # @raise [Core::Helpers::Errors::BadRequest] if the token is not given.
12
+ # @raise [Core::Helpers::Errors::NotFound] if the token is not found in the
13
+ # database searching for the value passed as parameter.
14
+ # @raise [Core::Helpers::Errors::Forbidden] if the token belongs to another
15
+ # application.
16
+ def token
17
+ return @token unless @token.nil?
18
+
19
+ check_presence 'token'
20
+ @token = Core::Models::OAuth::AccessToken.find_by(value: params['token'])
21
+ api_not_found 'token.unknown' if @token.nil?
22
+ token_app_id = token.authorization.application.id.to_s
23
+ api_forbidden 'token.mismatch' if token_app_id != application.id.to_s
24
+ @token
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/core/helpers.rb CHANGED
@@ -13,6 +13,7 @@ module Core
13
13
  autoload :Parameters, 'core/helpers/parameters'
14
14
  autoload :Responses, 'core/helpers/responses'
15
15
  autoload :Routes, 'core/helpers/routes'
16
- autoload :Sessions, 'core/helpers/sessions'
16
+ autoload :Scopes, 'core/helpers/scopes'
17
+ autoload :Tokens, 'core/helpers/tokens'
17
18
  end
18
19
  end
@@ -37,10 +37,6 @@ module Core
37
37
  # @!attribute [w] password_confirmation
38
38
  # @return [String] the confirmation of the password, do not get, just set it ; it must be the same as the password.
39
39
  has_secure_password validations: false
40
-
41
- # @!attribute [rw] groups
42
- # @return [Array<Core::Models::Permissions::Group>] the groups giving their corresponding rights to the current account.
43
- has_and_belongs_to_many :groups, class_name: 'Core::Models::Permissions::Group', inverse_of: :accounts
44
40
 
45
41
  # @!attribute [rw] applications
46
42
  # @return [Array<Core::Models::OAuth::Application] the applications this user has created and owns.
@@ -6,22 +6,16 @@ module Core
6
6
  module Sluggable
7
7
  extend ActiveSupport::Concern
8
8
 
9
- # Module holding the class methods for the classes including this concern.
10
- # @author Vincent Courtois <courtois.vincent@outlook.com>
11
- module ClassMethods
12
- # Add the field and its validations in the model including it.
13
- # @param entity_type [String,Symbol] the name of the model including it, to be included in the error messages.
14
- def make_sluggable(entity_type)
15
- # @!attribute [rw] slug
16
- # @return [String] the slug of the current entity ; it must be snake-cased, longer than four characters, unique for the entity and given.
17
- field :slug, type: String
9
+ included do
10
+ # @!attribute [rw] slug
11
+ # @return [String] the slug of the current entity ; it must be snake-cased, longer than four characters, unique for the entity and given.
12
+ field :slug, type: String
18
13
 
19
- validates :slug,
20
- length: {minimum: 4, message: 'minlength', if: :slug?},
21
- format: {with: /\A[a-z]+(_[a-z]+)*\z/, message: 'pattern', if: :slug?},
22
- uniqueness: {message: 'uniq', if: :slug?},
23
- presence: {message: 'required'}
24
- end
14
+ validates :slug,
15
+ length: {minimum: 4, message: 'minlength', if: :slug?},
16
+ format: {with: /\A[a-z]+(_[a-z]+)*\z/, message: 'pattern', if: :slug?},
17
+ uniqueness: {message: 'uniq', if: :slug?},
18
+ presence: {message: 'required'}
25
19
  end
26
20
  end
27
21
  end
@@ -8,7 +8,7 @@ module Core
8
8
  include Mongoid::Document
9
9
  include Mongoid::Timestamps
10
10
 
11
- store_in collection: 'oauth_access_token'
11
+ store_in collection: 'oauth_access_tokens'
12
12
 
13
13
  # @!attribute [rw] value
14
14
  # @return [String] the value of the token, returned to the application when built.
@@ -21,6 +21,12 @@ module Core
21
21
  # @return [Core::Models::OAuth::Authorization] the authorization code that issued this token to the application for this user.
22
22
  belongs_to :authorization, class_name: 'Core::Models::OAuth::Authorization', inverse_of: :tokens
23
23
 
24
+
25
+ # A refresh token is attached to each and every refresh token so that it can be used to deliver a new access token.
26
+ # @!attribute [rx] refresh_token
27
+ # @return [Core::Models::OAuth::RefreshToken] the refresh token linked to this token
28
+ has_one :refresh_token, class_name: 'Core::Models::OAuth::RefreshToken', inverse_of: :token
29
+
24
30
  validates :value,
25
31
  presence: {message: 'required'},
26
32
  uniqueness: {message: 'uniq'}
@@ -28,8 +34,25 @@ module Core
28
34
  # Checks if the current date is inferior to the creation date + expiration period
29
35
  # @return [Boolean] TRUE if the token is expired, FALSE otherwise.
30
36
  def expired?
37
+ # Handles the case where the token is given to a premium app (our apps have infinite tokens).
38
+ return false if premium?
39
+ return true if refresh_token.used?
40
+
31
41
  created_at.to_time.to_i + expiration < Time.now.to_i
32
42
  end
43
+
44
+ # Returns the scopes this access token can use to access the application
45
+ # @return [Array<Core::Models::OAuth::Scope>] the array of scopes from the linked authorization
46
+ def scopes
47
+ # Premium applications (our applications) have all the rights on the API.
48
+ return Core::Models::OAuth::Scope.all.to_a if premium?
49
+
50
+ authorization.scopes
51
+ end
52
+
53
+ def premium?
54
+ authorization.application.premium
55
+ end
33
56
  end
34
57
  end
35
58
  end
@@ -7,14 +7,17 @@ module Core
7
7
  include Mongoid::Document
8
8
  include Mongoid::Timestamps
9
9
 
10
- store_in collection: 'oauth_application'
10
+ store_in collection: 'oauth_applications'
11
11
 
12
12
  # @!attribute [rw] name
13
13
  # @return [String] the unique name of the application, mainly used to identify and display it.
14
14
  field :name, type: String
15
- # @!attribute [rw] key
15
+ # @!attribute [rw] client_id
16
16
  # @return [String] the unique key for the application, identifying it when requesting a token for the API.
17
- field :key, type: String, default: ->{ SecureRandom.hex }
17
+ field :client_id, type: String, default: ->{ SecureRandom.hex }
18
+ # @!attribute [rw] client_secret
19
+ # @return [String] the "password" of the application, used to identify it when requesting tokens.
20
+ field :client_secret, type: String, default: ->{ SecureRandom.hex }
18
21
  # @!attribute [rw] premium
19
22
  # @return [Boolean] a value indicating whether the application should automatically receive a token when an account is created, or not.
20
23
  field :premium, type: Mongoid::Boolean, default: false
@@ -28,16 +31,22 @@ module Core
28
31
  # @!attribute [rw] authorizations
29
32
  # @return [Array<Core::Models::OAuth::Authorization>] the authorizations linked to the accounts this application can get the data from.
30
33
  has_many :authorizations, class_name: 'Core::Models::OAuth::Authorization', inverse_of: :application
34
+ # @!attribute [rw]
35
+ # @return [Array<Core::Models::OAuth::Scope>] the scopes this application will transmit to its token
36
+ has_and_belongs_to_many :scopes, class_name: 'Core::Models::OAuth::Scope', inverse_of: :applications
31
37
 
32
38
  validates :name,
33
39
  presence: {message: 'required'},
34
40
  length: {minimum: 6, message: 'minlength'},
35
41
  uniqueness: {message: 'uniq'}
36
42
 
37
- validates :key,
43
+ validates :client_id,
38
44
  presence: {message: 'required'},
39
45
  uniqueness: {message: 'uniq'}
40
46
 
47
+ validates :client_secret,
48
+ presence: {message: 'required'}
49
+
41
50
  validate :redirect_uris_values
42
51
 
43
52
  # Checks the URIs to get sure they are correct, a URI is correct if :
@@ -10,11 +10,14 @@ module Core
10
10
  include Mongoid::Document
11
11
  include Mongoid::Timestamps
12
12
 
13
- store_in collection: 'oauth_authorization'
13
+ store_in collection: 'oauth_authorizations'
14
14
 
15
15
  # @!attribute [rw] code
16
16
  # @return [String] the value corresponding to the authentication code in the RFC of OAuth2.0, kep for historic purpose.
17
17
  field :code, type: String, default: ->{ SecureRandom.hex }
18
+ # @!attribute [rw] expiration
19
+ # @return [Integer] the time, in seconds, after which the authorization is declared expired.
20
+ field :expiration, type: Integer, default: 86400
18
21
 
19
22
  # @!attribute [rw] account
20
23
  # @return [Arkaaan::Account] the account granting the authorization to access its data to the application.
@@ -25,10 +28,19 @@ module Core
25
28
  # @!attribute [rw] token
26
29
  # @return [Core::Models::OAuth::AccessToken] the access token used further in the application process to access private data of the account.
27
30
  has_many :tokens, class_name: 'Core::Models::OAuth::AccessToken', inverse_of: :authorization
31
+ # @!attribute [rw]
32
+ # @return [Array<Core::Models::OAuth::Scope>] the scopes this access token has.
33
+ has_and_belongs_to_many :scopes, class_name: 'Core::Models::OAuth::Scope', inverse_of: :authorizations
28
34
 
29
35
  validates :code,
30
36
  presence: {message: 'required'},
31
37
  uniqueness: {message: 'uniq'}
38
+
39
+ # Checks if the current date is inferior to the creation date + expiration period
40
+ # @return [Boolean] TRUE if the authorization is expired, FALSE otherwise.
41
+ def expired?
42
+ created_at.to_time.to_i + expiration < Time.now.to_i
43
+ end
32
44
  end
33
45
  end
34
46
  end
@@ -7,15 +7,22 @@ module Core
7
7
  include Mongoid::Document
8
8
  include Mongoid::Timestamps
9
9
 
10
- store_in collection: 'oauth_refresh_token'
10
+ store_in collection: 'oauth_refresh_tokens'
11
11
 
12
12
  # @!attribute [rw] value
13
13
  # @return [String] the value of the token, returned to the application when built.
14
14
  field :value, type: String, default: ->{ SecureRandom.hex }
15
+ # @!attribute [rw] used_at
16
+ # @return [DateTime] the date and time at which this refresh token has been useds to create a new access token.
17
+ field :used_at, type: DateTime, default: nil
15
18
 
16
19
  # @!attribute [rw] authorization
17
20
  # @return [Core::Models::OAuth::Authorization] the authorization code that issued this token to the application for this user.
18
- belongs_to :authorization, class_name: 'Core::Models::OAuth::Authorization', inverse_of: :refresh_token
21
+ belongs_to :token, class_name: 'Core::Models::OAuth::AccessToken', inverse_of: :refresh_token
22
+
23
+ def used?
24
+ !used_at.nil? && used_at < DateTime.now
25
+ end
19
26
  end
20
27
  end
21
28
  end
@@ -0,0 +1,32 @@
1
+ module Core
2
+ module Models
3
+ module OAuth
4
+ # A scope gives access to some parts of the API, for example to the management of campaigns,
5
+ # applications or for account profile management.
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
7
+ class Scope
8
+ include Mongoid::Document
9
+ include Mongoid::Timestamps
10
+
11
+ store_in collection: 'oauth_scopes'
12
+
13
+ # @!attribute [rw] name
14
+ # @return [String] the name of the scope, used to get its translation on the frontend.
15
+ field :name, type: String, default: ''
16
+
17
+ # @!attribute [rw] applications
18
+ # @return [Array<Core::Models::OAuth::Application>] the applications that want to have access to this
19
+ # scope from the users of the platform. These rights will be carried on to the tokens and frozen.
20
+ has_and_belongs_to_many :applications, class_name: 'Core::Models::OAuth::Application', inverse_of: :scopes
21
+ # @!attribute [rw] tokeauthorizationsns
22
+ # @return [Array<Core::Models::OAuth::Authorization] the tokens having these scopes.
23
+ has_and_belongs_to_many :authorizations, class_name: 'Core::Models::OAuth::Authorization', inverse_of: :scopes
24
+
25
+ validates :name,
26
+ presence: {message: 'required'},
27
+ length: {minimum: 6, if: :name?, message: 'minlength'},
28
+ uniqueness: {id: :name?, message: 'uniq'}
29
+ end
30
+ end
31
+ end
32
+ end
@@ -7,6 +7,7 @@ module Core
7
7
  autoload :Authorization, 'core/models/oauth/authorization'
8
8
  autoload :AccessToken , 'core/models/oauth/access_token'
9
9
  autoload :RefreshToken , 'core/models/oauth/refresh_token'
10
+ autoload :Scope , 'core/models/oauth/scope'
10
11
  end
11
12
  end
12
13
  end
data/lib/core/models.rb CHANGED
@@ -1,24 +1,21 @@
1
- require 'mongoid'
2
- require 'active_model'
3
- require 'active_support'
4
- require 'dotenv/load'
1
+ # frozen_string_literal: true
5
2
 
6
- # Main module of the application, holding all the subsequent classes.
7
- # @author Vincent Courtois <courtois.vincent@outlook.com>
8
3
  module Core
4
+ # Module holding the representations of the business objects we're manipulating
5
+ # in the database. Models are declared as Mongoid classes to connect to MongoDB
6
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
9
7
  module Models
10
- autoload :Account , 'core/models/account'
8
+ autoload :Account, 'core/models/account'
11
9
  autoload :Authentication, 'core/models/authentication'
12
- autoload :Campaign , 'core/models/campaign'
13
- autoload :Campaigns , 'core/models/campaigns'
14
- autoload :Chatroom , 'core/models/chatroom'
15
- autoload :Chatrooms , 'core/models/chatrooms'
16
- autoload :Concerns , 'core/models/concerns'
17
- autoload :Event , 'core/models/event'
18
- autoload :Files , 'core/models/files'
19
- autoload :Notification , 'core/models/notification'
20
- autoload :OAuth , 'core/models/oauth'
21
- autoload :Permissions , 'core/models/permissions'
22
- autoload :Ruleset , 'core/models/ruleset'
10
+ autoload :Campaign, 'core/models/campaign'
11
+ autoload :Campaigns, 'core/models/campaigns'
12
+ autoload :Chatroom, 'core/models/chatroom'
13
+ autoload :Chatrooms, 'core/models/chatrooms'
14
+ autoload :Concerns, 'core/models/concerns'
15
+ autoload :Event, 'core/models/event'
16
+ autoload :Files, 'core/models/files'
17
+ autoload :Notification, 'core/models/notification'
18
+ autoload :OAuth, 'core/models/oauth'
19
+ autoload :Ruleset, 'core/models/ruleset'
23
20
  end
24
- end
21
+ end
data/lib/core/services.rb CHANGED
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Core
4
+ # Services are orchestrating models to provide more high-level operations.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
2
6
  module Services
3
7
  autoload :Accounts, 'core/services/accounts'
4
8
  autoload :Base, 'core/services/base'
5
9
  autoload :Registry, 'core/services/registry'
6
10
  autoload :Sessions, 'core/services/sessions'
7
11
  end
8
- end
12
+ end
data/lib/core/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Core
2
- VERSION = '1.2.2'
3
- end
4
+ VERSION = '1.4.0'
5
+ end
data/lib/core.rb CHANGED
@@ -1,7 +1,6 @@
1
- require 'mongoid'
2
- require 'active_model'
3
- require 'active_support'
4
- require 'dotenv/load'
1
+ # frozen_string_literal: true
2
+
3
+ %w[active_model mongoid active_support].each { |g| require g }
5
4
 
6
5
  # Main module of the application, holding all the subsequent classes.
7
6
  # @author Vincent Courtois <courtois.vincent@outlook.com>
@@ -10,4 +9,4 @@ module Core
10
9
  autoload :Helpers, 'core/helpers'
11
10
  autoload :Models, 'core/models'
12
11
  autoload :Services, 'core/services'
13
- end
12
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: virtuatable-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Courtois
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-12 00:00:00.000000000 Z
11
+ date: 2022-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: database_cleaner
@@ -298,7 +298,8 @@ files:
298
298
  - lib/core/helpers/parameters.rb
299
299
  - lib/core/helpers/responses.rb
300
300
  - lib/core/helpers/routes.rb
301
- - lib/core/helpers/sessions.rb
301
+ - lib/core/helpers/scopes.rb
302
+ - lib/core/helpers/tokens.rb
302
303
  - lib/core/models.rb
303
304
  - lib/core/models/account.rb
304
305
  - lib/core/models/authentication.rb
@@ -332,11 +333,7 @@ files:
332
333
  - lib/core/models/oauth/application.rb
333
334
  - lib/core/models/oauth/authorization.rb
334
335
  - lib/core/models/oauth/refresh_token.rb
335
- - lib/core/models/permissions.rb
336
- - lib/core/models/permissions/category.rb
337
- - lib/core/models/permissions/group.rb
338
- - lib/core/models/permissions/right.rb
339
- - lib/core/models/permissions/route.rb
336
+ - lib/core/models/oauth/scope.rb
340
337
  - lib/core/models/ruleset.rb
341
338
  - lib/core/services.rb
342
339
  - lib/core/services/accounts.rb
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Core
4
- module Helpers
5
- # This helper gives access to methods about user's session on the API.
6
- # @author Vincent Courtois <courtois.vincent@outlook.com>
7
- module Sessions
8
- # Checks the session of the user requesting the API and returns an error
9
- # if it either not exists with the given token, or the token is not given.
10
- #
11
- # @raise [Virtuatable::API::Errors::NotFound] if the session is not found
12
- # or the token not given in the parameters of the request.
13
- # @raise [Virtuatable::API::Errors::BadRequest] if the session token is
14
- # not correctly given in the parameters.
15
- #
16
- # @return [Core::Models::Authentication::Session] the current session of the user.
17
- def session
18
- return @session unless @session.nil?
19
-
20
- check_presence 'session_id'
21
- @session = session_model.find_by(token: params['session_id'])
22
- @session.nil? ? api_not_found('session_id.unknown') : @session
23
- end
24
-
25
- def session_model
26
- Core::Models::Authentication::Session
27
- end
28
- end
29
- end
30
- end
@@ -1,19 +0,0 @@
1
- module Core
2
- module Models
3
- module Permissions
4
- # A category of rights regroups one or several rights for convenience purposes.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Category
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
- include Core::Models::Concerns::Sluggable
10
-
11
- store_in collection: 'categories'
12
-
13
- has_many :rights, class_name: 'Core::Models::Permissions::Right', inverse_of: :category
14
-
15
- make_sluggable 'category'
16
- end
17
- end
18
- end
19
- end
@@ -1,34 +0,0 @@
1
- module Core
2
- module Models
3
- module Permissions
4
- # A group gathers one or several users to give them the same rights for conviniency purposes.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- class Group
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
- include Core::Models::Concerns::Sluggable
10
-
11
- store_in collection: 'groups'
12
-
13
- # @!attribute [rw] is_default
14
- # @return [Boolean] a boolean indicating whether this group is given when a new user registered or not.
15
- field :is_default, type: Mongoid::Boolean, default: false
16
- # @!attribute [rw] is_superuser
17
- # @return [Boolean] a boolean indicating whether this group should have access to all groups and rights or not.
18
- field :is_superuser, type: Mongoid::Boolean, default: false
19
-
20
- # @!attribute [rw] accounts
21
- # @return [Array<Core::Models::Account>] the accounts having the rights granted by this group.
22
- has_and_belongs_to_many :accounts, class_name: 'Core::Models::Account', inverse_of: :groups
23
- # @!attribute [rw] rights
24
- # @return [Array<Core::Models::Permissions::Right>] the rights granted by belonging to this group.
25
- has_and_belongs_to_many :rights, class_name: 'Core::Models::Permissions::Right', inverse_of: :groups
26
- # @!attribute [rw] routes
27
- # @return [Array<Core::Models::Monitoring::Route>] the routes this group can access in the API.
28
- has_and_belongs_to_many :routes, class_name: 'Core::Models::Permissions::Route', inverse_of: :groups
29
-
30
- make_sluggable 'group'
31
- end
32
- end
33
- end
34
- end
@@ -1,23 +0,0 @@
1
- module Core
2
- module Models
3
- module Permissions
4
- # A right is the access to one or several features in the application. It's applied to a group, and transitively to an account.
5
- # @author Vincent Courtois <courtois;vincent@outlook.com>
6
- class Right
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
- include Core::Models::Concerns::Sluggable
10
-
11
- store_in collection: 'rights'
12
-
13
- # @!attribute [rw] groups
14
- # @return [Array<Core::Models::Permissions::Group>] the groups granted with the permission to access features opened by this right.
15
- has_and_belongs_to_many :groups, class_name: 'Core::Models::Permissions::Group', inverse_of: :rights
16
-
17
- belongs_to :category, class_name: 'Core::Models::Permissions::Category', inverse_of: :rights
18
-
19
- make_sluggable 'right'
20
- end
21
- end
22
- end
23
- end
@@ -1,35 +0,0 @@
1
- module Core
2
- module Models
3
- module Permissions
4
- # A route is an endpoint accessible in the API. Each route has to have an associated endpoint in the deployed instances.
5
- # @param Vincent Courtois <courtois.vincent@outlook.com>
6
- class Route
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
- include Core::Models::Concerns::Premiumable
10
- include Core::Models::Concerns::Activable
11
-
12
- store_in collection: 'routes'
13
-
14
- # @!attribute [rw] path
15
- # @return [String] the path (URI) of the route in the API.
16
- field :path, type: String, default: '/'
17
- # @!attribute [rw] verb
18
- # @return [String] the verb (HTTP method) of this route in the API.
19
- field :verb, type: String, default: 'get'
20
- # @!attribute [rw] authenticated
21
- # @return [Boolean] if true, the session_id is needed for this route, if false it is not.
22
- field :authenticated, type: Mongoid::Boolean, default: true
23
- # @!attribute [rw] groups
24
- # @return [Array<Core::Models::Permissions::Group>] the groups having permission to access this route.
25
- has_and_belongs_to_many :groups, class_name: 'Core::Models::Permissions::Group', inverse_of: :groups
26
-
27
- validates :path,
28
- format: {with: /\A(\/|((\/:?[a-zA-Z0-9_]+)+))\z/, message: 'pattern', if: :path?}
29
-
30
- validates :verb,
31
- inclusion: {message: 'unknown', in: ['get', 'post', 'put', 'delete', 'patch', 'option']}
32
- end
33
- end
34
- end
35
- end
@@ -1,13 +0,0 @@
1
- module Core
2
- module Models
3
- # This module holds the logic for all the classes concerning the permissions abd rights for the user.
4
- # A permission is restricting the access to one or several features to the users having it.
5
- # @author Vincent Courtois <courtois.vincent@outlook.com>
6
- module Permissions
7
- autoload :Right , 'core/models/permissions/right'
8
- autoload :Group , 'core/models/permissions/group'
9
- autoload :Category, 'core/models/permissions/category'
10
- autoload :Route , 'core/models/permissions/route'
11
- end
12
- end
13
- end