Início > Programação > Bouncy Castle: Exceção no Método saveChanges() da Classe MimeMessage

Bouncy Castle: Exceção no Método saveChanges() da Classe MimeMessage

Um colega e eu vimos um comportamento estranho na classe SMIMEGenerator do Bouncy Castle. Contornamos o problema e divulgamos a solução na lista de discussão . Estávamos tentando assinar um e-mail que não era montado no mesmo processo da assinatura, mas sim carregado à partir do disco. Segue abaixo a descrição do problema e nossa solução.

Ambiente

Java 6 update 45
Windows 7
bouncycastle 15on-150
JavaMail 1.5.2

Passos

1. Crie um e-mail utilizando javax.mail.internet.MimeMessage;

2. Grave o e-mail em disco com:

MimeMessage.writeTo(new FileOutputStream("DIRETORIO\mail.msg");

3. Carregue o e-mail para um objeto MimeMessage utilizando o construtor:

new MimeMessage(sessao, new FileInputStream("DIRETORIO\mail.msg"));

4. Assine o e-mail utilizando a classe:

org.bouncycastle.mail.smime.SMIMESignedGenerator class.

5. Por fim, com o objeto MimeMultipart resultante da assiantura, faça:

signedMessage.setContent(mimeMultipart);
signedMessage.saveChanges();

O método signedMessage.saveChanges() lança exceção:

javax.mail.MessagingException: MIME part of type "multipart/mixed; boundary=
"----=_Part_0_1053523983.1399989665935"" contains object of type 
javax.mail.util.SharedByteArrayInputStream instead of MimeMultipart
     at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1460)
     at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1125)
     at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:515)
     at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1458)
     at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2190)
     at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2151)

Análise

O problema está na classe org.bouncycastle.mail.smime.SMIMEGenerator, no método makeContentBodyPart(…), linha 133, na chamada abaixo:

content.setContent(message.getRawInputStream(), message.getContentType())

O método message.getRawInputStream() retorna um objeto javax.mail.util.SharedByteArrayInputStream, mas o tipo desse objeto não pode ser adicionado ao header da mensagem em signedMessage.saveChanges().

Solução

Extendemos a classe SMIMEGenerator e sobrescrevemos o método makeContentBodyPart(…) alterando de:

content.setContent(message.getRawInputStream(), message.getContentType())

Para:

content.setContent(message.getContent(), message.getContentType())
Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: