SusiMail: Fix handling of requests for unknown messages

This commit is contained in:
zzz
2017-12-08 17:37:33 +00:00
parent 4c18e2f057
commit 5aef5e24e3
3 changed files with 51 additions and 34 deletions

View File

@@ -90,9 +90,9 @@ class Mail {
}
/**
* This may or may not contain the body also.
* @return may be null
*/
* This may or may not contain the body also.
* @return if null, nothing has been loaded yet for this UIDL
*/
public synchronized ReadBuffer getHeader() {
return header;
}
@@ -104,6 +104,9 @@ class Mail {
parseHeaders();
}
/**
* @return if false, nothing has been loaded yet for this UIDL
*/
public synchronized boolean hasHeader() {
return header != null;
}

View File

@@ -121,6 +121,7 @@ class MailCache {
mail = mails.get( uidl );
if( mail == null ) {
newMail = new Mail(uidl);
// TODO really?
mails.put( uidl, newMail );
}
}

View File

@@ -1725,14 +1725,13 @@ public class WebMail extends HttpServlet
if( sessionObject.state == STATE_SHOW ) {
if (isPOST)
showUIDL = processMessageButtons(sessionObject, showUIDL, request);
// ?download=nnn link should be valid in any state
// but depends on current UIDL
// ?download=nnn&b64uidl link (same for ?att) should be valid in any state
if (processDownloadLink(sessionObject, showUIDL, request, response)) {
// download or raw view sent, or 404
return;
}
if (isPOST && processSaveAsLink(sessionObject, showUIDL, request, response)) {
// download or sent, or 404
// download sent, or 404
return;
}
// If the last message has just been deleted then
@@ -1776,10 +1775,14 @@ public class WebMail extends HttpServlet
subtitle = ngettext("1 Message", "{0} Messages", sessionObject.folder.getSize());
} else if( sessionObject.state == STATE_SHOW ) {
Mail mail = showUIDL != null ? sessionObject.mailCache.getMail(showUIDL, MailCache.FetchMode.HEADER) : null;
if (mail != null && mail.shortSubject != null)
subtitle = mail.shortSubject; // already HTML encoded
else
subtitle = _t("Show Message");
if (mail != null && mail.hasHeader()) {
if (mail.shortSubject != null)
subtitle = mail.shortSubject; // already HTML encoded
else
subtitle = _t("Show Message");
} else {
subtitle = _t("Message not found.");
}
} else if( sessionObject.state == STATE_NEW ) {
subtitle = _t("New Message");
} else if( sessionObject.state == STATE_CONFIG ) {
@@ -2277,13 +2280,14 @@ public class WebMail extends HttpServlet
//if (Config.hasConfigFile())
// out.println(button( RELOAD, _t("Reload Config") ) + spacer);
out.println(button( LOGOUT, _t("Logout") ));
if (sessionObject.folder.getPages() > 1)
showPageButtons(out, sessionObject.folder);
Folder<String> folder = sessionObject.folder;
if (folder.getPages() > 1)
showPageButtons(out, folder);
out.println("</div>");
String curSort = sessionObject.folder.getCurrentSortBy();
Folder.SortOrder curOrder = sessionObject.folder.getCurrentSortingDirection();
String curSort = folder.getCurrentSortBy();
Folder.SortOrder curOrder = folder.getCurrentSortingDirection();
out.println("<table id=\"mailbox\" cellspacing=\"0\" cellpadding=\"5\">\n" +
"<tr><td colspan=\"9\"><hr></td></tr>\n<tr><th title=\"" + _t("Mark for deletion") + "\">&nbsp;</th>" +
thSpacer + "<th>" + sortHeader( SORT_SENDER, _t("From"), sessionObject.imgPath, curSort, curOrder ) + "</th>" +
@@ -2294,11 +2298,10 @@ public class WebMail extends HttpServlet
thSpacer + "<th>" + sortHeader( SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder ) + "</th></tr>" );
int bg = 0;
int i = 0;
for( Iterator<String> it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) {
for (Iterator<String> it = folder.currentPageIterator(); it != null && it.hasNext(); ) {
String uidl = it.next();
Mail mail = sessionObject.mailCache.getMail( uidl, MailCache.FetchMode.HEADER );
if (mail == null) {
i++;
if (mail == null || !mail.hasHeader()) {
continue;
}
String type;
@@ -2349,10 +2352,10 @@ public class WebMail extends HttpServlet
if (i == 0)
out.println("<tr><td colspan=\"9\" align=\"center\"><div id=\"emptymailbox\"><i>" + _t("No messages") + "</i></div></td></tr>");
out.println( "<tr class=\"bottombuttons\"></tr>");
if (sessionObject.folder.getPages() > 1 && i > 30) {
if (folder.getPages() > 1 && i > 30) {
// show the buttons again if page is big
out.println("<tr class=\"bottombuttons\"><td colspan=\"9\" align=\"center\">");
showPageButtons(out, sessionObject.folder);
showPageButtons(out, folder);
out.println("</td></tr>");
}
out.println("<tr class=\"bottombuttons\"><td colspan=\"5\" align=\"left\">");
@@ -2425,26 +2428,36 @@ public class WebMail extends HttpServlet
out.println( "-->" );
}
out.println("<div class=\"topbuttons\">");
out.println( button( NEW, _t("New") ) + spacer +
button( REPLY, _t("Reply") ) +
button( REPLYALL, _t("Reply All") ) +
button( FORWARD, _t("Forward") ) + spacer +
button( SAVE_AS, _t("Save As") ) + spacer);
if (sessionObject.reallyDelete)
out.println(button2(DELETE, _t("Delete")));
else
out.println(button(DELETE, _t("Delete")));
out.println( button( NEW, _t("New") ) + spacer);
boolean hasHeader = mail != null && mail.hasHeader();
if (hasHeader) {
out.println(button( REPLY, _t("Reply") ) +
button( REPLYALL, _t("Reply All") ) +
button( FORWARD, _t("Forward") ) + spacer +
button( SAVE_AS, _t("Save As") ) + spacer);
if (sessionObject.reallyDelete)
out.println(button2(DELETE, _t("Delete")));
else
out.println(button(DELETE, _t("Delete")));
}
out.println(button(LOGOUT, _t("Logout") ));
// TODO make these GETs not POSTs so we have a consistent URL
out.println("<div id=\"messagenav\">" +
( sessionObject.folder.isFirstElement(showUIDL) ? button2( PREV, _t("Previous") ) : button( PREV, _t("Previous") ) ) + spacer +
button( LIST, _t("Back to Folder") ) + spacer +
( sessionObject.folder.isLastElement(showUIDL) ? button2( NEXT, _t("Next") ) : button( NEXT, _t("Next") ) ));
out.println("<div id=\"messagenav\">");
if (hasHeader) {
out.println(
( sessionObject.folder.isFirstElement(showUIDL) ? button2(PREV, _t("Previous")) : button(PREV, _t("Previous")))
+ spacer);
}
out.println(button( LIST, _t("Back to Folder") ) + spacer);
if (hasHeader) {
out.println(
( sessionObject.folder.isLastElement(showUIDL) ? button2(NEXT, _t("Next")) : button(NEXT, _t("Next"))));
}
out.println("</div></div>");
//if (Config.hasConfigFile())
// out.println(button( RELOAD, _t("Reload Config") ) + spacer);
out.println( "<div id=\"viewmail\"><table id=\"message_full\" cellspacing=\"0\" cellpadding=\"5\">\n");
if( mail != null ) {
if (hasHeader) {
out.println("<tr><td colspan=\"2\"><table id=\"mailhead\">\n" +
"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
"<tr><td align=\"right\">" + _t("From") +
@@ -2464,7 +2477,7 @@ public class WebMail extends HttpServlet
}
}
else {
out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">" + _t("Could not fetch mail.") + "</p></td></tr>\n" );
out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">" + _t("Message not found.") + "</p></td></tr>\n" );
}
out.println( "</table></div>" );
}