You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

520 lines
14 KiB

#
# Bash script
# author: Rodgger Bruno
#
# Sinopse:
# $ g_password [OPTION] ... -f=FILE
# $ g_password help
# $ g_password show_files
#
# -u=USER ( não funcional ainda )
# Qual pasta do usuário. Por default será usuário atual
# -e
# Editar o arquivo das senhas e os segundos que ficará aberto para editar
# -m=MODE
# O modo que irá parecer as senhas. O tipo 'term' (esse será por default) aparecerá
# pelo terminal e dialog aparecerá pelo programa dialog
# -s=segundos
# Quantos segundos as senhas ficará disponível.O padrão é 10 segundos
# -f=file
# Nome do arquivo que será descriptografado.
# help
# Aparecerá esse menu. Deve ser o primeiro parâmetro
# show_files
# Mostra os arquivos que podem ser descriptografado com a senha. Essa opção pode ser
# usada apenas com -u para mostrar os arquivos. Qual arquivo vai descriptografar.
# -c
# Essa opção apenas vai encriptar caso algo algum arquivo não criptografado de senhas.
# Essa opção poderá ser usada com -f para criptografar um arquivos com senha especifica. Essa opção vai
# pedir senha duas vezes confirmar a senha que será criptografada
# -n
# Novo arquivo de senhas. Essa opção vai aoenas mistrar um texto como deve proceder para encriptar
# arquivos com senhas
#
# $ g_password -u=user -e=15 -f=senhas_ssh.enc
#
#
re_number='^[0-9]+$' #regex verificar se é apenas número
re_file='^[a-zA-z0-9]+$' #regex verificar nome de arquivos
bin_install=$0
[[ $0 =~ .*install_g_password.* ]] && install=true || install=false
path_g_password="${HOME}/.g_password/"
verify_password=false
count_line=
#########################
## lista de argumentos ##
## será preenchido com ##
## com afunção ##
## verify_parameter ##
#########################
set_user=
set_edit=
set_edit_seconds=
set_seconds_plan=
set_plan=
set_file=
set_mode=
set_enc=
set_show_files=
set_help=
#código deste bloco https://stackoverflow.com/a/60132582
# Clears the entire current line regardless of terminal size.
# See the magic by running:
# { sleep 1; clear_this_line ; }&
clear_this_line(){
printf '\r'
cols="$(tput cols)"
for i in $(seq "$cols"); do
printf ' '
done
printf '\r'
}
# Erases the amount of lines specified.
# Usage: erase_lines [AMOUNT]
# See the magic by running:
# { sleep 1; erase_lines 2; }&
erase_lines(){
# Default line count to 1.
test -z "$1" && lines="1" || lines="$1"
# This is what we use to move the cursor to previous lines.
UP='\033[1A'
# Exit if erase count is zero.
[ "$lines" = 0 ] && return
# Erase.
if [ "$lines" = 1 ]; then
clear_this_line
else
lines=$((lines-1))
clear_this_line
for i in $(seq "$lines"); do
printf "$UP"
clear_this_line
done
fi
}
#----------------
function decrypt(){
if [[ ! -z $1 ]]
then
for to_encrypt in $1
do
if [[ $to_encrypt =~ .*".enc" ]]
then
openssl aes-256-cbc -d -iter 1000 -a -pass pass:$password -in "${to_encrypt}" -out "${to_encrypt}.dec" 2> /dev/null
if [[ $? -ne 0 ]]
then
rm -f "${to_encrypt}.dec"
echo "Senha incorreta para descriptografar"
exit
fi
count_line=$(wc -l < $to_encrypt.dec)
read_content=`cat $to_encrypt.dec`
rm $to_encrypt.dec
fi
done
else
return 1
fi
return 0
}
function verify_files(){
for to_encrypt in $1
do
point_extension=${#to_encrypt}
if [[ ${to_encrypt:$(($point_extension - 4)):$point_extension} != ".enc" ]]
then
echo "Encriptar arquivo $to_encrypt"
openssl aes-256-cbc -iter 1000 -a -pass pass:$password -in "$to_encrypt" -out "$to_encrypt.enc" 2> /dev/null
if [[ $? -ne 0 ]]
then
echo "Não foi possível encriptar $to_encrypt"
else
echo "encriptado"
fi
rm -f "$to_encrypt"
fi
done
}
function verify_installation(){
if [[ ! -d $path_g_password ]]
then
input_boolean "Instalar g_password 1 (s/n): " 1 echo s
if [[ $? -eq 0 ]]
then
intall_g_password
#echo "+ $?"
[[ $? -eq 0 ]] && echo "Instalação terminada.\n /usr/bin/g_password $?" && exit
echo "não foi possível instalar g_password - $?" && exit
fi
fi
if [[ ! -d ${path_g_password}/enc ]]
then
input_boolean "Instalar g_password 2 (s/n): " 1 echo s
if [[ $? -eq 0 ]]
then
intall_g_password
[[ $? -eq 0 ]] && echo "Instalação terminada.\n /usr/bin/g_password" && exit
echo "não foi possível instalar g_password" && exit
fi
fi
if [[ ! -f "/usr/bin/g_password" ]]
then
input_boolean "Instalar g_password (s/n): " 1 echo s
if [[ $? -eq 0 ]]
then
intall_g_password
[[ $? -eq 0 ]] && echo "Instalação terminada.\n /usr/bin/g_password" && exit
echo "não foi possível instalar g_password" && exit
fi
fi
}
## $1 (string) text para echo ou read -p
## $2 (integer) limitar o número de caracteres, -1 não limitar
## $3 () dar echo depois do input| Geralmente usado password noecho
## $4 valor true
## $5 valor false - sem valor no $5 se não for true sempre será false
function input_boolean(){
local boolean
while [ 1 ]
do
read -p "${1}" $( [[ $2 -ne -1 ]] && echo " -N $2 " || echo " ") $( [[ $3 == "noecho" ]] && echo " -s " || echo) boolean
echo
if [[ $4 =~ .*$boolean.* && ! -z $boolean ]]
then
return 0;
elif [[ ( $5 =~ .*$boolean.* && ! -z $boolean ) || -z $5 ]]
then
return 1;
fi
done
}
function intall_g_password(){
if [[ ! -d ~/.g_password/ ]]
then
[[ $(mkdir -p ~/.g_password/) -eq 0 ]] && : || return 1
fi
if [[ ! -d ~/.g_password/enc ]]
then
[[ $(mkdir -p ~/.g_password/enc) -eq 0 ]] && : || return 1
fi
if [[ ! -d ~/.g_password/dec ]]
then
[[ $(mkdir -p ~/.g_password/dec) -eq 0 ]] && : || return 1
fi
if [[ $install == "true" ]]
then
[[ $(cp "$bin_install" "/usr/bin/g_password") -eq 0 ]] && : || return 3
fi
return 0
}
function verify_parameter(){
# user definido. Atualmente não está válido
local bool_u=false
# editar
local bool_e=false
#modo
local bool_m=false
#segundo plan
local bool_s=false
# file decriptar
local bool_f=false
# help
local bool_h=false
# arquivos criptografados
local bool_sf=false
#encriptar arquivos
local bool_c=false
for option in $@
do
[[ $option == $0 ]] && continue
if [[ $option =~ ^-u=.* ]]
then
echo "Essa opção -u não é definida ainda." && exit
elif [[ $option =~ ^-e$ ]] ########## -e editar
then
bool_e=true
set_edit=true
set_edit_seconds=${option:3}
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -e" && exit
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com -e" && exit
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com -e" && exit
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -e" && exit
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -e" && exit
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com -e" && exit
elif [[ $option =~ ^-m=.* ]] ########## -m modo (term|dialog)
then
if [[ ${option:3} == "term" || ${option:3} == "dialog" ]]
then
bool_m=true
set_mode=${option:3}
else
echo -e "erro neste lugar \"${option}\" aceita apenas term e dialog.\nUse opção help para informação"
exit
fi
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -m" && exit
[[ $bool_e == true ]] && echo "Não é permitido usar o parâmetro -e com -m" && exit
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com -m" && exit
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com -m" && exit
elif [[ $option =~ ^-s=.* ]] ########## -s segundos
then
if [[ ${option:3} =~ $re_number ]]
then
bool_s=true
set_plan=true
set_seconds_plan=${option:3}
else
echo -e "erro neste lugar \"${option}\" aceita apenas número.\nUse opção help para informação"
exit
fi
[[ $bool_e == true ]] && echo "Não é permitido usar o parâmetro -e com -s" && exit
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -s" && exit
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -s" && exit
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -s" && exit
elif [[ $option =~ ^-f=.* ]]
then
if [[ ${option:3} =~ $re_file ]] ########## -f arquivo
then
bool_f=true
set_file=${option:3}
else
echo -e "erro neste lugar \"${option}\" deve ser apenas um nome e apenas a-z A-Z 0-9.\nUse opção help para informação"
fi
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -f" && exit
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -f" && exit
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -f" && exit
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com -f" && exit
elif [[ $option == "show_files" ]] ########## show_files mostrar os arquivos
then
bool_sf=true
set_show_files=true
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com show_files" && exit
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com show_files" && exit
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com show_files" && exit
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com show_files" && exit
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com show_files" && exit
elif [[ $option == "help" ]] ########## help texto de ajuda
then
bool_h=true
set_show_files=true
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com help" && exit
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com help" && exit
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com help" && exit
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com help" && exit
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com help" && exit
elif [[ $option =~ ^-c ]] ########## encriptar arquivos
then
bool_c=true
set_enc=true
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -c" && exit
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com -c" && exit
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com -c" && exit
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -c" && exit
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -c" && exit
else
echo -e "opção: \"${option}\" não reconhecida \n";exit
fi
done
if [[ $bool_e == false && $bool_sf == false && $bool_c == false ]]
then
[[ bool_f == false ]] && echo "Precisa definir qual arquivo (-f=) deve visualizar. Use show_files para ve-los" && exit
set_plan=true
fi
if [[ $bool_e == true && $bool_f == false ]]
then
echo "Falta -f para definir qual arquivo é necessário para editar" && exit
fi
if [[ $bool_c == true && $bool_f == false ]]
then
echo "Falta -f para definir qual arquivo é necessário para encriptar" && exit
fi
}
function show_option_new_file(){
echo "Esse opção está sendo mostra pois a opção -n foi ativada.";
echo "Deve colocar o arquivo com a senhas em texto plano em ~/.g_passowrd/dec/new_file";
echo "Depois ativar o programa \"g_password -c -f=new_file\" (sem -f vai encriptar todos com a mesma senha que estiver na pasta dec)";
echo "Depois esse arquivo vai estar na pasta enc com a extensão \".enc\" isso indica que o arquivo está criptografado";
echo "Terminado";
}
# return 1 editar arquivo de senhas
# return 2 show_files
# return 3 encriptar arquivos
# return 4 mostrar senha
function redirect(){
# Como o script vai executar
if [[ $set_edit == true ]]
then
return 1 #editar arquivo de senhas
elif [[ $set_enc == true ]]
then
return 2 #encriptar arquivos
else
return 3 #mostrar senha
fi
}
function show_files(){
list_file_enc=$(ls enc)
count_file_enc=$(ls enc |wc -l)
if [[ ${#list_file_enc} -gt 0 ]]
then
echo "Existe $count_file_enc arquivos encriptado:";
for file in enc/*
do
echo -e "\t${file:4}";
done
else
echo "Não existe arquivo com senhas criptografado"
fi
list_file_dec=$(ls dec)
count_file_dec=$(ls dec |wc -l)
if [[ ${#list_file_dec} -gt 0 ]]
then
echo "Existe $count_file_dec arquivos não encriptado:";
for file in dec/*
do
echo -e "\t${file:4}";
done
echo -e "\nUse opção \"-c -f=file\" para encriptar"
else
echo "Não existe arquivo com senhas sem criptografia"
fi
}
function encrypt(){
echo
}
verify_installation
verify_parameter $@
echo "Script básico em shell para não deixar as senhas em texto plano"
cd $path_g_password 2>> /dev/null
[[ $? -ne 0 ]] && echo "erro de acessar pastado software" && exit
#apenas mostrar files
[[ $set_show_files == true ]] && show_files && exit
echo -n "Password: "
read -s password
echo
if [[ $set_enc == true ]]
then
echo -n "Reescreve Password: "
read -s password2
[[ $password2 != $password ]] && echo "Não são iguais password" && exit
echo
fi
redirect #função e obtém o retorno
direct=$?
[[ $direct -eq 1 ]] && decrypt 1 #editar
[[ $direct -eq 2 ]] && encrypt 3 #encriptar
[[ $direct -eq 3 ]] && decrypt 4 #show_password
decrypt "$list_file"
verify_files "$list_file"
if [[ $1 != "term" ]]
then
dialog \
--keep-tite \
--title 'g_password' \
--msgbox "${read_content}" \
0 0
erase_lines 3
else
erase_lines 3
erase_line=$((${count_line}+1))
echo -e "${read_content}"
for pc in $(seq 0 1 10); do
echo -ne "\r\033[0K${pc}s" #contagem apagando linha atual e reescrevendo
sleep 1
done
erase_lines erase_line
fi