Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # --------[ AEM - Account Encrypted Manager ]--------
- #
- # Semplice gestore di un file di testo criptato atto a contenere tutti gli
- #+ account internet dell'utente. AEM consente la decriptazione al volo
- #+ (tramite gpg) del file e la sua consultazione con varie opzioni.
- # Consente anche di creare uno scheletro di file ed aggiungere le informazioni
- #+ basilari di nuovi profili
- # _________ Schema di una riga del file di account ________
- #
- # XX_NOME <TAB> username <TAB> password <TAB> mail <TAB> "real"_name <TAB> recovery <TAB> var1 <TAB> var2 <TAB> var3
- #
- # XX = codice di categoria
- # NOME = nome account - dovrebbe essere univoco per poterlo utilizzare nella funzione '-x'
- # username = lo user per il login
- # password = si capisce direi :D
- # mail = mail di riferimento/registrazione
- # real_name = nome personale di registrazione che -dovrebbe- essere quello reale
- # recovery = pin, domanda/risposta d'emergenza, mail di ripristino, ecc...
- # ============================================================================ #
- # { Dichiarazione VARIABILI }
- # Il file di riferimento - percorso completo SENZA estensione
- ACCF="/media/DATI/Docs/Account"
- ACCE="$(echo $ACCF).gpg"
- # Categorie di account
- # nome_completo=abbreviazione
- # usare solo caratteri alfanumerici!
- declare -a CAT
- CAT=(
- BETTING=BE
- CLOUD=CL
- FORUM=FO
- GMAIL=GM
- LINUX=LX
- OTHER_MAIL=OT
- SERVICE=SE
- SHOP=SH
- SOCIAL=SO
- SPAZIO_WEB=SW
- TRADING=TR
- VARIE=VV
- NO_CLASS=ZZ
- )
- # Impostazioni per i separatori dello skel
- FILL="=" # filler separatore
- BORDL="[" # bordatura sinistra del titolo
- BORDR="]" # bordatura destra
- TAB=8 # numero di filler prima del titolo
- LINE=80 # lunghezza della linea
- SPACE=5 # righe vuote tra una cat. e l'altra
- # parametri e funzioni
- declare -a PAR1 PAR2
- PAR1=(
- -d:_deff
- -h:_help
- -l:_listCat
- -v:_show
- )
- PAR2=(
- -a:_catAll
- -c:_cat
- -d:_deff
- -f:_setFile
- -n:_new
- -s:_skel
- -x:_xtract
- )
- # Comportamenti di default
- DEF0=_show # comportamento senza parametri
- DEF1=_cat # con singolo parametro (matchexpr)
- # testi dell'help
- HOP="\n\e[1;34mOPTIONS#1\e[m\n"
- HOP="$HOP""\t\e[1;34m-d\e[m\tdefault\n\t\tchiamata senza parametri, mostra il nome del file account di default\n\n"
- HOP="$HOP""\t\e[1;34m-h\e[m\thelp\n\t\tmostra l'help esteso ed esce\n\n"
- HOP="$HOP""\t\e[1;34m-l\e[m\tlista\n\t\tmostra la lista delle categorie e relativi codici di account disponibili\n\n"
- HOP="$HOP""\t\e[1;34m-v\e[m\tvisualizza\n\t\tdefault0: mostra l'intero file di account in output\n"
- HOP="$HOP""\n\e[1;34mOPTIONS#2\e[m\n"
- HOP="$HOP""\t\e[1;34m-a\e[m\tall\n\t\tvisualizzazione completa della categoria corrispondende al codice passato in argomento\n\n"
- HOP="$HOP""\t\e[1;34m-c\e[m\tcategoria\n\t\tdefault1: come '\e[1;32m-a\e[m' ma visualizzazione sintetica (campi: account - user - pass)\n\n"
- HOP="$HOP""\t\e[1;34m-d\e[m\tdefault\n\t\tchiamata con un parametro cambia il file di account di default con quello in argomento\n\n"
- HOP="$HOP""\t\e[1;34m-f\e[m\tfile\n\t\tcambia il fle di account solo per la sessione corrente; accetta i successivi argomenti \n\n"
- HOP="$HOP""\t\e[1;34m-n\e[m\tnew\n\t\tscrittura di nuovi account nella categoria indicata in argomento; FUNZIONE BETA (bug non corretti)\n\n"
- HOP="$HOP""\t\e[1;34m-s\e[m\tskel\n\t\tcrea un nuovo file scheletro col pathname passato in argomento\n\n"
- HOP="$HOP""\t\e[1;34m-x\e[m\teXtract\n\t\testrae la password e la carica direttamente nella clipboard usando la matchexpr in argomento\n\n"
- MHE="\n\e[1;34mNAME\e[m\n"
- MHE="$MHE""\taem - Account Encripted Manager\n"
- MHE="$MHE""\n\e[1;34mSYNOPSIS\e[m\n"
- MHE="$MHE""\taem\n"
- MHE="$MHE""\taem [OPTIONS#1]\n"
- MHE="$MHE""\taem [OPTIONS#2] {PARAM}\n"
- MHE="$MHE""\n\e[1;34mDESCRIPTION\e[m\n"
- MHE="$MHE""\tIl compito principale di 'aem' e' quello di rendere il piu' possibile semplice\n"
- MHE="$MHE""\ted immediato l'uso di un file di account cercando al contempo di garantire una\n"
- MHE="$MHE""\tsicurezza ragionevole.\n"
- MHE="$MHE""\tUtilizza '\e[1;33mgpg\e[m' per gestire la crittografia e '\e[1;33mxclip\e[m' per il caricamento delle\n"
- MHE="$MHE""\tpassword direttamente in memoria (opzione: \e[1;32m-x\e[m).\n"
- MHE="$MHE""\tL'esecuzione prevede due comportamenti di default, pensati per ridurre al minimo\n"
- MHE="$MHE""\tle immissioni dati da parte dell'utente:\n"
- MHE="$MHE""\t\tDEF0: comportamento quando si esegue il programma senza immettere\n"
- MHE="$MHE""\t\t alcun argomento - visualizza tutto il file (opzione: \e[1;32m-v\e[m)\n"
- MHE="$MHE""\t\tDEF1: comportamento quando si esegue il programma immettendo un\n"
- MHE="$MHE""\t\t solo argomento; in questo caso si puo' omettere l'opzione ed\n"
- MHE="$MHE""\t\t inserire direttamente il parametro relativo - visualizzazione\n"
- MHE="$MHE""\t\t sintetica della categoria in argomento (opzione: \e[1;32m-c\e[m)\n"
- MHE="$MHE""\n\e[1;34mNOTA\e[m\n"
- MHE="$MHE""\tI due comportamenti di default si possono cambiare variando le funzioni chiamate\n"
- MHE="$MHE""\tdalle costanti 'DEF0' e 'DEF1'\n"
- MHE="$MHE""$HOP"
- # inizializzazioni varie
- XC=1
- MATCH=
- XTDMA=
- EXE=
- NULL=
- # ============================================================================ #
- # { Definizione FUNZIONI }
- # help
- function _help() {
- if [[ "$1" == "--opz" ]]; then
- echo -e "$HOP"
- else
- echo -e "$MHE"
- fi
- }
- # messaggio errore ed eventuale exit status
- function _err() {
- mex="aem> ERR$2: "
- mex="$mex$1"
- echo -e "$mex" >&2
- if [[ $2 != "0" ]]; then
- exit $2
- fi
- }
- # verifica la presenza di tre requisiti:
- # 1. presenza di xclip
- # 2. presenza di gpg (indispensabile)
- # 3. esistenza del file di account (indispensabile)
- function _cprg() {
- if [[ ! $(which xclip) ]]; then
- XC=
- _err "Manca il programma 'xclip' nel sistema: l'opzione '-x' non e' disponibile" "0"
- fi
- if [[ ! $(which gpg) ]]; then
- _err "Manca 'gpg' nel sistema! AEM non e' eseguibile senza" "2"
- fi
- if [[ ! -f "$ACCE" ]]; then
- _err "File di account non trovato!" "255"
- fi
- }
- # verifica che la categoria passata in argomento esista
- function _vcat() {
- TOVER=${1^^}
- for a in ${CAT[*]}; do
- typ=$(echo "$a" | sed 's/^.*=//')
- if [[ "$TOVER" == "$typ" ]]; then
- MATCH="$TOVER""_"
- EXTMA="$(echo "$a" | sed 's/=.*$//')"
- return
- fi
- done
- _err "Categoria non riconosciuta" "32"
- }
- # controlla gli argomenti
- function _carg() {
- err=1
- opz="$2"
- if (( $#==2 )); then
- if [[ "${opz:0:1}" != "-" ]]; then
- err=
- EXE="$DEF1"
- else
- for a in ${PAR1[*]}; do
- par=$(echo "$a" | sed 's/:.*$//')
- exe=$(echo "$a" | sed 's/^.*://')
- if [[ "$opz" == "$par" ]]; then
- err=
- EXE="$exe"
- fi
- done
- fi
- else
- if [[ "${opz:0:1}" == "-" ]]; then
- for a in ${PAR2[*]}; do
- par=$(echo "$a" | sed 's/:.*$//')
- exe=$(echo "$a" | sed 's/^.*://')
- if [[ "$opz" == "$par" ]]; then
- err=
- EXE="$exe"
- fi
- done
- fi
- fi
- if (( err )); then
- _err "Parametri errati" "0"
- _help --opz
- exit 1
- fi
- }
- # richiama gpg in codifica/decodifica e ne verifica l'exit-status
- function _vdec() {
- file="$ACCE"
- if [[ $1 == "-c" ]]; then
- file="$ACCF"
- fi
- gpg $1 "$file" 2>/dev/null
- if (( $? != 0 )); then
- _err "Errore nella decriptazione" "3"
- fi
- }
- # cambia il file di riferimento per la sessione corrente
- function _setFile() {
- if [[ -f "$1" ]] || [[ -f "$1"".gpg" ]]
- then
- ACCF="$1"
- ACCE="$(echo $ACCF).gpg"
- if [[ "$2" == "--nop" ]]; then
- return
- fi
- else
- _err "Il file che si tenta di impostare non esiste!" "19"
- fi
- shift
- _main $@
- }
- # Se chiamato senza parametri mostra qual e' il file di default
- # Chiamato con un parametro=path_nome_file (senza estensione)
- #> cambia il file di default in modo definitivo
- #> esegue un backup (bk.aem) in caso di scrittura
- function _deff() {
- echo -e "aem> File di default: $ACCF (con est.: $ACCE)"
- if [[ "$1" ]]; then
- if [[ -f "$1"".gpg" ]]; then
- echo -ne "\tCambiarlo in $1 in modo permanente ([y] per confermare)?"
- read -s -n1
- echo
- if [[ "$REPLY" == "y" ]]; then
- iam=$(which aem)
- cp "$iam" bk.aem
- sed -i "s/^ACCF=.*$/ACCF=\"$REPLY\"/" "$iam"
- echo "aem> Nuovo file di default $REPLY: impostato."
- else
- echo "aem> Operazione interrotta."
- fi
- else
- _err "Il file che si tenta di impostare non esiste!" "19"
- fi
- fi
- }
- # Elenca le categorie disponibili
- function _listCat() {
- echo "aem> Categorie disponibili:"
- echo -e "\t - CAT -\t - COD -"
- for a in ${CAT[*]}; do
- typ=$(echo "$a" | sed 's/^.*=//')
- cat=$(echo "$a" | sed 's/=.*$//')
- if (( ${#cat} < 8 ));then
- tab="\t\t"
- else
- tab="\t"
- fi
- echo -e "\t$cat$tab<->\t$typ"
- done
- }
- # mostra tutto il file
- function _show() {
- _vdec "-d"
- }
- # crea il file scheletro
- function _skel() {
- if [[ -f "$1" ]]; then
- _err "Il file esiste su questo percorso" "0"
- echo -ne "\tSovrascrivo ([y] per confermare)?"
- read -s -n1
- echo
- if [[ "$REPLY" != "y" ]]; then
- echo -e "aem> Esecuzione interrotta."
- return
- fi
- fi
- echo -e "aem> Procedura nuovo modulo:"
- echo -ne "\tInizializzo $1...\t"
- : > $1
- if (( $? == "0" )); then
- echo -e "[OK]"
- else
- echo -e "[FAIL]"
- return
- fi
- for ((t=1; t <= SPACE; t++)); do
- space="$space\n"
- done
- c=0
- for a in ${CAT[*]}; do
- ((c++))
- sep=""
- sdown=""
- cat=$(echo "$a" | sed "s/=.*$//")
- typ=$(echo "$a" | sed 's/^.*=//')
- for ((t=1; t <= LINE; t++)); do
- sdown="$sdown$FILL"
- done
- sdown="\n$sdown"
- for ((t=1; t <= TAB; t++)); do
- sep="$sep$FILL"
- done
- sep="$sep$BORDL $cat $BORDR"
- count=$(($LINE-${#sep}))
- for ((t=1; t<=count; t++)); do
- sep="$sep$FILL"
- done
- sep="$sep\n\n"
- if (( c == ${#CAT[@]} ))
- then towrite="$(echo $sep)*eo$(echo $typ)\n$sdown"
- else towrite="$(echo $sep)*eo$(echo $typ)\n$sdown$space"
- fi
- echo -ne "\tCreo $cat\t\t"
- echo -e "$towrite" >> "$1"
- if (( $? == "0" )); then
- echo -e "[OK]"
- else
- echo -e "[FAIL]"
- fi
- done
- _setFile "$1" "--nop"
- echo -e "aem> Cifratura di $ACCF..."
- _vdec "-c"
- echo -e "\naem> Selezionare:"
- echo -e "\t[n]\tavviare opzione -n di 'aem'\n\t[v]\tavviare editing manuale (vim)\n\taltro\tuscita"
- read -s -n1
- if [[ "$REPLY" == "n" ]]; then
- read -p " ? Categoria: "
- _new "$REPLY"
- elif [[ "$REPLY" == "v" ]]; then
- vim $ACCF
- fi
- rm "$ACCF"
- echo -e "aem> Elaborazione nuovo file terminata."
- exit 0
- }
- # Aggiunge una o piu' voci ad una categoria
- # ATTENZIONE: bug non fixati
- # es.: non sopporta il carattere '&' all'interno del testo
- # E' consigliato usare questa funzione solo per creare le prime voci per
- #+ seguirne lo schema, editando il resto a mano
- function _new() {
- declare -a acc
- declare -a user
- declare -a pass
- declare -a mail
- declare -a name
- declare -a reco
- declare -a var1
- declare -a var2
- declare -a var3
- cc="y"
- c=0
- _vcat $1
- echo -e "aem> Scrittura nuova/e riga/e su $ACCF. Immissione dati..."
- while [[ "$cc" == "y" ]];do
- some=1
- echo -e "\n\t\t[ $EXTMA ]\n\t- n° $((c+1)) -"
- read -p " ? Account: "
- if [[ "$REPLY" ]]; then
- ia="$REPLY"
- ia=${ia^^}
- read -p " ? Username: "
- if [[ "$REPLY" ]]; then
- iu="$REPLY"
- read -p " ? Password: "
- if [[ "$REPLY" ]]; then
- ip="$REPLY"
- read -p " ? Mail: "
- im="$REPLY"
- read -p " ? Name: "
- in="$REPLY"
- read -p " ? Recovery: "
- ir="$REPLY"
- read -p " ? Var1: "
- i1="$REPLY"
- read -p " ? Var2: "
- i2="$REPLY"
- read -p " ? Var3: "
- i3="$REPLY"
- prt="\nACCOUNT\t: $ia\nUSER\t: $iu\nPASSWORD: $ip\nMAIL\t: $im\nNAME\t: $in\n"
- prt=$prt"RECOVERY: $ir\nVAR1\t: $i1\nVAR2\t: $i2\nVAR3\t: $i3"
- echo -e "$prt"
- else
- some=
- fi
- else
- some=
- fi
- else
- some=
- fi
- if ((some)); then
- echo -ne "\tAccodo nel buffer di scrittura ([y] per confermare)? "
- read -s -n1
- echo
- if [[ "$REPLY" == "y" ]]; then
- acc[$c]=$ia; user[$c]=$iu; pass[$c]=$ip
- mail[$c]=$im; name[$c]=$in; reco[$c]=$ir
- var1[$c]=$i1; var2[$c]=$i2; var3[$c]=$i3
- else
- echo -e "aem> n° $((c+1)) deleted"
- ((c--))
- fi
- else
- ((c--))
- fi
- echo -ne "\tAltro account ([y] per confermare)? "
- read -s -n1 cc
- echo
- ((c++))
- done
- if ((c>0)); then
- echo -e "aem> Decifrazione file..."
- _vdec "$NULL"
- echo -e "aem> Procedo con la scrittura del buffer..."
- for (( t=0; t<c ; t++ )); do
- topr="$MATCH${acc[t]}\t${user[t]}\t${pass[t]}\t${mail[t]}\t${name[t]}\t${reco[t]}\t${var1[t]}\t${var2[t]}\t${var3[t]}\n"
- topr=$topr"\n*eo$TOVER"
- sed -i "s/^\*eo$TOVER$/$topr/" $ACCF
- done
- echo -e "\tAvviare editing manuale ([y] per confermare)?"
- read -s -n1
- if [[ "$REPLY" == "y" ]]; then
- vim $ACCF
- fi
- echo -e "aem> Cifratura di $ACCF..."
- _vdec "-c"
- rm "$ACCF"
- echo -e "aem> Scrittura nuovo/i account terminata."
- fi
- exit 0
- }
- # mostra la categoria scelta - versione breve
- function _cat() {
- _vcat $1
- _vdec "$NULL"
- txt="$(cat $ACCF)"
- txt=$(echo -e "$txt" | awk "/"$MATCH"/ {print}" | awk -F "\t" '{print $1"\t"$2"\t"$3}')
- tez="\t[ $EXTMA ]\n$txt"
- echo -e "$tez"
- rm "$ACCF"
- }
- # mostra la categoria scelta - versione completa
- function _catAll() {
- _vcat $1
- _vdec "$NULL"
- txt="$(cat $ACCF)"
- txt=$(echo -e "$txt" | awk "/"$MATCH"/ {print}")
- tez="\t[ $EXTMA ]\n$txt"
- echo -e "$tez"
- rm "$ACCF"
- }
- # copia direttamente nella clipboard la password della riga
- #> individuata tramite la matchexpr passata in argomento
- function _xtract() {
- if ! (( XC )); then
- _err "Funzione non disponibile" "7"
- fi
- _vdec "$NULL"
- txt="$(cat $ACCF)"
- txt=$(echo -e "$txt" | awk "/"$1"/ {print}")
- tez=$(echo -e "$txt" | awk -F "\t" '{print $1"\t"$2}')
- pas=$(echo -e "$txt" | awk -F "\t" '{print $3}')
- echo -e "$tez\t\e[1;36m$pas\e[m"
- echo -n "$pas" | xclip -selection c
- rm "$ACCF"
- }
- # ============================================================================ #
- # { MAIN }
- function _main() {
- if (( $#==0 )); then
- $DEF0
- elif (( $#==1 )); then
- _carg PAR1 $1
- $EXE $1
- elif (( $#==2 )); then
- _carg PAR2 $@
- $EXE $2
- else
- if [[ "$1" == "-f" ]]; then
- shift
- _setFile $@
- else
- _err "Numero di parametri errato" "8"
- fi
- fi
- }
- # ============================================================================ #
- # { ENTRY POINT }
- _cprg
- _main $@
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment