Se adapto el codigo para que funcione con los elementos de credentials

This commit is contained in:
2025-08-04 21:59:45 -06:00
parent e5efdd948d
commit 975fed6f81
3 changed files with 33 additions and 11 deletions

View File

@@ -253,6 +253,24 @@ class APIController:
""" """
return await self._make_request_async('PUT', f'customs/edocuments/{edocument_id}/', data=data) return await self._make_request_async('PUT', f'customs/edocuments/{edocument_id}/', data=data)
async def get_cer(self, id: str) -> Dict[str, Any]:
"""
Método para obtener un certificado específico desde la API.
Args:
id: UUID del certificado a consultar
"""
return await self._make_request_async('GET', f'vucem/vucem/{id}/download_cer/')
async def get_key(self, id: str) -> Dict[str, Any]:
"""
Método para obtener una llave específica desde la API.
Args:
id: UUID de la llave a consultar
"""
return await self._make_request_async('GET', f'vucem/vucem/{id}/download_key/')
async def _make_request_async(self, method: str, endpoint: str, data=None): async def _make_request_async(self, method: str, endpoint: str, data=None):
""" """
Método asíncrono para hacer peticiones a la API usando httpx. Método asíncrono para hacer peticiones a la API usando httpx.

View File

@@ -34,10 +34,6 @@ class Settings(BaseSettings):
ALGORITHM: str = "HS256" ALGORITHM: str = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
# cer key y contrasena uso temporal
KEY_PASSWORD: str = ""
CERT_PATH: str = ""
KEY_PATH: str = ""
model_config = {"env_file": ".env"} model_config = {"env_file": ".env"}

View File

@@ -24,10 +24,6 @@ logger = logging.getLogger(__name__)
from controllers.XMLController import xml_controller from controllers.XMLController import xml_controller
def load_cert_base64(cert_path: str) -> str:
with open(cert_path, 'rb') as cert_file:
cert_data = cert_file.read()
return base64.b64encode(cert_data).decode()
def sign_chain_original(key_path: str, password: str, cadena_original: str) -> str: def sign_chain_original(key_path: str, password: str, cadena_original: str) -> str:
with open(key_path, 'rb') as key_file: with open(key_path, 'rb') as key_file:
@@ -44,7 +40,6 @@ def sign_chain_original(key_path: str, password: str, cadena_original: str) -> s
return base64.b64encode(signature).decode() return base64.b64encode(signature).decode()
def validate_pedimento_data(response_service: Dict[str, Any], credenciales: Dict[str, Any]) -> tuple: # Testeado def validate_pedimento_data(response_service: Dict[str, Any], credenciales: Dict[str, Any]) -> tuple: # Testeado
""" """
Valida y extrae los datos necesarios para la petición SOAP. Valida y extrae los datos necesarios para la petición SOAP.
@@ -934,8 +929,21 @@ async def get_soap_cove(credenciales, response_service, soap_controller, cove, i
cadena_original = f"|{username}|{cove['numero_cove']}|" cadena_original = f"|{username}|{cove['numero_cove']}|"
# Obtener certificado base64 y firma # Obtener certificado base64 y firma
certificado = load_cert_base64(settings.CERT_PATH) cer = rest_controller.get_cer(credenciales['id'])
firma = sign_chain_original(settings.KEY_PATH, settings.KEY_PASSWORD, cadena_original) certificado = base64.b64encode(cer).decode('utf-8')
# Obtener la key como binario y guardarla en un archivo temporal
import tempfile
key_bytes = rest_controller.get_key(credenciales['id'])
with tempfile.NamedTemporaryFile(delete=False) as tmp_key_file:
tmp_key_file.write(key_bytes)
tmp_key_path = tmp_key_file.name
# Usar la ruta temporal para firmar
firma = sign_chain_original(tmp_key_path, credenciales['efirma'], cadena_original)
# Eliminar el archivo temporal después de firmar
os.remove(tmp_key_path)
logger.info(f"Datos para SOAP - Usuario: {username}, Aduana: {aduana}, Patente: {patente}, Pedimento: {pedimento}, Numero Operacion: {numero_operacion}") logger.info(f"Datos para SOAP - Usuario: {username}, Aduana: {aduana}, Patente: {patente}, Pedimento: {pedimento}, Numero Operacion: {numero_operacion}")