devs/bin/lib/gpg.lib

188 lines
4.3 KiB
Bash

#!/bin/bash
#
# Library: gpg.lib
# Modified: 2024/12/09 08:20:00
# Derechos de Autor (C) [2024] [Mauro Rosero P. <mauro@roser.one>]
#
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
GPG_DEFAULT_PATH=$HOME/.gnupg
GPG_CONFIG_PATH=bin/config
GPG_TEMPLATE=gpg.config
GPG_CONFIG=gpg.conf
GPG_BACKUP_CFG=gpg.backup
GPGP_BACKUP_SECRET=gpg.secret
GPG_SUBKEY_ID=""
GPG_REVOKE_FILES="*.rev"
DB_GPG_PATH=$HOME/.gnupg
DB_GPG_FILE=$USER.db
DB_GPG_SUBKEYS_KEY="subkey_id"
DB_GPG_SUBKEYS="GPG_SUBKEYS"
SQL_GPG_SUBKEYS="${DB_GPG_SUBKEYS}.sql"
# Test library
function gpglib_test() {
echo "GPG Library loaded!"
exit 1
}
# Set gpg environment
function gpg_setting() {
local BIN_CONFIG=$1
local GPG_PATH=$2
local LOCAL_BACKUP=$3
local TIMESTAMP=$4
# Check if gpg directory path exists
if [ ! -d "${GPG_PATH}" ]
then
# Create gpg directory path
mkdir -p ${GPG_PATH}
if [ $? -ne 0 ]; then
return 2
fi
fi
# Check if gpg template file exists
if [ ! -f "${BIN_CONFIG}/${GPG_CFG_PATH}/${GPG_TEMPLATE}" ]
then
return 1
fi
if [ -d "${LOCAL_BACKUP}" ]
then
if [ -f "${GPG_PATH}/${GPG_CONFIG}" ]
then
# Destination file backup
local BACKUP_FILE="${LOCAL_BACKUP}/gpg_${TIMESTAMP}.bak"
cp -f "${GPG_PATH}/${GPG_CONFIG}" "${BACKUP_FILE}"
if [ $? -ne 0 ]; then
return 3
fi
fi
fi
# Copia el archivo de plantilla al destino
cp -f "${BIN_CONFIG}/${GPG_CFG_PATH}/${GPG_TEMPLATE}" "${GPG_PATH}/${GPG_CONFIG}"
return $?
}
# Generate token for backup file
function gpg_backup_token() {
local SECRET_FILE=$1
if [[ ! -e $archivo_token ]]
then
local BACKUP_TOKEN=$(uuidgen)
echo "$BACKUP_TOKEN" > "$SECRET_FILE"
chmod 600 "$SECRET_FILE"
fi
return 0
}
# Local backup of gpp keys
function gpg_backup() {
local DB_BACKUP=$1
local BIN_CONFIG=$2
local TIMESTAMP=$3
local GNUGP_PATH=$4
local rc=0
# Check if backup configuration file exists
if [ ! -f $BIN_CONFIG/$GPG_BACKUP_CFG ]
then
return 10
fi
local LOCAL_BACKUP=$HOME/$(cat < $BIN_CONFIG/$GPG_BACKUP_CFG)
# Check if backup path exist
if [ -z "$LOCAL_BACKUP" ]; then
return 11
fi
if [ ! -d "${LOCAL_BACKUP}" ]
then
mkdir -p "${LOCAL_BACKUP}"
rc=$?
if [ $rc -ne 0 ]; then
return $rc
fi
fi
gpg_backup_token "${LOCAL_BACKUP}/$GPGP_BACKUP_SECRET"
# Get secret backup
ZPASSWORD=$(cat < "${LOCAL_BACKUP}/$GPGP_BACKUP_SECRET")
if [ -z "${ZPASSWORD}" ]; then
return 13
fi
# Exportar el anillo de claves GPG a un archivo de respaldo temporal
local TMP_PATH=$(mktemp -d)
local TMP_FILE="gpg.bak"
gpg --export-options backup -o "${TMP_PATH}/${TMP_FILE}" --export
rc=$?
if [ $rc -ne 0 ]; then
rm -rf "${tmp_path}"
return $rc
fi
# Dump GPG_SUBKEYS table to SQL
local TMP_DB_DUMP="${SQL_GPG_SUBKEYS}"
local DB_DUMP="${TMP_PATH}/${TMP_DB_DUMP}"
sqlite_dump "${DB_BACKUP}" "${DB_DUMP}" "${DB_GPG_SUBKEYS}"
rc=$?
if [ ${rc} -ne 0 ]
then
rm -rf "${TMP_PATH}"
return $rc
fi
# Copiar los archivos de revocación
mkdir ${TMP_PATH}/gnugp
if [ $? -eq 0 ]; then
cp -rf $GNUGP_PATH/* ${TMP_PATH}/gnugp
rc=$?
if [ $rc -ne 0 ]
then
rm -rf "${TMP_PATH}"
return $rc
fi
fi
# Cambiar el directorio de trabajo a la carpeta temporal para poder hacer el empaquetamiento zip
cd "${TMP_PATH}"
# Comprimir el archivo de respaldo en un archivo ZIP protegido con contraseña
BACKUP_FILE="${LOCAL_BACKUP}/gpg_${USER}_${TIMESTAMP}"
zip -r -P "${ZPASSWORD}" $BACKUP_FILE *
rc=$?
if [ $rc -ne 0 ]
then
rm -rf "${TMP_PATH}"
return $rc
fi
rm -rf "${TMP_PATH}"
return 0
}