Changeset 9985a02


Ignore:
Timestamp:
Sep 10, 2014 11:28:41 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d4be5ab
Parents:
41c2c60
Message:

i2psnark:

  • Consolidate and clean up parameters code
  • Click to sort by column
Location:
apps/i2psnark/java/src/org/klomp/snark/web
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r41c2c60 r9985a02  
    195195        resp.setHeader("X-XSS-Protection", "1; mode=block");
    196196
    197         String peerParam = req.getParameter("p");
    198         String stParam = req.getParameter("st");
    199         String peerString;
    200         if (peerParam == null || (!_manager.util().connected()) ||
    201             peerParam.replaceAll("[a-zA-Z0-9~=-]", "").length() > 0) {  // XSS
    202             peerString = "";
    203         } else {
    204             peerString = "?p=" + DataHelper.stripHTML(peerParam);
    205         }
    206         if (stParam != null && !stParam.equals("0")) {
    207             stParam = DataHelper.stripHTML(stParam);
    208             if (peerString.length() > 0)
    209                 peerString += "&amp;st=" + stParam;
    210             else
    211                 peerString =  "?st="+ stParam;
    212         }
     197        String pOverride = _manager.util().connected() ? null : "";
     198        String peerString = getQueryString(req, pOverride, null, null);
    213199
    214200        // AJAX for mainsection
     
    293279        else
    294280            out.write(_("Anonymous BitTorrent Client"));
     281        String peerParam = req.getParameter("p");
    295282        if ("2".equals(peerParam))
    296283            out.write(" | Debug Mode");
     
    414401        if (isForm) {
    415402            out.write("<form action=\"_post\" method=\"POST\">\n");
    416             out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
    417             // don't lose peer setting
    418             if (peerParam != null)
    419                 out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
    420             // ...or st setting
    421             if (stParam != null)
    422                 out.write("<input type=\"hidden\" name=\"st\" value=\"" + stParam + "\" >\n");
     403            writeHiddenInputs(out, req, null);
    423404        }
    424405        out.write(TABLE_HEADER);
     
    442423        int pageSize = Math.max(_manager.getPageSize(), 5);
    443424
    444         out.write("<tr><th><img border=\"0\" src=\"" + _imgPath + "status.png\" title=\"");
     425        String currentSort = req.getParameter("sort");
     426        out.write("<tr><th>");
     427        String sort = ("2".equals(currentSort)) ? "-2" : "2";
     428        out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     429        out.write("\"><img border=\"0\" src=\"" + _imgPath + "status.png\" title=\"");
    445430        out.write(_("Status"));
    446431        out.write("\" alt=\"");
    447432        out.write(_("Status"));
    448         out.write("\"></th>\n<th>");
     433        out.write("\"></a></th>\n<th>");
    449434        if (_manager.util().connected() && !snarks.isEmpty()) {
    450435            out.write(" <a href=\"" + _contextPath + '/');
    451436            if (peerParam != null) {
    452                 if (stParam != null) {
    453                     out.write("?st=");
    454                     out.write(stParam);
    455                 }
     437                // disable peer view
    456438                out.write("\">");
    457439                out.write("<img border=\"0\" src=\"" + _imgPath + "hidepeers.png\" title=\"");
     
    461443                out.write("\">");
    462444            } else {
    463                 out.write("?p=1");
    464                 if (stParam != null) {
    465                     out.write("&amp;st=");
    466                     out.write(stParam);
    467                 }
     445                // enable peer view
     446                out.write(getQueryString(req, "1", null, null));
    468447                out.write("\">");
    469448                out.write("<img border=\"0\" src=\"" + _imgPath + "showpeers.png\" title=\"");
     
    476455        }
    477456        out.write("</th>\n<th colspan=\"2\" align=\"left\">");
    478         out.write("<img border=\"0\" src=\"" + _imgPath + "torrent.png\" title=\"");
     457        sort = (currentSort == null || "0".equals(currentSort) || "1".equals(currentSort)) ? "-1" : "";
     458        out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     459        out.write("\"><img border=\"0\" src=\"" + _imgPath + "torrent.png\" title=\"");
    479460        out.write(_("Torrent"));
    480461        out.write("\" alt=\"");
    481462        out.write(_("Torrent"));
    482         out.write("\"></th>\n<th align=\"center\">");
     463        out.write("\"></a></th>\n<th align=\"center\">");
    483464        if (total > 0 && (start > 0 || total > pageSize)) {
    484             writePageNav(out, start, pageSize, total, peerParam, noThinsp);
     465            writePageNav(out, req, start, pageSize, total, noThinsp);
    485466        }
    486467        out.write("</th>\n<th align=\"right\">");
    487468        if (_manager.util().connected() && !snarks.isEmpty()) {
    488             out.write("<img border=\"0\" src=\"" + _imgPath + "eta.png\" title=\"");
     469            sort = ("4".equals(currentSort)) ? "-4" : "4";
     470            out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     471            out.write("\"><img border=\"0\" src=\"" + _imgPath + "eta.png\" title=\"");
    489472            out.write(_("Estimated time remaining"));
    490473            out.write("\" alt=\"");
    491474            // Translators: Please keep short or translate as " "
    492475            out.write(_("ETA"));
    493             out.write("\">");
     476            out.write("\"></a>");
    494477        }
    495478        out.write("</th>\n<th align=\"right\">");
    496         out.write("<img border=\"0\" src=\"" + _imgPath + "head_rx.png\" title=\"");
     479        // sort by size, not downloaded
     480        sort = ("5".equals(currentSort)) ? "-5" : "5";
     481        out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     482        out.write("\"><img border=\"0\" src=\"" + _imgPath + "head_rx.png\" title=\"");
    497483        out.write(_("Downloaded"));
    498484        out.write("\" alt=\"");
    499485        // Translators: Please keep short or translate as " "
    500486        out.write(_("RX"));
    501         out.write("\">");
     487        out.write("\"></a>");
    502488        out.write("</th>\n<th align=\"right\">");
    503489        if (!snarks.isEmpty()) {
    504             out.write("<img border=\"0\" src=\"" + _imgPath + "head_tx.png\" title=\"");
     490            sort = ("7".equals(currentSort)) ? "-7" : "7";
     491            out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     492            out.write("\"><img border=\"0\" src=\"" + _imgPath + "head_tx.png\" title=\"");
    505493            out.write(_("Uploaded"));
    506494            out.write("\" alt=\"");
    507495            // Translators: Please keep short or translate as " "
    508496            out.write(_("TX"));
    509             out.write("\">");
     497            out.write("\"></a>");
    510498        }
    511499        out.write("</th>\n<th align=\"right\">");
    512500        if (_manager.util().connected() && !snarks.isEmpty()) {
    513             out.write("<img border=\"0\" src=\"" + _imgPath + "head_rxspeed.png\" title=\"");
     501            sort = ("8".equals(currentSort)) ? "-8" : "8";
     502            out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     503            out.write("\"><img border=\"0\" src=\"" + _imgPath + "head_rxspeed.png\" title=\"");
    514504            out.write(_("Down Rate"));
    515505            out.write("\" alt=\"");
    516506            // Translators: Please keep short or translate as " "
    517507            out.write(_("RX Rate"));
    518             out.write(" \">");
     508            out.write("\"></a>");
    519509        }
    520510        out.write("</th>\n<th align=\"right\">");
    521511        if (_manager.util().connected() && !snarks.isEmpty()) {
    522             out.write("<img border=\"0\" src=\"" + _imgPath + "head_txspeed.png\" title=\"");
     512            sort = ("9".equals(currentSort)) ? "-9" : "9";
     513            out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort));
     514            out.write("\"><img border=\"0\" src=\"" + _imgPath + "head_txspeed.png\" title=\"");
    523515            out.write(_("Up Rate"));
    524516            out.write("\" alt=\"");
    525517            // Translators: Please keep short or translate as " "
    526518            out.write(_("TX Rate"));
    527             out.write(" \">");
     519            out.write("\"></a>");
    528520        }
    529521        out.write("</th>\n<th align=\"center\">");
     
    581573        boolean showDebug = "2".equals(peerParam);
    582574
    583         String stParamStr = stParam == null ? "" : "&amp;st=" + stParam;
    584575        for (int i = 0; i < total; i++) {
    585576            Snark snark = snarks.get(i);
    586577            boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.getInfoHash()).equals(peerParam);
    587578            boolean hide = i < start || i >= start + pageSize;
    588             displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug, hide, stParamStr);
     579            displaySnark(out, req, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug, hide);
    589580        }
    590581
     
    638629   
    639630    /**
     631     *  hidden inputs for nonce and paramters p, st, and sort
     632     *
     633     *  @param out writes to it
     634     *  @param action if non-null, add it as the action
     635     *  @since 0.9.16
     636     */
     637    private void writeHiddenInputs(PrintWriter out, HttpServletRequest req, String action) {
     638        StringBuilder buf = new StringBuilder(256);
     639        writeHiddenInputs(buf, req, action);
     640        out.write(buf.toString());
     641    }
     642   
     643    /**
     644     *  hidden inputs for nonce and paramters p, st, and sort
     645     *
     646     *  @param out appends to it
     647     *  @param action if non-null, add it as the action
     648     *  @since 0.9.16
     649     */
     650    private void writeHiddenInputs(StringBuilder buf, HttpServletRequest req, String action) {
     651        buf.append("<input type=\"hidden\" name=\"nonce\" value=\"")
     652           .append(_nonce).append("\" >\n");
     653        String peerParam = req.getParameter("p");
     654        if (peerParam != null) {
     655            buf.append("<input type=\"hidden\" name=\"p\" value=\"")
     656               .append(DataHelper.stripHTML(peerParam)).append("\" >\n");
     657        }
     658        String stParam = req.getParameter("st");
     659        if (stParam != null) {
     660            buf.append("<input type=\"hidden\" name=\"st\" value=\"")
     661               .append(DataHelper.stripHTML(stParam)).append("\" >\n");
     662        }
     663        String soParam = req.getParameter("sort");
     664        if (soParam != null) {
     665            buf.append("<input type=\"hidden\" name=\"sort\" value=\"")
     666               .append(DataHelper.stripHTML(soParam)).append("\" >\n");
     667        }
     668        if (action != null) {
     669            buf.append("<input type=\"hidden\" name=\"action\" value=\"")
     670               .append(action).append("\" >\n");
     671        }
     672    }
     673   
     674    /**
     675     *  Build HTML-escaped and stripped query string
     676     *
     677     *  @param p override or "" for default or null to keep the same as in req
     678     *  @param st override or "" for default or null to keep the same as in req
     679     *  @param so override or "" for default or null to keep the same as in req
     680     *  @return non-null, possibly empty
     681     *  @since 0.9.16
     682     */
     683    private static String getQueryString(HttpServletRequest req, String p, String st, String so) {
     684        StringBuilder buf = new StringBuilder(64);
     685        if (p == null) {
     686            p = req.getParameter("p");
     687            if (p != null)
     688                p = DataHelper.stripHTML(p);
     689        }
     690        if (p != null && !p.equals(""))
     691            buf.append("?p=").append(p);
     692        if (so == null) {
     693            so = req.getParameter("sort");
     694            if (so != null)
     695                so = DataHelper.stripHTML(so);
     696        }
     697        if (so != null && !so.equals("")) {
     698            if (buf.length() <= 0)
     699                buf.append("?sort=");
     700            else
     701                buf.append("&amp;sort=");
     702            buf.append(so);
     703        }
     704        if (st == null) {
     705            st = req.getParameter("st");
     706            if (st != null)
     707                st = DataHelper.stripHTML(st);
     708        }
     709        if (st != null && !st.equals("")) {
     710            if (buf.length() <= 0)
     711                buf.append("?st=");
     712            else
     713                buf.append("&amp;st=");
     714            buf.append(st);
     715        }
     716        return buf.toString();
     717    }
     718   
     719    /**
    640720     *  @since 0.9.6
    641721     */
    642     private void writePageNav(PrintWriter out, int start, int pageSize, int total,
    643                               String peerParam, boolean noThinsp) {
     722    private void writePageNav(PrintWriter out, HttpServletRequest req, int start, int pageSize, int total,
     723                              boolean noThinsp) {
    644724            // Page nav
    645725            if (start > 0) {
    646726                // First
    647727                out.write("<a href=\"" + _contextPath);
    648                 if (peerParam != null)
    649                     out.write("?p=" + peerParam);
     728                out.write(getQueryString(req, null, "", null));
    650729                out.write("\">" +
    651730                          "<img alt=\"" + _("First") + "\" title=\"" + _("First page") + "\" border=\"0\" src=\"" +
     
    656735                if (true) {
    657736                    // Back
    658                     out.write("&nbsp;<a href=\"" + _contextPath +  "?st=" + prev);
    659                     if (peerParam != null)
    660                         out.write("&amp;p=" + peerParam);
     737                    out.write("&nbsp;<a href=\"" + _contextPath);
     738                    String sprev = (prev > 0) ? Integer.toString(prev) : "";
     739                    out.write(getQueryString(req, null, sprev, null));
    661740                    out.write("\">" +
    662741                          "<img alt=\"" + _("Prev") + "\" title=\"" + _("Previous page") + "\" border=\"0\" src=\"" +
     
    691770                if (true) {
    692771                    // Next
    693                     out.write("&nbsp;<a href=\"" + _contextPath +  "?st=" + next);
    694                     if (peerParam != null)
    695                         out.write("&amp;p=" + peerParam);
     772                    out.write("&nbsp;<a href=\"" + _contextPath);
     773                    out.write(getQueryString(req, null, Integer.toString(next), null));
    696774                    out.write("\">" +
    697775                          "<img alt=\"" + _("Next") + "\" title=\"" + _("Next page") + "\" border=\"0\" src=\"" +
     
    701779                // Last
    702780                int last = ((total - 1) / pageSize) * pageSize;
    703                 out.write("&nbsp;<a href=\"" + _contextPath +  "?st=" + last);
    704                 if (peerParam != null)
    705                     out.write("&amp;p=" + peerParam);
     781                out.write("&nbsp;<a href=\"" + _contextPath);
     782                out.write(getQueryString(req, null, Integer.toString(last), null));
    706783                out.write("\">" +
    707784                          "<img alt=\"" + _("Last") + "\" title=\"" + _("Last page") + "\" border=\"0\" src=\"" +
     
    11911268    }
    11921269
    1193     /**
    1194      *  Sort alphabetically in current locale, ignore case, ignore leading "the "
    1195      *  (I guess this is worth it, a lot of torrents start with "The "
    1196      *  @since 0.7.14
    1197      */
    1198     private static class TorrentNameComparator implements Comparator<Snark>, Serializable {
    1199 
    1200         public int compare(Snark l, Snark r) {
    1201             // put downloads and magnets first
    1202             if (l.getStorage() == null && r.getStorage() != null)
    1203                 return -1;
    1204             if (l.getStorage() != null && r.getStorage() == null)
    1205                 return 1;
    1206             String ls = l.getBaseName();
    1207             String llc = ls.toLowerCase(Locale.US);
    1208             if (llc.startsWith("the ") || llc.startsWith("the.") || llc.startsWith("the_"))
    1209                 ls = ls.substring(4);
    1210             String rs = r.getBaseName();
    1211             String rlc = rs.toLowerCase(Locale.US);
    1212             if (rlc.startsWith("the ") || rlc.startsWith("the.") || rlc.startsWith("the_"))
    1213                 rs = rs.substring(4);
    1214             return Collator.getInstance().compare(ls, rs);
    1215         }
    1216     }
    1217 
    12181270    private List<Snark> getSortedSnarks(HttpServletRequest req) {
    12191271        ArrayList<Snark> rv = new ArrayList<Snark>(_manager.getTorrents());
    1220         Collections.sort(rv, new TorrentNameComparator());
     1272        int sort = 0;
     1273        String ssort = req.getParameter("sort");
     1274        if (ssort != null) {
     1275            try {
     1276                sort = Integer.parseInt(ssort);
     1277            } catch (NumberFormatException nfe) {}
     1278        }
     1279        Collections.sort(rv, Sorters.getComparator(sort));
    12211280        return rv;
    12221281    }
     
    12301289     *  @param stats in/out param (totals)
    12311290     *  @param statsOnly if true, output nothing, update stats only
    1232      *  @param stParam non null; empty or e.g. &amp;st=10
    12331291     */
    1234     private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers,
    1235                               boolean isDegraded, boolean noThinsp, boolean showDebug, boolean statsOnly,
    1236                               String stParam) throws IOException {
     1292    private void displaySnark(PrintWriter out, HttpServletRequest req,
     1293                              Snark snark, String uri, int row, long stats[], boolean showPeers,
     1294                              boolean isDegraded, boolean noThinsp, boolean showDebug, boolean statsOnly)
     1295                              throws IOException {
    12371296        // stats
    12381297        long uploaded = snark.getUploaded();
     
    13361395                    statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + img + ".png\" title=\"" + txt + "\"></td>" +
    13371396                               "<td class=\"snarkTorrentStatus\">" + txt +
    1338                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + stParam + "\">" +
     1397                               ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" +
    13391398                               curPeers + thinsp(noThinsp) +
    13401399                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    13521411                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "downloading.png\" title=\"" + _("OK") + "\"></td>" +
    13531412                               "<td class=\"snarkTorrentStatus\">" + _("OK") +
    1354                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + stParam + "\">" +
     1413                               ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" +
    13551414                               curPeers + thinsp(noThinsp) +
    13561415                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    13631422                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" title=\"" + _("Stalled") + "\"></td>" +
    13641423                               "<td class=\"snarkTorrentStatus\">" + _("Stalled") +
    1365                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + stParam + "\">" +
     1424                               ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" +
    13661425                               curPeers + thinsp(noThinsp) +
    13671426                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    14851544            // Stop Button
    14861545            if (isDegraded)
    1487                 out.write("<a href=\"" + _contextPath + "/?action=Stop_" + b64 + "&amp;nonce=" + _nonce + stParam + "\"><img title=\"");
     1546                out.write("<a href=\"" + _contextPath + "/?action=Stop_" + b64 + "&amp;nonce=" + _nonce +
     1547                          getQueryString(req, "", null, null).replace("?", "&amp;") + "\"><img title=\"");
    14881548            else
    14891549                out.write("<input type=\"image\" name=\"action_Stop_" + b64 + "\" value=\"foo\" title=\"");
     
    14991559                // This works in Opera but it's displayed a little differently, so use noThinsp here too so all 3 icons are consistent
    15001560                if (noThinsp)
    1501                     out.write("<a href=\"" + _contextPath + "/?action=Start_" + b64 + "&amp;nonce=" + _nonce + stParam + "\"><img title=\"");
     1561                    out.write("<a href=\"" + _contextPath + "/?action=Start_" + b64 + "&amp;nonce=" + _nonce +
     1562                              getQueryString(req, "", null, null).replace("?", "&amp;") + "\"><img title=\"");
    15021563                else
    15031564                    out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\"");
     
    15131574                // Doesnt work with Opera so use noThinsp instead of isDegraded
    15141575                if (noThinsp)
    1515                     out.write("<a href=\"" + _contextPath + "/?action=Remove_" + b64 + "&amp;nonce=" + _nonce + stParam + "\"><img title=\"");
     1576                    out.write("<a href=\"" + _contextPath + "/?action=Remove_" + b64 + "&amp;nonce=" + _nonce +
     1577                              getQueryString(req, "", null, null).replace("?", "&amp;") + "\"><img title=\"");
    15161578                else
    15171579                    out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\"");
     
    15331595            // Doesnt work with Opera so use noThinsp instead of isDegraded
    15341596            if (noThinsp)
    1535                 out.write("<a href=\"" + _contextPath + "/?action=Delete_" + b64 + "&amp;nonce=" + _nonce + stParam + "\"><img title=\"");
     1597                out.write("<a href=\"" + _contextPath + "/?action=Delete_" + b64 + "&amp;nonce=" + _nonce +
     1598                          getQueryString(req, "", null, null).replace("?", "&amp;") + "\"><img title=\"");
    15361599            else
    15371600                out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\"");
     
    18271890        // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
    18281891        out.write("<form action=\"_post\" method=\"POST\">\n");
    1829         out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
    1830         out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
    1831         // don't lose peer setting
    1832         String peerParam = req.getParameter("p");
    1833         if (peerParam != null)
    1834             out.write("<input type=\"hidden\" name=\"p\" value=\"" + DataHelper.stripHTML(peerParam) + "\" >\n");
     1892        writeHiddenInputs(out, req, "Add");
    18351893        out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
    18361894        out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "add.png\"> ");
     
    18591917        // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
    18601918        out.write("<form action=\"_post\" method=\"POST\">\n");
    1861         out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
    1862         out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
    1863         // don't lose peer setting
    1864         String peerParam = req.getParameter("p");
    1865         if (peerParam != null)
    1866             out.write("<input type=\"hidden\" name=\"p\" value=\"" + DataHelper.stripHTML(peerParam) + "\" >\n");
     1919        writeHiddenInputs(out, req, "Create");
    18671920        out.write("<span class=\"snarkConfigTitle\">");
    18681921        out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "create.png\"> ");
     
    19301983       
    19311984        out.write("<form action=\"" + _contextPath + "/configure\" method=\"POST\">\n" +
    1932                   "<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n" +
    1933                   "<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n" +
    1934                   "<input type=\"hidden\" name=\"action\" value=\"Save\" >\n" +
    1935                   "<span class=\"snarkConfigTitle\">" +
     1985                  "<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n");
     1986        writeHiddenInputs(out, req, "Save");
     1987        out.write("<span class=\"snarkConfigTitle\">" +
    19361988                  "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
    19371989        out.write(_("Configuration"));
     
    21162168        StringBuilder buf = new StringBuilder(1024);
    21172169        buf.append("<form action=\"" + _contextPath + "/configure\" method=\"POST\">\n" +
    2118                   "<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n" +
    2119                   "<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n" +
    2120                   "<input type=\"hidden\" name=\"action\" value=\"Save2\" >\n" +
    2121                   "<span class=\"snarkConfigTitle\">" +
     2170                   "<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n");
     2171        writeHiddenInputs(buf, req, "Save2");
     2172        buf.append("<span class=\"snarkConfigTitle\">" +
    21222173                  "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
    21232174        buf.append(_("Trackers"));
Note: See TracChangeset for help on using the changeset viewer.