#!/bin/bash #Script : cversion_token.sh #Apps : MRDEVS TOOLS #Description : Administrador de tokens para plataformas de control de versiones #Author : Cortana Rosero One #Company Email : cortana@rosero.one #Generated by : Claude Code (claude-3-7-sonnet-20250219) #Created : 2025/03/15 10:07:08 #Modified : 2025/03/19 11:57:08 #Version : 1.2.0 #Use Notes : #============================================================================== # Derechos de Autor [2025] [Mauro Rosero P. ] #============================================================================== # 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 . # Configuración inicial # Usar DEVELOPER_DIR de base.lib SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BIN_BASE="bin" BIN_LIBS="lib" BIN_MESG="msg" BIN_CFGS="config" # Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat") else DEVSPATH="devs" fi BIN_HOME="$HOME/$DEVSPATH" VERSION=$(cat "$BIN_HOME/$BIN_BASE/$BIN_CFGS/version") # CHECK SHELL LANGUAGE BIN_LANG=${LANG:0:2} # Importar bibliotecas necesarias source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/console.lib" source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/developers.lib" # Cargar mensajes en el idioma del sistema o español por defecto load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head" load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "console" load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers" title="${head_000} ${head_002}" apps_title="${cvmsg_000}" # Función para verificar si SOPS está instalado check_sops_installed() { if ! command -v sops &> /dev/null; then # Mostrar el error usando dialog con mensaje desde developers.es dialog_error_box "${head_error}" "${cvmsg_013}. ${cvmsg_014}" clear exit 1 fi } # Función para asegurar que el directorio .developer existe ensure_developers_dir() { if [ ! -d "$DEVELOPER_DIR" ]; then mkdir -p "$DEVELOPER_DIR" chmod 700 "$DEVELOPER_DIR" echo "${cvmsg_008} $DEVELOPER_DIR" fi } # Función para seleccionar la plataforma de control de versiones usando menu_actions select_platform() { # Preparar opciones para menu_actions local menu_options="1:${cvmsg_010}\n2:${cvmsg_011}\n3:${cvmsg_012}" # Usar menu_actions en lugar de dialog_input_menu local selection=$(menu_actions "${cvmsg_002}" "$menu_options" 9) # Verificar si hubo cancelación o error if [ "$selection" = "${head_key_end}" ]; then return 1 fi # Interpretar la selección case $selection in 1) echo "github" ;; 2) echo "gitlab" ;; 3) echo "forgejo" ;; *) return 1 ;; esac return 0 } # Función para solicitar y validar el token request_token() { local platform=$1 local platform_name="" local token="" case $platform in "github") platform_name="${cvmsg_010}" ;; "gitlab") platform_name="${cvmsg_011}" ;; "forgejo") platform_name="${cvmsg_012}" ;; esac # Bucle para validación de token usando funciones de console.lib while true; do # Usar dialog_input_pass de console.lib dialog_input_pass "${cvmsg_004} $platform_name" "${cvmsg_005}" # Verificar si el usuario canceló if [ $codex -ne 0 ]; then clear return 1 fi # Obtener token de la variable value establecida por dialog_input_pass token="$value" # Validar token if [ -z "$token" ]; then dialog_error_box "${head_error}" "${cvmsg_015}" continue fi # Verificar longitud (debería tener al menos 30 caracteres) if [ ${#token} -lt 30 ]; then dialog_error_box "${head_error}" "${cvmsg_016}" continue fi # Verificar formato (debería contener caracteres alfanuméricos y algunos especiales) if ! [[ "$token" =~ ^[A-Za-z0-9\#\-\_\.]+$ ]]; then dialog_error_box "${head_warning}" "${cvmsg_017}" fi # Token válido break done echo "$token" return 0 } # Función para guardar el token encriptado con SOPS save_token() { local platform=$1 local token=$2 local filename="${DEVELOPER_DIR}/${platform}.sops.yaml" local token_file="/tmp/vcs_token_$$" # Convertir token a base64 para mayor seguridad local token_base64=$(echo -n "$token" | base64) # Crear archivo temporal con el token en base64 echo "token: $token_base64" > "$token_file" # Encriptar el archivo con SOPS sops --encrypt "$token_file" > "$filename" local result=$? # Eliminar archivo temporal rm -f "$token_file" # Establecer permisos adecuados (solo lectura para el propietario) if [ $result -eq 0 ]; then chmod 600 "$filename" fi return $result } # Verificar si dialog está instalado check_dialog_installed() { if ! command -v dialog &> /dev/null; then echo "${head_001}" exit 1 fi } # Función principal main() { # Verificar requisitos check_dialog_installed check_sops_installed ensure_developers_dir # Seleccionar plataforma platform=$(select_platform) if [ $? -ne 0 ]; then clear exit 0 fi # Solicitar token token=$(request_token "$platform") if [ $? -ne 0 ]; then clear exit 0 fi # Guardar token save_token "$platform" "$token" if [ $? -eq 0 ]; then local platform_name="" case $platform in "github") platform_name="${cvmsg_010}" ;; "gitlab") platform_name="${cvmsg_011}" ;; "forgejo") platform_name="${cvmsg_012}" ;; esac dialog_error_box "${head_info}" "${cvmsg_006} $platform_name" else local platform_name="" case $platform in "github") platform_name="${cvmsg_010}" ;; "gitlab") platform_name="${cvmsg_011}" ;; "forgejo") platform_name="${cvmsg_012}" ;; esac dialog_error_box "${head_error}" "${cvmsg_007} $platform_name" fi clear } # Ejecutar función principal main