solidus_social 1.1.0 → 1.2.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 +4 -4
- data/.travis.yml +13 -2
- data/CHANGELOG.md +8 -0
- data/Gemfile +14 -2
- data/README.md +14 -31
- data/app/controllers/spree/admin/authentication_methods_controller.rb +0 -12
- data/app/controllers/spree/omniauth_callbacks_controller.rb +3 -3
- data/app/models/spree/authentication_method.rb +5 -1
- data/app/models/spree/social_configuration.rb +1 -0
- data/app/models/spree/user_decorator.rb +1 -1
- data/app/views/spree/admin/authentication_methods/_form.html.erb +2 -18
- data/app/views/spree/admin/authentication_methods/index.html.erb +2 -2
- data/config/locales/es-MX.yml +3 -3
- data/config/locales/it.yml +26 -0
- data/config/routes.rb +2 -2
- data/db/migrate/20120120163432_create_user_authentications.rb +1 -1
- data/db/migrate/20120123163222_create_authentication_methods.rb +1 -1
- data/lib/generators/solidus_social/install/install_generator.rb +6 -0
- data/lib/generators/solidus_social/install/templates/config/initializers/solidus_social.rb +48 -0
- data/lib/solidus_social.rb +2 -1
- data/lib/solidus_social/engine.rb +17 -18
- data/lib/solidus_social/version.rb +1 -1
- data/solidus_social.gemspec +3 -0
- data/spec/controllers/spree/omniauth_callbacks_controller_spec.rb +28 -0
- data/spec/features/spree/admin/authentication_methods_configuration_spec.rb +6 -15
- data/spec/features/spree/sign_in_spec.rb +9 -13
- data/spec/lib/spree/social_config_spec.rb +9 -0
- data/spec/lib/spree_social/engine_spec.rb +18 -11
- data/spec/models/spree/authentication_method_spec.rb +17 -0
- data/spec/models/spree/social_configuration_spec.rb +4 -0
- data/spec/models/spree/user_decorator_spec.rb +21 -0
- data/spec/support/capybara.rb +3 -10
- metadata +53 -5
- data/app/views/spree/admin/shared/_configurations_menu.html.erb +0 -4
- data/config/initializers/devise.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 140e2c41e3d39cdb72559e8eab2d16602332f7e4
|
4
|
+
data.tar.gz: 3f067cd1244a2beb69c29cef84fb24b678fd86c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 642531bdd1876b9b45bf951f5a1d996885066243f79c16c118f2f3a65fc9a6ea419e6ca653433421e00d0403354ad9f9aa07436b374880cfb08f206fb46dec0d
|
7
|
+
data.tar.gz: 6e5a6858b94fc566ba9685d381b302d8ad7a62940b35ba7deaacd6a7881c4ae4ce24558ac1801cc23a0e91f9d59d39d025a6f8fd50ebe30a3a420c7f0890274e
|
data/.travis.yml
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
-
sudo:
|
1
|
+
sudo: required
|
2
2
|
cache: bundler
|
3
3
|
language: ruby
|
4
|
+
dist: trusty
|
5
|
+
addons:
|
6
|
+
apt:
|
7
|
+
packages:
|
8
|
+
- google-chrome-beta
|
4
9
|
rvm:
|
5
|
-
- 2.3.
|
10
|
+
- 2.3.5
|
6
11
|
env:
|
7
12
|
matrix:
|
8
13
|
- SOLIDUS_BRANCH=v1.0 DB=postgres
|
@@ -11,6 +16,9 @@ env:
|
|
11
16
|
- SOLIDUS_BRANCH=v1.3 DB=postgres
|
12
17
|
- SOLIDUS_BRANCH=v1.4 DB=postgres
|
13
18
|
- SOLIDUS_BRANCH=v2.0 DB=postgres
|
19
|
+
- SOLIDUS_BRANCH=v2.1 DB=postgres
|
20
|
+
- SOLIDUS_BRANCH=v2.2 DB=postgres
|
21
|
+
- SOLIDUS_BRANCH=v2.3 DB=postgres
|
14
22
|
- SOLIDUS_BRANCH=master DB=postgres
|
15
23
|
- SOLIDUS_BRANCH=v1.0 DB=mysql
|
16
24
|
- SOLIDUS_BRANCH=v1.1 DB=mysql
|
@@ -18,4 +26,7 @@ env:
|
|
18
26
|
- SOLIDUS_BRANCH=v1.3 DB=mysql
|
19
27
|
- SOLIDUS_BRANCH=v1.4 DB=mysql
|
20
28
|
- SOLIDUS_BRANCH=v2.0 DB=mysql
|
29
|
+
- SOLIDUS_BRANCH=v2.1 DB=mysql
|
30
|
+
- SOLIDUS_BRANCH=v2.2 DB=mysql
|
31
|
+
- SOLIDUS_BRANCH=v2.3 DB=mysql
|
21
32
|
- SOLIDUS_BRANCH=master DB=mysql
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## Unreleased
|
2
|
+
|
3
|
+
* The `SolidusSocial::OAUTH_PROVIDERS` constant has been removed in favour
|
4
|
+
of the `Spree::AuthenticationMethod.providers_options` class method. This is populated using
|
5
|
+
the `Spree::SocialConfig#providers` Hash.
|
6
|
+
* Use the install generator to import the solidus social initializer into your app.
|
7
|
+
Please run `bundle exec rails g solidus_social:install` in order to upgrade.
|
8
|
+
|
1
9
|
## Solidus Social 1.0.0
|
2
10
|
|
3
11
|
* Renamed SpreeSocial to SolidusSocial
|
data/Gemfile
CHANGED
@@ -1,10 +1,22 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
|
4
|
+
|
3
5
|
branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
|
4
6
|
gem "solidus", github: "solidusio/solidus", branch: branch
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
group :test do
|
9
|
+
if branch == 'master' || branch >= "v2.0"
|
10
|
+
gem "rails-controller-testing"
|
11
|
+
end
|
12
|
+
gem 'ffaker'
|
13
|
+
end
|
14
|
+
|
15
|
+
# hack for broken bundler dependency resolution
|
16
|
+
if branch == 'master' || branch >= "v2.3"
|
17
|
+
gem 'rails', '~> 5.1.0'
|
18
|
+
elsif branch >= "v2.0"
|
19
|
+
gem 'rails', '~> 5.0.0'
|
8
20
|
end
|
9
21
|
|
10
22
|
gem 'pg'
|
data/README.md
CHANGED
@@ -22,41 +22,18 @@ $ bundle && bundle exec rails g solidus_social:install
|
|
22
22
|
$ bundle exec rake db:migrate
|
23
23
|
```
|
24
24
|
|
25
|
+
This will install a new initializer `config/initializers/solidus_social.rb` into
|
26
|
+
your project that allows you to setup the services you want configured for your app.
|
27
|
+
|
25
28
|
Optional: By default the login path will be '/users/auth/:provider'. If you
|
26
29
|
want something else, configure it in `config/initializers/solidus_social.rb`.
|
27
30
|
|
28
|
-
```ruby
|
29
|
-
Spree::SocialConfig[:path_prefix] = 'member' # for /member/auth/:provider
|
30
|
-
Spree::SocialConfig[:path_prefix] = 'profile' # for /profile/auth/:provider
|
31
|
-
Spree::SocialConfig[:path_prefix] = '' # for /auth/:provider
|
32
|
-
```
|
33
31
|
|
34
32
|
## Using OAuth Sources
|
35
33
|
|
36
34
|
Login as an admin user and navigate to Configuration > Social Authentication Methods
|
37
35
|
|
38
|
-
Click "New Authentication Method" and
|
39
|
-
below for instructions on setting up the different providers.)
|
40
|
-
|
41
|
-
Multiple key entries can now be entered based on the Rails environment. This
|
42
|
-
allows for portability and the lack of need to check in your key to your
|
43
|
-
repository. You also have the ability to enable and disable sources. These
|
44
|
-
setting will be reflected on the client UI as well.
|
45
|
-
|
46
|
-
If you store your configuration/credentials in environment variables, you can
|
47
|
-
create Authentication Methods on application boot via an initializer if they
|
48
|
-
don't already exist.
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
# Ensure our environment is bootstrapped with a Facebook Connect app
|
52
|
-
if ActiveRecord::Base.connection.table_exists? 'spree_authentication_methods'
|
53
|
-
Spree::AuthenticationMethod.where(environment: Rails.env, provider: 'facebook').first_or_create do |auth_method|
|
54
|
-
auth_method.api_key = ENV['FACEBOOK_APP_ID']
|
55
|
-
auth_method.api_secret = ENV['FACEBOOK_APP_SECRET']
|
56
|
-
auth_method.active = true
|
57
|
-
end
|
58
|
-
end
|
59
|
-
```
|
36
|
+
Click "New Authentication Method" and choose one of your configured providers.
|
60
37
|
|
61
38
|
**You MUST restart your application after configuring or updating an authentication method.**
|
62
39
|
|
@@ -91,7 +68,7 @@ Make sure you specifity the right IP address.
|
|
91
68
|
- Application Website: `http://yourhostname.local:3000` for development and
|
92
69
|
`http://your-site.com` for production
|
93
70
|
- Application Type: "Browser"
|
94
|
-
- Callback URL: `http://yourhostname.local:3000 for development and
|
71
|
+
- Callback URL: `http://yourhostname.local:3000` for development and
|
95
72
|
`http://your-site.com` for production
|
96
73
|
- Default Access Type: "Read & Write"
|
97
74
|
6. Save the application.
|
@@ -136,10 +113,16 @@ strategy][12] for them. (If there isn't, you can [write one][13].)
|
|
136
113
|
for SolidusSocial:
|
137
114
|
|
138
115
|
```ruby
|
139
|
-
|
140
|
-
|
116
|
+
|
117
|
+
config.providers = {
|
118
|
+
# The configuration key has to match your omniauth strategy.
|
119
|
+
linkedin: {
|
120
|
+
api_key: ENV['LINKEDIN_API_KEY'],
|
121
|
+
api_secret: ENV['LINKEDIN_API_SECRET'],
|
122
|
+
},
|
123
|
+
# More providers here
|
141
124
|
```
|
142
|
-
3. Activate your provider as usual
|
125
|
+
3. Activate your provider as usual.
|
143
126
|
4. Do **one** of the following:
|
144
127
|
|
145
128
|
- Override the `spree/users/social` view to render OAuth links to display
|
@@ -1,18 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
module Admin
|
3
3
|
class AuthenticationMethodsController < ResourceController
|
4
|
-
create.after :update_oauth_method
|
5
|
-
update.after :update_oauth_method
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def update_oauth_method
|
10
|
-
auth_method = params[:authentication_method]
|
11
|
-
return unless auth_method[:active] == 'true' && auth_method[:environment] == ::Rails.env
|
12
|
-
Devise.setup do |config|
|
13
|
-
config.omniauth auth_method[:provider], auth_method[:api_key], auth_method[:api_secret]
|
14
|
-
end
|
15
|
-
end
|
16
4
|
end
|
17
5
|
end
|
18
6
|
end
|
@@ -12,8 +12,8 @@ class Spree::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
provides_callback_for provider
|
15
|
+
Spree::SocialConfig.providers.keys.each do |provider|
|
16
|
+
provides_callback_for provider
|
17
17
|
end
|
18
18
|
|
19
19
|
def omniauth_callback
|
@@ -34,7 +34,7 @@ class Spree::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|
34
34
|
flash[:notice] = I18n.t('devise.sessions.signed_in')
|
35
35
|
redirect_back_or_default(account_url)
|
36
36
|
else
|
37
|
-
user = Spree
|
37
|
+
user = Spree.user_class.find_by_email(auth_hash['info']['email']) || Spree.user_class.new
|
38
38
|
user.apply_omniauth(auth_hash)
|
39
39
|
if user.save
|
40
40
|
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: auth_hash['provider'])
|
@@ -1,5 +1,9 @@
|
|
1
1
|
class Spree::AuthenticationMethod < ActiveRecord::Base
|
2
|
-
|
2
|
+
def self.provider_options
|
3
|
+
SolidusSocial.configured_providers.map { |provider_name| [provider_name.split("_").first.camelize, provider_name] }
|
4
|
+
end
|
5
|
+
|
6
|
+
validates :provider, presence: true
|
3
7
|
|
4
8
|
def self.active_authentication_methods?
|
5
9
|
where(environment: ::Rails.env, active: true).exists?
|
@@ -4,7 +4,7 @@ Spree.user_class.class_eval do
|
|
4
4
|
devise :omniauthable
|
5
5
|
|
6
6
|
def apply_omniauth(omniauth)
|
7
|
-
if
|
7
|
+
if omniauth.fetch('info', {})['email'].present?
|
8
8
|
self.email = omniauth['info']['email'] if email.blank?
|
9
9
|
end
|
10
10
|
user_authentications.build(provider: omniauth['provider'], uid: omniauth['uid'])
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class="alpha five columns">
|
3
3
|
<div data-hook="environment" class="field">
|
4
4
|
<%= f.field_container :environment do %>
|
5
|
-
<%= label_tag nil, Spree.
|
5
|
+
<%= label_tag nil, Spree::AuthenticationMethod.human_attribute_name(:environment) %>
|
6
6
|
<%= collection_select(:authentication_method, :environment, Rails.configuration.database_configuration.keys, :to_s, :titleize, {}, { class: 'select2 fullwidth' }) %>
|
7
7
|
<% end %>
|
8
8
|
</div>
|
@@ -11,23 +11,7 @@
|
|
11
11
|
<div data-hook="environment" class="field">
|
12
12
|
<%= f.field_container :provider do %>
|
13
13
|
<%= f.label :provider, Spree.t(:social_provider) %>
|
14
|
-
<%= f.select :provider,
|
15
|
-
<% end %>
|
16
|
-
</div>
|
17
|
-
</div>
|
18
|
-
<div class="alpha five columns">
|
19
|
-
<div data-hook="environment" class="field">
|
20
|
-
<%= f.field_container :api_key do %>
|
21
|
-
<%= f.label :api_key, Spree.t(:social_api_key) %> <span class="required">*</span><br />
|
22
|
-
<%= f.text_field :api_key, class: 'fullwidth' %>
|
23
|
-
<% end %>
|
24
|
-
</div>
|
25
|
-
</div>
|
26
|
-
<div class="alpha five columns">
|
27
|
-
<div data-hook="environment" class="field">
|
28
|
-
<%= f.field_container :api_secret do %>
|
29
|
-
<%= f.label :api_secret, Spree.t(:social_api_secret) %> <span class="required">*</span><br />
|
30
|
-
<%= f.text_field :api_secret, class: 'fullwidth' %>
|
14
|
+
<%= f.select :provider, Spree::AuthenticationMethod.provider_options, {}, { include_blank: false, class: 'select2 fullwidth' } %>
|
31
15
|
<% end %>
|
32
16
|
</div>
|
33
17
|
</div>
|
@@ -34,8 +34,8 @@
|
|
34
34
|
<% @authentication_methods.each do |method|%>
|
35
35
|
<tr id="<%= dom_id method %>" data-hook="admin_trackers_index_rows">
|
36
36
|
<td class="align-center"><%= method.provider %></td>
|
37
|
-
<td class="align-center"><%= truncate method.api_key, length:
|
38
|
-
<td class="align-center"><%= truncate method.api_secret, length:
|
37
|
+
<td class="align-center"><%= truncate method.api_key, length: 10 %></td>
|
38
|
+
<td class="align-center"><%= truncate method.api_secret, length: 10 %></td>
|
39
39
|
<td class="align-center"><%= method.environment.to_s.titleize %></td>
|
40
40
|
<td class="align-center"><%= method.active ? Spree.t(:yes) : Spree.t(:no) %></td>
|
41
41
|
<td class="actions">
|
data/config/locales/es-MX.yml
CHANGED
@@ -7,11 +7,11 @@ es-MX:
|
|
7
7
|
user_was_not_valid: "El usuario no fue válido."
|
8
8
|
add_another_service: 'Añadir otro servicio para inicio de sesión:'
|
9
9
|
authentications:
|
10
|
-
destroy: 'Método de autenticación
|
10
|
+
destroy: 'Método de autenticación eliminado exitosamente.'
|
11
11
|
back_to_authentication_methods_list: "Volver a la lista de métodos de autenticación"
|
12
12
|
edit_social_method: 'Editando metodo de autenticación'
|
13
13
|
new_social_method: 'Nuevo método de autenticación'
|
14
|
-
no_authentication_methods_found: "No se encuentran
|
14
|
+
no_authentication_methods_found: "No se encuentran ningún método de autenticación"
|
15
15
|
one_more_step: 'Un paso más para completar tu registro desde %{kind}'
|
16
16
|
remove_authentication_option_confirmation: '¿Está seguro que quiere eliminar este método de autenticación?'
|
17
17
|
sign_into_account: 'Puedes iniciar sesión usando:'
|
@@ -22,5 +22,5 @@ es-MX:
|
|
22
22
|
social_authentication_methods_description: 'Configurar métodos de autenticación de OAuth'
|
23
23
|
social_provider: 'Proveedor social'
|
24
24
|
please_confirm_your_email: 'Por favor confirme su email para continuar'
|
25
|
-
sign_in_with: '
|
25
|
+
sign_in_with: 'Autenticado con %{provider}'
|
26
26
|
you_have_signed_in_with_these_services: "Has iniciado sesión con estos servicios"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
it:
|
3
|
+
devise:
|
4
|
+
omniauth_callbacks:
|
5
|
+
success: "Sei ora loggato con il tuo account di tipo %{kind}."
|
6
|
+
spree:
|
7
|
+
user_was_not_valid: L'utente non è valido
|
8
|
+
add_another_service: "Aggiungi un servizio per il log-in:"
|
9
|
+
authentications:
|
10
|
+
destroy: 'Metodo di autenticazione cancellato con successo.'
|
11
|
+
back_to_authentication_methods_list: "Torna alla lista dei metodi di autenticazione"
|
12
|
+
edit_social_method: "Modifica metodo di autenticazione social"
|
13
|
+
new_social_method: "Nuovo metodo di autenticazione"
|
14
|
+
no_authentication_methods_found: "Nessun metodo di autenticazione trovato"
|
15
|
+
one_more_step: 'Un altro passo per completare il processo di autenticazione %{kind}'
|
16
|
+
remove_authentication_option_confirmation: "Sei sicuro di voler cancellare questo metodo di autenticazione?"
|
17
|
+
sign_into_account: "Puoi fare log-in utilizzando:"
|
18
|
+
sign_in_through_one_of_these_services: "Entra con uno di questi servizi:"
|
19
|
+
social_api_key: "API Key"
|
20
|
+
social_api_secret: "API Secret"
|
21
|
+
social_authentication_methods: "Metodi di autenticazione social"
|
22
|
+
social_authentication_methods_description: "Setup metodi di autenticazione OAuth"
|
23
|
+
social_provider: "Social Provider"
|
24
|
+
please_confirm_your_email: "Per favore, conferma il tuo indirizzo e-mail per continuare."
|
25
|
+
sign_in_with: "Login con %{provider}"
|
26
|
+
you_have_signed_in_with_these_services: "Hai fatto log-in con questi servizi"
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
Spree::Core::Engine.
|
1
|
+
Spree::Core::Engine.routes.draw do
|
2
2
|
devise_for :spree_user,
|
3
|
-
class_name: Spree
|
3
|
+
class_name: Spree.user_class,
|
4
4
|
only: [:omniauth_callbacks],
|
5
5
|
controllers: { omniauth_callbacks: 'spree/omniauth_callbacks' },
|
6
6
|
path: Spree::SocialConfig[:path_prefix]
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module SolidusSocial
|
2
2
|
module Generators
|
3
3
|
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.dirname(__FILE__) + "/templates"
|
5
|
+
|
4
6
|
class_option :auto_run_migrations, type: :boolean, default: false
|
5
7
|
|
6
8
|
def add_stylesheets
|
@@ -11,6 +13,10 @@ module SolidusSocial
|
|
11
13
|
run 'bundle exec rake railties:install:migrations FROM=solidus_social'
|
12
14
|
end
|
13
15
|
|
16
|
+
def copy_initializer
|
17
|
+
template "config/initializers/solidus_social.rb"
|
18
|
+
end
|
19
|
+
|
14
20
|
def run_migrations
|
15
21
|
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
|
16
22
|
if run_migrations
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Spree::SocialConfig.configure do |config|
|
2
|
+
config.use_static_preferences!
|
3
|
+
|
4
|
+
# Configure the Path prefix for OAuth paths
|
5
|
+
# The default is /user/auth/:provider
|
6
|
+
#
|
7
|
+
# for /member/auth/:provider
|
8
|
+
# config.path_prefix = 'member'
|
9
|
+
# for /profile/auth/:provider
|
10
|
+
# config.path_prefix = 'profile'
|
11
|
+
# for /auth/:provider
|
12
|
+
# config.path_prefix = ''
|
13
|
+
|
14
|
+
config.providers = {
|
15
|
+
facebook: {
|
16
|
+
api_key: ENV['FACEBOOK_API_KEY'],
|
17
|
+
api_secret: ENV['FACEBOOK_API_SECRET'],
|
18
|
+
},
|
19
|
+
twitter: {
|
20
|
+
api_key: ENV['TWITTER_API_KEY'],
|
21
|
+
api_secret: ENV['TWITTER_API_SECRET'],
|
22
|
+
},
|
23
|
+
github: {
|
24
|
+
api_key: ENV['GITHUB_API_KEY'],
|
25
|
+
api_secret: ENV['GITHUB_API_SECRET'],
|
26
|
+
},
|
27
|
+
google_oauth2: {
|
28
|
+
api_key: ENV['GOOGLE_OAUTH2_API_KEY'],
|
29
|
+
api_secret: ENV['GOOGLE_OAUTH2_API_SECRET'],
|
30
|
+
},
|
31
|
+
amazon: {
|
32
|
+
api_key: ENV['AMAZON_API_KEY'],
|
33
|
+
api_secret: ENV['AMAZON_API_SECRET'],
|
34
|
+
}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
SolidusSocial.init_providers
|
39
|
+
|
40
|
+
OmniAuth.config.logger = Logger.new(STDOUT)
|
41
|
+
OmniAuth.logger.progname = 'omniauth'
|
42
|
+
|
43
|
+
OmniAuth.config.on_failure = proc do |env|
|
44
|
+
env['devise.mapping'] = Devise.mappings[Spree.user_class.table_name.singularize.to_sym]
|
45
|
+
controller_name = ActiveSupport::Inflector.camelize(env['devise.mapping'].controllers[:omniauth_callbacks])
|
46
|
+
controller_klass = ActiveSupport::Inflector.constantize("#{controller_name}Controller")
|
47
|
+
controller_klass.action(:failure).call(env)
|
48
|
+
end
|
data/lib/solidus_social.rb
CHANGED
@@ -1,12 +1,4 @@
|
|
1
1
|
module SolidusSocial
|
2
|
-
OAUTH_PROVIDERS = [
|
3
|
-
%w(Facebook facebook),
|
4
|
-
%w(Twitter twitter),
|
5
|
-
%w(Github github),
|
6
|
-
%w(Google google_oauth2),
|
7
|
-
%w(Amazon amazon)
|
8
|
-
]
|
9
|
-
|
10
2
|
class Engine < Rails::Engine
|
11
3
|
engine_name 'solidus_social'
|
12
4
|
|
@@ -16,6 +8,16 @@ module SolidusSocial
|
|
16
8
|
Spree::SocialConfig = Spree::SocialConfiguration.new
|
17
9
|
end
|
18
10
|
|
11
|
+
initializer 'solidus_social.decorate_spree_user' do
|
12
|
+
next unless Rails.application.respond_to?(:reloader)
|
13
|
+
|
14
|
+
Rails.application.reloader.after_class_unload do
|
15
|
+
# Reload and decorate the spree user class immediately after it is
|
16
|
+
# unloaded so that it is available to devise when loading routes
|
17
|
+
load File.join(__dir__, '../../app/models/spree/user_decorator.rb')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
19
21
|
def self.activate
|
20
22
|
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
21
23
|
Rails.configuration.cache_classes ? require(c) : load(c)
|
@@ -25,17 +27,14 @@ module SolidusSocial
|
|
25
27
|
config.to_prepare(&method(:activate).to_proc)
|
26
28
|
end
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
secret = auth_method.api_secret
|
36
|
-
Rails.logger.info("[Spree Social] Loading #{auth_method.provider.capitalize} as authentication source")
|
30
|
+
def self.configured_providers
|
31
|
+
Spree::SocialConfig.providers.keys.map(&:to_s)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.init_providers
|
35
|
+
Spree::SocialConfig.providers.each do |provider, credentials|
|
36
|
+
setup_key_for(provider, credentials[:api_key], credentials[:api_secret])
|
37
37
|
end
|
38
|
-
setup_key_for(provider.to_sym, key, secret)
|
39
38
|
end
|
40
39
|
|
41
40
|
def self.setup_key_for(provider, key, secret)
|
data/solidus_social.gemspec
CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.requirements << 'none'
|
23
23
|
|
24
24
|
s.add_runtime_dependency 'solidus_core', [">= 1.0", "< 3"]
|
25
|
+
s.add_runtime_dependency 'solidus_support'
|
25
26
|
s.add_runtime_dependency 'solidus_auth_devise'
|
26
27
|
s.add_runtime_dependency 'omniauth'
|
27
28
|
s.add_runtime_dependency 'oa-core'
|
@@ -32,10 +33,12 @@ Gem::Specification.new do |s|
|
|
32
33
|
s.add_runtime_dependency 'omniauth-amazon'
|
33
34
|
|
34
35
|
s.add_development_dependency 'capybara', '~> 2.4'
|
36
|
+
s.add_development_dependency 'capybara-screenshot'
|
35
37
|
s.add_development_dependency 'database_cleaner', '1.3'
|
36
38
|
s.add_development_dependency 'rspec-rails', '~> 3.1'
|
37
39
|
s.add_development_dependency 'factory_girl', '~> 4.4'
|
38
40
|
s.add_development_dependency 'selenium-webdriver', '>= 2.41.0'
|
41
|
+
s.add_development_dependency 'chromedriver-helper'
|
39
42
|
s.add_development_dependency 'poltergeist', '~> 1.5'
|
40
43
|
s.add_development_dependency 'simplecov', '~> 0.9.0'
|
41
44
|
s.add_development_dependency 'sqlite3', '~> 1.3.10'
|
@@ -141,6 +141,34 @@ RSpec.describe Spree::OmniauthCallbacksController, type: :controller do
|
|
141
141
|
expect(controller).to receive(:sign_in_and_redirect)
|
142
142
|
expect { controller.twitter }.to change(Spree::User, :count).by(1)
|
143
143
|
end
|
144
|
+
|
145
|
+
context 'when `Spree.user_class` has changed' do
|
146
|
+
before do
|
147
|
+
@previous_user_class = Spree.user_class.to_s
|
148
|
+
Spree.user_class = Spree::LegacyUser.to_s
|
149
|
+
|
150
|
+
# the application was initialized with Spree::User, so some
|
151
|
+
# some methods do not exist on LegacyUser. In practice, this will
|
152
|
+
# not happen as Spree.user_class will not change on the fly like
|
153
|
+
# this.
|
154
|
+
# this statement simply stubs the required missing method
|
155
|
+
allow_any_instance_of(Spree::LegacyUser)
|
156
|
+
.to receive(:apply_omniauth)
|
157
|
+
end
|
158
|
+
|
159
|
+
after do
|
160
|
+
# in order to not affect other tests, restore the original class
|
161
|
+
Spree.user_class = @previous_user_class
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'creates a new user' do
|
165
|
+
expect(Spree::User).not_to receive :new
|
166
|
+
expect_any_instance_of(Spree::User).not_to receive :save
|
167
|
+
|
168
|
+
expect { controller.twitter }
|
169
|
+
.to change(Spree::LegacyUser, :count).by(1)
|
170
|
+
end
|
171
|
+
end
|
144
172
|
end
|
145
173
|
|
146
174
|
context 'email belongs to existing user' do
|
@@ -21,20 +21,12 @@ RSpec.feature 'Admin Authentication Methods', :js do
|
|
21
21
|
|
22
22
|
click_link 'New Authentication Method'
|
23
23
|
expect(page).to have_text /BACK TO AUTHENTICATION METHODS LIST/i
|
24
|
-
|
24
|
+
select2 'Test', from: 'Environment'
|
25
25
|
select2 'Github', from: 'Social Provider'
|
26
|
-
fill_in 'API Key', with: 'KEY123'
|
27
|
-
fill_in 'API Secret', with: 'SEC123'
|
28
26
|
|
29
27
|
click_button 'Create'
|
30
28
|
expect(page).to have_text 'successfully created!'
|
31
29
|
end
|
32
|
-
|
33
|
-
scenario 'does not save with empty fields' do
|
34
|
-
click_link 'New Authentication Method'
|
35
|
-
click_button 'Create'
|
36
|
-
expect(page).to have_text 'errors prohibited this record from being saved'
|
37
|
-
end
|
38
30
|
end
|
39
31
|
|
40
32
|
context 'when auth method exists' do
|
@@ -58,20 +50,19 @@ RSpec.feature 'Admin Authentication Methods', :js do
|
|
58
50
|
click_icon :edit
|
59
51
|
end
|
60
52
|
|
61
|
-
|
62
|
-
fill_in 'API Secret', with: 'fake'
|
53
|
+
find('#authentication_method_active_false').click
|
63
54
|
|
64
55
|
click_button 'Update'
|
65
56
|
expect(page).to have_text 'successfully updated!'
|
66
57
|
end
|
67
58
|
|
68
59
|
scenario 'can be deleted' do
|
69
|
-
|
70
|
-
|
60
|
+
accept_alert do
|
61
|
+
within_row(1) do
|
62
|
+
click_icon :trash
|
63
|
+
end
|
71
64
|
end
|
72
65
|
|
73
|
-
page.driver.browser.switch_to.alert.accept unless Capybara.javascript_driver == :poltergeist
|
74
|
-
|
75
66
|
expect(page).to have_text 'successfully removed!'
|
76
67
|
expect(page).not_to have_text authentication_method.provider
|
77
68
|
end
|
@@ -24,30 +24,27 @@ RSpec.feature 'signing in using Omniauth', :js do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
scenario 'going to sign in' do
|
27
|
-
visit spree.
|
28
|
-
|
29
|
-
find('a[title="Login with facebook"]').trigger('click')
|
27
|
+
visit spree.login_path
|
28
|
+
click_on 'Login with facebook'
|
30
29
|
expect(page).to have_text 'You are now signed in with your facebook account.'
|
31
30
|
click_link 'Logout'
|
32
31
|
click_link 'Login'
|
33
|
-
|
32
|
+
click_on 'Login with facebook'
|
34
33
|
expect(page).to have_text 'You are now signed in with your facebook account.'
|
35
34
|
end
|
36
35
|
|
37
36
|
# Regression test for #91
|
38
37
|
scenario "attempting to view 'My Account' works" do
|
39
|
-
visit spree.
|
40
|
-
|
41
|
-
find('a[title="Login with facebook"]').trigger('click')
|
38
|
+
visit spree.login_path
|
39
|
+
click_on 'Login with facebook'
|
42
40
|
expect(page).to have_text 'You are now signed in with your facebook account.'
|
43
41
|
click_link 'My Account'
|
44
42
|
expect(page).to have_text 'My Account'
|
45
43
|
end
|
46
44
|
|
47
45
|
scenario "view 'My Account'" do
|
48
|
-
visit spree.
|
49
|
-
|
50
|
-
find('a[title="Login with facebook"]').trigger('click')
|
46
|
+
visit spree.login_path
|
47
|
+
click_on 'Login with facebook'
|
51
48
|
expect(page).to have_text 'You are now signed in with your facebook account.'
|
52
49
|
click_link 'My Account'
|
53
50
|
expect(page).not_to have_selector 'div#social-signin-links'
|
@@ -78,9 +75,8 @@ RSpec.feature 'signing in using Omniauth', :js do
|
|
78
75
|
end
|
79
76
|
|
80
77
|
scenario 'going to sign in' do
|
81
|
-
visit spree.
|
82
|
-
|
83
|
-
find('a[title="Login with twitter"]').trigger('click')
|
78
|
+
visit spree.login_path
|
79
|
+
click_on 'Login with twitter'
|
84
80
|
expect(page).to have_text 'Please confirm your email address to continue'.upcase
|
85
81
|
fill_in 'Email', with: 'user@example.com'
|
86
82
|
click_button 'Create'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
RSpec.describe Spree::SocialConfig do
|
2
|
+
it "changing a preference does not create a Spree::Preference" do
|
3
|
+
expect { subject.path_prefix = 'customer' }.not_to change(Spree::Preference, :count)
|
4
|
+
end
|
5
|
+
|
6
|
+
it "holds configuration for the five default providers" do
|
7
|
+
expect(subject.providers.keys).to match_array([:amazon, :facebook, :github, :google_oauth2, :twitter])
|
8
|
+
end
|
9
|
+
end
|
@@ -1,16 +1,23 @@
|
|
1
1
|
RSpec.describe SolidusSocial do
|
2
|
-
|
3
|
-
|
2
|
+
describe '.configured_providers' do
|
3
|
+
subject { described_class.configured_providers }
|
4
4
|
|
5
|
-
it
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
it { is_expected.to match_array(["amazon", "facebook", "github", "google_oauth2", "twitter"]) }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.init_providers' do
|
9
|
+
subject { described_class.init_providers }
|
10
|
+
|
11
|
+
around do |example|
|
12
|
+
previous_providers = Spree::SocialConfig.providers
|
13
|
+
Spree::SocialConfig.providers = { facebook: { api_key: "secret_key", api_secret: "secret_secret" } }
|
14
|
+
example.run
|
15
|
+
Spree::SocialConfig.providers = previous_providers
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets up Devise for the given providers" do
|
19
|
+
expect(SolidusSocial).to receive(:setup_key_for).with(:facebook, "secret_key", "secret_secret")
|
20
|
+
subject
|
14
21
|
end
|
15
22
|
end
|
16
23
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
RSpec.describe Spree::AuthenticationMethod do
|
2
|
+
describe '.provider_options' do
|
3
|
+
let(:expected_provider_options) do
|
4
|
+
[
|
5
|
+
%w(Amazon amazon),
|
6
|
+
%w(Facebook facebook),
|
7
|
+
%w(Twitter twitter),
|
8
|
+
%w(Github github),
|
9
|
+
%w(Google google_oauth2)
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { described_class.provider_options }
|
14
|
+
|
15
|
+
it { is_expected.to match_array(expected_provider_options) }
|
16
|
+
end
|
17
|
+
end
|
@@ -21,6 +21,27 @@ RSpec.describe Spree::User, type: :model do
|
|
21
21
|
expect(user.email).to eq 'test@example.com'
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
context 'instance is valid' do
|
26
|
+
let(:user) { create(:user) { |user| user.email = nil } }
|
27
|
+
let(:omni_params) do
|
28
|
+
{
|
29
|
+
'provider' => 'any_provider',
|
30
|
+
'uid' => 12_345,
|
31
|
+
'info' => { 'email' => 'test@example.com' }
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
before do
|
36
|
+
allow(auths).to receive(:build)
|
37
|
+
allow(auths).to receive(:empty?).and_return(false)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'builds a valid user' do
|
41
|
+
user.apply_omniauth(omni_params)
|
42
|
+
expect(user.valid?).to be_truthy
|
43
|
+
end
|
44
|
+
end
|
24
45
|
end
|
25
46
|
|
26
47
|
context '.password_required?' do
|
data/spec/support/capybara.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
1
|
require 'capybara/rspec'
|
2
2
|
require 'capybara/rails'
|
3
3
|
require 'capybara/poltergeist'
|
4
|
+
require 'capybara-screenshot/rspec'
|
5
|
+
require 'selenium-webdriver'
|
4
6
|
|
5
7
|
RSpec.configure do |config|
|
6
8
|
config.include Rack::Test::Methods, type: :requests
|
7
9
|
|
8
|
-
Capybara.javascript_driver = :
|
9
|
-
Capybara.register_driver(:poltergeist) do |app|
|
10
|
-
Capybara::Poltergeist::Driver.new app, js_errors: true, timeout: 60
|
11
|
-
end
|
12
|
-
|
13
|
-
config.before(:each, :js) do
|
14
|
-
if Capybara.javascript_driver == :selenium
|
15
|
-
page.driver.browser.manage.window.maximize
|
16
|
-
end
|
17
|
-
end
|
10
|
+
Capybara.javascript_driver = :selenium_chrome_headless
|
18
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus_social
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Dyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus_core
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '3'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: solidus_support
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: solidus_auth_devise
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,6 +170,20 @@ dependencies:
|
|
156
170
|
- - "~>"
|
157
171
|
- !ruby/object:Gem::Version
|
158
172
|
version: '2.4'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: capybara-screenshot
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0'
|
159
187
|
- !ruby/object:Gem::Dependency
|
160
188
|
name: database_cleaner
|
161
189
|
requirement: !ruby/object:Gem::Requirement
|
@@ -212,6 +240,20 @@ dependencies:
|
|
212
240
|
- - ">="
|
213
241
|
- !ruby/object:Gem::Version
|
214
242
|
version: 2.41.0
|
243
|
+
- !ruby/object:Gem::Dependency
|
244
|
+
name: chromedriver-helper
|
245
|
+
requirement: !ruby/object:Gem::Requirement
|
246
|
+
requirements:
|
247
|
+
- - ">="
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: '0'
|
250
|
+
type: :development
|
251
|
+
prerelease: false
|
252
|
+
version_requirements: !ruby/object:Gem::Requirement
|
253
|
+
requirements:
|
254
|
+
- - ">="
|
255
|
+
- !ruby/object:Gem::Version
|
256
|
+
version: '0'
|
215
257
|
- !ruby/object:Gem::Dependency
|
216
258
|
name: poltergeist
|
217
259
|
requirement: !ruby/object:Gem::Requirement
|
@@ -320,17 +362,16 @@ files:
|
|
320
362
|
- app/views/spree/admin/authentication_methods/edit.html.erb
|
321
363
|
- app/views/spree/admin/authentication_methods/index.html.erb
|
322
364
|
- app/views/spree/admin/authentication_methods/new.html.erb
|
323
|
-
- app/views/spree/admin/shared/_configurations_menu.html.erb
|
324
365
|
- app/views/spree/shared/_social.html.erb
|
325
366
|
- app/views/spree/shared/_user_form.html.erb
|
326
367
|
- app/views/spree/users/_new-customer.html.erb
|
327
368
|
- app/views/spree/users/_social.html.erb
|
328
369
|
- bin/rails
|
329
|
-
- config/initializers/devise.rb
|
330
370
|
- config/locales/de.yml
|
331
371
|
- config/locales/en.yml
|
332
372
|
- config/locales/es-MX.yml
|
333
373
|
- config/locales/fr.yml
|
374
|
+
- config/locales/it.yml
|
334
375
|
- config/locales/nl.yml
|
335
376
|
- config/locales/pt-BR.yml
|
336
377
|
- config/locales/sv.yml
|
@@ -338,6 +379,7 @@ files:
|
|
338
379
|
- db/migrate/20120120163432_create_user_authentications.rb
|
339
380
|
- db/migrate/20120123163222_create_authentication_methods.rb
|
340
381
|
- lib/generators/solidus_social/install/install_generator.rb
|
382
|
+
- lib/generators/solidus_social/install/templates/config/initializers/solidus_social.rb
|
341
383
|
- lib/solidus_social.rb
|
342
384
|
- lib/solidus_social/engine.rb
|
343
385
|
- lib/solidus_social/version.rb
|
@@ -345,7 +387,10 @@ files:
|
|
345
387
|
- spec/controllers/spree/omniauth_callbacks_controller_spec.rb
|
346
388
|
- spec/features/spree/admin/authentication_methods_configuration_spec.rb
|
347
389
|
- spec/features/spree/sign_in_spec.rb
|
390
|
+
- spec/lib/spree/social_config_spec.rb
|
348
391
|
- spec/lib/spree_social/engine_spec.rb
|
392
|
+
- spec/models/spree/authentication_method_spec.rb
|
393
|
+
- spec/models/spree/social_configuration_spec.rb
|
349
394
|
- spec/models/spree/user_decorator_spec.rb
|
350
395
|
- spec/spec_helper.rb
|
351
396
|
- spec/support/capybara.rb
|
@@ -374,7 +419,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
374
419
|
requirements:
|
375
420
|
- none
|
376
421
|
rubyforge_project:
|
377
|
-
rubygems_version: 2.
|
422
|
+
rubygems_version: 2.6.11
|
378
423
|
signing_key:
|
379
424
|
specification_version: 4
|
380
425
|
summary: Adds social network login services (OAuth) to Spree
|
@@ -382,7 +427,10 @@ test_files:
|
|
382
427
|
- spec/controllers/spree/omniauth_callbacks_controller_spec.rb
|
383
428
|
- spec/features/spree/admin/authentication_methods_configuration_spec.rb
|
384
429
|
- spec/features/spree/sign_in_spec.rb
|
430
|
+
- spec/lib/spree/social_config_spec.rb
|
385
431
|
- spec/lib/spree_social/engine_spec.rb
|
432
|
+
- spec/models/spree/authentication_method_spec.rb
|
433
|
+
- spec/models/spree/social_configuration_spec.rb
|
386
434
|
- spec/models/spree/user_decorator_spec.rb
|
387
435
|
- spec/spec_helper.rb
|
388
436
|
- spec/support/capybara.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
SolidusSocial::OAUTH_PROVIDERS.each do |provider|
|
2
|
-
SolidusSocial.init_provider(provider[1])
|
3
|
-
end
|
4
|
-
|
5
|
-
OmniAuth.config.logger = Logger.new(STDOUT)
|
6
|
-
OmniAuth.logger.progname = 'omniauth'
|
7
|
-
|
8
|
-
OmniAuth.config.on_failure = proc do |env|
|
9
|
-
env['devise.mapping'] = Devise.mappings[Spree.user_class.table_name.singularize.to_sym]
|
10
|
-
controller_name = ActiveSupport::Inflector.camelize(env['devise.mapping'].controllers[:omniauth_callbacks])
|
11
|
-
controller_klass = ActiveSupport::Inflector.constantize("#{controller_name}Controller")
|
12
|
-
controller_klass.action(:failure).call(env)
|
13
|
-
end
|