diff app/models/auth_source_ldap.rb @ 1295:622f24f53b42 redmine-2.3

Update to Redmine SVN revision 11972 on 2.3-stable branch
author Chris Cannam
date Fri, 14 Jun 2013 09:02:21 +0100
parents 433d4f72a19b
children e248c7af89ec
line wrap: on
line diff
--- a/app/models/auth_source_ldap.rb	Fri Jun 14 09:01:12 2013 +0100
+++ b/app/models/auth_source_ldap.rb	Fri Jun 14 09:02:21 2013 +0100
@@ -1,5 +1,5 @@
 # Redmine - project management software
-# Copyright (C) 2006-2012  Jean-Philippe Lang
+# Copyright (C) 2006-2013  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -15,7 +15,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-require 'iconv'
 require 'net/ldap'
 require 'net/ldap/dn'
 require 'timeout'
@@ -64,6 +63,32 @@
     "LDAP"
   end
 
+  # Returns true if this source can be searched for users
+  def searchable?
+    !account.to_s.include?("$login") && %w(login firstname lastname mail).all? {|a| send("attr_#{a}?")}
+  end
+
+  # Searches the source for users and returns an array of results
+  def search(q)
+    q = q.to_s.strip
+    return [] unless searchable? && q.present?
+
+    results = []
+    search_filter = base_filter & Net::LDAP::Filter.begins(self.attr_login, q)
+    ldap_con = initialize_ldap_con(self.account, self.account_password)
+    ldap_con.search(:base => self.base_dn,
+                    :filter => search_filter,
+                    :attributes => ['dn', self.attr_login, self.attr_firstname, self.attr_lastname, self.attr_mail],
+                    :size => 10) do |entry|
+      attrs = get_user_attributes_from_ldap_entry(entry)
+      attrs[:login] = AuthSourceLdap.get_attr(entry, self.attr_login)
+      results << attrs
+    end
+    results
+  rescue Net::LDAP::LdapError => e
+    raise AuthSourceException.new(e.message)
+  end
+
   private
 
   def with_timeout(&block)
@@ -84,6 +109,14 @@
     nil
   end
 
+  def base_filter
+    filter = Net::LDAP::Filter.eq("objectClass", "*")
+    if f = ldap_filter
+      filter = filter & f
+    end
+    filter
+  end
+
   def validate_filter
     if filter.present? && ldap_filter.nil?
       errors.add(:filter, :invalid)
@@ -140,14 +173,8 @@
     else
       ldap_con = initialize_ldap_con(self.account, self.account_password)
     end
-    login_filter = Net::LDAP::Filter.eq( self.attr_login, login )
-    object_filter = Net::LDAP::Filter.eq( "objectClass", "*" )
     attrs = {}
-
-    search_filter = object_filter & login_filter
-    if f = ldap_filter
-      search_filter = search_filter & f
-    end
+    search_filter = base_filter & Net::LDAP::Filter.eq(self.attr_login, login)
 
     ldap_con.search( :base => self.base_dn,
                      :filter => search_filter,