# shellcheck shell=bash
# run-shellcheck
test_audit() {
    describe Running on blank host
    register_test retvalshouldbe 1
    register_test contain "openssh-server is installed"
    # shellcheck disable=2154
    run blank "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    describe Correcting situation
    # `apply` performs a service reload after each change in the config file
    # the service needs to be started for the reload to succeed
    service ssh start
    # if the audit script provides "apply" option, enable and run it
    sed -i 's/audit/enabled/' "${CIS_CONF_DIR}/conf.d/${script}.cfg"
    "${CIS_CHECKS_DIR}/${script}.sh" || true

    describe Checking resolved state
    register_test retvalshouldbe 0
    register_test contain "^AllowUsers[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run resolved "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    describe Check and report mismatch for allowed user
    useradd -s /bin/bash johnallow
    sed -i "s/ALLOWED_USERS=''/ALLOWED_USERS='johnallow'/" "${CIS_CONF_DIR}/conf.d/${script}.cfg"
    register_test retvalshouldbe 1
    register_test contain "^AllowUsers[[:space:]]*johnallow is not present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run allowed_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    describe Correctly apply allowed user
    # the previous test checked that ALLOWED_USERS is set but not correctly applied in sshd_config so we apply it now
    "${CIS_CHECKS_DIR}/${script}.sh" || true
    # and check again that the fix was correctly applied
    register_test retvalshouldbe 0
    register_test contain "^AllowUsers[[:space:]]*johnallow is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run fix_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --apply-all

    describe Check and report mismatch for multiple allowed users
    useradd -s /bin/bash janeallow
    sed -i "s/johnallow/johnallow janeallow/" "${CIS_CONF_DIR}/conf.d/${script}.cfg"
    register_test retvalshouldbe 1
    register_test contain "^AllowUsers[[:space:]]*johnallow janeallow is not present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run multi_allowed_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    describe Correctly apply multiple allowed users
    # the previous test checked that ALLOWED_USERS is set but not correctly applied in sshd_config so we apply it now
    "${CIS_CHECKS_DIR}/${script}.sh" || true
    # and check again that the fix was correctly applied
    tail -n 5 /etc/ssh/sshd_config
    register_test retvalshouldbe 0
    register_test contain "^AllowUsers[[:space:]]*johnallow janeallow is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run fix_multi_allowed_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    # reset allowed users to default before continuing
    sed -i "s/ALLOWED_USERS='johnallow janeallow'/ALLOWED_USERS=''/" "${CIS_CONF_DIR}/conf.d/${script}.cfg"

    describe Check and report mismatch for denied user
    useradd -s /bin/bash peterdeny
    sed -i "s/DENIED_USERS=''/DENIED_USERS='peterdeny'/" "${CIS_CONF_DIR}/conf.d/${script}.cfg"
    register_test retvalshouldbe 1
    register_test contain "^AllowUsers[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*peterdeny is not present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run denied_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    describe Correctly apply denied user
    # the previous test checked that DENIED_USERS is set but not correctly applied in sshd_config so we apply it now
    "${CIS_CHECKS_DIR}/${script}.sh" || true
    # and check again that the fix was correctly applied
    register_test retvalshouldbe 0
    register_test contain "^AllowUsers[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*peterdeny is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run fix_denied_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --apply-all

    describe Check and report mismatch for multiple denied users
    useradd -s /bin/bash marrydeny
    sed -i "s/peterdeny/peterdeny marrydeny/" "${CIS_CONF_DIR}/conf.d/${script}.cfg"
    register_test retvalshouldbe 1
    register_test contain "^AllowUsers[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*peterdeny marrydeny is not present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run multi_denied_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    describe Correctly apply multiple denied users
    # the previous test checked that DENIED_USERS is set but not correctly applied in sshd_config so we apply it now
    "${CIS_CHECKS_DIR}/${script}.sh" || true
    # and check again that the fix was correctly applied
    register_test retvalshouldbe 0
    register_test contain "^AllowUsers[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*peterdeny marrydeny is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run fix_multi_denied_user_mismatch "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    # reset to prevent other test from possibly failing in the future
    sed -i "s/DENIED_USERS='peterdeny marrydeny'/DENIED_USERS=''/" "${CIS_CONF_DIR}/conf.d/${script}.cfg"
    "${CIS_CHECKS_DIR}/${script}.sh" || true
    describe Checking resolved state
    register_test retvalshouldbe 0
    register_test contain "^AllowUsers[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^AllowGroups[[:space:]]** is present in /etc/ssh/sshd_config"
    register_test contain "^DenyUsers[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    register_test contain "^DenyGroups[[:space:]]*nobody is present in /etc/ssh/sshd_config"
    run cleanup_resolved "${CIS_CHECKS_DIR}/${script}.sh" --audit-all

    # Cleanup
    userdel johnallow
    userdel janeallow
    userdel peterdeny
    userdel marrydeny
    describe Clean test
    pkill -9 sshd
}
