13e5e960fSmrg#!/bin/sh 23e5e960fSmrg# 3*1fae5a33Smrg# $NetBSD: creds_msdos,v 1.6 2024/01/29 05:46:55 mrg Exp $ 43e5e960fSmrg# 53e5e960fSmrg# Copyright (c) 2019 Matthew R. Green 63e5e960fSmrg# All rights reserved. 73e5e960fSmrg# 83e5e960fSmrg# Redistribution and use in source and binary forms, with or without 93e5e960fSmrg# modification, are permitted provided that the following conditions 103e5e960fSmrg# are met: 113e5e960fSmrg# 1. Redistributions of source code must retain the above copyright 123e5e960fSmrg# notice, this list of conditions and the following disclaimer. 133e5e960fSmrg# 2. Redistributions in binary form must reproduce the above copyright 143e5e960fSmrg# notice, this list of conditions and the following disclaimer in the 153e5e960fSmrg# documentation and/or other materials provided with the distribution. 163e5e960fSmrg# 173e5e960fSmrg# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 183e5e960fSmrg# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 193e5e960fSmrg# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 203e5e960fSmrg# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 213e5e960fSmrg# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 223e5e960fSmrg# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 233e5e960fSmrg# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 243e5e960fSmrg# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 253e5e960fSmrg# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 263e5e960fSmrg# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 273e5e960fSmrg# SUCH DAMAGE. 283e5e960fSmrg 293e5e960fSmrg# 303e5e960fSmrg# If "creds_msdos_partition" is an msdos partition and has a creds.txt 313e5e960fSmrg# in it, perform these commands: 323e5e960fSmrg# "sshkeyfile <user> <path on msdos>" 333e5e960fSmrg# "sshkey <user> <entry>" 343e5e960fSmrg# "useraddhash <user> <passwd hash>" 353e5e960fSmrg# "useradd <user> <passwd>" 363e5e960fSmrg# If the "useradd" method is used, this the creds.txt file will be 373e5e960fSmrg# shredded and deleted with rm -P. 383e5e960fSmrg 393e5e960fSmrg# PROVIDE: creds_msdos 403e5e960fSmrg# REQUIRE: mountall 413e5e960fSmrg 423e5e960fSmrg$_rc_subr_loaded . /etc/rc.subr 433e5e960fSmrg 443e5e960fSmrgname="creds_msdos" 453e5e960fSmrgstart_cmd="creds_msdos_start" 463e5e960fSmrgstop_cmd=":" 473e5e960fSmrg 483e5e960fSmrgfail() { 493e5e960fSmrg echo "$@" 1>&2 503e5e960fSmrg exit 1 513e5e960fSmrg} 523e5e960fSmrg 53f409dc04Smrg# This uses $ssh_userkeys global 543e5e960fSmrgsshkey_setup() { 553e5e960fSmrg local user="$1" 563e5e960fSmrg local group="wheel" 573e5e960fSmrg 583e5e960fSmrg # don't create existing users 59f409dc04Smrg if ! id -u "${user}" > /dev/null 2>&1; then 60f409dc04Smrg useradd -m -G "${group}" "${user}" || fail "Useradd failed." 613e5e960fSmrg fi 623e5e960fSmrg 63f409dc04Smrg eval ssh_userdir=~"${user}/.ssh" 64f409dc04Smrg mkdir -p -m 755 "${ssh_userdir}" || fail "mkdir ~/.ssh failed." 65f409dc04Smrg chmod 755 "${ssh_userdir}" 66f409dc04Smrg chown "${user}" "${ssh_userdir}" 67f409dc04Smrg 68f409dc04Smrg ssh_userkeys="${ssh_userdir}/authorized_keys" 693e5e960fSmrg} 703e5e960fSmrg 713e5e960fSmrgsshkey_finish() { 723e5e960fSmrg local user="$1" 733e5e960fSmrg 74f409dc04Smrg chmod 644 "${ssh_userkeys}" 75f409dc04Smrg chown "${user}" "${ssh_userkeys}" 763e5e960fSmrg} 773e5e960fSmrg 783e5e960fSmrgdo_sshkeyfile() { 793e5e960fSmrg local user="$1" 803e5e960fSmrg local newkeys="${creds_msdos_partition}/$2" 813e5e960fSmrg 823e5e960fSmrg if [ ! -f "${newkeys}" ]; then 833e5e960fSmrg return 843e5e960fSmrg fi 853e5e960fSmrg 86f409dc04Smrg sshkey_setup "${user}" 873e5e960fSmrg 883e5e960fSmrg # check entry is not present 893e5e960fSmrg while read type keydata name; do 90f409dc04Smrg if fgrep -q "${keydata}" "${ssh_userkeys}" 2>/dev/null; then 913e5e960fSmrg continue 923e5e960fSmrg fi 93f409dc04Smrg echo "${type} ${keydata} ${name}" >> "${ssh_userkeys}" 943e5e960fSmrg done < "${newkeys}" 953e5e960fSmrg 96f409dc04Smrg sshkey_finish "${user}" 973e5e960fSmrg} 983e5e960fSmrg 993e5e960fSmrgdo_sshkey() { 1003e5e960fSmrg local user="$1" 1013e5e960fSmrg local newkey="$2" 1023e5e960fSmrg 103f409dc04Smrg sshkey_setup "${user}" 1043e5e960fSmrg 105f409dc04Smrg echo "${newkey}" >> "${ssh_userkeys}" 1063e5e960fSmrg 107f409dc04Smrg sshkey_finish "${user}" 1083e5e960fSmrg} 1093e5e960fSmrg 1103e5e960fSmrgdo_useraddpwhash() { 1113e5e960fSmrg local user="$1" 1123e5e960fSmrg local pwhash="$2" 1133e5e960fSmrg local group="wheel" 1143e5e960fSmrg 1153e5e960fSmrg # don't add to existing users 116f409dc04Smrg if id -u "${user}" > /dev/null 2>&1; then 1173e5e960fSmrg return 1183e5e960fSmrg fi 1193e5e960fSmrg 1203e5e960fSmrg useradd -m -p "${pwhash}" -G "${group}" "${user}" || fail "Useradd failed." 1213e5e960fSmrg} 1223e5e960fSmrg 1233e5e960fSmrgdo_useradd() { 1243e5e960fSmrg local user="$1" 1253e5e960fSmrg local password="$2" 1263e5e960fSmrg 1273e5e960fSmrg local pwhash=$(pwhash "$password") 1283e5e960fSmrg do_useraddpwhash "${user}" "${pwhash}" 1293e5e960fSmrg} 1303e5e960fSmrg 1313e5e960fSmrgcreds_msdos_start() 1323e5e960fSmrg{ 133f409dc04Smrg local fstab_file=/etc/fstab 134f409dc04Smrg 1353e5e960fSmrg if [ -z "${creds_msdos_partition}" ]; then 136f84eb3e2Smlelstv echo "Not looking for credentials on msdos" 137f409dc04Smrg return 1383e5e960fSmrg fi 1393e5e960fSmrg while read junk1 mp fstype junk2; do 1403e5e960fSmrg if [ "${mp}" != "${creds_msdos_partition}" ]; then 1413e5e960fSmrg continue 1423e5e960fSmrg fi 1433e5e960fSmrg if [ "${fstype}" != "msdos" ]; then 1443e5e960fSmrg echo "Not checking for creds on ${creds_msdos_partition}: not an msdos file system" 145f409dc04Smrg return 1463e5e960fSmrg fi 1473e5e960fSmrg break 1483e5e960fSmrg done < "${fstab_file}" 1493e5e960fSmrg 150f409dc04Smrg local delete_creds=no 151f409dc04Smrg local creds_file="${creds_msdos_partition}/creds.txt" 1523e5e960fSmrg 1533e5e960fSmrg if [ -f "${creds_file}" ]; then 154f409dc04Smrg while read type user args; do 1559cc213efSmrg # strip cr 156*1fae5a33Smrg local clean_args="$(echo "$args" | tr -d '\015')" 1573e5e960fSmrg case "$type" in 1583e5e960fSmrg \#*|'') 1593e5e960fSmrg continue 1603e5e960fSmrg ;; 1613e5e960fSmrg sshkeyfile) 1623e5e960fSmrg echo "Added user ${user} via ssh key file method." 163f409dc04Smrg do_sshkeyfile "${user}" "${clean_args}" 1643e5e960fSmrg ;; 1653e5e960fSmrg sshkey) 1663e5e960fSmrg echo "Added user ${user} via ssh key string method." 167f409dc04Smrg do_sshkey "${user}" "${clean_args}" 1683e5e960fSmrg ;; 1693e5e960fSmrg useraddpwhash) 1703e5e960fSmrg echo "Added user ${user} via password hash method." 171f409dc04Smrg do_useraddpwhash "${user}" "${clean_args}" 1723e5e960fSmrg ;; 1733e5e960fSmrg useradd) 1743e5e960fSmrg echo "Added user ${user} via password method, shredding credentials file." 175f409dc04Smrg do_useradd "${user}" "${clean_args}" 1763e5e960fSmrg delete_creds=yes 1773e5e960fSmrg ;; 1783e5e960fSmrg *) 1793e5e960fSmrg echo "Do not understand '$type' creds" 1>&2 1803e5e960fSmrg exit 1 1813e5e960fSmrg ;; 1823e5e960fSmrg esac 1833e5e960fSmrg done < "${creds_file}" 1843e5e960fSmrg fi 1853e5e960fSmrg 1863e5e960fSmrg if [ $delete_creds = yes ]; then 1873e5e960fSmrg rm -P -f "${creds_file}" 1883e5e960fSmrg fi 1893e5e960fSmrg} 1903e5e960fSmrg 1913e5e960fSmrgload_rc_config $name 1923e5e960fSmrgrun_rc_command "$1" 193