Changeset 0ec39e5


Ignore:
Timestamp:
Dec 14, 2017 9:20:42 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
aca2f57
Parents:
52f736a
Message:

SusiMail?: Rework search params and preserve across P-R-G (ticket #1373)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    r52f736a r0ec39e5  
    2727import i2p.susi.util.Config;
    2828import i2p.susi.util.Folder;
     29import i2p.susi.util.Folder.SortOrder;
    2930import i2p.susi.util.ReadBuffer;
    3031import i2p.susi.webmail.Messages;
     
    5051import java.text.Collator;
    5152import java.util.ArrayList;
     53import java.util.Arrays;
    5254import java.util.Comparator;
    5355import java.util.Date;
     
    133135        private static final String PREV_PAGE_NUM = "prevpagenum";
    134136        private static final String NEXT_PAGE_NUM = "nextpagenum";
     137        private static final String CURRENT_SORT = "currentsort";
    135138
    136139        /*
     
    183186        private static final String PREV = "prev";
    184187        private static final String NEXT = "next";
    185         private static final String SORT_ID = "sort_id";
    186         private static final String SORT_SENDER = "sort_sender";
    187         private static final String SORT_SUBJECT = "sort_subject";
    188         private static final String SORT_DATE = "sort_date";
    189         private static final String SORT_SIZE = "sort_size";
     188
     189        // SORT is a GET or POST param, SORT_XX are the values, possibly prefixed by '-'
     190        private static final String SORT = "sort";
     191        private static final String SORT_ID = "id";
     192        private static final String SORT_SENDER = "sender";
     193        private static final String SORT_SUBJECT = "subject";
     194        private static final String SORT_DATE = "date";
     195        private static final String SORT_SIZE = "size";
     196        private static final String SORT_DEFAULT = SORT_DATE;
     197        // for XSS
     198        private static final List<String> VALID_SORTS = Arrays.asList(new String[] {
     199                                 SORT_ID, SORT_SENDER, SORT_SUBJECT, SORT_DATE, SORT_SIZE,
     200                                 '-' + SORT_ID, '-' + SORT_SENDER, '-' + SORT_SUBJECT, '-' + SORT_DATE, '-' + SORT_SIZE });
    190201
    191202        private static final String CONFIG_TEXT = "config_text";
     
    549560         * @return the string
    550561         */
    551         private static String sortHeader( String name, String label, String imgPath, String currentName, Folder.SortOrder currentOrder)
     562        private static String sortHeader(String name, String label, String imgPath,
     563                                         String currentName, SortOrder currentOrder, int page)
    552564        {
    553565                StringBuilder buf = new StringBuilder(128);
    554566                buf.append(label).append("&nbsp;&nbsp;");
    555                 if (name.equals(currentName) && currentOrder == Folder.SortOrder.UP) {
     567                if (name.equals(currentName) && currentOrder == SortOrder.UP) {
    556568                        buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3up.png\" border=\"0\" alt=\"^\">\n");
    557569                } else {
    558                         buf.append("<a class=\"sort\" href=\"").append(myself).append('?').append(name).append("=up\">");
     570                        buf.append("<a class=\"sort\" href=\"").append(myself).append("?page=").append(page).append("&amp;sort=").append(name).append("\">");
    559571                        buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3up.png\" border=\"0\" alt=\"^\" style=\"opacity: 0.4;\">");
    560572                        buf.append("</a>\n");
    561573                }
    562                 if (name.equals(currentName) && currentOrder == Folder.SortOrder.DOWN) {
     574                if (name.equals(currentName) && currentOrder == SortOrder.DOWN) {
    563575                        buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3down.png\" border=\"0\" alt=\"v\">");
    564576                } else {
    565                         buf.append("<a class=\"sort\" href=\"").append(myself).append('?').append(name).append("=down\">");
     577                        buf.append("<a class=\"sort\" href=\"").append(myself).append("?page=").append(page).append("&amp;sort=-").append(name).append("\">");
    566578                        buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3down.png\" border=\"0\" alt=\"v\" style=\"opacity: 0.4;\">");
    567579                        buf.append("</a>");
     
    864876                                                sessionObject.folder.addSorter( SORT_SIZE, new SizeSorter( sessionObject.mailCache ) );
    865877                                                // reverse sort, latest mail first
    866                                                 sessionObject.folder.setSortingDirection(Folder.SortOrder.UP);
    867                                                 sessionObject.folder.sortBy(SORT_DATE);
     878                                                sessionObject.folder.setSortingDirection(SortOrder.UP);
     879                                                sessionObject.folder.sortBy(SORT_DEFAULT);
    868880                                                sessionObject.reallyDelete = false;
    869881                                                if (offline)
     
    965977                            buttonPressed( request, CLEAR ) ||
    966978                            buttonPressed( request, INVERT ) ||
    967                             buttonPressed( request, SORT_ID ) ||
    968                             buttonPressed( request, SORT_SENDER ) ||
    969                             buttonPressed( request, SORT_SUBJECT ) ||
    970                             buttonPressed( request, SORT_DATE ) ||
    971                             buttonPressed( request, SORT_SIZE ) ||
     979                            buttonPressed( request, SORT ) ||
    972980                            buttonPressed( request, REFRESH ) ||
    973981                            buttonPressed( request, LIST )) {
     
    9991007                            buttonPressed( request, CLEAR ) ||
    10001008                            buttonPressed( request, INVERT ) ||
    1001                             buttonPressed( request, SORT_ID ) ||
    1002                             buttonPressed( request, SORT_SENDER ) ||
    1003                             buttonPressed( request, SORT_SUBJECT ) ||
    1004                             buttonPressed( request, SORT_DATE ) ||
    1005                             buttonPressed( request, SORT_SIZE ) ||
     1009                            buttonPressed( request, SORT ) ||
    10061010                            buttonPressed( request, REFRESH )) {
    10071011                                sessionObject.state = STATE_LIST;
     
    15181522        private static void processSortingButtons(SessionObject sessionObject, RequestWrapper request)
    15191523        {
    1520                 //processSortingButton( sessionObject, request, SORT_ID );
    1521                 processSortingButton( sessionObject, request, SORT_SENDER );
    1522                 processSortingButton( sessionObject, request, SORT_SUBJECT );
    1523                 processSortingButton( sessionObject, request, SORT_DATE );
    1524                 processSortingButton( sessionObject, request, SORT_SIZE );             
    1525         }
    1526 
    1527         /**
    1528          * @param sessionObject
    1529          * @param request
    1530          * @param sort_id
    1531          */
    1532         private static void processSortingButton(SessionObject sessionObject, RequestWrapper request, String sort_id )
    1533         {
    1534                 String str = request.getParameter( sort_id );
    1535                 if( str != null ) {
    1536                         if( str.equalsIgnoreCase("up")) {
    1537                                 sessionObject.folder.setSortingDirection(Folder.SortOrder.UP);
    1538                                 sessionObject.folder.sortBy( sort_id );
    1539                         } else  if( str.equalsIgnoreCase("down")) {
    1540                                 sessionObject.folder.setSortingDirection(Folder.SortOrder.DOWN);
    1541                                 sessionObject.folder.sortBy( sort_id );
    1542                         }
     1524                String str = request.getParameter(SORT);
     1525                if (str != null && VALID_SORTS.contains(str)) {
     1526                        SortOrder order;
     1527                        if (str.startsWith("-")) {
     1528                                order = SortOrder.DOWN;
     1529                                str = str.substring(1);
     1530                        } else {
     1531                                order = SortOrder.UP;
     1532                        }
     1533                        // TODO don't store in session
     1534                        sessionObject.folder.setSortingDirection(order);
     1535                        sessionObject.folder.sortBy(str);
    15431536                }
    15441537        }
     
    17771770                                                // P-R-G
    17781771                                                String q = '?' + CUR_PAGE + '=' + newPage;
     1772                                                // CURRENT_SORT is only in page POSTs
     1773                                                String str = request.getParameter(CURRENT_SORT);
     1774                                                if (str != null && !str.equals(SORT_DEFAULT) && VALID_SORTS.contains(str))
     1775                                                        q += "&sort=" + str;
    17791776                                                sendRedirect(httpRequest, response, q);
    17801777                                                return;
    17811778                                        }
    17821779                                }
     1780                                // sort buttons are GETs
    17831781                                processSortingButtons( sessionObject, request );
    17841782                                for( Iterator<String> it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) {
     
    18381836                         * update folder content
    18391837                         */
     1838                        Folder<String> folder = sessionObject.folder;
    18401839                        if( sessionObject.state == STATE_LIST ) {
    18411840                                // get through cache so we have the disk-only ones too
     
    18431842                                if (uidls != null) {
    18441843                                        // TODO why every time?
    1845                                         sessionObject.folder.setElements(uidls);
     1844                                        folder.setElements(uidls);
    18461845                                }
    18471846                        }
     
    18581857                                        // Not only does it slow things down, but a failure causes all our messages to "vanish"
    18591858                                        //subtitle = ngettext("1 Message", "{0} Messages", sessionObject.mailbox.getNumMails());
    1860                                         subtitle = ngettext("1 Message", "{0} Messages", sessionObject.folder.getSize());
     1859                                        subtitle = ngettext("1 Message", "{0} Messages", folder.getSize());
    18611860                                } else if( sessionObject.state == STATE_SHOW ) {
    18621861                                        Mail mail = showUIDL != null ? sessionObject.mailCache.getMail(showUIDL, MailCache.FetchMode.HEADER) : null;
     
    19181917                                                b64UIDL = Base64.encode(showUIDL);
    19191918                                                out.println("<input type=\"hidden\" name=\"" + B64UIDL + "\" value=\"" + b64UIDL + "\">");
     1919                                        } else if (sessionObject.state == STATE_NEW) {
     1920                                                // for NEW, try to get back to the current page if we weren't replying
     1921                                                int page = 1;
     1922                                                String sp = request.getParameter(CUR_PAGE);
     1923                                                if (sp != null) {
     1924                                                        try {
     1925                                                                page = Integer.parseInt(sp);
     1926                                                        } catch (NumberFormatException nfe) {}
     1927                                                }
     1928                                                out.println("<input type=\"hidden\" name=\"" + CUR_PAGE + "\" value=\"" + page + "\">");
    19201929                                        }
     1930                                        // Save sort order in case it changes later
     1931                                        String curSort = folder.getCurrentSortBy();
     1932                                        SortOrder curOrder = folder.getCurrentSortingDirection();
     1933                                        String fullSort = curOrder == SortOrder.DOWN ? '-' + curSort : curSort;
     1934                                        out.println("<input type=\"hidden\" name=\"" + CURRENT_SORT + "\" value=\"" + fullSort + "\">");
    19211935                                }
    19221936                                if( sessionObject.error != null && sessionObject.error.length() > 0 ) {
     
    24002414
    24012415
    2402                 String curSort = folder.getCurrentSortBy();
    2403                 Folder.SortOrder curOrder = folder.getCurrentSortingDirection();
     2416                SortOrder curOrder;
     2417                String curSort = request.getParameter(SORT);
     2418                String fullSort;
     2419                if (curSort == null)
     2420                        curSort = request.getParameter(CURRENT_SORT);
     2421                if (curSort != null && VALID_SORTS.contains(curSort)) {
     2422                        fullSort = curSort;
     2423                        if (curSort.startsWith("-")) {
     2424                                curSort = curSort.substring(1);
     2425                                curOrder = SortOrder.DOWN;
     2426                        } else {
     2427                                curOrder = SortOrder.UP;
     2428                        }
     2429                        // TODO don't store in session
     2430                        if (curOrder != folder.getCurrentSortingDirection() || !curSort.equals(folder.getCurrentSortBy())) {
     2431                            folder.setSortingDirection(curOrder);
     2432                            folder.sortBy(curSort);
     2433                        }
     2434                } else {
     2435                        curSort = folder.getCurrentSortBy();
     2436                        curOrder = folder.getCurrentSortingDirection();
     2437                        fullSort = curOrder == SortOrder.DOWN ? '-' + curSort : curSort;
     2438                }
     2439                out.println("<input type=\"hidden\" name=\"" + CURRENT_SORT + "\" value=\"" + fullSort + "\">");
     2440                if (curSort.startsWith("-"))
     2441                        curSort = curSort.substring(1);
    24042442                out.println("<table id=\"mailbox\" cellspacing=\"0\" cellpadding=\"5\">\n" +
    24052443                        "<tr><td colspan=\"9\"><hr></td></tr>\n<tr><th title=\"" + _t("Mark for deletion") + "\">&nbsp;</th>" +
    2406                         thSpacer + "<th>" + sortHeader( SORT_SENDER, _t("From"), sessionObject.imgPath, curSort, curOrder ) + "</th>" +
    2407                         thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder ) + "</th>" +
    2408                         thSpacer + "<th>" + sortHeader( SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder ) +
     2444                        thSpacer + "<th>" + sortHeader(SORT_SENDER, _t("From"), sessionObject.imgPath, curSort, curOrder, page) + "</th>" +
     2445                        thSpacer + "<th>" + sortHeader(SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder, page) + "</th>" +
     2446                        thSpacer + "<th>" + sortHeader(SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder, page) +
    24092447                        //sortHeader( SORT_ID, "", sessionObject.imgPath ) +
    24102448                        "</th>" +
    2411                         thSpacer + "<th>" + sortHeader( SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder ) + "</th></tr>" );
     2449                        thSpacer + "<th>" + sortHeader(SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder, page) + "</th></tr>" );
    24122450                int bg = 0;
    24132451                int i = 0;
     
    24942532                //out.print(
    24952533                //      _t("Page Size") + ":&nbsp;<input type=\"text\" style=\"text-align: right;\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" +  sessionObject.folder.getPageSize() + "\">" +
    2496                 //      "&nbsp;" + 
     2534                //      "&nbsp;" +
    24972535                //      button( SETPAGESIZE, _t("Set") ) );
    24982536                out.print("<br>");
Note: See TracChangeset for help on using the changeset viewer.