#!/bin/bash # # Script: fj_login.sh # Description: Script para autenticación con Forgejo usando tokens encriptados # Modified: 2025/03/15 # [Author] Cortana Rosero One # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) # # Derechos de Autor (C) [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 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 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/config/devspath.dat") else DEVSPATH="devs" fi BIN_HOME="$HOME/$DEVSPATH" BIN_BASE="bin" BIN_LIBS="lib" BIN_MESG="msg" # 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" # Cargar mensajes en el idioma del sistema o español por defecto load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head" # Variables globales title="${head_000} ${head_002}" # Función para verificar si berg está instalado check_berg_installed() { if ! command -v berg &> /dev/null; then echo "Error: berg (Forgejo CLI) no está instalado. Por favor, ejecute bin/fjcli_install.sh primero." exit 1 fi } # Función para verificar si SOPS está instalado check_sops_installed() { if ! command -v sops &> /dev/null; then echo "Error: SOPS no está instalado. Por favor, ejecute bin/bootstrap.sh para instalar las herramientas necesarias." exit 1 fi } # Función para extraer la URL base de Forgejo de la configuración de git get_forgejo_url() { # Intentar obtener URL desde la configuración global de git local remote_url=$(git config --get remote.origin.url 2>/dev/null) # Si no se encuentra en la configuración global, intentar buscar en el directorio actual if [ -z "$remote_url" ] && [ -d ".git" ]; then remote_url=$(git config --get remote.origin.url 2>/dev/null) fi # Si aún no tenemos URL, intentar buscar en algún repositorio de $HOME if [ -z "$remote_url" ]; then # Buscar repositorios en $HOME que podrían tener remotes de Forgejo for repo_dir in $(find $HOME -name ".git" -type d -maxdepth 3 2>/dev/null); do local repo_path=$(dirname "$repo_dir") cd "$repo_path" local url=$(git config --get remote.origin.url 2>/dev/null) if [[ "$url" == *"forgejo"* ]] || [[ "$url" == *"codeberg"* ]] || [[ "$url" == *"gitt.rosero"* ]]; then remote_url="$url" break fi done fi # Si encontramos una URL, extraer el dominio base if [ -n "$remote_url" ]; then # Eliminar protocolo (http:// o https://) local base_url=$(echo "$remote_url" | sed -E 's|^(https?://)?([^/]+).*|\2|') # Si el formato es usuario@dominio, extraer solo el dominio if [[ "$base_url" == *"@"* ]]; then base_url=$(echo "$base_url" | cut -d '@' -f2) fi # Devolver solo el dominio sin protocolo echo "$base_url" else # Si no se encontró ninguna URL, devolver una cadena vacía echo "" fi } # Función para crear alias fj para berg create_fj_alias() { alias fj=berg } # Función para eliminar alias fj remove_fj_alias() { unalias fj } # Función para iniciar sesión con token login() { # Verificar que el archivo de token encriptado existe if [ ! -f "${DEVELOPER_DIR}/forgejo.sops.yaml" ]; then echo "Error: No se encontró el archivo de token para Forgejo." echo "Por favor, ejecute bin/cversadm_token.sh para configurar el token primero." exit 1 fi # Decodificar el token de base64 local token=$(sops -d ${DEVELOPER_DIR}/forgejo.sops.yaml | grep -oP '(?<=token: ).*' | base64 -d) # Obtener la URL base de Forgejo local forgejo_url=$(get_forgejo_url) if [ -n "$forgejo_url" ]; then echo "Usando servidor Forgejo: $forgejo_url" export BERG_BASE_URL="$forgejo_url" else echo "ADVERTENCIA: No se pudo detectar automáticamente la URL de Forgejo." echo "Si la autenticación falla, establezca manualmente BERG_BASE_URL." fi # Iniciar sesión con berg echo "Iniciando sesión en Forgejo..." berg auth login -t "$token" local login_status=$? if [ $login_status -eq 0 ]; then echo "Sesión iniciada correctamente en Forgejo." # Crear alias fj para berg create_fj_alias else echo "Error al iniciar sesión en Forgejo. Por favor, verifique su token." exit 1 fi } # Función para cerrar sesión logout() { # Obtener la URL base de Forgejo local forgejo_url=$(get_forgejo_url) if [ -n "$forgejo_url" ]; then echo "Usando servidor Forgejo: $forgejo_url" export BERG_BASE_URL="$forgejo_url" fi # Primero eliminar alias fj remove_fj_alias echo "Cerrando sesión de Forgejo..." if ! berg auth status &>/dev/null; then echo "No hay sesión activa en Forgejo." else berg auth logout -s 2>/dev/null || true echo "Sesión cerrada." fi } # Función principal main() { # Verificar requisitos check_berg_installed check_sops_installed # Verificar parámetros if [ "$1" = "--logout" ]; then logout else login fi } # Ejecutar función principal con los parámetros recibidos main "$@"