authlogic 3.8.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/lib/authlogic/acts_as_authentic/base.rb +33 -36
  3. data/lib/authlogic/acts_as_authentic/email.rb +8 -141
  4. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +17 -10
  5. data/lib/authlogic/acts_as_authentic/login.rb +14 -165
  6. data/lib/authlogic/acts_as_authentic/magic_columns.rb +13 -10
  7. data/lib/authlogic/acts_as_authentic/password.rb +186 -254
  8. data/lib/authlogic/acts_as_authentic/perishable_token.rb +30 -22
  9. data/lib/authlogic/acts_as_authentic/persistence_token.rb +19 -18
  10. data/lib/authlogic/acts_as_authentic/queries/case_sensitivity.rb +53 -0
  11. data/lib/authlogic/acts_as_authentic/queries/find_with_case.rb +83 -0
  12. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +94 -62
  13. data/lib/authlogic/acts_as_authentic/single_access_token.rb +28 -14
  14. data/lib/authlogic/config.rb +29 -10
  15. data/lib/authlogic/controller_adapters/abstract_adapter.rb +43 -13
  16. data/lib/authlogic/controller_adapters/rack_adapter.rb +11 -5
  17. data/lib/authlogic/controller_adapters/rails_adapter.rb +11 -29
  18. data/lib/authlogic/controller_adapters/sinatra_adapter.rb +8 -2
  19. data/lib/authlogic/cookie_credentials.rb +63 -0
  20. data/lib/authlogic/crypto_providers/bcrypt.rb +24 -18
  21. data/lib/authlogic/crypto_providers/md5/v2.rb +35 -0
  22. data/lib/authlogic/crypto_providers/md5.rb +8 -6
  23. data/lib/authlogic/crypto_providers/scrypt.rb +24 -17
  24. data/lib/authlogic/crypto_providers/sha1/v2.rb +41 -0
  25. data/lib/authlogic/crypto_providers/sha1.rb +12 -5
  26. data/lib/authlogic/crypto_providers/sha256/v2.rb +58 -0
  27. data/lib/authlogic/crypto_providers/sha256.rb +18 -9
  28. data/lib/authlogic/crypto_providers/sha512/v2.rb +39 -0
  29. data/lib/authlogic/crypto_providers/sha512.rb +9 -26
  30. data/lib/authlogic/crypto_providers.rb +77 -1
  31. data/lib/authlogic/errors.rb +35 -0
  32. data/lib/authlogic/i18n/translator.rb +4 -1
  33. data/lib/authlogic/i18n.rb +29 -20
  34. data/lib/authlogic/random.rb +12 -28
  35. data/lib/authlogic/session/base.rb +2087 -33
  36. data/lib/authlogic/session/magic_column/assigns_last_request_at.rb +46 -0
  37. data/lib/authlogic/test_case/mock_controller.rb +7 -4
  38. data/lib/authlogic/test_case/mock_cookie_jar.rb +19 -3
  39. data/lib/authlogic/test_case/mock_logger.rb +2 -0
  40. data/lib/authlogic/test_case/mock_request.rb +8 -3
  41. data/lib/authlogic/test_case/rails_request_adapter.rb +5 -2
  42. data/lib/authlogic/test_case.rb +74 -2
  43. data/lib/authlogic/version.rb +22 -0
  44. data/lib/authlogic.rb +33 -54
  45. metadata +208 -234
  46. data/.github/ISSUE_TEMPLATE.md +0 -13
  47. data/.gitignore +0 -14
  48. data/.rubocop.yml +0 -33
  49. data/.rubocop_todo.yml +0 -391
  50. data/.travis.yml +0 -48
  51. data/CHANGELOG.md +0 -5
  52. data/CONTRIBUTING.md +0 -60
  53. data/Gemfile +0 -5
  54. data/LICENSE +0 -20
  55. data/README.md +0 -294
  56. data/Rakefile +0 -21
  57. data/authlogic.gemspec +0 -27
  58. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +0 -70
  59. data/lib/authlogic/acts_as_authentic/validations_scope.rb +0 -32
  60. data/lib/authlogic/authenticates_many/association.rb +0 -50
  61. data/lib/authlogic/authenticates_many/base.rb +0 -65
  62. data/lib/authlogic/crypto_providers/aes256.rb +0 -66
  63. data/lib/authlogic/crypto_providers/wordpress.rb +0 -43
  64. data/lib/authlogic/regex.rb +0 -48
  65. data/lib/authlogic/session/activation.rb +0 -70
  66. data/lib/authlogic/session/active_record_trickery.rb +0 -61
  67. data/lib/authlogic/session/brute_force_protection.rb +0 -120
  68. data/lib/authlogic/session/callbacks.rb +0 -105
  69. data/lib/authlogic/session/cookies.rb +0 -244
  70. data/lib/authlogic/session/existence.rb +0 -93
  71. data/lib/authlogic/session/foundation.rb +0 -55
  72. data/lib/authlogic/session/http_auth.rb +0 -100
  73. data/lib/authlogic/session/id.rb +0 -48
  74. data/lib/authlogic/session/klass.rb +0 -70
  75. data/lib/authlogic/session/magic_columns.rb +0 -116
  76. data/lib/authlogic/session/magic_states.rb +0 -76
  77. data/lib/authlogic/session/params.rb +0 -116
  78. data/lib/authlogic/session/password.rb +0 -308
  79. data/lib/authlogic/session/perishable_token.rb +0 -23
  80. data/lib/authlogic/session/persistence.rb +0 -71
  81. data/lib/authlogic/session/priority_record.rb +0 -35
  82. data/lib/authlogic/session/scopes.rb +0 -119
  83. data/lib/authlogic/session/session.rb +0 -67
  84. data/lib/authlogic/session/timeout.rb +0 -103
  85. data/lib/authlogic/session/unauthorized_record.rb +0 -51
  86. data/lib/authlogic/session/validation.rb +0 -93
  87. data/test/acts_as_authentic_test/base_test.rb +0 -25
  88. data/test/acts_as_authentic_test/email_test.rb +0 -240
  89. data/test/acts_as_authentic_test/logged_in_status_test.rb +0 -62
  90. data/test/acts_as_authentic_test/login_test.rb +0 -156
  91. data/test/acts_as_authentic_test/magic_columns_test.rb +0 -27
  92. data/test/acts_as_authentic_test/password_test.rb +0 -249
  93. data/test/acts_as_authentic_test/perishable_token_test.rb +0 -90
  94. data/test/acts_as_authentic_test/persistence_token_test.rb +0 -56
  95. data/test/acts_as_authentic_test/restful_authentication_test.rb +0 -37
  96. data/test/acts_as_authentic_test/session_maintenance_test.rb +0 -96
  97. data/test/acts_as_authentic_test/single_access_test.rb +0 -44
  98. data/test/authenticates_many_test.rb +0 -31
  99. data/test/config_test.rb +0 -36
  100. data/test/crypto_provider_test/aes256_test.rb +0 -14
  101. data/test/crypto_provider_test/bcrypt_test.rb +0 -14
  102. data/test/crypto_provider_test/scrypt_test.rb +0 -14
  103. data/test/crypto_provider_test/sha1_test.rb +0 -23
  104. data/test/crypto_provider_test/sha256_test.rb +0 -14
  105. data/test/crypto_provider_test/sha512_test.rb +0 -14
  106. data/test/fixtures/companies.yml +0 -5
  107. data/test/fixtures/employees.yml +0 -17
  108. data/test/fixtures/projects.yml +0 -3
  109. data/test/fixtures/users.yml +0 -41
  110. data/test/gemfiles/Gemfile.rails-3.2.x +0 -7
  111. data/test/gemfiles/Gemfile.rails-4.0.x +0 -7
  112. data/test/gemfiles/Gemfile.rails-4.1.x +0 -7
  113. data/test/gemfiles/Gemfile.rails-4.2.x +0 -7
  114. data/test/gemfiles/Gemfile.rails-5.0.x +0 -6
  115. data/test/gemfiles/Gemfile.rails-5.1.x +0 -6
  116. data/test/gemfiles/Gemfile.rails-5.2.x +0 -6
  117. data/test/i18n/lol.yml +0 -4
  118. data/test/i18n_test.rb +0 -33
  119. data/test/libs/affiliate.rb +0 -7
  120. data/test/libs/company.rb +0 -6
  121. data/test/libs/employee.rb +0 -7
  122. data/test/libs/employee_session.rb +0 -2
  123. data/test/libs/ldaper.rb +0 -3
  124. data/test/libs/project.rb +0 -3
  125. data/test/libs/user.rb +0 -7
  126. data/test/libs/user_session.rb +0 -25
  127. data/test/random_test.rb +0 -43
  128. data/test/session_test/activation_test.rb +0 -43
  129. data/test/session_test/active_record_trickery_test.rb +0 -75
  130. data/test/session_test/brute_force_protection_test.rb +0 -108
  131. data/test/session_test/callbacks_test.rb +0 -34
  132. data/test/session_test/cookies_test.rb +0 -201
  133. data/test/session_test/credentials_test.rb +0 -0
  134. data/test/session_test/existence_test.rb +0 -75
  135. data/test/session_test/foundation_test.rb +0 -6
  136. data/test/session_test/http_auth_test.rb +0 -56
  137. data/test/session_test/id_test.rb +0 -17
  138. data/test/session_test/klass_test.rb +0 -40
  139. data/test/session_test/magic_columns_test.rb +0 -62
  140. data/test/session_test/magic_states_test.rb +0 -58
  141. data/test/session_test/params_test.rb +0 -53
  142. data/test/session_test/password_test.rb +0 -105
  143. data/test/session_test/perishability_test.rb +0 -15
  144. data/test/session_test/persistence_test.rb +0 -32
  145. data/test/session_test/scopes_test.rb +0 -60
  146. data/test/session_test/session_test.rb +0 -78
  147. data/test/session_test/timeout_test.rb +0 -82
  148. data/test/session_test/unauthorized_record_test.rb +0 -13
  149. data/test/session_test/validation_test.rb +0 -23
  150. data/test/test_helper.rb +0 -233
