127 lines
4.3 KiB
Python
127 lines
4.3 KiB
Python
|
import gnupg
|
||
|
import json
|
||
|
import pyodbc
|
||
|
import argparse
|
||
|
|
||
|
# Función para obtener conexión a MSSQL
|
||
|
def obtener_conexion():
|
||
|
return pyodbc.connect(
|
||
|
'DRIVER={ODBC Driver 18 for SQL Server};'
|
||
|
'SERVER=140.82.58.83,14338;'
|
||
|
'DATABASE=licencias;'
|
||
|
'UID=sa;'
|
||
|
'PWD=hG0eT6P9CDXQmbVQ3S4IHPX5drBMVxog;'
|
||
|
'TrustServerCertificate=yes'
|
||
|
)
|
||
|
|
||
|
def leer_descifrar_y_validar_licencia(archivo_licencia, ambiente_esperado):
|
||
|
# Inicializar GPG
|
||
|
gpg = gnupg.GPG()
|
||
|
|
||
|
try:
|
||
|
# Leer el archivo cifrado
|
||
|
with open(archivo_licencia, 'rb') as f:
|
||
|
contenido_cifrado = f.read()
|
||
|
|
||
|
# Descifrar los datos usando la clave privada de la YubiKey
|
||
|
descifrado = gpg.decrypt(contenido_cifrado, passphrase='172999')
|
||
|
|
||
|
if not descifrado.ok:
|
||
|
print(f"Error al descifrar los datos: {descifrado.status}")
|
||
|
return
|
||
|
|
||
|
print("Licencia descifrada correctamente.")
|
||
|
|
||
|
# Verificar la firma de los datos
|
||
|
verificacion = gpg.verify(descifrado.data)
|
||
|
|
||
|
if verificacion.valid:
|
||
|
print("La firma de la licencia es válida.")
|
||
|
else:
|
||
|
print("La firma de la licencia no es válida.")
|
||
|
print(f"Detalles de la verificación de la firma: {verificacion.stderr}")
|
||
|
return
|
||
|
|
||
|
# Extraer los datos JSON de la parte firmada
|
||
|
datos_firmados = descifrado.data.decode('utf-8')
|
||
|
|
||
|
# Buscar el comienzo del JSON real (después de los encabezados PGP)
|
||
|
json_inicio = datos_firmados.find("{")
|
||
|
json_final = datos_firmados.rfind("}")
|
||
|
|
||
|
if json_inicio == -1 or json_final == -1:
|
||
|
print("No se pudo encontrar el bloque JSON en los datos firmados.")
|
||
|
return
|
||
|
|
||
|
# Extraer el bloque JSON
|
||
|
datos_licencia_json = datos_firmados[json_inicio:json_final + 1]
|
||
|
|
||
|
# Convertir el JSON a un diccionario de Python
|
||
|
datos_licencia = json.loads(datos_licencia_json)
|
||
|
|
||
|
print("Datos de la licencia:")
|
||
|
print(datos_licencia)
|
||
|
|
||
|
# Verificar los datos contra la base de datos
|
||
|
if verificar_datos_contra_bd(datos_licencia):
|
||
|
print("La licencia es válida y coincide con los datos en la base de datos.")
|
||
|
|
||
|
# Verificar el tipo de ambiente
|
||
|
if datos_licencia.get('environment') == ambiente_esperado:
|
||
|
print(f"La licencia es válida para el ambiente '{ambiente_esperado}'.")
|
||
|
else:
|
||
|
print(f"La licencia no es válida para el ambiente '{ambiente_esperado}'. Encontrado: {datos_licencia.get('environment')}")
|
||
|
else:
|
||
|
print("La licencia no coincide con los datos almacenados en la base de datos.")
|
||
|
|
||
|
except Exception as e:
|
||
|
print(f"Error al leer, descifrar y validar la licencia: {str(e)}")
|
||
|
|
||
|
def verificar_datos_contra_bd(datos_licencia):
|
||
|
try:
|
||
|
# Conectar a la base de datos MSSQL
|
||
|
conn = obtener_conexion()
|
||
|
cursor = conn.cursor()
|
||
|
|
||
|
# Consultar los datos de la licencia en la base de datos
|
||
|
cursor.execute('''
|
||
|
SELECT * FROM licencias
|
||
|
WHERE software = ?
|
||
|
AND version = ?
|
||
|
AND license_key = ?
|
||
|
AND expiry_date = ?
|
||
|
AND licensed_to = ?
|
||
|
AND environment = ?
|
||
|
''', (
|
||
|
datos_licencia['software'],
|
||
|
datos_licencia['version'],
|
||
|
datos_licencia['license_key'],
|
||
|
datos_licencia['expiry_date'],
|
||
|
datos_licencia['licensed_to'],
|
||
|
datos_licencia['environment']
|
||
|
))
|
||
|
|
||
|
# Obtener el resultado de la consulta
|
||
|
resultado = cursor.fetchone()
|
||
|
conn.close()
|
||
|
|
||
|
# Verificar si se encontraron coincidencias
|
||
|
return resultado is not None
|
||
|
|
||
|
except pyodbc.Error as e:
|
||
|
print(f"Error al verificar la licencia en la base de datos: {str(e)}")
|
||
|
return False
|
||
|
|
||
|
# Configuración del analizador de argumentos
|
||
|
parser = argparse.ArgumentParser(description='Leer, descifrar y validar una licencia.')
|
||
|
parser.add_argument('archivo_licencia', type=str, help='Ruta del archivo de licencia cifrado')
|
||
|
parser.add_argument('ambiente', type=str, choices=['QA', 'Production'], help='Ambiente esperado de la licencia')
|
||
|
|
||
|
# Parsear los argumentos
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
# Llamar a la función para leer, descifrar y validar la licencia
|
||
|
leer_descifrar_y_validar_licencia(args.archivo_licencia, args.ambiente)
|
||
|
|
||
|
|