####
# Copyright 2020 Hewlett Packard Enterprise Development LP.
# Copyright 2021 Intel Corporation
#
# Add a basic class to add a privileged user from an ssh
# standpoint and a public key passed as an input parameter
# from the local.conf file
# Example:
# INHERIT += "phosphor-deploy-ssh-keys"
#
# SSH_KEYS = "vejmarie:/home/openbmc/openbmc/meta-hpe/keys/test.pub"
# or
# SSH_KEYS = "vejmarie:/home/openbmc/openbmc/meta-hpe/keys/test.pub;root:/path/to/id_rsa.pub"
####

inherit useradd_base

IMAGE_PREPROCESS_COMMAND += "deploy_local_user;"

deploy_local_user () {
    if [ "${SSH_KEYS}" == "" ]; then
        bbwarn "Trying to deploy SSH keys but input variable is empty (SSH_KEYS)"
        return
    fi

    ssh_keys="${SSH_KEYS}"
    while [ "${ssh_keys}" != "" ]; do
        current_key=`echo "$ssh_keys" | cut -d ';' -f1`
        ssh_keys=`echo "$ssh_keys" | cut -s -d ';' -f2-`

        username=`echo "$current_key" | awk -F":" '{ print $1}'`
        key_path=`echo "$current_key" | awk -F":" '{ print $2}'`

        if [ ! -d ${IMAGE_ROOTFS}/home/${username} ]; then
            perform_useradd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} -p '' ${username}"
        fi

        if [ ! -d ${IMAGE_ROOTFS}/home/${username}.ssh/ ]; then
            install -d ${IMAGE_ROOTFS}/home/${username}/.ssh/
        fi

        if [ ! -f ${IMAGE_ROOTFS}/home/${username}/.ssh/authorized_keys ]; then
            install -m 0600 ${key_path} ${IMAGE_ROOTFS}/home/${username}/.ssh/authorized_keys
        else
            cat ${key_path} >> ${IMAGE_ROOTFS}/home/${username}/.ssh/authorized_keys
        fi

        uid=`cat ${IMAGE_ROOTFS}/etc/passwd | grep "${username}:" | awk -F ":" '{print $3}'`
        guid=`cat ${IMAGE_ROOTFS}/etc/passwd | grep "${username}:" | awk -F ":" '{print $4}'`

        chown -R ${uid}:${guid} ${IMAGE_ROOTFS}/home/${username}/.ssh
        chmod 600  ${IMAGE_ROOTFS}/home/${username}/.ssh/authorized_keys
        chmod 700 ${IMAGE_ROOTFS}/home/${username}/.ssh

        is_group=`grep "priv-admin" ${IMAGE_ROOTFS}/etc/group || true`

        if [ -z "${is_group}" ]; then
            perform_groupadd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} priv-admin"
        fi

        perform_usermod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} -a -G priv-admin ${username}"
    done
}
