You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Johnny Haugen Sørgård (JIRA)" <ji...@apache.org> on 2016/08/28 14:17:21 UTC
[jira] [Comment Edited] (NET-601) IMAPClient.select cannot select mailbox in some cases with æøå, spaces and sub-folders
[ https://issues.apache.org/jira/browse/NET-601?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15443518#comment-15443518 ]
Johnny Haugen Sørgård edited comment on NET-601 at 8/28/16 2:16 PM:
--------------------------------------------------------------------
Sebb - Here's test-code
Comments:
* the config is up and running, so it can be used for testing purposes.
* problematic folders have been created.
* In production BASE64MailboxEncoder and BASE64MailboxDecoder from javamail have been used to encode and decode foldernames.
* The test routine:
- logs on,
- gets the list of folders
- tries to select some folders using the encoder
- finally tries to select all the folders as returned from LIST
The formatting on web seems weird, so source is also attached.
public static void test(){
// config
String host = "munin02.prpr.no";
String user = "tte";
String password = "g6o623ds";
// login
AuthenticatingIMAPClient imapClient = new AuthenticatingIMAPClient(/*getProtocol(), */true); // implicit
// listener -> System.out
final PrintCommandListener listener = new PrintCommandListener(System.out, true) {
@Override
public void protocolReplyReceived(ProtocolCommandEvent event) {
if (event.getReplyCode() != IMAPReply.PARTIAL){ // This is dealt with by the chunk listener
super.protocolReplyReceived(event);
}
}
};
imapClient.addProtocolCommandListener(listener);
try {
imapClient.connect(host);
// Try oauth = e.g. gmail
((AuthenticatingIMAPClient) imapClient).authenticate(AuthenticatingIMAPClient.AUTH_METHOD.PLAIN, user, password);
} catch (IOException | InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException e) {
out("Error.connect: " + e.getMessage());
throw new RuntimeException("Could not connect to server. " + e.getMessage(), e);
}
// get Folders
String[] folders = getFoldersAsArray(imapClient);
// try selected folders
testFolder(imapClient, "Backup log", true); // ok
testFolder(imapClient, "Møter", true); // ok
testFolder(imapClient, "Presis\\Bank2", true); // ok
testFolder(imapClient, "Presis\\Bodø Industri", true);
testFolder(imapClient, "Presis\\Done", true); // ok
testFolder(imapClient, "Presis\\id filer", true);
testFolder(imapClient, "Sendte elementer", true); // ok
// try all folders
for(String folder: folders){
testFolder(imapClient, folder, false);
}
}
private static void testFolder(AuthenticatingIMAPClient imapClient, String folder, boolean convertFoldername){
// select folder
try {
String fName = convertFoldername ? BASE64MailboxEncoder.encode(folder) : folder.trim();
if (((!fName.equals(folder)) || (fName.contains(" "))) && (!fName.startsWith("\"")) ) {
fName = "\"" + fName + "\"";
}
out("imapFoldername: " + folder + " -> " + fName);
out(folder + ": " + String.valueOf(imapClient.select(fName)));
} catch (NumberFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String[] getFoldersAsArray(AuthenticatingIMAPClient imapClient) {
String[] result = null;
try {
imapClient.sendCommand("LIST \"\" \"*\"");
String[] folders = imapClient.getReplyStrings();
List<String> folderList = new ArrayList<String>();
boolean acceptNext = false;;
for (int i = 0; i < folders.length; i++) {
out(folders[i]);
String line = folders[i];
if (! acceptNext) {
if (line.startsWith("* LIST")) {
int delTo = line.indexOf("\"\\\\\""); // domino format
int delCount = 5;
if (delTo == -1) {
delTo = line.indexOf("\"/\""); // microsoft format
delCount = 4;
}
if (delTo > 0) {
line = line.substring(delTo + delCount);
} else {
}
if (line.startsWith("{") && (line.endsWith("}"))) {
acceptNext = true;
line = "";
}
} else if (line.indexOf("OK LIST") > 0) {
line = "";
}
}
if (! line.isEmpty()) {
// line = BASE64MailboxDecoder.decode(line);
folderList.add(line);
acceptNext = false;
}
}
result = folderList.toArray(new String[0]);
} catch (IOException | RuntimeException e) {
e.printStackTrace();
}
return result;
}
was (Author: yggdrasild):
Sebb - Here's test-code
Comments:
* the config is up and running, so it can be used for testing purposes.
* problematic folders have been created.
* In production BASE64MailboxEncoder and BASE64MailboxDecoder from javamail have been used to encode and decode foldernames.
* The test routine:
- logs on,
- gets the list of folders
- tries to select some folders using the encoder
- finally tries to select all the folders as returned from LIST
public static void test(){
// config
String host = "munin02.prpr.no";
String user = "tte";
String password = "g6o623ds";
// login
AuthenticatingIMAPClient imapClient = new AuthenticatingIMAPClient(/*getProtocol(), */true); // implicit
// listener -> System.out
final PrintCommandListener listener = new PrintCommandListener(System.out, true) {
@Override
public void protocolReplyReceived(ProtocolCommandEvent event) {
if (event.getReplyCode() != IMAPReply.PARTIAL){ // This is dealt with by the chunk listener
super.protocolReplyReceived(event);
}
}
};
imapClient.addProtocolCommandListener(listener);
try {
imapClient.connect(host);
// Try oauth = e.g. gmail
((AuthenticatingIMAPClient) imapClient).authenticate(AuthenticatingIMAPClient.AUTH_METHOD.PLAIN, user, password);
} catch (IOException | InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException e) {
out("Error.connect: " + e.getMessage());
throw new RuntimeException("Could not connect to server. " + e.getMessage(), e);
}
// get Folders
String[] folders = getFoldersAsArray(imapClient);
// try selected folders
testFolder(imapClient, "Backup log", true); // ok
testFolder(imapClient, "Møter", true); // ok
testFolder(imapClient, "Presis\\Bank2", true); // ok
testFolder(imapClient, "Presis\\Bodø Industri", true);
testFolder(imapClient, "Presis\\Done", true); // ok
testFolder(imapClient, "Presis\\id filer", true);
testFolder(imapClient, "Sendte elementer", true); // ok
// try all folders
for(String folder: folders){
testFolder(imapClient, folder, false);
}
}
private static void testFolder(AuthenticatingIMAPClient imapClient, String folder, boolean convertFoldername){
// select folder
try {
String fName = convertFoldername ? BASE64MailboxEncoder.encode(folder) : folder.trim();
if (((!fName.equals(folder)) || (fName.contains(" "))) && (!fName.startsWith("\"")) ) {
fName = "\"" + fName + "\"";
}
out("imapFoldername: " + folder + " -> " + fName);
out(folder + ": " + String.valueOf(imapClient.select(fName)));
} catch (NumberFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String[] getFoldersAsArray(AuthenticatingIMAPClient imapClient) {
String[] result = null;
try {
imapClient.sendCommand("LIST \"\" \"*\"");
String[] folders = imapClient.getReplyStrings();
List<String> folderList = new ArrayList<String>();
boolean acceptNext = false;;
for (int i = 0; i < folders.length; i++) {
out(folders[i]);
String line = folders[i];
if (! acceptNext) {
if (line.startsWith("* LIST")) {
int delTo = line.indexOf("\"\\\\\""); // domino format
int delCount = 5;
if (delTo == -1) {
delTo = line.indexOf("\"/\""); // microsoft format
delCount = 4;
}
if (delTo > 0) {
line = line.substring(delTo + delCount);
} else {
}
if (line.startsWith("{") && (line.endsWith("}"))) {
acceptNext = true;
line = "";
}
} else if (line.indexOf("OK LIST") > 0) {
line = "";
}
}
if (! line.isEmpty()) {
// line = BASE64MailboxDecoder.decode(line);
folderList.add(line);
acceptNext = false;
}
}
result = folderList.toArray(new String[0]);
} catch (IOException | RuntimeException e) {
e.printStackTrace();
}
return result;
}
> IMAPClient.select cannot select mailbox in some cases with æøå, spaces and sub-folders
> --------------------------------------------------------------------------------------
>
> Key: NET-601
> URL: https://issues.apache.org/jira/browse/NET-601
> Project: Commons Net
> Issue Type: Bug
> Components: IMAP
> Affects Versions: 3.5
> Environment: eclipse on ubuntu workstation and ibm domino server on ubuntu server. Connecting to IMAP on an IBM Domino server.
> Reporter: Johnny Haugen Sørgård
> Attachments: testCommonsNetIMAPselect.java
>
>
> Partial response from LIST:
> AAAB LIST "" "*"
> * LIST (\HasNoChildren) "\\" "Backup log"
> * LIST (\Noinferiors \HasNoChildren) "\\" Inbox
> * LIST (\HasNoChildren) "\\" M&APg-ter
> * LIST (\HasChildren) "\\" Presis
> * LIST (\HasNoChildren) "\\" {24}
> Presis\Bod&APg- Industri
> * LIST (\HasNoChildren) "\\" {11}
> Presis\Done
> * LIST (\HasNoChildren) "\\" {15}
> Presis\id filer
> Trying to select Presis\Bodø Industri fails like this
> AAAB SELECT "Presis\Bod&APg- Industri"
> AAAB NO SELECT failure, cannot select mailbox: Folder not found in IMAP name space
> And trying to select Presis\id filer fails like this
> AAAB SELECT "Presis\id filer"
> AAAB NO SELECT failure, cannot select mailbox: Folder not found in IMAP name space
> So far it seems like select fails when folder has more than one:
> * none US-ASCII
> * space
> * sub-folder separator
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)