solidus_auth_devise 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE.md +26 -0
  7. data/README.md +88 -0
  8. data/Rakefile +21 -0
  9. data/app/controllers/metal_decorator.rb +6 -0
  10. data/app/mailers/spree/user_mailer.rb +15 -0
  11. data/app/models/spree/auth_configuration.rb +7 -0
  12. data/app/models/spree/user.rb +50 -0
  13. data/app/overrides/auth_shared_login_bar.rb +7 -0
  14. data/app/overrides/spree/admin/shared/_header/auth_admin_login_navigation_bar.html.erb.deface +4 -0
  15. data/bin/rails +7 -0
  16. data/config/initializers/devise.rb +137 -0
  17. data/config/initializers/warden.rb +14 -0
  18. data/config/locales/de.yml +49 -0
  19. data/config/locales/en.yml +55 -0
  20. data/config/locales/es.yml +49 -0
  21. data/config/locales/fr.yml +49 -0
  22. data/config/locales/it.yml +76 -0
  23. data/config/locales/nl.yml +49 -0
  24. data/config/locales/pt-BR.yml +51 -0
  25. data/config/locales/tr.yml +49 -0
  26. data/config/routes.rb +48 -0
  27. data/db/default/users.rb +83 -0
  28. data/db/migrate/20101026184949_create_users.rb +29 -0
  29. data/db/migrate/20101026184950_rename_columns_for_devise.rb +37 -0
  30. data/db/migrate/20101214150824_convert_user_remember_field.rb +11 -0
  31. data/db/migrate/20120203010234_add_reset_password_sent_at_to_spree_users.rb +8 -0
  32. data/db/migrate/20120605211305_make_users_email_index_unique.rb +9 -0
  33. data/db/migrate/20140904000425_add_deleted_at_to_users.rb +6 -0
  34. data/db/migrate/20141002154641_add_confirmable_to_users.rb +7 -0
  35. data/db/seeds.rb +5 -0
  36. data/lib/assets/javascripts/spree/backend/solidus_auth.js +1 -0
  37. data/lib/assets/javascripts/spree/frontend/solidus_auth.js +1 -0
  38. data/lib/assets/stylesheets/spree/backend/solidus_auth.css +3 -0
  39. data/lib/assets/stylesheets/spree/frontend/solidus_auth.css +3 -0
  40. data/lib/controllers/backend/spree/admin/admin_controller_decorator.rb +26 -0
  41. data/lib/controllers/backend/spree/admin/admin_orders_controller_decorator.rb +20 -0
  42. data/lib/controllers/backend/spree/admin/admin_resource_controller_decorator.rb +3 -0
  43. data/lib/controllers/backend/spree/admin/orders/customer_details_controller_decorator.rb +15 -0
  44. data/lib/controllers/backend/spree/admin/user_passwords_controller.rb +45 -0
  45. data/lib/controllers/backend/spree/admin/user_sessions_controller.rb +47 -0
  46. data/lib/controllers/frontend/spree/checkout_controller_decorator.rb +47 -0
  47. data/lib/controllers/frontend/spree/user_confirmations_controller.rb +21 -0
  48. data/lib/controllers/frontend/spree/user_passwords_controller.rb +53 -0
  49. data/lib/controllers/frontend/spree/user_registrations_controller.rb +72 -0
  50. data/lib/controllers/frontend/spree/user_sessions_controller.rb +53 -0
  51. data/lib/controllers/frontend/spree/users_controller.rb +57 -0
  52. data/lib/generators/spree/auth/install/install_generator.rb +26 -0
  53. data/lib/generators/spree/auth/install/templates/config/initializers/devise.rb +1 -0
  54. data/lib/solidus/auth.rb +2 -0
  55. data/lib/solidus_auth_devise.rb +5 -0
  56. data/lib/spree/auth/devise.rb +20 -0
  57. data/lib/spree/auth/engine.rb +77 -0
  58. data/lib/spree/authentication_helpers.rb +26 -0
  59. data/lib/tasks/auth.rake +9 -0
  60. data/lib/views/backend/spree/admin/user_passwords/edit.html.erb +15 -0
  61. data/lib/views/backend/spree/admin/user_passwords/new.html.erb +17 -0
  62. data/lib/views/backend/spree/admin/user_sessions/authorization_failure.html.erb +4 -0
  63. data/lib/views/backend/spree/admin/user_sessions/new.html.erb +31 -0
  64. data/lib/views/backend/spree/layouts/admin/_login_nav.html.erb +13 -0
  65. data/lib/views/frontend/spree/checkout/registration.html.erb +22 -0
  66. data/lib/views/frontend/spree/shared/_flashes.html.erb +9 -0
  67. data/lib/views/frontend/spree/shared/_login.html.erb +18 -0
  68. data/lib/views/frontend/spree/shared/_login_bar.html.erb +6 -0
  69. data/lib/views/frontend/spree/shared/_user_form.html.erb +17 -0
  70. data/lib/views/frontend/spree/user_mailer/confirmation_instructions.text.erb +5 -0
  71. data/lib/views/frontend/spree/user_mailer/reset_password_instructions.text.erb +10 -0
  72. data/lib/views/frontend/spree/user_passwords/edit.html.erb +17 -0
  73. data/lib/views/frontend/spree/user_passwords/new.html.erb +17 -0
  74. data/lib/views/frontend/spree/user_registrations/new.html.erb +21 -0
  75. data/lib/views/frontend/spree/user_sessions/authorization_failure.html.erb +4 -0
  76. data/lib/views/frontend/spree/user_sessions/new.html.erb +13 -0
  77. data/lib/views/frontend/spree/users/edit.html.erb +14 -0
  78. data/lib/views/frontend/spree/users/show.html.erb +43 -0
  79. data/solidus_auth_devise.gemspec +42 -0
  80. data/spec/controllers/spree/admin/orders_controller_spec.rb +14 -0
  81. data/spec/controllers/spree/checkout_controller_spec.rb +141 -0
  82. data/spec/controllers/spree/products_controller_spec.rb +21 -0
  83. data/spec/controllers/spree/user_passwords_controller_spec.rb +44 -0
  84. data/spec/controllers/spree/user_registrations_controller_spec.rb +13 -0
  85. data/spec/controllers/spree/user_sessions_controller_spec.rb +56 -0
  86. data/spec/controllers/spree/users_controller_spec.rb +38 -0
  87. data/spec/factories/confirmed_user.rb +7 -0
  88. data/spec/features/account_spec.rb +58 -0
  89. data/spec/features/admin/orders_spec.rb +29 -0
  90. data/spec/features/admin/password_reset_spec.rb +24 -0
  91. data/spec/features/admin/payment_methods_spec.rb +16 -0
  92. data/spec/features/admin/products_spec.rb +9 -0
  93. data/spec/features/admin/sign_in_spec.rb +44 -0
  94. data/spec/features/admin/sign_out_spec.rb +22 -0
  95. data/spec/features/admin_permissions_spec.rb +46 -0
  96. data/spec/features/change_email_spec.rb +24 -0
  97. data/spec/features/checkout_spec.rb +165 -0
  98. data/spec/features/confirmation_spec.rb +28 -0
  99. data/spec/features/order_spec.rb +62 -0
  100. data/spec/features/password_reset_spec.rb +24 -0
  101. data/spec/features/sign_in_spec.rb +52 -0
  102. data/spec/features/sign_out_spec.rb +25 -0
  103. data/spec/features/sign_up_spec.rb +30 -0
  104. data/spec/mailers/user_mailer_spec.rb +46 -0
  105. data/spec/models/order_spec.rb +26 -0
  106. data/spec/models/user_spec.rb +58 -0
  107. data/spec/spec_helper.rb +25 -0
  108. data/spec/support/ability.rb +15 -0
  109. data/spec/support/authentication_helpers.rb +14 -0
  110. data/spec/support/capybara.rb +7 -0
  111. data/spec/support/confirm_helpers.rb +11 -0
  112. data/spec/support/database_cleaner.rb +18 -0
  113. data/spec/support/email.rb +5 -0
  114. data/spec/support/factory_girl.rb +5 -0
  115. data/spec/support/spree.rb +26 -0
  116. metadata +452 -0
