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

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

View File

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

View File

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