Skip to content

Commit

Permalink
Merge pull request #10 from eclipxe13/master
Browse files Browse the repository at this point in the history
Version 1.0.0: remove backwards compatibility with 0.4.2
  • Loading branch information
eclipxe13 authored Sep 28, 2019
2 parents f8e0f83 + ca76616 commit 0929824
Show file tree
Hide file tree
Showing 50 changed files with 518 additions and 783 deletions.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
/.gitattributes export-ignore
/.gitignore export-ignore
/.php_cs.dist export-ignore
/.phplint.yml export-ignore
/.scrutinizer.yml export-ignore
/.travis.yml export-ignore
/phpcs.xml.dist export-ignore
/phpstan.neon.dist export-ignore
/phpunit.xml.dist export-ignore
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,3 @@
/vendor
/build
/composer.lock
.phpunit.result.cache
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ cache:
- $HOME/.composer

before_script:
- phpenv config-rm xdebug.ini
- phpenv config-rm xdebug.ini || true
- travis_retry composer install --no-interaction --prefer-dist
- mkdir -p build

Expand Down
18 changes: 7 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ composer require phpcfdi/xml-cancelacion

use PhpCfdi\XmlCancelacion\XmlCancelacionHelper;
use PhpCfdi\XmlCancelacion\Definitions\RfcRole;
use PhpCfdi\XmlCancelacion\Definitions\CancellationAnswer;
use PhpCfdi\XmlCancelacion\Definitions\CancelAnswer;

$xmlCancelacion = new XmlCancelacionHelper();