@@ -0,0 +1,21 @@
1
+ class Spree::UserConfirmationsController < Devise::ConfirmationsController
2
+ helper 'spree/base', 'spree/store'
3
+
4
+ if Spree::Auth::Engine.dash_available?
5
+ helper 'spree/analytics'
6
+ end
7
+
8
+ include Spree::Core::ControllerHelpers::Auth
9
+ include Spree::Core::ControllerHelpers::Common
10
+ include Spree::Core::ControllerHelpers::Order
11
+ include Spree::Core::ControllerHelpers::SSL
12
+ include Spree::Core::ControllerHelpers::Store
13
+
14
+ ssl_required
15
+
16
+ protected
17
+
18
+ def after_confirmation_path_for(resource_name, resource)
19
+ signed_in?(resource_name) ? spree.signed_in_root_path(resource) : spree.login_path
20
+ end
21
+ end
@@ -0,0 +1,53 @@
1
+ class Spree::UserPasswordsController < Devise::PasswordsController
2
+ helper 'spree/base', 'spree/store'
3
+
4
+ if Spree::Auth::Engine.dash_available?
5
+ helper 'spree/analytics'
6
+ end
7
+
8
+ include Spree::Core::ControllerHelpers::Auth
9
+ include Spree::Core::ControllerHelpers::Common
10
+ include Spree::Core::ControllerHelpers::Order
11
+ include Spree::Core::ControllerHelpers::SSL
12
+ include Spree::Core::ControllerHelpers::Store
13
+
14
+ ssl_required
15
+
16
+ # Overridden due to bug in Devise.
17
+ # respond_with resource, :location => new_session_path(resource_name)
18
+ # is generating bad url /session/new.user
19
+ #
20
+ # overridden to:
21
+ # respond_with resource, :location => spree.login_path
22
+ #
23
+ def create
24
+ self.resource = resource_class.send_reset_password_instructions(params[resource_name])
25
+
26
+ if resource.errors.empty?
27
+ set_flash_message(:notice, :send_instructions) if is_navigational_format?
28
+ respond_with resource, :location => spree.login_path
29
+ else
30
+ respond_with_navigational(resource) { render :new }
31
+ end
32
+ end
33
+
34
+ # Devise::PasswordsController allows for blank passwords.
35
+ # Silly Devise::PasswordsController!
36
+ # Fixes spree/spree#2190.
37
+ def update
38
+ if params[:spree_user][:password].blank?
39
+ self.resource = resource_class.new
40
+ resource.reset_password_token = params[:spree_user][:reset_password_token]
41
+ set_flash_message(:error, :cannot_be_blank)
42
+ render :edit
43
+ else
44
+ super
45
+ end
46
+ end
47
+
48
+ protected
49
+
50
+ def new_session_path(resource_name)
51
+ spree.send("new_#{resource_name}_session_path")
52
+ end
53
+ end
@@ -0,0 +1,72 @@
1
+ class Spree::UserRegistrationsController < Devise::RegistrationsController
2
+ helper 'spree/base', 'spree/store'
3
+
4
+ if Spree::Auth::Engine.dash_available?
5
+ helper 'spree/analytics'
6
+ end
7
+
8
+ include Spree::Core::ControllerHelpers::Auth
9
+ include Spree::Core::ControllerHelpers::Common
10
+ include Spree::Core::ControllerHelpers::Order
11
+ include Spree::Core::ControllerHelpers::SSL
12
+ include Spree::Core::ControllerHelpers::Store
13
+
14
+ ssl_required
15
+ before_filter :check_permissions, :only => [:edit, :update]
16
+ skip_before_filter :require_no_authentication
17
+
18
+ # GET /resource/sign_up
19
+ def new
20
+ super
21
+ @user = resource
22
+ end
23
+
24
+ # POST /resource/sign_up
25
+ def create
26
+ @user = build_resource(spree_user_params)
27
+ if resource.save
28
+ set_flash_message(:notice, :signed_up)
29
+ sign_in(:spree_user, @user)
30
+ session[:spree_user_signup] = true
31
+ associate_user
32
+ respond_with resource, location: after_sign_up_path_for(resource)
33
+ else
34
+ clean_up_passwords(resource)
35
+ render :new
36
+ end
37
+ end
38
+
39
+ # GET /resource/edit
40
+ def edit
41
+ super
42
+ end
43
+
44
+ # PUT /resource
45
+ def update
46
+ super
47
+ end
48
+
49
+ # DELETE /resource
50
+ def destroy
51
+ super
52
+ end
53
+
54
+ # GET /resource/cancel
55
+ # Forces the session data which is usually expired after sign
56
+ # in to be expired now. This is useful if the user wants to
57
+ # cancel oauth signing in/up in the middle of the process,
58
+ # removing all OAuth session data.
59
+ def cancel
60
+ super
61
+ end
62
+
63
+ protected
64
+ def check_permissions
65
+ authorize!(:create, resource)
66
+ end
67
+
68
+ private
69
+ def spree_user_params
70
+ params.require(:spree_user).permit(Spree::PermittedAttributes.user_attributes)
71
+ end
72
+ end
@@ -0,0 +1,53 @@
1
+ class Spree::UserSessionsController < Devise::SessionsController
2
+ helper 'spree/base', 'spree/store'
3
+ if Spree::Auth::Engine.dash_available?
4
+ helper 'spree/analytics'
5
+ end
6
+
7
+ include Spree::Core::ControllerHelpers::Auth
8
+ include Spree::Core::ControllerHelpers::Common
9
+ include Spree::Core::ControllerHelpers::Order
10
+ include Spree::Core::ControllerHelpers::SSL
11
+ include Spree::Core::ControllerHelpers::Store
12
+
13
+ ssl_required :new, :create, :destroy, :update
14
+ ssl_allowed :login_bar
15
+
16
+ def create
17
+ authenticate_spree_user!
18
+
19
+ if spree_user_signed_in?
20
+ respond_to do |format|
21
+ format.html {
22
+ flash[:success] = Spree.t(:logged_in_succesfully)
23
+ redirect_back_or_default(after_sign_in_path_for(spree_current_user))
24
+ }
25
+ format.js {
26
+ render :json => {:user => spree_current_user,
27
+ :ship_address => spree_current_user.ship_address,
28
+ :bill_address => spree_current_user.bill_address}.to_json
29
+ }
30
+ end
31
+ else
32
+ respond_to do |format|
33
+ format.html {
34
+ flash.now[:error] = t('devise.failure.invalid')
35
+ render :new
36
+ }
37
+ format.js {
38
+ render :json => { error: t('devise.failure.invalid') }, status: :unprocessable_entity
39
+ }
40
+ end
41
+ end
42
+ end
43
+
44
+ private
45
+ def accurate_title
46
+ Spree.t(:login)
47
+ end
48
+
49
+ def redirect_back_or_default(default)
50
+ redirect_to(session["spree_user_return_to"] || default)
51
+ session["spree_user_return_to"] = nil
52
+ end
53
+ end
@@ -0,0 +1,57 @@
1
+ class Spree::UsersController < Spree::StoreController
2
+ ssl_required
3
+ skip_before_filter :set_current_order, :only => :show
4
+ prepend_before_filter :load_object, :only => [:show, :edit, :update]
5
+ prepend_before_filter :authorize_actions, :only => :new
6
+
7
+ include Spree::Core::ControllerHelpers
8
+
9
+ def show
10
+ @orders = @user.orders.complete.order('completed_at desc')
11
+ end
12
+
13
+ def create
14
+ @user = Spree::User.new(user_params)
15
+ if @user.save
16
+
17
+ if current_order
18
+ session[:guest_token] = nil
19
+ end
20
+
21
+ redirect_back_or_default(root_url)
22
+ else
23
+ render :new
24
+ end
25
+ end
26
+
27
+ def update
28
+ if @user.update_attributes(user_params)
29
+ if params[:user][:password].present?
30
+ # this logic needed b/c devise wants to log us out after password changes
31
+ user = Spree::User.reset_password_by_token(params[:user])
32
+ sign_in(@user, :event => :authentication, :bypass => !Spree::Auth::Config[:signout_after_password_change])
33
+ end
34
+ redirect_to spree.account_url, :notice => Spree.t(:account_updated)
35
+ else
36
+ render :edit
37
+ end
38
+ end
39
+
40
+ private
41
+ def user_params
42
+ params.require(:user).permit(Spree::PermittedAttributes.user_attributes)
43
+ end
44
+
45
+ def load_object
46
+ @user ||= spree_current_user
47
+ authorize! params[:action].to_sym, @user
48
+ end
49
+
50
+ def authorize_actions
51
+ authorize! params[:action].to_sym, Spree::User.new
52
+ end
53
+
54
+ def accurate_title
55
+ Spree.t(:my_account)
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module Auth
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+ def self.source_paths
6
+ paths = self.superclass.source_paths
7
+ paths << File.expand_path('../templates', __FILE__)
8
+ paths.flatten
9
+ end
10
+
11
+ def generate_devise_key
12
+ return if ENV['TRAVIS']
13
+ template 'config/initializers/devise.rb', 'config/initializers/devise.rb'
14
+ end
15
+
16
+ def add_migrations
17
+ run 'bundle exec rake railties:install:migrations FROM=solidus_auth_devise'
18
+ end
19
+
20
+ def run_migrations
21
+ run 'bundle exec rake db:migrate'
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1 @@
1
+ Devise.secret_key = <%= SecureRandom.hex(50).inspect %>
@@ -0,0 +1,2 @@
1
+ # This file is required by the dummy app's config/environment
2
+ require "solidus_auth_devise"
@@ -0,0 +1,5 @@
1
+ require "spree_core"
2
+ require "spree/auth/devise"
3
+ require "spree/authentication_helpers"
4
+ require "sass/rails"
5
+ require "coffee_script"
@@ -0,0 +1,20 @@
1
+ require 'spree/core'
2
+ require 'devise'
3
+ require 'devise-encryptable'
4
+ require 'cancan'
5
+
6
+ Devise.secret_key = SecureRandom.hex(50)
7
+
8
+ module Spree
9
+ module Auth
10
+ mattr_accessor :default_secret_key
11
+
12
+ def self.config(&block)
13
+ yield(Spree::Auth::Config)
14
+ end
15
+ end
16
+ end
17
+
18
+ Spree::Auth.default_secret_key = Devise.secret_key
19
+
20
+ require 'spree/auth/engine'
@@ -0,0 +1,77 @@
1
+ require 'devise'
2
+ require 'devise-encryptable'
3
+
4
+ module Spree
5
+ module Auth
6
+ class Engine < Rails::Engine
7
+ isolate_namespace Spree
8
+ engine_name 'solidus_auth'
9
+
10
+ initializer "spree.auth.environment", :before => :load_config_initializers do |app|
11
+ Spree::Auth::Config = Spree::AuthConfiguration.new
12
+ end
13
+
14
+ initializer "solidus_auth_devise.set_user_class", :after => :load_config_initializers do
15
+ Spree.user_class = "Spree::User"
16
+ end
17
+
18
+ initializer "solidus_auth_devise.check_secret_token" do
19
+ if Spree::Auth.default_secret_key == Devise.secret_key
20
+ puts "[WARNING] You are not setting Devise.secret_key within your application!"
21
+ puts "You must set this in config/initializers/devise.rb. Here's an example:"
22
+ puts " "
23
+ puts %Q{Devise.secret_key = "#{SecureRandom.hex(50)}"}
24
+ end
25
+ end
26
+
27
+ def self.activate
28
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
29
+ Rails.configuration.cache_classes ? require(c) : load(c)
30
+ end
31
+ if Spree::Auth::Engine.backend_available?
32
+ Rails.application.config.assets.precompile += [
33
+ 'lib/assets/javascripts/spree/backend/solidus_auth.js',
34
+ 'lib/assets/javascripts/spree/backend/solidus_auth.css'
35
+ ]
36
+ Dir.glob(File.join(File.dirname(__FILE__), "../../controllers/backend/*/*/*_decorator*.rb")) do |c|
37
+ Rails.configuration.cache_classes ? require(c) : load(c)
38
+ end
39
+ end
40
+ if Spree::Auth::Engine.frontend_available?
41
+ Rails.application.config.assets.precompile += [
42
+ 'lib/assets/javascripts/spree/frontend/solidus_auth.js',
43
+ 'lib/assets/javascripts/spree/frontend/solidus_auth.css'
44
+ ]
45
+ Dir.glob(File.join(File.dirname(__FILE__), "../../controllers/frontend/*/*_decorator*.rb")) do |c|
46
+ Rails.configuration.cache_classes ? require(c) : load(c)
47
+ end
48
+ end
49
+ ApplicationController.send :include, Spree::AuthenticationHelpers
50
+ end
51
+
52
+ def self.backend_available?
53
+ @@backend_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Backend::Engine')
54
+ end
55
+
56
+ def self.dash_available?
57
+ @@dash_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Dash::Engine')
58
+ end
59
+
60
+ def self.frontend_available?
61
+ @@frontend_available ||= ::Rails::Engine.subclasses.map(&:instance).map{ |e| e.class.to_s }.include?('Spree::Frontend::Engine')
62
+ end
63
+
64
+ if self.backend_available?
65
+ paths["app/controllers"] << "lib/controllers/backend"
66
+ paths["app/views"] << "lib/views/backend"
67
+ end
68
+
69
+ if self.frontend_available?
70
+ paths["app/controllers"] << "lib/controllers/frontend"
71
+ paths["app/views"] << "lib/views/frontend"
72
+ end
73
+
74
+ config.to_prepare &method(:activate).to_proc
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module AuthenticationHelpers
3
+ def self.included(receiver)
4
+ receiver.send :helper_method, :spree_current_user
5
+ receiver.send :helper_method, :spree_login_path
6
+ receiver.send :helper_method, :spree_signup_path
7
+ receiver.send :helper_method, :spree_logout_path
8
+ end
9
+
10
+ def spree_current_user
11
+ current_spree_user
12
+ end
13
+
14
+ def spree_login_path
15
+ spree.login_path
16
+ end
17
+
18
+ def spree_signup_path
19
+ spree.signup_path
20
+ end
21
+
22
+ def spree_logout_path
23
+ spree.logout_path
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ namespace :spree_auth do
2
+ namespace :admin do
3
+ desc "Create admin username and password"
4
+ task :create => :environment do
5
+ require File.join(File.dirname(__FILE__), '..', '..', 'db', 'default', 'users.rb')
6
+ puts "Done!"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ <%= render :partial => 'spree/shared/error_messages', :locals => { :target => @spree_user } %>
2
+ <h2><%= Spree.t(:change_my_password) %></h2>
3
+
4
+ <%= form_for @spree_user, :as => :spree_user, :url => spree.update_password_path, :method => :put do |f| %>
5
+ <p>
6
+ <%= f.label :password, Spree.t(:password) %><br />
7
+ <%= f.password_field :password %><br />
8
+ </p>
9
+ <p>
10
+ <%= f.label :password_confirmation, Spree.t(:confirm_password) %><br />
11
+ <%= f.password_field :password_confirmation %><br />
12
+ </p>
13
+ <%= f.hidden_field :reset_password_token %>
14
+ <%= f.submit Spree.t(:update), :class => 'button primary' %>
15
+ <% end %>