diff --git a/bin/forgejo_login.sh b/bin/forgejo_login.sh new file mode 100755 index 0000000..807b034 --- /dev/null +++ b/bin/forgejo_login.sh @@ -0,0 +1,189 @@ +#!/bin/bash +# +# Script: forgejo_login.sh +# Description: Script para autenticación con Forgejo usando tokens encriptados +# Created: 2025/03/19 11:57:08 +# Modified: 2025/03/19 15:47:08 +# [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)" +BIN_BASE="bin" +BIN_LIBS="lib" +BIN_MESG="msg" +BIN_CFGS="config" +VERSION=$(cat "$BIN_HOME/$BIN_BASE/$BIN_CFGS/version") + + +# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto +if [ -f "$SCRIPT_DIR/$BIN_CFGS/devspath.dat" ]; then + DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat") +else + DEVSPATH="devs" +fi +BIN_HOME="$HOME/$DEVSPATH" + + +# CHECK SHELL LANGUAGE +BIN_LANG=${LANG:0:2} + +# Importar bibliotecas necesarias +source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.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}" "developers" + +# Variables globales +title="${head_000} ${fgmsg_000}" + +# Función para verificar si berg está instalado +check_berg_installed() { + if ! command -v berg &> /dev/null; then + echo "${fgmsg_001} ${fgmsg_002}" + exit 1 + fi +} + +# Función para verificar si SOPS está instalado +check_sops_installed() { + if ! command -v sops &> /dev/null; then + echo "${fgmsg_003} ${fgmsg_004}" + 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 +} + +# Estas funciones han sido eliminadas, ya no se crean ni eliminan alias +# Los usuarios pueden crear su propio alias manualmente si lo desean + +# 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 "${fgmsg_005}" + echo "${fgmsg_006}" + 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 "${fgmsg_007} $forgejo_url" + export BERG_BASE_URL="$forgejo_url" + else + echo "${fgmsg_008}" + echo "${fgmsg_009}" + fi + + # Iniciar sesión con berg + echo "${fgmsg_010}" + berg auth login -t "$token" + local login_status=$? + + if [ $login_status -eq 0 ]; then + echo "${fgmsg_011}" + else + echo "${fgmsg_012}" + 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 "${fgmsg_007} $forgejo_url" + export BERG_BASE_URL="$forgejo_url" + fi + + # Ya no se eliminan alias + + echo "${fgmsg_013}" + if ! berg auth status &>/dev/null; then + echo "${fgmsg_014}" + else + berg auth logout -s 2>/dev/null || true + echo "${fgmsg_015}" + 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 "$@" diff --git a/bin/msg/developers.es b/bin/msg/developers.es index 5ea298c..6f43a74 100644 --- a/bin/msg/developers.es +++ b/bin/msg/developers.es @@ -94,3 +94,21 @@ fjmsg_012="¿Desea instalar Forgejo CLI?" fjmsg_013="Esta herramienta le permite administrar instancias de Forgejo desde línea de comandos." fjmsg_014="Instalación cancelada por el usuario." +# Mensajes para forgejo_login.sh +fgmsg_000="INICIO DE SESIÓN EN FORGEJO" +fgmsg_001="Error: berg (Forgejo CLI) no está instalado." +fgmsg_002="Por favor, ejecute ${BIN_HOME}/${BIN_BASE}/fjadmin_install.sh primero." +fgmsg_003="Error: SOPS no está instalado." +fgmsg_004="Por favor, ejecute bin/bootstrap.sh para instalar las herramientas necesarias." +fgmsg_005="Error: No se encontró el archivo de token para Forgejo." +fgmsg_006="Por favor, ejecute bin/cversadm_token.sh para configurar el token primero." +fgmsg_007="Usando servidor Forgejo:" +fgmsg_008="ADVERTENCIA: No se pudo detectar automáticamente la URL de Forgejo." +fgmsg_009="Si la autenticación falla, establezca manualmente BERG_BASE_URL." +fgmsg_010="Iniciando sesión en Forgejo..." +fgmsg_011="Sesión iniciada correctamente en Forgejo." +fgmsg_012="Error al iniciar sesión en Forgejo. Por favor, verifique su token." +fgmsg_013="Cerrando sesión de Forgejo..." +fgmsg_014="No hay sesión activa en Forgejo." +fgmsg_015="Sesión cerrada." +