#!/bin/bash export LANG=C export EVENT=DiVOC export DIALOGRC=dialogrc LOCKFILE=/tmp/irolock TMP=/tmp/$RANDOM BT="Intergalactic Registration Office - v0.3\n========================================" cd $(dirname "$0") function clr() { printf "\033H\033J" } function infoBox() { clr echo -e "$BT\n\n$1\n\n\n$2" read -n 1 -s -r -p "Press any key to continue" } function diaBox() { clr echo -e "$BT\n\n$1\n\n\n$2" read -r -p "Okay? [(o)kay/(a)bort] " resp echo "$resp" > $TMP } function ynBox() { clr echo -e "$BT\n\n$1\n\n\n$2" read -r -p "Are you sure? [y/N] " resp if [ "$resp" = "" ]; then resp="N" fi echo "$resp" > $TMP } function askStr() { clr echo -e "$BT\n\n$2\n\n\n$3" read resp echo "$resp" > $TMP } function askPw() { clr echo -e "$BT\n\n$2\n\n" stty -echo read -r -p "$3 " resp echo "$resp" > $TMP } function confirm() { h=12 w=60 if [ -n "$3" ]; then h=$3 fi if [ -n "$4" ]; then w=$4 fi dialog --title "Confirm: $1" \ --backtitle "$BT" \ --yesno "Please confirm those information:\n$2" $h $w return $? } function askStrThird() { h=12 w=60 if [ -n "$6" ]; then h=$5 fi if [ -n "$7" ]; then w=$6 fi dialog --backtitle "$BT" \ --max-input $1 \ --title "$2" \ --extra-button --extra-label "$4" \ --inputbox "$3" $h $w "$5" 2> $TMP return $? } function gpgSearch() { askStr 255 "GPG Search" "Type in the mail address you'd like to look up on keys.openpgp.org." if [ $? -eq 0 ]; then if [[ "$(cat $TMP)" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$ ]]; then clear echo "Searching for GPG key..." gpg --keyserver "hkps://keys.openpgp.org" --search "$(cat $TMP)" if [ $? -eq 0 ]; then export FFP=$(gpg -k "$(cat $TMP)" | head -n 2 | tail -n 1 | awk '{print $1}' | sed 's/.\{4\}/& /g;s/^\(.*\) $/\1/g') gpg --batch --delete-key "$FFP" if [ "$FFP" = "" ]; then gpgSearch else return 0 fi else gpgSearch fi else gpgSearch fi fi return 1 } function enterGPG() { askStrThird 49 "GPG Fingerprint" "Enter GPG fingerprint WITH SPACES. E.g.:\n 1234 5678 9ABC DEF0 1234 5678 9ABC DEF0 1234 5678" "Search..." "$1" ret=$? case $ret in 0) FP=$(cat $TMP) rm $TMP if ! [[ $FP =~ ^([[:xdigit:]]{4} ){9}[[:xdigit:]]{4}$ ]]; then diaBox "GPG Fingerprint" "This does not match the RegEx of a GPG fingerprint.\nPlease type in the whole fingerprint." enterGPG fi FP=$(echo "$FP" | tr [a-f] [A-F]) ;; 1) return 1 ;; 3) gpgSearch if [ $? -eq 0 ]; then enterGPG "$FFP" "no-confirm" fi return ;; esac if [ "$2" == "no-confirm" ]; then return 0 else confirm "GPG Fingerprint" " GPG:\n $FP" return $? fi } function checkLockFile() { while [ -f $LOCKFILE ]; do infoBox "Printer is in use..." "Printer is in use. Please wait." sleep 1 done touch $LOCKFILE } function printGPG() { askForField "GPG fingerprint" "$1" if [ $? -eq 0 ]; then checkLockFile diaBox "Insert Passport" "Please insert passport (Visas) into the printer." cd "$1" ./gpgkey $FIELD $FP cd .. rm $LOCKFILE return 0 else return 1 fi } function printReg() { checkLockFile diaBox "Insert Passport" "Please insert passport (First page, name, place) into the printer." cd "$1" ./reg "$FNAME" "$SNAME" "$PLANET" cd .. rm $LOCKFILE return 0 } function printIROStamp() { askForField "IRO stamp" "$1" if [ $? -eq 0 ]; then checkLockFile diaBox "Insert Passport" "Please insert passport (Visas) into the printer." cd "$1" ./iro $FIELD cd .. rm $LOCKFILE return 0 else return 1 fi } function askForField() { declare -A layout declare -A maxfield text="$1: Please choose a free field on the passport.\n" layout[jhp]=" ------------------\n | Archievements |\n ==================\n | 0 | 1 || 6 | 7 |\n |---|---||---|---|\n | 2 | 3 || 8 | 9 |\n |---|---||---|---|\n | 4 | 5 || 10| 11|\n ==================\n " layout[adafruit]=" ------------------\n | VISAS || VISAS |\n ==================\n | 0 | 1 || 4 | 5 |\n |---|---||---|---|\n | 2 | 3 || 6 | 7 |\n ==================\n " maxfield[jhp]=11 maxfield[adafruit]=7 askStr 2 "Select a field" "$text ${layout[$2]}" "" 18 if [ $? -eq 1 ]; then return 1 fi FIELD=$(cat $TMP) if ! [[ "$FIELD" =~ ^[0-9]+$ ]] || [ -z "$FIELD" ] || [ $FIELD -lt 0 ] || [ $FIELD -gt ${maxfield[$2]} ]; then askForField "$1" "$2" else return 0 fi } function askReg() { # Max length of passport fields declare -A MAXLENGTH MAXLENGTH[jhp]=25 MAXLENGTH[adafruit]=17 askStr ${MAXLENGTH[$1]} "Forename/Nickname" "Enter forename/nickname" if [ $? -eq 1 ]; then return 1 fi FNAME=$(cat $TMP) askStr ${MAXLENGTH[$1]} "Surname" "Enter surname" if [ $? -eq 1 ]; then return 1 fi SNAME=$(cat $TMP) askStr ${MAXLENGTH[$1]} "Place" "Enter place" if [ $? -eq 1 ]; then return 1 fi PLANET=$(cat $TMP) confirm=" Forename: $FNAME\n Surname: $SNAME\n Place: $PLANET" ynBox "IRO Stamp" "Does this being want to have a IRO stamp?" if [ $? -eq 0 ]; then STAMP=true else STAMP=false fi ynBox "GPG" "Does the being have a GPG key to register?" if [ $? -eq 0 ]; then enterGPG "" no-confirm if [ $? -eq 0 ]; then confirm="$confirm\n GPG:\n $FP" fi fi confirm "Everything" "$confirm" return $? } function menuFor() { dialog --backtitle "$BT" \ --menu "Select ID type:" 14 40 3 \ 1 "Registration" \ 2 "IRO Stamp" \ 3 "GPG" \ 9 "Back" 2> $TMP choice=$(cat $TMP) case $choice in 1) askReg "$1" if [ $? -eq 0 ]; then printReg "$1" if [ "$STAMP" == "true" ]; then printIROStamp "$1" fi if [ -n "$FP" ]; then printGPG "$1" fi fi ;; 2) printIROStamp "$1" ;; 3) enterGPG if [ $? -eq 0 ]; then printGPG "$1" fi ;; esac unset FNAME unset SNAME unset PLANET unset FP unset FIELD unset FFP } function askForFunnyUserCreds() { clr echo "Press Enter to start." read -s askStr 12 "Login" "Username:" "" username=$(cat $TMP) askPw 12 "Login" "Password:" "" password=$(cat $TMP) if [ -f .pw/$username ]; then if [ "$password" != $(cat .pw/$username) ]; then clr echo "Wrong credentials." sleep 3 exit 1 fi else echo "Wrong credentials." sleep 3 exit 1 fi } askForFunnyUserCreds while [ true ]; do dialog --backtitle "$BT" \ --menu "Select ID type:" 10 40 3 \ 1 "Junghackerpass" \ 2 "New Adafruit passport" \ 9 "Logout" 2> $TMP if [ $? -eq 9 ]; then break fi TYPE=$(cat $TMP) case $TYPE in 1) menuFor jhp ;; 2) menuFor adafruit ;; 9) break ;; esac done rm $TMP clear