#!/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() { # Crear enlace simbólico a berg en la misma carpeta donde está berg local berg_path=$(which berg 2>/dev/null) if [ -z "$berg_path" ]; then echo "No se pudo encontrar la ubicación de berg" return 1 fi local berg_dir=$(dirname "$berg_path") # Crear enlace simbólico 'fj' que apunta a berg en la misma ubicación if [ -w "$berg_dir" ]; then # Si tenemos permisos de escritura, crear enlace global sudo ln -sf "$berg_path" "$berg_dir/fj" echo "Comando 'fj' creado (global)" else # Sin permisos, crear en .local/bin y actualizar PATH mkdir -p "$HOME/.local/bin" ln -sf "$berg_path" "$HOME/.local/bin/fj" # Añadir .local/bin temporalmente al PATH si no está if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then export PATH="$HOME/.local/bin:$PATH" echo "PATH actualizado temporalmente. Para uso permanente, añada a su .bashrc:" echo "export PATH=\"\$HOME/.local/bin:\$PATH\"" fi echo "Comando 'fj' creado (local)" fi } # Función para eliminar alias fj remove_fj_alias() { # Intentar eliminar enlaces simbólicos local berg_path=$(which berg 2>/dev/null) if [ -n "$berg_path" ]; then local berg_dir=$(dirname "$berg_path") # Eliminar enlace global si existe y tenemos permisos if [ -L "$berg_dir/fj" ] && [ -w "$berg_dir" ]; then sudo rm -f "$berg_dir/fj" fi fi # Eliminar enlace local if [ -L "$HOME/.local/bin/fj" ]; then rm -f "$HOME/.local/bin/fj" fi echo "Comando 'fj' eliminado" } # 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() { # Eliminar alias fj remove_fj_alias echo "Cerrando sesión de Forgejo..." berg auth logout -s local logout_status=$? if [ $logout_status -eq 0 ]; then echo "Sesión cerrada correctamente." else echo "Error al cerrar la sesión." exit 1 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 "$@"