stormpath-rails 1.1.2.beta → 2.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 +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -1
- data/.rubocop.yml +22 -0
- data/.travis.yml +6 -3
- data/Gemfile +10 -3
- data/README.md +139 -142
- data/Rakefile +9 -9
- data/app/assets/stylesheets/stormpath.css.scss +3 -2
- data/app/controllers/stormpath/rails/base_controller.rb +25 -6
- data/app/controllers/stormpath/rails/change_password/create_controller.rb +68 -0
- data/app/controllers/stormpath/rails/change_password/new_controller.rb +38 -0
- data/app/controllers/stormpath/rails/forgot_password/create_controller.rb +37 -0
- data/app/controllers/stormpath/rails/forgot_password/new_controller.rb +14 -0
- data/app/controllers/stormpath/rails/login/create_controller.rb +60 -0
- data/app/controllers/stormpath/rails/login/new_controller.rb +20 -0
- data/app/controllers/stormpath/rails/logout/create_controller.rb +61 -0
- data/app/controllers/stormpath/rails/oauth2/create_controller.rb +82 -0
- data/app/controllers/stormpath/rails/oauth2/new_controller.rb +11 -0
- data/app/controllers/stormpath/rails/profile/show_controller.rb +15 -0
- data/app/controllers/stormpath/rails/register/create_controller.rb +86 -0
- data/app/controllers/stormpath/rails/register/new_controller.rb +20 -0
- data/app/controllers/stormpath/rails/verify_email/create_controller.rb +37 -0
- data/app/controllers/stormpath/rails/verify_email/show_controller.rb +51 -0
- data/app/forms/stormpath/rails/login_form.rb +60 -0
- data/app/forms/stormpath/rails/registration_form.rb +106 -0
- data/app/forms/stormpath/rails/registration_form_fields.rb +71 -0
- data/app/helpers/social_helper.rb +2 -1
- data/app/serializers/stormpath/rails/account_serializer.rb +32 -0
- data/app/serializers/stormpath/rails/form_serializer.rb +37 -0
- data/app/serializers/stormpath/rails/login_new_serializer.rb +11 -0
- data/app/serializers/stormpath/rails/profile_serializer.rb +71 -0
- data/app/serializers/stormpath/rails/registration_form_serializer.rb +11 -0
- data/app/services/stormpath/rails/account_from_access_token/local_account_resolution.rb +48 -0
- data/app/services/stormpath/rails/account_from_access_token/stormpath_account_resolution.rb +27 -0
- data/app/services/stormpath/rails/account_from_access_token.rb +33 -0
- data/app/services/stormpath/rails/account_login.rb +28 -0
- data/app/services/stormpath/rails/account_login_with_stormpath_token.rb +32 -0
- data/app/services/stormpath/rails/client_credentials_authentication.rb +40 -0
- data/app/services/stormpath/rails/controller_authentication/from_basic_auth.rb +45 -0
- data/app/services/stormpath/rails/controller_authentication/from_bearer_auth.rb +34 -0
- data/app/services/stormpath/rails/controller_authentication/from_cookies.rb +71 -0
- data/app/services/stormpath/rails/controller_authentication.rb +44 -0
- data/app/services/stormpath/rails/delete_access_token.rb +48 -0
- data/app/services/stormpath/rails/delete_refresh_token.rb +11 -0
- data/app/services/stormpath/rails/forgot_password_token_verification.rb +31 -0
- data/app/services/stormpath/rails/password_change.rb +17 -0
- data/app/services/stormpath/rails/refresh_token_authentication.rb +28 -0
- data/app/services/stormpath/rails/resend_email_verification.rb +33 -0
- data/app/services/stormpath/rails/send_password_reset_email.rb +33 -0
- data/app/services/stormpath/rails/token_cookie_setter.rb +84 -0
- data/app/services/stormpath/rails/verify_email_token.rb +27 -0
- data/app/views/{passwords/forgot_change.html.erb → stormpath/rails/change_password/new.html.erb} +4 -10
- data/app/views/{passwords/forgot.html.erb → stormpath/rails/forgot_password/new.html.erb} +14 -4
- data/app/views/{layouts → stormpath/rails/layouts}/stormpath.html.erb +3 -3
- data/app/views/stormpath/rails/login/_form.html.erb +45 -0
- data/app/views/stormpath/rails/login/new.html.erb +12 -0
- data/app/views/stormpath/rails/register/_form.html.erb +19 -0
- data/app/views/{users → stormpath/rails/register}/new.html.erb +3 -3
- data/app/views/stormpath/rails/shared/_input.html.erb +15 -0
- data/app/views/stormpath/rails/verify_email/new.html.erb +49 -0
- data/bin/console +3 -3
- data/bin/rails +1 -1
- data/bin/rake +2 -2
- data/bin/rspec +2 -2
- data/config/initializers/assets.rb +3 -1
- data/lib/generators/stormpath/install/install_generator.rb +1 -92
- data/lib/generators/stormpath/install/templates/default_config.yml +229 -0
- data/lib/generators/stormpath/views/USAGE +0 -0
- data/lib/generators/stormpath/views/views_generator.rb +2 -2
- data/lib/stormpath/rails/client.rb +8 -85
- data/lib/stormpath/rails/config/account_store_verification.rb +45 -0
- data/lib/stormpath/rails/config/application_resolution.rb +76 -0
- data/lib/stormpath/rails/config/dynamic_configuration.rb +50 -0
- data/lib/stormpath/rails/config/read_file.rb +35 -0
- data/lib/stormpath/rails/configuration.rb +30 -35
- data/lib/stormpath/rails/content_type_negotiator.rb +50 -0
- data/lib/stormpath/rails/controller.rb +36 -5
- data/lib/stormpath/rails/errors/invalid_sptoken_error.rb +9 -0
- data/lib/stormpath/rails/errors/no_sptoken_error.rb +13 -0
- data/lib/stormpath/rails/router.rb +75 -0
- data/lib/stormpath/rails/routing_constraint.rb +9 -0
- data/lib/stormpath/rails/social.rb +6 -6
- data/lib/stormpath/rails/version.rb +2 -1
- data/lib/stormpath/rails.rb +9 -19
- data/lib/stormpath-rails.rb +1 -0
- data/stormpath-rails.gemspec +13 -11
- metadata +96 -54
- data/app/controllers/stormpath/rails/omniauth_controller.rb +0 -11
- data/app/controllers/stormpath/rails/passwords_controller.rb +0 -56
- data/app/controllers/stormpath/rails/sessions_controller.rb +0 -52
- data/app/controllers/stormpath/rails/users_controller.rb +0 -65
- data/app/views/passwords/edit.html.erb +0 -0
- data/app/views/passwords/email_sent.html.erb +0 -15
- data/app/views/passwords/forgot_change_failed.html.erb +0 -14
- data/app/views/passwords/forgot_complete.html.erb +0 -19
- data/app/views/sessions/_facebook_login_form.erb +0 -31
- data/app/views/sessions/_form.html.erb +0 -31
- data/app/views/sessions/_google_login_form.html.erb +0 -3
- data/app/views/sessions/_social_auth.html.erb +0 -7
- data/app/views/sessions/new.html.erb +0 -21
- data/app/views/users/_form.html.erb +0 -43
- data/app/views/users/verification_complete.html.erb +0 -20
- data/app/views/users/verification_email_sent.html.erb +0 -15
- data/app/views/users/verification_failed.html.erb +0 -14
- data/app/views/users/verification_resend.html.erb +0 -14
- data/config/routes.rb +0 -16
- data/lib/generators/stormpath/install/templates/db/migrate/add_stormpath_to_users.rb +0 -21
- data/lib/generators/stormpath/install/templates/db/migrate/create_users.rb +0 -12
- data/lib/generators/stormpath/install/templates/stormpath.rb +0 -4
- data/lib/generators/stormpath/install/templates/user.rb +0 -3
- data/lib/generators/stormpath/routes/routes_generator.rb +0 -23
- data/lib/generators/stormpath/routes/templates/routes.rb +0 -5
- data/lib/stormpath/rails/account.rb +0 -6
- data/lib/stormpath/rails/account_status.rb +0 -28
- data/lib/stormpath/rails/authentication.rb +0 -72
- data/lib/stormpath/rails/authentication_status.rb +0 -22
- data/lib/stormpath/rails/session.rb +0 -37
- data/lib/stormpath/rails/user.rb +0 -25
- data/lib/stormpath/rails/user_config/api_key.rb +0 -17
- data/lib/stormpath/rails/user_config/application.rb +0 -12
- data/lib/stormpath/rails/user_config/facebook.rb +0 -16
- data/lib/stormpath/rails/user_config/forgot_password.rb +0 -12
- data/lib/stormpath/rails/user_config/google.rb +0 -16
- data/lib/stormpath/rails/user_config/id_site.rb +0 -13
- data/lib/stormpath/rails/user_config/login.rb +0 -13
- data/lib/stormpath/rails/user_config/logout.rb +0 -13
- data/lib/stormpath/rails/user_config/register.rb +0 -13
- data/lib/stormpath/rails/user_config/verify_email.rb +0 -14
- data/lib/stormpath/testing/helpers.rb +0 -49
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module ForgotPassword
|
|
4
|
+
class CreateController < Stormpath::Rails::BaseController
|
|
5
|
+
def call
|
|
6
|
+
begin
|
|
7
|
+
SendPasswordResetEmail.new(params[:email]).call
|
|
8
|
+
respond_with_success
|
|
9
|
+
rescue SendPasswordResetEmail::UnexistingEmailError
|
|
10
|
+
respond_with_success
|
|
11
|
+
rescue SendPasswordResetEmail::NoEmailError => error
|
|
12
|
+
respond_with_error(error)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def respond_with_success
|
|
19
|
+
respond_to do |format|
|
|
20
|
+
format.html { redirect_to stormpath_config.web.forgot_password.next_uri }
|
|
21
|
+
format.json { render nothing: true, status: 200 }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def respond_with_error(error)
|
|
26
|
+
respond_to do |format|
|
|
27
|
+
format.json { render json: { status: 400, message: error.message }, status: 400 }
|
|
28
|
+
format.html do
|
|
29
|
+
flash.now[:error] = error.message
|
|
30
|
+
render stormpath_config.web.forgot_password.view
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module ForgotPassword
|
|
4
|
+
class NewController < Stormpath::Rails::BaseController
|
|
5
|
+
def call
|
|
6
|
+
respond_to do |format|
|
|
7
|
+
format.json { render nothing: true, status: 404 }
|
|
8
|
+
format.html { render stormpath_config.web.forgot_password.view }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Login
|
|
4
|
+
class CreateController < BaseController
|
|
5
|
+
before_action :require_no_authentication!
|
|
6
|
+
|
|
7
|
+
def call
|
|
8
|
+
begin
|
|
9
|
+
form.save!
|
|
10
|
+
set_cookies
|
|
11
|
+
respond_with_success
|
|
12
|
+
rescue Stormpath::Error, LoginForm::FormError => error
|
|
13
|
+
respond_with_error(error)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def form
|
|
20
|
+
@form ||= LoginForm.new(params[:login], params[:password])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def respond_with_success
|
|
24
|
+
respond_to do |format|
|
|
25
|
+
format.html { redirect_to login_redirect_route, notice: 'Successfully signed in' }
|
|
26
|
+
format.json { render json: serialized_account }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def respond_with_error(error)
|
|
31
|
+
respond_to do |format|
|
|
32
|
+
format.html do
|
|
33
|
+
flash.now[:error] = error.message
|
|
34
|
+
render stormpath_config.web.login.view
|
|
35
|
+
end
|
|
36
|
+
format.json do
|
|
37
|
+
render json: { status: error.status, message: error.message }, status: error.status
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def set_cookies
|
|
43
|
+
TokenCookieSetter.call(cookies, form.authentication_result)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def serialized_account
|
|
47
|
+
AccountSerializer.to_h(form.authentication_result.account)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def login_redirect_route
|
|
51
|
+
if params[:next]
|
|
52
|
+
URI(params[:next]).path
|
|
53
|
+
else
|
|
54
|
+
stormpath_config.web.login.next_uri
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Login
|
|
4
|
+
class NewController < BaseController
|
|
5
|
+
before_action :require_no_authentication!
|
|
6
|
+
|
|
7
|
+
def call
|
|
8
|
+
if stormpath_config.web.id_site.enabled
|
|
9
|
+
redirect_to id_site_login_url
|
|
10
|
+
else
|
|
11
|
+
respond_to do |format|
|
|
12
|
+
format.json { render json: LoginNewSerializer.to_h }
|
|
13
|
+
format.html { render stormpath_config.web.login.view }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Logout
|
|
4
|
+
class CreateController < BaseController
|
|
5
|
+
BEARER_PATTERN = /^Bearer /
|
|
6
|
+
|
|
7
|
+
def call
|
|
8
|
+
if bearer_authorization_header?
|
|
9
|
+
DeleteAccessToken.call(bearer_access_token)
|
|
10
|
+
else
|
|
11
|
+
delete_tokens
|
|
12
|
+
delete_cookies
|
|
13
|
+
end
|
|
14
|
+
respond_with_success
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def bearer_access_token
|
|
20
|
+
authorization_header.gsub(BEARER_PATTERN, '')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def bearer_authorization_header?
|
|
24
|
+
authorization_header =~ BEARER_PATTERN
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def authorization_header
|
|
28
|
+
request.headers['Authorization']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def delete_tokens
|
|
32
|
+
DeleteAccessToken.call(cookies[access_token_cookie_name])
|
|
33
|
+
DeleteRefreshToken.call(cookies[refresh_token_cookie_name])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def delete_cookies
|
|
37
|
+
cookies.delete(access_token_cookie_name)
|
|
38
|
+
cookies.delete(refresh_token_cookie_name)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def access_token_cookie_name
|
|
42
|
+
stormpath_config.web.access_token_cookie.name
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def refresh_token_cookie_name
|
|
46
|
+
stormpath_config.web.refresh_token_cookie.name
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def respond_with_success
|
|
50
|
+
respond_to do |format|
|
|
51
|
+
format.html do
|
|
52
|
+
flash[:notice] = 'You have been logged out successfully.'
|
|
53
|
+
redirect_to stormpath_config.web.logout.next_uri
|
|
54
|
+
end
|
|
55
|
+
format.json { render nothing: true, status: 200 }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Oauth2
|
|
4
|
+
class CreateController < BaseController
|
|
5
|
+
UnsupportedGrantType = Class.new(StandardError)
|
|
6
|
+
|
|
7
|
+
def call
|
|
8
|
+
response.headers['Cache-Control'] = 'no-store'
|
|
9
|
+
response.headers['Pragma'] = 'no-cache'
|
|
10
|
+
|
|
11
|
+
case grant_type
|
|
12
|
+
when 'client_credentials'
|
|
13
|
+
handle_client_credentials_grant
|
|
14
|
+
when 'password'
|
|
15
|
+
handle_password_grant
|
|
16
|
+
when 'refresh_token'
|
|
17
|
+
handle_refresh_token_grant
|
|
18
|
+
else
|
|
19
|
+
raise UnsupportedGrantType if grant_type.present?
|
|
20
|
+
render json: { error: :invalid_request }, status: 400
|
|
21
|
+
end
|
|
22
|
+
rescue UnsupportedGrantType
|
|
23
|
+
render json: { error: :unsupported_grant_type }, status: 400
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def grant_type
|
|
29
|
+
params[:grant_type]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def handle_client_credentials_grant
|
|
33
|
+
raise UnsupportedGrantType unless stormpath_config.web.oauth2.client_credentials.enabled
|
|
34
|
+
begin
|
|
35
|
+
auth_result = ClientCredentialsAuthentication.new(request.headers['Authorization']).save!
|
|
36
|
+
render json: auth_result_json(auth_result).except(:refresh_token)
|
|
37
|
+
rescue ClientCredentialsAuthentication::FormError, Stormpath::Error => error
|
|
38
|
+
render json: {
|
|
39
|
+
error: :invalid_client,
|
|
40
|
+
message: error.message
|
|
41
|
+
}, status: 401
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def handle_password_grant
|
|
46
|
+
raise UnsupportedGrantType unless stormpath_config.web.oauth2.password.enabled
|
|
47
|
+
begin
|
|
48
|
+
auth_result = LoginForm.new(params[:username], params[:password]).save!
|
|
49
|
+
render json: auth_result_json(auth_result)
|
|
50
|
+
rescue LoginForm::FormError, Stormpath::Error => error
|
|
51
|
+
render json: {
|
|
52
|
+
error: :invalid_request,
|
|
53
|
+
message: error.message
|
|
54
|
+
}, status: error.status
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def handle_refresh_token_grant
|
|
59
|
+
raise UnsupportedGrantType unless stormpath_config.web.oauth2.password.enabled
|
|
60
|
+
begin
|
|
61
|
+
auth_result = RefreshTokenAuthentication.new(params[:refresh_token]).save!
|
|
62
|
+
render json: auth_result_json(auth_result)
|
|
63
|
+
rescue RefreshTokenAuthentication::FormError, Stormpath::Error => error
|
|
64
|
+
render json: {
|
|
65
|
+
error: :invalid_grant,
|
|
66
|
+
message: error.message
|
|
67
|
+
}, status: error.status
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def auth_result_json(auth_result)
|
|
72
|
+
{
|
|
73
|
+
access_token: auth_result.access_token,
|
|
74
|
+
expires_in: auth_result.expires_in,
|
|
75
|
+
refresh_token: auth_result.refresh_token,
|
|
76
|
+
token_type: auth_result.token_type
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Profile
|
|
4
|
+
class ShowController < BaseController
|
|
5
|
+
before_action :require_authentication!
|
|
6
|
+
|
|
7
|
+
def call
|
|
8
|
+
response.headers['Cache-Control'] = 'no-cache, no-store'
|
|
9
|
+
response.headers['Pragma'] = 'no-cache'
|
|
10
|
+
render json: ProfileSerializer.to_h(current_account)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Register
|
|
4
|
+
class CreateController < BaseController
|
|
5
|
+
def call
|
|
6
|
+
form.save!
|
|
7
|
+
login_the_account if auto_login_enabled?
|
|
8
|
+
respond_with_success
|
|
9
|
+
rescue RegistrationForm::FormError => error
|
|
10
|
+
respond_with_error(error)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def respond_with_success
|
|
16
|
+
respond_to do |format|
|
|
17
|
+
format.html { redirect_to success_redirect_route }
|
|
18
|
+
format.json { render json: serialized_account }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def success_redirect_route
|
|
23
|
+
if email_verification_enabled?
|
|
24
|
+
success_with_email_verification_redirect_route
|
|
25
|
+
elsif auto_login_enabled?
|
|
26
|
+
success_with_auto_login_redirect_route
|
|
27
|
+
else
|
|
28
|
+
default_success_redirect_route
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def success_with_email_verification_redirect_route
|
|
33
|
+
"#{stormpath_config.web.login.uri}?status=unverified"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def success_with_auto_login_redirect_route
|
|
37
|
+
stormpath_config.web.register.next_uri
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def default_success_redirect_route
|
|
41
|
+
"#{stormpath_config.web.login.uri}?status=created"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def respond_with_error(error)
|
|
45
|
+
respond_to do |format|
|
|
46
|
+
format.json { respond_with_json_error(error) }
|
|
47
|
+
format.html { respond_with_html_error(error) }
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def respond_with_json_error(error)
|
|
52
|
+
render json: { status: error.status, message: error.message }, status: error.status
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def respond_with_html_error(error)
|
|
56
|
+
flash.now[:error] = error.message
|
|
57
|
+
render stormpath_config.web.register.view
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def auto_login_enabled?
|
|
61
|
+
stormpath_config.web.register.auto_login
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def email_verification_enabled?
|
|
65
|
+
form.account.status == 'UNVERIFIED'
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def serialized_account
|
|
69
|
+
AccountSerializer.to_h(form.account)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def login_the_account
|
|
73
|
+
AccountLogin.call(cookies, form.email, form.password)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def form
|
|
77
|
+
@form ||= RegistrationForm.new(params.except(*excluded_root_params))
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def excluded_root_params
|
|
81
|
+
[:controller, :action, :format, :create, :utf8, :button, :authenticity_token]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module Register
|
|
4
|
+
class NewController < BaseController
|
|
5
|
+
def call
|
|
6
|
+
if stormpath_config.web.id_site.enabled
|
|
7
|
+
redirect_to id_site_register_url
|
|
8
|
+
elsif signed_in?
|
|
9
|
+
redirect_to root_path
|
|
10
|
+
else
|
|
11
|
+
respond_to do |format|
|
|
12
|
+
format.json { render json: RegistrationFormSerializer.to_h }
|
|
13
|
+
format.html { render stormpath_config.web.register.view }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module VerifyEmail
|
|
4
|
+
class CreateController < BaseController
|
|
5
|
+
def call
|
|
6
|
+
begin
|
|
7
|
+
ResendEmailVerification.new(params[:email]).call
|
|
8
|
+
respond_with_success
|
|
9
|
+
rescue ResendEmailVerification::UnexistingEmailError
|
|
10
|
+
respond_with_success
|
|
11
|
+
rescue ResendEmailVerification::NoEmailError => error
|
|
12
|
+
respond_with_error(error)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def respond_with_success
|
|
19
|
+
respond_to do |format|
|
|
20
|
+
format.html { redirect_to "#{stormpath_config.web.login.uri}?status=unverified" }
|
|
21
|
+
format.json { render nothing: true }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def respond_with_error(error)
|
|
26
|
+
respond_to do |format|
|
|
27
|
+
format.json { render json: { status: 400, message: error.message }, status: 400 }
|
|
28
|
+
format.html do
|
|
29
|
+
flash.now[:error] = error.message
|
|
30
|
+
render stormpath_config.web.verify_email.view
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
module VerifyEmail
|
|
4
|
+
class ShowController < BaseController
|
|
5
|
+
def call
|
|
6
|
+
begin
|
|
7
|
+
account = VerifyEmailToken.new(params[:sptoken]).call
|
|
8
|
+
login_the_account(account) if stormpath_config.web.register.auto_login
|
|
9
|
+
respond_with_success
|
|
10
|
+
rescue InvalidSptokenError, NoSptokenError => error
|
|
11
|
+
respond_to_error(error)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def login_the_account(account)
|
|
18
|
+
AccountLoginWithStormpathToken.new(
|
|
19
|
+
cookies, account,
|
|
20
|
+
Stormpath::Rails::Client.application,
|
|
21
|
+
Stormpath::Rails::Client.client.data_store.api_key
|
|
22
|
+
).call
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def respond_with_success
|
|
26
|
+
respond_to do |format|
|
|
27
|
+
format.html { redirect_to success_redirect_route }
|
|
28
|
+
format.json { render nothing: true, status: 200 }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def success_redirect_route
|
|
33
|
+
if stormpath_config.web.register.auto_login
|
|
34
|
+
stormpath_config.web.register.next_uri
|
|
35
|
+
else
|
|
36
|
+
stormpath_config.web.verify_email.next_uri
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def respond_to_error(error)
|
|
41
|
+
respond_to do |format|
|
|
42
|
+
format.html { render stormpath_config.web.verify_email.view }
|
|
43
|
+
format.json do
|
|
44
|
+
render json: { status: error.status, message: error.message }, status: error.status
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
class LoginForm
|
|
4
|
+
attr_accessor :login, :password
|
|
5
|
+
attr_accessor :authentication_result
|
|
6
|
+
|
|
7
|
+
def initialize(login, password)
|
|
8
|
+
@login = login
|
|
9
|
+
@password = password
|
|
10
|
+
validate_login_presence
|
|
11
|
+
validate_password_presence
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class FormError < ArgumentError
|
|
15
|
+
def status
|
|
16
|
+
400
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# def save
|
|
21
|
+
# return false if invalid?
|
|
22
|
+
# result = Client.authenticate_oauth(password_grant_request)
|
|
23
|
+
#
|
|
24
|
+
# if result.success?
|
|
25
|
+
# self.authentication_result = result.authentication_result
|
|
26
|
+
# else
|
|
27
|
+
# errors.add(:base, result.error_message) && false
|
|
28
|
+
# end
|
|
29
|
+
# end
|
|
30
|
+
|
|
31
|
+
def save!
|
|
32
|
+
self.authentication_result = application.authenticate_oauth(password_grant_request)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def validate_login_presence
|
|
38
|
+
return if login.present?
|
|
39
|
+
raise FormError, "#{form_fields_config.login.label} can't be blank"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def validate_password_presence
|
|
43
|
+
return if password.present?
|
|
44
|
+
raise FormError, "#{form_fields_config.password.label} can't be blank"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def form_fields_config
|
|
48
|
+
Stormpath::Rails.config.web.login.form.fields
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def password_grant_request
|
|
52
|
+
Stormpath::Oauth::PasswordGrantRequest.new(login, password)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def application
|
|
56
|
+
Stormpath::Rails::Client.application
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module Stormpath
|
|
2
|
+
module Rails
|
|
3
|
+
class RegistrationForm
|
|
4
|
+
include ActiveModel::Model
|
|
5
|
+
attr_accessor(*RegistrationFormFields.enabled_field_names)
|
|
6
|
+
attr_accessor :account
|
|
7
|
+
|
|
8
|
+
validate :validate_presence_of_required_attributes
|
|
9
|
+
validate :validate_password_repeated_twice_matches?
|
|
10
|
+
|
|
11
|
+
class FormError < ArgumentError
|
|
12
|
+
def status
|
|
13
|
+
400
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class ArbitraryDataSubmitted < FormError
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(params = {})
|
|
21
|
+
custom_data_params = params[:customData] || {}
|
|
22
|
+
params = params.except(:customData).merge(custom_data_params)
|
|
23
|
+
params = params.stringify_keys.transform_keys(&:underscore).symbolize_keys
|
|
24
|
+
|
|
25
|
+
arbitrary_param_names = params.keys - RegistrationFormFields.enabled_field_names
|
|
26
|
+
|
|
27
|
+
if arbitrary_param_names.any?
|
|
28
|
+
raise ArbitraryDataSubmitted, "Can't submit arbitrary data: #{arbitrary_param_names.join(', ')}"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
super(params)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def save
|
|
35
|
+
return false if invalid?
|
|
36
|
+
|
|
37
|
+
begin
|
|
38
|
+
self.account = Stormpath::Rails::Client.application.accounts.create(
|
|
39
|
+
Stormpath::Resource::Account.new(stormpath_registration_params)
|
|
40
|
+
)
|
|
41
|
+
rescue Stormpath::Error => error
|
|
42
|
+
errors.add(:base, error.message) && false
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def save!
|
|
47
|
+
return true if save
|
|
48
|
+
raise(FormError, errors.full_messages.first)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def validate_presence_of_required_attributes
|
|
54
|
+
RegistrationFormFields.required_fields.each do |required_field, properties|
|
|
55
|
+
if send(required_field).blank?
|
|
56
|
+
errors.add(:base, "#{properties[:label]} is required.")
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def validate_password_repeated_twice_matches?
|
|
62
|
+
return unless RegistrationFormFields.confirm_password_enabled?
|
|
63
|
+
return if password == confirm_password
|
|
64
|
+
errors.add(:base, 'Passwords do not match')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def stormpath_registration_params
|
|
68
|
+
predefined_registration_params.merge(custom_data: custom_registration_params)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def predefined_registration_params
|
|
72
|
+
{}.tap do |hash|
|
|
73
|
+
RegistrationFormFields.predefined_enabled_field_names.each do |field_name|
|
|
74
|
+
hash[field_name] = send(field_name)
|
|
75
|
+
end
|
|
76
|
+
fill_in_given_name(hash)
|
|
77
|
+
fill_in_surname(hash)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def custom_registration_params
|
|
82
|
+
{}.tap do |hash|
|
|
83
|
+
RegistrationFormFields.custom_enabled_field_names.each do |field_name|
|
|
84
|
+
hash[field_name] = send(field_name)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def fill_in_given_name(hash)
|
|
90
|
+
if RegistrationFormFields.given_name_disabled?
|
|
91
|
+
hash[:given_name] = 'UNKNOWN'
|
|
92
|
+
elsif RegistrationFormFields.given_name_not_required? && given_name.blank?
|
|
93
|
+
hash[:given_name] = 'UNKNOWN'
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def fill_in_surname(hash)
|
|
98
|
+
if RegistrationFormFields.surname_disabled?
|
|
99
|
+
hash[:surname] = 'UNKNOWN'
|
|
100
|
+
elsif RegistrationFormFields.surname_not_required? && surname.blank?
|
|
101
|
+
hash[:surname] = 'UNKNOWN'
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|