[IRPF-Livre, Rnetclient] Impossível enviar declaração

Alexandre Oliva lxoliva en fsfla.org
Dom Mayo 24 03:58:25 UTC 2026


On May 22, 2026, Adonay Felipe Nogueira <adfeno.7046 en gmail.com> wrote:

> Como lxoliva informou na sala usuarios-gnu no XMPP que pode ser que as
> mudanças foram feitas de 2024 para 2025

Pode ser que tenham mudado o receitanet.jar usado pelo IRPF bem antes
disso.  O que eu não tinha percebido quando sugeri essa possibilidade é
que tinham mudado este ano.  Por alguma razão eu achei que o
receitanet.jar continuava inalterado, e tomei algumas decisões infelizes
por causa dessa crença.


Hoje comecei a tentar entender o funcionamento do novo receitanet.

Talvez a primeira descoberta talvez útil é que há um aplicativo
receitanet naquele .jar.  Pode ser iniciado a partir do diretório que
contém o irpf.jar, rodando:

  java -cp lib/jsignnet-3.6.0.jar:lib/maven-artifact-3.8.4.jar:lib/bcprov-jdk18on-1.75.jar:lib/bcmail-jdk18on-1.75.jar:lib/bcpkix-jdk18on-1.75.jar:lib/bcutil-jdk18on-1.75.jar:lib/recnetutil-1.1.jar:lib/recnet-envelope-1.2.jar:lib/receitanet-pro-1.32.jar serpro.receitanet.gui.ReceitanetApp

O fato de que isso funciona sugere pra mim que, para fins de
experimentação, poderíamos escrever um Main alternativo que, como o IRPF
lib-modulos/irpf-gui-basica.jar.src/serpro/ppgd/irpf/gui/basica/dialogs/PainelGravarTransmitir.java
chame ((ControleReceitaNet)recnet).enviarDeclaracao(Window, File,
boolean, StringBuffer).  Pelo que entendi, File é pra ser o .DEC, o
boolean é pra indicar se é pra transmitir usando certificado digital, e
o StringBuffer é pra ser vazio pra chamada devolver mensagens.  Window
seria a janela principal para interação, não sei se pode ser null ou se
precisa mesmo criar alguma coisa.


Outra descoberta talvez útil é que quem faz a validação do
receitanet.jar a partir do sha1 em receitanet.dat é o próprio, em
ControleReceitanet.a().  Em tese (porque não testei) bastaria explodir o
.jar e usar o diretório em vez do .jar no classpath que ele deixa de
verificar.  Aí poderíamos substituir classes para experimentar, por
exemplo, adicionar código para nos informar o que está acontecendo, o
que está sendo enviado, o que está sendo recebido, enfim...


Com um programinha de linha de comando que só faz o envio, ou mesmo só
prepara pra fazer o envio, podemos começar a entender o que está
acontecendo ali, com prints ou com um depurador.


Do que eu entendi até agora, parece que:

- o enviarDeclaracao instancia um w (e não um y) com o arquivo .DEC,
  porque creio que envelope.importar não tem como encontrar os tags
  esperados no .DEC.  Daí cria uma lista com esse w, uma lista de mesmo
  tamanho com o booleano (de certificação) convertido pra inteiro, um
  array de String[]s e um de Integer[]s e chama a(Window, List, List,
  String[], Integer[]) para iterar sobre as listas e transmitir as
  declarações

- parece que podemos evitar a confirmação, se é que há alguma,
  inicializando ControleReceitanet.b = false em vez de true no
  construtor, ou em serpro/receitanet/recursos/receitanet.properties
  build.producao=true (já é) ou teste.nao_exibir_mensagens=true

- nesse arquivo há um gui.progresso.exibir=true que talvez possamos
  desligar para evitar precisar de uma janela.  a testar...

- também há um número de versão.  infelizmente colocar esse número de
  versão no rnetclient não foi suficiente para ele funcionar

- w.R() lembra bastante o rnet_encode() do rnetclient

- aL.a(String, int, c) é onde conexões com o servidor são estabelecidas

- aG é onde a camada de SSL/TLS é introduzida

- parece-me que ap.a() é onde a transmissão acontece, mas foi só até
  aqui que eu cheguei na exploração do código por enquanto

-- 
Alexandre Oliva, happy hacker            https://blog.lx.oliva.nom.br/
Free Software Activist     FSFLA co-founder     GNU Toolchain Engineer
Learn the truth about Richard Stallman at https://stallmansupport.org/


Más información sobre la lista de distribución Softwares-impostos