beyond_canvas 0.15.3.pre → 0.16.0.pre
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 +4 -4
- data/README.md +0 -6
- data/app/controllers/beyond_canvas/authentications_controller.rb +62 -0
- data/app/controllers/concerns/beyond_canvas/authentication.rb +24 -0
- data/app/controllers/concerns/beyond_canvas/resource_management.rb +33 -0
- data/app/views/beyond_canvas/authentications/new.html.erb +18 -0
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +6 -0
- data/lib/beyond_canvas.rb +22 -2
- data/lib/beyond_canvas/configuration.rb +4 -1
- data/lib/beyond_canvas/engine.rb +4 -0
- data/lib/beyond_canvas/models/authentication.rb +66 -0
- data/lib/beyond_canvas/models/shop.rb +28 -0
- data/lib/beyond_canvas/models/utils.rb +55 -0
- data/lib/beyond_canvas/parameter_sanitizer.rb +43 -0
- data/lib/beyond_canvas/rails/routes.rb +21 -0
- data/lib/beyond_canvas/version.rb +1 -1
- data/lib/generators/beyond_canvas/auth_model/auth_model_generator.rb +50 -0
- data/lib/generators/beyond_canvas/auth_model/templates/migration.erb +20 -0
- data/lib/generators/beyond_canvas/auth_model/templates/model.erb +5 -0
- data/lib/generators/beyond_canvas/controller/controller_generator.rb +20 -0
- data/lib/generators/beyond_canvas/controller/templates/controller.erb +37 -0
- data/lib/generators/beyond_canvas/install/install_generator.rb +15 -5
- data/lib/generators/beyond_canvas/install/templates/beyond_canvas.rb.erb +11 -0
- data/lib/generators/beyond_canvas/views/views_generator.rb +19 -0
- metadata +49 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0100f13f9ddfdf8b74b3edae25471d479d5a3351ecc5191f9cfa069a3d4c6b3f
|
4
|
+
data.tar.gz: e73fdde1ebee7d45422f052c66791a0b86938b52df74930042b4fc67aa6008af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b622d131dfe607dbfee52c65b3b0294d609afa3deeb339c9597a46c9dc847cedf578ff8ac2ce3d3dca106fc240b97b3da44be3de75c62a326f5c54739618ec5f
|
7
|
+
data.tar.gz: 86eb83c6da624ca5706737f48270bfa85819a57be85795188426a1a263c1f10480c16b83579c349d06e4c33da9bfa61543e9076286ae570ab033b7202104c0ec
|
data/README.md
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency 'beyond_canvas/application_controller'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
class AuthenticationsController < ApplicationController # :nodoc:
|
7
|
+
layout 'beyond_canvas/public'
|
8
|
+
|
9
|
+
include ::BeyondCanvas::Authentication
|
10
|
+
include ::BeyondCanvas::ResourceManagement
|
11
|
+
|
12
|
+
before_action :validate_app_installation_request!, only: :new
|
13
|
+
|
14
|
+
def new
|
15
|
+
self.resource = resource_class.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def create
|
19
|
+
# Search for the api url. If there is no record it creates a new record.
|
20
|
+
resource_params = new_resource_params
|
21
|
+
self.resource = resource_class.find_or_create_by(beyond_api_url: resource_params[:api_url])
|
22
|
+
# Assign the attributes to the record
|
23
|
+
raise ActiveRecord::RecordNotSaved unless resource.update(resource_params)
|
24
|
+
# Get and save access_token and refresh_token using the authentication code
|
25
|
+
raise BeyondApi::Error if resource.authenticate.is_a?(BeyondApi::Error)
|
26
|
+
|
27
|
+
redirect_to after_create_path
|
28
|
+
rescue ActiveRecord::RecordNotSaved, BeyondApi::Error, StandardError => e
|
29
|
+
logger.error "[BeyondCanvas] #{e.message}".red
|
30
|
+
send "handle_#{e.class.name.split('::').first.underscore}_exception", e
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
create
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def new_resource_params
|
40
|
+
send "new_#{resource_name}_params"
|
41
|
+
end
|
42
|
+
|
43
|
+
def after_create_path
|
44
|
+
new_resource_params[:return_url]
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle_active_record_exception(_exception)
|
48
|
+
flash[:error] = t('beyond_canvas.authentications.failure')
|
49
|
+
render :new
|
50
|
+
end
|
51
|
+
|
52
|
+
def handle_beyond_api_exception(_exception)
|
53
|
+
flash[:error] = t('beyond_canvas.authentications.failure')
|
54
|
+
render :new
|
55
|
+
end
|
56
|
+
|
57
|
+
def handle_standard_error_exception(_exception)
|
58
|
+
flash[:error] = t('beyond_canvas.authentications.failure')
|
59
|
+
render :new
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Authentication # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
AUTH_RESOURCE = BeyondCanvas.auth_model
|
7
|
+
|
8
|
+
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
9
|
+
def current_#{AUTH_RESOURCE}
|
10
|
+
instance_variable_get("@#{AUTH_RESOURCE}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def new_#{AUTH_RESOURCE}_params
|
14
|
+
beyond_canvas_parameter_sanitizer.sanitize
|
15
|
+
end
|
16
|
+
METHODS
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def beyond_canvas_parameter_sanitizer
|
21
|
+
@beyond_canvas_parameter_sanitizer ||= BeyondCanvas::ParameterSanitizer.new(AUTH_RESOURCE, params)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module ResourceManagement # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
# Share some methods defined in the controller to make them available for the view
|
9
|
+
if respond_to?(:helper_method)
|
10
|
+
helpers = %w[resource resource_name resource_class]
|
11
|
+
helper_method(*helpers)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def resource_name
|
18
|
+
BeyondCanvas.auth_model
|
19
|
+
end
|
20
|
+
|
21
|
+
def resource
|
22
|
+
instance_variable_get(:"@#{resource_name}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def resource=(new_resource)
|
26
|
+
instance_variable_set(:"@#{resource_name}", new_resource)
|
27
|
+
end
|
28
|
+
|
29
|
+
def resource_class
|
30
|
+
resource_name.classify.constantize
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class='card card--padding'>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name) do |f| %>
|
4
|
+
|
5
|
+
<h2 class='card__headline'>Install <%= BeyondCanvas.configuration.site_title %> in your shop</h2>
|
6
|
+
|
7
|
+
<%= f.hidden_field :code, value: params[:code] || resource.code %>
|
8
|
+
<%= f.hidden_field :signature, value: params[:signature] || resource.signature %>
|
9
|
+
<%= f.hidden_field :return_url, value: params[:return_url] || resource.return_url %>
|
10
|
+
<%= f.hidden_field :api_url, value: params[:api_url] || resource.api_url %>
|
11
|
+
<%= f.hidden_field :access_token_url, value: params[:access_token_url] || resource.access_token_url %>
|
12
|
+
|
13
|
+
<div class='form__actions--spaced'>
|
14
|
+
<%= f.button 'Save', type: :submit, class: 'button__solid--primary' %>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<% end %>
|
18
|
+
</div>
|
data/config/routes.rb
CHANGED
@@ -2,4 +2,10 @@
|
|
2
2
|
|
3
3
|
BeyondCanvas::Engine.routes.draw do
|
4
4
|
put '/locale', to: 'system#update_locale', as: :update_locale
|
5
|
+
|
6
|
+
def create_default_routes(resource_name)
|
7
|
+
resources resource_name, controller: 'authentications', except: :destroy
|
8
|
+
end
|
9
|
+
|
10
|
+
create_default_routes(BeyondCanvas.auth_model.pluralize.to_sym) unless BeyondCanvas.use_rails_app_controller
|
5
11
|
end
|
data/lib/beyond_canvas.rb
CHANGED
@@ -12,10 +12,30 @@ require 'http/accept'
|
|
12
12
|
require 'premailer/rails'
|
13
13
|
|
14
14
|
require 'beyond_api'
|
15
|
+
require 'attr_encrypted'
|
16
|
+
require 'blind_index'
|
15
17
|
|
16
18
|
module BeyondCanvas # :nodoc:
|
17
|
-
autoload :AssetRegistration,
|
18
|
-
autoload :Configuration,
|
19
|
+
autoload :AssetRegistration, 'beyond_canvas/asset_registration'
|
20
|
+
autoload :Configuration, 'beyond_canvas/configuration'
|
21
|
+
|
22
|
+
module Models # :nodoc:
|
23
|
+
autoload :Authentication, 'beyond_canvas/models/authentication'
|
24
|
+
autoload :Shop, 'beyond_canvas/models/shop'
|
25
|
+
autoload :Utils, 'beyond_canvas/models/utils'
|
26
|
+
end
|
27
|
+
|
28
|
+
autoload :ParameterSanitizer, 'beyond_canvas/parameter_sanitizer'
|
29
|
+
|
30
|
+
mattr_accessor :use_rails_app_controller
|
31
|
+
@@use_rails_app_controller = false # rubocop:disable Style/ClassVars
|
32
|
+
|
33
|
+
mattr_accessor :auth_model
|
34
|
+
@@auth_model = 'shop' # rubocop:disable Style/ClassVars
|
35
|
+
|
36
|
+
def self.use_rails_app_controller=(value)
|
37
|
+
@use_rails_app_controller = value
|
38
|
+
end
|
19
39
|
|
20
40
|
class << self
|
21
41
|
def configuration
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module BeyondCanvas
|
4
4
|
class Configuration # :nodoc:
|
5
|
-
attr_accessor :site_title, :site_logo, :favicon, :skip_webpacker
|
5
|
+
attr_accessor :site_title, :site_logo, :favicon, :skip_webpacker, :encryption_key, :blind_index_key, :namespace
|
6
6
|
|
7
7
|
include AssetRegistration
|
8
8
|
|
@@ -11,6 +11,9 @@ module BeyondCanvas
|
|
11
11
|
@site_logo = nil
|
12
12
|
@favicon = nil
|
13
13
|
@skip_webpacker = false
|
14
|
+
@encryption_key = nil
|
15
|
+
@blind_index_key = nil
|
16
|
+
@namespace = '/'
|
14
17
|
end
|
15
18
|
|
16
19
|
def setup!
|
data/lib/beyond_canvas/engine.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'beyond_canvas/rails/routes'
|
4
|
+
|
3
5
|
module BeyondCanvas
|
4
6
|
class Engine < ::Rails::Engine # :nodoc:
|
5
7
|
isolate_namespace BeyondCanvas
|
@@ -15,7 +17,9 @@ module BeyondCanvas
|
|
15
17
|
|
16
18
|
config.before_initialize do
|
17
19
|
ActiveSupport.on_load :action_controller do
|
20
|
+
include ::BeyondCanvas::Authentication
|
18
21
|
include ::BeyondCanvas::LocaleManagement
|
22
|
+
include ::BeyondCanvas::ResourceManagement
|
19
23
|
include ::BeyondCanvas::RequestValidation
|
20
24
|
include ::BeyondCanvas::StatusCodes
|
21
25
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Models
|
5
|
+
module Authentication # :nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
attr_accessor :code, :signature, :access_token_url
|
10
|
+
|
11
|
+
##############################################################################
|
12
|
+
# Encrypted attribute configuration
|
13
|
+
##############################################################################
|
14
|
+
|
15
|
+
attr_encrypted :beyond_api_url, key: [BeyondCanvas.configuration.encryption_key].pack('H*')
|
16
|
+
attr_encrypted :beyond_access_token, key: [BeyondCanvas.configuration.encryption_key].pack('H*')
|
17
|
+
attr_encrypted :beyond_refresh_token, key: [BeyondCanvas.configuration.encryption_key].pack('H*')
|
18
|
+
|
19
|
+
blind_index :beyond_api_url, key: [BeyondCanvas.configuration.blind_index_key].pack('H*')
|
20
|
+
|
21
|
+
##############################################################################
|
22
|
+
# Validations
|
23
|
+
##############################################################################
|
24
|
+
|
25
|
+
# Callback url params
|
26
|
+
|
27
|
+
validates :code,
|
28
|
+
presence: true,
|
29
|
+
on: :create
|
30
|
+
validates :signature,
|
31
|
+
presence: true,
|
32
|
+
on: :create
|
33
|
+
validates :access_token_url,
|
34
|
+
presence: true,
|
35
|
+
on: :create
|
36
|
+
|
37
|
+
# Database fields
|
38
|
+
|
39
|
+
validates :beyond_api_url,
|
40
|
+
presence: true
|
41
|
+
validates :beyond_access_token,
|
42
|
+
presence: true,
|
43
|
+
unless: -> { encrypted_beyond_access_token_was.blank? }
|
44
|
+
validates :beyond_refresh_token,
|
45
|
+
presence: true,
|
46
|
+
unless: -> { encrypted_beyond_refresh_token_was.blank? }
|
47
|
+
|
48
|
+
##############################################################################
|
49
|
+
# Instance methods
|
50
|
+
##############################################################################
|
51
|
+
|
52
|
+
#
|
53
|
+
# Get and save access_token and refresh_token using the authentication code
|
54
|
+
# NOTE: This method is used during the shop creation, as it is the only point
|
55
|
+
# we know about the authentication code
|
56
|
+
#
|
57
|
+
def authenticate
|
58
|
+
session = BeyondApi::Session.new(api_url: beyond_api_url)
|
59
|
+
session.token.create(code)
|
60
|
+
update(beyond_access_token: session.access_token,
|
61
|
+
beyond_refresh_token: session.refresh_token)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Models
|
5
|
+
module Shop # :nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
include BeyondCanvas::Models::Authentication
|
8
|
+
include BeyondCanvas::Models::Utils
|
9
|
+
|
10
|
+
included do
|
11
|
+
attr_accessor :api_url, :return_url
|
12
|
+
|
13
|
+
##############################################################################
|
14
|
+
# Validations
|
15
|
+
##############################################################################
|
16
|
+
|
17
|
+
# Callback url params
|
18
|
+
|
19
|
+
validates :api_url,
|
20
|
+
presence: true,
|
21
|
+
on: :create
|
22
|
+
validates :return_url,
|
23
|
+
presence: true,
|
24
|
+
on: :create
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Models
|
5
|
+
module Utils # :nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
##############################################################################
|
10
|
+
# Instance methods
|
11
|
+
##############################################################################
|
12
|
+
|
13
|
+
#
|
14
|
+
# Generates a new access_token and refresh_token
|
15
|
+
#
|
16
|
+
def refresh_token
|
17
|
+
beyond_session = BeyondApi::Session.new(api_url: beyond_api_url, refresh_token: beyond_refresh_token)
|
18
|
+
beyond_session.token.refresh
|
19
|
+
|
20
|
+
update(beyond_access_token: beyond_session.access_token,
|
21
|
+
beyond_refresh_token: beyond_session.refresh_token)
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Generates a new access_token and refresh_token if they have expired
|
26
|
+
#
|
27
|
+
def refresh_token_if_needed
|
28
|
+
token_timestamp = JWT.decode(beyond_access_token, nil, false).first['exp']
|
29
|
+
current_timestamp = DateTime.now.to_i
|
30
|
+
return unless token_timestamp - current_timestamp <= 3600
|
31
|
+
|
32
|
+
refresh_token
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Returns a BeyondApi::Session object with api_url, access_token and refresh_token attributes
|
37
|
+
#
|
38
|
+
def to_session
|
39
|
+
BeyondApi::Session.new(api_url: beyond_api_url,
|
40
|
+
access_token: beyond_access_token,
|
41
|
+
refresh_token: beyond_refresh_token)
|
42
|
+
end
|
43
|
+
|
44
|
+
##############################################################################
|
45
|
+
# Class methods
|
46
|
+
##############################################################################
|
47
|
+
|
48
|
+
def self.find_session(id)
|
49
|
+
shop = find(id)
|
50
|
+
shop.to_session
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
class ParameterSanitizer # :nodoc:
|
5
|
+
DEFAULT_PERMITTED_ATTRIBUTES = %i[code signature return_url api_url access_token_url].freeze
|
6
|
+
|
7
|
+
def initialize(resource_name, params)
|
8
|
+
@params = params
|
9
|
+
@resource_name = resource_name
|
10
|
+
@permitted = DEFAULT_PERMITTED_ATTRIBUTES
|
11
|
+
end
|
12
|
+
|
13
|
+
def sanitize
|
14
|
+
permit_keys(default_params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def permit(*keys)
|
18
|
+
@permitted.concat(keys)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def default_params
|
24
|
+
if hashable_resource_params?
|
25
|
+
@params.fetch(@resource_name)
|
26
|
+
else
|
27
|
+
empty_params
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def hashable_resource_params?
|
32
|
+
@params[@resource_name].respond_to?(:permit)
|
33
|
+
end
|
34
|
+
|
35
|
+
def empty_params
|
36
|
+
ActionController::Parameters.new({})
|
37
|
+
end
|
38
|
+
|
39
|
+
def permit_keys(parameters)
|
40
|
+
parameters.permit(*@permitted)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActionDispatch
|
4
|
+
module Routing
|
5
|
+
class Mapper # :nodoc:
|
6
|
+
def beyond_canvas_for(*resources)
|
7
|
+
mount BeyondCanvas::Engine => BeyondCanvas.configuration.namespace
|
8
|
+
|
9
|
+
resource_name, options = resources
|
10
|
+
BeyondCanvas.auth_model = resource_name.to_s.singularize
|
11
|
+
BeyondCanvas.use_rails_app_controller = options.present? && options[:controller].present?
|
12
|
+
|
13
|
+
set_routes(resource_name, options[:controller]) if BeyondCanvas.use_rails_app_controller
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_routes(resource_name, controller)
|
17
|
+
resources resource_name, controller: controller
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
module Generators
|
7
|
+
class AuthModelGenerator < ActiveRecord::Generators::Base # :nodoc:
|
8
|
+
desc 'Generates a model with the given name and provides a method to authenticate in Beyond Backend'
|
9
|
+
|
10
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
11
|
+
|
12
|
+
source_root File.expand_path('templates', __dir__)
|
13
|
+
|
14
|
+
def copy_beyond_canvas_migration
|
15
|
+
migration_path = File.join('db', 'migrate')
|
16
|
+
migration_template 'migration.erb',
|
17
|
+
"#{migration_path}/beyond_canvas_create_#{table_name}.rb",
|
18
|
+
migration_version: migration_version
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_model
|
22
|
+
template 'model.erb', File.join('app', 'models', "#{file_path}.rb")
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def rails5_and_up?
|
28
|
+
Rails::VERSION::MAJOR >= 5
|
29
|
+
end
|
30
|
+
|
31
|
+
def migration_version
|
32
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]" if rails5_and_up?
|
33
|
+
end
|
34
|
+
|
35
|
+
def migration_data
|
36
|
+
<<RUBY
|
37
|
+
t.string :encrypted_beyond_api_url, null: false
|
38
|
+
t.string :encrypted_beyond_api_url_iv, null: false
|
39
|
+
t.string :beyond_api_url_bidx, null: false
|
40
|
+
|
41
|
+
t.text :encrypted_beyond_access_token, null: true
|
42
|
+
t.text :encrypted_beyond_access_token_iv, null: true
|
43
|
+
|
44
|
+
t.text :encrypted_beyond_refresh_token, null: true
|
45
|
+
t.text :encrypted_beyond_refresh_token_iv, null: true
|
46
|
+
RUBY
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class BeyondCanvasCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
4
|
+
def change
|
5
|
+
create_table :<%= table_name %><%= primary_key_type %> do |t|
|
6
|
+
<%= migration_data -%>
|
7
|
+
|
8
|
+
<% attributes.each do |attribute| -%>
|
9
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
t.timestamps null: false
|
13
|
+
end
|
14
|
+
|
15
|
+
add_index :<%= table_name %>, :encrypted_beyond_api_url_iv, unique: true
|
16
|
+
add_index :<%= table_name %>, :beyond_api_url_bidx, unique: true
|
17
|
+
add_index :<%= table_name %>, :encrypted_beyond_access_token_iv, unique: true
|
18
|
+
add_index :<%= table_name %>, :encrypted_beyond_refresh_token_iv, unique: true
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
module Generators
|
7
|
+
class ControllerGenerator < Rails::Generators::Base # :nodoc:
|
8
|
+
desc 'Creates an inherited Beyond Canvas controller in the app/controllers folder'
|
9
|
+
|
10
|
+
argument :scope, required: true, desc: 'The scope to create the controller, e.g. shops, users'
|
11
|
+
|
12
|
+
source_root File.expand_path('templates', __dir__)
|
13
|
+
|
14
|
+
def create_controller
|
15
|
+
template 'controller.erb',
|
16
|
+
"app/controllers/#{scope}_controller.rb"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class <%= scope.camelize %>Controller < BeyondCanvas::AuthenticationsController
|
4
|
+
# before_action :configure_params, only: [:create]
|
5
|
+
|
6
|
+
# def new
|
7
|
+
# super
|
8
|
+
# end
|
9
|
+
|
10
|
+
# def create
|
11
|
+
# super
|
12
|
+
# end
|
13
|
+
|
14
|
+
# private
|
15
|
+
|
16
|
+
# If you have extra params to permit, append them to the sanitizer.
|
17
|
+
# def configure_params
|
18
|
+
# beyond_canvas_parameter_sanitizer.permit(:attribute1, :attribute2)
|
19
|
+
# end
|
20
|
+
|
21
|
+
# The path used after creating the shop in the database
|
22
|
+
# def after_create_path
|
23
|
+
# resource.return_url
|
24
|
+
# end
|
25
|
+
|
26
|
+
# def handle_active_record_exception(exception)
|
27
|
+
# super
|
28
|
+
# end
|
29
|
+
|
30
|
+
# def handle_beyond_api_exception(exception)
|
31
|
+
# super
|
32
|
+
# end
|
33
|
+
|
34
|
+
# def handle_standard_error_exception(exception)
|
35
|
+
# super
|
36
|
+
# end
|
37
|
+
end
|
@@ -6,19 +6,17 @@ module BeyondCanvas
|
|
6
6
|
desc 'Installs Beyond Canvas and generates the necessary files'
|
7
7
|
|
8
8
|
class_option :skip_webpacker, type: :boolean, default: false, desc: 'Use Sprockets assets instead of Webpacker'
|
9
|
+
class_option :auth_model, type: :string, default: 'shop', desc: 'Authentication model'
|
9
10
|
|
10
11
|
source_root File.expand_path('templates', __dir__)
|
11
12
|
|
12
13
|
def copy_initializer
|
13
14
|
@skip_webpacker = options[:skip_webpacker]
|
15
|
+
@auth_model = options[:auth_model]
|
14
16
|
|
15
17
|
template 'beyond_canvas.rb.erb', 'config/initializers/beyond_canvas.rb'
|
16
18
|
end
|
17
19
|
|
18
|
-
def setup_routes
|
19
|
-
route "mount BeyondCanvas::Engine => '/'"
|
20
|
-
end
|
21
|
-
|
22
20
|
def create_assets
|
23
21
|
if options[:skip_webpacker]
|
24
22
|
generate 'beyond_canvas:assets'
|
@@ -28,7 +26,19 @@ module BeyondCanvas
|
|
28
26
|
end
|
29
27
|
|
30
28
|
def install_beyond_api
|
31
|
-
generate 'beyond_api
|
29
|
+
generate 'beyond_canvas:beyond_api'
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate_auth_model
|
33
|
+
generate "beyond_canvas:auth_model #{@auth_model}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def setup_routes
|
37
|
+
route "beyond_canvas_for :#{@auth_model.pluralize}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def copy_locale
|
41
|
+
copy_file '../../../../../config/locales/en.yml', 'config/locales/beyond_canvas.en.yml'
|
32
42
|
end
|
33
43
|
end
|
34
44
|
end
|
@@ -37,4 +37,15 @@ BeyondCanvas.setup do |config|
|
|
37
37
|
# You can switch to using Sprocket's asset pipeline here.
|
38
38
|
#
|
39
39
|
<% unless @skip_webpacker %># <% end %>config.skip_webpacker = <%= @skip_webpacker %>
|
40
|
+
|
41
|
+
# ==> Authentication with ePages Beyond API
|
42
|
+
|
43
|
+
# Default model is shop
|
44
|
+
#
|
45
|
+
config.encryption_key = '<%= SecureRandom.hex(32) %>'
|
46
|
+
config.blind_index_key = '<%= SecureRandom.hex(32) %>'
|
47
|
+
|
48
|
+
# ==> Mountable engine configuration
|
49
|
+
#
|
50
|
+
# config.namespace = '/'
|
40
51
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
module Generators
|
7
|
+
class ViewsGenerator < Rails::Generators::Base # :nodoc:
|
8
|
+
desc 'Creates a view in the app/view folder'
|
9
|
+
|
10
|
+
argument :scope, required: true, desc: 'The scope to copy views to'
|
11
|
+
|
12
|
+
source_root File.expand_path('../../../../app/views/beyond_canvas/authentications', __dir__)
|
13
|
+
|
14
|
+
def create_view
|
15
|
+
copy_file 'new.html.erb', "app/views/#{scope}/new.html.erb"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beyond_canvas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Unai Abrisketa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: attr_encrypted
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.1'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: beyond_api
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
33
|
+
version: '0.11'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
40
|
+
version: '0.11'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: blind_index
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: bourbon
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,9 +235,12 @@ files:
|
|
207
235
|
- app/assets/stylesheets/beyond_canvas/utilities/_functions.scss
|
208
236
|
- app/assets/stylesheets/beyond_canvas/utilities/_mixins.scss
|
209
237
|
- app/controllers/beyond_canvas/application_controller.rb
|
238
|
+
- app/controllers/beyond_canvas/authentications_controller.rb
|
210
239
|
- app/controllers/beyond_canvas/system_controller.rb
|
240
|
+
- app/controllers/concerns/beyond_canvas/authentication.rb
|
211
241
|
- app/controllers/concerns/beyond_canvas/locale_management.rb
|
212
242
|
- app/controllers/concerns/beyond_canvas/request_validation.rb
|
243
|
+
- app/controllers/concerns/beyond_canvas/resource_management.rb
|
213
244
|
- app/controllers/concerns/beyond_canvas/status_codes.rb
|
214
245
|
- app/form_builders/beyond_canvas/form_builder.rb
|
215
246
|
- app/helpers/beyond_canvas/application_helper.rb
|
@@ -219,6 +250,7 @@ files:
|
|
219
250
|
- app/javascript/beyond_canvas/initializers/flash.js
|
220
251
|
- app/javascript/beyond_canvas/initializers/functions.js
|
221
252
|
- app/javascript/beyond_canvas/initializers/inputs.js
|
253
|
+
- app/views/beyond_canvas/authentications/new.html.erb
|
222
254
|
- app/views/beyond_canvas/custom/_public_head.html.erb
|
223
255
|
- app/views/beyond_canvas/locales/_edit.html.erb
|
224
256
|
- app/views/beyond_canvas/mailer/_button.html.erb
|
@@ -232,20 +264,32 @@ files:
|
|
232
264
|
- app/views/layouts/beyond_canvas/public.html.erb
|
233
265
|
- config/initializers/beyond_canvas/filter_parameter_logging.rb
|
234
266
|
- config/initializers/beyond_canvas/form_utils.rb
|
267
|
+
- config/locales/en.yml
|
235
268
|
- config/routes.rb
|
236
269
|
- lib/beyond_canvas.rb
|
237
270
|
- lib/beyond_canvas/asset_registration.rb
|
238
271
|
- lib/beyond_canvas/configuration.rb
|
239
272
|
- lib/beyond_canvas/engine.rb
|
273
|
+
- lib/beyond_canvas/models/authentication.rb
|
274
|
+
- lib/beyond_canvas/models/shop.rb
|
275
|
+
- lib/beyond_canvas/models/utils.rb
|
276
|
+
- lib/beyond_canvas/parameter_sanitizer.rb
|
277
|
+
- lib/beyond_canvas/rails/routes.rb
|
240
278
|
- lib/beyond_canvas/version.rb
|
241
279
|
- lib/generators/beyond_canvas/assets/assets_generator.rb
|
242
280
|
- lib/generators/beyond_canvas/assets/templates/beyond_canvas.js
|
243
281
|
- lib/generators/beyond_canvas/assets/templates/beyond_canvas.scss
|
282
|
+
- lib/generators/beyond_canvas/auth_model/auth_model_generator.rb
|
283
|
+
- lib/generators/beyond_canvas/auth_model/templates/migration.erb
|
284
|
+
- lib/generators/beyond_canvas/auth_model/templates/model.erb
|
244
285
|
- lib/generators/beyond_canvas/beyond_api/beyond_api_generator.rb
|
286
|
+
- lib/generators/beyond_canvas/controller/controller_generator.rb
|
287
|
+
- lib/generators/beyond_canvas/controller/templates/controller.erb
|
245
288
|
- lib/generators/beyond_canvas/custom_styles/custom_styles_generator.rb
|
246
289
|
- lib/generators/beyond_canvas/custom_styles/templates/beyond_canvas_custom_styles.sass
|
247
290
|
- lib/generators/beyond_canvas/install/install_generator.rb
|
248
291
|
- lib/generators/beyond_canvas/install/templates/beyond_canvas.rb.erb
|
292
|
+
- lib/generators/beyond_canvas/views/views_generator.rb
|
249
293
|
- lib/generators/beyond_canvas/webpacker/plugins/jquery.js
|
250
294
|
- lib/generators/beyond_canvas/webpacker/templates/beyond_canvas.js
|
251
295
|
- lib/generators/beyond_canvas/webpacker/templates/beyond_canvas.scss
|
@@ -269,7 +313,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
269
313
|
- !ruby/object:Gem::Version
|
270
314
|
version: 1.3.1
|
271
315
|
requirements: []
|
272
|
-
rubygems_version: 3.0.
|
316
|
+
rubygems_version: 3.0.3
|
273
317
|
signing_key:
|
274
318
|
specification_version: 4
|
275
319
|
summary: Open-source framework that provides CSS styles
|