authenticate 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile +0 -4
- data/Gemfile.lock +0 -5
- data/README.md +149 -78
- data/app/controllers/authenticate/passwords_controller.rb +130 -0
- data/app/controllers/authenticate/sessions_controller.rb +46 -0
- data/app/controllers/authenticate/users_controller.rb +46 -0
- data/app/mailers/authenticate_mailer.rb +13 -0
- data/app/views/authenticate_mailer/change_password.html.erb +8 -0
- data/app/views/authenticate_mailer/change_password.text.erb +5 -0
- data/app/views/layouts/application.html.erb +25 -0
- data/app/views/passwords/edit.html.erb +20 -0
- data/app/views/passwords/new.html.erb +19 -0
- data/app/views/sessions/new.html.erb +28 -0
- data/app/views/users/new.html.erb +24 -0
- data/authenticate.gemspec +1 -2
- data/config/locales/authenticate.en.yml +57 -0
- data/config/routes.rb +14 -1
- data/lib/authenticate/callbacks/brute_force.rb +5 -9
- data/lib/authenticate/callbacks/lifetimed.rb +1 -0
- data/lib/authenticate/callbacks/timeoutable.rb +2 -1
- data/lib/authenticate/callbacks/trackable.rb +1 -3
- data/lib/authenticate/configuration.rb +94 -5
- data/lib/authenticate/controller.rb +69 -9
- data/lib/authenticate/debug.rb +1 -0
- data/lib/authenticate/engine.rb +4 -11
- data/lib/authenticate/model/brute_force.rb +22 -3
- data/lib/authenticate/model/db_password.rb +12 -7
- data/lib/authenticate/model/email.rb +8 -10
- data/lib/authenticate/model/password_reset.rb +76 -0
- data/lib/authenticate/model/timeoutable.rb +9 -3
- data/lib/authenticate/model/trackable.rb +1 -1
- data/lib/authenticate/model/username.rb +21 -8
- data/lib/authenticate/modules.rb +19 -1
- data/lib/authenticate/session.rb +3 -1
- data/lib/authenticate/user.rb +6 -1
- data/lib/authenticate/version.rb +1 -1
- data/lib/generators/authenticate/controllers/USAGE +12 -0
- data/lib/generators/authenticate/controllers/controllers_generator.rb +21 -0
- data/lib/generators/authenticate/install/USAGE +7 -0
- data/lib/generators/authenticate/install/install_generator.rb +140 -0
- data/lib/generators/authenticate/install/templates/authenticate.rb +22 -0
- data/lib/generators/authenticate/install/templates/db/migrate/add_authenticate_brute_force_to_users.rb +6 -0
- data/lib/generators/authenticate/install/templates/db/migrate/add_authenticate_password_reset_to_users.rb +7 -0
- data/lib/generators/authenticate/install/templates/db/migrate/add_authenticate_timeoutable_to_users.rb +5 -0
- data/lib/generators/authenticate/install/templates/db/migrate/add_authenticate_to_users.rb +21 -0
- data/lib/generators/authenticate/install/templates/db/migrate/create_users.rb +14 -0
- data/lib/generators/authenticate/install/templates/user.rb +3 -0
- data/lib/generators/authenticate/routes/USAGE +8 -0
- data/lib/generators/authenticate/routes/routes_generator.rb +32 -0
- data/lib/generators/authenticate/routes/templates/routes.rb +10 -0
- data/lib/generators/authenticate/views/USAGE +13 -0
- data/lib/generators/authenticate/views/views_generator.rb +21 -0
- data/spec/dummy/app/controllers/application_controller.rb +1 -0
- data/spec/dummy/config/initializers/authenticate.rb +12 -5
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20160130192728_create_users.rb +18 -0
- data/spec/dummy/db/migrate/20160130192729_add_authenticate_brute_force_to_users.rb +6 -0
- data/spec/dummy/db/migrate/20160130192730_add_authenticate_timeoutable_to_users.rb +5 -0
- data/spec/dummy/db/migrate/20160130192731_add_authenticate_password_reset_to_users.rb +7 -0
- data/spec/dummy/db/schema.rb +14 -10
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/factories/users.rb +5 -8
- data/spec/model/brute_force_spec.rb +63 -0
- data/spec/model/session_spec.rb +4 -0
- data/spec/model/user_spec.rb +15 -5
- data/spec/spec_helper.rb +2 -1
- metadata +41 -9
- data/app/controllers/.keep +0 -0
- data/app/mailers/.keep +0 -0
- data/app/views/.keep +0 -0
- data/spec/dummy/db/migrate/20160120003910_create_users.rb +0 -18
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateUsers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
|
4
|
+
create_table :users do |t|
|
5
|
+
t.string :email
|
6
|
+
t.string :encrypted_password, limit: 128
|
7
|
+
t.string :session_token, limit: 128
|
8
|
+
t.datetime :current_sign_in_at
|
9
|
+
t.string :current_sign_in_ip, limit: 128
|
10
|
+
t.datetime :last_sign_in_at
|
11
|
+
t.string :last_sign_in_ip, limit: 128
|
12
|
+
t.integer :sign_in_count
|
13
|
+
end
|
14
|
+
|
15
|
+
add_index :users, :email
|
16
|
+
add_index :users, :session_token
|
17
|
+
end
|
18
|
+
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,21 +11,25 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20160130192731) do
|
15
15
|
|
16
16
|
create_table "users", force: :cascade do |t|
|
17
17
|
t.string "email"
|
18
|
-
t.string "encrypted_password"
|
19
|
-
t.string "session_token"
|
20
|
-
t.datetime "
|
21
|
-
t.
|
18
|
+
t.string "encrypted_password", limit: 128
|
19
|
+
t.string "session_token", limit: 128
|
20
|
+
t.datetime "current_sign_in_at"
|
21
|
+
t.string "current_sign_in_ip", limit: 128
|
22
22
|
t.datetime "last_sign_in_at"
|
23
|
-
t.string "last_sign_in_ip"
|
23
|
+
t.string "last_sign_in_ip", limit: 128
|
24
|
+
t.integer "sign_in_count"
|
25
|
+
t.integer "failed_logins_count", default: 0
|
26
|
+
t.datetime "lock_expires_at"
|
24
27
|
t.datetime "last_access_at"
|
25
|
-
t.
|
26
|
-
t.
|
27
|
-
t.datetime "created_at", null: false
|
28
|
-
t.datetime "updated_at", null: false
|
28
|
+
t.string "password_reset_token"
|
29
|
+
t.datetime "password_reset_sent_at"
|
29
30
|
end
|
30
31
|
|
32
|
+
add_index "users", ["email"], name: "index_users_on_email"
|
33
|
+
add_index "users", ["session_token"], name: "index_users_on_session_token"
|
34
|
+
|
31
35
|
end
|
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
data/spec/factories/users.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'authenticate/user'
|
2
|
+
|
1
3
|
FactoryGirl.define do
|
2
4
|
sequence :email do |n|
|
3
5
|
"user#{n}@example.com"
|
@@ -11,13 +13,8 @@ FactoryGirl.define do
|
|
11
13
|
session_token 'this_is_a_big_fake_long_token'
|
12
14
|
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# factory :user_with_optional_password, class: 'UserWithOptionalPassword' do
|
19
|
-
# password nil
|
20
|
-
# encrypted_password ''
|
21
|
-
# end
|
16
|
+
trait :with_forgotten_password do
|
17
|
+
password_reset_token Authenticate::Token.new
|
18
|
+
end
|
22
19
|
end
|
23
20
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'authenticate/model/brute_force'
|
3
|
+
|
4
|
+
|
5
|
+
describe Authenticate::Model::BruteForce do
|
6
|
+
before {
|
7
|
+
Authenticate.configure do |config|
|
8
|
+
config.max_consecutive_bad_logins_allowed = 2
|
9
|
+
config.bad_login_lockout_period = 2.minutes
|
10
|
+
end
|
11
|
+
}
|
12
|
+
|
13
|
+
it 'knows when it is locked' do
|
14
|
+
user = User.new
|
15
|
+
expect(user.locked?).to be_falsey
|
16
|
+
user.lock!
|
17
|
+
expect(user.locked?).to be_truthy
|
18
|
+
end
|
19
|
+
|
20
|
+
context '#register_failed_login!' do
|
21
|
+
it 'locks when failed login count reaches max' do
|
22
|
+
user = User.new
|
23
|
+
user.register_failed_login!
|
24
|
+
user.register_failed_login!
|
25
|
+
expect(user.locked?).to be_truthy
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'sets lockout period' do
|
29
|
+
user = User.new
|
30
|
+
user.register_failed_login!
|
31
|
+
user.register_failed_login!
|
32
|
+
expect(user.lock_expires_at).to_not be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context '#lock!' do
|
37
|
+
it 'before lock, locked_expires_at is nil' do
|
38
|
+
user = User.new
|
39
|
+
expect(user.lock_expires_at).to be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'sets locked_expires_at' do
|
43
|
+
user = User.new
|
44
|
+
user.lock!
|
45
|
+
expect(user.lock_expires_at).to_not be_nil
|
46
|
+
expect(user.lock_expires_at).to be_utc
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context '#unlock!' do
|
51
|
+
let(:user) { User.new }
|
52
|
+
before(:each) {
|
53
|
+
user.lock!
|
54
|
+
user.unlock!
|
55
|
+
}
|
56
|
+
it 'zeros failed_logins_count' do
|
57
|
+
expect(user.failed_logins_count).to be(0)
|
58
|
+
end
|
59
|
+
it 'nils lock_expires_at' do
|
60
|
+
expect(user.lock_expires_at).to be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/spec/model/session_spec.rb
CHANGED
@@ -41,6 +41,9 @@ describe Authenticate::Session do
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
it 'passes the failure status to the block when login fails' do
|
44
|
+
Authenticate.configure do |config|
|
45
|
+
config.max_consecutive_bad_logins_allowed = nil
|
46
|
+
end
|
44
47
|
session = Authenticate::Session.new(mock_request, {})
|
45
48
|
session.login nil do |status|
|
46
49
|
expect(status.success?).to eq false
|
@@ -80,6 +83,7 @@ describe Authenticate::Session do
|
|
80
83
|
|
81
84
|
def mock_request
|
82
85
|
req = double("request")
|
86
|
+
allow(req).to receive(:params)
|
83
87
|
allow(req).to receive(:remote_ip).and_return('111.111.111.111')
|
84
88
|
return req
|
85
89
|
end
|
data/spec/model/user_spec.rb
CHANGED
@@ -2,11 +2,21 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Authenticate::User do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
context 'session tokens' do
|
6
|
+
it 'generates a new session token' do
|
7
|
+
user = create(:user, :with_session_token)
|
8
|
+
old_token = user.session_token
|
9
|
+
user.generate_session_token
|
10
|
+
expect(user.session_token).to_not eq old_token
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'saves user when reset_session_token! called' do
|
14
|
+
user = create(:user, :with_session_token)
|
15
|
+
old_token = user.session_token
|
16
|
+
user.reset_session_token!
|
17
|
+
new_user = User.find(user.id)
|
18
|
+
expect(new_user.session_token).to_not eq old_token
|
19
|
+
end
|
10
20
|
end
|
11
21
|
|
12
22
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,11 +12,12 @@ MY_ORM = :active_record
|
|
12
12
|
|
13
13
|
|
14
14
|
require 'rails/all'
|
15
|
-
# require 'rspec'
|
16
15
|
require 'rspec/rails'
|
17
16
|
require 'factory_girl_rails'
|
18
17
|
# require 'timecop'
|
19
18
|
|
19
|
+
require 'authenticate'
|
20
|
+
|
20
21
|
ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
|
21
22
|
Dir[File.join(ENGINE_RAILS_ROOT, "spec/factories/**/*.rb")].each {|f| require f }
|
22
23
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: authenticate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Tomich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bcrypt
|
@@ -73,7 +73,7 @@ dependencies:
|
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
|
-
name: rspec
|
76
|
+
name: rspec-rails
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - ">="
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '0'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
90
|
+
name: factory_girl_rails
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - ">="
|
@@ -101,7 +101,7 @@ dependencies:
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
104
|
+
name: pry
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - ">="
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- ".gitignore"
|
127
127
|
- ".rspec"
|
128
128
|
- ".ruby-version"
|
129
|
+
- CHANGELOG.md
|
129
130
|
- Gemfile
|
130
131
|
- Gemfile.lock
|
131
132
|
- LICENSE
|
@@ -135,13 +136,22 @@ files:
|
|
135
136
|
- app/assets/images/authenticate/.keep
|
136
137
|
- app/assets/javascripts/authenticate/.keep
|
137
138
|
- app/assets/stylesheets/authenticate/.keep
|
138
|
-
- app/controllers
|
139
|
+
- app/controllers/authenticate/passwords_controller.rb
|
140
|
+
- app/controllers/authenticate/sessions_controller.rb
|
141
|
+
- app/controllers/authenticate/users_controller.rb
|
139
142
|
- app/helpers/.keep
|
140
|
-
- app/mailers
|
143
|
+
- app/mailers/authenticate_mailer.rb
|
141
144
|
- app/models/.keep
|
142
|
-
- app/views
|
145
|
+
- app/views/authenticate_mailer/change_password.html.erb
|
146
|
+
- app/views/authenticate_mailer/change_password.text.erb
|
147
|
+
- app/views/layouts/application.html.erb
|
148
|
+
- app/views/passwords/edit.html.erb
|
149
|
+
- app/views/passwords/new.html.erb
|
150
|
+
- app/views/sessions/new.html.erb
|
151
|
+
- app/views/users/new.html.erb
|
143
152
|
- authenticate.gemspec
|
144
153
|
- bin/rails
|
154
|
+
- config/locales/authenticate.en.yml
|
145
155
|
- config/routes.rb
|
146
156
|
- lib/authenticate.rb
|
147
157
|
- lib/authenticate/callbacks/authenticatable.rb
|
@@ -160,6 +170,7 @@ files:
|
|
160
170
|
- lib/authenticate/model/db_password.rb
|
161
171
|
- lib/authenticate/model/email.rb
|
162
172
|
- lib/authenticate/model/lifetimed.rb
|
173
|
+
- lib/authenticate/model/password_reset.rb
|
163
174
|
- lib/authenticate/model/timeoutable.rb
|
164
175
|
- lib/authenticate/model/trackable.rb
|
165
176
|
- lib/authenticate/model/username.rb
|
@@ -168,6 +179,22 @@ files:
|
|
168
179
|
- lib/authenticate/token.rb
|
169
180
|
- lib/authenticate/user.rb
|
170
181
|
- lib/authenticate/version.rb
|
182
|
+
- lib/generators/authenticate/controllers/USAGE
|
183
|
+
- lib/generators/authenticate/controllers/controllers_generator.rb
|
184
|
+
- lib/generators/authenticate/install/USAGE
|
185
|
+
- lib/generators/authenticate/install/install_generator.rb
|
186
|
+
- lib/generators/authenticate/install/templates/authenticate.rb
|
187
|
+
- lib/generators/authenticate/install/templates/db/migrate/add_authenticate_brute_force_to_users.rb
|
188
|
+
- lib/generators/authenticate/install/templates/db/migrate/add_authenticate_password_reset_to_users.rb
|
189
|
+
- lib/generators/authenticate/install/templates/db/migrate/add_authenticate_timeoutable_to_users.rb
|
190
|
+
- lib/generators/authenticate/install/templates/db/migrate/add_authenticate_to_users.rb
|
191
|
+
- lib/generators/authenticate/install/templates/db/migrate/create_users.rb
|
192
|
+
- lib/generators/authenticate/install/templates/user.rb
|
193
|
+
- lib/generators/authenticate/routes/USAGE
|
194
|
+
- lib/generators/authenticate/routes/routes_generator.rb
|
195
|
+
- lib/generators/authenticate/routes/templates/routes.rb
|
196
|
+
- lib/generators/authenticate/views/USAGE
|
197
|
+
- lib/generators/authenticate/views/views_generator.rb
|
171
198
|
- lib/tasks/authenticate_tasks.rake
|
172
199
|
- spec/configuration_spec.rb
|
173
200
|
- spec/dummy/README.rdoc
|
@@ -208,7 +235,10 @@ files:
|
|
208
235
|
- spec/dummy/config/routes.rb
|
209
236
|
- spec/dummy/config/secrets.yml
|
210
237
|
- spec/dummy/db/development.sqlite3
|
211
|
-
- spec/dummy/db/migrate/
|
238
|
+
- spec/dummy/db/migrate/20160130192728_create_users.rb
|
239
|
+
- spec/dummy/db/migrate/20160130192729_add_authenticate_brute_force_to_users.rb
|
240
|
+
- spec/dummy/db/migrate/20160130192730_add_authenticate_timeoutable_to_users.rb
|
241
|
+
- spec/dummy/db/migrate/20160130192731_add_authenticate_password_reset_to_users.rb
|
212
242
|
- spec/dummy/db/schema.rb
|
213
243
|
- spec/dummy/db/test.sqlite3
|
214
244
|
- spec/dummy/lib/assets/.keep
|
@@ -218,6 +248,7 @@ files:
|
|
218
248
|
- spec/dummy/public/500.html
|
219
249
|
- spec/dummy/public/favicon.ico
|
220
250
|
- spec/factories/users.rb
|
251
|
+
- spec/model/brute_force_spec.rb
|
221
252
|
- spec/model/session_spec.rb
|
222
253
|
- spec/model/token_spec.rb
|
223
254
|
- spec/model/user_spec.rb
|
@@ -250,6 +281,7 @@ specification_version: 4
|
|
250
281
|
summary: Rails authentication with email & password
|
251
282
|
test_files:
|
252
283
|
- spec/configuration_spec.rb
|
284
|
+
- spec/model/brute_force_spec.rb
|
253
285
|
- spec/model/session_spec.rb
|
254
286
|
- spec/model/token_spec.rb
|
255
287
|
- spec/model/user_spec.rb
|
data/app/controllers/.keep
DELETED
File without changes
|
data/app/mailers/.keep
DELETED
File without changes
|
data/app/views/.keep
DELETED
File without changes
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class CreateUsers < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table :users do |t|
|
4
|
-
t.string :email
|
5
|
-
t.string :encrypted_password
|
6
|
-
t.string :session_token
|
7
|
-
t.datetime :session_expiration
|
8
|
-
t.integer :sign_in_count
|
9
|
-
t.datetime :last_sign_in_at
|
10
|
-
t.string :last_sign_in_ip
|
11
|
-
t.datetime :last_access_at
|
12
|
-
t.datetime :current_sign_in_at
|
13
|
-
t.string :current_sign_in_ip
|
14
|
-
|
15
|
-
t.timestamps null: false
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|