Make assoldap compatible with multi-value fields.
[shellsnippets/shellsnippets.git] / mksh / assoldap.ksh
index 5854598..c80866f 100644 (file)
@@ -1,6 +1,11 @@
+# -*- mode: sh -*-
 #-
 # Copyright © 2013
-#      Thorsten Glaser <t.glaser@tarent.de>
+#      mirabilos <t.glaser@tarent.de>
+# Copyright © 2014, 2015
+#      Dominik George <dominik.george@teckids.org>
+# Copyright © 2014, 2015
+#      mirabilos <thorsten.glaser@teckids.org>
 #
 # Provided that these terms and disclaimer and all copyright notices
 # are retained or reproduced in an accompanying document, permission
@@ -52,7 +57,7 @@ function asso_setldap {
                return 255
        fi
        (ldapsearch -xLLL "${ldapopts[@]}"; echo $? >"$T/err") | \
-           tr '\n' $'\a' | sed -e $'s/\a //g' | tr $'\a' '\n' >"$T/out"
+           tr '\n' $'\a' | sed -e $'s/\a //g' >"$T/out"
        i=$(<"$T/err")
        if (( i )); then
                print -u2 'assoldap.ksh: ldapsearch returned error'
@@ -66,7 +71,7 @@ function asso_setldap {
        fi
 
        # parse LDIF (without linewraps)
-       while IFS= read -r line; do
+       while IFS= read -d $'\a' -r line; do
                if [[ -z $line ]]; then
                        dn=
                        continue
@@ -83,7 +88,8 @@ function asso_setldap {
                        rm -rf "$T"
                        return 255
                fi
-               [[ $x = *:: ]] && value=$(Lb64decode "$value")
+               [[ $x = *:: && $x != jpegPhoto:: ]] && \
+                   value=$(Lb64decode "$value")
                x=${x%%+(:)}
                if [[ -z $dn ]]; then
                        if [[ $x = dn ]]; then
@@ -98,7 +104,10 @@ function asso_setldap {
                        rm -rf "$T"
                        return 255
                fi
-               asso_sets "$value" "${arrpath[@]}" "$dn" "$x"
+
+               c=$(asso_getv "${arrpath[@]}" "$dn" "$x" count)
+               asso_sets "$value" "${arrpath[@]}" "$dn" "$x" $((c))
+               asso_seti $((++c)) "${arrpath[@]}" "$dn" "$x" count
        done <"$T/out"
        rm -rf "$T"
        if [[ -n $dn ]]; then