password_resetter 1.0.7 → 1.0.9
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 +15 -0
- data/README.md +40 -50
- data/app/mailers/password_reset_mailer.rb +1 -1
- data/lib/password_resetter.rb +6 -0
- data/lib/password_resetter/version.rb +1 -1
- data/spec/models/password_reset_spec.rb +25 -25
- metadata +12 -50
- data/spec/dummy/log/development.log +0 -138
- data/spec/dummy/log/test.log +0 -7071
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NThhNjNhNDI2YmU2ZmQ3ZjY1MmIyOWIxYmFkNzkyMDE3YjRjNThiZQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjI0MzYwOTU5YmQ4ZDllOWFjNzAxN2IxNDRkY2VmY2ViMDAxNDFjYw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OTZiMWUyOTU4MWMxNTAxMThjMjlkYzI5ZTBkMzY0OGZlODFhNzEzNTg5MTkw
|
10
|
+
MTI1MTY0NzVlMDIwNDE4MzM3NGZjNGMxMzFhMjVmMzRkMzY2NGQyZDIxZWY4
|
11
|
+
YWY2OWNlYjg1ZmFhZjM2MjNmNDMxYzExMDhkOTI0MDcxNzBjYjk=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Zjg3NGI1Y2FkZWJmZmE3YjNmYWZmZTMxOTgyMjYwN2Q3ZGM1ZmE4M2Y4OGZj
|
14
|
+
NDRlNDg4YmM4YWM2NWY3NjM5ZDcxNzgwOTU1OWUyMmNlMjU1MmI1NjQwMTgz
|
15
|
+
ZTMxNDYxZDA0YjQ4ZGQxMmNjNTY0Mzg4MzM4NWExMjg4M2VjNjQ=
|
data/README.md
CHANGED
@@ -12,36 +12,33 @@ PasswordResetter is a simple gem used to give Users the ability to reset their p
|
|
12
12
|
|
13
13
|
Get it.
|
14
14
|
|
15
|
-
|
16
|
-
gem 'password_resetter'
|
17
|
-
```
|
15
|
+
gem 'password_resetter'
|
18
16
|
|
19
17
|
Install it.
|
20
18
|
|
21
|
-
|
22
|
-
bundle install
|
23
|
-
```
|
19
|
+
bundle install
|
24
20
|
|
25
21
|
Migrate it.
|
26
22
|
|
27
|
-
|
28
|
-
rake
|
29
|
-
rake db:migrate
|
30
|
-
```
|
23
|
+
rake password_resetter_engine:install:migrations
|
24
|
+
rake db:migrate
|
31
25
|
|
32
26
|
If you haven't already, set your action mailer host in config/environments.
|
33
27
|
Simply place the following lines at the bottom of the necessary environment files
|
34
28
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
29
|
+
# Action mailer for reset passwords
|
30
|
+
config.action_mailer.default_url_options = { :host => "localhost:3000" }
|
31
|
+
|
32
|
+
Set up the email which users will be emailed from in an initializer
|
33
|
+
|
34
|
+
# config/initializers/password_resetter.rb
|
35
|
+
PasswordResetter.setup do |config|
|
36
|
+
config.from_email = "password.recover@example.com"
|
37
|
+
end
|
39
38
|
|
40
39
|
Lastly, throw the following link into the appropriate view file (i.e. views/sessions/new.html.erb)
|
41
40
|
|
42
|
-
|
43
|
-
<%= link_to "Forgot Password?", new_password_reset_path %>
|
44
|
-
```
|
41
|
+
<%= link_to "Forgot Password?", new_password_reset_path %>
|
45
42
|
|
46
43
|
## Visual Customization
|
47
44
|
|
@@ -51,52 +48,45 @@ To match the style of your own app, every element of the html.erb files comes ta
|
|
51
48
|
#### The page a User is directed when they click on the "Forgot Password?" link
|
52
49
|
|
53
50
|
The entire form is wrapped with
|
54
|
-
```ruby
|
55
|
-
:class => "password-reset-request-field"
|
56
|
-
```
|
57
51
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
52
|
+
:class => "password-reset-request-field"
|
53
|
+
|
54
|
+
Email input field is tagged with
|
55
|
+
|
56
|
+
:id => "password_reset_email"
|
62
57
|
|
63
58
|
Reset Password button:
|
64
|
-
|
65
|
-
:class => "password-reset-button reset"
|
66
|
-
```
|
59
|
+
|
60
|
+
:class => "password-reset-button reset"
|
67
61
|
|
68
62
|
### Complete Password Reset Page
|
69
63
|
#### The page a User is directed when they follow the link emailed to them after initializing the reset process
|
70
64
|
|
71
65
|
|
72
66
|
The entire form is wrapped with
|
73
|
-
|
74
|
-
:class => "password-reset-complete-field"
|
75
|
-
```
|
67
|
+
|
68
|
+
:class => "password-reset-complete-field"
|
76
69
|
|
77
70
|
Password and Password Confirmation fields tagged respectively with:
|
78
|
-
|
79
|
-
:id => "password_reset_password"
|
80
|
-
:id => "password_reset_password_confirmation"
|
81
|
-
```
|
71
|
+
|
72
|
+
:id => "password_reset_password"
|
73
|
+
:id => "password_reset_password_confirmation"
|
82
74
|
|
83
75
|
Update Password button:
|
84
|
-
|
85
|
-
:class => "password-reset-button update"
|
86
|
-
```
|
76
|
+
|
77
|
+
:class => "password-reset-button update"
|
87
78
|
|
88
79
|
For example, in `application.css.scss`
|
89
80
|
|
90
|
-
|
91
|
-
#password_reset_email, #password_reset_password, #password_reset_password_confirmation {
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
}
|
96
|
-
|
97
|
-
.password-reset-button {
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
}
|
102
|
-
```
|
81
|
+
|
82
|
+
#password_reset_email, #password_reset_password, #password_reset_password_confirmation {
|
83
|
+
margin-bottom: 15px;
|
84
|
+
margin-top: 5px;
|
85
|
+
width: 285px;
|
86
|
+
}
|
87
|
+
|
88
|
+
.password-reset-button {
|
89
|
+
background: image-url("my_button.png");
|
90
|
+
height: 25px;
|
91
|
+
width: 100px;
|
92
|
+
}
|
data/lib/password_resetter.rb
CHANGED
@@ -37,97 +37,97 @@ describe PasswordReset do
|
|
37
37
|
# * generates token
|
38
38
|
# * saves present time
|
39
39
|
# * sends an email to the user with instructions
|
40
|
-
|
40
|
+
|
41
41
|
let(:user) { FactoryGirl.create(:user, :username => 'eli', :email => 'eli@viget.com') }
|
42
42
|
let(:mailer) { double('password reset mailer') }
|
43
43
|
subject { described_class.create(:user => user) }
|
44
|
-
|
44
|
+
|
45
45
|
before do
|
46
46
|
PasswordResetMailer.stub(:password_reset).with(user, subject).and_return(mailer)
|
47
47
|
mailer.stub(:deliver).and_return(true) # so the email doesn't actually get called
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "generates a reset_token" do
|
51
51
|
expect{ subject.send_password_reset }.to change{ subject.reset_token }.from(nil)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
it "saves the present time" do
|
55
55
|
expect{ subject.send_password_reset }.to change{ subject.reset_sent_at }.from(nil)
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
it "sends an email" do
|
59
59
|
mailer.should_receive(:deliver)
|
60
60
|
subject.send_password_reset
|
61
|
-
end
|
61
|
+
end
|
62
62
|
end
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
describe "#update_user_password" do
|
66
66
|
let(:user) { FactoryGirl.create(:user, :username => 'eli', :email => 'eli@viget.com') }
|
67
67
|
subject { described_class.create(:user => user) }
|
68
|
-
|
68
|
+
|
69
69
|
context "when passwords are blank" do
|
70
70
|
|
71
71
|
it "should return false for blank password" do
|
72
72
|
subject.update_user_password("", "secret").should be(false)
|
73
|
-
end
|
74
|
-
|
73
|
+
end
|
74
|
+
|
75
75
|
it "should return false for blank password_confirmation" do
|
76
76
|
subject.update_user_password("secret", "").should be(false)
|
77
|
-
end
|
77
|
+
end
|
78
78
|
|
79
79
|
it "should return false for blank both" do
|
80
80
|
subject.update_user_password("", "").should be(false)
|
81
|
-
end
|
81
|
+
end
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
context "when passwords don't match" do
|
85
|
-
|
85
|
+
|
86
86
|
it "should return false" do
|
87
87
|
subject.update_user_password("does_not", "match").should be(false)
|
88
88
|
end
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
context "when passwords are valid" do
|
92
|
-
|
92
|
+
|
93
93
|
it "should return true" do
|
94
94
|
subject.update_user_password("new_secret", "new_secret").should be(true)
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
it "should change the password of the user" do
|
98
98
|
expect{ subject.update_user_password("asdf", "asdf") }.to change{ User.authenticate("eli", "asdf") }.from(false).to(user)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
describe "#expired?" do
|
104
|
-
|
104
|
+
|
105
105
|
it "should return true if > 2 hours have passed" do
|
106
106
|
subject.update_attributes(:reset_sent_at => 3.hours.ago)
|
107
107
|
subject.expired?.should be(true)
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
it "should return false if < 2 hours have passed" do
|
111
111
|
subject.update_attributes(:reset_sent_at => 2.hours.ago + 1.minute)
|
112
|
-
subject.expired?.should be(false)
|
112
|
+
subject.expired?.should be(false)
|
113
113
|
end
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
describe "#delete_existing" do
|
117
117
|
let(:user) { FactoryGirl.create(:user, :username => 'eli', :email => 'eli@viget.com') }
|
118
118
|
before do
|
119
119
|
@pr1 = PasswordReset.create(:user => user, :email => 'filler')
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
it "should do nothing if another PasswordReset does not exist" do
|
123
123
|
expect{ @pr1.delete_existing }.to_not change{ PasswordReset.count }
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
it "should delete an existing PasswordReset if one exists" do
|
127
127
|
@pr2 = PasswordReset.create(:user => user, :email => 'filler')
|
128
128
|
expect{ @pr2.delete_existing }.to change{ PasswordReset.count }.by(-1)
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
end
|
132
132
|
|
133
133
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: password_resetter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.9
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Eli Fatsi
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-07 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rails
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: bcrypt-ruby
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: sqlite3
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec-rails
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: shoulda-matchers
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: capybara
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ! '>='
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ! '>='
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -110,7 +97,6 @@ dependencies:
|
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: database_cleaner
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
101
|
- - ! '>='
|
116
102
|
- !ruby/object:Gem::Version
|
@@ -118,7 +104,6 @@ dependencies:
|
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
108
|
- - ! '>='
|
124
109
|
- !ruby/object:Gem::Version
|
@@ -126,7 +111,6 @@ dependencies:
|
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: factory_girl_rails
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
115
|
- - ~>
|
132
116
|
- !ruby/object:Gem::Version
|
@@ -134,27 +118,10 @@ dependencies:
|
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
122
|
- - ~>
|
140
123
|
- !ruby/object:Gem::Version
|
141
124
|
version: '1.7'
|
142
|
-
- !ruby/object:Gem::Dependency
|
143
|
-
name: bcrypt-ruby
|
144
|
-
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
|
-
requirements:
|
147
|
-
- - ! '>='
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
version: '0'
|
150
|
-
type: :development
|
151
|
-
prerelease: false
|
152
|
-
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- - ! '>='
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '0'
|
158
125
|
description: Allowing Users to reset their password through email
|
159
126
|
email:
|
160
127
|
- efatsi@comcast.net
|
@@ -162,6 +129,9 @@ executables: []
|
|
162
129
|
extensions: []
|
163
130
|
extra_rdoc_files: []
|
164
131
|
files:
|
132
|
+
- MIT-LICENSE
|
133
|
+
- README.md
|
134
|
+
- Rakefile
|
165
135
|
- app/assets/javascripts/password_resets.js
|
166
136
|
- app/assets/stylesheets/password_resets.css
|
167
137
|
- app/controllers/password_resets_controller.rb
|
@@ -173,20 +143,20 @@ files:
|
|
173
143
|
- app/views/password_resets/new.html.erb
|
174
144
|
- config/routes.rb
|
175
145
|
- db/migrate/20120829163145_create_password_resets.rb
|
146
|
+
- lib/password_resetter.rb
|
176
147
|
- lib/password_resetter/engine.rb
|
177
148
|
- lib/password_resetter/resettable.rb
|
178
149
|
- lib/password_resetter/version.rb
|
179
|
-
- lib/password_resetter.rb
|
180
150
|
- lib/tasks/password_resetter_tasks.rake
|
181
|
-
-
|
182
|
-
- Rakefile
|
183
|
-
- README.md
|
151
|
+
- spec/dummy/README.rdoc
|
152
|
+
- spec/dummy/Rakefile
|
184
153
|
- spec/dummy/app/assets/javascripts/application.js
|
185
154
|
- spec/dummy/app/assets/stylesheets/application.css
|
186
155
|
- spec/dummy/app/controllers/application_controller.rb
|
187
156
|
- spec/dummy/app/helpers/application_helper.rb
|
188
157
|
- spec/dummy/app/models/user.rb
|
189
158
|
- spec/dummy/app/views/layouts/application.html.erb
|
159
|
+
- spec/dummy/config.ru
|
190
160
|
- spec/dummy/config/application.rb
|
191
161
|
- spec/dummy/config/boot.rb
|
192
162
|
- spec/dummy/config/database.yml
|
@@ -202,21 +172,16 @@ files:
|
|
202
172
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
203
173
|
- spec/dummy/config/locales/en.yml
|
204
174
|
- spec/dummy/config/routes.rb
|
205
|
-
- spec/dummy/config.ru
|
206
175
|
- spec/dummy/db/development.sqlite3
|
207
176
|
- spec/dummy/db/migrate/20120829165609_create_users.rb
|
208
177
|
- spec/dummy/db/production.sqlite3
|
209
178
|
- spec/dummy/db/schema.rb
|
210
179
|
- spec/dummy/db/spec.sqlite3
|
211
180
|
- spec/dummy/db/test.sqlite3
|
212
|
-
- spec/dummy/log/development.log
|
213
|
-
- spec/dummy/log/test.log
|
214
181
|
- spec/dummy/public/404.html
|
215
182
|
- spec/dummy/public/422.html
|
216
183
|
- spec/dummy/public/500.html
|
217
184
|
- spec/dummy/public/favicon.ico
|
218
|
-
- spec/dummy/Rakefile
|
219
|
-
- spec/dummy/README.rdoc
|
220
185
|
- spec/dummy/script/rails
|
221
186
|
- spec/dummy/test/fixtures/users.yml
|
222
187
|
- spec/dummy/test/unit/user_test.rb
|
@@ -228,27 +193,26 @@ files:
|
|
228
193
|
- spec/support/making_helper.rb
|
229
194
|
homepage: https://github.com/efatsi/password_resetter
|
230
195
|
licenses: []
|
196
|
+
metadata: {}
|
231
197
|
post_install_message:
|
232
198
|
rdoc_options: []
|
233
199
|
require_paths:
|
234
200
|
- lib
|
235
201
|
required_ruby_version: !ruby/object:Gem::Requirement
|
236
|
-
none: false
|
237
202
|
requirements:
|
238
203
|
- - ! '>='
|
239
204
|
- !ruby/object:Gem::Version
|
240
205
|
version: '0'
|
241
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
|
-
none: false
|
243
207
|
requirements:
|
244
208
|
- - ! '>='
|
245
209
|
- !ruby/object:Gem::Version
|
246
210
|
version: '0'
|
247
211
|
requirements: []
|
248
212
|
rubyforge_project:
|
249
|
-
rubygems_version:
|
213
|
+
rubygems_version: 2.2.2
|
250
214
|
signing_key:
|
251
|
-
specification_version:
|
215
|
+
specification_version: 4
|
252
216
|
summary: Allowing Users to reset their password through email
|
253
217
|
test_files:
|
254
218
|
- spec/dummy/app/assets/javascripts/application.js
|
@@ -279,8 +243,6 @@ test_files:
|
|
279
243
|
- spec/dummy/db/schema.rb
|
280
244
|
- spec/dummy/db/spec.sqlite3
|
281
245
|
- spec/dummy/db/test.sqlite3
|
282
|
-
- spec/dummy/log/development.log
|
283
|
-
- spec/dummy/log/test.log
|
284
246
|
- spec/dummy/public/404.html
|
285
247
|
- spec/dummy/public/422.html
|
286
248
|
- spec/dummy/public/500.html
|