#!/usr/bin/env ruby # script: candado.rb # Uso: ruby scripts/candado.rb [minutos] # Descripción: Genera un token de autorización temporal para que el Agente pueda ejecutar tareas críticas. # Requiere que el usuario tenga claves SSH cargadas (prueba de identidad). require 'json' require 'fileutils' TOKEN_FILE = File.expand_path('../../.agent_token', __dir__) DEFAULT_DURATION_MINS = 5 # 1. Validación de Identidad (Proof of User Presence) puts "🔐 Requerimiento de Protocolo: Autorización FRESCA." puts "🧹 Limpiando identidades previas en el agente SSH para exigir validación..." system("ssh-add -D > /dev/null 2>&1") # Borra claves cacheadas para forzar el prompt puts "🔑 Por favor, ingresa tu passphrase para autorizar al Agente:" # Intentamos cargar las claves interactivamente (ahora sí pedirá pass porque borramos las anteriores) system("ssh-add") # Verificamos que la carga haya sido exitosa system("ssh-add -l > /dev/null 2>&1") unless $?.success? puts "❌ ERROR: No se detectaron identidades SSH." puts " Debes completar el desafío de identidad (passphrase) para continuar." exit 1 end # 2. Generación del Token duration = (ARGV[0] || DEFAULT_DURATION_MINS).to_i expires_at = Time.now + (duration * 60) token_data = { created_at: Time.now.to_s, expires_at: expires_at.to_s, duration_mins: duration, authorized_by: ENV['USER'] || 'unknown', signature: rand(36**8).to_s(36) # Firma aleatoria simple } File.write(TOKEN_FILE, JSON.pretty_generate(token_data)) FileUtils.chmod(0600, TOKEN_FILE) # Solo lectura para el usuario puts "\n🔓 VACANCIA DE SEGURIDAD ACTIVADA" puts "--------------------------------" puts "✅ Agente AUTORIZADO para operaciones críticas." puts "⏳ Ventana de tiempo: #{duration} minutos." puts "💀 Expira: #{expires_at.strftime('%H:%M:%S')}" puts "🔑 Token: #{TOKEN_FILE}" puts "\n>> Ahora puedes pedirle al Agente que ejecute sus tareas."