authlogic 4.0.1 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +43 -1
- data/.rubocop_todo.yml +23 -132
- data/CHANGELOG.md +12 -0
- data/CONTRIBUTING.md +10 -3
- data/Gemfile +2 -2
- data/Rakefile +6 -6
- data/authlogic.gemspec +13 -12
- data/lib/authlogic/acts_as_authentic/base.rb +12 -7
- data/lib/authlogic/acts_as_authentic/email.rb +16 -6
- data/lib/authlogic/acts_as_authentic/logged_in_status.rb +10 -5
- data/lib/authlogic/acts_as_authentic/login.rb +11 -5
- data/lib/authlogic/acts_as_authentic/password.rb +111 -57
- data/lib/authlogic/acts_as_authentic/perishable_token.rb +6 -2
- data/lib/authlogic/acts_as_authentic/persistence_token.rb +1 -1
- data/lib/authlogic/acts_as_authentic/queries/find_with_case.rb +2 -2
- data/lib/authlogic/acts_as_authentic/restful_authentication.rb +31 -3
- data/lib/authlogic/acts_as_authentic/session_maintenance.rb +11 -3
- data/lib/authlogic/acts_as_authentic/single_access_token.rb +14 -2
- data/lib/authlogic/acts_as_authentic/validations_scope.rb +6 -6
- data/lib/authlogic/authenticates_many/association.rb +2 -2
- data/lib/authlogic/authenticates_many/base.rb +27 -19
- data/lib/authlogic/controller_adapters/rack_adapter.rb +1 -1
- data/lib/authlogic/controller_adapters/rails_adapter.rb +6 -3
- data/lib/authlogic/controller_adapters/sinatra_adapter.rb +2 -2
- data/lib/authlogic/crypto_providers.rb +2 -0
- data/lib/authlogic/crypto_providers/bcrypt.rb +15 -9
- data/lib/authlogic/crypto_providers/md5.rb +2 -1
- data/lib/authlogic/crypto_providers/scrypt.rb +12 -7
- data/lib/authlogic/crypto_providers/sha256.rb +2 -1
- data/lib/authlogic/crypto_providers/wordpress.rb +31 -2
- data/lib/authlogic/i18n.rb +22 -17
- data/lib/authlogic/regex.rb +57 -29
- data/lib/authlogic/session/activation.rb +1 -1
- data/lib/authlogic/session/brute_force_protection.rb +2 -2
- data/lib/authlogic/session/callbacks.rb +43 -36
- data/lib/authlogic/session/cookies.rb +4 -2
- data/lib/authlogic/session/existence.rb +1 -1
- data/lib/authlogic/session/foundation.rb +5 -1
- data/lib/authlogic/session/http_auth.rb +2 -2
- data/lib/authlogic/session/klass.rb +2 -1
- data/lib/authlogic/session/magic_columns.rb +4 -2
- data/lib/authlogic/session/magic_states.rb +9 -10
- data/lib/authlogic/session/params.rb +11 -4
- data/lib/authlogic/session/password.rb +72 -38
- data/lib/authlogic/session/perishable_token.rb +2 -1
- data/lib/authlogic/session/persistence.rb +2 -1
- data/lib/authlogic/session/scopes.rb +26 -16
- data/lib/authlogic/session/unauthorized_record.rb +12 -7
- data/lib/authlogic/session/validation.rb +1 -1
- data/lib/authlogic/test_case/mock_controller.rb +1 -1
- data/lib/authlogic/test_case/mock_cookie_jar.rb +1 -1
- data/lib/authlogic/test_case/mock_request.rb +1 -1
- data/lib/authlogic/version.rb +1 -1
- data/test/acts_as_authentic_test/base_test.rb +1 -1
- data/test/acts_as_authentic_test/email_test.rb +11 -11
- data/test/acts_as_authentic_test/logged_in_status_test.rb +4 -4
- data/test/acts_as_authentic_test/login_test.rb +2 -2
- data/test/acts_as_authentic_test/magic_columns_test.rb +1 -1
- data/test/acts_as_authentic_test/password_test.rb +1 -1
- data/test/acts_as_authentic_test/perishable_token_test.rb +2 -2
- data/test/acts_as_authentic_test/persistence_token_test.rb +1 -1
- data/test/acts_as_authentic_test/restful_authentication_test.rb +12 -3
- data/test/acts_as_authentic_test/session_maintenance_test.rb +1 -1
- data/test/acts_as_authentic_test/single_access_test.rb +1 -1
- data/test/adapter_test.rb +3 -3
- data/test/authenticates_many_test.rb +1 -1
- data/test/config_test.rb +9 -9
- data/test/crypto_provider_test/aes256_test.rb +1 -1
- data/test/crypto_provider_test/bcrypt_test.rb +1 -1
- data/test/crypto_provider_test/scrypt_test.rb +1 -1
- data/test/crypto_provider_test/sha1_test.rb +1 -1
- data/test/crypto_provider_test/sha256_test.rb +1 -1
- data/test/crypto_provider_test/sha512_test.rb +1 -1
- data/test/crypto_provider_test/wordpress_test.rb +24 -0
- data/test/i18n_test.rb +3 -3
- data/test/libs/user_session.rb +2 -2
- data/test/random_test.rb +1 -1
- data/test/session_test/activation_test.rb +1 -1
- data/test/session_test/active_record_trickery_test.rb +3 -3
- data/test/session_test/brute_force_protection_test.rb +1 -1
- data/test/session_test/callbacks_test.rb +9 -3
- data/test/session_test/cookies_test.rb +11 -11
- data/test/session_test/existence_test.rb +1 -1
- data/test/session_test/foundation_test.rb +1 -1
- data/test/session_test/http_auth_test.rb +6 -6
- data/test/session_test/id_test.rb +1 -1
- data/test/session_test/klass_test.rb +1 -1
- data/test/session_test/magic_columns_test.rb +1 -1
- data/test/session_test/magic_states_test.rb +1 -1
- data/test/session_test/params_test.rb +7 -4
- data/test/session_test/password_test.rb +1 -1
- data/test/session_test/perishability_test.rb +1 -1
- data/test/session_test/persistence_test.rb +1 -1
- data/test/session_test/scopes_test.rb +9 -3
- data/test/session_test/session_test.rb +2 -2
- data/test/session_test/timeout_test.rb +1 -1
- data/test/session_test/unauthorized_record_test.rb +1 -1
- data/test/session_test/validation_test.rb +1 -1
- data/test/test_helper.rb +34 -14
- metadata +6 -4
@@ -29,6 +29,8 @@ module Authlogic
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
# Configuration for the session maintenance aspect of acts_as_authentic.
|
33
|
+
# These methods become class methods of ::ActiveRecord::Base.
|
32
34
|
module Config
|
33
35
|
# In order to turn off automatic maintenance of sessions
|
34
36
|
# after create, just set this to false.
|
@@ -68,12 +70,18 @@ module Authlogic
|
|
68
70
|
# * <tt>Default:</tt> "#{klass.name}Session".constantize
|
69
71
|
# * <tt>Accepts:</tt> Class
|
70
72
|
def session_class(value = nil)
|
71
|
-
const =
|
73
|
+
const = begin
|
74
|
+
"#{base_class.name}Session".constantize
|
75
|
+
rescue NameError
|
76
|
+
nil
|
77
|
+
end
|
72
78
|
rw_config(:session_class, value, const)
|
73
79
|
end
|
74
80
|
alias_method :session_class=, :session_class
|
75
81
|
end
|
76
82
|
|
83
|
+
# This module, as one of the `acts_as_authentic_modules`, is only included
|
84
|
+
# into an ActiveRecord model if that model calls `acts_as_authentic`.
|
77
85
|
module Methods
|
78
86
|
def self.included(klass)
|
79
87
|
klass.class_eval do
|
@@ -139,7 +147,7 @@ module Authlogic
|
|
139
147
|
session_id = session_ids.first
|
140
148
|
session_class.create(*[self, self, session_id].compact)
|
141
149
|
|
142
|
-
|
150
|
+
true
|
143
151
|
end
|
144
152
|
|
145
153
|
def update_sessions
|
@@ -150,7 +158,7 @@ module Authlogic
|
|
150
158
|
stale_session.save
|
151
159
|
end
|
152
160
|
|
153
|
-
|
161
|
+
true
|
154
162
|
end
|
155
163
|
|
156
164
|
def session_ids
|
@@ -12,6 +12,8 @@ module Authlogic
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# All configuration for the single_access token aspect of acts_as_authentic.
|
15
|
+
#
|
16
|
+
# These methods become class methods of ::ActiveRecord::Base.
|
15
17
|
module Config
|
16
18
|
# The single access token is used for authentication via URLs, such as a private
|
17
19
|
# feed. That being said, if the user changes their password, that token probably
|
@@ -23,10 +25,16 @@ module Authlogic
|
|
23
25
|
def change_single_access_token_with_password(value = nil)
|
24
26
|
rw_config(:change_single_access_token_with_password, value, false)
|
25
27
|
end
|
26
|
-
alias_method
|
28
|
+
alias_method(
|
29
|
+
:change_single_access_token_with_password=,
|
30
|
+
:change_single_access_token_with_password
|
31
|
+
)
|
27
32
|
end
|
28
33
|
|
29
34
|
# All method, for the single_access token aspect of acts_as_authentic.
|
35
|
+
#
|
36
|
+
# This module, as one of the `acts_as_authentic_modules`, is only included
|
37
|
+
# into an ActiveRecord model if that model calls `acts_as_authentic`.
|
30
38
|
module Methods
|
31
39
|
def self.included(klass)
|
32
40
|
return unless klass.column_names.include?("single_access_token")
|
@@ -36,11 +44,15 @@ module Authlogic
|
|
36
44
|
validates_uniqueness_of :single_access_token, if: :single_access_token_changed?
|
37
45
|
before_validation :reset_single_access_token, if: :reset_single_access_token?
|
38
46
|
if respond_to?(:after_password_set)
|
39
|
-
after_password_set(
|
47
|
+
after_password_set(
|
48
|
+
:reset_single_access_token,
|
49
|
+
if: :change_single_access_token_with_password?
|
50
|
+
)
|
40
51
|
end
|
41
52
|
end
|
42
53
|
end
|
43
54
|
|
55
|
+
# :nodoc:
|
44
56
|
module InstanceMethods
|
45
57
|
# Resets the single_access_token to a random friendly token.
|
46
58
|
def reset_single_access_token
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Authlogic
|
2
2
|
module ActsAsAuthentic
|
3
|
-
# Allows you to scope everything to specific fields.
|
4
|
-
#
|
5
|
-
#
|
3
|
+
# Allows you to scope everything to specific fields. See the Config
|
4
|
+
# submodule for more info. For information on how to scope off of a parent
|
5
|
+
# object see Authlogic::AuthenticatesMany
|
6
6
|
module ValidationsScope
|
7
7
|
def self.included(klass)
|
8
8
|
klass.class_eval do
|
@@ -12,9 +12,9 @@ module Authlogic
|
|
12
12
|
|
13
13
|
# All configuration for the scope feature.
|
14
14
|
module Config
|
15
|
-
# Allows you to scope everything to specific field(s). Works just like
|
16
|
-
# For example, let's say a user belongs to a
|
17
|
-
# company:
|
15
|
+
# Allows you to scope everything to specific field(s). Works just like
|
16
|
+
# validates_uniqueness_of. For example, let's say a user belongs to a
|
17
|
+
# company, and you want to scope everything to the company:
|
18
18
|
#
|
19
19
|
# acts_as_authentic do |c|
|
20
20
|
# c.validations_scope = :company_id
|
@@ -29,8 +29,8 @@ module Authlogic
|
|
29
29
|
self.id = id
|
30
30
|
end
|
31
31
|
|
32
|
-
[
|
33
|
-
class_eval <<-EOS, __FILE__, __LINE__
|
32
|
+
%i[create create! find new].each do |method|
|
33
|
+
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
34
34
|
def #{method}(*args)
|
35
35
|
klass.with_scope(scope_options) do
|
36
36
|
klass.#{method}(*args)
|
@@ -17,8 +17,9 @@ module Authlogic
|
|
17
17
|
# Checkout the authenticates_many method for a list of options.
|
18
18
|
# You may also want to checkout Authlogic::ActsAsAuthentic::Scope to scope your model.
|
19
19
|
module AuthenticatesMany
|
20
|
+
# These methods become class methods of ::ActiveRecord::Base.
|
20
21
|
module Base
|
21
|
-
# Allows you
|
22
|
+
# Allows you to set up a relationship with your sessions. See module
|
22
23
|
# definition above for more details.
|
23
24
|
#
|
24
25
|
# === Options
|
@@ -26,35 +27,42 @@ module Authlogic
|
|
26
27
|
# * <tt>session_class:</tt> default: "#{name}Session",
|
27
28
|
# This is the related session class.
|
28
29
|
#
|
29
|
-
# * <tt>relationship_name:</tt>
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
30
|
+
# * <tt>relationship_name:</tt>
|
31
|
+
# default: options[:session_class].klass_name.underscore.pluralize,
|
32
|
+
# This is the name of the relationship you want to use to scope
|
33
|
+
# everything. For example an Account has many Users. There should be a
|
34
|
+
# relationship called :users that you defined with a has_many. The
|
35
|
+
# reason we use the relationship is so you don't have to repeat
|
36
|
+
# yourself. The relationship could have all kinds of custom options. So
|
37
|
+
# instead of repeating yourself we essentially use the scope that the
|
35
38
|
# relationship creates.
|
36
39
|
#
|
37
40
|
# * <tt>find_options:</tt> default: nil,
|
38
|
-
# By default the find options are created from the relationship you
|
39
|
-
# :relationship_name. But if you want to override this and
|
40
|
-
# find_options you can do it here. Specify options just
|
41
|
-
# ActiveRecord::Base.find.
|
41
|
+
# By default the find options are created from the relationship you
|
42
|
+
# specify with :relationship_name. But if you want to override this and
|
43
|
+
# manually specify find_options you can do it here. Specify options just
|
44
|
+
# as you would in ActiveRecord::Base.find.
|
42
45
|
#
|
43
46
|
# * <tt>scope_cookies:</tt> default: false
|
44
|
-
# By the nature of cookies they scope themselves if you are using
|
45
|
-
# access accounts. If you aren't using subdomains you need
|
46
|
-
# cookies for each account, assuming a user is logging
|
47
|
-
# Authlogic can take care of this for you by
|
48
|
-
#
|
49
|
-
#
|
47
|
+
# By the nature of cookies they scope themselves if you are using
|
48
|
+
# subdomains to access accounts. If you aren't using subdomains you need
|
49
|
+
# to have separate cookies for each account, assuming a user is logging
|
50
|
+
# into more than one account. Authlogic can take care of this for you by
|
51
|
+
# prefixing the name of the cookie and session with the model id.
|
52
|
+
# Because it affects both cookies names and session keys, the name
|
53
|
+
# `scope_cookies` is misleading. Perhaps simply `scope` or `scoped`
|
50
54
|
# would have been better.
|
51
55
|
def authenticates_many(name, options = {})
|
52
56
|
options[:session_class] ||= name.to_s.classify.constantize
|
53
57
|
options[:relationship_name] ||= options[:session_class].klass_name.underscore.pluralize
|
54
|
-
class_eval <<-EOS, __FILE__, __LINE__
|
58
|
+
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
55
59
|
def #{name}
|
56
60
|
find_options = #{options[:find_options].inspect} || #{options[:relationship_name]}.where(nil)
|
57
|
-
@#{name} ||= Authlogic::AuthenticatesMany::Association.new(
|
61
|
+
@#{name} ||= Authlogic::AuthenticatesMany::Association.new(
|
62
|
+
#{options[:session_class]},
|
63
|
+
find_options,
|
64
|
+
#{options[:scope_cookies] ? "self.class.model_name.name.underscore + '_' + self.send(self.class.primary_key).to_s" : 'nil'}
|
65
|
+
)
|
58
66
|
end
|
59
67
|
EOS
|
60
68
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "action_controller"
|
2
2
|
|
3
3
|
module Authlogic
|
4
4
|
module ControllerAdapters
|
@@ -20,7 +20,7 @@ module Authlogic
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def cookie_domain
|
23
|
-
@cookie_domain_key ||= Rails::VERSION::STRING >=
|
23
|
+
@cookie_domain_key ||= Rails::VERSION::STRING >= "2.3" ? :domain : :session_domain
|
24
24
|
controller.request.session_options[@cookie_domain_key]
|
25
25
|
end
|
26
26
|
|
@@ -64,4 +64,7 @@ module Authlogic
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
ActionController::Base.send(
|
67
|
+
ActionController::Base.send(
|
68
|
+
:include,
|
69
|
+
Authlogic::ControllerAdapters::RailsAdapter::RailsImplementation
|
70
|
+
)
|
@@ -32,7 +32,7 @@ module Authlogic
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def session
|
35
|
-
env[
|
35
|
+
env["rack.session"]
|
36
36
|
end
|
37
37
|
|
38
38
|
def method_missing(meth, *args, &block)
|
@@ -42,7 +42,7 @@ module Authlogic
|
|
42
42
|
|
43
43
|
class Adapter < AbstractAdapter
|
44
44
|
def cookie_domain
|
45
|
-
env[
|
45
|
+
env["SERVER_NAME"]
|
46
46
|
end
|
47
47
|
|
48
48
|
module Implementation
|
@@ -7,5 +7,7 @@ module Authlogic
|
|
7
7
|
autoload :BCrypt, "authlogic/crypto_providers/bcrypt"
|
8
8
|
autoload :AES256, "authlogic/crypto_providers/aes256"
|
9
9
|
autoload :SCrypt, "authlogic/crypto_providers/scrypt"
|
10
|
+
# crypto_providers/wordpress.rb has never been autoloaded, and now it is
|
11
|
+
# deprecated.
|
10
12
|
end
|
11
13
|
end
|
@@ -16,10 +16,18 @@ module Authlogic
|
|
16
16
|
# require "benchmark"
|
17
17
|
#
|
18
18
|
# Benchmark.bm(18) do |x|
|
19
|
-
# x.report("BCrypt (cost = 10:") {
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# x.report("
|
19
|
+
# x.report("BCrypt (cost = 10:") {
|
20
|
+
# 100.times { BCrypt::Password.create("mypass", :cost => 10) }
|
21
|
+
# }
|
22
|
+
# x.report("BCrypt (cost = 4:") {
|
23
|
+
# 100.times { BCrypt::Password.create("mypass", :cost => 4) }
|
24
|
+
# }
|
25
|
+
# x.report("Sha512:") {
|
26
|
+
# 100.times { Digest::SHA512.hexdigest("mypass") }
|
27
|
+
# }
|
28
|
+
# x.report("Sha1:") {
|
29
|
+
# 100.times { Digest::SHA1.hexdigest("mypass") }
|
30
|
+
# }
|
23
31
|
# end
|
24
32
|
#
|
25
33
|
# user system total real
|
@@ -95,11 +103,9 @@ module Authlogic
|
|
95
103
|
end
|
96
104
|
|
97
105
|
def new_from_hash(hash)
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
return nil
|
102
|
-
end
|
106
|
+
::BCrypt::Password.new(hash)
|
107
|
+
rescue ::BCrypt::Errors::InvalidHash
|
108
|
+
nil
|
103
109
|
end
|
104
110
|
end
|
105
111
|
end
|
@@ -24,7 +24,8 @@ module Authlogic
|
|
24
24
|
digest
|
25
25
|
end
|
26
26
|
|
27
|
-
# Does the crypted password match the tokens? Uses the same tokens that
|
27
|
+
# Does the crypted password match the tokens? Uses the same tokens that
|
28
|
+
# were used to encrypt.
|
28
29
|
def matches?(crypted, *tokens)
|
29
30
|
encrypt(*tokens) == crypted
|
30
31
|
end
|
@@ -19,7 +19,13 @@ module Authlogic
|
|
19
19
|
# end
|
20
20
|
class SCrypt
|
21
21
|
class << self
|
22
|
-
DEFAULTS = {
|
22
|
+
DEFAULTS = {
|
23
|
+
key_len: 32,
|
24
|
+
salt_size: 8,
|
25
|
+
max_time: 0.2,
|
26
|
+
max_mem: 1024 * 1024,
|
27
|
+
max_memfrac: 0.5
|
28
|
+
}.freeze
|
23
29
|
|
24
30
|
attr_writer :key_len, :salt_size, :max_time, :max_mem, :max_memfrac
|
25
31
|
# Key length - length in bytes of generated key, from 16 to 512.
|
@@ -42,7 +48,8 @@ module Authlogic
|
|
42
48
|
@max_mem ||= DEFAULTS[:max_mem]
|
43
49
|
end
|
44
50
|
|
45
|
-
# Max memory fraction - maximum memory out of all available. Always
|
51
|
+
# Max memory fraction - maximum memory out of all available. Always
|
52
|
+
# greater than zero and <= 0.5.
|
46
53
|
def max_memfrac
|
47
54
|
@max_memfrac ||= DEFAULTS[:max_memfrac]
|
48
55
|
end
|
@@ -73,11 +80,9 @@ module Authlogic
|
|
73
80
|
end
|
74
81
|
|
75
82
|
def new_from_hash(hash)
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
return nil
|
80
|
-
end
|
83
|
+
::SCrypt::Password.new(hash)
|
84
|
+
rescue ::SCrypt::Errors::InvalidHash
|
85
|
+
nil
|
81
86
|
end
|
82
87
|
end
|
83
88
|
end
|
@@ -43,7 +43,8 @@ module Authlogic
|
|
43
43
|
digest
|
44
44
|
end
|
45
45
|
|
46
|
-
# Does the crypted password match the tokens? Uses the same tokens that
|
46
|
+
# Does the crypted password match the tokens? Uses the same tokens that
|
47
|
+
# were used to encrypt.
|
47
48
|
def matches?(crypted, *tokens)
|
48
49
|
encrypt(*tokens) == crypted
|
49
50
|
end
|
@@ -1,9 +1,38 @@
|
|
1
|
-
require
|
1
|
+
require "digest/md5"
|
2
|
+
|
3
|
+
::ActiveSupport::Deprecation.warn(
|
4
|
+
<<-EOS,
|
5
|
+
authlogic/crypto_providers/wordpress.rb is deprecated without replacement.
|
6
|
+
Yes, the entire file. Don't `require` it. Let us know ASAP if you are still
|
7
|
+
using it.
|
8
|
+
|
9
|
+
Reasons for deprecation: This file is not autoloaded by
|
10
|
+
`authlogic/crypto_providers.rb`. It's not documented. There are no tests.
|
11
|
+
So, it's likely used by a *very* small number of people, if any. It's never
|
12
|
+
had any contributions except by its original author, Jeffry Degrande, in
|
13
|
+
2009. It is unclear why it should live in the main authlogic codebase. It
|
14
|
+
could be in a separate gem, authlogic-wordpress, or it could just live in
|
15
|
+
Jeffry's codebase, if he still even needs it, in 2018, nine years later.
|
16
|
+
EOS
|
17
|
+
caller(1)
|
18
|
+
)
|
19
|
+
|
2
20
|
module Authlogic
|
3
21
|
module CryptoProviders
|
22
|
+
# Crypto provider to transition from wordpress user accounts. Written by
|
23
|
+
# Jeffry Degrande in 2009. First released in 2.1.3.
|
24
|
+
#
|
25
|
+
# Problems:
|
26
|
+
#
|
27
|
+
# - There are no tests.
|
28
|
+
# - We can't even figure out how to run this without it crashing.
|
29
|
+
# - Presumably it implements some spec, but it doesn't mention which.
|
30
|
+
# - It is not documented anywhere.
|
31
|
+
# - There is no PR associated with this, and no discussion about it could be found.
|
32
|
+
#
|
4
33
|
class Wordpress
|
5
34
|
class << self
|
6
|
-
ITOA64 =
|
35
|
+
ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".freeze
|
7
36
|
|
8
37
|
def matches?(crypted, *tokens)
|
9
38
|
stretches = 1 << ITOA64.index(crypted[3, 1])
|
data/lib/authlogic/i18n.rb
CHANGED
@@ -1,35 +1,40 @@
|
|
1
1
|
require "authlogic/i18n/translator"
|
2
2
|
|
3
3
|
module Authlogic
|
4
|
-
# This class allows any message in Authlogic to use internationalization. In
|
5
|
-
# versions of Authlogic each message was translated via configuration.
|
6
|
-
# the configuration and cluttered up Authlogic. So all
|
7
|
-
# out into this class. Now all messages pass
|
8
|
-
#
|
9
|
-
#
|
4
|
+
# This class allows any message in Authlogic to use internationalization. In
|
5
|
+
# earlier versions of Authlogic each message was translated via configuration.
|
6
|
+
# This cluttered up the configuration and cluttered up Authlogic. So all
|
7
|
+
# translation has been extracted out into this class. Now all messages pass
|
8
|
+
# through this class, making it much easier to implement in I18n library /
|
9
|
+
# plugin you want. Use this as a layer that sits between Authlogic and
|
10
|
+
# whatever I18n library you want to use.
|
10
11
|
#
|
11
|
-
# By default this uses the rails I18n library, if it exists. If it doesn't
|
12
|
-
# returns the default English message. The Authlogic I18n class
|
13
|
-
# rails I18n class. This is because the arguments are
|
12
|
+
# By default this uses the rails I18n library, if it exists. If it doesn't
|
13
|
+
# exist it just returns the default English message. The Authlogic I18n class
|
14
|
+
# works EXACTLY like the rails I18n class. This is because the arguments are
|
15
|
+
# delegated to this class.
|
14
16
|
#
|
15
17
|
# Here is how all messages are translated internally with Authlogic:
|
16
18
|
#
|
17
19
|
# Authlogic::I18n.t('error_messages.password_invalid', :default => "is invalid")
|
18
20
|
#
|
19
|
-
# If you use a different I18n library just replace the build-in
|
20
|
-
# with your own. For example:
|
21
|
+
# If you use a different I18n library just replace the build-in
|
22
|
+
# I18n::Translator class with your own. For example:
|
21
23
|
#
|
22
24
|
# class MyAuthlogicI18nTranslator
|
23
25
|
# def translate(key, options = {})
|
24
|
-
# # you will have key which will be something like:
|
25
|
-
# #
|
26
|
+
# # you will have key which will be something like:
|
27
|
+
# # "error_messages.password_invalid"
|
28
|
+
# # you will also have options[:default], which will be the default
|
29
|
+
# # English version of the message
|
26
30
|
# # do whatever you want here with the arguments passed to you.
|
27
31
|
# end
|
28
32
|
# end
|
29
33
|
#
|
30
34
|
# Authlogic::I18n.translator = MyAuthlogicI18nTranslator.new
|
31
35
|
#
|
32
|
-
# That it's! Here is a complete list of the keys that are passed. Just define
|
36
|
+
# That it's! Here is a complete list of the keys that are passed. Just define
|
37
|
+
# these however you wish:
|
33
38
|
#
|
34
39
|
# authlogic:
|
35
40
|
# error_messages:
|
@@ -81,9 +86,9 @@ module Authlogic
|
|
81
86
|
@@translator = translator
|
82
87
|
end
|
83
88
|
|
84
|
-
# All message translation is passed to this method. The first argument is
|
85
|
-
# for the message. The second is options, see the rails I18n
|
86
|
-
# options used.
|
89
|
+
# All message translation is passed to this method. The first argument is
|
90
|
+
# the key for the message. The second is options, see the rails I18n
|
91
|
+
# library for a list of options used.
|
87
92
|
def translate(key, options = {})
|
88
93
|
translator.translate key, { scope: I18n.scope }.merge(options)
|
89
94
|
end
|