licencias-minds3/leerlicencia3.py

127 lines
4.3 KiB
Python
Raw Normal View History

2024-06-24 07:25:49 -06:00
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)