diff --git a/cdist/conf/type/__ssh_authorized_keys/explorer/file b/cdist/conf/type/__ssh_authorized_keys/explorer/file index 09d55f6f..017bcb38 100755 --- a/cdist/conf/type/__ssh_authorized_keys/explorer/file +++ b/cdist/conf/type/__ssh_authorized_keys/explorer/file @@ -20,30 +20,42 @@ # if [ -f "$__object/parameter/file" ]; then - cat "$__object/parameter/file" + cat "$__object/parameter/file" else - if [ -s "$__object/parameter/owner" ] - then - owner=$(cat "$__object/parameter/owner") - else - owner="$__object_id" - fi + if [ -s "$__object/parameter/owner" ] + then + owner=$(cat "$__object/parameter/owner") + else + owner="$__object_id" + fi - if command -v getent >/dev/null - then - owner_line=$(getent passwd "$owner") - else - case $owner - in - [0-9][0-9]*) - owner_line=$(awk -F: "\$3 == \"${owner}\" { print }" /etc/passwd) - ;; - *) - owner_line=$(awk -F: "\$1 == \"${owner}\" { print }" /etc/passwd) - ;; - esac - fi + if command -v getent >/dev/null + then + owner_line=$(getent passwd "$owner") + elif [ -f /etc/passwd ] + then + case $owner + in + [0-9][0-9]*) + owner_line=$(awk -F: "\$3 == \"${owner}\" { print }" /etc/passwd) + ;; + *) + owner_line=$(awk -F: "\$1 == \"${owner}\" { print }" /etc/passwd) + ;; + esac + fi - home=$(echo "$owner_line" | cut -d':' -f6) - echo "$home/.ssh/authorized_keys" + if [ "$owner_line" ] + then + home=$(echo "$owner_line" | cut -d':' -f6) + fi + + if [ ! -d "$home" ] + then + # Don't know how to determine user's home directory, fall back to ~ + home="~$owner" + command -v realpath >/dev/null && home=$(realpath "$home") + fi + + [ -d "$home" ] && echo "$home/.ssh/authorized_keys" fi diff --git a/cdist/conf/type/__ssh_authorized_keys/manifest b/cdist/conf/type/__ssh_authorized_keys/manifest index b507c7ff..b9f0582e 100755 --- a/cdist/conf/type/__ssh_authorized_keys/manifest +++ b/cdist/conf/type/__ssh_authorized_keys/manifest @@ -23,6 +23,12 @@ owner="$(cat "$__object/parameter/owner" 2>/dev/null || echo "$__object_id")" state="$(cat "$__object/parameter/state" 2>/dev/null)" file="$(cat "$__object/explorer/file")" +if [ ! -f "$__object/parameter/nofile" ] && [ -z "$file" ] +then + echo "Cannot determine path of authorized_keys file" >&2 + exit 1 +fi + if [ ! -f "$__object/parameter/noparent" ] || [ ! -f "$__object/parameter/nofile" ]; then group="$(cut -d':' -f 1 "$__object/explorer/group")" if [ -z "$group" ]; then