#!/bin/bash
# Desc: Validates Input

yell() { echo "$0: $*" >&2; }      #o Yell, Die, Try Three-Fingered Claw technique
die() { yell "$*"; exit 111; }     #o Ref/Attrib: https://stackoverflow.com/a/25515370
try() { "$@" || die "cannot $*"; } #o
validateInput() {
    # Desc: Validates Input
    # Usage: validateInput [str input] [str input type]
    # Version: 0.3.1
    # Input: arg1: string to validate
    #        arg2: string specifying input type (ex:"ssh_pubkey")
    # Output: return code 0: if input string matched specified string type
    # Depends: bash 5, yell()

    local fn argInput argType

    # Save function name
    fn="${FUNCNAME[0]}";

    # Process arguments
    argInput="$1";
    argType="$2";
    if [[ $# -gt 2 ]]; then yell "ERROR:$0:$fn:Too many arguments."; exit 1; fi;

    # Check for blank
    if [[ -z "$argInput" ]]; then return 1; fi
    
    # Define input types
    ## ssh_pubkey
    ### Check for alnum/dash base64 (ex: "ssh-rsa AAAAB3NzaC1yc2EAAA")
    if [[ "$argType" = "ssh_pubkey" ]]; then
	if [[ "$argInput" =~ ^[[:alnum:]-]*[\ ]*[[:alnum:]+/=]*$ ]]; then
	    return 0; fi; fi;

    ## age_pubkey
    ### Check for age1[:bech32:]
    if [[ "$argType" = "age_pubkey" ]]; then
	if [[ "$argInput" =~ ^age1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]*$ ]]; then
	    return 0; fi; fi

    ## integer
    if [[ "$argType" = "integer" ]]; then
	if [[ "$argInput" =~ ^[[:digit:]]*$ ]]; then
	    return 0; fi; fi;

    ## time element (year, month, week, day, hour, minute, second)
    if [[ "$argType" = "time_element" ]]; then
	if [[ "$argInput" = "year" ]] || \
	       [[ "$argInput" = "month" ]] || \
	       [[ "$argInput" = "week" ]] || \
	       [[ "$argInput" = "day" ]] || \
	       [[ "$argInput" = "hour" ]] || \
	       [[ "$argInput" = "minute" ]] || \
	       [[ "$argInput" = "second" ]]; then
	    return 0; fi; fi;
    
    # Return error if no condition matched.
    return 1;
} # Validates strings

#==BEGIN sample code==
testKey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCq8G0XWi8A+MXNu7MEaxDsZJUwtgPC4shGAAarXC4PQTRxLfUHtyWkNbzGh31U/bKI3Snp1O78yOVEZSjdmWkDvkwtWKJQcoZBStgqw9oIPE0oG8uh49XoX77nVabi0JCf8zO63Ai4/9EdwyqE9xsJ+soOYt2V5+UCj0zsv1xpt2YhfYyXrzBv9x6k9lCxy0NW3Ik1mSW+OzSOT3tgDf36ujV/CI2i8ERM9civWy8FtFOReZMV2kkbj7fXI4E1wKM1RFIn7er1MseCSvbvh3o2uCO46/euqHAstYs5cL+4yB2qM/xKfHT5aocDjq7GBLKtree9xdNF0EE9CNr/+J5R";
keyType="ssh_pubkey";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

testKey="blah-blah onetwothreeREEE";
keyType="ssh_pubkey";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

testKey="";
keyType="ssh_pubkey";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

testKey="age1c3s6huz6en6jh40cem0erc0m2un2ry85my0t0ujj4a5cu8gzkysq9l39e4";
keyType="age_pubkey";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

testKey="123"
keyType="integer";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

testKey="123abc"
keyType="integer";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

testKey="year"
keyType="time_element";
if validateInput "$testKey" "$keyType"; then echo "Looks like a valid $keyType:\"$testKey\""; else echo "Doesn't look like a valid $keyType:\"$testKey\""; fi
echo "";

#==END sample code==

# Author: Steven Baltakatei Sandoval (bktei.com)
# License: GPLv3+