#! /bin/bash

# Lizenz / license:
# GPL v3 or later: http://www.gnu.org/licenses/gpl-3.0

# Documentation:
# Dieses Script importiert die Schlüssel und die Konfigurationsdatei, 
# die im aktuellen Verzeichnis liegen.

# CHANGELOG
# Hauke Laging, hauke.laging (emailzeichen) openpgp-schulungen.de
#       XMPP: gnupg-support@jabber.org (OTR: http://www.openpgp-schulungen.de/kontakt/)
### $VERSION nicht vergessen!
# 1.7, 10.06.2014, Hauke Laging
VERSION=1.7

SOURCE_FILE_LINUX=gpg.conf
SOURCE_FILE_WIN=gpg.conf.win
SOURCE_FILE_MAC=gpg.conf # GnuPG needs the Unix format under MacOS, too.
TARGET_FILE=gpg.conf
TARGET_FILE2=gpg.conf-2
TARGET_OS=LINUX
OWNERTRUST_FILE=ownertrust.txt
EXPORT_DIR="export"
LCKEYFILE_SECRET="lckey.secret.asc"
LCKEYFILE_PUBLIC="lckey.public.asc"
TARGET_SUBDIR_CERTS="certs"
IMPORT_CERTS_UNIX="import_certs.sh"

eval source_file='$SOURCE_FILE_'"${TARGET_OS}"
startdir="$PWD"
yes_char="j"
no_char="n"

shopt -s nullglob

yesno () {
	test $# -ne 1 && { echo "internal error in yesno(); aborting."; exit 1; }
	local text="$1" answer
	while true; do
		echo -n "${text} (${yes_char}/${no_char}): "
		read answer
		if [ "$yes_char" = "$answer" -o "$no_char" = "$answer" ]; then
			if [ "$yes_char" = "$answer" ]; then
				return 0
			else
				return 1
			fi
		else
			echo "Falsche Eingabe; bitte noch mal..."
			echo
			echo
			echo
		fi
		
	done
} # yesno ()

if [ "$1" != "--force" -a -d "$EXPORT_DIR" ]; then
	echo "Das aktuelle Verzeichnis enthält ein Verzeichnis '${EXPORT_DIR}'."
	echo "Das heißt, dass wahrscheinlich die falsche Version dieses Scripts läuft."
	echo
	echo "Wechseln Sie in das Verzeichnis und führen das dortige Script aus"
	echo "oder rufen Sie dieses Script mit dem Argument --force auf."
	exit 1
fi

clear
cat <<EOT
PROGRAMMSTART: bestätigen
======================================================================

Dieses Script importiert die GnuPG-Konfigurationsdatei (${source_file}), die 
Schlüssel und die Vertrauensdatenbank aus dem aktuellen Verzeichnis:
     '${PWD}'

Möchten Sie, dass diese Aktionen ausgeführt werden? (j/n)
EOT

read cont
if [ j != "$cont" ]; then
	echo
	echo "Abbruch des Scripts."
	exit 0
fi

gpg --list-keys &>/dev/null # ~/.gnupg initialisieren

if ! [ -d ~/.gnupg/ ]; then
	echo "Das Verzeichnis '~/.gnupg' existiert nicht; Abbruch."
	exit 1
fi

