]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix EUDC LDAP duplicate mail handling
authorThomas Fitzsimmons <fitzsim@fitzsim.org>
Fri, 6 Mar 2015 02:53:37 +0000 (21:53 -0500)
committerThomas Fitzsimmons <fitzsim@fitzsim.org>
Fri, 6 Mar 2015 02:54:27 +0000 (21:54 -0500)
Fixes: debbugs:17720
* net/eudcb-ldap.el (eudc-ldap-cleanup-record-simple): Mark as
obsolete.
(eudc-ldap-cleanup-record-filtering-addresses): Add docstring.
Don't clean up postal addresses if ldap-ignore-attribute-codings
is set.  Combine mail addresses into one field. (Bug#17720)
(eudc-ldap-simple-query-internal): Call
eudc-ldap-cleanup-record-filtering-addresses instead of
eudc-ldap-cleanup-record-simple.
(eudc-ldap-get-field-list): Likewise.

lisp/ChangeLog
lisp/net/eudcb-ldap.el

index 0f905e6571113c1fa5532b7418d2e9c8af62696e..edea71cda52dfe591685aeac2853f5184df8a030 100644 (file)
@@ -1,3 +1,15 @@
+2015-03-06  Thomas Fitzsimmons  <fitzsim@fitzsim.org>
+
+       * net/eudcb-ldap.el (eudc-ldap-cleanup-record-simple): Mark as
+       obsolete.
+       (eudc-ldap-cleanup-record-filtering-addresses): Add docstring.
+       Don't clean up postal addresses if ldap-ignore-attribute-codings
+       is set.  Combine mail addresses into one field. (Bug#17720)
+       (eudc-ldap-simple-query-internal): Call
+       eudc-ldap-cleanup-record-filtering-addresses instead of
+       eudc-ldap-cleanup-record-simple.
+       (eudc-ldap-get-field-list): Likewise.
+
 2015-03-05  Ivan Shmakov  <ivan@siamics.net>
 
        * net/eww.el (eww-html-p): New function (bug#20009).
index 1d426a7b7b04fb5db2941fdaa4f7e18ec62f040f..d22dff615eee0bda52fc8f20dfcedb7df42f4881 100644 (file)
 
 (defun eudc-ldap-cleanup-record-simple (record)
   "Do some cleanup in a RECORD to make it suitable for EUDC."
+  (declare (obsolete eudc-ldap-cleanup-record-filtering-addresses "25.1"))
   (mapcar
    (function
     (lambda (field)
-      ;; Some servers return case-sensitive names (e.g. givenName
-      ;; instead of givenname); downcase the field's name so that it
-      ;; can be matched against
-      ;; eudc-ldap-attributes-translation-alist.
       (cons (intern (downcase (car field)))
            (if (cdr (cdr field))
                (cdr field)
 (defun eudc-filter-$ (string)
   (mapconcat 'identity (split-string string "\\$") "\n"))
 
-;; Cleanup a LDAP record to make it suitable for EUDC:
-;;   Make the record a cons-cell instead of a list if it is single-valued
-;;   Filter the $ character in addresses into \n if not done by the LDAP lib
 (defun eudc-ldap-cleanup-record-filtering-addresses (record)
-  (mapcar
-   (function
-    (lambda (field)
+  "Clean up RECORD to make it suitable for EUDC.
+Make the record a cons-cell instead of a list if it is
+single-valued.  Change the `$' character in postal addresses to a
+newline.  Combine separate mail fields into one mail field with
+multiple addresses."
+  (let ((clean-up-addresses (or (not (boundp 'ldap-ignore-attribute-codings))
+                               (not ldap-ignore-attribute-codings)))
+       result mail-addresses)
+    (dolist (field record)
+      ;; Some servers return case-sensitive names (e.g. givenName
+      ;; instead of givenname); downcase the field's name so that it
+      ;; can be matched against
+      ;; eudc-ldap-attributes-translation-alist.
       (let ((name (intern (downcase (car field))))
            (value (cdr field)))
-       (if (memq name '(postaladdress registeredaddress))
-           (setq value (mapcar 'eudc-filter-$ value)))
-       (cons name
-             (if (cdr value)
-                 value
-               (car value))))))
-   record))
+       (when (and clean-up-addresses
+                  (memq name '(postaladdress registeredaddress)))
+         (setq value (mapcar 'eudc-filter-$ value)))
+       (if (eq name 'mail)
+           (setq mail-addresses (append mail-addresses value))
+         (push (cons name (if (cdr value)
+                              value
+                            (car value)))
+               result))))
+    (push (cons 'mail (if (cdr mail-addresses)
+                         mail-addresses
+                       (car mail-addresses)))
+          result)
+    (nreverse result)))
 
 (defun eudc-ldap-simple-query-internal (query &optional return-attrs)
   "Query the LDAP server with QUERY.
@@ -118,11 +129,7 @@ RETURN-ATTRS is a list of attributes to return, defaulting to
                             (if (listp return-attrs)
                                 (mapcar 'symbol-name return-attrs))))
        final-result)
-    (if (or (not (boundp 'ldap-ignore-attribute-codings))
-           ldap-ignore-attribute-codings)
-       (setq result
-             (mapcar 'eudc-ldap-cleanup-record-filtering-addresses result))
-      (setq result (mapcar 'eudc-ldap-cleanup-record-simple result)))
+    (setq result (mapcar 'eudc-ldap-cleanup-record-filtering-addresses result))
 
     (if (and eudc-strict-return-matches
             return-attrs
@@ -148,7 +155,7 @@ attribute names are returned. Default to `person'"
   (let ((ldap-host-parameters-alist
         (list (cons eudc-server
                     '(scope subtree sizelimit 1)))))
-    (mapcar 'eudc-ldap-cleanup-record-simple
+    (mapcar 'eudc-ldap-cleanup-record-filtering-addresses
            (ldap-search
             (eudc-ldap-format-query-as-rfc1558
              (list (cons "objectclass"