fix(WIP): Reemplazando OpenSsl.crypto,pkcs12

This commit is contained in:
sinergia 2024-08-06 16:41:14 -05:00
parent a3d2176068
commit d061077b30
3 changed files with 89 additions and 56 deletions

View File

@ -8,13 +8,15 @@ import xades
from datetime import datetime from datetime import datetime
import OpenSSL import OpenSSL
import zipfile import zipfile
import warnings # import warnings
import hashlib import hashlib
from contextlib import contextmanager from contextlib import contextmanager
from .data.dian import codelist from .data.dian import codelist
from . import form from . import form
from collections import defaultdict from collections import defaultdict
from pathlib import Path # from pathlib import Path
from cryptography.hazmat.primitives.serialization import pkcs12
AMBIENTE_PRUEBAS = codelist.TipoAmbiente.by_name('Pruebas')['code'] AMBIENTE_PRUEBAS = codelist.TipoAmbiente.by_name('Pruebas')['code']
AMBIENTE_PRODUCCION = codelist.TipoAmbiente.by_name('Producción')['code'] AMBIENTE_PRODUCCION = codelist.TipoAmbiente.by_name('Producción')['code']
@ -68,11 +70,11 @@ NAMESPACES = {
} }
def fe_from_string(document: str) -> FachoXML: def fe_from_string(document: str) -> FachoXML:
return FeXML.from_string(document) return FeXML.from_string(document)
from contextlib import contextmanager
# from contextlib import contextmanager
@contextmanager @contextmanager
def mock_xades_policy(): def mock_xades_policy():
from mock import patch from mock import patch
@ -118,7 +120,6 @@ class FeXML(FachoXML):
class DianXMLExtensionCUDFE(FachoXMLExtension): class DianXMLExtensionCUDFE(FachoXMLExtension):
def __init__(self, invoice, tipo_ambiente=AMBIENTE_PRUEBAS): def __init__(self, invoice, tipo_ambiente=AMBIENTE_PRUEBAS):
self.tipo_ambiente = tipo_ambiente self.tipo_ambiente = tipo_ambiente
self.invoice = invoice self.invoice = invoice
@ -351,7 +352,6 @@ class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension):
class DianXMLExtensionSigner: class DianXMLExtensionSigner:
def __init__(self, pkcs12_path, passphrase=None, localpolicy=True): def __init__(self, pkcs12_path, passphrase=None, localpolicy=True):
self._pkcs12_data = open(pkcs12_path, 'rb').read() self._pkcs12_data = open(pkcs12_path, 'rb').read()
self._passphrase = None self._passphrase = None
@ -362,7 +362,6 @@ class DianXMLExtensionSigner:
@classmethod @classmethod
def from_bytes(cls, data, passphrase=None, localpolicy=True): def from_bytes(cls, data, passphrase=None, localpolicy=True):
self = cls.__new__(cls) self = cls.__new__(cls)
self._pkcs12_data = data self._pkcs12_data = data
self._passphrase = None self._passphrase = None
self._localpolicy = localpolicy self._localpolicy = localpolicy
@ -394,7 +393,6 @@ class DianXMLExtensionSigner:
) )
xml.append(signature) xml.append(signature)
ref = xmlsig.template.add_reference( ref = xmlsig.template.add_reference(
signature, xmlsig.constants.TransformSha256, uri="", name="xmldsig-%s-ref0" % (id_uuid) signature, xmlsig.constants.TransformSha256, uri="", name="xmldsig-%s-ref0" % (id_uuid)
) )
@ -428,9 +426,13 @@ class DianXMLExtensionSigner:
POLICY_NAME, POLICY_NAME,
xmlsig.constants.TransformSha256) xmlsig.constants.TransformSha256)
ctx = xades.XAdESContext(policy) ctx = xades.XAdESContext(policy)
ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(self._pkcs12_data, ctx.load_pkcs12(pkcs12.load_key_and_certificates(
self._pkcs12_data,
self._passphrase)) self._passphrase))
# ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(
# self._pkcs12_data,
# self._passphrase))
if self._localpolicy: if self._localpolicy:
with mock_xades_policy(): with mock_xades_policy():
ctx.sign(signature) ctx.sign(signature)

View File

