From 0ec39e5ea1c8be7c8990c862482b26ce99341ec2 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 14 Dec 2017 21:20:42 +0000 Subject: [PATCH] SusiMail: Rework search params and preserve across P-R-G (ticket #1373) --- .../src/src/i2p/susi/webmail/WebMail.java | 144 +++++++++++------- 1 file changed, 91 insertions(+), 53 deletions(-) diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index 2b4502ce7..22539718f 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -26,6 +26,7 @@ package i2p.susi.webmail; import i2p.susi.debug.Debug; import i2p.susi.util.Config; import i2p.susi.util.Folder; +import i2p.susi.util.Folder.SortOrder; import i2p.susi.util.ReadBuffer; import i2p.susi.webmail.Messages; import i2p.susi.webmail.encoding.DecodingException; @@ -49,6 +50,7 @@ import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.text.Collator; import java.util.ArrayList; +import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.Enumeration; @@ -132,6 +134,7 @@ public class WebMail extends HttpServlet private static final String NEXT_B64UIDL = "nextb64uidl"; private static final String PREV_PAGE_NUM = "prevpagenum"; private static final String NEXT_PAGE_NUM = "nextpagenum"; + private static final String CURRENT_SORT = "currentsort"; /* * button names @@ -182,11 +185,19 @@ public class WebMail extends HttpServlet private static final String LIST = "list"; private static final String PREV = "prev"; private static final String NEXT = "next"; - private static final String SORT_ID = "sort_id"; - private static final String SORT_SENDER = "sort_sender"; - private static final String SORT_SUBJECT = "sort_subject"; - private static final String SORT_DATE = "sort_date"; - private static final String SORT_SIZE = "sort_size"; + + // SORT is a GET or POST param, SORT_XX are the values, possibly prefixed by '-' + private static final String SORT = "sort"; + private static final String SORT_ID = "id"; + private static final String SORT_SENDER = "sender"; + private static final String SORT_SUBJECT = "subject"; + private static final String SORT_DATE = "date"; + private static final String SORT_SIZE = "size"; + private static final String SORT_DEFAULT = SORT_DATE; + // for XSS + private static final List VALID_SORTS = Arrays.asList(new String[] { + SORT_ID, SORT_SENDER, SORT_SUBJECT, SORT_DATE, SORT_SIZE, + '-' + SORT_ID, '-' + SORT_SENDER, '-' + SORT_SUBJECT, '-' + SORT_DATE, '-' + SORT_SIZE }); private static final String CONFIG_TEXT = "config_text"; @@ -548,21 +559,22 @@ public class WebMail extends HttpServlet * @param label * @return the string */ - private static String sortHeader( String name, String label, String imgPath, String currentName, Folder.SortOrder currentOrder) + private static String sortHeader(String name, String label, String imgPath, + String currentName, SortOrder currentOrder, int page) { StringBuilder buf = new StringBuilder(128); buf.append(label).append("  "); - if (name.equals(currentName) && currentOrder == Folder.SortOrder.UP) { + if (name.equals(currentName) && currentOrder == SortOrder.UP) { buf.append("\"^\"\n"); } else { - buf.append(""); + buf.append(""); buf.append("\"^\""); buf.append("\n"); } - if (name.equals(currentName) && currentOrder == Folder.SortOrder.DOWN) { + if (name.equals(currentName) && currentOrder == SortOrder.DOWN) { buf.append("\"v\""); } else { - buf.append(""); + buf.append(""); buf.append("\"v\""); buf.append(""); } @@ -863,8 +875,8 @@ public class WebMail extends HttpServlet sessionObject.folder.addSorter( SORT_DATE, new DateSorter( sessionObject.mailCache ) ); sessionObject.folder.addSorter( SORT_SIZE, new SizeSorter( sessionObject.mailCache ) ); // reverse sort, latest mail first - sessionObject.folder.setSortingDirection(Folder.SortOrder.UP); - sessionObject.folder.sortBy(SORT_DATE); + sessionObject.folder.setSortingDirection(SortOrder.UP); + sessionObject.folder.sortBy(SORT_DEFAULT); sessionObject.reallyDelete = false; if (offline) Debug.debug(Debug.DEBUG, "OFFLINE MODE"); @@ -964,11 +976,7 @@ public class WebMail extends HttpServlet buttonPressed( request, MARKALL ) || buttonPressed( request, CLEAR ) || buttonPressed( request, INVERT ) || - buttonPressed( request, SORT_ID ) || - buttonPressed( request, SORT_SENDER ) || - buttonPressed( request, SORT_SUBJECT ) || - buttonPressed( request, SORT_DATE ) || - buttonPressed( request, SORT_SIZE ) || + buttonPressed( request, SORT ) || buttonPressed( request, REFRESH ) || buttonPressed( request, LIST )) { sessionObject.state = STATE_LIST; @@ -998,11 +1006,7 @@ public class WebMail extends HttpServlet buttonPressed( request, MARKALL ) || buttonPressed( request, CLEAR ) || buttonPressed( request, INVERT ) || - buttonPressed( request, SORT_ID ) || - buttonPressed( request, SORT_SENDER ) || - buttonPressed( request, SORT_SUBJECT ) || - buttonPressed( request, SORT_DATE ) || - buttonPressed( request, SORT_SIZE ) || + buttonPressed( request, SORT ) || buttonPressed( request, REFRESH )) { sessionObject.state = STATE_LIST; } @@ -1517,29 +1521,18 @@ public class WebMail extends HttpServlet */ private static void processSortingButtons(SessionObject sessionObject, RequestWrapper request) { - //processSortingButton( sessionObject, request, SORT_ID ); - processSortingButton( sessionObject, request, SORT_SENDER ); - processSortingButton( sessionObject, request, SORT_SUBJECT ); - processSortingButton( sessionObject, request, SORT_DATE ); - processSortingButton( sessionObject, request, SORT_SIZE ); - } - - /** - * @param sessionObject - * @param request - * @param sort_id - */ - private static void processSortingButton(SessionObject sessionObject, RequestWrapper request, String sort_id ) - { - String str = request.getParameter( sort_id ); - if( str != null ) { - if( str.equalsIgnoreCase("up")) { - sessionObject.folder.setSortingDirection(Folder.SortOrder.UP); - sessionObject.folder.sortBy( sort_id ); - } else if( str.equalsIgnoreCase("down")) { - sessionObject.folder.setSortingDirection(Folder.SortOrder.DOWN); - sessionObject.folder.sortBy( sort_id ); + String str = request.getParameter(SORT); + if (str != null && VALID_SORTS.contains(str)) { + SortOrder order; + if (str.startsWith("-")) { + order = SortOrder.DOWN; + str = str.substring(1); + } else { + order = SortOrder.UP; } + // TODO don't store in session + sessionObject.folder.setSortingDirection(order); + sessionObject.folder.sortBy(str); } } @@ -1776,10 +1769,15 @@ public class WebMail extends HttpServlet buttonPressed(request, LOGIN) || buttonPressed(request, OFFLINE)) { // P-R-G String q = '?' + CUR_PAGE + '=' + newPage; + // CURRENT_SORT is only in page POSTs + String str = request.getParameter(CURRENT_SORT); + if (str != null && !str.equals(SORT_DEFAULT) && VALID_SORTS.contains(str)) + q += "&sort=" + str; sendRedirect(httpRequest, response, q); return; } } + // sort buttons are GETs processSortingButtons( sessionObject, request ); for( Iterator it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) { String uidl = it.next(); @@ -1837,12 +1835,13 @@ public class WebMail extends HttpServlet /* * update folder content */ + Folder folder = sessionObject.folder; if( sessionObject.state == STATE_LIST ) { // get through cache so we have the disk-only ones too String[] uidls = sessionObject.mailCache.getUIDLs(); if (uidls != null) { // TODO why every time? - sessionObject.folder.setElements(uidls); + folder.setElements(uidls); } } @@ -1857,7 +1856,7 @@ public class WebMail extends HttpServlet // mailbox.getNumMails() forces a connection, don't use it // Not only does it slow things down, but a failure causes all our messages to "vanish" //subtitle = ngettext("1 Message", "{0} Messages", sessionObject.mailbox.getNumMails()); - subtitle = ngettext("1 Message", "{0} Messages", sessionObject.folder.getSize()); + subtitle = ngettext("1 Message", "{0} Messages", folder.getSize()); } else if( sessionObject.state == STATE_SHOW ) { Mail mail = showUIDL != null ? sessionObject.mailCache.getMail(showUIDL, MailCache.FetchMode.HEADER) : null; if (mail != null && mail.hasHeader()) { @@ -1917,7 +1916,22 @@ public class WebMail extends HttpServlet // reencode, as showUIDL may have changed, and also for XSS b64UIDL = Base64.encode(showUIDL); out.println(""); + } else if (sessionObject.state == STATE_NEW) { + // for NEW, try to get back to the current page if we weren't replying + int page = 1; + String sp = request.getParameter(CUR_PAGE); + if (sp != null) { + try { + page = Integer.parseInt(sp); + } catch (NumberFormatException nfe) {} + } + out.println(""); } + // Save sort order in case it changes later + String curSort = folder.getCurrentSortBy(); + SortOrder curOrder = folder.getCurrentSortingDirection(); + String fullSort = curOrder == SortOrder.DOWN ? '-' + curSort : curSort; + out.println(""); } if( sessionObject.error != null && sessionObject.error.length() > 0 ) { out.println( "

" + quoteHTML(sessionObject.error).replace("\n", "
") + "

" ); @@ -2399,16 +2413,40 @@ public class WebMail extends HttpServlet out.println(""); - String curSort = folder.getCurrentSortBy(); - Folder.SortOrder curOrder = folder.getCurrentSortingDirection(); + SortOrder curOrder; + String curSort = request.getParameter(SORT); + String fullSort; + if (curSort == null) + curSort = request.getParameter(CURRENT_SORT); + if (curSort != null && VALID_SORTS.contains(curSort)) { + fullSort = curSort; + if (curSort.startsWith("-")) { + curSort = curSort.substring(1); + curOrder = SortOrder.DOWN; + } else { + curOrder = SortOrder.UP; + } + // TODO don't store in session + if (curOrder != folder.getCurrentSortingDirection() || !curSort.equals(folder.getCurrentSortBy())) { + folder.setSortingDirection(curOrder); + folder.sortBy(curSort); + } + } else { + curSort = folder.getCurrentSortBy(); + curOrder = folder.getCurrentSortingDirection(); + fullSort = curOrder == SortOrder.DOWN ? '-' + curSort : curSort; + } + out.println(""); + if (curSort.startsWith("-")) + curSort = curSort.substring(1); out.println("\n" + "\n" + - thSpacer + "" + - thSpacer + "" + - thSpacer + "" + + thSpacer + "" + + thSpacer + "" + - thSpacer + "" ); + thSpacer + "" ); int bg = 0; int i = 0; for (Iterator it = folder.currentPageIterator(); it != null && it.hasNext(); ) { @@ -2493,7 +2531,7 @@ public class WebMail extends HttpServlet // moved to config page //out.print( // _t("Page Size") + ": " + - // " " + + // " " + // button( SETPAGESIZE, _t("Set") ) ); out.print("
"); out.print(button(CONFIGURE, _t("Settings")));

 " + sortHeader( SORT_SENDER, _t("From"), sessionObject.imgPath, curSort, curOrder ) + "" + sortHeader( SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder ) + "" + sortHeader( SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder ) + + thSpacer + "" + sortHeader(SORT_SENDER, _t("From"), sessionObject.imgPath, curSort, curOrder, page) + "" + sortHeader(SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder, page) + "" + sortHeader(SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder, page) + //sortHeader( SORT_ID, "", sessionObject.imgPath ) + "" + sortHeader( SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder ) + "
" + sortHeader(SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder, page) + "