Changeset b28eb70


Ignore:
Timestamp:
Aug 3, 2014 1:58:51 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
2d2348f
Parents:
bf9c4b23
Message:
  • Console:
    • Fix update buttons
    • Don't filter parameter names starting with "nofilter_"
    • Re-allow configadvanced, news URL, and unsigned update URL if routerconsole.advanced=true
    • Re-allow plugin install if routerconsole.advanced=true or routerconsole.enablePluginInstall=true
    • Only allow whitelisted plugin signers, unless routerconsole.allowUntrustedPlugins=true
    • Re-allow clients.config changes if routerconsole.advanced=true or routerconsole.enableClientChange=true
    • More escaping
  • i2psnark: Fix add torrent form
Files:
26 edited

Legend:

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

    rbf9c4b23 rb28eb70  
    242242    private static final int MAX_MESSAGES = 100;
    243243
     244    /**
     245     *  Use if it does not include a link.
     246     *  Escapes '<' and '>' before queueing
     247     */
    244248    public void addMessage(String message) {
     249        addMessageNoEscape(message.replace("<", "&lt;").replace(">", "&gt;"));
     250    }
     251
     252    /**
     253     * Use if it includes a link.
     254     * Does not escape '<' and '>' before queueing
     255     * @since 0.9.14.1
     256     */
     257    public void addMessageNoEscape(String message) {
    245258        _messages.offer(message);
    246259        while (_messages.size() > MAX_MESSAGES) {
     
    580593
    581594        if (dataDir != null && !dataDir.equals(getDataDir().getAbsolutePath())) {
    582             dataDir = dataDir.trim();
     595            dataDir = DataHelper.stripHTML(dataDir.trim());
    583596            File dd = new File(dataDir);
    584597            if (!dd.isAbsolute()) {
     
    610623
    611624            Map<String, String> opts = new HashMap<String, String>();
    612             if (i2cpOpts == null) i2cpOpts = "";
     625            i2cpOpts = DataHelper.stripHTML(i2cpOpts);
    613626            StringTokenizer tok = new StringTokenizer(i2cpOpts, " \t\n");
    614627            while (tok.hasMoreTokens()) {
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    rbf9c4b23 rb28eb70  
    712712        //}
    713713        if ("Add".equals(action)) {
    714             String newURL = req.getParameter("newURL");
     714            String newURL = req.getParameter("nofilter_newURL");
    715715         /******
    716716            // NOTE - newFile currently disabled in HTML form - see below
     
    748748          *****/
    749749            if (newURL != null) {
    750                 if (newURL.startsWith("http://")) {
     750                if (newURL.contains("<") || newURL.contains(">") ||
     751                    newURL.contains("%3C") || newURL.contains("%3E") ||
     752                    newURL.contains("%3c") || newURL.contains("%3e") ||
     753                    newURL.contains("\"") || newURL.contains("'") ||
     754                    newURL.contains("%22") || newURL.contains("%27")) {
     755                    _manager.addMessage("Invalid URL");
     756                } else if (newURL.startsWith("http://")) {
    751757                    FetchAndAdd fetch = new FetchAndAdd(_context, _manager, newURL);
    752758                    _manager.addDownloader(fetch);
     
    938944                            String url = k.substring(7);
    939945                            if (!url.equals(announceURL))
    940                                 backupURLs.add(url);
     946                                backupURLs.add(DataHelper.stripHTML(url));
    941947                        }
    942948                    }
     
    10371043                     if ((t = trackers.remove(k)) != null) {
    10381044                        removed.add(t.announceURL);
    1039                         _manager.addMessage(_("Removed") + ": " + k);
     1045                        _manager.addMessage(_("Removed") + ": " + DataHelper.stripHTML(k));
    10401046                        changed = true;
    10411047                     }
     
    10711077            String aurl = req.getParameter("taurl");
    10721078            if (name != null && hurl != null && aurl != null) {
    1073                 name = name.trim();
    1074                 hurl = hurl.trim();
    1075                 aurl = aurl.trim().replace("=", "&#61;");
     1079                name = DataHelper.stripHTML(name.trim());
     1080                hurl = DataHelper.stripHTML(hurl.trim());
     1081                aurl = DataHelper.stripHTML(aurl.trim()).replace("=", "&#61;");
    10761082                if (name.length() > 0 && hurl.startsWith("http://") && TrackerClient.isValidAnnounce(aurl)) {
    10771083                    Map<String, Tracker> trackers = _manager.getTrackerMap();
     
    17171723    private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
    17181724        // display incoming parameter if a GET so links will work
    1719         String newURL = req.getParameter("newURL");
     1725        String newURL = req.getParameter("nofilter_newURL");
    17201726        if (newURL == null || newURL.trim().length() <= 0 || req.getMethod().equals("POST"))
    17211727            newURL = "";
     
    17331739        String peerParam = req.getParameter("p");
    17341740        if (peerParam != null)
    1735             out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
     1741            out.write("<input type=\"hidden\" name=\"p\" value=\"" + DataHelper.stripHTML(peerParam) + "\" >\n");
    17361742        out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
    17371743        out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "add.png\"> ");
     
    17391745        out.write("</span><hr>\n<table border=\"0\"><tr><td>");
    17401746        out.write(_("From URL"));
    1741         out.write(":<td><input type=\"text\" name=\"newURL\" size=\"85\" value=\"" + newURL + "\" spellcheck=\"false\"");
     1747        out.write(":<td><input type=\"text\" name=\"nofilter_newURL\" size=\"85\" value=\"" + newURL + "\" spellcheck=\"false\"");
    17421748        out.write(" title=\"");
    17431749        out.write(_("Enter the torrent file download URL (I2P only), magnet link, maggot link, or info hash"));
     
    17711777        String peerParam = req.getParameter("p");
    17721778        if (peerParam != null)
    1773             out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
     1779            out.write("<input type=\"hidden\" name=\"p\" value=\"" + DataHelper.stripHTML(peerParam) + "\" >\n");
    17741780        out.write("<span class=\"snarkConfigTitle\">");
    17751781        out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "create.png\"> ");
     
    22032209    private static String urlEncode(String s) {
    22042210        return s.replace(";", "%3B").replace("&", "&amp;").replace(" ", "%20")
     2211                .replace("<", "&lt;").replace(">", "&gt;")
    22052212                .replace("[", "%5B").replace("]", "%5D");
    22062213    }
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    rbf9c4b23 rb28eb70  
    928928    }
    929929   
    930     public void setProxyPassword(String s) {
     930    public void setNofilter_proxyPassword(String s) {
    931931        if (s != null)
    932932            _newProxyPW = s.trim();
     
    942942    }
    943943   
    944     public void setOutproxyPassword(String s) {
     944    public void setNofilter_outproxyPassword(String s) {
    945945        if (s != null)
    946946            _otherOptions.put(I2PTunnelHTTPClientBase.PROP_OUTPROXY_PW, s.trim());
  • apps/i2ptunnel/jsp/editClient.jsp

    rbf9c4b23 rb28eb70  
    541541                    <%=intl._("Password")%>:
    542542                </label>
    543                 <input type="password" id="clientPort" name="proxyPassword" title="Set password for this service" value="" class="freetext" />               
     543                <input type="password" id="clientPort" name="nofilter_proxyPassword" title="Set password for this service" value="" class="freetext" />               
    544544            </div>
    545545            <div class="subdivider">
     
    565565                    <%=intl._("Password")%>:
    566566                </label>
    567                 <input type="password" id="clientPort" name="outproxyPassword" title="Enter password required by outproxy" value="<%=editBean.getOutproxyPassword(curTunnel)%>" class="freetext" />               
     567                <input type="password" id="clientPort" name="nofilter_outproxyPassword" title="Enter password required by outproxy" value="<%=editBean.getOutproxyPassword(curTunnel)%>" class="freetext" />               
    568568            </div>
    569569            <div class="subdivider">
  • apps/jetty/java/src/net/i2p/servlet/filters/XSSRequestWrapper.java

    rbf9c4b23 rb28eb70  
    2222    private static final Pattern parameterValuePattern = Pattern.compile("^[\\p{L}\\p{Nd}.,:\\-\\/+=~\\[\\]?@_ \r\n]*$");
    2323    private static final Pattern headerValuePattern = Pattern.compile("^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$");
     24    private static final String NOFILTER = "nofilter_";
    2425
    2526    public XSSRequestWrapper(HttpServletRequest servletRequest) {
     
    2728    }
    2829
     30    /**
     31     *  Parameter names starting with "nofilter_" will not be filtered.
     32     */
    2933    @Override
    3034    public String[] getParameterValues(String parameter) {
    3135        String[] values = super.getParameterValues(parameter);
     36        if (parameter.startsWith(NOFILTER))
     37            return values;
    3238
    3339        if (values == null) {
     
    5965    }
    6066
     67    /**
     68     *  Parameter names starting with "nofilter_" will not be filtered.
     69     */
    6170    @Override
    6271    public String getParameter(String parameter) {
    6372        String value = super.getParameter(parameter);
     73        if (parameter.startsWith(NOFILTER))
     74            return value;
    6475        String rv = stripXSS(value, parameterValuePattern);
    6576        if (value != null && rv == null) {
     
    7081    }
    7182
     83    /**
     84     *  Parameter names starting with "nofilter_" will not be filtered.
     85     */
    7286    @Override
    7387    public Map getParameterMap() {
  • apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java

    rbf9c4b23 rb28eb70  
    5555    private static final String ZIP = XPI2P + ".zip";
    5656    public static final String PLUGIN_DIR = PluginStarter.PLUGIN_DIR;
     57    private static final String PROP_ALLOW_NEW_KEYS = "routerconsole.allowUntrustedPlugins";
    5758
    5859    public PluginUpdateRunner(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris,
     
    163164            // ok, now we check sigs and deal with a bad sig
    164165            String pubkey = props.getProperty("key");
    165             String signer = props.getProperty("signer");
     166            String signer = DataHelper.stripHTML(props.getProperty("signer"));
    166167            if (pubkey == null || signer == null || pubkey.length() != 172 || signer.length() <= 0) {
    167168                f.delete();
     
    176177            Map<String, String> existingKeys = PluginStarter.getPluginKeys(_context);
    177178            for (Map.Entry<String, String> e : existingKeys.entrySet()) {
     179                // ignore dups/bad keys
     180                up.addKey(e.getKey(), e.getValue());
     181            }
     182
     183            // add all trusted plugin keys, so any conflicts with trusted keys
     184            // will be discovered and rejected
     185            Map<String, String> trustedKeys = TrustedPluginKeys.getKeys();
     186            for (Map.Entry<String, String> e : trustedKeys.entrySet()) {
    178187                // ignore dups/bad keys
    179188                up.addKey(e.getKey(), e.getValue());
     
    195204                    return;
    196205                }
    197             } else {
     206            } else if (_context.getBooleanProperty(PROP_ALLOW_NEW_KEYS)) {
    198207                // add to keyring...
    199208                if(!up.addKey(pubkey, signer)) {
     
    219228                    return;
    220229                }
     230            } else {
     231                // unknown key
     232                f.delete();
     233                to.delete();
     234                _log.error("Untrusted plugin key \"" + pubkey + "\" for plugin signer \"" + signer + "\"");
     235                // don't display signer, we're really checking the key not the signer name
     236                statusDone("<b>" + _("Plugin not installed - signer is untrusted") + "</b>");
     237                return;
    221238            }
    222239
  • apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java

    rbf9c4b23 rb28eb70  
    5858    public void setLang(String lang) {
    5959        // Protected with nonce in css.jsi
    60         if (lang != null && lang.length() > 0 && lang.length() <= 6) {
     60        if (lang != null && lang.length() >= 2 && lang.length() <= 6 &&
     61            lang.replaceAll("[a-zA-Z_]", "").length() == 0) {
    6162            Map m = new HashMap(2);
    6263            int under = lang.indexOf('_');
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHandler.java

    rbf9c4b23 rb28eb70  
    2222    protected void processForm() {
    2323        if (_shouldSave) {
    24             //saveChanges();
    25             addFormError("Save disabled, edit the router.config file to make changes") ;
     24            if (isAdvanced())
     25                saveChanges();
     26            else
     27                addFormError("Save disabled, edit the router.config file to make changes") ;
    2628        } else {
    2729            // noop
     
    3234    //public void setRestart(String moo) { _forceRestart = true; }
    3335   
    34     public void setConfig(String val) {
     36    public void setNofilter_config(String val) {
    3537        _config = val;
    3638    }
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java

    rbf9c4b23 rb28eb70  
    44import java.util.TreeMap;
    55
     6import net.i2p.data.DataHelper;
    67
    78public class ConfigAdvancedHelper extends HelperBase {
     
    1314        sorted.putAll(_context.router().getConfigMap());
    1415        for (Map.Entry<String, String> e : sorted.entrySet()) {
    15             String name = e.getKey();
    16             String val = e.getValue();
     16            String name = DataHelper.escapeHTML(e.getKey());
     17            String val = DataHelper.escapeHTML(e.getValue());
    1718            buf.append(name).append('=').append(val).append('\n');
    1819        }
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java

    rbf9c4b23 rb28eb70  
    5050            return;
    5151        }
     52        boolean pluginsEnabled = PluginStarter.pluginsEnabled(_context);
    5253        if (_action.equals(_("Save Plugin Configuration"))) {
    53             savePluginChanges();
     54            if (pluginsEnabled)
     55                savePluginChanges();
     56            else
     57                addFormError("Plugins disabled");
    5458            return;
    5559        }
    5660        if (_action.equals(_("Install Plugin"))) {
    57             //installPlugin();
    58             addFormError("Plugin installation disabled");
     61            if (pluginsEnabled &&
     62                (_context.getBooleanProperty(ConfigClientsHelper.PROP_ENABLE_PLUGIN_INSTALL) ||
     63                 isAdvanced()))
     64                installPlugin();
     65            else
     66                addFormError("Plugins disabled");
    5967            return;
    6068        }
    6169        if (_action.equals(_("Update All Installed Plugins"))) {
    62             updateAllPlugins();
     70            if (pluginsEnabled)
     71                updateAllPlugins();
     72            else
     73                addFormError("Plugins disabled");
    6374            return;
    6475        }
     
    7485            } else {
    7586                List<String> plugins = PluginStarter.getPlugins();
    76                 if (plugins.contains(app))
    77                     startPlugin(app);
    78                 else
     87                if (plugins.contains(app)) {
     88                    if (pluginsEnabled)
     89                        startPlugin(app);
     90                    else
     91                        addFormError("Plugins disabled");
     92                } else {
    7993                    startWebApp(app);
     94                }
    8095            }
    8196            return;
     
    91106            if (appnum >= 0) {
    92107                deleteClient(appnum);
    93             } else {
     108            } else if (pluginsEnabled) {
    94109                try {
    95110                    PluginStarter.stopPlugin(_context, app);
     
    109124                    _log.error("Error deleting plugin " + app,  e);
    110125                }
     126            } else {
     127                addFormError("Plugins disabled");
    111128            }
    112129            return;
     
    127144                if (plugins.contains(app)) {
    128145                    try {
    129                         PluginStarter.stopPlugin(_context, app);
    130                         addFormNotice(_("Stopped plugin {0}", app));
     146                        if (pluginsEnabled) {
     147                            PluginStarter.stopPlugin(_context, app);
     148                            addFormNotice(_("Stopped plugin {0}", app));
     149                        } else {
     150                            addFormError("Plugins disabled");
     151                        }
    131152                    } catch (Throwable e) {
    132153                        addFormError(_("Error stopping plugin {0}", app) + ": " + e);
     
    143164        // value
    144165        if (_action.startsWith("Update ")) {
    145             String app = _action.substring(7);
    146             updatePlugin(app);
     166            if (pluginsEnabled) {
     167                String app = _action.substring(7);
     168                updatePlugin(app);
     169            } else {
     170                addFormError("Plugins disabled");
     171            }
    147172            return;
    148173        }
     
    150175        // value
    151176        if (_action.startsWith("Check ")) {
    152             String app = _action.substring(6);
    153             checkPlugin(app);
     177            if (pluginsEnabled) {
     178                String app = _action.substring(6);
     179                checkPlugin(app);
     180            } else {
     181                addFormError("Plugins disabled");
     182            }
    154183            return;
    155184        }
     
    169198            } else {
    170199                List<String> plugins = PluginStarter.getPlugins();
    171                 if (plugins.contains(app))
    172                     startPlugin(app);
    173                 else
     200                if (plugins.contains(app)) {
     201                    if (pluginsEnabled)
     202                        startPlugin(app);
     203                    else
     204                        addFormError("Plugins disabled");
     205                } else {
    174206                    startWebApp(app);
     207                }
    175208            }
    176209        } else {
     
    188221                ca.disabled = val == null;
    189222            // edit of an existing entry
    190             // disabled
    191 /****
    192             String desc = getJettyString("desc" + cur);
    193             if (desc != null) {
    194                 int spc = desc.indexOf(" ");
    195                 String clss = desc;
     223            if (_context.getBooleanProperty(ConfigClientsHelper.PROP_ENABLE_CLIENT_CHANGE) ||
     224                isAdvanced()) {
     225                String desc = getJettyString("desc" + cur);
     226                if (desc != null) {
     227                    int spc = desc.indexOf(" ");
     228                    String clss = desc;
     229                    String args = null;
     230                    if (spc >= 0) {
     231                        clss = desc.substring(0, spc);
     232                        args = desc.substring(spc + 1);
     233                    }
     234                    ca.className = clss;
     235                    ca.args = args;
     236                    ca.clientName = getJettyString("name" + cur);
     237                }
     238            }
     239        }
     240
     241        // new client
     242        if (_context.getBooleanProperty(ConfigClientsHelper.PROP_ENABLE_CLIENT_CHANGE) ||
     243            isAdvanced()) {
     244            int newClient = clients.size();
     245            String newDesc = getJettyString("desc" + newClient);
     246            if (newDesc != null && newDesc.trim().length() > 0) {
     247                // new entry
     248                int spc = newDesc.indexOf(" ");
     249                String clss = newDesc;
    196250                String args = null;
    197251                if (spc >= 0) {
    198                     clss = desc.substring(0, spc);
    199                     args = desc.substring(spc + 1);
    200                 }
    201                 ca.className = clss;
    202                 ca.args = args;
    203                 ca.clientName = getJettyString("name" + cur);
    204             }
    205 ****/
    206         }
    207 
    208         // disabled
    209 /****
    210         int newClient = clients.size();
    211         String newDesc = getJettyString("desc" + newClient);
    212         if (newDesc != null && newDesc.trim().length() > 0) {
    213             // new entry
    214             int spc = newDesc.indexOf(" ");
    215             String clss = newDesc;
    216             String args = null;
    217             if (spc >= 0) {
    218                 clss = newDesc.substring(0, spc);
    219                 args = newDesc.substring(spc + 1);
    220             }
    221             String name = getJettyString("name" + newClient);
    222             if (name == null || name.trim().length() <= 0) name = "new client";
    223             ClientAppConfig ca = new ClientAppConfig(clss, name, args, 2*60*1000,
    224                                                      _settings.get(newClient + ".enabled") != null);
    225             clients.add(ca);
    226             addFormNotice(_("New client added") + ": " + name + " (" + clss + ").");
    227         }
    228 ****/
     252                    clss = newDesc.substring(0, spc);
     253                    args = newDesc.substring(spc + 1);
     254                }
     255                String name = getJettyString("name" + newClient);
     256                if (name == null || name.trim().length() <= 0) name = "new client";
     257                ClientAppConfig ca = new ClientAppConfig(clss, name, args, 2*60*1000,
     258                                                         _settings.get(newClient + ".enabled") != null);
     259                clients.add(ca);
     260                addFormNotice(_("New client added") + ": " + name + " (" + clss + ").");
     261            }
     262        }
    229263
    230264        ClientAppConfig.writeClientAppConfig(_context, clients);
     
    331365                        path = new File(path, app + ".war");
    332366                        WebAppStarter.startWebApp(_context, s, app, path.getAbsolutePath());
    333                         addFormNotice(_("WebApp") + " <a href=\"/" + app + "/\">" + _(app) + "</a> " + _("started") + '.');
     367                        addFormNoticeNoEscape(_("WebApp") + " <a href=\"/" + app + "/\">" + _(app) + "</a> " + _("started") + '.');
    334368                    } catch (Throwable e) {
    335369                        addFormError(_("Failed to start") + ' ' + _(app) + " " + e + '.');
     
    441475            changes.put(ClientManagerFacadeImpl.PROP_CLIENT_HOST, intfc);
    442476        String user = getJettyString("user");
    443         String pw = getJettyString("pw");
     477        String pw = getJettyString("nofilter_pw");
    444478        if (user != null && pw != null && user.length() > 0 && pw.length() > 0) {
    445479            ConsolePasswordManager mgr = new ConsolePasswordManager(_context);
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java

    rbf9c4b23 rb28eb70  
    2727    /** from ClientMessageEventListener */
    2828    public static final String PROP_AUTH = "i2cp.auth";
     29    public static final String PROP_ENABLE_CLIENT_CHANGE = "routerconsole.enableClientChange";
     30    public static final String PROP_ENABLE_PLUGIN_INSTALL = "routerconsole.enablePluginInstall";
    2931
    3032    public ConfigClientsHelper() {}
     33
     34    /** @since 0.9.14.1 */
     35    public boolean isClientChangeEnabled() {
     36        return _context.getBooleanProperty(PROP_ENABLE_CLIENT_CHANGE) || isAdvanced();
     37    }
     38
     39    /** @since 0.9.14.1 */
     40    public boolean isPluginInstallEnabled() {
     41        return PluginStarter.pluginsEnabled(_context) &&
     42               (_context.getBooleanProperty(PROP_ENABLE_PLUGIN_INSTALL) || isAdvanced());
     43    }
    3144
    3245    /** @since 0.8.3 */
     
    97110           .append(_("Class and arguments")).append("</th></tr>\n");
    98111       
     112        boolean allowEdit = isClientChangeEnabled();
    99113        List<ClientAppConfig> clients = ClientAppConfig.getClientApps(_context);
    100114        for (int cur = 0; cur < clients.size(); cur++) {
     
    118132                       //"webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName),
    119133                       false, RouterConsoleRunner.class.getName().equals(ca.className),
    120                        // description, edit
    121                        ca.className + ((ca.args != null) ? " " + ca.args : ""), /* (""+cur).equals(_edit) */ false,
     134                       // description
     135                       ca.className + ((ca.args != null) ? " " + ca.args : ""),
     136                       // edit
     137                       allowEdit && (""+cur).equals(_edit),
    122138                       // show edit button, show update button
    123139                       // Don't allow edit if it's running, or else we would lose the "handle" to the ClientApp to stop it.
    124                        /* !showStop */ false, false,
     140                       allowEdit && !showStop, false,
    125141                       // show stop button
    126142                       showStop,
     
    129145        }
    130146       
    131         //if ("new".equals(_edit))
    132         //    renderForm(buf, "" + clients.size(), "", false, false, false, false, "", true, false, false, false, false, false);
     147        if (allowEdit && "new".equals(_edit))
     148            renderForm(buf, "" + clients.size(), "", false, false, false, false, "", true, false, false, false, false, false);
    133149        buf.append("</table>\n");
    134150        return buf.toString();
     
    292308            buf.append("<button type=\"submit\" class=\"Xstop\" name=\"action\" value=\"Stop ").append(index).append("\" >")
    293309               .append(_("Stop")).append("<span class=hide> ").append(index).append("</span></button>");
    294         //if (showEditButton && (!edit) && !ro)
    295         //    buf.append("<button type=\"submit\" class=\"Xadd\" name=\"edit\" value=\"Edit ").append(index).append("\" >")
    296         //       .append(_("Edit")).append("<span class=hide> ").append(index).append("</span></button>");
     310        if (isClientChangeEnabled() && showEditButton && (!edit) && !ro)
     311            buf.append("<button type=\"submit\" class=\"Xadd\" name=\"edit\" value=\"Edit ").append(index).append("\" >")
     312               .append(_("Edit")).append("<span class=hide> ").append(index).append("</span></button>");
    297313        if (showUpdateButton && (!edit) && !ro) {
    298314            buf.append("<button type=\"submit\" class=\"Xcheck\" name=\"action\" value=\"Check ").append(index).append("\" >")
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java

    rbf9c4b23 rb28eb70  
    2727
    2828    /** @since 0.8.9 */
    29     public String getPassword() {
     29    public String getNofilter_password() {
    3030        return _context.getProperty(Reseeder.PROP_PROXY_PASSWORD, "");
    3131    }
     
    4747
    4848    /** @since 0.8.9 */
    49     public String getSpassword() {
     49    public String getNofilter_spassword() {
    5050        return _context.getProperty(Reseeder.PROP_SPROXY_PASSWORD, "");
    5151    }
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java

    rbf9c4b23 rb28eb70  
    123123        }
    124124        if (graphsChanged)
    125             addFormNotice(_("Graph list updated, may take up to 60s to be reflected on the {0}Graphs Page{1}", "<a href=\"graphs\">", "</a>"));
     125            addFormNoticeNoEscape(_("Graph list updated, may take up to 60s to be reflected on the {0}Graphs Page{1}", "<a href=\"graphs\">", "</a>"));
    126126    }
    127127   
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHandler.java

    rbf9c4b23 rb28eb70  
    3636    /** note - lang change is handled in CSSHelper but we still need to save it here */
    3737    private void saveChanges() {
    38         if (_config == null)
     38        if (_config == null || _config.length() <= 0)
    3939            return;
     40        if (_config.replaceAll("[a-zA-Z0-9_-]", "").length() != 0) {
     41            addFormError("Bad theme name");
     42            return;
     43        }
    4044        Map<String, String> changes = new HashMap<String, String>();
    4145        List<String> removes = new ArrayList<String>();
     
    7781            return;
    7882        }
    79         String pw = getJettyString("pw");
     83        String pw = getJettyString("nofilter_pw");
    8084        if (pw == null || pw.length() <= 0) {
    8185            addFormError(_("No password entered"));
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java

    rbf9c4b23 rb28eb70  
    184184                   "</td><td align=\"left\"><b>");
    185185        buf.append(_("Password")).append(":</b> " +
    186                    "<input type=\"password\" size=\"40\" name=\"pw\"></td></tr>" +
     186                   "<input type=\"password\" size=\"40\" name=\"nofilter_pw\"></td></tr>" +
    187187                   "</table>\n");
    188188        return buf.toString();
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java

    rbf9c4b23 rb28eb70  
    174174            String oldURL = ConfigUpdateHelper.getNewsURL(_context);
    175175            if ( (oldURL == null) || (!_newsURL.equals(oldURL)) ) {
    176                 //changes.put(PROP_NEWS_URL, _newsURL);
    177                 // this invalidates the news
    178                 //changes.put(NewsHelper.PROP_LAST_CHECKED, "0");
    179                 //addFormNotice(_("Updating news URL to {0}", _newsURL));
    180                 addFormError("Changing news URL disabled");
     176                if (isAdvanced()) {
     177                    changes.put(PROP_NEWS_URL, _newsURL);
     178                    // this invalidates the news
     179                    changes.put(NewsHelper.PROP_LAST_CHECKED, "0");
     180                    addFormNotice(_("Updating news URL to {0}", _newsURL));
     181                } else {
     182                    addFormError("Changing news URL disabled");
     183                }
    181184            }
    182185        }
     
    200203        changes.put(PROP_SHOULD_PROXY, Boolean.toString(_updateThroughProxy));
    201204        changes.put(PROP_SHOULD_PROXY_NEWS, Boolean.toString(_newsThroughProxy));
    202         changes.put(PROP_UPDATE_UNSIGNED, Boolean.toString(_updateUnsigned));
     205        if (isAdvanced())
     206            changes.put(PROP_UPDATE_UNSIGNED, Boolean.toString(_updateUnsigned));
    203207       
    204208        String oldFreqStr = _context.getProperty(PROP_REFRESH_FREQUENCY, DEFAULT_REFRESH_FREQUENCY);
     
    234238            if (!_trustedKeys.equals(oldKeys)) {
    235239                // note that keys are not validated here and no console error message will be generated
    236                 changes.put(PROP_TRUSTED_KEYS, _trustedKeys);
    237                 addFormNotice(_("Updating trusted keys."));
     240                if (isAdvanced()) {
     241                    changes.put(PROP_TRUSTED_KEYS, _trustedKeys);
     242                    addFormNotice(_("Updating trusted keys."));
     243                } else {
     244                    addFormError("Changing trusted keys disabled");
     245                }
    238246            }
    239247        }
     
    242250            String oldURL = _context.router().getConfigSetting(PROP_ZIP_URL);
    243251            if ( (oldURL == null) || (!_zipURL.equals(oldURL)) ) {
    244                 //changes.put(PROP_ZIP_URL, _zipURL);
    245                 //addFormNotice(_("Updating unsigned update URL to {0}", _zipURL));
    246                 addFormError("Changing unsigned update URL disabled");
     252                if (isAdvanced()) {
     253                    changes.put(PROP_ZIP_URL, _zipURL);
     254                    addFormNotice(_("Updating unsigned update URL to {0}", _zipURL));
     255                } else {
     256                    addFormError("Changing unsigned update URL disabled");
     257                }
    247258            }
    248259        }
  • apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java

    rbf9c4b23 rb28eb70  
    5252    }
    5353
    54     public void setNonce(String val) { _nonce = DataHelper.stripHTML(val); }
    55     public void setAction(String val) { _action = DataHelper.stripHTML(val); }
     54    public void setNonce(String val) { _nonce = val == null ? null : DataHelper.stripHTML(val); }
     55    public void setAction(String val) { _action = val == null ? null : DataHelper.stripHTML(val); }
    5656
    5757    /**
     
    6161     */
    6262    public void setSettings(Map settings) { _settings = new HashMap(settings); }
     63
     64    /**
     65     *  Same as HelperBase
     66     *  @since 0.9.14.1
     67     */
     68    public boolean isAdvanced() {
     69        return _context.getBooleanProperty(HelperBase.PROP_ADVANCED);
     70    }
    6371
    6472    /**
     
    103111    /**
    104112     * Add an error message to display
     113     * Use if it does not include a link.
     114     * Escapes '<' and '>' before queueing
    105115     */
    106116    protected void addFormError(String errorMsg) {
    107117        if (errorMsg == null) return;
    108         _errors.add(errorMsg);
     118        _errors.add(DataHelper.escapeHTML(errorMsg));
    109119    }
    110120   
    111121    /**
    112122     * Add a non-error message to display
     123     * Use if it does not include a link.
     124     * Escapes '<' and '>' before queueing
    113125     */
    114126    protected void addFormNotice(String msg) {
     127        if (msg == null) return;
     128        _notices.add(DataHelper.escapeHTML(msg));
     129    }
     130   
     131    /**
     132     * Add a non-error message to display
     133     * Use if it includes a link or other formatting.
     134     * Does not escape '<' and '>' before queueing
     135     * @since 0.9.14.1
     136     */
     137    protected void addFormNoticeNoEscape(String msg) {
    115138        if (msg == null) return;
    116139        _notices.add(msg);
     
    181204        // To prevent actions with GET, jsps must call storeMethod()
    182205        if (_method != null && !"POST".equals(_method)) {
    183             addFormError("Invalid form submission, requires POST not " + _method);
     206            addFormError("Invalid form submission, requires POST");
    184207            _valid = false;
    185208            return;
  • apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java

    rbf9c4b23 rb28eb70  
    819819
    820820    private String _action;
    821     public void setAction(String s) { _action = DataHelper.stripHTML(s); }
     821    public void setAction(String s) { _action = s == null ? null : DataHelper.stripHTML(s); }
    822822    public String getAction() { return _action; }
    823823
    824824    private String _consoleNonce;
    825     public void setConsoleNonce(String s) { _consoleNonce = DataHelper.stripHTML(s); }
     825    public void setConsoleNonce(String s) { _consoleNonce = s == null ? null : DataHelper.stripHTML(s); }
    826826    public String getConsoleNonce() { return _consoleNonce; }
    827827
    828828    private String _updateNonce;
    829     public void setUpdateNonce(String s) { _updateNonce = DataHelper.stripHTML(s); }
     829    public void setUpdateNonce(String s) { _updateNonce = s == null ? null : DataHelper.stripHTML(s); }
    830830    public String getUpdateNonce() { return _updateNonce; }
    831831
    832832    private String _requestURI;
    833     public void setRequestURI(String s) { _requestURI = DataHelper.stripHTML(s); }
     833    public void setRequestURI(String s) { _requestURI = s == null ? null : DataHelper.stripHTML(s); }
    834834
    835835    /**
  • apps/routerconsole/jsp/configadvanced.jsp

    rbf9c4b23 rb28eb70  
    2525 <div class="configure">
    2626 <div class="wideload">
    27 <!--
     27<% if (advancedhelper.isAdvanced()) { %>
    2828 <form action="" method="POST">
    2929 <input type="hidden" name="nonce" value="<%=pageNonce%>" >
    3030 <input type="hidden" name="action" value="blah" >
    31 -->
     31<% }  // isAdvanced %>
    3232 <h3><%=intl._("Advanced I2P Configuration")%></h3>
    33  <textarea rows="32" cols="60" name="config" wrap="off" spellcheck="false" readonly="readonly"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr>
    34 <!--
     33 <textarea rows="32" cols="60" name="nofilter_config" wrap="off" spellcheck="false" <% if (!advancedhelper.isAdvanced()) { %>readonly="readonly"<% } %>><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr>
     34<% if (advancedhelper.isAdvanced()) { %>
    3535      <div class="formaction">
    3636        <input type="reset" class="cancel" value="<%=intl._("Cancel")%>" >
     
    3838 <br><b><%=intl._("NOTE")%>:</b> <%=intl._("Some changes may require a restart to take effect.")%>
    3939 </div></form>
    40 -->
     40<% } else { %>
    4141To make changes, edit the router.config file.
     42<% }  // isAdvanced %>
    4243</div></div></div></body></html>
  • apps/routerconsole/jsp/configclients.jsp

    rbf9c4b23 rb28eb70  
    4040 </p><hr><div class="formaction">
    4141 <input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
    42 <% if (false && request.getParameter("edit") == null) { %>
     42<% if (clientshelper.isClientChangeEnabled() && request.getParameter("edit") == null) { %>
    4343 <input type="submit" name="edit" class="add" value="<%=intl._("Add Client")%>" />
    4444<% } %>
     
    8181<input name="user" type="text" value="" /><br>
    8282<%=intl._("Password")%>:
    83 <input name="pw" type="password" value="" /><br>
     83<input name="nofilter_pw" type="password" value="" /><br>
    8484</p><p><b><%=intl._("The default settings will work for most people.")%></b>
    8585<%=intl._("Any changes made here must also be configured in the external client.")%>
     
    118118</div></form></div>
    119119
    120 <!--
     120<% if (clientshelper.isPluginInstallEnabled()) { %>
    121121<h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p>
    122122 <%=intl._("Look for available plugins on {0}.", "<a href=\"http://plugins.i2p\">plugins.i2p</a>")%>
     
    134134 <input type="submit" name="action" class="reload" value="<%=intl._("Update All Installed Plugins")%>" />
    135135 </div></form></div>
    136 -->
    137 <% } %>
     136<%
     137     } // pluginInstallEnabled
     138 } // showPlugins
     139%>
    138140</div></div></body></html>
  • apps/routerconsole/jsp/configreseed.jsp

    rbf9c4b23 rb28eb70  
    5353<td><input name="username" type="text" value="<jsp:getProperty name="reseedHelper" property="username" />" ></td></tr>
    5454<tr><td class="mediumtags" align="right"><b><%=intl._("HTTP Proxy Password")%>:</b></td>
    55 <td><input name="password" type="password" value="<jsp:getProperty name="reseedHelper" property="password" />" ></td></tr>
     55<td><input name="nofilter_password" type="password" value="<jsp:getProperty name="reseedHelper" property="nofilter_password" />" ></td></tr>
    5656
    5757<!-- TODO Need SSLEepGet support
     
    6868<td><input name="susername" type="text" value="<jsp:getProperty name="reseedHelper" property="susername" />" ></td></tr>
    6969<tr><td class="mediumtags" align="right"><b><%=intl._("HTTPS Proxy Password")%>:</b></td>
    70 <td><input name="spassword" type="password" value="<jsp:getProperty name="reseedHelper" property="spassword" />" ></td></tr>
     70<td><input name="nofilter_spassword" type="password" value="<jsp:getProperty name="reseedHelper" property="nofilter_spassword" />" ></td></tr>
    7171-->
    7272
  • apps/routerconsole/jsp/configupdate.jsp

    rbf9c4b23 rb28eb70  
    4242        <tr><td colspan="2"><br></td></tr>
    4343        <tr><td class="mediumtags" align="right"><b><%=intl._("News URL")%>:</b></td>
    44           <td><input type="text" size="60" name="newsURL" readonly="readonly" value="<jsp:getProperty name="updatehelper" property="newsURL" />"></td>
     44          <td><input type="text" size="60" name="newsURL" <% if (!updatehelper.isAdvanced()) { %>readonly="readonly"<% } %> value="<jsp:getProperty name="updatehelper" property="newsURL" />"></td>
    4545        </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Refresh frequency")%>:</b>
    4646          <td><jsp:getProperty name="updatehelper" property="refreshFrequencySelectBox" /></td></tr>
     
    6565        </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Trusted keys")%>:</b></td>
    6666          <td><textarea cols="60" rows="6" name="trustedKeys" wrap="off" spellcheck="false"><jsp:getProperty name="updatehelper" property="trustedKeys" /></textarea></td></tr>
    67       <% }   // if isAdvanced %>
    68 <!--
    6967        <tr><td id="unsignedbuild" class="mediumtags" align="right"><b><%=intl._("Update with unsigned development builds?")%></b></td>
    7068          <td><jsp:getProperty name="updatehelper" property="updateUnsigned" /></td>
    7169        </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Unsigned Build URL")%>:</b></td>
    7270          <td><input type="text" size="60" name="zipURL" value="<jsp:getProperty name="updatehelper" property="zipURL" />"></td></tr>
    73 -->
     71      <% }   // if isAdvanced %>
    7472    <% } else { %>
    7573        <tr><td class="mediumtags" align="center" colspan="2"><b><%=intl._("Updates will be dispatched via your package manager.")%></b></td></tr>
  • apps/routerconsole/jsp/flags.jsp

    rbf9c4b23 rb28eb70  
    1313 */
    1414String c = request.getParameter("c");
    15 if (c != null && c.length() > 0) {
     15if (c != null &&
     16    (c.length() == 2 || c.length() == 7) &&
     17    c.replaceAll("[a-z_]", "").length() == 0) {
    1618    java.io.OutputStream cout = response.getOutputStream();
    1719    String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath();
  • apps/routerconsole/jsp/viewprofile.jsp

    rbf9c4b23 rb28eb70  
    1515<%
    1616    String peerB64 = request.getParameter("peer");
    17     if (peerB64 == null || peerB64.length() <= 0) {
     17    if (peerB64 == null || peerB64.length() <= 0 ||
     18        peerB64.replaceAll("[a-zA-Z0-9~=-]", "").length() != 0) {
    1819        out.print("No peer specified");
    1920    } else {
    20         peerB64 = net.i2p.data.DataHelper.stripHTML(peerB64);  // XSS
     21
    2122%>
    2223<jsp:useBean id="stathelper" class="net.i2p.router.web.StatHelper" />
  • history.txt

    rbf9c4b23 rb28eb70  
     12014-08-03 zzz
     2 * Console:
     3   - Fix update buttons
     4   - Don't filter parameter names starting with "nofilter_"
     5   - Re-allow configadvanced, news URL, and unsigned update URL if routerconsole.advanced=true
     6   - Re-allow plugin install if routerconsole.advanced=true or routerconsole.enablePluginInstall=true
     7   - Only allow whitelisted plugin signers, unless routerconsole.allowUntrustedPlugins=true
     8   - Re-allow clients.config changes if routerconsole.advanced=true or routerconsole.enableClientChange=true
     9   - More escaping
     10 * i2psnark: Fix add torrent form
     11
    1122014-07-31 zzz
    213 * ExecNamingService: Remove
  • router/java/src/net/i2p/router/RouterVersion.java

    rbf9c4b23 rb28eb70  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 1;
     21    public final static long BUILD = 2;
    2222
    2323    /** for example "-test" */
    24     public final static String EXTRA = "";
     24    public final static String EXTRA = "-rc";
    2525    public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
    2626    public static void main(String args[]) {
Note: See TracChangeset for help on using the changeset viewer.