nam3nL0s

aem - Account Encrypt Manager

Aug 17th, 2016
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 14.29 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #   --------[ AEM - Account Encrypted Manager ]--------
  4. #
  5. # Semplice gestore di un file di testo criptato atto a contenere tutti gli
  6. #+  account internet dell'utente. AEM consente la decriptazione al volo
  7. #+  (tramite gpg) del file e la sua consultazione con varie opzioni.
  8. # Consente anche di creare uno scheletro di file ed aggiungere le informazioni
  9. #+  basilari di nuovi profili
  10.  
  11. # _________ Schema di una riga del file di account ________
  12. #
  13. # XX_NOME <TAB> username <TAB> password <TAB> mail <TAB> "real"_name <TAB> recovery <TAB> var1 <TAB> var2 <TAB> var3
  14. #
  15. # XX = codice di categoria
  16. # NOME = nome account - dovrebbe essere univoco per poterlo utilizzare nella funzione '-x'
  17. # username = lo user per il login
  18. # password = si capisce direi :D
  19. # mail = mail di riferimento/registrazione
  20. # real_name = nome personale di registrazione  che -dovrebbe- essere quello reale
  21. # recovery = pin, domanda/risposta d'emergenza, mail di ripristino, ecc...
  22.  
  23.  
  24.  
  25. # ============================================================================ #
  26. #           { Dichiarazione VARIABILI }
  27.  
  28. # Il file di riferimento - percorso completo SENZA estensione
  29. ACCF="/media/DATI/Docs/Account"
  30. ACCE="$(echo $ACCF).gpg"
  31.  
  32. # Categorie di account
  33. #   nome_completo=abbreviazione
  34. # usare solo caratteri alfanumerici!
  35. declare -a CAT
  36. CAT=(
  37.         BETTING=BE
  38.         CLOUD=CL
  39.         FORUM=FO
  40.         GMAIL=GM
  41.         LINUX=LX
  42.         OTHER_MAIL=OT
  43.         SERVICE=SE
  44.         SHOP=SH
  45.         SOCIAL=SO
  46.         SPAZIO_WEB=SW
  47.         TRADING=TR
  48.         VARIE=VV
  49.         NO_CLASS=ZZ
  50. )
  51.  
  52. # Impostazioni per i separatori dello skel
  53. FILL="="                            # filler separatore
  54. BORDL="["                           # bordatura sinistra del titolo
  55. BORDR="]"                           # bordatura destra
  56. TAB=8                               # numero di filler prima del titolo
  57. LINE=80                             # lunghezza della linea
  58. SPACE=5                             # righe vuote tra una cat. e l'altra
  59.  
  60. # parametri e funzioni
  61. declare -a PAR1 PAR2
  62. PAR1=(
  63.         -d:_deff
  64.         -h:_help
  65.         -l:_listCat
  66.         -v:_show
  67. )
  68. PAR2=(
  69.         -a:_catAll                 
  70.         -c:_cat
  71.         -d:_deff
  72.         -f:_setFile
  73.         -n:_new
  74.         -s:_skel
  75.         -x:_xtract
  76. )
  77.  
  78. # Comportamenti di default
  79. DEF0=_show                          # comportamento senza parametri
  80. DEF1=_cat                           # con singolo parametro (matchexpr)
  81.  
  82. # testi dell'help
  83. HOP="\n\e[1;34mOPTIONS#1\e[m\n"
  84. 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"
  85. HOP="$HOP""\t\e[1;34m-h\e[m\thelp\n\t\tmostra l'help esteso ed esce\n\n"
  86. 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"
  87. HOP="$HOP""\t\e[1;34m-v\e[m\tvisualizza\n\t\tdefault0: mostra l'intero file di account in output\n"
  88. HOP="$HOP""\n\e[1;34mOPTIONS#2\e[m\n"
  89. HOP="$HOP""\t\e[1;34m-a\e[m\tall\n\t\tvisualizzazione completa della categoria corrispondende al codice passato in argomento\n\n"
  90. 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"
  91. 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"
  92. 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"
  93. 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"
  94. HOP="$HOP""\t\e[1;34m-s\e[m\tskel\n\t\tcrea un nuovo file scheletro col pathname passato in argomento\n\n"
  95. 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"
  96. MHE="\n\e[1;34mNAME\e[m\n"
  97. MHE="$MHE""\taem - Account Encripted Manager\n"
  98. MHE="$MHE""\n\e[1;34mSYNOPSIS\e[m\n"
  99. MHE="$MHE""\taem\n"
  100. MHE="$MHE""\taem [OPTIONS#1]\n"
  101. MHE="$MHE""\taem [OPTIONS#2] {PARAM}\n"
  102. MHE="$MHE""\n\e[1;34mDESCRIPTION\e[m\n"
  103. MHE="$MHE""\tIl compito principale di 'aem' e' quello di rendere il piu' possibile semplice\n"
  104. MHE="$MHE""\ted immediato l'uso di un file di account cercando al contempo di garantire una\n"
  105. MHE="$MHE""\tsicurezza ragionevole.\n"
  106. MHE="$MHE""\tUtilizza '\e[1;33mgpg\e[m' per gestire la crittografia e '\e[1;33mxclip\e[m' per il caricamento delle\n"
  107. MHE="$MHE""\tpassword direttamente in memoria (opzione: \e[1;32m-x\e[m).\n"
  108. MHE="$MHE""\tL'esecuzione prevede due comportamenti di default, pensati per ridurre al minimo\n"
  109. MHE="$MHE""\tle immissioni dati da parte dell'utente:\n"
  110. MHE="$MHE""\t\tDEF0: comportamento quando si esegue il programma senza immettere\n"
  111. MHE="$MHE""\t\t      alcun argomento - visualizza tutto il file (opzione: \e[1;32m-v\e[m)\n"
  112. MHE="$MHE""\t\tDEF1: comportamento quando si esegue il programma immettendo un\n"
  113. MHE="$MHE""\t\t      solo argomento; in questo caso si puo' omettere l'opzione ed\n"
  114. MHE="$MHE""\t\t      inserire direttamente il parametro relativo - visualizzazione\n"
  115. MHE="$MHE""\t\t      sintetica della categoria in argomento (opzione: \e[1;32m-c\e[m)\n"
  116. MHE="$MHE""\n\e[1;34mNOTA\e[m\n"
  117. MHE="$MHE""\tI due comportamenti di default si possono cambiare variando le funzioni chiamate\n"
  118. MHE="$MHE""\tdalle costanti 'DEF0' e 'DEF1'\n"
  119. MHE="$MHE""$HOP"
  120.  
  121. # inizializzazioni varie
  122. XC=1
  123. MATCH=
  124. XTDMA=
  125. EXE=
  126. NULL=
  127.  
  128.  
  129.  
  130. # ============================================================================ #
  131. #           { Definizione FUNZIONI }
  132.  
  133. # help
  134. function _help() {
  135.     if [[ "$1" == "--opz" ]]; then
  136.         echo -e "$HOP"
  137.     else
  138.         echo -e "$MHE"
  139.     fi 
  140. }
  141.  
  142. # messaggio errore ed eventuale exit status
  143. function _err() {
  144.     mex="aem> ERR$2: "
  145.     mex="$mex$1"
  146.     echo -e "$mex" >&2
  147.     if [[ $2 != "0" ]]; then
  148.         exit $2
  149.     fi
  150. }
  151.  
  152. # verifica la presenza di tre requisiti:
  153. #   1. presenza di xclip
  154. #   2. presenza di gpg (indispensabile)
  155. #   3. esistenza del file di account (indispensabile)
  156. function _cprg() {
  157.     if [[ ! $(which xclip) ]]; then
  158.         XC=
  159.         _err "Manca il programma 'xclip' nel sistema: l'opzione '-x' non e' disponibile" "0"
  160.     fi
  161.     if [[ ! $(which gpg) ]]; then
  162.         _err "Manca 'gpg' nel sistema! AEM non e' eseguibile senza" "2"
  163.     fi
  164.     if [[ ! -f "$ACCE" ]]; then
  165.         _err "File di account non trovato!" "255"
  166.     fi
  167. }
  168.  
  169. # verifica che la categoria passata in argomento esista
  170. function _vcat() {
  171.     TOVER=${1^^}
  172.     for a in ${CAT[*]}; do
  173.         typ=$(echo "$a" | sed 's/^.*=//')
  174.         if [[ "$TOVER" == "$typ" ]]; then
  175.             MATCH="$TOVER""_"
  176.             EXTMA="$(echo "$a" | sed 's/=.*$//')"
  177.             return
  178.         fi
  179.     done
  180.     _err "Categoria non riconosciuta" "32"
  181. }
  182.  
  183. # controlla gli argomenti
  184. function _carg() {
  185.     err=1
  186.     opz="$2"
  187.     if (( $#==2 )); then
  188.         if [[ "${opz:0:1}" != "-" ]]; then
  189.             err=
  190.             EXE="$DEF1"
  191.         else
  192.             for a in ${PAR1[*]}; do
  193.                 par=$(echo "$a" | sed 's/:.*$//')
  194.                 exe=$(echo "$a" | sed 's/^.*://')
  195.                 if [[ "$opz" == "$par" ]]; then
  196.                     err=
  197.                     EXE="$exe"
  198.                 fi
  199.             done
  200.         fi
  201.     else
  202.         if [[ "${opz:0:1}" == "-" ]]; then
  203.             for a in ${PAR2[*]}; do
  204.                 par=$(echo "$a" | sed 's/:.*$//')
  205.                 exe=$(echo "$a" | sed 's/^.*://')
  206.                 if [[ "$opz" == "$par" ]]; then
  207.                     err=
  208.                     EXE="$exe"
  209.                 fi
  210.             done
  211.         fi
  212.     fi
  213.     if (( err )); then
  214.         _err "Parametri errati" "0"
  215.         _help --opz
  216.     exit 1
  217.     fi
  218. }
  219.  
  220. # richiama gpg in codifica/decodifica e ne verifica l'exit-status
  221. function _vdec() {
  222.     file="$ACCE"
  223.     if [[ $1 == "-c" ]]; then
  224.         file="$ACCF"
  225.     fi
  226.     gpg $1 "$file" 2>/dev/null
  227.     if (( $? != 0 )); then
  228.         _err "Errore nella decriptazione" "3"
  229.     fi
  230. }
  231.  
  232. # cambia il file di riferimento per la sessione corrente
  233. function _setFile() {
  234.     if [[ -f "$1" ]] || [[ -f "$1"".gpg" ]]
  235.         then
  236.             ACCF="$1"
  237.             ACCE="$(echo $ACCF).gpg"
  238.             if [[ "$2" == "--nop" ]]; then
  239.                 return
  240.             fi
  241.         else
  242.             _err "Il file che si tenta di impostare non esiste!" "19"
  243.     fi
  244.     shift
  245.     _main $@     
  246. }
  247.  
  248. # Se chiamato senza parametri mostra qual e' il file di default
  249. # Chiamato con un parametro=path_nome_file (senza estensione)
  250. #>   cambia il file di default in modo definitivo
  251. #>   esegue un backup (bk.aem) in caso di scrittura
  252. function _deff() {
  253.     echo -e "aem> File di default: $ACCF (con est.: $ACCE)"
  254.     if [[ "$1" ]]; then
  255.         if [[ -f "$1"".gpg" ]]; then
  256.             echo -ne "\tCambiarlo in $1 in modo permanente ([y] per confermare)?"
  257.             read -s -n1
  258.             echo
  259.             if [[ "$REPLY" == "y" ]]; then
  260.                 iam=$(which aem)
  261.                 cp "$iam" bk.aem
  262.                 sed -i "s/^ACCF=.*$/ACCF=\"$REPLY\"/" "$iam"
  263.                 echo "aem> Nuovo file di default $REPLY: impostato."
  264.             else
  265.                 echo "aem> Operazione interrotta."
  266.             fi
  267.         else
  268.             _err "Il file che si tenta di impostare non esiste!" "19"
  269.         fi
  270.     fi
  271. }
  272.  
  273. # Elenca le categorie disponibili
  274. function _listCat() {  
  275.     echo "aem> Categorie disponibili:"
  276.     echo -e "\t  - CAT -\t      - COD -"
  277.     for a in ${CAT[*]}; do
  278.         typ=$(echo "$a" | sed 's/^.*=//')
  279.         cat=$(echo "$a" | sed 's/=.*$//')
  280.         if (( ${#cat} < 8 ));then
  281.             tab="\t\t"
  282.         else
  283.             tab="\t"
  284.         fi
  285.         echo -e "\t$cat$tab<->\t$typ"
  286.     done
  287. }
  288.  
  289. # mostra tutto il file
  290. function _show() {
  291.     _vdec "-d"
  292. }
  293.  
  294. # crea il file scheletro
  295. function _skel() {
  296.     if [[ -f "$1" ]]; then
  297.         _err "Il file esiste su questo percorso" "0"
  298.         echo -ne "\tSovrascrivo ([y] per confermare)?"
  299.         read -s -n1  
  300.         echo
  301.         if [[ "$REPLY" != "y" ]]; then
  302.             echo -e "aem> Esecuzione interrotta."
  303.             return
  304.         fi
  305.     fi
  306.     echo -e "aem> Procedura nuovo modulo:"
  307.     echo -ne "\tInizializzo $1...\t"
  308.     : > $1
  309.     if (( $? == "0" )); then
  310.         echo -e "[OK]"
  311.     else
  312.         echo -e "[FAIL]"
  313.         return
  314.     fi
  315.     for ((t=1; t <= SPACE; t++)); do
  316.         space="$space\n"
  317.     done
  318.     c=0
  319.     for a in ${CAT[*]}; do
  320.         ((c++))
  321.         sep=""
  322.         sdown=""
  323.         cat=$(echo "$a" | sed "s/=.*$//")
  324.         typ=$(echo "$a" | sed 's/^.*=//')
  325.  
  326.         for ((t=1; t <= LINE; t++)); do
  327.             sdown="$sdown$FILL"
  328.         done
  329.         sdown="\n$sdown"
  330.         for ((t=1; t <= TAB; t++)); do
  331.             sep="$sep$FILL"
  332.         done
  333.         sep="$sep$BORDL $cat $BORDR"
  334.         count=$(($LINE-${#sep}))
  335.         for ((t=1; t<=count; t++)); do
  336.             sep="$sep$FILL"
  337.         done
  338.         sep="$sep\n\n"
  339.         if (( c == ${#CAT[@]} ))
  340.             then towrite="$(echo $sep)*eo$(echo $typ)\n$sdown"
  341.             else towrite="$(echo $sep)*eo$(echo $typ)\n$sdown$space"
  342.         fi
  343.         echo -ne "\tCreo $cat\t\t"
  344.         echo -e "$towrite" >> "$1"
  345.         if (( $? == "0" )); then
  346.             echo -e "[OK]"
  347.         else
  348.             echo -e "[FAIL]"
  349.         fi
  350.     done
  351.     _setFile "$1" "--nop"
  352.     echo -e "aem> Cifratura di $ACCF..."
  353.     _vdec "-c"
  354.     echo -e "\naem> Selezionare:"
  355.     echo -e "\t[n]\tavviare opzione -n di 'aem'\n\t[v]\tavviare editing manuale (vim)\n\taltro\tuscita"
  356.     read -s -n1
  357.     if [[ "$REPLY" == "n" ]]; then
  358.         read -p " ? Categoria: "
  359.         _new "$REPLY"
  360.     elif [[ "$REPLY" == "v" ]]; then
  361.         vim $ACCF
  362.     fi
  363.     rm "$ACCF"
  364.     echo -e "aem> Elaborazione nuovo file terminata."
  365.     exit 0
  366. }
  367.  
  368. # Aggiunge una o piu' voci ad una categoria
  369. # ATTENZIONE: bug non fixati
  370. # es.: non sopporta il carattere '&' all'interno del testo
  371. # E' consigliato usare questa funzione solo per creare le prime voci per
  372. #+  seguirne lo schema, editando il resto a mano
  373. function _new() {
  374.     declare -a acc
  375.     declare -a user
  376.     declare -a pass
  377.     declare -a mail
  378.     declare -a name
  379.     declare -a reco
  380.     declare -a var1
  381.     declare -a var2
  382.     declare -a var3
  383.     cc="y"
  384.     c=0
  385.     _vcat $1
  386.     echo -e "aem> Scrittura nuova/e riga/e su $ACCF. Immissione dati..."
  387.     while [[ "$cc" == "y" ]];do
  388.         some=1
  389.         echo -e "\n\t\t[ $EXTMA ]\n\t- n° $((c+1)) -"
  390.         read -p " ? Account: "
  391.         if [[ "$REPLY" ]]; then
  392.             ia="$REPLY"
  393.             ia=${ia^^}
  394.             read -p " ? Username: "
  395.             if [[ "$REPLY" ]]; then
  396.                 iu="$REPLY"
  397.                 read -p " ? Password: "
  398.                 if [[ "$REPLY" ]]; then
  399.                     ip="$REPLY"
  400.                     read -p " ? Mail: "
  401.                     im="$REPLY"
  402.                     read -p " ? Name: "
  403.                     in="$REPLY"
  404.                     read -p " ? Recovery: "
  405.                     ir="$REPLY"
  406.                     read -p " ? Var1: "
  407.                     i1="$REPLY"
  408.                     read -p " ? Var2: "
  409.                     i2="$REPLY"
  410.                     read -p " ? Var3: "
  411.                     i3="$REPLY"
  412.                     prt="\nACCOUNT\t: $ia\nUSER\t: $iu\nPASSWORD: $ip\nMAIL\t: $im\nNAME\t: $in\n"
  413.                     prt=$prt"RECOVERY: $ir\nVAR1\t: $i1\nVAR2\t: $i2\nVAR3\t: $i3"
  414.                     echo -e "$prt"
  415.                 else
  416.                     some=
  417.                 fi
  418.             else
  419.                 some=
  420.             fi
  421.         else
  422.             some=
  423.         fi
  424.         if ((some)); then
  425.             echo -ne "\tAccodo nel buffer di scrittura ([y] per confermare)? "
  426.             read -s -n1
  427.             echo
  428.             if [[ "$REPLY" == "y" ]]; then
  429.                 acc[$c]=$ia; user[$c]=$iu; pass[$c]=$ip
  430.                 mail[$c]=$im; name[$c]=$in; reco[$c]=$ir
  431.                 var1[$c]=$i1; var2[$c]=$i2; var3[$c]=$i3
  432.             else
  433.                 echo -e "aem> n° $((c+1)) deleted"
  434.                 ((c--))
  435.             fi
  436.         else
  437.             ((c--))
  438.         fi
  439.         echo -ne "\tAltro account ([y] per confermare)? "
  440.         read -s -n1 cc
  441.         echo
  442.         ((c++))
  443.     done
  444.     if ((c>0)); then
  445.         echo -e "aem> Decifrazione file..."
  446.         _vdec "$NULL"
  447.         echo -e "aem> Procedo con la scrittura del buffer..."
  448.         for (( t=0; t<c ; t++ )); do
  449.             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"
  450.             topr=$topr"\n*eo$TOVER"
  451.             sed -i "s/^\*eo$TOVER$/$topr/" $ACCF
  452.         done
  453.         echo -e "\tAvviare editing manuale ([y] per confermare)?"
  454.         read -s -n1
  455.         if [[ "$REPLY" == "y" ]]; then
  456.             vim $ACCF
  457.         fi
  458.         echo -e "aem> Cifratura di $ACCF..."
  459.         _vdec "-c"
  460.         rm "$ACCF"
  461.         echo -e "aem> Scrittura nuovo/i account terminata."
  462.     fi
  463.     exit 0
  464. }
  465.  
  466.  
  467. # mostra la categoria scelta - versione breve
  468. function _cat() {
  469.     _vcat $1
  470.     _vdec "$NULL"
  471.     txt="$(cat $ACCF)" 
  472.     txt=$(echo -e "$txt" | awk "/"$MATCH"/ {print}" | awk -F "\t" '{print $1"\t"$2"\t"$3}')
  473.     tez="\t[ $EXTMA ]\n$txt"
  474.     echo -e "$tez"
  475.     rm "$ACCF"
  476. }
  477.  
  478. # mostra la categoria scelta - versione completa
  479. function _catAll() {
  480.     _vcat $1
  481.     _vdec "$NULL"
  482.     txt="$(cat $ACCF)" 
  483.     txt=$(echo -e "$txt" | awk "/"$MATCH"/ {print}")
  484.     tez="\t[ $EXTMA ]\n$txt"
  485.     echo -e "$tez"
  486.     rm "$ACCF"
  487. }
  488.  
  489. # copia direttamente nella clipboard la password della riga
  490. #>  individuata tramite la matchexpr passata in argomento
  491. function _xtract() {
  492.     if ! (( XC )); then
  493.         _err "Funzione non disponibile" "7"
  494.     fi
  495.     _vdec "$NULL"
  496.     txt="$(cat $ACCF)"
  497.     txt=$(echo -e "$txt" | awk "/"$1"/ {print}")
  498.     tez=$(echo -e "$txt" | awk -F "\t" '{print $1"\t"$2}')
  499.     pas=$(echo -e "$txt" | awk -F "\t" '{print $3}')
  500.     echo -e "$tez\t\e[1;36m$pas\e[m"
  501.     echo -n "$pas" | xclip -selection c
  502.     rm "$ACCF"
  503. }
  504.  
  505.  
  506.  
  507. # ============================================================================ #
  508. #           { MAIN }
  509.  
  510. function _main() {
  511. if (( $#==0 )); then
  512.     $DEF0
  513. elif (( $#==1 )); then
  514.     _carg PAR1 $1
  515.     $EXE $1
  516. elif (( $#==2 )); then
  517.     _carg PAR2 $@
  518.     $EXE $2
  519. else
  520.     if [[ "$1" == "-f" ]]; then
  521.         shift
  522.         _setFile $@
  523.     else
  524.         _err "Numero di parametri errato" "8"
  525.     fi
  526. fi
  527. }
  528.  
  529.  
  530.  
  531. # ============================================================================ #
  532. #           { ENTRY POINT }
  533.  
  534. _cprg
  535. _main $@
  536.  
  537. exit 0
Advertisement
Add Comment
Please, Sign In to add comment