@ -136,21 +136,30 @@ def test_invoice_totals(simple_invoice_without_lines):
form.TaxSubTotal( form.TaxSubTotal(
scheme=form.TaxScheme('01'), scheme=form.TaxScheme('01'),
percent=19.0 percent=19.0
)]) )]),
withholding=form.WithholdingTaxTotal(
subtotals=[])
)) ))
simple_invoice.calculate() simple_invoice.calculate()
assert 1 == len(simple_invoice.invoice_lines) assert 1 == len(simple_invoice.invoice_lines)
assert form.Amount(1_500_000) == simple_invoice.invoice_legal_monetary_total.line_extension_amount assert form.Amount(1_500_000) == (
assert form.Amount(1_785_000) == simple_invoice.invoice_legal_monetary_total.payable_amount simple_invoice.invoice_legal_monetary_total.line_extension_amount)
assert form.Amount(1_785_000) == (
simple_invoice.invoice_legal_monetary_total.payable_amount)
def test_invoice_cufe(simple_invoice_without_lines): def test_invoice_cufe(simple_invoice_without_lines):
simple_invoice = simple_invoice_without_lines simple_invoice = simple_invoice_without_lines
simple_invoice.invoice_ident = '323200000129' simple_invoice.invoice_ident = '323200000129'
simple_invoice.invoice_issue = datetime.strptime('2019-01-16 10:53:10-05:00', '%Y-%m-%d %H:%M:%S%z') simple_invoice.invoice_issue = datetime.strptime(
simple_invoice.invoice_supplier.ident = form.PartyIdentification('700085371', '5', '31') '2019-01-16 10:53:10-05:00', '%Y-%m-%d %H:%M:%S%z')
simple_invoice.invoice_customer.ident = form.PartyIdentification('800199436', '5', '31') simple_invoice.invoice_supplier.ident = form.PartyIdentification(
'700085371', '5', '31')
simple_invoice.invoice_customer.ident = form.PartyIdentification(
'800199436', '5', '31')
simple_invoice.add_invoice_line(form.InvoiceLine( simple_invoice.add_invoice_line(form.InvoiceLine(
quantity = form.Quantity(1.00, '94'), quantity=form.Quantity(
1.00, '94'),
description='producto', description='producto',
item=form.StandardItem(111), item=form.StandardItem(111),
price=form.Price(form.Amount(1_500_000), '01', ''), price=form.Price(form.Amount(1_500_000), '01', ''),
@ -159,7 +168,9 @@ def test_invoice_cufe(simple_invoice_without_lines):
form.TaxSubTotal( form.TaxSubTotal(
scheme=form.TaxScheme('01'), scheme=form.TaxScheme('01'),
percent=19.0 percent=19.0
)]) )]),
withholding=form.WithholdingTaxTotal(
subtotals=[])
)) ))
simple_invoice.calculate() simple_invoice.calculate()
@ -171,34 +182,49 @@ def test_invoice_cufe(simple_invoice_without_lines):
clave_tecnica='693ff6f2a553c3646a063436fd4dd9ded0311471' clave_tecnica='693ff6f2a553c3646a063436fd4dd9ded0311471'
) )
formatVars = cufe_extension.formatVars() formatVars = cufe_extension.formatVars()
# NumFac # NumFac
assert formatVars[0] == '323200000129', "NumFac" assert formatVars[0] == '323200000129', "NumFac"
# FecFac # FecFac
assert formatVars[1] == '2019-01-16', "FecFac" assert formatVars[1] == '2019-01-16', "FecFac"
# HoraFac # HoraFac
assert formatVars[2] == '10:53:10-05:00', "HoraFac" assert formatVars[2] == '10:53:10-05:00', "HoraFac"
# ValorBruto # ValorBruto
assert formatVars[3] == '1500000.00', "ValorBruto" assert formatVars[3] == '1500000.00', "ValorBruto"
# CodImpuesto1 # CodImpuesto1
assert formatVars[4] == '01', "CodImpuesto1" assert formatVars[4] == '01', "CodImpuesto1"
# ValorImpuesto1 # ValorImpuesto1
assert formatVars[5] == '285000.00', "ValorImpuesto1" assert formatVars[5] == '285000.00', "ValorImpuesto1"
# CodImpuesto2 # CodImpuesto2
assert formatVars[6] == '04', "CodImpuesto2" assert formatVars[6] == '04', "CodImpuesto2"
# ValorImpuesto2 # ValorImpuesto2
assert formatVars[7] == '0.00', "ValorImpuesto2" assert formatVars[7] == '0.00', "ValorImpuesto2"
# CodImpuesto3 # CodImpuesto3
assert formatVars[8] == '03', "CodImpuesto3" assert formatVars[8] == '03', "CodImpuesto3"
# ValorImpuesto3 # ValorImpuesto3
assert formatVars[9] == '0.00', "ValorImpuesto3" assert formatVars[9] == '0.00', "ValorImpuesto3"
# ValTotFac # ValTotFac
assert formatVars[10] == '1785000.00', "ValTotFac" assert formatVars[10] == '1785000.00', "ValTotFac"
# NitOFE # NitOFE
assert formatVars[11] == '700085371', "NitOFE" assert formatVars[11] == '700085371', "NitOFE"
# NumAdq # NumAdq
assert formatVars[12] == '800199436', "NumAdq" assert formatVars[12] == '800199436', "NumAdq"
# ClTec # ClTec
assert formatVars[13] == '693ff6f2a553c3646a063436fd4dd9ded0311471', "ClTec" assert formatVars[13] == '693ff6f2a553c3646a063436fd4dd9ded0311471', "ClTec"
# TipoAmbiente # TipoAmbiente
assert formatVars[14] == '1', "TipoAmbiente" assert formatVars[14] == '1', "TipoAmbiente"
@ -229,7 +255,9 @@ def test_credit_note_cude(simple_credit_note_without_lines):
form.TaxSubTotal( form.TaxSubTotal(
scheme=form.TaxScheme('01'), scheme=form.TaxScheme('01'),
percent=19.0 percent=19.0
)]) )]),
withholding=form.WithholdingTaxTotal(
subtotals=[])
)) ))
simple_invoice.calculate() simple_invoice.calculate()

View File

@ -62,6 +62,8 @@ def test_allowance_charge_in_invoice(simple_invoice_without_lines):
form.TaxSubTotal( form.TaxSubTotal(
percent=19.0, percent=19.0,
)]), )]),
withholding=form.WithholdingTaxTotal(
subtotals=[])
)) ))
inv.add_allowance_charge(form.AllowanceCharge(amount=form.Amount(19.0))) inv.add_allowance_charge(form.AllowanceCharge(amount=form.Amount(19.0)))
@ -92,8 +94,9 @@ def test_allowance_charge_in_invoice_line(simple_invoice_without_lines):
subtotals=[ subtotals=[
form.TaxSubTotal( form.TaxSubTotal(
percent=19.0, percent=19.0,
)] )]),
), withholding=form.WithholdingTaxTotal(
subtotals=[]),
allowance_charge=[ allowance_charge=[
form.AllowanceChargeAsDiscount(amount=form.Amount(10.0)) form.AllowanceChargeAsDiscount(amount=form.Amount(10.0))
] ]