devise_token_auth 0.1.43 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of devise_token_auth might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +40 -894
- data/Rakefile +2 -0
- data/app/controllers/devise_token_auth/application_controller.rb +6 -0
- data/app/controllers/devise_token_auth/concerns/resource_finder.rb +2 -0
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +9 -14
- data/app/controllers/devise_token_auth/confirmations_controller.rb +3 -1
- data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +2 -0
- data/app/controllers/devise_token_auth/passwords_controller.rb +8 -14
- data/app/controllers/devise_token_auth/registrations_controller.rb +26 -21
- data/app/controllers/devise_token_auth/sessions_controller.rb +2 -0
- data/app/controllers/devise_token_auth/token_validations_controller.rb +2 -0
- data/app/controllers/devise_token_auth/unlocks_controller.rb +2 -0
- data/app/models/devise_token_auth/concerns/user.rb +41 -16
- data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +2 -0
- data/app/validators/email_validator.rb +3 -1
- data/config/initializers/devise.rb +2 -0
- data/config/locales/da-DK.yml +1 -1
- data/config/locales/sv.yml +50 -0
- data/lib/devise_token_auth.rb +3 -0
- data/lib/devise_token_auth/controllers/helpers.rb +2 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +2 -0
- data/lib/devise_token_auth/engine.rb +2 -0
- data/lib/devise_token_auth/errors.rb +7 -0
- data/lib/devise_token_auth/rails/routes.rb +2 -0
- data/lib/devise_token_auth/url.rb +2 -0
- data/lib/devise_token_auth/version.rb +3 -1
- data/lib/generators/devise_token_auth/USAGE +1 -1
- data/lib/generators/devise_token_auth/install_generator.rb +7 -5
- data/lib/generators/devise_token_auth/install_views_generator.rb +2 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +2 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +8 -7
- data/lib/generators/devise_token_auth/templates/user.rb +3 -1
- data/lib/tasks/devise_token_auth_tasks.rake +2 -0
- data/test/controllers/custom/custom_confirmations_controller_test.rb +2 -0
- data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +2 -0
- data/test/controllers/custom/custom_passwords_controller_test.rb +2 -0
- data/test/controllers/custom/custom_registrations_controller_test.rb +11 -0
- data/test/controllers/custom/custom_sessions_controller_test.rb +2 -0
- data/test/controllers/custom/custom_token_validations_controller_test.rb +2 -0
- data/test/controllers/demo_group_controller_test.rb +2 -0
- data/test/controllers/demo_mang_controller_test.rb +4 -1
- data/test/controllers/demo_user_controller_test.rb +47 -10
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +4 -6
- data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +7 -4
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +2 -0
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +3 -1
- data/test/controllers/devise_token_auth/sessions_controller_test.rb +52 -0
- data/test/controllers/devise_token_auth/token_validations_controller_test.rb +2 -0
- data/test/controllers/devise_token_auth/unlocks_controller_test.rb +2 -0
- data/test/controllers/overrides/confirmations_controller_test.rb +2 -0
- data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +2 -0
- data/test/controllers/overrides/passwords_controller_test.rb +2 -0
- data/test/controllers/overrides/registrations_controller_test.rb +31 -27
- data/test/controllers/overrides/sessions_controller_test.rb +2 -0
- data/test/controllers/overrides/token_validations_controller_test.rb +2 -0
- data/test/dummy/app/controllers/application_controller.rb +2 -0
- data/test/dummy/app/controllers/auth_origin_controller.rb +2 -0
- data/test/dummy/app/controllers/custom/confirmations_controller.rb +2 -0
- data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +2 -0
- data/test/dummy/app/controllers/custom/passwords_controller.rb +2 -0
- data/test/dummy/app/controllers/custom/registrations_controller.rb +2 -1
- data/test/dummy/app/controllers/custom/sessions_controller.rb +2 -0
- data/test/dummy/app/controllers/custom/token_validations_controller.rb +2 -0
- data/test/dummy/app/controllers/demo_group_controller.rb +2 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +2 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +2 -0
- data/test/dummy/app/controllers/overrides/confirmations_controller.rb +2 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +2 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +2 -0
- data/test/dummy/app/controllers/overrides/registrations_controller.rb +2 -0
- data/test/dummy/app/controllers/overrides/sessions_controller.rb +2 -0
- data/test/dummy/app/controllers/overrides/token_validations_controller.rb +2 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/evil_user.rb +2 -0
- data/test/dummy/app/models/lockable_user.rb +2 -0
- data/test/dummy/app/models/mang.rb +2 -0
- data/test/dummy/app/models/nice_user.rb +2 -0
- data/test/dummy/app/models/only_email_user.rb +2 -0
- data/test/dummy/app/models/scoped_user.rb +2 -0
- data/test/dummy/app/models/unconfirmable_user.rb +2 -0
- data/test/dummy/app/models/unregisterable_user.rb +2 -0
- data/test/dummy/app/models/user.rb +2 -0
- data/test/dummy/config/application.rb +2 -0
- data/test/dummy/config/boot.rb +2 -0
- data/test/dummy/config/environment.rb +2 -0
- data/test/dummy/config/environments/development.rb +2 -0
- data/test/dummy/config/environments/production.rb +2 -0
- data/test/dummy/config/environments/test.rb +2 -0
- data/test/dummy/config/initializers/assets.rb +2 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +2 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -1
- data/test/dummy/config/initializers/devise.rb +2 -0
- data/test/dummy/config/initializers/devise_token_auth.rb +2 -0
- data/test/dummy/config/initializers/figaro.rb +2 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +2 -0
- data/test/dummy/config/initializers/inflections.rb +2 -0
- data/test/dummy/config/initializers/mime_types.rb +2 -0
- data/test/dummy/config/initializers/omniauth.rb +2 -0
- data/test/dummy/config/initializers/session_store.rb +2 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +2 -0
- data/test/dummy/config/routes.rb +2 -0
- data/test/dummy/config/spring.rb +2 -0
- data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +2 -0
- data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +2 -0
- data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +2 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +2 -0
- data/test/dummy/db/migrate/20140928231203_devise_token_auth_create_evil_users.rb +2 -0
- data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +2 -0
- data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +2 -0
- data/test/dummy/db/migrate/20150409095712_devise_token_auth_create_nice_users.rb +2 -0
- data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +2 -0
- data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +2 -0
- data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +2 -0
- data/test/dummy/lib/migration_database_helper.rb +15 -1
- data/test/dummy/tmp/generators/app/models/user.rb +5 -5
- data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +2 -0
- data/test/dummy/tmp/generators/db/migrate/{20171014052631_devise_token_auth_create_users.rb → 20180805205504_devise_token_auth_create_users.rb} +1 -0
- data/test/integration/navigation_test.rb +2 -0
- data/test/lib/devise_token_auth/url_test.rb +2 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +2 -0
- data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +194 -0
- data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +2 -0
- data/test/models/only_email_user_test.rb +2 -0
- data/test/models/user_test.rb +6 -4
- data/test/test_helper.rb +30 -14
- metadata +23 -5
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DeviseTokenAuth
|
2
4
|
class ApplicationController < DeviseController
|
3
5
|
include DeviseTokenAuth::Concerns::SetUserByToken
|
@@ -17,6 +19,10 @@ module DeviseTokenAuth
|
|
17
19
|
|
18
20
|
protected
|
19
21
|
|
22
|
+
def blacklisted_redirect_url?
|
23
|
+
DeviseTokenAuth.redirect_whitelist && !DeviseTokenAuth::Url.whitelisted?(@redirect_url)
|
24
|
+
end
|
25
|
+
|
20
26
|
def build_redirect_headers(access_token, client, redirect_header_options = {})
|
21
27
|
{
|
22
28
|
DeviseTokenAuth.headers_names[:"access-token"] => access_token,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DeviseTokenAuth::Concerns::SetUserByToken
|
2
4
|
extend ActiveSupport::Concern
|
3
5
|
include DeviseTokenAuth::Concerns::ResourceFinder
|
@@ -11,7 +13,7 @@ module DeviseTokenAuth::Concerns::SetUserByToken
|
|
11
13
|
|
12
14
|
# keep track of request duration
|
13
15
|
def set_request_start
|
14
|
-
@request_started_at = Time.now
|
16
|
+
@request_started_at = Time.zone.now
|
15
17
|
@used_auth_by_token = true
|
16
18
|
|
17
19
|
# initialize instance variables
|
@@ -60,7 +62,9 @@ module DeviseTokenAuth::Concerns::SetUserByToken
|
|
60
62
|
if devise_warden_user && devise_warden_user.tokens[@client_id].nil?
|
61
63
|
@used_auth_by_token = false
|
62
64
|
@resource = devise_warden_user
|
63
|
-
|
65
|
+
# REVIEW: The following line _should_ be safe to remove;
|
66
|
+
# the generated token does not get used anywhere.
|
67
|
+
# @resource.create_new_auth_token
|
64
68
|
end
|
65
69
|
end
|
66
70
|
|
@@ -131,22 +135,13 @@ module DeviseTokenAuth::Concerns::SetUserByToken
|
|
131
135
|
if @is_batch_request
|
132
136
|
auth_header = @resource.extend_batch_buffer(@token, @client_id)
|
133
137
|
|
134
|
-
# Do not return token for batch requests to avoid invalidated
|
135
|
-
# tokens returned to the client in case of race conditions.
|
136
|
-
# Use a blank string for the header to still be present and
|
137
|
-
# being passed in a XHR response in case of
|
138
|
-
# 304 Not Modified responses.
|
139
|
-
auth_header[DeviseTokenAuth.headers_names[:"access-token"]] = ' '
|
140
|
-
auth_header[DeviseTokenAuth.headers_names[:"expiry"]] = ' '
|
141
|
-
|
142
138
|
# update Authorization response header with new token
|
143
139
|
else
|
144
140
|
auth_header = @resource.create_new_auth_token(@client_id)
|
145
|
-
end
|
146
|
-
|
147
|
-
# update the response header
|
148
|
-
response.headers.merge!(auth_header)
|
149
141
|
|
142
|
+
# update the response header
|
143
|
+
response.headers.merge!(auth_header)
|
144
|
+
end
|
150
145
|
end # end lock
|
151
146
|
end # end ensure_pristine_resource
|
152
147
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DeviseTokenAuth
|
2
4
|
class ConfirmationsController < DeviseTokenAuth::ApplicationController
|
3
5
|
def show
|
@@ -6,7 +8,7 @@ module DeviseTokenAuth
|
|
6
8
|
if @resource && @resource.id
|
7
9
|
expiry = nil
|
8
10
|
if defined?(@resource.sign_in_count) && @resource.sign_in_count > 0
|
9
|
-
expiry = (Time.now + 1.second).to_i
|
11
|
+
expiry = (Time.zone.now + 1.second).to_i
|
10
12
|
end
|
11
13
|
|
12
14
|
client_id, token = @resource.create_token expiry: expiry
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DeviseTokenAuth
|
2
4
|
class PasswordsController < DeviseTokenAuth::ApplicationController
|
3
5
|
before_action :set_user_by_token, :only => [:update]
|
@@ -11,21 +13,13 @@ module DeviseTokenAuth
|
|
11
13
|
end
|
12
14
|
|
13
15
|
# give redirect value from params priority
|
14
|
-
@redirect_url = params
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
unless @redirect_url
|
20
|
-
return render_create_error_missing_redirect_url
|
21
|
-
end
|
16
|
+
@redirect_url = params.fetch(
|
17
|
+
:redirect_url,
|
18
|
+
DeviseTokenAuth.default_password_reset_url
|
19
|
+
)
|
22
20
|
|
23
|
-
|
24
|
-
if
|
25
|
-
unless DeviseTokenAuth::Url.whitelisted?(@redirect_url)
|
26
|
-
return render_create_error_not_allowed_redirect_url
|
27
|
-
end
|
28
|
-
end
|
21
|
+
return render_create_error_missing_redirect_url unless @redirect_url
|
22
|
+
return render_create_error_not_allowed_redirect_url if blacklisted_redirect_url?
|
29
23
|
|
30
24
|
@email = get_case_insensitive_field_from_resource_params(:email)
|
31
25
|
@resource = find_resource(:uid, @email)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DeviseTokenAuth
|
2
4
|
class RegistrationsController < DeviseTokenAuth::ApplicationController
|
3
5
|
before_action :set_user_by_token, only: [:destroy, :update]
|
@@ -6,21 +8,18 @@ module DeviseTokenAuth
|
|
6
8
|
skip_after_action :update_auth_header, only: [:create, :destroy]
|
7
9
|
|
8
10
|
def create
|
9
|
-
|
10
|
-
@resource.provider = provider
|
11
|
+
build_resource
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
else
|
16
|
-
@resource.email = sign_up_params[:email]
|
13
|
+
unless @resource.present?
|
14
|
+
raise DeviseTokenAuth::Errors::NoResourceDefinedError,
|
15
|
+
"#{self.class.name} #build_resource does not define @resource, execution stopped"
|
17
16
|
end
|
18
17
|
|
19
18
|
# give redirect value from params priority
|
20
|
-
@redirect_url =
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
@redirect_url = params.fetch(
|
20
|
+
:confirm_success_url,
|
21
|
+
DeviseTokenAuth.default_confirm_success_url
|
22
|
+
)
|
24
23
|
|
25
24
|
# success redirect url is required
|
26
25
|
if confirmable_enabled? && !@redirect_url
|
@@ -28,20 +27,18 @@ module DeviseTokenAuth
|
|
28
27
|
end
|
29
28
|
|
30
29
|
# if whitelist is set, validate redirect_url against whitelist
|
31
|
-
if
|
32
|
-
unless DeviseTokenAuth::Url.whitelisted?(@redirect_url)
|
33
|
-
return render_create_error_redirect_url_not_allowed
|
34
|
-
end
|
35
|
-
end
|
30
|
+
return render_create_error_redirect_url_not_allowed if blacklisted_redirect_url?
|
36
31
|
|
37
32
|
begin
|
38
33
|
# override email confirmation, must be sent manually from ctrl
|
39
34
|
resource_class.set_callback("create", :after, :send_on_create_confirmation_instructions)
|
40
35
|
resource_class.skip_callback("create", :after, :send_on_create_confirmation_instructions)
|
36
|
+
|
41
37
|
if @resource.respond_to? :skip_confirmation_notification!
|
42
38
|
# Fix duplicate e-mails by disabling Devise confirmation e-mail
|
43
39
|
@resource.skip_confirmation_notification!
|
44
40
|
end
|
41
|
+
|
45
42
|
if @resource.save
|
46
43
|
yield @resource if block_given?
|
47
44
|
|
@@ -51,13 +48,10 @@ module DeviseTokenAuth
|
|
51
48
|
client_config: params[:config_name],
|
52
49
|
redirect_url: @redirect_url
|
53
50
|
})
|
54
|
-
|
55
51
|
else
|
56
52
|
# email auth has been bypassed, authenticate user
|
57
53
|
@client_id, @token = @resource.create_token
|
58
|
-
|
59
54
|
@resource.save!
|
60
|
-
|
61
55
|
update_auth_header
|
62
56
|
end
|
63
57
|
render_create_success
|
@@ -88,7 +82,6 @@ module DeviseTokenAuth
|
|
88
82
|
if @resource
|
89
83
|
@resource.destroy
|
90
84
|
yield @resource if block_given?
|
91
|
-
|
92
85
|
render_destroy_success
|
93
86
|
else
|
94
87
|
render_destroy_error
|
@@ -96,7 +89,7 @@ module DeviseTokenAuth
|
|
96
89
|
end
|
97
90
|
|
98
91
|
def sign_up_params
|
99
|
-
params.permit(
|
92
|
+
params.permit(*params_for_resource(:sign_up))
|
100
93
|
end
|
101
94
|
|
102
95
|
def account_update_params
|
@@ -105,6 +98,18 @@ module DeviseTokenAuth
|
|
105
98
|
|
106
99
|
protected
|
107
100
|
|
101
|
+
def build_resource
|
102
|
+
@resource = resource_class.new(sign_up_params)
|
103
|
+
@resource.provider = provider
|
104
|
+
|
105
|
+
# honor devise configuration for case_insensitive_keys
|
106
|
+
if resource_class.case_insensitive_keys.include?(:email)
|
107
|
+
@resource.email = sign_up_params[:email].try(:downcase)
|
108
|
+
else
|
109
|
+
@resource.email = sign_up_params[:email]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
108
113
|
def render_create_error_missing_confirm_success_url
|
109
114
|
response = {
|
110
115
|
status: 'error',
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bcrypt'
|
2
4
|
|
3
5
|
module DeviseTokenAuth::Concerns::User
|
@@ -91,13 +93,15 @@ module DeviseTokenAuth::Concerns::User
|
|
91
93
|
def create_token(client_id: nil, token: nil, expiry: nil, **token_extras)
|
92
94
|
client_id ||= SecureRandom.urlsafe_base64(nil, false)
|
93
95
|
token ||= SecureRandom.urlsafe_base64(nil, false)
|
94
|
-
expiry ||= (Time.now + token_lifespan).to_i
|
96
|
+
expiry ||= (Time.zone.now + token_lifespan).to_i
|
95
97
|
|
96
98
|
self.tokens[client_id] = {
|
97
99
|
token: BCrypt::Password.create(token),
|
98
100
|
expiry: expiry
|
99
101
|
}.merge!(token_extras)
|
100
102
|
|
103
|
+
clean_old_tokens
|
104
|
+
|
101
105
|
[client_id, token, expiry]
|
102
106
|
end
|
103
107
|
|
@@ -139,7 +143,7 @@ module DeviseTokenAuth::Concerns::User
|
|
139
143
|
expiry && token &&
|
140
144
|
|
141
145
|
# ensure that the token has not yet expired
|
142
|
-
DateTime.strptime(expiry.to_s, '%s') > Time.now &&
|
146
|
+
DateTime.strptime(expiry.to_s, '%s') > Time.zone.now &&
|
143
147
|
|
144
148
|
# ensure that the token is valid
|
145
149
|
DeviseTokenAuth::Concerns::User.tokens_match?(token_hash, token)
|
@@ -158,7 +162,7 @@ module DeviseTokenAuth::Concerns::User
|
|
158
162
|
updated_at && last_token &&
|
159
163
|
|
160
164
|
# ensure that previous token falls within the batch buffer throttle time of the last request
|
161
|
-
Time.parse(updated_at) > Time.now - DeviseTokenAuth.batch_request_buffer_throttle &&
|
165
|
+
Time.parse(updated_at) > Time.zone.now - DeviseTokenAuth.batch_request_buffer_throttle &&
|
162
166
|
|
163
167
|
# ensure that the token is valid
|
164
168
|
::BCrypt::Password.new(last_token) == token
|
@@ -168,7 +172,7 @@ module DeviseTokenAuth::Concerns::User
|
|
168
172
|
|
169
173
|
# update user's auth token (should happen on each request)
|
170
174
|
def create_new_auth_token(client_id=nil)
|
171
|
-
now = Time.now
|
175
|
+
now = Time.zone.now
|
172
176
|
|
173
177
|
client_id, token = create_token(
|
174
178
|
client_id: client_id,
|
@@ -196,17 +200,12 @@ module DeviseTokenAuth::Concerns::User
|
|
196
200
|
|
197
201
|
def update_auth_header(token, client_id='default')
|
198
202
|
headers = build_auth_header(token, client_id)
|
199
|
-
|
200
|
-
oldest_client_id, _tk = tokens.min_by { |_cid, v| v[:expiry] || v["expiry"] }
|
201
|
-
tokens.delete(oldest_client_id)
|
202
|
-
end
|
203
|
-
|
203
|
+
clean_old_tokens
|
204
204
|
save!
|
205
205
|
|
206
206
|
headers
|
207
207
|
end
|
208
208
|
|
209
|
-
|
210
209
|
def build_auth_url(base_url, args)
|
211
210
|
args[:uid] = uid
|
212
211
|
args[:expiry] = tokens[args[:client_id]]['expiry']
|
@@ -214,9 +213,8 @@ module DeviseTokenAuth::Concerns::User
|
|
214
213
|
DeviseTokenAuth::Url.generate(base_url, args)
|
215
214
|
end
|
216
215
|
|
217
|
-
|
218
216
|
def extend_batch_buffer(token, client_id)
|
219
|
-
self.tokens[client_id]['updated_at'] = Time.now
|
217
|
+
self.tokens[client_id]['updated_at'] = Time.zone.now
|
220
218
|
update_auth_header(token, client_id)
|
221
219
|
end
|
222
220
|
|
@@ -242,19 +240,46 @@ module DeviseTokenAuth::Concerns::User
|
|
242
240
|
if tokens
|
243
241
|
tokens.delete_if do |cid, v|
|
244
242
|
expiry = v[:expiry] || v["expiry"]
|
245
|
-
DateTime.strptime(expiry.to_s, '%s') < Time.now
|
243
|
+
DateTime.strptime(expiry.to_s, '%s') < Time.zone.now
|
246
244
|
end
|
247
245
|
end
|
248
246
|
end
|
249
247
|
|
248
|
+
def should_remove_tokens_after_password_reset?
|
249
|
+
if Rails::VERSION::MAJOR <= 5
|
250
|
+
encrypted_password_changed? &&
|
251
|
+
DeviseTokenAuth.remove_tokens_after_password_reset
|
252
|
+
else
|
253
|
+
saved_change_to_encrypted_password? &&
|
254
|
+
DeviseTokenAuth.remove_tokens_after_password_reset
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
250
258
|
def remove_tokens_after_password_reset
|
251
|
-
|
252
|
-
encrypted_password_changed? && tokens && tokens.many?
|
259
|
+
return unless should_remove_tokens_after_password_reset?
|
253
260
|
|
254
|
-
if
|
261
|
+
if tokens.present? && tokens.many?
|
255
262
|
client_id, token_data = tokens.max_by { |cid, v| v[:expiry] || v["expiry"] }
|
256
263
|
self.tokens = {client_id => token_data}
|
257
264
|
end
|
258
265
|
end
|
259
266
|
|
267
|
+
def max_client_tokens_exceeded?
|
268
|
+
tokens.length > DeviseTokenAuth.max_number_of_devices
|
269
|
+
end
|
270
|
+
|
271
|
+
def clean_old_tokens
|
272
|
+
if tokens.present? && max_client_tokens_exceeded?
|
273
|
+
# Using Enumerable#sort_by on a Hash will typecast it into an associative
|
274
|
+
# Array (i.e. an Array of key-value Array pairs). However, since Hashes
|
275
|
+
# have an internal order in Ruby 1.9+, the resulting sorted associative
|
276
|
+
# Array can be converted back into a Hash, while maintaining the sorted
|
277
|
+
# order.
|
278
|
+
self.tokens = tokens.sort_by { |_cid, v| v[:expiry] || v['expiry'] }.to_h
|
279
|
+
|
280
|
+
# Since the tokens are sorted by expiry, shift the oldest client token
|
281
|
+
# off the Hash until it no longer exceeds the maximum number of clients
|
282
|
+
tokens.shift while max_client_tokens_exceeded?
|
283
|
+
end
|
284
|
+
end
|
260
285
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class EmailValidator < ActiveModel::EachValidator
|
2
4
|
def validate_each(record, attribute, value)
|
3
5
|
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
|
@@ -18,4 +20,4 @@ class EmailValidator < ActiveModel::EachValidator
|
|
18
20
|
|
19
21
|
message
|
20
22
|
end
|
21
|
-
end
|
23
|
+
end
|
data/config/locales/da-DK.yml
CHANGED
@@ -26,7 +26,7 @@ da-DK:
|
|
26
26
|
unlocks:
|
27
27
|
missing_email: "Du skal udfylde en email."
|
28
28
|
sended: "En email er blevet sendt til '%{email}', som indeholder instruktioner for at låse kontoen op."
|
29
|
-
user_not_found: "Kan ikke finde en
|
29
|
+
user_not_found: "Kan ikke finde en bruger med email '%{email}'."
|
30
30
|
errors:
|
31
31
|
messages:
|
32
32
|
validate_sign_up_params: "Angiv venligst passende registeringsdata i request body."
|
@@ -0,0 +1,50 @@
|
|
1
|
+
sv:
|
2
|
+
devise_token_auth:
|
3
|
+
sessions:
|
4
|
+
not_confirmed: "Ett bekräftelse-email har skickats till '%{email}'. Följ instruktionerna i emailet så kan ditt konto aktiveras"
|
5
|
+
bad_credentials: "Ogiltig login-information. Vänligen försök igen."
|
6
|
+
not_supported: "Använd POST /sign_in för att logga in. GET stöds inte."
|
7
|
+
user_not_found: "Användaren hittades inte eller var inte inloggad."
|
8
|
+
token_validations:
|
9
|
+
invalid: "Ogiltig token-information"
|
10
|
+
registrations:
|
11
|
+
missing_confirm_success_url: "Saknar 'confirm_success_url'-parameter."
|
12
|
+
redirect_url_not_allowed: "Omdirigering till '%{redirect_url}' ej tillåten."
|
13
|
+
email_already_exists: "Det finns redan ett konto för '%{email}'"
|
14
|
+
account_with_uid_destroyed: "Kontot med UID '%{uid}' har tagits bort."
|
15
|
+
account_to_destroy_not_found: "Kunde inte hitta kontot för borttagning."
|
16
|
+
user_not_found: "Användaren hittades ej."
|
17
|
+
passwords:
|
18
|
+
missing_email: "Du måste ange en emailadress."
|
19
|
+
missing_redirect_url: "Saknar en omdirigerings-URL."
|
20
|
+
not_allowed_redirect_url: "Omdirigering till '%{redirect_url}' ej tillåten."
|
21
|
+
sended: "Ett email har skickats till '%{email}' med instruktioner för hur du skapar ett nytt lösenord."
|
22
|
+
user_not_found: "Kunde inte hitta användaren med email '%{email}'."
|
23
|
+
password_not_required: "Det har kontot kräver inget lösenord. Logga in via ditt '%{provider}'-konto istället."
|
24
|
+
missing_passwords: "Du måste fylla i fälten 'Lösenord' och 'Upprepa lösenord'."
|
25
|
+
successfully_updated: "Ditt lösenord har ändrats."
|
26
|
+
unlocks:
|
27
|
+
missing_email: "Du måste ange en emailadress."
|
28
|
+
sended: "Ett email har skickats till '%{email}' med instruktioner för hur du låser upp ditt konto."
|
29
|
+
user_not_found: "Kunde inte hitta användaren med emailadressen '%{email}'."
|
30
|
+
errors:
|
31
|
+
messages:
|
32
|
+
validate_sign_up_params: "Vänligen skicka giltig data för att skapa konto i request-bodyn."
|
33
|
+
validate_account_update_params: "Vänligen skicka giltig data för att uppdatera konto i request-bodyn."
|
34
|
+
not_email: "är inte en emailadress"
|
35
|
+
devise:
|
36
|
+
mailer:
|
37
|
+
confirmation_instructions:
|
38
|
+
confirm_link_msg: "Du kan bekräfta ditt kontos emailadress genom att besöka länken nedan:"
|
39
|
+
confirm_account_link: "Bekräfta mitt konto"
|
40
|
+
reset_password_instructions:
|
41
|
+
request_reset_link_msg: "Någon har begärt en länk för att ändra ditt lösenord. Du kan göra detta via länken nedan."
|
42
|
+
password_change_link: "Byt mitt lösenord"
|
43
|
+
ignore_mail_msg: "Om du inte begärt detta, vänligen bortse från detta mail."
|
44
|
+
no_changes_msg: "Ditt lösenord kommer inte att ändras förrän du använder länken ovan och skapar ett nytt."
|
45
|
+
unlock_instructions:
|
46
|
+
account_lock_msg: "Ditt konto har låsts efter för många misslyckade loginförsök."
|
47
|
+
unlock_link_msg: "Klicka på länken nedan för att låsa upp ditt konto:"
|
48
|
+
unlock_link: "Lås upp mitt konto"
|
49
|
+
hello: "hej"
|
50
|
+
welcome: "välkommen"
|