408 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			408 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
export LANG=C
 | 
						|
export EVENT=DiVOC
 | 
						|
export TERM=vt220 
 | 
						|
 | 
						|
export DIALOGRC=dialogrc
 | 
						|
 | 
						|
LOCKFILE=/tmp/irolock
 | 
						|
TMP=/tmp/$RANDOM
 | 
						|
BT="Intergalactic Registration Office - v0.3"
 | 
						|
 | 
						|
cd $(dirname "$0")
 | 
						|
 | 
						|
function infoBox() {
 | 
						|
  h=8
 | 
						|
  w=60
 | 
						|
  if [ -n "$3" ]; then
 | 
						|
    h=$3
 | 
						|
  fi
 | 
						|
  if [ -n "$4" ]; then
 | 
						|
    w=$4
 | 
						|
  fi
 | 
						|
  dialog --title "$1" \
 | 
						|
  --backtitle "$BT" \
 | 
						|
  --infobox "$2" $h $w
 | 
						|
}
 | 
						|
 | 
						|
function diaBox() {
 | 
						|
  h=8
 | 
						|
  w=60
 | 
						|
  if [ -n "$3" ]; then
 | 
						|
    h=$3
 | 
						|
  fi
 | 
						|
  if [ -n "$4" ]; then
 | 
						|
    w=$4
 | 
						|
  fi
 | 
						|
  dialog --title "$1" \
 | 
						|
  --backtitle "$BT" \
 | 
						|
  --msgbox "$2" $h $w
 | 
						|
}
 | 
						|
 | 
						|
function ynBox() {
 | 
						|
  h=8
 | 
						|
  w=60
 | 
						|
  if [ -n "$3" ]; then
 | 
						|
    h=$3
 | 
						|
  fi
 | 
						|
  if [ -n "$4" ]; then
 | 
						|
    w=$4
 | 
						|
  fi
 | 
						|
 | 
						|
  dialog --title "$1" \
 | 
						|
  --backtitle "$BT" \
 | 
						|
  --yesno "$2" $h $w
 | 
						|
 | 
						|
  return $?
 | 
						|
}
 | 
						|
 | 
						|
function askStr() {
 | 
						|
  h=12
 | 
						|
  w=60
 | 
						|
  if [ -n "$5" ]; then
 | 
						|
    h=$5
 | 
						|
  fi
 | 
						|
  if [ -n "$6" ]; then
 | 
						|
    w=$6
 | 
						|
  fi
 | 
						|
 | 
						|
  dialog --title "$2" \
 | 
						|
  --backtitle "$BT" \
 | 
						|
  --max-input $1 \
 | 
						|
  --inputbox "$3" $h $w "$4" 2> $TMP
 | 
						|
  return $?
 | 
						|
}
 | 
						|
 | 
						|
function askPw() {
 | 
						|
  h=12
 | 
						|
  w=60
 | 
						|
  if [ -n "$5" ]; then
 | 
						|
    h=$5
 | 
						|
  fi
 | 
						|
  if [ -n "$6" ]; then
 | 
						|
    w=$6
 | 
						|
  fi
 | 
						|
 | 
						|
  dialog --title "$2" \
 | 
						|
  --backtitle "$BT" \
 | 
						|
  --max-input $1 \
 | 
						|
  --insecure \
 | 
						|
  --passwordbox "$3" $h $w "$4" 2> $TMP
 | 
						|
  return $?
 | 
						|
}
 | 
						|
 | 
						|
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"
 | 
						|
        return 0
 | 
						|
      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() {
 | 
						|
  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
 | 
						|
      clear
 | 
						|
      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
 |