@@ -1,22 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "digest/sha2"
2
4
 
3
5
  module Authlogic
4
- # The acts_as_authentic method has a crypto_provider option. This allows you to use any type of encryption you like.
5
- # Just create a class with a class level encrypt and matches? method. See example below.
6
+ # The acts_as_authentic method has a crypto_provider option. This allows you
7
+ # to use any type of encryption you like. Just create a class with a class
8
+ # level encrypt and matches? method. See example below.
6
9
  #
7
10
  # === Example
8
11
  #
9
12
  # class MyAwesomeEncryptionMethod
10
13
  # def self.encrypt(*tokens)
11
- # # the tokens passed will be an array of objects, what type of object is irrelevant,
12
- # # just do what you need to do with them and return a single encrypted string.
13
- # # for example, you will most likely join all of the objects into a single string and then encrypt that string
14
+ # # the tokens passed will be an array of objects, what type of object
15
+ # # is irrelevant, just do what you need to do with them and return a
16
+ # # single encrypted string. for example, you will most likely join all
17
+ # # of the objects into a single string and then encrypt that string
14
18
  # end
15
19
  #
16
20
  # def self.matches?(crypted, *tokens)
17
- # # return true if the crypted string matches the tokens.
18
- # # depending on your algorithm you might decrypt the string then compare it to the token, or you might
19
- # # encrypt the tokens and make sure it matches the crypted string, its up to you
21
+ # # return true if the crypted string matches the tokens. Depending on
22
+ # # your algorithm you might decrypt the string then compare it to the
23
+ # # token, or you might encrypt the tokens and make sure it matches the
24
+ # # crypted string, its up to you.
20
25
  # end
