Feature #19458 » 0002-Allow-to-specify-maximum-password-age.patch
app/controllers/application_controller.rb (working copy) | ||
---|---|---|
204 | 204 |
def check_password_change |
205 | 205 |
if session[:pwd] |
206 | 206 |
if User.current.must_change_password? |
207 |
flash[:error] = l(:error_password_expired) |
|
207 | 208 |
redirect_to my_password_path |
208 | 209 |
else |
209 | 210 |
session.delete(:pwd) |
app/models/user.rb (working copy) | ||
---|---|---|
323 | 323 |
return auth_source.allow_password_changes? |
324 | 324 |
end |
325 | 325 | |
326 |
def password_expired? |
|
327 |
changed_on = self.passwd_changed_on || Time.at(0) |
|
328 |
period = Setting.password_max_age.to_i |
|
329 | ||
330 |
if period.zero? |
|
331 |
false |
|
332 |
else |
|
333 |
changed_on < period.days.ago |
|
334 |
end |
|
335 |
end |
|
336 | ||
326 | 337 |
def must_change_password? |
327 |
must_change_passwd? && change_password_allowed?
|
|
338 |
(must_change_passwd? || password_expired?) && change_password_allowed?
|
|
328 | 339 |
end |
329 | 340 | |
330 | 341 |
def generate_password? |
app/views/my/password.html.erb (working copy) | ||
---|---|---|
17 | 17 |
<%= submit_tag l(:button_apply) %> |
18 | 18 |
<% end %> |
19 | 19 | |
20 |
<% unless @user.must_change_passwd? %> |
|
20 |
<% unless @user.must_change_passwd? || @user.password_expired? %>
|
|
21 | 21 |
<% content_for :sidebar do %> |
22 | 22 |
<%= render :partial => 'sidebar' %> |
23 | 23 |
<% end %> |
app/views/settings/_authentication.html.erb (working copy) | ||
---|---|---|
14 | 14 | |
15 | 15 |
<p><%= setting_text_field :password_min_length, :size => 6 %></p> |
16 | 16 | |
17 |
<p> |
|
18 |
<%= setting_select :password_max_age, [[l(:label_disabled), 0]] + [7, 30, 60, 90, 180, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]} %> |
|
19 |
</p> |
|
20 | ||
17 | 21 |
<p><%= setting_check_box :lost_password, :label => :label_password_lost %></p> |
18 | 22 | |
19 | 23 |
<p><%= setting_text_field :max_additional_emails, :size => 6 %></p> |
config/locales/de.yml (working copy) | ||
---|---|---|
1026 | 1026 |
setting_non_working_week_days: Arbeitsfreie Tage |
1027 | 1027 |
setting_openid: Erlaube OpenID-Anmeldung und -Registrierung |
1028 | 1028 |
setting_password_min_length: Mindestlänge des Kennworts |
1029 |
setting_password_max_age: Erzwinge Passwortwechsel nach |
|
1029 | 1030 |
setting_per_page_options: Objekte pro Seite |
1030 | 1031 |
setting_plain_text_mail: Nur reinen Text (kein HTML) senden |
1031 | 1032 |
setting_protocol: Protokoll |
config/locales/en.yml (working copy) | ||
---|---|---|
204 | 204 |
error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" |
205 | 205 |
error_session_expired: "Your session has expired. Please login again." |
206 | 206 |
warning_attachments_not_saved: "%{count} file(s) could not be saved." |
207 |
error_password_expired: "Your password has expired or the administrator requires you to change it." |
|
207 | 208 | |
208 | 209 |
mail_subject_lost_password: "Your %{value} password" |
209 | 210 |
mail_body_lost_password: 'To change your password, click on the following link:' |
... | ... | |
386 | 387 |
setting_file_max_size_displayed: Maximum size of text files displayed inline |
387 | 388 |
setting_repository_log_display_limit: Maximum number of revisions displayed on file log |
388 | 389 |
setting_openid: Allow OpenID login and registration |
390 |
setting_password_max_age: Require password change after |
|
389 | 391 |
setting_password_min_length: Minimum password length |
390 | 392 |
setting_new_project_user_role_id: Role given to a non-admin user who creates a project |
391 | 393 |
setting_default_projects_modules: Default enabled modules for new projects |
config/settings.yml (working copy) | ||
---|---|---|
36 | 36 |
password_min_length: |
37 | 37 |
format: int |
38 | 38 |
default: 8 |
39 |
# Maximum password age in days |
|
40 |
password_max_age: |
|
41 |
format: int |
|
42 |
default: 0 |
|
39 | 43 |
# Maximum number of additional email addresses per user |
40 | 44 |
max_additional_emails: |
41 | 45 |
format: int |
test/integration/account_test.rb (working copy) | ||
---|---|---|
150 | 150 |
assert_equal false, User.find_by_login('jsmith').must_change_passwd? |
151 | 151 |
end |
152 | 152 | |
153 |
def test_user_with_expired_password_should_be_forced_to_change_its_password |
|
154 |
User.find_by_login('jsmith').update_attribute :passwd_changed_on, 14.days.ago |
|
155 | ||
156 |
with_settings :password_max_age => 7 do |
|
157 |
post '/login', :username => 'jsmith', :password => 'jsmith' |
|
158 |
assert_redirected_to '/my/page' |
|
159 |
follow_redirect! |
|
160 |
assert_redirected_to '/my/password' |
|
161 | ||
162 |
get '/issues' |
|
163 |
assert_redirected_to '/my/password' |
|
164 |
end |
|
165 |
end |
|
166 | ||
167 |
def test_user_with_expired_password_should_be_able_to_change_its_password |
|
168 |
User.find_by_login('jsmith').update_attribute :passwd_changed_on, 14.days.ago |
|
169 | ||
170 |
with_settings :password_max_age => 7 do |
|
171 |
post '/login', :username => 'jsmith', :password => 'jsmith' |
|
172 |
assert_redirected_to '/my/page' |
|
173 |
follow_redirect! |
|
174 |
assert_redirected_to '/my/password' |
|
175 |
follow_redirect! |
|
176 |
assert_response :success |
|
177 |
post '/my/password', :password => 'jsmith', :new_password => 'newpassword', :new_password_confirmation => 'newpassword' |
|
178 |
assert_redirected_to '/my/account' |
|
179 |
follow_redirect! |
|
180 |
assert_response :success |
|
181 | ||
182 |
assert_equal false, User.find_by_login('jsmith').must_change_passwd? |
|
183 |
end |
|
184 | ||
185 |
end |
|
186 | ||
153 | 187 |
def test_register_with_automatic_activation |
154 | 188 |
Setting.self_registration = '3' |
155 | 189 |
- « Previous
- 1
- 2
- 3
- Next »