xref: /netbsd-src/distrib/utils/embedded/files/creds_msdos (revision 1fae5a330f88a903eabd1e470c3ce425d11f3eab)
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