21
26
  # end
22
27
  module CryptoProviders
@@ -24,6 +29,9 @@ module Authlogic
24
29
  #
25
30
  # Uses the Sha256 hash algorithm to encrypt passwords.
26
31
  class Sha256
32
+ # V2 hashes the digest bytes in repeated stretches instead of hex characters.
33
+ autoload :V2, File.join(__dir__, "sha256", "v2")
34
+
27
35
  class << self
28
36
  attr_accessor :join_token
29
37
 
@@ -40,7 +48,8 @@ module Authlogic
40
48
  digest
41
49
  end
42
50
 
43
- # Does the crypted password match the tokens? Uses the same tokens that were used to encrypt.
51
+ # Does the crypted password match the tokens? Uses the same tokens that
52
+ # were used to encrypt.
44
53
  def matches?(crypted, *tokens)
45
54
  encrypt(*tokens) == crypted
46
55
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "digest/sha2"
4
+
5
+ module Authlogic
6
+ module CryptoProviders
7
+ class Sha512
8
+ # SHA-512 does not have any practical known attacks against it. However,
9
+ # there are better choices. We recommend transitioning to a more secure,
10
+ # adaptive hashing algorithm, like scrypt.
11
+ class V2
12
+ class << self
13
+ attr_accessor :join_token
14
+
15
+ # The number of times to loop through the encryption.
16
+ def stretches
17
+ @stretches ||= 20
18
+ end
19
+ attr_writer :stretches
20
+
21
+ # Turns your raw password into a Sha512 hash.
22
+ def encrypt(*tokens)
23
+ digest = tokens.flatten.join(join_token)
24
+ stretches.times do
25
+ digest = Digest::SHA512.digest(digest)
26
+ end
27
+ digest.unpack("H*")[0]
28
+ end
29
+
30
+ # Does the crypted password match the tokens? Uses the same tokens that
31
+ # were used to encrypt.
32
+ def matches?(crypted, *tokens)
33
+ encrypt(*tokens) == crypted
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,37 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "digest/sha2"
2
4
 
