Patch #5690 » ldap_password_change_10084.diff
app/helpers/auth_sources_helper.rb (working copy) | ||
---|---|---|
21 | 21 |
def auth_source_partial_name(auth_source) |
22 | 22 |
"form_#{auth_source.class.name.underscore}" |
23 | 23 |
end |
24 |
|
|
25 |
module Encryption |
|
26 |
# Return an array of password encryptions |
|
27 |
def self.encryptiontypes |
|
28 |
["MD5","SSHA","CLEAR"] |
|
29 |
end |
|
30 |
end |
|
24 | 31 |
end |
app/models/auth_source_ldap.rb (working copy) | ||
---|---|---|
18 | 18 |
require 'iconv' |
19 | 19 |
require 'net/ldap' |
20 | 20 |
require 'net/ldap/dn' |
21 |
require 'digest' |
|
22 |
require 'base64' |
|
21 | 23 | |
22 | 24 |
class AuthSourceLdap < AuthSource |
23 | 25 |
validates_presence_of :host, :port, :attr_login |
... | ... | |
66 | 68 |
"LDAP" |
67 | 69 |
end |
68 | 70 | |
71 |
def allow_password_changes? |
|
72 |
return self.enabled_passwd |
|
73 |
end |
|
74 |
|
|
75 |
def encode_password(clear_password) |
|
76 |
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a |
|
77 |
salt = '' |
|
78 |
10.times { |i| salt << chars[rand(chars.size-1)] } |
|
79 |
|
|
80 |
if self.password_encryption == "MD5" |
|
81 |
logger.debug "Encode as md5" |
|
82 |
return "{MD5}"+Base64.encode64(Digest::MD5.digest(clear_password)).chomp! |
|
83 |
end |
|
84 |
if self.password_encryption == "SSHA" |
|
85 |
logger.debug "Encode as ssha" |
|
86 |
return "{SSHA}"+Base64.encode64(Digest::SHA1.digest(clear_password+salt)+salt).chomp! |
|
87 |
end |
|
88 |
|
|
89 |
if self.password_encryption == "CLEAR" |
|
90 |
logger.debug "Encode as cleartype" |
|
91 |
return clear_password |
|
92 |
end |
|
93 |
end |
|
94 | ||
95 |
# change password |
|
96 |
def change_password(login,password,newPassword) |
|
97 |
begin |
|
98 |
attrs = get_user_dn(login, password) |
|
99 |
if attrs |
|
100 |
if self.account.blank? || self.account_password.blank? |
|
101 |
logger.debug "Binding with user account" |
|
102 |
ldap_con = initialize_ldap_con(attrs[:dn], password) |
|
103 |
else |
|
104 |
logger.debug "Binding with administrator account" |
|
105 |
ldap_con = initialize_ldap_con(self.account, self.account_password) |
|
106 |
end |
|
107 | ||
108 |
ops = [ |
|
109 |
[:delete, :userPassword, password], |
|
110 |
[:add, :userPassword, newPassword] |
|
111 |
] |
|
112 |
return ldap_con.modify :dn => attrs[:dn], :operations => ops |
|
113 |
# This is another password change method, probably more common |
|
114 |
#return ldap_con.replace_attribute attrs[:dn], :userPassword, encode_password(newPassword) |
|
115 |
end |
|
116 |
rescue |
|
117 |
return false |
|
118 |
end |
|
119 |
return false |
|
120 |
end |
|
121 |
|
|
69 | 122 |
private |
70 | 123 | |
71 | 124 |
def ldap_filter |
app/models/user.rb (working copy) | ||
---|---|---|
594 | 594 |
end |
595 | 595 |
end |
596 | 596 | |
597 |
def isExternal? |
|
598 |
return auth_source_id.present? |
|
599 |
end |
|
600 |
|
|
601 |
def changeExternalPassword(password,newPassword,newPasswordConfirm) |
|
602 |
return false if newPassword == "" || newPassword.length < 4 |
|
603 |
return false if newPassword != newPasswordConfirm |
|
604 |
if (self.isExternal?) |
|
605 |
return self.auth_source.change_password(self.login,password,newPassword) |
|
606 |
end |
|
607 |
return false |
|
608 |
end |
|
609 |
|
|
597 | 610 |
protected |
598 | 611 | |
599 | 612 |
def validate_password_length |
app/controllers/my_controller.rb (working copy) | ||
---|---|---|
93 | 93 |
end |
94 | 94 |
if request.post? |
95 | 95 |
if @user.check_password?(params[:password]) |
96 |
@user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] |
|
97 |
if @user.save |
|
98 |
flash[:notice] = l(:notice_account_password_updated) |
|
99 |
redirect_to :action => 'account' |
|
96 |
if @user.isExternal? |
|
97 |
if @user.changeExternalPassword(params[:password],params[:new_password], params[:new_password_confirmation]) |
|
98 |
flash[:notice] = l(:notice_account_password_updated) |
|
99 |
redirect_to :action => 'account' |
|
100 |
else |
|
101 |
flash[:error] = l(:notice_external_password_error) |
|
102 |
end |
|
103 |
else |
|
104 |
@user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] |
|
105 |
if @user.save |
|
106 |
flash[:notice] = l(:notice_account_password_updated) |
|
107 |
redirect_to :action => 'account' |
|
108 |
end |
|
100 | 109 |
end |
101 | 110 |
else |
102 | 111 |
flash[:error] = l(:notice_account_wrong_password) |
app/views/auth_sources/_form_auth_source_ldap.html.erb (working copy) | ||
---|---|---|
28 | 28 | |
29 | 29 |
<p><label for="auth_source_onthefly_register"><%=l(:field_onthefly)%></label> |
30 | 30 |
<%= check_box 'auth_source', 'onthefly_register' %></p> |
31 | ||
32 |
<p><label for="auth_source_enabled_passwd"><%=l(:field_enabled_passwd)%></label> |
|
33 |
<%= check_box 'auth_source', 'enabled_passwd' %></p> |
|
31 | 34 |
</div> |
32 | 35 | |
33 | 36 |
<fieldset class="box"><legend><%=l(:label_attribute_plural)%></legend> |
... | ... | |
42 | 45 | |
43 | 46 |
<p><label for="auth_source_attr_mail"><%=l(:field_mail)%></label> |
44 | 47 |
<%= text_field 'auth_source', 'attr_mail', :size => 20 %></p> |
48 | ||
49 |
<p><label for="auth_source_password_encryption"><%=l(:field_password_encryption)%></label> |
|
50 |
<%= select 'auth_source', 'password_encryption', AuthSourcesHelper::Encryption.encryptiontypes %> |
|
51 |
</p> |
|
45 | 52 |
</fieldset> |
46 | 53 |
<!--[eoform:auth_source]--> |
47 | 54 |
config/locales/en.yml (working copy) | ||
---|---|---|
140 | 140 |
general_pdf_encoding: UTF-8 |
141 | 141 |
general_first_day_of_week: '7' |
142 | 142 | |
143 |
notice_external_password_error: Error changing external password. |
|
143 | 144 |
notice_account_updated: Account was successfully updated. |
144 | 145 |
notice_account_invalid_creditentials: Invalid user or password |
145 | 146 |
notice_account_password_updated: Password was successfully updated. |
... | ... | |
275 | 276 |
field_attr_lastname: Lastname attribute |
276 | 277 |
field_attr_mail: Email attribute |
277 | 278 |
field_onthefly: On-the-fly user creation |
279 |
field_password_encryption: Encryption |
|
280 |
field_enabled_passwd: Enabled password changing |
|
278 | 281 |
field_start_date: Start date |
279 | 282 |
field_done_ratio: "% Done" |
280 | 283 |
field_auth_source: Authentication mode |