galegoga
Membros-
Total de ítens
45 -
Registro em
-
Última visita
Últimos Visitantes
O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.
galegoga's Achievements
-
Efetuei as modificações nos arquivos para implementar a funcionalidade. É necessário comparar. Meu código não está na última revisão. Alterações: ACBrNFex.pas: TACBrNFSeX = class(TACBrDFe) private procedure ConsultarDFe(const aCNPJ: String; aNSU: Integer); overload; end; procedure TACBrNFSeX.ConsultarDFe(const aCNPJ: String; aNSU: Integer); begin if not Assigned(FProvider) then raise EACBrNFSeException.Create(ERR_SEM_PROVEDOR); if (Length(aCNPJ) > 0) and (Length(aCNPJ) <> 14) then raise EACBrNFSeException.Create('Cnpj inválido'); FWebService.ConsultarDFe.Clear; FWebService.ConsultarDFe.NSU := aNSU; FWebService.ConsultarDFe.Cnpj := aCNPJ; FProvider.ConsultarDFe; end; ACBrNFSeXWebServicesResponse.pas: // Adição do campo Cnpj TNFSeConsultarDFeResponse = class(TNFSeWebserviceResponse) private FCnpj: string; public property Cnpj: String read FCnpj write FCnpj; end; procedure TNFSeConsultarDFeResponse.Clear; begin inherited Clear; FCnpj := ''; NSU := -1; ChaveNFSe := ''; end; PadraoNacional.Provider.pas // adição da condicional Cnpj procedure TACBrNFSeProviderPadraoNacional.PrepararConsultarDFe( Response: TNFSeConsultarDFeResponse); begin if Response.ChaveNFSe <> '' then FpPath := '/NFSe/' + Response.ChaveNFSe + '/Eventos' else if Response.Cnpj <> '' then FpPath := '/DFe/' + IntToStr(Response.NSU)+'?cnpjConsulta='+Response.Cnpj else FpPath := '/DFe/' + IntToStr(Response.NSU); Response.ArquivoEnvio := FpPath; FpMethod := 'GET'; end; ACBrNFSeX.pas ACBrNFSeXWebservicesResponse.pas PadraoNacional.Provider.pas
-
Boa tarde! Foi adicionado na distribuição NFS-e a possibilidade de consultar NSU por cnpj. Atualmente, no acbr, está consultando somente pela NSU do cnpj informado implicitamente do certificado. Porém é preciso adicionar a consulta o cnpj para que possa consultar por outros cnpj do grupo além daquele ao qual o certificado digital foi emitido. Atualmente a consulta no ACBrNFSeX está somente pelo link https://adn.nfse.gov.br/contribuintes/DFe/{nsu} Mas é preciso adicionar a opção por cnpj que ficará assim quando informado https://adn.nfse.gov.br/contribuintes/DFe/{nsu}?cnpjConsulta={cnpj} Gostaria de saber se será implementado no projeto ? Extraído da documentação: https://adn.producaorestrita.nfse.gov.br/contribuintes/docs/index.html#tag/DistribuicaoContribuinte
-
Instalador acbr não gerar os arquivos na pasta Lib
galegoga replied to galegoga's tópico in Dúvidas Gerais sobre o ACBr
Estou sem acesso ao computador no momento. Lá o Delphi é 2007, mas isso não é problema, temos outros computadores com o mesmo delphi e funcionou normalmente. Nesse computador estava com o acbr instalado e funcionando, o problema aconteceu ao atualizar. Mas também não creio que seja o acbr, porque eu voltei para a versão anterior e problema permaneceu. Creio que seja algum aplicativo instalado no computador que está provocando essa falha, mas não sei o que é. Resolvi o problema pegando os arquivos Lib de outra máquina que estava funcionando e colocando lá, mas não acho isso adequado. -
Instalador acbr não gerar os arquivos na pasta Lib
um tópico no fórum postou galegoga Dúvidas Gerais sobre o ACBr
Bom dia! Estou com uma situação estranha! O instalador executa normalmente e faz a instalação, porém não gera os arquivos dcu e demais na pasta lib. Alguém já passou por isso ? -
Arquivo ACBrCTeWebServices.pas atualizado Refere-se a primeira postagem. ACBrCTeWebServices.pas
-
Bom dia! Além desse ajuste é necessário ajustar o arquivo pcnRetDistDFeInt. if (oLeitorInfZip.rExtrai(1, LowerCase(FtpDFe) + 'Proc') <> '') or (oLeitorInfZip.rExtrai(1, LowerCase(FtpDFe) + 'OSProc') <> '') or (oLeitorInfZip.rExtrai(1, LowerCase(FtpDFe) + 'SimpProc') <> '') or (oLeitorInfZip.rExtrai(1, 'GTVeProc') <> '') then begin FdocZip.Items[i].XML := InserirDeclaracaoXMLSeNecessario(oLeitorInfZip.Grupo); Ajuste no arquivo em anexo. @douglaswf, após o ajuste o sistema parou de apresentar erro mas está havendo perda de arquivo se você utiliza o código padrão acbr para salvar a distribuição. Você pode efetuar o ajuste ou aguardar os moderadores ajustarem. São dois ajustes esse e o acima. pcnRetDistDFeInt.pas
-
Boa tarde, @Italo Giurizzato Junior! Foi postado um ajuste seu na distribuição cte. Veja aqui. O ajuste funcionou, agora está faltando adicionar o novo valor enumerado (schprocCTeSimp) na rotina que salva os documentos na pasta, localizado no método TDistribuicaoDFe.TratarResposta acredito o código deva ficar da seguinte forma: schprocCTe, schprocCTeOS, schprocGTVe, schprocCTeSimp: FNomeArq := FretDistDFeInt.docZip.Items[I].resDFe.chDFe + '-cte.xml'; Segue em anexo o arquivo com a correção. ACBrCTeWebServices.pas
-
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
@Arimateia Jr Blz, Vou dar um olhada nesses links. -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Boa tarde, Arimateia! Fiz o teste e funcionou muito bem. Você conseguiu através do link em que postei ? Pergunto porque esse método "OPENSSL_sk_pop_free" não está informado, lá falava sobre "sk_X509_pop_free". Ele são similares ou equivalentes ? (Levando em conta que o artigo no fórum já tem 22 anos e muita coisa pode ter mudado). -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Tudo bem. Irei aguardar. -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Boa tarde, Daniel. Você chegou a ver o post acima ? No dia em que postei tive um problema e acabei quebrando ele em dois. Tentei editar para ficar em um só, mas o tempo de edição havia expirado. -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Continuação do post acima // Set Certificate Verification chain if Result and (ca <> nil) then SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); // <---- AQUI Adicionei esse código e fiz os testes e vi que parou de vazar memória. meu código de teste foi (loop de 1000): procedure TForm2.MetodoTeste(ALoop: Integer); var vDFeSSL: TDFeSSL; vCT: Integer; vSenha: String; vFileName: String; begin vFileName := edtPfxFileName.Text; vSenha := edtSenhaPFX.Text; for vCT := 1 to ALoop do begin vDFeSSL := TDFeSSL.Create; try vDFeSSL.SSLCryptLib := cryOpenSSL; vDFeSSL.SSLType := LT_TLSv1_2; vDFeSSL.DadosPFX := LoadCertificado(vFileName); vDFeSSL.Senha := AnsiString(vSenha); vDFeSSL.CarregarCertificado; finally vDFeSSL.Free; end; end; end; Realmente os sistema com ReportMemoryLeaksOnShutdown := True; não acusa nada. Mas o memory ocorre. Aproveitando essa discussão. Acho que você não acompanhou a discussão desde o início. Digo isso porque quando tive o problema cheguei a achar algo parecido com o meu problema. chequei a mencionar no fórum antes de propor essa modificação no código. Um certo usuário mencionava despejo de memória relacionado a variável "Ca". A solução veio do Dr. Stephen Henson, que informava que ele devia chamar sk_X509_pop_free(Ca, X509_free) ao final. Achei que fosse isso. No acbr também possui ela com o nome SkX509PopFree, mas ela nunca é executada por que me parece que ela não existe na dll. _SkX509PopFree dentro de ssl_openssl_lib.pas sempre está nula. A solução é antiga, acho que no inicio dos anos 2000. O link é : https://openssl-users.openssl.narkive.com/F1OAAID0/pkcs12-memory-leak#post2 Vou adicionar o código fonte de teste. Se precisar do certificado digital é só me falar. PrjReadPfx02.zip -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Boa tarde, Daniel! Fiz o teste e continua apresentando o problema. Primeiramente quero dizer que meu conhecimento referente as bibliotecas OpenSSL é zero. Também pouco sei sobre certificado digital. Nesses aspectos sou usuário final, dessa forma eu não tenho a capacidade de discutir os detalhes internos da biblioteca. Mas vou te passar os passos que levaram até esse ponto. Desenvolvi uma aplicação para consultar a Distribuição, é um serviço que roda 24 horas, com mais de 1000 empresas, mas acho que certificados são uns 500, visto que tem muitas filiais. No decorrer do tempo a aplicação ia crescendo até ficar sem memória. Fiz um rastreio, fui isolando as partes até que descobri que o despejo era quando acessava a certificado. Um detalhe importante é que o problema ocorre somente com alguns certificados. Depois que descobri em qual unit (ACBrDFeOpenSSL.pas) estava o problema eu comecei estudar o que estava sendo criado e que ficava para trás. Nesse processo descobrir a unit ssl_openssl.pas na qual me ajudou, fui comparando o código vendo as diferenças até que cheguei a um certo ponto, onde existia um código na ssl_openssl.pas que não existia na unit do acbr. O código era: -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Arquivo em anexo. ACBrDFeOpenSSL.pas -
Vazamento de memória TDFeSSL
galegoga replied to galegoga's tópico in NFC-e - Nota Fiscal do Consumidor Eletrônica
Boa tarde! No meus testes essa modificação não funcionou. Continua vazando memória. A linha 576, código: SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); não está sendo executada de acordo com a condicional estabelecida. Por que ela não pode ser executada somente através da condicional "if Result and (ca <> nil) then" ? porque ela tem que depender da condicional "if LibVersionIsGreaterThan1_0_0 then begin" ser falsa ? Assim não funcionou: // Set Certificate Verification chain if Result and (ca <> nil) then begin if LibVersionIsGreaterThan1_0_0 then begin iTotal := OPENSSL_sk_num(ca); if iTotal > 0 then begin Store := SSL_CTX_get_cert_store(Fctx); for I := 0 to iTotal - 1 do begin certx := OPENSSL_sk_value(ca, I); if certx <> nil then begin if X509_STORE_add_cert(Store, pX509(certx)) = 0 then begin // already exists end; //X509_free(Cert); end; end; end; end else SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); end; Assim funcionou: // Set Certificate Verification chain if Result and (ca <> nil) then begin if LibVersionIsGreaterThan1_0_0 then begin iTotal := OPENSSL_sk_num(ca); if iTotal > 0 then begin Store := SSL_CTX_get_cert_store(Fctx); for I := 0 to iTotal - 1 do begin certx := OPENSSL_sk_value(ca, I); if certx <> nil then begin if X509_STORE_add_cert(Store, pX509(certx)) = 0 then begin // already exists end; //X509_free(Cert); end; end; end; end; SslCtxCtrl(Fctx, SSL_CTRL_CHAIN, 0, ca); end;