3
5
  module Authlogic
4
- # The acts_as_authentic method has a crypto_provider option. This allows you
5
- # to use any type of encryption you like. Just create a class with a class
6
- # level encrypt and matches? method. See example below.
7
- #
8
- # === Example
9
- #
10
- # class MyAwesomeEncryptionMethod
11
- # def self.encrypt(*tokens)
12
- # # The tokens passed will be an array of objects, what type of object
13
- # # is irrelevant, just do what you need to do with them and return a
14
- # # single encrypted string. For example, you will most likely join all
15
- # # of the objects into a single string and then encrypt that string.
16
- # end
17
- #
18
- # def self.matches?(crypted, *tokens)
19
- # # Return true if the crypted string matches the tokens. Depending on
20
- # # your algorithm you might decrypt the string then compare it to the
21
- # # token, or you might encrypt the tokens and make sure it matches the
22
- # # crypted string, its up to you.
23
- # end
24
- # end
25
6
  module CryptoProviders
26
- # = Sha512
27
- #
28
- # Uses the Sha512 hash algorithm to encrypt passwords.
7
+ # SHA-512 does not have any practical known attacks against it. However,
8
+ # there are better choices. We recommend transitioning to a more secure,
9
+ # adaptive hashing algorithm, like scrypt.
29
10
  class Sha512
11
+ # V2 hashes the digest bytes in repeated stretches instead of hex characters.
12
+ autoload :V2, File.join(__dir__, "sha512", "v2")
13
+
30
14
  class << self
31
15
  attr_accessor :join_token
32
16
 
33
- # The number of times to loop through the encryption. This is twenty
34
- # because that is what restful_authentication defaults to.
17
+ # The number of times to loop through the encryption.
35
18
  def stretches
36
19
  @stretches ||= 20
37
20
  end
