comparison lisp/ldap.el @ 400:a86b2b5e0111 r21-2-30

Import from CVS: tag r21-2-30
author cvs
date Mon, 13 Aug 2007 11:14:34 +0200
parents 74fd4e045ea6
children 697ef44129c6
comparison
equal deleted inserted replaced
399:376370fb5946 400:a86b2b5e0111
3 ;; Copyright (C) 1997 Free Software Foundation, Inc. 3 ;; Copyright (C) 1997 Free Software Foundation, Inc.
4 4
5 ;; Author: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch> 5 ;; Author: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
6 ;; Maintainer: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch> 6 ;; Maintainer: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
7 ;; Created: Jan 1998 7 ;; Created: Jan 1998
8 ;; Version: $Revision: 1.7.2.6 $ 8 ;; Version: $Revision: 1.7.2.7 $
9 ;; Keywords: help comm 9 ;; Keywords: help comm
10 10
11 ;; This file is part of XEmacs 11 ;; This file is part of XEmacs
12 12
13 ;; XEmacs is free software; you can redistribute it and/or modify it 13 ;; XEmacs is free software; you can redistribute it and/or modify it
32 ;;; Installation: 32 ;;; Installation:
33 ;; LDAP support must have been built into XEmacs. 33 ;; LDAP support must have been built into XEmacs.
34 34
35 35
36 ;;; Code: 36 ;;; Code:
37
38 (eval-when '(load)
39 (if (not (fboundp 'ldap-open))
40 (error "No LDAP support compiled in this XEmacs")))
37 41
38 (defgroup ldap nil 42 (defgroup ldap nil
39 "Lightweight Directory Access Protocol" 43 "Lightweight Directory Access Protocol"
40 :group 'comm) 44 :group 'comm)
41 45
142 :tag "Size Limit" 146 :tag "Size Limit"
143 :inline t 147 :inline t
144 (const :tag "Size Limit" sizelimit) 148 (const :tag "Size Limit" sizelimit)
145 (integer :tag "(number of records)"))))) 149 (integer :tag "(number of records)")))))
146 :group 'ldap) 150 :group 'ldap)
151
152 (defcustom ldap-verbose nil
153 "*If non-nil, LDAP operations echo progress messages."
154 :type 'boolean
155 :group 'ldap)
147 156
148 (defcustom ldap-ignore-attribute-codings nil 157 (defcustom ldap-ignore-attribute-codings nil
149 "*If non-nil, do not perform any encoding/decoding on LDAP attribute values." 158 "*If non-nil, do not perform any encoding/decoding on LDAP attribute values."
150 :type 'boolean 159 :type 'boolean
151 :group 'ldap) 160 :group 'ldap)
434 (setq decoder ldap-default-attribute-decoder)) 443 (setq decoder ldap-default-attribute-decoder))
435 (if decoder 444 (if decoder
436 (cons name (mapcar decoder values)) 445 (cons name (mapcar decoder values))
437 attr))) 446 attr)))
438 447
439 448 (defun ldap-search (arg1 &rest args)
440 (defun ldap-search (filter &optional host attributes attrsonly withdn) 449 "Perform an LDAP search."
450 (apply (if (ldapp arg1)
451 'ldap-search-basic
452 'ldap-search-entries) arg1 args))
453
454 (make-obsolete 'ldap-search
455 "Use `ldap-search-entries' instead or
456 `ldap-search-basic' for the low-level search API.")
457
458 (defun ldap-search-entries (filter &optional host attributes attrsonly withdn)
441 "Perform an LDAP search. 459 "Perform an LDAP search.
442 FILTER is the search filter in RFC1558 syntax, i.e., something that 460 FILTER is the search filter in RFC1558 syntax, i.e., something that
443 looks like \"(cn=John Smith)\". 461 looks like \"(cn=John Smith)\".
444 HOST is the LDAP host on which to perform the search. 462 HOST is the LDAP host on which to perform the search.
445 ATTRIBUTES is a list of attributes to retrieve; nil means retrieve all. 463 ATTRIBUTES is a list of attributes to retrieve; nil means retrieve all.
457 (setq host ldap-default-host) 475 (setq host ldap-default-host)
458 (error "No LDAP host specified")) 476 (error "No LDAP host specified"))
459 (let ((host-plist (cdr (assoc host ldap-host-parameters-alist))) 477 (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
460 ldap 478 ldap
461 result) 479 result)
462 (message "Opening LDAP connection to %s..." host) 480 (if ldap-verbose
481 (message "Opening LDAP connection to %s..." host))
463 (setq ldap (ldap-open host host-plist)) 482 (setq ldap (ldap-open host host-plist))
464 (message "Searching with LDAP on %s..." host) 483 (if ldap-verbose
465 (setq result (ldap-search-internal ldap filter 484 (message "Searching with LDAP on %s..." host))
466 (plist-get host-plist 'base) 485 (setq result (ldap-search ldap filter
467 (plist-get host-plist 'scope) 486 (plist-get host-plist 'base)
468 attributes attrsonly withdn)) 487 (plist-get host-plist 'scope)
488 attributes attrsonly withdn
489 ldap-verbose))
469 (ldap-close ldap) 490 (ldap-close ldap)
470 (if ldap-ignore-attribute-codings 491 (if ldap-ignore-attribute-codings
471 result 492 result
472 (mapcar (function 493 (mapcar (function
473 (lambda (record) 494 (lambda (record)
474 (mapcar 'ldap-decode-attribute record))) 495 (mapcar 'ldap-decode-attribute record)))
475 result)))) 496 result))))
476 497
498 (defun ldap-add-entries (entries &optional host binddn passwd)
499 "Add entries to an LDAP directory.
500 ENTRIES is a list of entry specifications of
501 the form (DN (ATTR . VALUE) (ATTR . VALUE) ...) where
502 DN is the distinguished name of an entry to add, the following
503 are cons cells containing attribute/value string pairs.
504 HOST is the LDAP host, defaulting to `ldap-default-host'
505 BINDDN is the DN to bind as to the server
506 PASSWD is the corresponding password"
507 (or host
508 (setq host ldap-default-host)
509 (error "No LDAP host specified"))
510 (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
511 ldap
512 (i 1))
513 (if (or binddn passwd)
514 (setq host-plist (copy-seq host-plist)))
515 (if binddn
516 (setq host-plist (plist-put host-plist 'binddn binddn)))
517 (if passwd
518 (setq host-plist (plist-put host-plist 'passwd passwd)))
519 (if ldap-verbose
520 (message "Opening LDAP connection to %s..." host))
521 (setq ldap (ldap-open host host-plist))
522 (if ldap-verbose
523 (message "Adding LDAP entries..."))
524 (mapcar (function
525 (lambda (thisentry)
526 (ldap-add ldap (car thisentry) (cdr thisentry))
527 (if ldap-verbose
528 (message "%d added" i))
529 (setq i (1+ i))))
530 entries)
531 (ldap-close ldap)))
532
533
534 (defun ldap-modify-entries (entry-mods &optional host binddn passwd)
535 "Modify entries of an LDAP directory.
536 ENTRY_MODS is a list of entry modifications of the form
537 (DN MOD-SPEC1 MOD-SPEC2 ...) where DN is the distinguished name of
538 the entry to modify, the following are modification specifications.
539 A modification specification is itself a list of the form
540 (MOD-OP ATTR VALUE1 VALUE2 ...) MOD-OP and ATTR are mandatory,
541 VALUEs are optional depending on MOD-OP.
542 MOD-OP is the type of modification, one of the symbols `add', `delete'
543 or `replace'. ATTR is the LDAP attribute type to modify.
544 HOST is the LDAP host, defaulting to `ldap-default-host'
545 BINDDN is the DN to bind as to the server
546 PASSWD is the corresponding password"
547 (or host
548 (setq host ldap-default-host)
549 (error "No LDAP host specified"))
550 (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
551 ldap
552 (i 1))
553 (if (or binddn passwd)
554 (setq host-plist (copy-seq host-plist)))
555 (if binddn
556 (setq host-plist (plist-put host-plist 'binddn binddn)))
557 (if passwd
558 (setq host-plist (plist-put host-plist 'passwd passwd)))
559 (if ldap-verbose
560 (message "Opening LDAP connection to %s..." host))
561 (setq ldap (ldap-open host host-plist))
562 (if ldap-verbose
563 (message "Modifying LDAP entries..."))
564 (mapcar (function
565 (lambda (thisentry)
566 (ldap-modify ldap (car thisentry) (cdr thisentry))
567 (if ldap-verbose
568 (message "%d modified" i))
569 (setq i (1+ i))))
570 entry-mods)
571 (ldap-close ldap)))
572
573
574 (defun ldap-delete-entries (dn &optional host binddn passwd)
575 "Delete an entry from an LDAP directory.
576 DN is the distinguished name of an entry to delete or
577 a list of those.
578 HOST is the LDAP host, defaulting to `ldap-default-host'
579 BINDDN is the DN to bind as to the server
580 PASSWD is the corresponding password."
581 (or host
582 (setq host ldap-default-host)
583 (error "No LDAP host specified"))
584 (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
585 ldap)
586 (if (or binddn passwd)
587 (setq host-plist (copy-seq host-plist)))
588 (if binddn
589 (setq host-plist (plist-put host-plist 'binddn binddn)))
590 (if passwd
591 (setq host-plist (plist-put host-plist 'passwd passwd)))
592 (if ldap-verbose
593 (message "Opening LDAP connection to %s..." host))
594 (setq ldap (ldap-open host host-plist))
595 (if (consp dn)
596 (let ((i 1))
597 (if ldap-verbose
598 (message "Deleting LDAP entries..."))
599 (mapcar (function
600 (lambda (thisdn)
601 (ldap-delete ldap thisdn)
602 (if ldap-verbose
603 (message "%d deleted" i))
604 (setq i (1+ i))))
605 dn))
606 (if ldap-verbose
607 (message "Deleting LDAP entry..."))
608 (ldap-delete ldap dn))
609 (ldap-close ldap)))
610
611
477 (provide 'ldap) 612 (provide 'ldap)
478 613
479 ;;; ldap.el ends here 614 ;;; ldap.el ends here