refinerycms-authentication-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.
- checksums.yaml +7 -0
- data/.gitignore +89 -0
- data/.travis.yml +15 -0
- data/Gemfile +50 -0
- data/Rakefile +20 -0
- data/app/controllers/refinery/authentication/devise/admin/users_controller.rb +147 -0
- data/app/controllers/refinery/authentication/devise/passwords_controller.rb +58 -0
- data/app/controllers/refinery/authentication/devise/sessions_controller.rb +39 -0
- data/app/controllers/refinery/authentication/devise/users_controller.rb +50 -0
- data/app/decorators/controllers/action_controller_base_decorator.rb +25 -0
- data/app/decorators/controllers/refinery/admin_controller_decorator.rb +20 -0
- data/app/decorators/controllers/refinery/application_controller_decorator.rb +7 -0
- data/app/mailers/refinery/authentication/devise/user_mailer.rb +26 -0
- data/app/models/refinery/authentication/devise/nil_user.rb +31 -0
- data/app/models/refinery/authentication/devise/role.rb +22 -0
- data/app/models/refinery/authentication/devise/roles_users.rb +12 -0
- data/app/models/refinery/authentication/devise/user.rb +166 -0
- data/app/models/refinery/authentication/devise/user_plugin.rb +11 -0
- data/app/views/refinery/authentication/devise/admin/users/_actions.html.erb +7 -0
- data/app/views/refinery/authentication/devise/admin/users/_form.html.erb +94 -0
- data/app/views/refinery/authentication/devise/admin/users/_records.html.erb +10 -0
- data/app/views/refinery/authentication/devise/admin/users/_user.html.erb +23 -0
- data/app/views/refinery/authentication/devise/admin/users/_users.html.erb +4 -0
- data/app/views/refinery/authentication/devise/admin/users/edit.html.erb +1 -0
- data/app/views/refinery/authentication/devise/admin/users/index.html.erb +6 -0
- data/app/views/refinery/authentication/devise/admin/users/new.html.erb +1 -0
- data/app/views/refinery/authentication/devise/passwords/edit.html.erb +26 -0
- data/app/views/refinery/authentication/devise/passwords/new.html.erb +17 -0
- data/app/views/refinery/authentication/devise/sessions/new.html.erb +27 -0
- data/app/views/refinery/authentication/devise/user_mailer/reset_notification.html.erb +12 -0
- data/app/views/refinery/authentication/devise/user_mailer/reset_notification.text.plain.erb +7 -0
- data/app/views/refinery/authentication/devise/users/new.html.erb +29 -0
- data/app/views/refinery/layouts/login.html.erb +22 -0
- data/bin/rails +5 -0
- data/bin/rake +21 -0
- data/bin/rspec +22 -0
- data/bin/spring +18 -0
- data/config/locales/bg.yml +73 -0
- data/config/locales/ca.yml +75 -0
- data/config/locales/cs.yml +77 -0
- data/config/locales/da.yml +73 -0
- data/config/locales/de.yml +73 -0
- data/config/locales/el.yml +73 -0
- data/config/locales/en.yml +77 -0
- data/config/locales/es.yml +73 -0
- data/config/locales/fi.yml +73 -0
- data/config/locales/fr.yml +73 -0
- data/config/locales/hu.yml +73 -0
- data/config/locales/it.yml +77 -0
- data/config/locales/ja.yml +73 -0
- data/config/locales/ko.yml +73 -0
- data/config/locales/lt.yml +56 -0
- data/config/locales/lv.yml +73 -0
- data/config/locales/nb.yml +73 -0
- data/config/locales/nl.yml +77 -0
- data/config/locales/pl.yml +73 -0
- data/config/locales/pt-BR.yml +69 -0
- data/config/locales/pt.yml +73 -0
- data/config/locales/rs.yml +73 -0
- data/config/locales/ru.yml +70 -0
- data/config/locales/sk.yml +73 -0
- data/config/locales/sl.yml +62 -0
- data/config/locales/sv.yml +65 -0
- data/config/locales/tr.yml +73 -0
- data/config/locales/uk.yml +71 -0
- data/config/locales/vi.yml +73 -0
- data/config/locales/zh-CN.yml +73 -0
- data/config/locales/zh-TW.yml +74 -0
- data/config/routes.rb +49 -0
- data/db/migrate/20100913234705_create_refinerycms_authentication_schema.rb +43 -0
- data/db/migrate/20120301234455_add_slug_to_refinery_users.rb +7 -0
- data/db/migrate/20130805143059_add_full_name_to_refinery_users.rb +5 -0
- data/db/migrate/20150503125200_rename_tables_to_new_namespace.rb +17 -0
- data/lib/generators/refinery/authentication/devise/generator.rb +18 -0
- data/lib/generators/refinery/authentication/devise/templates/config/initializers/refinery/authentication/devise.rb.erb +8 -0
- data/lib/refinery/authentication/devise/authorisation_adapter.rb +36 -0
- data/lib/refinery/authentication/devise/authorisation_manager.rb +30 -0
- data/lib/refinery/authentication/devise/configuration.rb +22 -0
- data/lib/refinery/authentication/devise/engine.rb +43 -0
- data/lib/refinery/authentication/devise/initialiser.rb +228 -0
- data/lib/refinery/authentication/devise/system.rb +63 -0
- data/lib/refinery/authentication/devise.rb +26 -0
- data/lib/refinerycms-authentication-devise.rb +1 -0
- data/license.md +21 -0
- data/readme.md +11 -0
- data/refinerycms-authentication-devise.gemspec +22 -0
- data/spec/controllers/refinery/authentication/devise/admin/users_controller_spec.rb +90 -0
- data/spec/factories/user.rb +27 -0
- data/spec/features/refinery/authentication/devise/admin/users_spec.rb +88 -0
- data/spec/features/refinery/authentication/devise/passwords_spec.rb +71 -0
- data/spec/features/refinery/authentication/devise/sessions_spec.rb +103 -0
- data/spec/lib/refinery/authentication/devise/configuration_spec.rb +41 -0
- data/spec/models/refinery/user_spec.rb +285 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/support/refinery/authentication/devise/controller_macros.rb +48 -0
- data/spec/support/refinery/authentication/devise/feature_macros.rb +26 -0
- data/tasks/rspec.rake +4 -0
- metadata +225 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 0f9178a82fd347d8cf3c9a6295541017ddc1a476
|
|
4
|
+
data.tar.gz: 06a1f4a6d52a5e766a3a2181385f105ae463e2ea
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 6e65a2c356403d884ee5c891bd923ddb78794c3f7225bc2b753def48a13740e2c3999448bbcae1b9395eecbb6eafba37af0ce8c18e5db10bd5c62b6fb2a85fa1
|
|
7
|
+
data.tar.gz: 3731dd94959dfca809697acaea225966b87be47ef9e83a6ebd40ee2a886682a1132202e271be9db4ab3ac9b9aa11e2f151a4df9bb012fff43a9b46105e60096a
|
data/.gitignore
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Rails
|
|
2
|
+
.bundle
|
|
3
|
+
db/*.sqlite3
|
|
4
|
+
db/*.sqlite3-journal
|
|
5
|
+
*.log
|
|
6
|
+
tmp/**/*
|
|
7
|
+
|
|
8
|
+
# Documentation
|
|
9
|
+
doc/api
|
|
10
|
+
doc/app
|
|
11
|
+
doc/*
|
|
12
|
+
.yardoc
|
|
13
|
+
.yardopts
|
|
14
|
+
|
|
15
|
+
# Public Uploads
|
|
16
|
+
public/system/*
|
|
17
|
+
public/themes/*
|
|
18
|
+
|
|
19
|
+
# Public Cache
|
|
20
|
+
public/javascripts/cache
|
|
21
|
+
public/stylesheets/cache
|
|
22
|
+
|
|
23
|
+
# Vendor Cache
|
|
24
|
+
vendor/cache
|
|
25
|
+
|
|
26
|
+
# Acts as Indexed
|
|
27
|
+
index/**/*
|
|
28
|
+
|
|
29
|
+
# Refinery Specific
|
|
30
|
+
*.tmproj
|
|
31
|
+
*.autobackupbyrefinery.*
|
|
32
|
+
/refinerycms-*.gem
|
|
33
|
+
.autotest
|
|
34
|
+
|
|
35
|
+
# Mac
|
|
36
|
+
.DS_Store
|
|
37
|
+
|
|
38
|
+
# Windows
|
|
39
|
+
Thumbs.db
|
|
40
|
+
|
|
41
|
+
# NetBeans
|
|
42
|
+
nbproject
|
|
43
|
+
|
|
44
|
+
# Eclipse
|
|
45
|
+
.project
|
|
46
|
+
|
|
47
|
+
# Redcar
|
|
48
|
+
.redcar
|
|
49
|
+
|
|
50
|
+
# Rubinius
|
|
51
|
+
*.rbc
|
|
52
|
+
|
|
53
|
+
# Vim
|
|
54
|
+
*.swp
|
|
55
|
+
*.swo
|
|
56
|
+
|
|
57
|
+
# RubyMine
|
|
58
|
+
.idea
|
|
59
|
+
|
|
60
|
+
# Backup
|
|
61
|
+
*~
|
|
62
|
+
|
|
63
|
+
# Capybara Bug
|
|
64
|
+
capybara-*html
|
|
65
|
+
|
|
66
|
+
# sass
|
|
67
|
+
.sass-cache
|
|
68
|
+
.sass-cache/*
|
|
69
|
+
|
|
70
|
+
#rvm
|
|
71
|
+
.rvmrc
|
|
72
|
+
.rvmrc.*
|
|
73
|
+
|
|
74
|
+
# REFINERY CMS DEVELOPMENT ====================================================
|
|
75
|
+
# Always keep this section at the bottom.
|
|
76
|
+
|
|
77
|
+
config/database.yml
|
|
78
|
+
config/amazon_s3.yml
|
|
79
|
+
config/rackspace_cloudfiles.yml
|
|
80
|
+
your_*.*
|
|
81
|
+
db/schema.rb
|
|
82
|
+
|
|
83
|
+
# END REFINERY CMS DEVELOPMENT =================================================
|
|
84
|
+
|
|
85
|
+
Gemfile.lock
|
|
86
|
+
spec/dummy
|
|
87
|
+
|
|
88
|
+
# Local Gemfile for developing without sharing dependencies
|
|
89
|
+
.gemfile
|
data/.travis.yml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
cache: bundler
|
|
3
|
+
bundler_args: --without development
|
|
4
|
+
before_script: "bin/rake refinery:testing:dummy_app"
|
|
5
|
+
env:
|
|
6
|
+
- DB=postgresql
|
|
7
|
+
- DB=mysql
|
|
8
|
+
notifications:
|
|
9
|
+
webhooks:
|
|
10
|
+
- https://webhooks.gitter.im/e/b5d48907cdc89864b874
|
|
11
|
+
rvm:
|
|
12
|
+
- 2.2
|
|
13
|
+
- 2.1
|
|
14
|
+
- 2.0.0
|
|
15
|
+
sudo: false
|
data/Gemfile
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
source "https://rubygems.org"
|
|
2
|
+
|
|
3
|
+
gemspec
|
|
4
|
+
|
|
5
|
+
git "https://github.com/refinery/refinerycms", branch: "auth-for-real-yo-tmp" do
|
|
6
|
+
gem "refinerycms"
|
|
7
|
+
|
|
8
|
+
group :test do
|
|
9
|
+
gem "refinerycms-testing"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Database Configuration
|
|
14
|
+
unless ENV["TRAVIS"]
|
|
15
|
+
gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
|
|
16
|
+
gem "sqlite3", :platform => :ruby
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if !ENV["TRAVIS"] || ENV["DB"] == "mysql"
|
|
20
|
+
gem "activerecord-jdbcmysql-adapter", :platform => :jruby
|
|
21
|
+
gem "jdbc-mysql", "= 5.1.13", :platform => :jruby
|
|
22
|
+
gem "mysql2", :platform => :ruby
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if !ENV["TRAVIS"] || ENV["DB"] == "postgresql"
|
|
26
|
+
gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
|
|
27
|
+
gem "pg", :platform => :ruby
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
gem "jruby-openssl", :platform => :jruby
|
|
31
|
+
|
|
32
|
+
# Refinery/rails should pull in the proper versions of these
|
|
33
|
+
group :assets do
|
|
34
|
+
gem "sass-rails"
|
|
35
|
+
gem "coffee-rails"
|
|
36
|
+
gem "uglifier"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
group :development do
|
|
40
|
+
gem 'quiet_assets'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
group :test do
|
|
44
|
+
gem "launchy"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Load local gems according to Refinery developer preference.
|
|
48
|
+
if File.exist? local_gemfile = File.expand_path("../.gemfile", __FILE__)
|
|
49
|
+
eval File.read(local_gemfile)
|
|
50
|
+
end
|
data/Rakefile
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
begin
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
rescue LoadError
|
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
ENGINE_PATH = File.dirname(__FILE__)
|
|
9
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
|
10
|
+
|
|
11
|
+
if File.exists?(APP_RAKEFILE)
|
|
12
|
+
load 'rails/tasks/engine.rake'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
require "refinerycms-testing"
|
|
16
|
+
Refinery::Testing::Railtie.load_dummy_tasks(ENGINE_PATH)
|
|
17
|
+
|
|
18
|
+
load File.expand_path('../tasks/rspec.rake', __FILE__)
|
|
19
|
+
|
|
20
|
+
task :default => :spec
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
module Refinery
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
module Admin
|
|
5
|
+
class UsersController < Refinery::AdminController
|
|
6
|
+
|
|
7
|
+
crudify :'refinery/authentication/devise/user',
|
|
8
|
+
:order => 'username ASC',
|
|
9
|
+
:title_attribute => 'username'
|
|
10
|
+
|
|
11
|
+
before_action :find_available_plugins, :find_available_roles,
|
|
12
|
+
:only => [:new, :create, :edit, :update]
|
|
13
|
+
before_action :redirect_unless_user_editable!, :only => [:edit, :update]
|
|
14
|
+
before_action :exclude_password_assignment_when_blank!, :only => :update
|
|
15
|
+
|
|
16
|
+
def new
|
|
17
|
+
@user = Refinery::Authentication::Devise::User.new
|
|
18
|
+
@selected_plugin_names = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def create
|
|
22
|
+
@user = Refinery::Authentication::Devise::User.new user_params.except(:roles)
|
|
23
|
+
@selected_plugin_names = params[:user][:plugins] || []
|
|
24
|
+
@selected_role_names = params[:user][:roles] || []
|
|
25
|
+
|
|
26
|
+
if @user.save
|
|
27
|
+
create_successful
|
|
28
|
+
else
|
|
29
|
+
create_failed
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def edit
|
|
34
|
+
@selected_plugin_names = find_user.plugins.map(&:name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def update
|
|
38
|
+
# Store what the user selected.
|
|
39
|
+
@selected_role_names = params[:user].delete(:roles) || []
|
|
40
|
+
@selected_role_names = @user.roles.select(:title).map(&:title) unless user_can_assign_roles?
|
|
41
|
+
@selected_plugin_names = params[:user][:plugins]
|
|
42
|
+
|
|
43
|
+
if user_is_locking_themselves_out?
|
|
44
|
+
flash.now[:error] = t('lockout_prevented', :scope => 'refinery.authentication.devise.admin.users.update')
|
|
45
|
+
render :edit and return
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
store_user_memento
|
|
49
|
+
|
|
50
|
+
@user.roles = @selected_role_names.map { |r| Refinery::Authentication::Devise::Role[r.downcase] }
|
|
51
|
+
if @user.update_attributes user_params
|
|
52
|
+
update_successful
|
|
53
|
+
else
|
|
54
|
+
update_failed
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
def create_successful
|
|
61
|
+
@user.plugins = @selected_plugin_names
|
|
62
|
+
|
|
63
|
+
# if the user is a superuser and can assign roles according to this site's
|
|
64
|
+
# settings then the roles are set with the POST data.
|
|
65
|
+
if user_can_assign_roles?
|
|
66
|
+
@user.roles = @selected_role_names.map { |r| Refinery::Authentication::Devise::Role[r.downcase] }
|
|
67
|
+
else
|
|
68
|
+
@user.add_role :refinery
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
redirect_to refinery.authentication_devise_admin_users_path,
|
|
72
|
+
:notice => t('created', :what => @user.username, :scope => 'refinery.crudify')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def create_failed
|
|
76
|
+
render 'new'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def update_successful
|
|
80
|
+
redirect_to refinery.authentication_devise_admin_users_path,
|
|
81
|
+
:notice => t('updated', :what => @user.username, :scope => 'refinery.crudify')
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def update_failed
|
|
85
|
+
user_memento_rollback!
|
|
86
|
+
|
|
87
|
+
render :edit
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def find_available_plugins
|
|
91
|
+
@available_plugins = Refinery::Plugins.registered.in_menu.map { |a|
|
|
92
|
+
{ :name => a.name, :title => a.title }
|
|
93
|
+
}.sort_by { |a| a[:title] }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def find_available_roles
|
|
97
|
+
@available_roles = Refinery::Authentication::Devise::Role.all
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def redirect_unless_user_editable!
|
|
101
|
+
unless current_refinery_user.can_edit? find_user
|
|
102
|
+
redirect_to refinery.authentication_devise_admin_users_path
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
def exclude_password_assignment_when_blank!
|
|
108
|
+
if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
|
|
109
|
+
params[:user].except!(:password, :password_confirmation)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def user_can_assign_roles?
|
|
114
|
+
Refinery::Authentication::Devise.superuser_can_assign_roles &&
|
|
115
|
+
current_refinery_user.has_role?(:superuser)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def user_is_locking_themselves_out?
|
|
119
|
+
return false if current_refinery_user.id != @user.id || @selected_plugin_names.blank?
|
|
120
|
+
|
|
121
|
+
@selected_plugin_names.exclude?('refinery_authentication_devise') || # removing user plugin access
|
|
122
|
+
@selected_role_names.map(&:downcase).exclude?('refinery') # Or we're removing the refinery role
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def store_user_memento
|
|
126
|
+
# Store the current plugins and roles for this user.
|
|
127
|
+
@previously_selected_plugin_names = @user.plugins.map(&:name)
|
|
128
|
+
@previously_selected_roles = @user.roles
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def user_memento_rollback!
|
|
132
|
+
@user.plugins = @previously_selected_plugin_names
|
|
133
|
+
@user.roles = @previously_selected_roles
|
|
134
|
+
@user.save
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def user_params
|
|
138
|
+
params.require(:user).permit(
|
|
139
|
+
:email, :password, :password_confirmation, :remember_me, :username,
|
|
140
|
+
:login, :full_name, plugins: []
|
|
141
|
+
)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Refinery
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
class PasswordsController < ::Devise::PasswordsController
|
|
5
|
+
helper Refinery::Core::Engine.helpers
|
|
6
|
+
layout 'refinery/layouts/login'
|
|
7
|
+
|
|
8
|
+
before_action :store_password_reset_return_to, :only => [:update]
|
|
9
|
+
def store_password_reset_return_to
|
|
10
|
+
session[:'return_to'] = Refinery::Core.backend_path
|
|
11
|
+
end
|
|
12
|
+
protected :store_password_reset_return_to
|
|
13
|
+
|
|
14
|
+
# Rather than overriding devise, it seems better to just apply the notice here.
|
|
15
|
+
after_action :give_notice, :only => [:update]
|
|
16
|
+
def give_notice
|
|
17
|
+
if %w(notice error alert).exclude?(flash.keys.map(&:to_s)) or self.resource.errors.any?
|
|
18
|
+
flash[:notice] = t('successful', :scope => 'refinery.authentication.devise.users.reset', :email => self.resource.email)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
protected :give_notice
|
|
22
|
+
|
|
23
|
+
# GET /registrations/password/edit?reset_password_token=abcdef
|
|
24
|
+
def edit
|
|
25
|
+
if @reset_password_token = params[:reset_password_token]
|
|
26
|
+
self.resource = User.find_or_initialize_with_error_by_reset_password_token(params[:reset_password_token])
|
|
27
|
+
respond_with(self.resource) and return
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
redirect_to refinery.new_authentication_devise_user_password_path,
|
|
31
|
+
:flash => ({ :error => t('code_invalid', :scope => 'refinery.authentication.devise.users.reset') })
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# POST /registrations/password
|
|
35
|
+
def create
|
|
36
|
+
if params[:authentication_devise_user].present? && (email = params[:authentication_devise_user][:email]).present? &&
|
|
37
|
+
(user = User.where(:email => email).first).present?
|
|
38
|
+
|
|
39
|
+
token = user.generate_reset_password_token!
|
|
40
|
+
UserMailer.reset_notification(user, request, token).deliver_now
|
|
41
|
+
redirect_to refinery.login_path,
|
|
42
|
+
:notice => t('email_reset_sent', :scope => 'refinery.authentication.devise.users.forgot')
|
|
43
|
+
else
|
|
44
|
+
flash.now[:error] = if (email = params[:authentication_devise_user][:email]).blank?
|
|
45
|
+
t('blank_email', :scope => 'refinery.authentication.devise.users.forgot')
|
|
46
|
+
else
|
|
47
|
+
t('email_not_associated_with_account_html', :email => ERB::Util.html_escape(email), :scope => 'refinery.authentication.devise.users.forgot').html_safe
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
self.new
|
|
51
|
+
|
|
52
|
+
render :new
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Refinery
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
class SessionsController < ::Devise::SessionsController
|
|
5
|
+
helper Refinery::Core::Engine.helpers
|
|
6
|
+
layout 'refinery/layouts/login'
|
|
7
|
+
|
|
8
|
+
before_action :clear_unauthenticated_flash, :only => [:new]
|
|
9
|
+
before_action :force_signup_when_no_users!
|
|
10
|
+
after_action :detect_authentication_devise_user!, only: [:create]
|
|
11
|
+
|
|
12
|
+
def create
|
|
13
|
+
super
|
|
14
|
+
rescue ::BCrypt::Errors::InvalidSalt, ::BCrypt::Errors::InvalidHash
|
|
15
|
+
flash[:error] = t('password_encryption', :scope => 'refinery.authentication.devise.users.forgot')
|
|
16
|
+
redirect_to refinery.new_authentication_devise_user_password_path
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
protected
|
|
20
|
+
|
|
21
|
+
# We don't like this alert.
|
|
22
|
+
def clear_unauthenticated_flash
|
|
23
|
+
if flash.keys.include?(:alert) and flash.any?{ |k, v|
|
|
24
|
+
['unauthenticated', t('unauthenticated', :scope => 'devise.failure')].include?(v)
|
|
25
|
+
}
|
|
26
|
+
flash.delete(:alert)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def force_signup_when_no_users!
|
|
31
|
+
return if refinery_users_exist?
|
|
32
|
+
|
|
33
|
+
redirect_to refinery.signup_path and return
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Refinery
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
class UsersController < ::Devise::RegistrationsController
|
|
5
|
+
|
|
6
|
+
# Protect these actions behind an admin login
|
|
7
|
+
before_action :redirect?, :only => [:new, :create]
|
|
8
|
+
|
|
9
|
+
helper Refinery::Core::Engine.helpers
|
|
10
|
+
layout 'refinery/layouts/login'
|
|
11
|
+
|
|
12
|
+
def new
|
|
13
|
+
@user = User.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# This method should only be used to create the first Refinery user.
|
|
17
|
+
def create
|
|
18
|
+
@user = User.new(user_params)
|
|
19
|
+
|
|
20
|
+
if @user.create_first
|
|
21
|
+
flash[:message] = t('welcome', scope: 'refinery.authentication.devise.users.create', who: @user)
|
|
22
|
+
|
|
23
|
+
sign_in(@user)
|
|
24
|
+
redirect_back_or_default(Refinery::Core.backend_path)
|
|
25
|
+
else
|
|
26
|
+
render :new
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
def redirect?
|
|
33
|
+
if current_refinery_user.has_role?(:refinery)
|
|
34
|
+
redirect_to refinery.authentication_devise_admin_users_path
|
|
35
|
+
elsif refinery_users_exist?
|
|
36
|
+
redirect_to refinery.login_path
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def user_params
|
|
41
|
+
params.require(:user).permit(
|
|
42
|
+
:email, :password, :password_confirmation, :remember_me, :username,
|
|
43
|
+
:plugins, :login, :full_name
|
|
44
|
+
)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require "refinery/authentication/devise/authorisation_manager"
|
|
2
|
+
|
|
3
|
+
module RefineryAuthenticationDeviseActionControllerBaseDecoration
|
|
4
|
+
def self.prepended(base)
|
|
5
|
+
base.prepend_before_action :detect_authentication_devise_user!
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
protected
|
|
9
|
+
def refinery_users_exist?
|
|
10
|
+
Refinery::Authentication::Devise::Role[:refinery].users.any?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
def refinery_authorisation_manager
|
|
15
|
+
@refinery_authorisation_manager ||= ::Refinery::Authentication::Devise::AuthorisationManager.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def detect_authentication_devise_user!
|
|
19
|
+
if current_authentication_devise_user
|
|
20
|
+
refinery_authorisation_manager.set_user!(current_authentication_devise_user)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
ActionController::Base.send :prepend, RefineryAuthenticationDeviseActionControllerBaseDecoration
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module RefineryAuthenticationDeviseAdminControllerDecorator
|
|
2
|
+
protected
|
|
3
|
+
# this is an override of an existing method in Refinery::AdminController
|
|
4
|
+
def authenticate_refinery_user!
|
|
5
|
+
begin
|
|
6
|
+
super
|
|
7
|
+
rescue Zilch::Authorisation::NotAuthorisedException
|
|
8
|
+
session["return_to"] = request.path
|
|
9
|
+
redirect_to refinery.login_path and return
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
def authorisation_manager
|
|
15
|
+
# defined in app/decorators/controllers/action_controller_base_decorator.rb
|
|
16
|
+
refinery_authorisation_manager
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Refinery::AdminController.send :prepend, RefineryAuthenticationDeviseAdminControllerDecorator
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Refinery
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
class UserMailer < ActionMailer::Base
|
|
5
|
+
|
|
6
|
+
def reset_notification(user, request, reset_password_token)
|
|
7
|
+
@user = user
|
|
8
|
+
@url = refinery.edit_authentication_devise_user_password_url({
|
|
9
|
+
:host => request.host_with_port,
|
|
10
|
+
:reset_password_token => reset_password_token
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
mail(:to => user.email,
|
|
14
|
+
:subject => t('subject', :scope => 'refinery.authentication.devise.user_mailer.reset_notification'),
|
|
15
|
+
:from => "\"#{Refinery::Core.site_name}\" <#{Refinery::Authentication::Devise.email_from_name}@#{request.domain}>")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def url_prefix(request)
|
|
21
|
+
"#{request.protocol}#{request.host_with_port}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'refinery/core/nil_user'
|
|
2
|
+
|
|
3
|
+
module Refinery
|
|
4
|
+
module Authentication
|
|
5
|
+
module Devise
|
|
6
|
+
class NilUser < Refinery::Core::NilUser
|
|
7
|
+
|
|
8
|
+
def plugins
|
|
9
|
+
Refinery::Plugins.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def has_role?(role)
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def has_plugin?(name)
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def can_edit?(user)
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def landing_url
|
|
25
|
+
Refinery::Core.backend_path
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Refinery
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
class Role < Refinery::Core::BaseModel
|
|
5
|
+
|
|
6
|
+
has_and_belongs_to_many :users, :join_table => :refinery_authentication_devise_roles_users
|
|
7
|
+
|
|
8
|
+
before_validation :camelize_title
|
|
9
|
+
validates :title, :uniqueness => true
|
|
10
|
+
|
|
11
|
+
def camelize_title(role_title = self.title)
|
|
12
|
+
self.title = role_title.to_s.camelize
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.[](title)
|
|
16
|
+
where(:title => title.to_s.camelize).first_or_create!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|