@@ -1,11 +1,87 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authlogic
4
+ # The acts_as_authentic method has a crypto_provider option. This allows you
5
+ # to use any type of encryption you like. Just create a class with a class
6
+ # level encrypt and matches? method. See example below.
7
+ #
8
+ # === Example
9
+ #
10
+ # class MyAwesomeEncryptionMethod
11
+ # def self.encrypt(*tokens)
12
+ # # The tokens passed will be an array of objects, what type of object
13
+ # # is irrelevant, just do what you need to do with them and return a
14
+ # # single encrypted string. For example, you will most likely join all
15
+ # # of the objects into a single string and then encrypt that string.
16
+ # end
17
+ #
18
+ # def self.matches?(crypted, *tokens)
19
+ # # Return true if the crypted string matches the tokens. Depending on
20
+ # # your algorithm you might decrypt the string then compare it to the
21
+ # # token, or you might encrypt the tokens and make sure it matches the
22
+ # # crypted string, its up to you.
23
+ # end
24
+ # end
2
25
  module CryptoProviders
3
26
  autoload :MD5, "authlogic/crypto_providers/md5"
4
27
  autoload :Sha1, "authlogic/crypto_providers/sha1"
5
28
  autoload :Sha256, "authlogic/crypto_providers/sha256"
6
29
  autoload :Sha512, "authlogic/crypto_providers/sha512"
7
30
  autoload :BCrypt, "authlogic/crypto_providers/bcrypt"
8
- autoload :AES256, "authlogic/crypto_providers/aes256"
9
31
  autoload :SCrypt, "authlogic/crypto_providers/scrypt"
32
+
33
+ # Guide users to choose a better crypto provider.
34
+ class Guidance
35
+ BUILTIN_PROVIDER_PREFIX = "Authlogic::CryptoProviders::"
36
+ NONADAPTIVE_ALGORITHM = <<~EOS
37
+ You have selected %s as your authlogic crypto provider. This algorithm
38
+ does not have any practical known attacks against it. However, there are
39
+ better choices.
40
+
41
+ Authlogic has no plans yet to deprecate this crypto provider. However,
42
+ we recommend transitioning to a more secure, adaptive hashing algorithm,
43
+ like scrypt. Adaptive algorithms are designed to slow down brute force
44
+ attacks, and over time the iteration count can be increased to make it
45
+ slower, so it remains resistant to brute-force search attacks even in
46
+ the face of increasing computation power.
47
+
48
+ Use the transition_from_crypto_providers option to make the transition
49
+ painless for your users.
50
+ EOS
51
+ VULNERABLE_ALGORITHM = <<~EOS
52
+ You have selected %s as your authlogic crypto provider. It is a poor
53
+ choice because there are known attacks against this algorithm.
54
+
55
+ Authlogic has no plans yet to deprecate this crypto provider. However,
56
+ we recommend transitioning to a secure hashing algorithm. We recommend
57
+ an adaptive algorithm, like scrypt.
58
+
59
+ Use the transition_from_crypto_providers option to make the transition
60
+ painless for your users.
61
+ EOS
62
+
63
+ def initialize(provider)
64
+ @provider = provider
65
+ end
66
+
67
+ def impart_wisdom
68
+ return unless @provider.is_a?(Class)
69
+
70
+ # We can only impart wisdom about our own built-in providers.
71
+ absolute_name = @provider.name
72
+ return unless absolute_name.start_with?(BUILTIN_PROVIDER_PREFIX)
73
+
74
+ # Inspect the string name of the provider, rather than using the
75
+ # constants in our `when` clauses. If we used the constants, we'd
76
+ # negate the benefits of the `autoload` above.
77
+ name = absolute_name.demodulize
78
+ case name
79
+ when "MD5", "Sha1"
80
+ warn(format(VULNERABLE_ALGORITHM, name))
81
+ when "Sha256", "Sha512"
82
+ warn(format(NONADAPTIVE_ALGORITHM, name))
83
+ end
84
+ end
85
+ end
10
86
  end
11
87
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ # Parent class of all Authlogic errors.
5
+ class Error < StandardError
6
+ end
7
+
8
+ # :nodoc:
9
+ class InvalidCryptoProvider < Error
10
+ end
11
+
12
+ # :nodoc:
13
+ class NilCryptoProvider < InvalidCryptoProvider
14
+ def message
15
+ <<~EOS
16
+ In version 5, Authlogic used SCrypt by default. As of version 6, there
17
+ is no default. We still recommend SCrypt. If you previously relied on
18
+ this default, then, in your User model (or equivalent), please set the
19
+ following:
20
+
21
+ acts_as_authentic do |config|
22
+ c.crypto_provider = ::Authlogic::CryptoProviders::SCrypt
23
+ end
24
+
25
+ Furthermore, the authlogic gem no longer depends on the scrypt gem. In
26
+ your Gemfile, please add scrypt.
27
+
28
+ gem "scrypt", "~> 3.0"
29
+
30
+ We have made this change in Authlogic 6 so that users of other crypto
31
+ providers no longer need to install the scrypt gem.
32
+ EOS
33
+ end
34
+ end
35
+ end
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authlogic
2
4
  module I18n
5
+ # The default translator used by authlogic/i18n.rb
3
6
  class Translator
4
7
  # If the I18n gem is present, calls +I18n.translate+ passing all
5
8
  # arguments, else returns +options[:default]+.
6
9
  def translate(key, options = {})
7
10
  if defined?(::I18n)
8
- ::I18n.translate key, options
11
+ ::I18n.translate key, **options
9
12
  else
10
13
  options[:default]
11
14
  end
@@ -1,42 +1,50 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "authlogic/i18n/translator"
2
4
 
3
5
  module Authlogic
4
- # This class allows any message in Authlogic to use internationalization. In earlier
5
- # versions of Authlogic each message was translated via configuration. This cluttered up
6
- # the configuration and cluttered up Authlogic. So all translation has been extracted
7
- # out into this class. Now all messages pass through this class, making it much easier
8
- # to implement in I18n library / plugin you want. Use this as a layer that sits between
9
- # Authlogic and whatever I18n library you want to use.
6
+ # This class allows any message in Authlogic to use internationalization. In
7
+ # earlier versions of Authlogic each message was translated via configuration.
8
+ # This cluttered up the configuration and cluttered up Authlogic. So all
9
+ # translation has been extracted out into this class. Now all messages pass
10
+ # through this class, making it much easier to implement in I18n library /
11
+ # plugin you want. Use this as a layer that sits between Authlogic and
12
+ # whatever I18n library you want to use.
10
13
  #
11
- # By default this uses the rails I18n library, if it exists. If it doesn't exist it just
12
- # returns the default English message. The Authlogic I18n class works EXACTLY like the
13
- # rails I18n class. This is because the arguments are delegated to this class.
14
+ # By default this uses the rails I18n library, if it exists. If it doesn't
15
+ # exist it just returns the default English message. The Authlogic I18n class
16
+ # works EXACTLY like the rails I18n class. This is because the arguments are
17
+ # delegated to this class.
14
18
  #
15
19
  # Here is how all messages are translated internally with Authlogic:
16
20
  #
17
21
  # Authlogic::I18n.t('error_messages.password_invalid', :default => "is invalid")
18
22
  #
19
- # If you use a different I18n library just replace the build-in I18n::Translator class
20
- # with your own. For example:
23
+ # If you use a different I18n library just replace the build-in
24
+ # I18n::Translator class with your own. For example:
21
25
  #
22
26
  # class MyAuthlogicI18nTranslator
23
27
  # def translate(key, options = {})
24
- # # you will have key which will be something like: "error_messages.password_invalid"
25
- # # you will also have options[:default], which will be the default English version of the message
28
+ # # you will have key which will be something like:
29
+ # # "error_messages.password_invalid"
30
+ # # you will also have options[:default], which will be the default
31
+ # # English version of the message
26
32
  # # do whatever you want here with the arguments passed to you.
27
33
  # end
28
34
  # end