if [ -f "$source_file" ]; then
	pushd ~/.gnupg &>/dev/null
	if [ -f "$TARGET_FILE" ]; then
		success=no
		for((i=1;i<100;i++)); do
			if ! [ -f "$TARGET_FILE"."$i" ]; then
				if mv "$TARGET_FILE" "$TARGET_FILE"."$i"; then
					echo "Die alte Konfigurationsdatei '~/.gnupg/${TARGET_FILE}' wurde in ${TARGET_FILE}.${i} umbenannt."
					success=yes
					break
				else
					echo "Fehler beim Umbenennen von '~/.gnupg/${TARGET_FILE}'; Abbruch."
					exit 1
				fi
			fi
		done
		if [ no = "$success" ]; then
			echo "Fehler beim Umbenennen von '~/.gnupg/${TARGET_FILE}'; Abbruch."
			exit 1
		fi
	fi
	if [ -f "$TARGET_FILE2" ]; then
		success=no
		for((i=1;i<100;i++)); do
			if ! [ -f "$TARGET_FILE2"."$i" ]; then
				if mv "$TARGET_FILE2" "$TARGET_FILE2"."$i"; then
					echo "Die alte Konfigurationsdatei '~/.gnupg/${TARGET_FILE2}' wurde in ${TARGET_FILE2}.${i} umbenannt."
					success=yes
					break
				else
					echo "Fehler beim Umbenennen von '~/.gnupg/${TARGET_FILE2}'; Abbruch."
					exit 1
				fi
			fi
		done
		if [ no = "$success" ]; then
			echo "Fehler beim Umbenennen von '~/.gnupg/${TARGET_FILE2}'; Abbruch."
			exit 1
		fi
	fi
	popd &>/dev/null
	if ! cp "$source_file" ~/.gnupg/; then
		echo "Fehler beim Importieren von '$source_file'; Abbruch."
		exit 1
	fi
fi

for file in *.public.asc *.secret-subkeys.asc *.public-certified.asc "$LCKEYFILE_PUBLIC"; do
	gpg --import-options import-local-sigs --import "$file" &>/dev/null
done
gpg --check-trustdb &>/dev/null

if [ -f "$OWNERTRUST_FILE" ]; then
	if gpg --import-ownertrust < "$OWNERTRUST_FILE"; then
		echo "Die Vertrauensdatenbank wurde erfolgreich importiert."
	else
		echo "Beim Versuch, die Vertrauensdatenbank zu importieren, trat ein Fehler auf."
	fi
fi

echo

clear
if yesno "Soll aus diesem Script heraus die Transportpassphrase geändert werden?"; then
	set -- *.secret-subkeys.asc
	if [ $# -eq 1 ]; then
		short_id="$(echo *.secret-subkeys.asc)"
		short_id="${short_id%.secret-subkeys.asc}"
		echo "Ändern Sie jetzt die Transportpassphrase in die normale."
		echo "Nach dem Ändern speichern Sie den Schlüssel am 'gpg>'-Prompt mit 'save'."
		echo
		echo "Weiter mit Return..."
		read cont
		gpg --edit-key "$short_id" passwd
	else
		echo "Ändern Sie jetzt die Transportpassphrase in die normale."
		echo "Aus irgendeinem Grund funktioniert das gerade leider nicht"
		echo "automatisch. Lösen Sie das Problem bitte manuell."
		echo
		echo "Weiter mit Return..."
		read cont
	fi
else
	echo "Sie sollten die Transportpassphrase nun auf andere Weise (GUI) ändern."
	echo
	echo "Weiter mit Return..."
	read cont
fi

if [ -f "$LCKEYFILE_SECRET".asc ]; then
	clear
	if yesno "Soll der lokale Zertifizierungsschlüssel importiert werden?"; then
		echo "Jetzt wird lckey-lsign entschlüsselt und importiert..."
		echo "Weiter mit Return..."
		read cont
		if gpg --output "$LCKEYFILE_SECRET" --decrypt "$LCKEYFILE_SECRET".asc; then
			gpg --import "$LCKEYFILE_SECRET"
			rm "$LCKEYFILE_SECRET" # damit der Ordner bedenkenlos überall gespeichert werden kann
		else
			echo "Der private lckey-Schlüssel konnte nicht importiert werden."
			echo "Bitte manuell importieren."
			echo
			echo "Weiter mit Return..."
			read cont
		fi
	fi
fi

if [ -d ../"$TARGET_SUBDIR_CERTS" ]; then
	pushd ../"$TARGET_SUBDIR_CERTS" &>/dev/null
	bash ./"$IMPORT_CERTS_UNIX" # Aufruf explizit über bash, um keine Probleme mit fehlenden Ausführrechten zu bekommen
	popd &>/dev/null
fi

clear
echo "Dies sind die öffentlichen Schlüssel im Keyring (jeweils nur eine UID):"
gpg --list-keys | grep -A1 "^pub" | cat

echo "

"
