Página 1 de 1

Problema com assinatura A3

Enviado: 07 Dez 2017 09:24
por JoséQuintas
Passou a acontecer isto num cliente com certificado A3.
O esquisito é que é só neste cliente.
O bloco <X509DATA> está duplicado.
Apagando um dos blocos, ok.

Alguém já teve esse problema?

A solução vai ser colocar na rotina de assinatura para que se o bloco estiver duplicado, retirar um dos blocos.
Mas isto pode atrapalhar o uso da rotina pra NFSE.

Problema com assinatura A3

Enviado: 07 Dez 2017 10:18
por JoséQuintas
Lembrei da parte do fonte que parecia que não servia pra nada, até comentei aqui:

https://pctoledo.org/forum/viewto ... ra#p119468

Tinha deixado como anotação no fonte.
Mas vendo o problema que aconteceu, alterei pra isto agora, ainda deixando o anterior anotado:

Código: Selecionar todos

STATIC FUNCTION AssinaAjustaAssinado( cXml )

   LOCAL nPosIni, nPosFim

   cXml    := StrTran( cXml, Chr(10), "" )
   cXml    := StrTran( cXml, Chr(13), "" )
   nPosIni := RAt( [<SignatureValue>], cXml ) + Len( [<SignatureValue>] )
   cXml    := Substr( cXml, 1, nPosIni - 1 ) + StrTran( Substr( cXml, nPosIni ), " ", "" )

   // Ocorrência estranha: <X509Data> duplicado num cliente com A3
   nPosIni := At( "</X509Data><X509Data>", cXml )
   IF nPosIni != 0
      nPosFim := hb_At( "</X509Data>", cXml, nPosIni + 5 )
      cXml    := Substr( cXml, 1, nPosIni - 1 ) + Substr( cXml, nPosFim )
   ENDIF


   //nPosIni := hb_At( [<X509Certificate>], cXml, nPosIni ) - 1
   //nP      := nPosIni + 1
   //nPosFim := 0
   //DO WHILE nP <> 0
   //   nPosFim := nP
   //   nP      := hb_At( [<X509Certificate>], cXml, nP + 1 )
   //ENDDO
   //cXml := Substr( cXml, 1, nPosIni ) + Substr( cXml, nPosFim, Len( cXml ) )

   RETURN cXml
Em XHarbour não tem hb_At(), mas na sefazclass está resolvido em ze_XHarbour.prg, que pra XHarbour adiciona a função FUNCTION hb_At( cText, nStart, nEnd ); RETURN At( cText, nStart, nEnd )