• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wmixvideo / nfe / #9665

31 Aug 2026 12:30PM UTC coverage: 51.298% (+0.3%) from 51.007%
#9665

push

web-flow
Implementação migração do Axis2 para Httpclient5 - Todos modulos documentos fiscais (#1184)

* Javadoc Warnings invalid input: '<' e '&' literais

* Javadoc Warnings invalid input: '<' e '&' literais

* Refatoração de chaves para suportar CNPJ alfanumérico (NT 2026.004)

* Normaliza char para maiusculo na chave

O cálculo do DV usa valores[i - 1] - '0'. Se a chave vier com letras minúsculas (o que é aceito por alguns validadores de CNPJ na base), o DV calculado muda (ex.: 'a' - '0' != 'A' - '0'), gerando falsos negativos/positivos. Normalize o caractere para maiúsculo antes de converter para o valor numérico.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Remove unused Javadoc references from stub classes
[Javadoc Warnings Tag @see: reference not found

* Implementa DFHttpClient e DFSoapEnvelope para migração do Axis2 para
httpclient5

* Add extra hardening against XXE in DFSoapEnvelope

* Clarify timeout mapping in DFHttpClient to maintain compatibility with
Axis2

* Add unit tests for DFHttpClient to validate SOAP request handling

* Add author annotations

* Alinhar o mapeamento de timeout no DFHttpClient

* Implementação migração do Axis2 para Httpclient5 - Envio Lote

* Migrate web services from Axis2 to HttpClient5 to nfe

* Add exception handling for HTTP client initialization in
WSDistribuicaoNFe

* Refactor web service methods to include specific exception handling for
IOException and DFSoapFaultException

* Add specific exception handling for IOException and DFSoapFaultException
in web service methods

* Implement Closeable interface for web service classes and add close
method to manage HTTP client connections

* Add unit tests for WSFacade to verify construction and closure behavior
after migration to HttpClient5

* Add connection management settings to DFHttpClient to mitigate
keep-alive issues

* Handle null HttpEntity in DFHttpClient response processing to prevent
NullPointerException

* E... (continued)

184 of 265 new or added lines in 21 files covered. (69.43%)

9 existing lines in 8 files now uncovered.

15291 of 29808 relevant lines covered (51.3%)

0.51 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

51.52
/src/main/java/com/fincatto/documentofiscal/utils/DFKeyManager.java
1
package com.fincatto.documentofiscal.utils;
2

3
import com.fincatto.documentofiscal.DFConfig;
4
import com.fincatto.documentofiscal.DFLog;
5
import org.apache.commons.lang3.StringUtils;
6

7
import javax.net.ssl.X509KeyManager;
8
import java.net.Socket;
9
import java.security.KeyStore;
10
import java.security.KeyStoreException;
11
import java.security.NoSuchAlgorithmException;
12
import java.security.Principal;
13
import java.security.PrivateKey;
14
import java.security.UnrecoverableKeyException;
15
import java.security.cert.Certificate;
16
import java.security.cert.X509Certificate;
17
import java.util.Enumeration;
18

19
/**
20
 * Created by Eldevan Nery Junior on 18/10/19.
21
 */
22
public class DFKeyManager implements X509KeyManager, DFLog {
23
    
24
    private final KeyStore ks;
25
    private final String alias;
26
    // guardada como char[] (nao String) para reduzir a exposicao da senha em heap dumps
27
    private final char[] password;
28

29
    public DFKeyManager(DFConfig config) throws KeyStoreException {
1✔
30
        this.ks = config.getCertificadoKeyStore();
1✔
31
        // mesma prioridade usada por DFAssinaturaDigital.getPrivateKeyEntry(): honra o alias
32
        // configurado (necessario em keystores com mais de uma chave) e so cai no primeiro
33
        // alias de chave do keystore quando nenhum foi informado.
34
        this.alias = StringUtils.isNotBlank(config.getCertificadoAlias()) ? config.getCertificadoAlias() : getAlias(this.ks);
1✔
35
        this.password = config.getCertificadoSenha() == null ? null : config.getCertificadoSenha().toCharArray();
1✔
36
    }
1✔
37
    
38
    public String chooseClientAlias(String[] str, Principal[] principal, Socket socket) {
39
        return alias;
1✔
40
    }
41
    
42
    public String chooseServerAlias(String str, Principal[] principal, Socket socket) {
43
        return alias;
×
44
    }
45
    
46
    public String[] getClientAliases(String str, Principal[] principal) {
47
        return new String[]{alias};
×
48
    }
49
    
50
    public String[] getServerAliases(String str, Principal[] principal) {
51
        return new String[]{alias};
×
52
    }
53
    
54
    public X509Certificate[] getCertificateChain(String alias) {
55
        // a interface X509KeyManager exige retorno null em caso de falha; o log preserva a causa
56
        // real, que de outra forma se perderia num handshake_failure generico
57
        try {
58
            Certificate[] certificates = this.ks.getCertificateChain(alias);
1✔
59
            if (certificates == null) {
1✔
NEW
60
                this.getLogger().error("Alias '{}' nao encontrado no keystore - cadeia de certificados vazia", alias);
×
NEW
61
                return null;
×
62
            }
63
            X509Certificate[] x509Certificates = new X509Certificate[certificates.length];
1✔
64
            System.arraycopy(certificates, 0, x509Certificates, 0, certificates.length);
1✔
65
            return x509Certificates;
1✔
66
        } catch (KeyStoreException e) {
×
67
            this.getLogger().error("N\u00e3o foi poss\u00edvel carregar o keystore para o alias:" + alias, e);
×
68
            return null;
×
69
        }
70
    }
71

72
    public PrivateKey getPrivateKey(String alias) {
73
        try {
74
            return (PrivateKey) ks.getKey(alias, password);
1✔
NEW
75
        } catch (UnrecoverableKeyException e) {
×
NEW
76
            this.getLogger().error("Senha do certificado incorreta para o alias:" + alias, e);
×
NEW
77
            return null;
×
NEW
78
        } catch (KeyStoreException | NoSuchAlgorithmException e) {
×
79
            this.getLogger().error("N\u00e3o foi poss\u00edvel carregar o keystore para o alias:" + alias, e);
×
80
            return null;
×
81
        }
82
    }
83
    
84
    private static String getAlias(final KeyStore ks) throws KeyStoreException {
85
        final Enumeration<String> aliasesEnum = ks.aliases();
1✔
86
        while (aliasesEnum.hasMoreElements()) {
1✔
87
            final String alias = aliasesEnum.nextElement();
1✔
88
            if (ks.isKeyEntry(alias)) {
1✔
89
                return alias;
1✔
90
            }
91
        }
×
92
        throw new KeyStoreException("Nenhum alias encontrado no certificado");
×
93
    }
94
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc