authtrail 0.1.3 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d58f1c05f2177c5a9dd84c1aeed638ce17b5d601f8b8b9a677f5046cad5f239
4
- data.tar.gz: 79b099d5edba1165e553c35aa8ed43040ca58c2d1ff2616f76cd020da48b15d5
3
+ metadata.gz: eb0329a5efc01b445b4686a7e1712d6937f57d52443ad880802c5a79c6e746c4
4
+ data.tar.gz: d4ac5c96149eebd39ba9964303758e48b537e1823345e27117ce35bf1ff7752a
5
5
  SHA512:
6
- metadata.gz: bc289ab35e5bddd7ea8043fe771787f737bc6661444921485a0b86d13c741c39e4812277718246d612f17bd63cd9719543d23f57803b17cdd30e20f948eeb1ae
7
- data.tar.gz: 8ba5999ed1ed9f96a225d4f16ce94117204045d3375080ca6dbac0f4020a5e0b00279e69175ef0845403707ea5a1c9b89fe709a0b613666bf207f04cea2c46b2
6
+ metadata.gz: 837b7df27b74e7c4ac54855bc40584c0fb7ed5291abb5f7627d13d9bd5fa8adfb25bdb50f2292721c67394ca5a8274b8e95a881bf63213dea7a73b927da204ae
7
+ data.tar.gz: 20b98bad8507a73e67fececc5cb2811a98013e4f449ab8d8b9c97227a4ffb33ecdf1237228c3282ebd3449f2b04cd080369b75d3c1f4f6fa585155169d1433cd
data/CHANGELOG.md CHANGED
@@ -1,17 +1,41 @@
1
- ## 0.1.3
1
+ ## 0.3.1 (2021-03-03)
2
+
3
+ - Added `--lockbox` option to install generator
4
+
5
+ ## 0.3.0 (2021-03-01)
6
+
7
+ - Disabled geocoding by default for new installations
8
+ - Raise an exception instead of logging when auditing fails
9
+ - Removed support for Rails < 5.2 and Ruby < 2.6
10
+
11
+ ## 0.2.2 (2020-11-21)
12
+
13
+ - Added `transform_method` option
14
+
15
+ ## 0.2.1 (2020-08-17)
16
+
17
+ - Added `job_queue` option
18
+
19
+ ## 0.2.0 (2019-06-23)
20
+
21
+ - Added latitude and longitude
22
+ - `AuthTrail::GeocodeJob` now inherits from `ActiveJob::Base` instead of `ApplicationJob`
23
+ - Removed support for Rails 4.2
24
+
25
+ ## 0.1.3 (2018-09-27)
2
26
 
3
27
  - Added support for Rails 4.2
4
28
 
5
- ## 0.1.2
29
+ ## 0.1.2 (2018-07-30)
6
30
 
7
31
  - Added `identity_method` option
8
32
  - Fixed geocoding
9
33
 
10
- ## 0.1.1
34
+ ## 0.1.1 (2018-07-13)
11
35
 
12
36
  - Improved strategy detection for failures
13
37
  - Fixed migration for MySQL
14
38
 
15
- ## 0.1.0
39
+ ## 0.1.0 (2017-11-07)
16
40
 
17
41
  - First release
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2017-2018 Andrew Kane
1
+ Copyright (c) 2017-2021 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -4,6 +4,8 @@ Track Devise login activity
4
4
 
