Patch #5690 » redmine_ldap_passwd_patch_issue_5690.patch
| app/controllers/account_controller.rb (working copy) | ||
|---|---|---|
| 83 | 83 |
if request.post? |
| 84 | 84 |
if @user.must_change_passwd? && @user.check_password?(params[:new_password]) |
| 85 | 85 |
flash.now[:error] = l(:notice_new_password_must_be_different) |
| 86 |
elsif @user.isExternal? |
|
| 87 |
if @user.newExternalPassword(params[:new_password], params[:new_password_confirmation]) |
|
| 88 |
@token.destroy |
|
| 89 |
flash[:notice] = l(:notice_account_password_updated) |
|
| 90 |
redirect_to signin_path |
|
| 91 |
return |
|
| 92 |
else |
|
| 93 |
flash[:error] = l(:error_changing_external_password) |
|
| 94 |
end |
|
| 86 | 95 |
else |
| 87 | 96 |
@user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] |
| 88 | 97 |
@user.must_change_passwd = false |
| app/controllers/my_controller.rb (working copy) | ||
|---|---|---|
| 103 | 103 |
flash.now[:error] = l(:notice_account_wrong_password) |
| 104 | 104 |
elsif params[:password] == params[:new_password] |
| 105 | 105 |
flash.now[:error] = l(:notice_new_password_must_be_different) |
| 106 |
elsif @user.isExternal? |
|
| 107 |
if @user.changeExternalPassword(params[:password], params[:new_password], params[:new_password_confirmation]) |
|
| 108 |
session[:tk] = @user.generate_session_token |
|
| 109 |
flash[:notice] = l(:notice_account_password_updated) |
|
| 110 |
redirect_to my_account_path |
|
| 111 |
else |
|
| 112 |
flash[:error] = l(:error_changing_external_password) |
|
| 113 |
end |
|
| 106 | 114 |
else |
| 107 | 115 |
@user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] |
| 108 | 116 |
@user.must_change_passwd = false |
| app/models/auth_source_ldap.rb (working copy) | ||
|---|---|---|
| 20 | 20 |
require 'net/ldap' |
| 21 | 21 |
require 'net/ldap/dn' |
| 22 | 22 |
require 'timeout' |
| 23 |
require 'digest' |
|
| 24 |
require 'base64' |
|
| 23 | 25 | |
| 24 | 26 |
class AuthSourceLdap < AuthSource |
| 25 | 27 |
NETWORK_EXCEPTIONS = [ |
| ... | ... | |
| 84 | 86 |
"LDAP" |
| 85 | 87 |
end |
| 86 | 88 | |
| 89 |
def allow_password_changes? |
|
| 90 |
true |
|
| 91 |
end |
|
| 92 |
|
|
| 93 |
def password_encryption |
|
| 94 |
"MD5" |
|
| 95 |
end |
|
| 96 | ||
| 97 |
def encode_password(clear_password) |
|
| 98 |
salt = User.generate_salt |
|
| 99 | ||
| 100 |
if self.password_encryption == "MD5" |
|
| 101 |
logger.debug "Encode as md5" |
|
| 102 |
return "{MD5}"+Base64.encode64(Digest::MD5.digest(clear_password)).chomp!
|
|
| 103 |
end |
|
| 104 |
if self.password_encryption == "SSHA" |
|
| 105 |
logger.debug "Encode as ssha" |
|
| 106 |
return "{SSHA}"+Base64.encode64(Digest::SHA1.digest(clear_password+salt)+salt).chomp!
|
|
| 107 |
end |
|
| 108 | ||
| 109 |
if self.password_encryption == "CLEAR" |
|
| 110 |
logger.debug "Encode as cleartype" |
|
| 111 |
return clear_password |
|
| 112 |
end |
|
| 113 |
# |
|
| 114 |
end |
|
| 115 | ||
| 116 |
# change password |
|
| 117 |
def change_password(login,password,newPassword) |
|
| 118 |
begin |
|
| 119 |
attrs = get_user_dn(login, password) |
|
| 120 |
if attrs |
|
| 121 |
logger.debug "Binding with user account" |
|
| 122 |
ldap_con = initialize_ldap_con(attrs[:dn], password) |
|
| 123 |
ops = [ |
|
| 124 |
[:delete, :userPassword, password], |
|
| 125 |
[:add, :userPassword, newPassword] |
|
| 126 |
] |
|
| 127 |
#return ldap_con.modify :dn => attrs[:dn], :operations => ops |
|
| 128 |
# This is another password change method, probably more common |
|
| 129 |
newPassword = encode_password(newPassword) |
|
| 130 |
# logger.info("NEW PASSWORD #{newPassword}")
|
|
| 131 |
if newPassword.blank? |
|
| 132 |
logger.debug "Invaild password" |
|
| 133 |
return false |
|
| 134 |
else |
|
| 135 |
logger.debug "Try to change password" |
|
| 136 |
return ldap_con.replace_attribute attrs[:dn], :userPassword, newPassword |
|
| 137 |
end |
|
| 138 |
end |
|
| 139 |
rescue Exception => ex |
|
| 140 |
logger.error "LDAP: #{ex.message}"
|
|
| 141 |
return false |
|
| 142 |
end |
|
| 143 |
return false |
|
| 144 |
end |
|
| 145 | ||
| 146 |
def lost_password(login,newPassword) |
|
| 147 |
begin |
|
| 148 |
attrs = get_user_dn_nopass(login) |
|
| 149 |
if attrs |
|
| 150 |
ldap_con = initialize_ldap_con(self.account, self.account_password) |
|
| 151 |
return ldap_con.replace_attribute attrs[:dn], :userPassword, encode_password(newPassword) |
|
| 152 |
end |
|
| 153 |
rescue |
|
| 154 |
return false |
|
| 155 |
end |
|
| 156 |
return false |
|
| 157 |
end |
|
| 158 | ||
| 159 |
def get_user_dn_nopass(login) |
|
| 160 |
ldap_con = nil |
|
| 161 |
ldap_con = initialize_ldap_con(self.account, self.account_password) |
|
| 162 |
attrs = {}
|
|
| 163 |
search_filter = base_filter & Net::LDAP::Filter.eq(self.attr_login, login) |
|
| 164 |
ldap_con.search(:base => self.base_dn, |
|
| 165 |
:filter => search_filter, |
|
| 166 |
:attributes=> search_attributes) do |entry| |
|
| 167 |
if onthefly_register? |
|
| 168 |
attrs = get_user_attributes_from_ldap_entry(entry) |
|
| 169 |
else |
|
| 170 |
attrs = {:dn => entry.dn}
|
|
| 171 |
end |
|
| 172 |
logger.debug "DN found for #{login}: #{attrs[:dn]}" if logger && logger.debug?
|
|
| 173 |
end |
|
| 174 |
attrs |
|
| 175 |
end |
|
| 176 | ||
| 87 | 177 |
# Returns true if this source can be searched for users |
| 88 | 178 |
def searchable? |
| 89 | 179 |
!account.to_s.include?("$login") && %w(login firstname lastname mail).all? {|a| send(:"attr_#{a}?")}
|
| app/models/user.rb (working copy) | ||
|---|---|---|
| 903 | 903 |
User.where("created_on < ? AND status = ?", Time.now - age, STATUS_REGISTERED).destroy_all
|
| 904 | 904 |
end |
| 905 | 905 | |
| 906 |
def isExternal? |
|
| 907 |
return auth_source_id.present? |
|
| 908 |
end |
|
| 909 | ||
| 910 |
def changeExternalPassword(password,newPassword,newPasswordConfirm) |
|
| 911 |
return false if newPassword == "" || newPassword.length < Setting.password_min_length.to_i |
|
| 912 |
return false if newPassword != newPasswordConfirm |
|
| 913 |
if (self.isExternal?) |
|
| 914 |
return self.auth_source.change_password(self.login,password,newPassword) |
|
| 915 |
end |
|
| 916 |
return false |
|
| 917 |
end |
|
| 918 | ||
| 919 |
def newExternalPassword(newPassword,newPasswordConfirm) |
|
| 920 |
return false if newPassword == "" || newPassword.length < 4 |
|
| 921 |
return false if newPassword != newPasswordConfirm |
|
| 922 |
if (self.isExternal?) |
|
| 923 |
return self.auth_source.lost_password(self.login,newPassword) |
|
| 924 |
end |
|
| 925 |
return false |
|
| 926 |
end |
|
| 927 | ||
| 906 | 928 |
protected |
| 907 | 929 | |
| 908 | 930 |
def validate_password_length |
| config/locales/en.yml (working copy) | ||
|---|---|---|
| 226 | 226 |
error_no_data_in_file: "The file does not contain any data" |
| 227 | 227 |
error_attachment_extension_not_allowed: "Attachment extension %{extension} is not allowed"
|
| 228 | 228 |
error_ldap_bind_credentials: "Invalid LDAP Account/Password" |
| 229 |
error_changing_external_password: "Error changing external password" |
|
| 229 | 230 |
error_no_tracker_allowed_for_new_issue_in_project: "The project doesn't have any trackers for which you can create an issue" |
| 230 | 231 |
error_no_projects_with_tracker_allowed_for_new_issue: "There are no projects with trackers for which you can create an issue" |
| 231 | 232 |
error_move_of_child_not_possible: "Subtask %{child} could not be moved to the new project: %{errors}"
|
- « Previous
- 1
- …
- 5
- 6
- 7
- Next »