Geronimo javamail does not work on non-ASCII platforms
------------------------------------------------------
Key: GERONIMO-5326
URL: https://issues.apache.org/jira/browse/GERONIMO-5326
Project: Geronimo
Issue Type: Bug
Security Level: public (Regular issues)
Components: mail
Environment: z/OS
Reporter: Robin Fernandes
[RFC-1939|http://www.ietf.org/rfc/rfc1939.txt] states that in the POP3
protocol, "Keywords and arguments consist of printable ASCII characters."
Geronimo javamail creates a PrintWriter to send messages down the line, but
does not specify a Charset. Therefore, Strings written to the PrintWriter will
be converted to bytes using the platform default encoding. On a non-ASCII
platform, such as z/OS (which is an EBCDIC platform), this means non-ASCII data
will be sent down the line. Consequently, the POP3 protocol is violated and the
mail server will not understand the messages.
In my context, this manifests as a javax.mail.AuthenticationFailedException,
presumably because the server fails to understand the login commands.
The patch below at least gets past the auth step. However, I suspect there will
be further charset problems relating to decoding MIME etc... Essentially, a
potential problem exists wherever the library uses new String(bytes[]),
String.getBytes(), InputStreamReaders, OuputStreamWriters or any other entity
that performs byte[]<->String conversions without explicitly specifying which
Charset to use.
In some environments, a workaround may be to force the default encoding to
ASCII by setting system property file.encoding to an ASCII codepage (e.g.
-Dfile.encoding=ISO8859-1), but this is not satisfactory if other libraries in
the same runtime expect the default encoding to be EBCDIC.
{code}
Index: POP3Connection.java
===================================================================
--- POP3Connection.java (revision 946178)
+++ POP3Connection.java (working copy)
@@ -22,6 +22,7 @@
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
+import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
@@ -156,8 +157,9 @@
// The POp3 protocol is inherently a string-based protocol, so we get
// string readers/writers for the connection streams
- reader = new BufferedReader(new InputStreamReader(inputStream));
- writer = new PrintWriter(new BufferedOutputStream(outputStream));
+ Charset iso88591 = Charset.forName("ISO8859-1");
+ reader = new BufferedReader(new InputStreamReader(inputStream,
iso88591));
+ writer = new PrintWriter(new OutputStreamWriter(new
BufferedOutputStream(outputStream), iso88591));
}
protected void getWelcome() throws IOException {
{code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.