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,93 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Provides methods to create and destroy objects. Basically controls their "existence".
4
- module Existence
5
- class SessionInvalidError < ::StandardError # :nodoc:
6
- def initialize(session)
7
- super("Your session is invalid and has the following errors: #{session.errors.full_messages.to_sentence}")
8
- end
9
- end
10
-
11
- def self.included(klass)
12
- klass.class_eval do
13
- extend ClassMethods
14
- include InstanceMethods
15
- attr_accessor :new_session, :record
16
- end
17
- end
18
-
19
- module ClassMethods
20
- # A convenience method. The same as:
21
- #
22
- # session = UserSession.new(*args)
23
- # session.save
24
- #
25
- # Instead you can do:
26
- #
27
- # UserSession.create(*args)
28
- def create(*args, &block)
29
- session = new(*args)
30
- session.save(&block)
31
- session
32
- end
33
-
34
- # Same as create but calls create!, which raises an exception when validation fails.
35
- def create!(*args)
36
- session = new(*args)
37
- session.save!
38
- session
39
- end
40
- end
41
-
42
- module InstanceMethods
43
- # Clears all errors and the associated record, you should call this terminate a session, thus requiring
44
- # the user to authenticate again if it is needed.
45
- def destroy
46
- before_destroy
47
- save_record
48
- errors.clear
49
- @record = nil
50
- after_destroy
51
- true
52
- end
53
-
54
- # Returns true if the session is new, meaning no action has been taken on it and a successful save
55
- # has not taken place.
56
- def new_session?
57
- new_session != false
58
- end
59
-
60
- # After you have specified all of the details for your session you can try to save it. This will
61
- # run validation checks and find the associated record, if all validation passes. If validation
62
- # does not pass, the save will fail and the errors will be stored in the errors object.
63
- def save(&block)
64
- result = nil
65
- if valid?
66
- self.record = attempted_record
67
-
68
- before_save
69
- new_session? ? before_create : before_update
70
- new_session? ? after_create : after_update
71
- after_save
72
-
73
- save_record
74
- self.new_session = false
75
- result = true
76
- else
77
- result = false
78
- end
79
-
80
- yield result if block_given?
81
- result
82
- end
83
-
84
- # Same as save but raises an exception of validation errors when validation fails
85
- def save!
86
- result = save
87
- raise SessionInvalidError.new(self) unless result
88
- result
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,55 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Sort of like an interface, it sets the foundation for the class, such as the
4
- # required methods. This also allows other modules to overwrite methods and call super
5
- # on them. It's also a place to put "utility" methods used throughout Authlogic.
6
- module Foundation
7
- def self.included(klass)
8
- klass.class_eval do
9
- extend Authlogic::Config
10
- include InstanceMethods
11
- end
12
- end
13
-
14
- module InstanceMethods
15
- def initialize(*args)
16
- self.credentials = args
17
- end
18
-
19
- # The credentials you passed to create your session. See credentials= for more
20
- # info.
21
- def credentials
22
- []
23
- end
24
-
25
- # Set your credentials before you save your session. You can pass a hash of
26
- # credentials:
27
- #
28
- # session.credentials = {:login => "my login", :password => "my password", :remember_me => true}
29
- #
30
- # or you can pass an array of objects:
31
- #
32
- # session.credentials = [my_user_object, true]
33
- #
34
- # and if you need to set an id, just pass it last. This value need be the last
35
- # item in the array you pass, since the id is something that you control yourself,
36
- # it should never be set from a hash or a form. Examples:
37
- #
38
- # session.credentials = [{:login => "my login", :password => "my password", :remember_me => true}, :my_id]
39
- # session.credentials = [my_user_object, true, :my_id]
40
- def credentials=(values)
41
- end
42
-
43
- def inspect
44
- "#<#{self.class.name}: #{credentials.blank? ? "no credentials provided" : credentials.inspect}>"
45
- end
46
-
47
- private
48
-
49
- def build_key(last_part)
50
- last_part
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,100 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Handles all authentication that deals with basic HTTP auth. Which is authentication built into the HTTP protocol:
4
- #
5
- # http://username:password@whatever.com
6
- #
7
- # Also, if you are not comfortable letting users pass their raw username and password you can always use the single
8
- # access token. See Authlogic::Session::Params for more info.
9
- module HttpAuth
10
- def self.included(klass)
11
- klass.class_eval do
12
- extend Config
13
- include InstanceMethods
14
- persist :persist_by_http_auth, :if => :persist_by_http_auth?
15
- end
16
- end
17
-
18
- # Configuration for the HTTP basic auth feature of Authlogic.
19
- module Config
20
- # Do you want to allow your users to log in via HTTP basic auth?
21
- #
22
- # I recommend keeping this enabled. The only time I feel this should be disabled is if you are not comfortable
23
- # having your users provide their raw username and password. Whatever the reason, you can disable it here.
24
- #
25
- # * <tt>Default:</tt> true
26
- # * <tt>Accepts:</tt> Boolean
27
- def allow_http_basic_auth(value = nil)
28
- rw_config(:allow_http_basic_auth, value, true)
29
- end
30
- alias_method :allow_http_basic_auth=, :allow_http_basic_auth
31
-
32
- # Whether or not to request HTTP authentication
33
- #
34
- # If set to true and no HTTP authentication credentials are sent with
35
- # the request, the Rails controller method
36
- # authenticate_or_request_with_http_basic will be used and a '401
37
- # Authorization Required' header will be sent with the response. In
38
- # most cases, this will cause the classic HTTP authentication popup to
39
- # appear in the users browser.
40
- #
41
- # If set to false, the Rails controller method
42
- # authenticate_with_http_basic is used and no 401 header is sent.
43
- #
44
- # Note: This parameter has no effect unless allow_http_basic_auth is
45
- # true
46
- #
47
- # * <tt>Default:</tt> false
48
- # * <tt>Accepts:</tt> Boolean
49
- def request_http_basic_auth(value = nil)
50
- rw_config(:request_http_basic_auth, value, false)
51
- end
52
- alias_method :request_http_basic_auth=, :request_http_basic_auth
53
-
54
- # HTTP authentication realm
55
- #
56
- # Sets the HTTP authentication realm.
57
- #
58
- # Note: This option has no effect unless request_http_basic_auth is true
59
- #
60
- # * <tt>Default:</tt> 'Application'
61
- # * <tt>Accepts:</tt> String
62
- def http_basic_auth_realm(value = nil)
63
- rw_config(:http_basic_auth_realm, value, 'Application')
64
- end
65
- alias_method :http_basic_auth_realm=, :http_basic_auth_realm
66
- end
67
-
68
- # Instance methods for the HTTP basic auth feature of authlogic.
69
- module InstanceMethods
70
- private
71
-
72
- def persist_by_http_auth?
73
- allow_http_basic_auth? && login_field && password_field
74
- end
75
-
76
- def persist_by_http_auth
77
- login_proc = Proc.new do |login, password|
78
- if !login.blank? && !password.blank?
79
- send("#{login_field}=", login)
80
- send("#{password_field}=", password)
81
- valid?
82
- end
83
- end
84
-
85
- if self.class.request_http_basic_auth
86
- controller.authenticate_or_request_with_http_basic(self.class.http_basic_auth_realm, &login_proc)
87
- else
88
- controller.authenticate_with_http_basic(&login_proc)
89
- end
90
-
91
- false
92
- end
93
-
94
- def allow_http_basic_auth?
95
- self.class.allow_http_basic_auth == true
96
- end
97
- end
98
- end
99
- end
100
- end
@@ -1,48 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Allows you to separate sessions with an id, ultimately letting you create
4
- # multiple sessions for the same user.
5
- module Id
6
- def self.included(klass)
7
- klass.class_eval do
8
- attr_writer :id
9
- end
10
- end
11
-
12
- # Setting the id if it is passed in the credentials.
13
- def credentials=(value)
14
- super
15
- values = value.is_a?(Array) ? value : [value]
16
- self.id = values.last if values.last.is_a?(Symbol)
17
- end
18
-
19
- # Allows you to set a unique identifier for your session, so that you can
20
- # have more than 1 session at a time. A good example when this might be
21
- # needed is when you want to have a normal user session and a "secure"
22
- # user session. The secure user session would be created only when they
23
- # want to modify their billing information, or other sensitive
24
- # information. Similar to me.com. This requires 2 user sessions. Just use
25
- # an id for the "secure" session and you should be good.
26
- #
27
- # You can set the id during initialization (see initialize for more
28
- # information), or as an attribute:
29
- #
30
- # session.id = :my_id
31
- #
32
- # Just be sure and set your id before you save your session.
33
- #
34
- # Lastly, to retrieve your session with the id check out the find class
35
- # method.
36
- def id
37
- @id
38
- end
39
-
40
- private
41
-
42
- # Used for things like cookie_key, session_key, etc.
43
- def build_key(last_part)
44
- [id, super].compact.join("_")
45
- end
46
- end
47
- end
48
- end
@@ -1,70 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Handles authenticating via a traditional username and password.
4
- module Klass
5
- def self.included(klass)
6
- klass.class_eval do
7
- extend Config
8
- include InstanceMethods
9
-
10
- class << self
11
- attr_accessor :configured_klass_methods
12
- end
13
- end
14
- end
15
-
16
- module Config
17
- # Lets you change which model to use for authentication.
18
- #
19
- # * <tt>Default:</tt> inferred from the class name. UserSession would automatically try User
20
- # * <tt>Accepts:</tt> an ActiveRecord class
21
- def authenticate_with(klass)
22
- @klass_name = klass.name
23
- @klass = klass
24
- end
25
- alias_method :authenticate_with=, :authenticate_with
26
-
27
- # The name of the class that this session is authenticating with. For example, the UserSession class will
28
- # authenticate with the User class unless you specify otherwise in your configuration. See authenticate_with
29
- # for information on how to change this value.
30
- def klass
31
- @klass ||= klass_name ? klass_name.constantize : nil
32
- end
33
-
34
- # The string of the model name class guessed from the actual session class name.
35
- def klass_name
36
- return @klass_name if defined?(@klass_name)
37
- @klass_name = name.scan(/(.*)Session/)[0]
38
- @klass_name = klass_name ? klass_name[0] : nil
39
- end
40
- end
41
-
42
- module InstanceMethods
43
- # Creating an alias method for the "record" method based on the klass name, so that we can do:
44
- #
45
- # session.user
46
- #
47
- # instead of:
48
- #
49
- # session.record
50
- def initialize(*args)
51
- if !self.class.configured_klass_methods
52
- self.class.send(:alias_method, klass_name.demodulize.underscore.to_sym, :record)
53
- self.class.configured_klass_methods = true
54
- end
55
- super
56
- end
57
-
58
- private
59
-
60
- def klass
61
- self.class.klass
62
- end
63
-
64
- def klass_name
65
- self.class.klass_name
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,116 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Just like ActiveRecord has "magic" columns, such as: created_at and updated_at.
4
- # Authlogic has its own "magic" columns too:
5
- #
6
- # * login_count - Increased every time an explicit login is made. This will *NOT*
7
- # increase if logging in by a session, cookie, or basic http auth
8
- # * failed_login_count - This increases for each consecutive failed login. See
9
- # Authlogic::Session::BruteForceProtection and the consecutive_failed_logins_limit
10
- # config option for more details.
11
- # * last_request_at - Updates every time the user logs in, either by explicitly
12
- # logging in, or logging in by cookie, session, or http auth
13
- # * current_login_at - Updates with the current time when an explicit login is made.
14
- # * last_login_at - Updates with the value of current_login_at before it is reset.
15
- # * current_login_ip - Updates with the request ip when an explicit login is made.
16
- # * last_login_ip - Updates with the value of current_login_ip before it is reset.
17
- module MagicColumns
18
- def self.included(klass)
19
- klass.class_eval do
20
- extend Config
21
- include InstanceMethods
22
- after_persisting :set_last_request_at, :if => :set_last_request_at?
23
- validate :increase_failed_login_count
24
- before_save :update_info
25
- before_save :set_last_request_at, :if => :set_last_request_at?
26
- end
27
- end
28
-
29
- # Configuration for the magic columns feature.
30
- module Config
31
- # Every time a session is found the last_request_at field for that record is
32
- # updated with the current time, if that field exists. If you want to limit how
33
- # frequent that field is updated specify the threshold here. For example, if your
34
- # user is making a request every 5 seconds, and you feel this is too frequent, and
35
- # feel a minute is a good threshold. Set this to 1.minute. Once a minute has
36
- # passed in between requests the field will be updated.
37
- #
38
- # * <tt>Default:</tt> 0
39
- # * <tt>Accepts:</tt> integer representing time in seconds
40
- def last_request_at_threshold(value = nil)
41
- rw_config(:last_request_at_threshold, value, 0)
42
- end
43
- alias_method :last_request_at_threshold=, :last_request_at_threshold
44
- end
45
-
46
- # The methods available for an Authlogic::Session::Base object that make up the magic columns feature.
47
- module InstanceMethods
48
- private
49
-
50
- def increase_failed_login_count
51
- if invalid_password? && attempted_record.respond_to?(:failed_login_count)
52
- attempted_record.failed_login_count ||= 0
53
- attempted_record.failed_login_count += 1
54
- end
55
- end
56
-
57
- def update_info
58
- if record.respond_to?(:login_count)
59
- record.login_count = (record.login_count.blank? ? 1 : record.login_count + 1)
60
- end
61
-
62
- if record.respond_to?(:failed_login_count)
63
- record.failed_login_count = 0
64
- end
65
-
66
- if record.respond_to?(:current_login_at)
67
- record.last_login_at = record.current_login_at if record.respond_to?(:last_login_at)
68
- record.current_login_at = klass.default_timezone == :utc ? Time.now.utc : Time.now
69
- end
70
-
71
- if record.respond_to?(:current_login_ip)
72
- record.last_login_ip = record.current_login_ip if record.respond_to?(:last_login_ip)
73
- record.current_login_ip = controller.request.ip
74
- end
75
- end
76
-
77
- # This method lets authlogic know whether it should allow the
78
- # last_request_at field to be updated with the current time
79
- # (Time.now). One thing to note here is that it also checks for the
80
- # existence of a last_request_update_allowed? method in your
81
- # controller. This allows you to control this method pragmatically in
82
- # your controller.
83
- #
84
- # For example, what if you had a javascript function that polled the
85
- # server updating how much time is left in their session before it
86
- # times out. Obviously you would want to ignore this request, because
87
- # then the user would never time out. So you can do something like
88
- # this in your controller:
89
- #
90
- # def last_request_update_allowed?
91
- # action_name != "update_session_time_left"
92
- # end
93
- #
94
- # You can do whatever you want with that method.
95
- def set_last_request_at? # :doc:
96
- if !record || !klass.column_names.include?("last_request_at")
97
- return false
98
- end
99
- if controller.responds_to_last_request_update_allowed? && !controller.last_request_update_allowed?
100
- return false
101
- end
102
- record.last_request_at.blank? ||
103
- last_request_at_threshold.to_i.seconds.ago >= record.last_request_at
104
- end
105
-
106
- def set_last_request_at
107
- record.last_request_at = klass.default_timezone == :utc ? Time.now.utc : Time.now
108
- end
109
-
110
- def last_request_at_threshold
111
- self.class.last_request_at_threshold
112
- end
113
- end
114
- end
115
- end
116
- end
@@ -1,76 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # Authlogic tries to check the state of the record before creating the session. If
4
- # your record responds to the following methods and any of them return false,
5
- # validation will fail:
6
- #
7
- # Method name Description
8
- # active? Is the record marked as active?
9
- # approved? Has the record been approved?
10
- # confirmed? Has the record been confirmed?
11
- #
12
- # Authlogic does nothing to define these methods for you, its up to you to define what
13
- # they mean. If your object responds to these methods Authlogic will use them,
14
- # otherwise they are ignored.
15
- #
16
- # What's neat about this is that these are checked upon any type of login. When
17
- # logging in explicitly, by cookie, session, or basic http auth. So if you mark a user
18
- # inactive in the middle of their session they wont be logged back in next time they
19
- # refresh the page. Giving you complete control.
20
- #
21
- # Need Authlogic to check your own "state"? No problem, check out the hooks section
22
- # below. Add in a before_validation to do your own checking. The sky is the limit.
23
- module MagicStates
24
- def self.included(klass)
25
- klass.class_eval do
26
- extend Config
27
- include InstanceMethods
28
- validate :validate_magic_states, :unless => :disable_magic_states?
29
- end
30
- end
31
-
32
- # Configuration for the magic states feature.
33
- module Config
34
- # Set this to true if you want to disable the checking of active?, approved?, and
35
- # confirmed? on your record. This is more or less of a convenience feature, since
36
- # 99% of the time if those methods exist and return false you will not want the
37
- # user logging in. You could easily accomplish this same thing with a
38
- # before_validation method or other callbacks.
39
- #
40
- # * <tt>Default:</tt> false
41
- # * <tt>Accepts:</tt> Boolean
42
- def disable_magic_states(value = nil)
43
- rw_config(:disable_magic_states, value, false)
44
- end
45
- alias_method :disable_magic_states=, :disable_magic_states
46
- end
47
-
48
- # The methods available for an Authlogic::Session::Base object that make up the
49
- # magic states feature.
50
- module InstanceMethods
51
- private
52
-
53
- def disable_magic_states?
54
- self.class.disable_magic_states == true
55
- end
56
-
57
- def validate_magic_states
58
- return true if attempted_record.nil?
59
- [:active, :approved, :confirmed].each do |required_status|
60
- if attempted_record.respond_to?("#{required_status}?") && !attempted_record.send("#{required_status}?")
61
- errors.add(
62
- :base,
63
- I18n.t(
64
- "error_messages.not_#{required_status}",
65
- :default => "Your account is not #{required_status}"
66
- )
67
- )
68
- return false
69
- end
70
- end
71
- true
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,116 +0,0 @@
1
- module Authlogic
2
- module Session
3
- # This module is responsible for authenticating the user via params, which ultimately
4
- # allows the user to log in using a URL like the following:
5
- #
6
- # https://www.domain.com?user_credentials=4LiXF7FiGUppIPubBPey
7
- #
8
- # Notice the token in the URL, this is a single access token. A single access token is
9
- # used for single access only, it is not persisted. Meaning the user provides it,
10
- # Authlogic grants them access, and that's it. If they want access again they need to
11
- # provide the token again. Authlogic will *NEVER* try to persist the session after
12
- # authenticating through this method.
13
- #
14
- # For added security, this token is *ONLY* allowed for RSS and ATOM requests. You can
15
- # change this with the configuration. You can also define if it is allowed dynamically
16
- # by defining a single_access_allowed? method in your controller. For example:
17
- #
18
- # class UsersController < ApplicationController
19
- # private
20
- # def single_access_allowed?
21
- # action_name == "index"
22
- # end
23
- #
24
- # Also, by default, this token is permanent. Meaning if the user changes their
25
- # password, this token will remain the same. It will only change when it is explicitly
26
- # reset.
27
- #
28
- # You can modify all of this behavior with the Config sub module.
29
- module Params
30
- def self.included(klass)
31
- klass.class_eval do
32
- extend Config
33
- include InstanceMethods
34
- attr_accessor :single_access
35
- persist :persist_by_params
36
- end
37
- end
38
-
39
- # Configuration for the params / single access feature.
40
- module Config
41
- # Works exactly like cookie_key, but for params. So a user can login via
42
- # params just like a cookie or a session. Your URL would look like:
43
- #
44
- # http://www.domain.com?user_credentials=my_single_access_key
45
- #
46
- # You can change the "user_credentials" key above with this
47
- # configuration option. Keep in mind, just like cookie_key, if you
48
- # supply an id the id will be appended to the front. Check out
49
- # cookie_key for more details. Also checkout the "Single Access /
50
- # Private Feeds Access" section in the README.
51
- #
52
- # * <tt>Default:</tt> cookie_key
53
- # * <tt>Accepts:</tt> String
54
- def params_key(value = nil)
55
- rw_config(:params_key, value, cookie_key)
56
- end
57
- alias_method :params_key=, :params_key
58
-
59
- # Authentication is allowed via a single access token, but maybe this is
60
- # something you don't want for your application as a whole. Maybe this
61
- # is something you only want for specific request types. Specify a list
62
- # of allowed request types and single access authentication will only be
63
- # allowed for the ones you specify.
64
- #
65
- # * <tt>Default:</tt> ["application/rss+xml", "application/atom+xml"]
66
- # * <tt>Accepts:</tt> String of a request type, or :all or :any to
67
- # allow single access authentication for any and all request types
68
- def single_access_allowed_request_types(value = nil)
69
- rw_config(:single_access_allowed_request_types, value, ["application/rss+xml", "application/atom+xml"])
70
- end
71
- alias_method :single_access_allowed_request_types=, :single_access_allowed_request_types
72
- end
73
-
74
- # The methods available for an Authlogic::Session::Base object that make
75
- # up the params / single access feature.
76
- module InstanceMethods
77
- private
78
-
79
- def persist_by_params
80
- return false if !params_enabled?
81
- self.unauthorized_record = search_for_record("find_by_single_access_token", params_credentials)
82
- self.single_access = valid?
83
- end
84
-
85
- def params_enabled?
86
- return false if !params_credentials || !klass.column_names.include?("single_access_token")
87
- return controller.single_access_allowed? if controller.responds_to_single_access_allowed?
88
-
89
- case single_access_allowed_request_types
90
- when Array
91
- single_access_allowed_request_types.include?(controller.request_content_type) ||
92
- single_access_allowed_request_types.include?(:all)
93
- else
94
- [:all, :any].include?(single_access_allowed_request_types)
95
- end
96
- end
97
-
98
- def params_key
99
- build_key(self.class.params_key)
100
- end
101
-
102
- def single_access?
103
- single_access == true
104
- end
105
-
106
- def single_access_allowed_request_types
107
- self.class.single_access_allowed_request_types
108
- end
109
-
110
- def params_credentials
111
- controller.params[params_key]
112
- end
113
- end
114
- end
115
- end
116
- end