Expand All @@ -59,7 +59,7 @@ $consultaRelacionados = $xmlCancelacion->signObtainRelated(

$consultaRelacionados = $xmlCancelacion->signCancellationAnswer(
'11111111-2222-3333-4444-000000000002', // uuid a responder
CancellationAnswer::accept(), // aceptar la cancelación
CancelAnswer::accept(), // aceptar la cancelación
'CVD110412TF6' // RFC del PAC (Quadrum & Finkok)
);

Expand All @@ -69,15 +69,15 @@ $consultaRelacionados = $xmlCancelacion->signCancellationAnswer(

```php
<?php
use PhpCfdi\XmlCancelacion\Cancellation\CancellationCapsule;
use PhpCfdi\XmlCancelacion\DOMSigner;
use PhpCfdi\XmlCancelacion\Capsules\Cancellation;
use PhpCfdi\XmlCancelacion\Signers\DOMSigner;
use PhpCfdi\XmlCancelacion\Credentials;

// certificado, llave privada y clave de llave
$credentials = new Credentials('certificado.cer.pem', 'privatekey.key.pem', '12345678a');

// datos de cancelación
$data = new CancellationCapsule('LAN7008173R5', ['12345678-1234-1234-1234-123456789012']);
$data = new Cancellation('LAN7008173R5', ['12345678-1234-1234-1234-123456789012']);

// generación del xml
$xml = (new DOMSigner())->signCapsule($data, $credentials);
Expand Down Expand Up @@ -180,12 +180,8 @@ Al parecer es obligatorio incluir en la firma los nombres de espacio `xmlns:xsd`
Si bien, esto no es necesario para producir un documento con la firma correcta, sí parece ser necesario para
producir la información que se requiere por parte del PAC o del SAT.

Se podría utilizar [`robrichards/xmlseclibs`] para hacer el firmado, sin embargo al 2019-04-09 aun no se
habían implementado los mecanismos para incluir el `RSAKeyValue`, a pesar de tener un
[PR abierto](https://github.com/robrichards/xmlseclibs/pull/75) desde 2015-09-03.
Las otras dos desventajas están en la forma en que escribe los valores de `X509IssuerSerial`.
Que aunque creo que no son muy relevantes para generar una firma correcta, sí podrían ser importantes,
y motivo de rechazo -o pretexto- en el servicio de cancelación del SAT.
A partir de 2019-08-27 con la versión `1.0.0` se puede usar [`robrichards/xmlseclibs`](https://github.com/robrichards/xmlseclibs).
Para más información ver el archivo [XmlSecLibs](https://github.com/phpcfdi/xml-cancelacion/blob/master/XmlSecLibs.md).

A partir de 2019-08-13 con la versión `0.4.0` se eliminó la dependencia a `eclipxe/cfdiutils` y se cambió a la
librería [`phpcfdi/credentials`](https://github.com/phpcfdi/xml-cancelacion), con esta nueva dependencia se trabaja
Expand Down
3 changes: 1 addition & 2 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CHANGELOG

# Version 0.5.0 2019-09-25
# Version 1.0.0 2019-09-28

- This version is a major change, it is not compatible with previous versions
Read [UPGRADE-0.5](https://github.com/phpcfdi/xml-cancelacion/blob/master/docs/UPGRADE-0.5.md)
Expand All @@ -23,7 +23,6 @@
- `XmlCancelacionLogicException` extends `LogicException`
- `DocumentWithoutRootElement`
- `HelperDoesNotHaveCredentials`
- `InvalidCapsuleType`
- `XmlCancelacionRuntimeException` extends `RuntimeException`
- `CannotLoadCertificateAndPrivateKey`
- `CapsuleRfcDoesnotBelongToCertificateRfc`
Expand Down
6 changes: 1 addition & 5 deletions docs/TODO.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
# phpcfdi/xml-cancelacion To Do List

- Remover @deprecated
- Centralizar la creación de credenciales

- [ ] Generar excepciones internas en lugar de excepciones genéricas de SPL.

- [X] Generar excepciones internas en lugar de excepciones genéricas de SPL.
- [X] Poner el copyright correcto en cuanto esté el sitio de PhpCfdi
- [X] Dejar de usar CfdiUtils y usar phpcfdi/credentials cuando esté publicada y estable
65 changes: 39 additions & 26 deletions docs/UPGRADE-0.5.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,29 @@ Si estás usando `Capsule` directamente:
<?php
$credentials = new Credentials('certificado.cer.pem', 'privatekey.key.pem', '12345678a');
// cambia este código
// código de 0.4.0
$data = new Capsule('LAN7008173R5', ['12345678-1234-1234-1234-123456789012']);
$xml = (new CapsuleSigner())->sign($data, $credentials);
```

Cualquiera de estas dos formas pueden ser un remplazo:

```php
<?php

use PhpCfdi\XmlCancelacion\Credentials;
use PhpCfdi\XmlCancelacion\XmlCancelacionHelper;
use PhpCfdi\XmlCancelacion\Capsules\Cancellation;
use PhpCfdi\XmlCancelacion\Signers\DOMSigner;

$credentials = new Credentials('certificado.cer.pem', 'privatekey.key.pem', '12345678a');

// a este código
// código de 1.0.0 con helper
$xmlCancelacion = new XmlCancelacionHelper($credentials);
$xml = $xmlCancelacion->signCancellation(['12345678-1234-1234-1234-123456789012']);
$xml = $xmlCancelacion->signCancellation('12345678-1234-1234-1234-123456789012');

// o a este otro
$data = new CancellationCapsule('LAN7008173R5', ['12345678-1234-1234-1234-123456789012']);
// código de 1.0.0 granulado
$data = new Cancellation('LAN7008173R5', ['12345678-1234-1234-1234-123456789012'], new DateTimeImmutable());
$signer = new DOMSigner(); // o new XmlSecLibsSigner()
$xml = $signer->signCapsule($data, $credentials);
```
Expand All @@ -37,18 +50,18 @@ solicitud de cancelación, solicitud de UUID relacionados y aceptación/rechazo
La solicitud de cancelación es lo único que se cubría hasta la versión `0.4.x` y en la versión `0.5.x` se han
creado las firmas de las otras dos comunicaciones.

Este cambio evidenció que se necesitaba restructurar la librería para poder firmar los mensajes de
solicitud de UUID relacionados y aceptación/rechazo de cancelaciones pendientes porque antes solo se procesaba el
mensaje de solicitud de cancelación.
Este cambio evidenció que se necesitaba restructurar la librería para poder firmar los otros mensajes de
solicitud de UUID relacionados y aceptación/rechazo de cancelaciones.

## Nuevos conceptos desde la versión 0.5.0
## Nuevos conceptos desde la versión 1.0.0

A los mensajes se les llaman *cápsulas (capsule)* y tienen tres características: Almacenan los datos del mensaje,
pueden producir un documento XML `DOMDocument` con la información que será firmada y pueden verificar que el RFC
de la cápsula coincide con un RFC (usado para verificar que se está usando la el CSD correcto)
de la cápsula coincide con un RFC dado (usado para verificar que se está usando el RFC del CSD).

Para que una cápsula fabrique el documento XML utiliza un *DocumentBuilder*.
Para que una cápsula fabrique el documento XML utiliza un `BaseDocumentBuilder`.
A cada cápsula le corresponde un objeto relacionado para fabricar este documento.
Y aunque no es necesario hacerlo así provee una mejor manera de testeo.

Los documentos XML pueden ser firmados utilizando cualquier objeto que implemente `SignerInterface`.
Anteriormente solo se producían utilizando `DOMSigner`, ahora `DOMSigner` es el usado por defecto pero se puede cambiar.
Expand All @@ -69,18 +82,19 @@ y se puede crear la credencial de esta librería con los datos de una credencial
<?php

use PhpCfdi\Credentials\Certificate;
use PhpCfdi\Credentials\Credential;
use PhpCfdi\Credentials\Credential as PhpCfdiCredential;
use PhpCfdi\Credentials\PrivateKey;
use PhpCfdi\XmlCancelacion\Credentials;

$certificateContents = ''; // contenido del certificado desde algún lugar, como la base de datos
$privateKeyPemContents = ''; // contenido de la llave privada como PEM desde algún lugar, como la base de datos
$passPhrase = '';
$phpCfdiCretential = new Credential(
$phpCfdiCretential = new PhpCfdiCredential(
new Certificate($certificateContents),
new PrivateKey($privateKeyPemContents, $passPhrase)
);

$credentials = PhpCfdi\XmlCancelacion\Credentials::createWithPhpCfdiCredential($phpCfdiCretential);
$credentials = Credentials::createWithPhpCfdiCredential($phpCfdiCretential);
```

## Excepciones de dominio
Expand All @@ -89,7 +103,6 @@ $credentials = PhpCfdi\XmlCancelacion\Credentials::createWithPhpCfdiCredential($
- `class XmlCancelacionLogicException` extends `\LogicException`
- `class DocumentWithoutRootElement`
- `class HelperDoesNotHaveCredentials`
- `class InvalidCapsuleType`
- `class XmlCancelacionRuntimeException` extends `\RuntimeException`
- `class CannotLoadCertificateAndPrivateKey`
- `class CapsuleRfcDoesnotBelongToCertificateRfc`
Expand All @@ -113,17 +126,17 @@ roave-backward-compatibility-check roave-backwards-compatibility-check:assert-ba
[BC] REMOVED: Method PhpCfdi\XmlCancelacion\XmlCancelacionHelper#createCapsule() was removed
[BC] REMOVED: Method PhpCfdi\XmlCancelacion\XmlCancelacionHelper#createCapsuleSigner() was removed
[BC] REMOVED: Method PhpCfdi\XmlCancelacion\DOMSigner#createKeyValueElement() was removed
[BC] CHANGED: The parameter $document of PhpCfdi\XmlCancelacion\DOMSigner#__construct() changed from DOMDocument to ?DOMDocument
[BC] CHANGED: The number of required arguments for PhpCfdi\XmlCancelacion\DOMSigner#createKeyInfoElement() increased from 4 to 5
[BC] CHANGED: The parameter $issuerName of PhpCfdi\XmlCancelacion\DOMSigner#createKeyInfoElement() changed from string to a non-contravariant DOMDocument
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\DOMSigner#createKeyInfoElement() changed from array to a non-contravariant string
[BC] CHANGED: The parameter $issuerName of PhpCfdi\XmlCancelacion\DOMSigner#createKeyInfoElement() changed from string to DOMDocument
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\DOMSigner#createKeyInfoElement() changed from array to string
[BC] CHANGED: Method createKeyValueElement() of class PhpCfdi\XmlCancelacion\DOMSigner visibility reduced from protected to private
[BC] CHANGED: The number of required arguments for PhpCfdi\XmlCancelacion\DOMSigner#createKeyValueElement() increased from 1 to 2
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\DOMSigner#createKeyValueElement() changed from array to a non-contravariant DOMDocument
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\DOMSigner#createKeyValueElement() changed from array to DOMDocument
[BC] REMOVED: Method PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyValueElement() was removed
[BC] CHANGED: The parameter $document of PhpCfdi\XmlCancelacion\Signers\DOMSigner#__construct() changed from DOMDocument to ?DOMDocument
[BC] CHANGED: The number of required arguments for PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyInfoElement() increased from 4 to 5
[BC] CHANGED: The parameter $issuerName of PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyInfoElement() changed from string to a non-contravariant DOMDocument
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyInfoElement() changed from array to a non-contravariant string
[BC] CHANGED: The parameter $issuerName of PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyInfoElement() changed from string to DOMDocument
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyInfoElement() changed from array to string
[BC] CHANGED: Method createKeyValueElement() of class PhpCfdi\XmlCancelacion\Signers\DOMSigner visibility reduced from protected to private
[BC] CHANGED: The number of required arguments for PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyValueElement() increased from 1 to 2
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyValueElement() changed from array to a non-contravariant DOMDocument
[BC] CHANGED: The parameter $pubKeyData of PhpCfdi\XmlCancelacion\Signers\DOMSigner#createKeyValueElement() changed from array to DOMDocument
[BC] CHANGED: Method defaultExtraNamespaces() of class PhpCfdi\XmlCancelacion\CapsuleSigner changed scope from instance to static
```

Expand Down
39 changes: 39 additions & 0 deletions docs/XmlSecLibs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Uso de XmlSecLibs `robrichards/xmlseclibs`

A partir de la versión `1.0.0` se incluye un objeto `XmlSecLibsSigner` que implementa `SignerInterface`.

Se puede utilizar [`robrichards/xmlseclibs`](https://github.com/robrichards/xmlseclibs) para hacer el firmado,
sin embargo al 2019-04-09 aun no se han implementado los mecanismos para incluir el elemento `KeyValue`,
a pesar de tener un [PR #75](https://github.com/robrichards/xmlseclibs/pull/75) desde 2015-09-03.

Las otras dos desventajas están en la forma en que escribe los valores de `X509IssuerSerial`,
tanto `X509IssuerName` como `X509SerialNumber`.

Por lo anterior, para escribir el contenido de `KeyValue` usando `XmlSecLibsSigner` se usa la misma
implementación manual y no la incompleta/incorrecta de XmlSecLibs.

## Ejemplo de uso:

```php
<?php declare(strict_types=1);

use PhpCfdi\XmlCancelacion\Signers\XmlSecLibsSigner;
use PhpCfdi\XmlCancelacion\XmlCancelacionHelper;

$xmlhelper = new XmlCancelacionHelper();
$xmlhelper->setSigner(new XmlSecLibsSigner()); // change signer to XmlSecLibsSigner
$cancellation = $xmlhelper->signCancellation('11111111-2222-3333-4444-000000000001');
```


## Instalación

Recuerda que `robrichards/xmlseclibs` no es una dependencia (es una recomendación) de `phpcfdi/xml-cancelacion`

```shell script
# instalar esta librería
composer require phpcfdi/xml-cancelacion

# instalar xmlseclibs
composer require robrichards/xmlseclibs
```
65 changes: 0 additions & 65 deletions docs/xmlseclibs.md

This file was deleted.

3 changes: 1 addition & 2 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.0/phpunit.xsd"
<phpunit xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.0/phpunit.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
bootstrap="./tests/bootstrap.php" colors="true" verbose="true" cacheResultFile="./build/phpunit.result.cache">
<testsuites>
<testsuite name="Default">
Expand Down
61 changes: 0 additions & 61 deletions src/Cancellation/CancellationCapsule.php

This file was deleted.

Loading

0 comments on commit 0929824

Please sign in to comment.