;;; ldap.el --- client interface to LDAP for Emacs
-;; Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007 Free Software Foundation, Inc.
-;; Author: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
-;; Maintainer: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
+;; Author: Oscar Figueiredo <oscar@cpe.fr>
+;; Maintainer: FSF
;; Created: April 1998
;; Keywords: comm
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; Code:
(require 'custom)
+(eval-when-compile (require 'cl))
(defgroup ldap nil
"Lightweight Directory Access Protocol."
(defcustom ldap-host-parameters-alist nil
"*Alist of host-specific options for LDAP transactions.
The format of each list element is (HOST PROP1 VAL1 PROP2 VAL2 ...).
-HOST is the hostname of an LDAP server(with an optional TCP port number
+HOST is the hostname of an LDAP server (with an optional TCP port number
appended to it using a colon as a separator).
PROPn and VALn are property/value pairs describing parameters for the server.
Valid properties include:
:type '(string :tag "`ldapsearch' Program")
:group 'ldap)
-(defcustom ldap-ldapsearch-args '("-B")
- "*A list of additional arguments to pass to `ldapsearch'.
-It is recommended to use the `-T' switch with Netscape's
-implementation to avoid line wrapping.
-The `-B' switch should be used to enable the retrieval of
-binary values."
+(defcustom ldap-ldapsearch-args '("-LL" "-tt")
+ "*A list of additional arguments to pass to `ldapsearch'."
:type '(repeat :tag "`ldapsearch' Arguments"
(string :tag "Argument"))
:group 'ldap)
(error "No LDAP host specified"))
(let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
result)
- (setq result (ldap-search-internal (append host-plist
- (list 'host host
- 'filter filter
- 'attributes attributes
- 'attrsonly attrsonly
- 'withdn withdn))))
+ (setq result (ldap-search-internal (list* 'host host
+ 'filter filter
+ 'attributes attributes
+ 'attrsonly attrsonly
+ 'withdn withdn
+ host-plist)))
(if ldap-ignore-attribute-codings
result
- (mapcar (function
- (lambda (record)
- (mapcar 'ldap-decode-attribute record)))
+ (mapcar (lambda (record)
+ (mapcar 'ldap-decode-attribute record))
result))))
for each matching entry. If nil, return all available attributes.
`attrsonly', if non-nil, indicates that only attributes are retrieved,
not their associated values.
+ `auth' is one of the symbols `simple', `krbv41' or `krbv42'.
`base' is the base for the search as described in RFC 1779.
`scope' is one of the three symbols `sub', `base' or `one'.
`binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax).
+ `auth' is one of the symbols `simple', `krbv41' or `krbv42'
`passwd' is the password to use for simple authentication.
`deref' is one of the symbols `never', `always', `search' or `find'.
`timelimit' is the timeout limit for the connection in seconds.
ldap-default-base))
(scope (plist-get search-plist 'scope))
(binddn (plist-get search-plist 'binddn))
+ (auth (plist-get search-plist 'auth))
(passwd (plist-get search-plist 'passwd))
(deref (plist-get search-plist 'deref))
(timelimit (plist-get search-plist 'timelimit))
(if (and binddn
(not (equal "" binddn)))
(setq arglist (nconc arglist (list (format "-D%s" binddn)))))
+ (if (and auth
+ (equal 'simple auth))
+ (setq arglist (nconc arglist (list "-x"))))
(if (and passwd
(not (equal "" passwd)))
(setq arglist (nconc arglist (list (format "-w%s" passwd)))))
buf
nil
,@arglist
- "-t" ; Write values to temp files
,@ldap-ldapsearch-args
,@filter))
(insert "\n")
(goto-char (point-min))
+ (while (re-search-forward "[\t\n\f]+ " nil t)
+ (replace-match "" nil nil))
+ (goto-char (point-min))
+
(if (looking-at "usage")
(error "Incorrect ldapsearch invocation")
(message "Parsing results... ")
+ ;; Skip error message when retrieving attribute list
+ (if (looking-at "Size limit exceeded")
+ (forward-line 1))
(while (progn
(skip-chars-forward " \t\n")
(not (eobp)))
(end-of-line)
(point))))
(forward-line 1)
- (while (looking-at "^\\(\\w*\\)[=:\t ]+\\(<[\t ]*file://\\)?\\(.*\\)$")
+ (while (looking-at "^\\(\\w*\\)\\(;\\w*\\)?[=:\t ]+\\(<[\t ]*file://\\)\\(.*\\)$")
(setq name (match-string 1)
- value (match-string 3))
- (save-excursion
- (set-buffer bufval)
- (erase-buffer)
- (set-buffer-multibyte nil)
- (insert-file-contents-literally value)
- (delete-file value)
- (setq value (buffer-string)))
+ value (match-string 4))
+ ;; Need to handle file:///D:/... as generated by OpenLDAP
+ ;; on DOS/Windows as local files.
+ (if (and (memq system-type '(windows-nt ms-dos))
+ (eq (string-match "/\\(.:.*\\)$" value) 0))
+ (setq value (match-string 1 value)))
+ ;; Do not try to open non-existent files
+ (if (equal value "")
+ (setq value " ")
+ (save-excursion
+ (set-buffer bufval)
+ (erase-buffer)
+ (set-buffer-multibyte nil)
+ (insert-file-contents-literally value)
+ (delete-file value)
+ (setq value (buffer-string))))
(setq record (cons (list name value)
record))
(forward-line 1))
(provide 'ldap)
+;;; arch-tag: 47913a76-6155-42e6-ac58-6d28b5d50eb0
;;; ldap.el ends here