nfephp-org / sped-common

Classes comuns usadas nas atividades e classes das API's de NFe, CTe e MDFe
Other
97 stars 122 forks source link

NFePHP\Common\Signer::isSigned está pegando a tag errada #166

Closed marcelonogueira closed 6 years ago

marcelonogueira commented 6 years ago

Para fazer a validação do DigestValue do XML o método isSigned() realiza uma busca no atributo @Id e o foreach retorna sempre a última tag, sendo que para gerar o DigestValue a tag a ser verificada é a infNFe.

Exemplo:

<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
        <infNFe Id="NFe99999999999999999999999900000000000000000000" versao="3.10">
            ...
        </infNFe>
    </NFe>
    <protNFe versao="3.10">
        <infProt Id="ID999999999999999">
            ...
        </infProt>
    </protNFe>
</nfeProc>

Trecho que apresenta o problema:

private static function digestCheck(
        $xml,
        $tagname = '',
        $canonical = [true,false,null,null]
    ) {
        ...
                $xpath = new \DOMXPath($dom);
                $entries = $xpath->query('//@Id');
                foreach ($entries as $entry) {
                    $tagname = $entry->ownerElement->nodeName;
                }
        ...
}

Para resolver o problema basta inserir um break no foreach para ele retornar a primeira tag:

private static function digestCheck(
        $xml,
        $tagname = '',
        $canonical = [true,false,null,null]
    ) {
        ...
                $xpath = new \DOMXPath($dom);
                $entries = $xpath->query('//@Id');
                foreach ($entries as $entry) {
                    $tagname = $entry->ownerElement->nodeName;
                    break;
                }
        ...
}
robmachado commented 6 years ago

@marcelonogueira Obrigado ! Marcelo, corrigido na release v5.0.22