penguin/utils

my env utils

commit 1e2ed5812d09839ab329034d33f90c1d5eaf24ca

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-06-27T09:14:12Z
subjectImprove kstoresecret handling
commit 1e2ed5812d09839ab329034d33f90c1d5eaf24ca
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-06-27T09:14:12Z

    Improve kstoresecret handling
---
 bash/sources/16_keystore | 89 ++++++++++++++++++++++++++----------------------
 1 file changed, 48 insertions(+), 41 deletions(-)

diff --git a/bash/sources/16_keystore b/bash/sources/16_keystore
index 7df093e..d53014e 100644
--- a/bash/sources/16_keystore
+++ b/bash/sources/16_keystore
@@ -19,11 +19,6 @@ _KSTORE_DEC_FAILED="$RBASH_HOME/.decypt-failed"
 _KSTORE_TABLE=store
 : "${_KSTORE_OPENSSL_ITER:=1000000}"
 
-if [ -f "$RBASH_HOME/keystore.secret" ]; then
-	_AUTH_SECRET=$( cat "$RBASH_HOME/keystore.secret" )
-fi
-
-
 function kstore {
 	case $1 in
 		add) shift; _kstoreadd "$@" ;;
@@ -205,14 +200,14 @@ function _kstoresecret-cygwin {
 
 	case $1 in
 		get)
-			_A=$( kstorecred get )
+			_A=$(kstorecred get)
 			if [ $? -ne 0 ]; then
 				return 1
 			fi
 			_AUTH_SECRET="$_A"
 			;;
 		set)
-			kstorecred set "$_AUTH_SECRET"
+			printf "%s" "$_AUTH_SECRET" | kstorecred set
 			;;
 		del)
 			kstorecred del
@@ -226,19 +221,16 @@ function _kstoresecret-cygwin {
 
 function _kstoresecret-macos {
 	local _A
-	case $1 in
+	case "$1" in
 		get)
-			_A=`security find-generic-password -a default -gs rbash-kstore 2>&1 | grep ^password | cut -c 11-`
-			if [ $? -ne 0 ]; then
-				return 1
-			fi
-			_AUTH_SECRET="${_A:1:-1}"
+			_A=$(security find-generic-password -a default -s rbash-kstore -w 2>/dev/null) || return 1
+			_AUTH_SECRET="$_A"
 			;;
 		set)
-			security add-generic-password -a default -s rbash-kstore -w "$_AUTH_SECRET"
+			security add-generic-password -a default -s rbash-kstore -w "$_AUTH_SECRET" -U
 			;;
 		del)
-			security delete-generic-password -a default -s rbash-kstore
+			security delete-generic-password -a default -s rbash-kstore 2>/dev/null
 			;;
 		*)
 			echo "Unknown action: $1" >&2
@@ -503,65 +495,80 @@ function _kstoreinit-s3au {
 }
 
 function _kstoreupload-db {
-	local _T _W
+	local _T
 
 	_kstoreinit || return 1
 
-	_T=$( date +%Y%m%d%H%M%S )
-	echo $_T > "$RBASH_HOME/keystore.latest"
+	_T=$(date +%Y%m%d%H%M%S)
+	echo "$_T" > "$RBASH_HOME/keystore.latest"
 
-	which arch-upload-aws4 2>&1 > /dev/null
+	which arch-upload-aws4 >/dev/null 2>&1
 	if [ $? -ne 0 ]; then
-		_kstoreinit-s3au
+		_kstoreinit-s3au || return 1
 	fi
 
-	_kstoreenc $_AUTH_DB > "$RBASH_HOME/$_T.enc"
-	arch-upload-aws4 "keystore/$_T.enc" "$RBASH_HOME/$_T.enc"
-	arch-upload-aws4 "keystore/latest" "$RBASH_HOME/keystore.latest"
+	_kstoreenc "$_AUTH_DB" > "$RBASH_HOME/$_T.enc" || return 1
+	chmod 600 "$RBASH_HOME/$_T.enc"
+
+	arch-upload-aws4 "keystore/$_T.enc" "$RBASH_HOME/$_T.enc" || return 1
+	arch-upload-aws4 "keystore/latest" "$RBASH_HOME/keystore.latest" || return 1
 
-	rm "$RBASH_HOME/$_T.enc"
-	rm "$RBASH_HOME/keystore.latest"
+	rm -f "$RBASH_HOME/$_T.enc" "$RBASH_HOME/keystore.latest"
 }
 
 function _kstoredownload-db {
-	local _T _DOMAIN _URL _TMP _CONFIRM
+	local _T _TMP _CONFIRM _OLD_PIPEFAIL
+
 	kstore secret config || return 1
 
-	which arch-download-aws4 2>&1 > /dev/null
+	which arch-download-aws4 >/dev/null 2>&1
 	if [ $? -ne 0 ]; then
-		_kstoreinit-s3au
+		_kstoreinit-s3au || return 1
 	fi
 
-	_T=$( arch-download-aws4 "keystore/latest" )
-	if [ $? -ne 0 ]; then
+	_T=$(arch-download-aws4 "keystore/latest") || return 1
+
+	_TMP=$(mktemp) || return 1
+
+	_OLD_PIPEFAIL=$(set +o | grep pipefail)
+	set -o pipefail
+
+	if ! arch-download-aws4 "keystore/$_T.enc" | _kstoredec > "$_TMP"; then
+		eval "$_OLD_PIPEFAIL"
+		rm -f "$_TMP"
+		echo "Download/decrypt failed. Incorrect bucket? ($ARCH_S3_BUCKET_URL)" >&2
 		return 1
 	fi
 
-	_TMP=$( mktemp )
-	arch-download-aws4 "keystore/$_T.enc" | _kstoredec > $_TMP
-	if [ $? -ne 0 ]; then
-		echo "Incorrect bucket? ($ARCH_S3_BUCKET_URL)" >&2
+	eval "$_OLD_PIPEFAIL"
+
+	if [ "$($_SQLITE "$_TMP" "PRAGMA integrity_check;")" != "ok" ]; then
+		rm -f "$_TMP"
+		echo "Downloaded DB failed SQLite integrity check" >&2
 		return 1
 	fi
 
-	_T=$( $_SQLITE "$_TMP" "SELECT COUNT( * ) FROM $_KSTORE_TABLE" )
-	if [ $? -ne 0 ]; then
+	if ! $_SQLITE "$_TMP" "SELECT COUNT(*) FROM $_KSTORE_TABLE;" >/dev/null; then
+		rm -f "$_TMP"
+		echo "Downloaded DB does not look like a kstore DB" >&2
 		return 1
 	fi
 
+	chmod 600 "$_TMP"
+
 	if [ -f "$_AUTH_DB" ]; then
 		read -p "Replace existing db? (yes/no): " _CONFIRM
-		if [ "$_CONFIRM" == "yes" ]; then
-			_T="$_AUTH_DB.old.$( date +%Y%m%d%H%M%S )"
+		if [ "$_CONFIRM" = "yes" ]; then
+			_T="$_AUTH_DB.old.$(date +%Y%m%d%H%M%S)"
 			mv "$_AUTH_DB" "$_T"
-			mv $_TMP $_AUTH_DB
+			mv "$_TMP" "$_AUTH_DB"
 			echo "Original copy: $_T"
 		else
 			echo "action canceled"
-			rm $_TMP
+			rm -f "$_TMP"
 		fi
 	else
-		mv $_TMP $_AUTH_DB
+		mv "$_TMP" "$_AUTH_DB"
 	fi
 }