Skip to content

Commit d123aea

Browse files
committed
Susimail: Search fixes
- Fix sorting and pagination within search results - Bypass XSS filter and escape as necessary
1 parent b6fc908 commit d123aea

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

apps/susimail/src/src/i2p/susi/util/Folder.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public synchronized void sort()
196196
*
197197
* @param elements Array of Os.
198198
*/
199-
public synchronized void setElements( O[] elements )
199+
private synchronized void setElements( O[] elements )
200200
{
201201
if (elements.length > 0) {
202202
this.elements = elements;
@@ -392,7 +392,9 @@ public synchronized void addSorter( String id, Comparator<O> sorter )
392392
*/
393393
public synchronized void setSortBy(String id, SortOrder direction)
394394
{
395+
SortOrder oldDirection = sortingDirection;
395396
sortingDirection = direction;
397+
Comparator<O> oldSorter = currentSorter;
396398
currentSorter = sorter.get( id );
397399
if (currentSorter != null) {
398400
if (sortingDirection == SortOrder.UP)
@@ -401,6 +403,11 @@ public synchronized void setSortBy(String id, SortOrder direction)
401403
} else {
402404
currentSortID = null;
403405
}
406+
// invalidate selection if sort order changed
407+
if (oldDirection != sortingDirection || !DataHelper.eq(oldSorter, currentSorter)) {
408+
currentSelector = null;
409+
selected = null;
410+
}
404411
}
405412

406413
/**
@@ -546,6 +553,7 @@ public synchronized O getPreviousElement( O element )
546553
*
547554
* @param element
548555
* @return The next element
556+
* @since 0.9.63
549557
*/
550558
public synchronized O getNextSelectedElement(O element)
551559
{
@@ -566,6 +574,7 @@ public synchronized O getNextSelectedElement(O element)
566574
*
567575
* @param element
568576
* @return The previous element
577+
* @since 0.9.63
569578
*/
570579
public synchronized O getPreviousSelectedElement(O element)
571580
{

apps/susimail/src/src/i2p/susi/webmail/WebMail.java

+30-9
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import java.io.Writer;
6161
import java.net.URI;
6262
import java.net.URISyntaxException;
63+
import java.net.URLEncoder;
6364
import java.text.Collator;
6465
import java.util.ArrayList;
6566
import java.util.Arrays;
@@ -147,7 +148,7 @@ private enum HtmlMode { NONE, LINK, ALLOW, PREFER }
147148
private static final String NEXT_PAGE_NUM = "nextpagenum";
148149
private static final String CURRENT_SORT = "currentsort";
149150
private static final String CURRENT_FOLDER = "folder";
150-
private static final String CURRENT_SEARCH = "currentsearch";
151+
private static final String CURRENT_SEARCH = "nf_currentsearch";
151152
private static final String NEW_FOLDER = "newfolder";
152153
private static final String DRAFT_EXISTS = "draftexists";
153154
private static final String DEBUG_STATE = "currentstate";
@@ -170,7 +171,7 @@ private enum HtmlMode { NONE, LINK, ALLOW, PREFER }
170171
private static final String REALLYDELETE = "really_delete";
171172
private static final String MOVE_TO = "moveto";
172173
private static final String SWITCH_TO = "switchto";
173-
private static final String SEARCH = "s";
174+
private static final String SEARCH = "nf_s";
174175
// also a GET param
175176
private static final String SHOW = "show";
176177
private static final String DOWNLOAD = "download";
@@ -444,11 +445,12 @@ private static String button2( String name, String label )
444445
*
445446
* @param name
446447
* @param label
448+
* @param search may be null
447449
* @return the string
448450
*/
449451
private static String sortHeader(String name, String label, String imgPath,
450452
String currentName, SortOrder currentOrder, int page,
451-
String folder)
453+
String folder, String search)
452454
{
453455
StringBuilder buf = new StringBuilder(128);
454456
buf.append(label).append("&nbsp;&nbsp;");
@@ -457,15 +459,27 @@ private static String sortHeader(String name, String label, String imgPath,
457459
buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3up.png\" border=\"0\" alt=\"^\">\n");
458460
} else {
459461
buf.append("<a class=\"sort\" href=\"").append(myself).append("?page=").append(page).append("&amp;sort=-")
460-
.append(name).append("&amp;folder=").append(folder).append("\">");
462+
.append(name).append("&amp;folder=").append(folder);
463+
if (search != null) {
464+
try {
465+
buf.append("&amp;").append(SEARCH).append('=').append(URLEncoder.encode(search, "UTF-8"));
466+
} catch (UnsupportedEncodingException uee) {}
467+
}
468+
buf.append("\">");
461469
buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3up.png\" border=\"0\" alt=\"^\">");
462470
buf.append("</a>\n");
463471
}
464472
if (name.equals(currentName) && currentOrder == SortOrder.DOWN) {
465473
buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3down.png\" border=\"0\" alt=\"v\">");
466474
} else {
467475
buf.append("<a class=\"sort\" href=\"").append(myself).append("?page=").append(page).append("&amp;sort=")
468-
.append(name).append("&amp;folder=").append(folder).append("\">");
476+
.append(name).append("&amp;folder=").append(folder);
477+
if (search != null) {
478+
try {
479+
buf.append("&amp;").append(SEARCH).append('=').append(URLEncoder.encode(search, "UTF-8"));
480+
} catch (UnsupportedEncodingException uee) {}
481+
}
482+
buf.append("\">");
469483
buf.append("<img class=\"sort\" src=\"").append(imgPath).append("3down.png\" border=\"0\" alt=\"v\">");
470484
buf.append("</a>");
471485
}
@@ -2394,6 +2408,9 @@ private void processRequest( HttpServletRequest httpRequest, HttpServletResponse
23942408
// always go to inbox after SEND
23952409
if (str != null && !str.equals(DIR_FOLDER) && !buttonPressed(request, SEND))
23962410
q += '&' + CURRENT_FOLDER + '=' + str;
2411+
str = request.getParameter(SEARCH);
2412+
if (str != null && str.length() > 0)
2413+
q += '&' + SEARCH + '=' + URLEncoder.encode(str, "UTF-8");
23972414
sendRedirect(httpRequest, response, q);
23982415
return;
23992416
}
@@ -3598,6 +3615,8 @@ private static void showFolder( PrintWriter out, SessionObject sessionObject, Ma
35983615
// form 3
35993616
out.print(form);
36003617
out.print(hidden);
3618+
if (search != null)
3619+
out.println("<input type=\"hidden\" name=\"" + SEARCH + "\" value=\"" + DataHelper.escapeHTML(search) + "\">");
36013620
showPageButtons(out, sessionObject.user, folderName, page, folder.getPages(), true);
36023621
out.println("</form>");
36033622
out.println("</div>");
@@ -3607,11 +3626,11 @@ private static void showFolder( PrintWriter out, SessionObject sessionObject, Ma
36073626
out.print(hidden);
36083627
out.println("<table id=\"mailbox\" cellspacing=\"0\" cellpadding=\"5\">\n");
36093628
out.println("<tr><td colspan=\"9\"><hr></td></tr>\n<tr><th title=\"" + _t("Mark for deletion") + "\">&nbsp;</th>" +
3610-
thSpacer + "<th>" + sortHeader(SORT_SENDER, showToColumn ? _t("To") : _t("From"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "</th>" +
3611-
thSpacer + "<th>" + sortHeader(SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "</th>" +
3612-
thSpacer + "<th>" + sortHeader(SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder, page, folderName) +
3629+
thSpacer + "<th>" + sortHeader(SORT_SENDER, showToColumn ? _t("To") : _t("From"), sessionObject.imgPath, curSort, curOrder, page, folderName, search) + "</th>" +
3630+
thSpacer + "<th>" + sortHeader(SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder, page, folderName, search) + "</th>" +
3631+
thSpacer + "<th>" + sortHeader(SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder, page, folderName, search) +
36133632
"</th>" +
3614-
thSpacer + "<th>" + sortHeader(SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "</th></tr>" );
3633+
thSpacer + "<th>" + sortHeader(SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder, page, folderName, search) + "</th></tr>" );
36153634
int bg = 0;
36163635
int i = 0;
36173636
for (Iterator<String> it = folder.currentPageSelectorIterator(); it != null && it.hasNext(); ) {
@@ -3734,6 +3753,8 @@ else if (isSpamFolder)
37343753
// form 5
37353754
out.print(form);
37363755
out.print(hidden);
3756+
if (search != null)
3757+
out.println("<input type=\"hidden\" name=\"" + SEARCH + "\" value=\"" + DataHelper.escapeHTML(search) + "\">");
37373758
showPageButtons(out, sessionObject.user, folderName, page, folder.getPages(), false);
37383759
out.println("</form>");
37393760
out.println("</div>");

0 commit comments

Comments
 (0)