Patch #4643 » member-onthefly-somewhat-more-elaborate-SMILE.patch
| app/models/auth_source_ldap.rb (Arbeitskopie) | ||
|---|---|---|
| 60 | 60 |
rescue Net::LDAP::LdapError => text |
| 61 | 61 |
raise "LdapError: " + text |
| 62 | 62 |
end |
| 63 |
|
|
| 64 |
def import(login) |
|
| 65 |
logger.debug("Trying to import #{login}")
|
|
| 66 |
return nil if login.blank? |
|
| 67 |
logger.debug("Continuing to import #{login}")
|
|
| 68 |
attrs = [] |
|
| 69 |
# get user's DN |
|
| 70 |
ldap_con = initialize_ldap_con(self.account, self.account_password) |
|
| 71 |
logger.debug("Opening ldap_con to #{ldap_con.to_s}")
|
|
| 72 |
login_filter = Net::LDAP::Filter.eq( self.attr_login, login ) |
|
| 73 |
object_filter = Net::LDAP::Filter.eq( "objectClass", "*" ) |
|
| 74 |
dn = String.new |
|
| 75 |
ldap_con.search( :base => self.base_dn, |
|
| 76 |
:filter => object_filter & login_filter, |
|
| 77 |
# only ask for the DN if on-the-fly registration is disabled |
|
| 78 |
:attributes=> (onthefly_register? ? ['dn', self.attr_firstname, self.attr_lastname, self.attr_mail] : ['dn'])) do |entry| |
|
| 79 |
dn = entry.dn |
|
| 80 |
attrs = [:firstname => AuthSourceLdap.get_attr(entry, self.attr_firstname), |
|
| 81 |
:lastname => AuthSourceLdap.get_attr(entry, self.attr_lastname), |
|
| 82 |
:mail => AuthSourceLdap.get_attr(entry, self.attr_mail), |
|
| 83 |
:auth_source_id => self.id ] |
|
| 84 |
logger.info("LDAP found DN #{dn} for login #{login} with attrs #{attrs.inspect}")
|
|
| 85 |
end |
|
| 86 |
return nil if dn.empty? |
|
| 87 |
logger.debug "DN found for #{login}: #{dn}" if logger && logger.debug?
|
|
| 88 |
# authenticate user |
|
| 89 |
# return user's attributes |
|
| 90 |
attrs |
|
| 91 |
rescue Net::LDAP::LdapError => text |
|
| 92 |
raise "LdapError: " + text |
|
| 93 |
end |
|
| 63 | 94 | |
| 64 | 95 |
# test the connection to the LDAP |
| 65 | 96 |
def test_connection |
| app/models/auth_source.rb (Arbeitskopie) | ||
|---|---|---|
| 46 | 46 |
end |
| 47 | 47 |
return nil |
| 48 | 48 |
end |
| 49 | ||
| 50 |
# Try to import a user not yet registered against available sources |
|
| 51 |
def self.get_data(login) |
|
| 52 |
AuthSource.find(:all, :conditions => ["onthefly_register=?", true]).each do |source| |
|
| 53 |
begin |
|
| 54 |
logger.debug "Importing '#{login}' from '#{source.name}'" if logger && logger.debug?
|
|
| 55 |
logger.debug "Using class #{source.class.to_s}" if logger && logger.debug?
|
|
| 56 |
attrs = source.import(login) |
|
| 57 |
rescue => e |
|
| 58 |
logger.error "Error during import: #{e.message}"
|
|
| 59 |
attrs = nil |
|
| 60 |
end |
|
| 61 |
return attrs if attrs |
|
| 62 |
end |
|
| 63 |
return nil |
|
| 64 |
end |
|
| 65 | ||
| 66 |
def self.import(login) |
|
| 67 |
auth = get_data(login) |
|
| 68 |
logger.debug("auth is #{auth.class.to_s}")
|
|
| 69 |
if auth && auth.size == 1 |
|
| 70 |
a = auth[0] |
|
| 71 |
a.each { |key, value| logger.debug("#{key} => #{value}") }
|
|
| 72 |
user = User.new(a) |
|
| 73 |
user.login = login |
|
| 74 |
user.language = Setting.default_language |
|
| 75 |
user.admin = false # Just to be sure |
|
| 76 |
if user.save |
|
| 77 |
logger.debug("successful created")
|
|
| 78 |
return user |
|
| 79 |
else |
|
| 80 |
logger.debug("failed to create")
|
|
| 81 |
return nil |
|
| 82 |
end |
|
| 83 |
else |
|
| 84 |
logger.debug("User not found among those sources available for on-the-fly creation")
|
|
| 85 |
return nil |
|
| 86 |
end |
|
| 87 |
end |
|
| 88 | ||
| 49 | 89 |
end |
| app/controllers/members_controller.rb (Arbeitskopie) | ||
|---|---|---|
| 24 | 24 |
members = [] |
| 25 | 25 |
if params[:member] && request.post? |
| 26 | 26 |
attrs = params[:member].dup |
| 27 |
# When no user is selected but the name does match a user |
|
| 28 |
# in LDAP, which has not yet been imported, then go and import the |
|
| 29 |
# user from LDAP and add it to the project. Multiple names may be |
|
| 30 |
# separated by whitespace. |
|
| 31 |
if (! attrs.has_key?(:user_ids) && ! params[:principal_search].empty?) |
|
| 32 |
attrs[:user_ids] = [] |
|
| 33 |
newUser = nil |
|
| 34 |
params[:principal_search].split.each do |login| |
|
| 35 |
newUser = AuthSource.import(login) |
|
| 36 |
if newUser |
|
| 37 |
logger.info("Imported AuthSource as #{newUser}")
|
|
| 38 |
else |
|
| 39 |
newUser = User.first(:conditions => ["login = ?", login]) |
|
| 40 |
end |
|
| 41 |
attrs[:user_ids] << newUser.id if newUser |
|
| 42 |
logger.debug("Would join entries #{attrs[:user_ids].inspect}")
|
|
| 43 |
end |
|
| 44 |
end |
|
| 27 | 45 |
if (user_ids = attrs.delete(:user_ids)) |
| 28 | 46 |
user_ids.each do |user_id| |
| 29 | 47 |
members << Member.new(attrs.merge(:user_id => user_id)) |
- « Previous
- 1
- 2
- Next »