5
5
  :tangerine: Battle-tested at [Instacart](https://www.instacart.com/opensource)
6
6
 
7
+ [![Build Status](https://github.com/ankane/authtrail/workflows/build/badge.svg?branch=master)](https://github.com/ankane/authtrail/actions)
8
+
7
9
  ## Installation
8
10
 
9
11
  Add this line to your application’s Gemfile:
@@ -12,7 +14,14 @@ Add this line to your application’s Gemfile:
12
14
  gem 'authtrail'
13
15
  ```
14
16
 
15
- And run:
17
+ To encrypt email and IP addresses, install [Lockbox](https://github.com/ankane/lockbox) and [Blind Index](https://github.com/ankane/blind_index) and run:
18
+
19
+ ```sh
20
+ rails generate authtrail:install --lockbox
21
+ rails db:migrate
22
+ ```
23
+
24
+ If you prefer not to encrypt data, run:
16
25
 
17
26
  ```sh
18
27
  rails generate authtrail:install
@@ -32,7 +41,7 @@ A `LoginActivity` record is created every time a user tries to login. You can th
32
41
  - `context` - controller and action
33
42
  - `ip` - IP address
34
43
  - `user_agent` and `referrer` - from browser
35
- - `city`, `region`, and `country` - from IP
44
+ - `city`, `region`, `country`, `latitude`, and `longitude` - from IP
36
45
  - `created_at` - time of event
37
46
 
38
47
  ## Features
@@ -40,20 +49,36 @@ A `LoginActivity` record is created every time a user tries to login. You can th
40
49
  Exclude certain attempts from tracking - useful if you run acceptance tests
41
50
 
42
51
  ```ruby
43
- AuthTrail.exclude_method = lambda do |info|
44
- info[:identity] == "capybara@example.org"
52
+ AuthTrail.exclude_method = lambda do |data|
53
+ data[:identity] == "capybara@example.org"
54
+ end
55
+ ```
56
+
57
+ Add or modify data - also add new fields to the `login_activities` table if needed
58
+
59
+ ```ruby
60
+ AuthTrail.transform_method = lambda do |data, request|
61
+ data[:request_id] = request.request_id
62
+ end
63
+ ```
64
+
65
+ Store the user on failed attempts
66
+
67
+ ```ruby
68
+ AuthTrail.transform_method = lambda do |data, request|
69
+ data[:user] ||= User.find_by(email: data[:identity])
45
70
  end
46
71
  ```
47
72
 
48
73
  Write data somewhere other than the `login_activities` table
49
74
 
50
75
  ```ruby
51
- AuthTrail.track_method = lambda do |info|
76
+ AuthTrail.track_method = lambda do |data|
52
77
  # code
53
78
  end
54
79
  ```
55
80
 
56
- Use a custom identity method [master]
81
+ Use a custom identity method
57
82
 
58
83
  ```ruby
59
84
  AuthTrail.identity_method = lambda do |request, opts, user|
@@ -73,63 +98,96 @@ class User < ApplicationRecord
73
98
  end
74
99
  ```
75
100
 
76
- The `LoginActivity` model uses a [polymorphic association](http://guides.rubyonrails.org/association_basics.html#polymorphic-associations) so it can be associated with different user models.
101
+ The `LoginActivity` model uses a [polymorphic association](https://guides.rubyonrails.org/association_basics.html#polymorphic-associations) so it can be associated with different user models.
77
102
 
78
103
  ## Geocoding
79
104
 
80
- IP geocoding is performed in a background job so it doesn’t slow down web requests. You can disable it entirely with:
105
+ AuthTrail uses [Geocoder](https://github.com/alexreisner/geocoder) for geocoding. We recommend configuring [local geocoding](#local-geocoding) or [load balancer geocoding](#load-balancer-geocoding) so IP addresses are not sent to a 3rd party service. If you do use a 3rd party service and adhere to GDPR, be sure to add it to your subprocessor list.
106
+
107
+ To enable geocoding, update `config/initializers/authtrail.rb`:
81
108
 
82
109
  ```ruby
83
- AuthTrail.geocode = false
110
+ AuthTrail.geocode = true
84
111
  ```
85
112
 
86
- Set job queue for geocoding
113
+ Geocoding is performed in a background job so it doesn’t slow down web requests. Set the job queue with:
87
114
 
88
115
  ```ruby
89
- AuthTrail::GeocodeJob.queue_as :low
116
+ AuthTrail.job_queue = :low_priority
90
117
  ```
91
118
 
92
- ### Geocoding Performance
119
+ ### Local Geocoding
93
120
 
94
- To avoid calls to a remote API, download the [GeoLite2 City database](https://dev.maxmind.com/geoip/geoip2/geolite2/) and configure Geocoder to use it.
95
-
96
- Add this line to your application’s Gemfile:
121
+ For privacy and performance, we recommend geocoding locally. Add this line to your application’s Gemfile:
97
122
 
98
123
  ```ruby
99
124
  gem 'maxminddb'
100
125
  ```
101
126
 
102
- And create an initializer at `config/initializers/geocoder.rb` with:
127
+ For city-level geocoding, download the [GeoLite2 City database](https://dev.maxmind.com/geoip/geoip2/geolite2/) and create `config/initializers/geocoder.rb` with:
103
128
 
104
129
  ```ruby
105
130
  Geocoder.configure(
106
131
  ip_lookup: :geoip2,
107
132
  geoip2: {
108
- file: Rails.root.join("lib", "GeoLite2-City.mmdb")
133
+ file: "path/to/GeoLite2-City.mmdb"
134
+ }
135
+ )
136
+ ```
137
+
138
+ For country-level geocoding, install the `geoip-database` package. It’s preinstalled on Heroku. For Ubuntu, use:
139
+
140
+ ```sh
141
+ sudo apt-get install geoip-database
142
+ ```
143
+
144
+ And create `config/initializers/geocoder.rb` with:
145
+
146
+ ```ruby
147
+ Geocoder.configure(
148
+ ip_lookup: :maxmind_local,
149
+ maxmind_local: {
150
+ file: "/usr/share/GeoIP/GeoIP.dat",
151
+ package: :country
109
152
  }
110
153
  )
111
154
  ```
112
155
 
113
- ## Data Protection
156
+ ### Load Balancer Geocoding
157
+
158
+ Some load balancers can add geocoding information to request headers.
114
159
 
115
- Protect the privacy of your users by encrypting fields that contain personal information, such as `identity` and `ip`. [attr_encrypted](https://github.com/attr-encrypted/attr_encrypted) is great for this.
160
+ - [nginx](https://nginx.org/en/docs/http/ngx_http_geoip_module.html)
161
+ - [Google Cloud](https://cloud.google.com/load-balancing/docs/custom-headers)
162
+ - [Cloudflare](https://support.cloudflare.com/hc/en-us/articles/200168236-Configuring-Cloudflare-IP-Geolocation)
116
163
 
117
164
  ```ruby
118
- class LoginActivity < ApplicationRecord
119
- attr_encrypted :identity, ...
120
- attr_encrypted :ip, ...
165
+ AuthTrail.geocode = false
166
+ AuthTrail.transform_method = lambda do |data, request|
167
+ data[:country] = request.headers["<country-header>"]
168
+ data[:region] = request.headers["<region-header>"]
169
+ data[:city] = request.headers["<city-header>"]
121
170
  end
122
171
  ```
123
172
 
124
- You should also make it clear that you collect this information in your privacy policy.
173
+ Check out [this example](https://github.com/ankane/authtrail/issues/40)
125
174
 
126
175
  ## Other Notes
127
176
 
128
177
  We recommend using this in addition to Devise’s `Lockable` module and [Rack::Attack](https://github.com/kickstarter/rack-attack).
129
178
 
130
- Check out [Hardening Devise](https://github.com/ankane/shorts/blob/master/Hardening-Devise.md) and [Secure Rails](https://github.com/ankane/secure_rails) for more best practices.
179
+ Check out [Hardening Devise](https://ankane.org/hardening-devise) and [Secure Rails](https://github.com/ankane/secure_rails) for more best practices.
180
+
181
+ ## Upgrading
182
+
183
+ ### 0.2.0
131
184
 
132
- Works with Rails 4.2+
185
+ To store latitude and longitude, create a migration with:
186
+
187
+ ```ruby
188
+ add_column :login_activities, :latitude, :float
189
+ add_column :login_activities, :longitude, :float
190
+ ```
133
191
 
134
192
  ## History
135
193
 
@@ -143,3 +201,12 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
143
201
  - Fix bugs and [submit pull requests](https://github.com/ankane/authtrail/pulls)
144
202
  - Write, clarify, or fix documentation
145
203
  - Suggest or add new features
204
+
205
+ To get started with development and testing:
206
+
207
+ ```sh
208
+ git clone https://github.com/ankane/authtrail.git
209
+ cd authtrail
210
+ bundle install
211
+ bundle exec rake test
212
+ ```
@@ -1,5 +1,9 @@
1
1
  module AuthTrail
2
- class GeocodeJob < Rails::VERSION::MAJOR >= 5 ? ApplicationJob : ActiveJob::Base
2
+ class GeocodeJob < ActiveJob::Base
3
+ # default queue is used if queue_as returns nil
4
+ # Rails has a test for this
5
+ queue_as { AuthTrail.job_queue }
6
+
3
7
  def perform(login_activity)
4
8
  result =
5
9
  begin
@@ -10,11 +14,17 @@ module AuthTrail
10
14
  end
11
15
 
12
16
  if result
13
- login_activity.update!(
14
- city: result.try(:city).presence,
15
- region: result.try(:state).presence,
16
- country: result.try(:country).presence
17
- )
17
+ attributes = {
18
+ city: result.try(:city),
19
+ region: result.try(:state),
20
+ country: result.try(:country),
21
+ latitude: result.try(:latitude),
22
+ longitude: result.try(:longitude)
23
+ }
24
+ attributes.each do |k, v|
25
+ login_activity.try("#{k}=", v.presence)
26
+ end
27
+ login_activity.save!
18
28
  end
19
29
  end
20
30
  end
@@ -2,36 +2,29 @@ module AuthTrail
2
2
  module Manager
3
3
  class << self
4
4
  def after_set_user(user, auth, opts)
5
- # do not raise an exception for tracking
6
- AuthTrail.safely do
7
- request = ActionDispatch::Request.new(auth.env)
5
+ request = ActionDispatch::Request.new(auth.env)
8
6
 
9
- AuthTrail.track(
10
- strategy: detect_strategy(auth),
11
- scope: opts[:scope].to_s,
12
- identity: AuthTrail.identity_method.call(request, opts, user),
13
- success: true,
14
- request: request,
15
- user: user
16
- )
17
- end
7
+ AuthTrail.track(
8
+ strategy: detect_strategy(auth),
9
+ scope: opts[:scope].to_s,
10
+ identity: AuthTrail.identity_method.call(request, opts, user),
11
+ success: true,
12
+ request: request,
13
+ user: user
14
+ )
18
15
  end
19
16
 
20
17
  def before_failure(env, opts)
21
- AuthTrail.safely do
22
- if opts[:message]
23
- request = ActionDispatch::Request.new(env)
18
+ request = ActionDispatch::Request.new(env)
24
19
 
25
- AuthTrail.track(
26
- strategy: detect_strategy(env["warden"]),
27
- scope: opts[:scope].to_s,
28
- identity: AuthTrail.identity_method.call(request, opts, nil),
29
- success: false,
30
- request: request,
31
- failure_reason: opts[:message].to_s
32
- )
33
- end
34
- end
20
+ AuthTrail.track(
21
+ strategy: detect_strategy(env["warden"]),
22
+ scope: opts[:scope].to_s,
23
+ identity: AuthTrail.identity_method.call(request, opts, nil),
24
+ success: false,
25
+ request: request,
26
+ failure_reason: opts[:message].to_s
27
+ )
35
28
  end
36
29
 
37
30
  private
@@ -1,3 +1,3 @@
1
1
  module AuthTrail
2
- VERSION = "0.1.3"
2
+ VERSION = "0.3.1"
3
3
  end
data/lib/authtrail.rb CHANGED
@@ -9,7 +9,7 @@ require "auth_trail/version"
9
9
 
10
10
  module AuthTrail
11
11
  class << self
12
- attr_accessor :exclude_method, :geocode, :track_method, :identity_method
12
+ attr_accessor :exclude_method, :geocode, :track_method, :identity_method, :job_queue, :transform_method
13
13
  end
14
14
  self.geocode = true
15
15
  self.identity_method = lambda do |request, opts, user|
@@ -22,7 +22,7 @@ module AuthTrail
22
22
  end
23
23
 
24
24
  def self.track(strategy:, scope:, identity:, success:, request:, user: nil, failure_reason: nil)
25
- info = {
25
+ data = {
26
26
  strategy: strategy,
27
27
  scope: scope,
28
28
  identity: identity,
@@ -35,17 +35,25 @@ module AuthTrail
35
35
  }
36
36
 
37
37
  if request.params[:controller]
38
- info[:context] = "#{request.params[:controller]}##{request.params[:action]}"
38
+ data[:context] = "#{request.params[:controller]}##{request.params[:action]}"
39
39
  end
40
40
 
41
+ # add request data before exclude_method since exclude_method doesn't have access to request
42
+ # could also add 2nd argument to exclude_method when arity > 1
43
+ AuthTrail.transform_method.call(data, request) if AuthTrail.transform_method
44
+
41
45
  # if exclude_method throws an exception, default to not excluding
42
- exclude = AuthTrail.exclude_method && AuthTrail.safely(default: false) { AuthTrail.exclude_method.call(info) }
46
+ exclude = AuthTrail.exclude_method && AuthTrail.safely(default: false) { AuthTrail.exclude_method.call(data) }
43
47
 
44
48
  unless exclude
45
49
  if AuthTrail.track_method
46
- AuthTrail.track_method.call(info)
50
+ AuthTrail.track_method.call(data)
47
51
  else
48
- login_activity = LoginActivity.create!(info)
52
+ login_activity = LoginActivity.new
53
+ data.each do |k, v|
54
+ login_activity.try("#{k}=", v)
55
+ end
56
+ login_activity.save!
49
57
  AuthTrail::GeocodeJob.perform_later(login_activity) if AuthTrail.geocode
50
58
  end
51
59
  end
@@ -66,5 +74,5 @@ Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
66
74
  end
67
75
 
68
76
  Warden::Manager.before_failure do |env, opts|
69
- AuthTrail::Manager.before_failure(env, opts)
77
+ AuthTrail::Manager.before_failure(env, opts) if opts[:message]
70
78
  end
@@ -1,52 +1,52 @@
1
- # taken from https://github.com/collectiveidea/audited/blob/master/lib/generators/audited/install_generator.rb
2
- require "rails/generators"
3
- require "rails/generators/migration"
4
- require "active_record"
5
1
  require "rails/generators/active_record"
6
2
 
7
3
  module Authtrail
8
4
  module Generators
9
5
  class InstallGenerator < Rails::Generators::Base
10
- include Rails::Generators::Migration
11
- source_root File.expand_path("../templates", __FILE__)
12
-
13
- # Implement the required interface for Rails::Generators::Migration.
14
- def self.next_migration_number(dirname) #:nodoc:
15
- next_migration_number = current_migration_number(dirname) + 1
16
- if ::ActiveRecord::Base.timestamped_migrations
17
- [Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % next_migration_number].max
18
- else
19
- "%.3d" % next_migration_number
20
- end
21
- end
6
+ include ActiveRecord::Generators::Migration
7
+ source_root File.join(__dir__, "templates")
8
+
9
+ class_option :lockbox, type: :boolean
22
10
 
23
11
  def copy_migration
24
12
  migration_template "login_activities_migration.rb", "db/migrate/create_login_activities.rb", migration_version: migration_version
25
13
  end
26
14
 
27
- def generate_model
28
- template "login_activity_model.rb", "app/models/login_activity.rb", model_base_class: model_base_class, ar_optional_flag: ar_optional_flag
15
+ def copy_templates
16
+ template "initializer.rb", "config/initializers/authtrail.rb"
29
17
  end
30
18
 
31
- def migration_version
32
- if rails5?
33
- "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
19
+ def generate_model
20
+ if lockbox?
21
+ template "model_lockbox.rb", "app/models/login_activity.rb"
22
+ else
23
+ template "model.rb", "app/models/login_activity.rb"
34
24
  end
35
25
  end
36
26
 
37
- def rails5?
38
- Rails::VERSION::MAJOR >= 5
27
+ def migration_version
28
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
39
29
  end
40
30
 
41
- def model_base_class
42
- rails5? ? "ApplicationRecord" : "ActiveRecord::Base"
31
+ def identity_column
32
+ if lockbox?
33
+ "t.text :identity_ciphertext\n t.string :identity_bidx, index: true"
34
+ else
35
+ "t.string :identity, index: true"
36
+ end
43
37
  end
44
38
 
45
- def ar_optional_flag
46
- if rails5?
47
- ", optional: true"
39
+ def ip_column
40
+ if lockbox?
41
+ "t.text :ip_ciphertext\n t.string :ip_bidx, index: true"
42
+ else
43
+ "t.string :ip, index: true"
48
44
  end
49
45
  end
46
+
47
+ def lockbox?
48
+ options[:lockbox]
49
+ end
50
50
  end
51
51
  end
52
52
  end
@@ -0,0 +1,14 @@
1
+ # set to true for geocoding
2
+ # we recommend configuring local geocoding first
3
+ # see https://github.com/ankane/authtrail#geocoding
4
+ AuthTrail.geocode = false
5
+
6
+ # add or modify data
7
+ # AuthTrail.transform_method = lambda do |data, request|
8
+ # data[:request_id] = request.request_id
9
+ # end
10
+
11
+ # exclude certain attempts from tracking
12
+ # AuthTrail.exclude_method = lambda do |data|
13
+ # data[:identity] == "capybara@example.org"
14
+ # end
@@ -3,21 +3,20 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
3
3
  create_table :login_activities do |t|
4
4
  t.string :scope
5
5
  t.string :strategy
6
- t.string :identity
6
+ <%= identity_column %>
7
7
  t.boolean :success
8
8
  t.string :failure_reason
9
9
  t.references :user, polymorphic: true
10
10
  t.string :context
11
- t.string :ip
11
+ <%= ip_column %>
12
12
  t.text :user_agent
13
13
  t.text :referrer
14
14
  t.string :city
15
15
  t.string :region
16
16
  t.string :country
17
+ t.float :latitude
18
+ t.float :longitude
17
19
  t.datetime :created_at
18
20
  end
19
-
20
- add_index :login_activities, :identity
21
- add_index :login_activities, :ip
22
21
  end
23
22
  end
@@ -0,0 +1,3 @@
1
+ class LoginActivity < ApplicationRecord
2
+ belongs_to :user, polymorphic: true, optional: true
3
+ end
@@ -0,0 +1,14 @@
1
+ class LoginActivity < ApplicationRecord
2
+ belongs_to :user, polymorphic: true, optional: true
3
+
4
+ encrypts :identity, :ip
5
+ blind_index :identity, :ip
6
+
7
+ before_save :reduce_precision
8
+
9
+ # reduce precision to city level to protect IP
10
+ def reduce_precision
11
+ self.latitude = latitude&.round(1) if try(:latitude_changed?)
12
+ self.longitude = longitude&.round(1) if try(:longitude_changed?)
13
+ end
14
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authtrail
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-28 00:00:00.000000000 Z
11
+ date: 2021-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '5.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.2'
26
+ version: '5.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activerecord
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '4.2'
33
+ version: '5.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '4.2'
40
+ version: '5.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: warden
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,50 +66,8 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: minitest
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- description:
112
- email: andrew@chartkick.com
69
+ description:
70
+ email: andrew@ankane.org
113
71
  executables: []
114
72
  extensions: []
115
73
  extra_rdoc_files: []
@@ -123,13 +81,15 @@ files:
123
81
  - lib/auth_trail/version.rb
124
82
  - lib/authtrail.rb
125
83
  - lib/generators/authtrail/install_generator.rb
84
+ - lib/generators/authtrail/templates/initializer.rb.tt
126
85
  - lib/generators/authtrail/templates/login_activities_migration.rb.tt
127
- - lib/generators/authtrail/templates/login_activity_model.rb.tt
86
+ - lib/generators/authtrail/templates/model.rb.tt
87
+ - lib/generators/authtrail/templates/model_lockbox.rb.tt
128
88
  homepage: https://github.com/ankane/authtrail
129
89
  licenses:
130
90
  - MIT
131
91
  metadata: {}
132
- post_install_message:
92
+ post_install_message:
133
93
  rdoc_options: []
134
94
  require_paths:
135
95
  - lib
@@ -137,16 +97,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
97
  requirements:
138
98
  - - ">="
139
99
  - !ruby/object:Gem::Version
140
- version: '2.2'
100
+ version: '2.6'
141
101
  required_rubygems_version: !ruby/object:Gem::Requirement
142
102
  requirements:
143
103
  - - ">="
144
104
  - !ruby/object:Gem::Version
145
105
  version: '0'
146
106
  requirements: []
147
- rubyforge_project:
148
- rubygems_version: 2.7.7
149
- signing_key:
107
+ rubygems_version: 3.2.3
108
+ signing_key:
150
109
  specification_version: 4
151
110
  summary: Track Devise login activity
152
111
  test_files: []
@@ -1,3 +0,0 @@
1
- class LoginActivity < <%= model_base_class %>
2
- belongs_to :user, polymorphic: true<%= ar_optional_flag %>
3
- end