29
35
  #
30
36
  # Authlogic::I18n.translator = MyAuthlogicI18nTranslator.new
31
37
  #
32
- # That it's! Here is a complete list of the keys that are passed. Just define these however you wish:
38
+ # That it's! Here is a complete list of the keys that are passed. Just define
39
+ # these however you wish:
33
40
  #
34
41
  # authlogic:
35
42
  # error_messages:
36
43
  # login_blank: can not be blank
37
44
  # login_not_found: is not valid
38
45
  # login_invalid: should use only letters, numbers, spaces, and .-_@+ please.
39
- # consecutive_failed_logins_limit_exceeded: Consecutive failed logins limit exceeded, account is disabled.
46
+ # consecutive_failed_logins_limit_exceeded: >
47
+ # Consecutive failed logins limit exceeded, account is disabled.
40
48
  # email_invalid: should look like an email address.
41
49
  # email_invalid_international: should look like an international email address.
42
50
  # password_blank: can not be blank
@@ -46,6 +54,7 @@ module Authlogic
46
54
  # not_approved: Your account is not approved
47
55
  # no_authentication_details: You did not provide any details for authentication.
48
56
  # general_credentials_error: Login/Password combination is not valid
57
+ # session_invalid: Your session is invalid and has the following errors:
49
58
  # models:
50
59
  # user_session: UserSession (or whatever name you are using)
51
60
  # attributes:
@@ -79,13 +88,13 @@ module Authlogic
79
88
  @@translator = translator
80
89
  end
81
90
 
82
- # All message translation is passed to this method. The first argument is the key
83
- # for the message. The second is options, see the rails I18n library for a list of
84
- # options used.
91
+ # All message translation is passed to this method. The first argument is
92
+ # the key for the message. The second is options, see the rails I18n
93
+ # library for a list of options used.
85
94
  def translate(key, options = {})
86
- translator.translate key, { :scope => I18n.scope }.merge(options)
95
+ translator.translate key, { scope: I18n.scope }.merge(options)
87
96
  end
88
- alias :t :translate
97
+ alias t translate
89
98
  end
90
99
  end
91
100
  end
@@ -1,34 +1,18 @@
1
- module Authlogic
2
- # Handles generating random strings. If SecureRandom is installed it will default to
3
- # this and use it instead. SecureRandom comes with ActiveSupport. So if you are using
4
- # this in a rails app you should have this library.
5
- module Random
6
- extend self
7
-
8
- SecureRandom = (defined?(::SecureRandom) && ::SecureRandom) ||
9
- (defined?(::ActiveSupport::SecureRandom) && ::ActiveSupport::SecureRandom)
10
-
11
- if SecureRandom
12
- def hex_token
13
- SecureRandom.hex(64)
14
- end
1
+ # frozen_string_literal: true
15
2
 
16
- def friendly_token
17
- # use base64url as defined by RFC4648
18
- SecureRandom.base64(15).tr('+/=', '').strip.delete("\n")
19
- end
20
- else
21
- def hex_token
22
- Authlogic::CryptoProviders::Sha512.encrypt(Time.now.to_s + (1..10).collect { rand.to_s }.join)
23
- end
3
+ require "securerandom"
24
4
 
25
- FRIENDLY_CHARS = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
5
+ module Authlogic
6
+ # Generates random strings using ruby's SecureRandom library.
7
+ module Random
8
+ def self.hex_token
9
+ SecureRandom.hex(64)
10
+ end
26
11
 
27
- def friendly_token
28
- newpass = ""
29
- 1.upto(20) { |i| newpass << FRIENDLY_CHARS[rand(FRIENDLY_CHARS.size - 1)] }
30
- newpass
31
- end
12
+ # Returns a string in base64url format as defined by RFC-3548 and RFC-4648.
13
+ # We call this a "friendly" token because it is short and safe for URLs.
14
+ def self.friendly_token
15
+ SecureRandom.urlsafe_base64(15)
32
16
  end
33
17
  end
34
18
  end