diff --git a/modules/nixos/ldap/ldap-common.sh b/modules/nixos/ldap/ldap-common.sh new file mode 100644 index 00000000..94515ce9 --- /dev/null +++ b/modules/nixos/ldap/ldap-common.sh @@ -0,0 +1,42 @@ +ldap_args_binddn() { + if [[ -n ${LDAPBINDDN-} ]]; then + LDAP_ARGS+=( + -x + -y "$LDAPBINDPW_FILE" + ) + if [[ -n ${LDAPBINDPW-} ]]; then + LDAP_ARGS+=( + -w "$LDAPBINDPW" + ) + else + LDAP_ARGS+=( + -y "$LDAPBINDPW_FILE" + ) + fi + fi +} + +ldap_args_op() { + ldap_args_binddn + if [[ -z ${LDAPBINDDN-} ]]; then + LDAP_ARGS+=(-Q) + fi +} + +ldapwhoami() { + local LDAP_ARGS=("$@") + ldap_args_binddn + command ldapwhoami "${LDAP_ARGS[@]}" +} + +ldapsearch() { + local LDAP_ARGS=("$@") + ldap_args_op + command ldapsearch -LLL -o ldif_wrap=no "${LDAP_ARGS[@]}" +} + +ldapmodify() { + local LDAP_ARGS=("$@") + ldap_args_op + command ldapmodify "${LDAP_ARGS[@]}" +} diff --git a/modules/nixos/ldap/ldap-sync.sh b/modules/nixos/ldap/ldap-sync.sh new file mode 100644 index 00000000..99c4e111 --- /dev/null +++ b/modules/nixos/ldap/ldap-sync.sh @@ -0,0 +1,69 @@ +ldap_parse() { + local LDAP_ATTR=$1 LDAP_LIMIT LDAP_LINE LDAP_COUNT=0 + shift 1 + local LDAP_LIMIT=${1-1} + + while read -r LDAP_LINE; do + if [[ $LDAP_LIMIT -eq 0 ]]; then + break + fi + if [[ $LDAP_LINE = "$LDAP_ATTR:: "* ]]; then + printf '%s\n' "$LDAP_LINE" | cut -d ' ' -f 2- | base64 -d + elif [[ $LDAP_LINE = "$LDAP_ATTR: "* ]]; then + printf '%s\n' "$LDAP_LINE" | cut -d ' ' -f 2- + else + continue + fi + LDAP_COUNT=$((LDAP_COUNT+1)) + LDAP_LIMIT=$((LDAP_LIMIT-1)) + done + if [[ $LDAP_COUNT -eq 0 ]]; then + echo "$LDAP_ATTR not found" >&2 + return 1 + fi +} + +smbsync_group() { + local LDAP_GROUP_CN=$1 SMB_GROUP_DATA SMB_GROUP_SID + shift 1 + + echo "updating cn=$LDAP_GROUP_CN,$LDAP_DNSUFFIX_GROUP ..." >&2 + SMB_GROUP_DATA=$(ldapsearch -z1 \ + -b "$LDAP_DNSUFFIX_GROUP$LDAPBASE" \ + "(&(cn=$LDAP_GROUP_CN)(objectClass=posixgroup))" \ + objectClass ipaNTSecurityIdentifier + ) + SMB_GROUP_SID=$(ldap_parse ipaNTSecurityIdentifier <<< "$SMB_GROUP_DATA") + ldapmodify <&2 + SMB_USER_DATA=$(ldapsearch -z1 \ + -b "$LDAP_DNSUFFIX_USER$LDAPBASE" \ + "(&(uid=$LDAP_USER_UID)(objectClass=posixaccount))" \ + objectClass ipaNTSecurityIdentifier ipaNTHash ipaUserAuthType memberOf + ) + SMB_USER_SID=$(ldap_parse ipaNTSecurityIdentifier <<< "$SMB_USER_DATA") + SMB_USER_NTPASS=$(ldap_parse ipaNTHash <<< "$SMB_USER_DATA" | xxd -p) + SMB_USER_NTPASS=${SMB_USER_NTPASS^^} + ldapmodify <&2 - return 1 - fi - } - - smbsync_group() { - local LDAP_GROUP_CN=$1 SMB_GROUP_DATA SMB_GROUP_SID - shift 1 - - echo "updating cn=''${LDAP_GROUP_CN},${ldap.groupDnSuffix} ..." >&2 - SMB_GROUP_DATA=$(ldapsearch -z1 \ - -b "${ldap.groupDnSuffix}${ldap.base}" \ - "(&(cn=$LDAP_GROUP_CN)(${objectClassAttr}=posixgroup))" \ - ${escapeShellArgs groupSearchAttrs} - ) - SMB_GROUP_SID=$(ldap_parse ${sidAttr} <<< "$SMB_GROUP_DATA") - ldapmodify <&2 - SMB_USER_DATA=$(ldapsearch -z1 \ - -b "${ldap.userDnSuffix}${ldap.base}" \ - "(&(uid=$LDAP_USER_UID)(${objectClassAttr}=posixaccount))" \ - ${escapeShellArgs userSearchAttrs} - ) - SMB_USER_SID=$(ldap_parse ${sidAttr} <<< "$SMB_USER_DATA") - SMB_USER_NTPASS=$(ldap_parse ${ntHashAttr} <<< "$SMB_USER_DATA" | xxd -p) - SMB_USER_NTPASS=''${SMB_USER_NTPASS^^} - ldapmodify <