From 417de535f3fae265cdcff536cbc40ba9b5b5730d Mon Sep 17 00:00:00 2001 From: bit4bit Date: Sat, 12 Feb 2022 00:37:30 +0000 Subject: [PATCH] se usa POLICY_ID desde archivo local, actualizacion de commit [47fd230ff9] FossilOrigin-Name: 190ab3228ef9e3fbfb4210ae74a8e332cf0aa9d6a0d476e561164bd76ae772f0 --- facho/cli.py | 4 ++-- facho/fe/fe.py | 20 ++++++++++---------- facho/fe/form_xml/utils.py | 2 +- facho/fe/nomina/__init__.py | 4 ++-- setup.py | 5 ++++- tests/helpers.py | 9 --------- tests/test_fe.py | 18 ++++-------------- tests/test_fe_form.py | 5 +---- tests/test_nomina.py | 4 +--- 9 files changed, 25 insertions(+), 46 deletions(-) diff --git a/facho/cli.py b/facho/cli.py index b0af21e..8db2710 100644 --- a/facho/cli.py +++ b/facho/cli.py @@ -227,7 +227,7 @@ def sign_xml(private_key, passphrase, xmlfile, ssl=True, use_cache_policy=False, if use_cache_policy: warnings.warn("xades using cache policy") - signer = fe.DianXMLExtensionSigner(private_key, passphrase=passphrase, mockpolicy=use_cache_policy) + signer = fe.DianXMLExtensionSigner(private_key, passphrase=passphrase, localpolicy=use_cache_policy) document = open(xmlfile, 'r').read().encode('utf-8') with open(output, 'w') as f: f.write(signer.sign_xml_string(document)) @@ -358,7 +358,7 @@ def sign_verify_xml(private_key, passphrase, xmlfile, ssl=True, use_cache_policy warnings.warn("xades using cache policy") print("THIS ONLY WORKS FOR DOCUMENTS GENERATE WITH FACHO") - signer = fe.DianXMLExtensionSignerVerifier(private_key, passphrase=passphrase, mockpolicy=use_cache_policy) + signer = fe.DianXMLExtensionSignerVerifier(private_key, passphrase=passphrase, localpolicy=use_cache_policy) document = open(xmlfile, 'r').read().encode('utf-8') if signer.verify_string(document): diff --git a/facho/fe/fe.py b/facho/fe/fe.py index d082b39..902f875 100644 --- a/facho/fe/fe.py +++ b/facho/fe/fe.py @@ -26,9 +26,8 @@ SCHEME_AGENCY_ATTRS = { } -pwd = Path(__file__).parent # RESOLUCION 0001: pagina 516 -POLICY_ID = 'file://'+str(pwd)+'/data/dian/politicadefirmav2.pdf' +POLICY_ID = 'https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf' POLICY_NAME = u'Política de firma para facturas electrónicas de la República de Colombia.' @@ -62,6 +61,7 @@ def mock_xades_policy(): with patch('xades.policy.urllib.urlopen') as mock: class UrllibPolicyMock: def read(self): + # Usamos contenido de archivo local cur_dir = os.path.dirname(os.path.abspath(__file__)) data_dir = os.path.join(cur_dir, 'data', 'dian') policy_file = os.path.join(data_dir, 'politicadefirmav2.pdf') @@ -281,20 +281,20 @@ class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension): class DianXMLExtensionSigner: - def __init__(self, pkcs12_path, passphrase=None, mockpolicy=False): + def __init__(self, pkcs12_path, passphrase=None, localpolicy=True): self._pkcs12_data = open(pkcs12_path, 'rb').read() self._passphrase = None - self._mockpolicy = mockpolicy + self._localpolicy = localpolicy if passphrase: self._passphrase = passphrase.encode('utf-8') @classmethod - def from_bytes(cls, data, passphrase=None, mockpolicy=False): + def from_bytes(cls, data, passphrase=None, localpolicy=True): self = cls.__new__(cls) self._pkcs12_data = data self._passphrase = None - self._mockpolicy = mockpolicy + self._localpolicy = localpolicy if passphrase: self._passphrase = passphrase.encode('utf-8') @@ -360,7 +360,7 @@ class DianXMLExtensionSigner: ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(self._pkcs12_data, self._passphrase)) - if self._mockpolicy: + if self._localpolicy: with mock_xades_policy(): ctx.sign(signature) ctx.verify(signature) @@ -480,10 +480,10 @@ class DianZIP: class DianXMLExtensionSignerVerifier: - def __init__(self, pkcs12_path_or_bytes, passphrase=None, mockpolicy=False): + def __init__(self, pkcs12_path_or_bytes, passphrase=None, localpolicy=True): self._pkcs12_path_or_bytes = pkcs12_path_or_bytes self._passphrase = None - self._mockpolicy = mockpolicy + self._localpolicy = localpolicy if passphrase: self._passphrase = passphrase.encode('utf-8') @@ -508,7 +508,7 @@ class DianXMLExtensionSignerVerifier: ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(pkcs12_data, self._passphrase)) try: - if self._mockpolicy: + if self._localpolicy: with mock_xades_policy(): ctx.verify(signature) else: diff --git a/facho/fe/form_xml/utils.py b/facho/fe/form_xml/utils.py index 5aa919c..c05c3d4 100644 --- a/facho/fe/form_xml/utils.py +++ b/facho/fe/form_xml/utils.py @@ -13,7 +13,7 @@ def DIANWriteSigned(xml, filename, private_key, passphrase, use_cache_policy=Fal if dian_signer is None: dian_signer = fe.DianXMLExtensionSigner - signer = dian_signer(private_key, passphrase=passphrase, mockpolicy=use_cache_policy) + signer = dian_signer(private_key, passphrase=passphrase, localpolicy=use_cache_policy) with open(filename, 'w') as f: f.write(signer.sign_xml_string(document)) diff --git a/facho/fe/nomina/__init__.py b/facho/fe/nomina/__init__.py index 91d415d..1137529 100644 --- a/facho/fe/nomina/__init__.py +++ b/facho/fe/nomina/__init__.py @@ -284,8 +284,8 @@ class InformacionGeneral: class DianXMLExtensionSigner(fe.DianXMLExtensionSigner): - def __init__(self, pkcs12_path, passphrase=None, mockpolicy=False): - super().__init__(pkcs12_path, passphrase=passphrase, mockpolicy=mockpolicy) + def __init__(self, pkcs12_path, passphrase=None, localpolicy=True): + super().__init__(pkcs12_path, passphrase=passphrase, localpolicy=localpolicy) def _element_extension_content(self, fachoxml): return fachoxml.builder.xpath(fachoxml.root, './ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent') diff --git a/setup.py b/setup.py index de5ac78..7cf5e68 100644 --- a/setup.py +++ b/setup.py @@ -21,11 +21,14 @@ requirements = ['Click>=6.0', 'xmlsig==0.1.7', 'xades==0.2.2', 'xmlsec==1.3.12', + # usamos esta dependencia en runtime + # para forzar uso de policy_id de archivo local + 'mock>=2.0.0', 'xmlschema>=1.8'] setup_requirements = ['pytest-runner', ] -test_requirements = ['pytest', 'mock>=2.0.0'] +test_requirements = ['pytest', ] setup( author="Jovany Leandro G.C", diff --git a/tests/helpers.py b/tests/helpers.py index 55d0d26..e69de29 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,9 +0,0 @@ - -def mock_urlopen(m): - import urllib.request - def mock(url): - class FakeIO: - def read(*args): - return "X".encode('utf-8') - return FakeIO() - m.setattr(urllib.request, "urlopen", mock) diff --git a/tests/test_fe.py b/tests/test_fe.py index ec76279..58f4583 100644 --- a/tests/test_fe.py +++ b/tests/test_fe.py @@ -19,10 +19,7 @@ def test_xmlsigned_build(monkeypatch): xml = fe.FeXML('Invoice', 'http://www.dian.gov.co/contratos/facturaelectronica/v1') - - with monkeypatch.context() as m: - helpers.mock_urlopen(m) - signer.sign_xml_element(xml.root) + signer.sign_xml_element(xml.root) elem = xml.find_or_create_element('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/ds:Signature') @@ -38,9 +35,7 @@ def test_xmlsigned_with_passphrase_build(monkeypatch): xml = fe.FeXML('Invoice', 'http://www.dian.gov.co/contratos/facturaelectronica/v1') - with monkeypatch.context() as m: - helpers.mock_urlopen(m) - signer.sign_xml_element(xml.root) + signer.sign_xml_element(xml.root) elem = xml.find_or_create_element('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/ds:Signature') @@ -105,10 +100,7 @@ def test_xml_sign_dian(monkeypatch): xmlstring = xml.tostring() print(xmlstring) signer = fe.DianXMLExtensionSigner('./tests/example.p12') - - with monkeypatch.context() as m: - helpers.mock_urlopen(m) - xmlsigned = signer.sign_xml_string(xmlstring) + xmlsigned = signer.sign_xml_string(xmlstring) assert "Signature" in xmlsigned def test_xml_sign_dian_using_bytes(monkeypatch): @@ -122,7 +114,5 @@ def test_xml_sign_dian_using_bytes(monkeypatch): p12_data = open('./tests/example.p12', 'rb').read() signer = fe.DianXMLExtensionSigner.from_bytes(p12_data) - with monkeypatch.context() as m: - helpers.mock_urlopen(m) - xmlsigned = signer.sign_xml_string(xmlstring) + xmlsigned = signer.sign_xml_string(xmlstring) assert "Signature" in xmlsigned diff --git a/tests/test_fe_form.py b/tests/test_fe_form.py index 771f929..ca7f4b9 100644 --- a/tests/test_fe_form.py +++ b/tests/test_fe_form.py @@ -40,10 +40,7 @@ def test_invoicesimple_xml_signed(monkeypatch, simple_invoice): signer = fe.DianXMLExtensionSigner('./tests/example.p12') print(xml.tostring()) - with monkeypatch.context() as m: - import helpers - helpers.mock_urlopen(m) - xml.add_extension(signer) + xml.add_extension(signer) elem = xml.get_element('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent/ds:Signature') assert elem.text is not None diff --git a/tests/test_nomina.py b/tests/test_nomina.py index 05c8d81..a924ece 100644 --- a/tests/test_nomina.py +++ b/tests/test_nomina.py @@ -239,9 +239,7 @@ def test_nomina_xmlsign(monkeypatch): xml = nomina.toFachoXML() signer = fe.nomina.DianXMLExtensionSigner('./tests/example.p12') - with monkeypatch.context() as m: - helpers.mock_urlopen(m) - xml.add_extension(signer) + xml.add_extension(signer) print(xml.tostring()) elem = xml.get_element('/fe:NominaIndividual/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/ds:Signature')