Changeset e65bd26


Ignore:
Timestamp:
Feb 13, 2016 3:31:38 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
8ef593f
Parents:
0717696
Message:

I2PTunnel:

  • Add options to block by referer and user-agent
  • Increase size of access list field in form
  • Log blocked destinations in b32, not b64
  • Strip X-Runtime header

Streaming;

  • Log blocked destinations in b32, not b64
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java

    r0717696 re65bd26  
    2626import net.i2p.client.streaming.I2PSocket;
    2727import net.i2p.I2PAppContext;
     28import net.i2p.data.Base32;
    2829import net.i2p.data.ByteArray;
    2930import net.i2p.data.DataHelper;
     
    5152    public static final String OPT_POST_TOTAL_MAX = "maxTotalPosts";
    5253    public static final String OPT_REJECT_INPROXY = "rejectInproxy";
     54    public static final String OPT_REJECT_REFERER = "rejectReferer";
     55    public static final String OPT_REJECT_USER_AGENTS = "rejectUserAgents";
     56    public static final String OPT_USER_AGENTS = "userAgentRejectList";
    5357    public static final int DEFAULT_POST_WINDOW = 5*60;
    5458    public static final int DEFAULT_POST_BAN_TIME = 30*60;
     
    6569    private static final String SERVER_HEADER = "Server";
    6670    private static final String X_POWERED_BY_HEADER = "X-Powered-By";
    67     private static final String[] SERVER_SKIPHEADERS = {SERVER_HEADER, X_POWERED_BY_HEADER};
     71    private static final String X_RUNTIME_HEADER = "X-Runtime"; // Rails
     72    private static final String[] SERVER_SKIPHEADERS = {SERVER_HEADER, X_POWERED_BY_HEADER, X_RUNTIME_HEADER };
    6873    /** timeout for first request line */
    6974    private static final long HEADER_TIMEOUT = 15*1000;
     
    358363                if (_log.shouldLog(Log.WARN)) {
    359364                    StringBuilder buf = new StringBuilder();
    360                     buf.append("Refusing inproxy access: ").append(peerHash.toBase64());
     365                    buf.append("Refusing inproxy access: ").append(Base32.encode(peerHash.getData())).append(".b32.i2p");
    361366                    List<String> h = headers.get("X-Forwarded-For");
    362367                    if (h != null)
     
    381386            }
    382387
     388            if (Boolean.parseBoolean(opts.getProperty(OPT_REJECT_REFERER)) &&
     389                headers.containsKey("Referer")) {
     390                if (_log.shouldLog(Log.WARN))
     391                    _log.warn("Refusing access from: " +
     392                              Base32.encode(peerHash.getData()) + ".b32.i2p" +
     393                              " with Referer: " + headers.get("Referer").get(0));
     394                try {
     395                    socket.getOutputStream().write(ERR_INPROXY.getBytes("UTF-8"));
     396                } catch (IOException ioe) {}
     397                try {
     398                    socket.close();
     399                } catch (IOException ioe) {}
     400                return;
     401            }
     402
     403            if (Boolean.parseBoolean(opts.getProperty(OPT_REJECT_USER_AGENTS)) &&
     404                headers.containsKey("User-Agent")) {
     405                String ua = headers.get("User-Agent").get(0);
     406                if (!ua.startsWith("MYOB")) {
     407                    String blockAgents = opts.getProperty(OPT_USER_AGENTS);
     408                    if (blockAgents != null) {
     409                        String[] agents = DataHelper.split(blockAgents, ",");
     410                        for (int i = 0; i < agents.length; i++) {
     411                            String ag = agents[i].trim();
     412                            if (ag.length() > 0 && ua.contains(ag)) {
     413                                if (_log.shouldLog(Log.WARN))
     414                                    _log.warn("Refusing access from: " +
     415                                              Base32.encode(peerHash.getData()) + ".b32.i2p" +
     416                                              " with User-Agent: " + ua);
     417                                try {
     418                                    socket.getOutputStream().write(ERR_INPROXY.getBytes("UTF-8"));
     419                                } catch (IOException ioe) {}
     420                                try {
     421                                    socket.close();
     422                                } catch (IOException ioe) {}
     423                                return;
     424                            }
     425                        }
     426                    }
     427                }
     428            }
     429
    383430            if (_postThrottler != null &&
    384431                command.length() >= 5 &&
     
    386433                if (_postThrottler.shouldThrottle(peerHash)) {
    387434                    if (_log.shouldLog(Log.WARN))
    388                         _log.warn("Refusing POST since peer is throttled: " + peerHash.toBase64());
     435                        _log.warn("Refusing POST since peer is throttled: " +
     436                                  Base32.encode(peerHash.getData()) + ".b32.i2p");
    389437                    try {
    390438                        // Send a 403, so the user doesn't get an HTTP Proxy error message
     
    491539            } catch (IOException ioe) {}
    492540            if (_log.shouldLog(Log.WARN))
    493                 _log.warn("Error while receiving the new HTTP request", ex);
     541                _log.warn("Error while receiving the new HTTP request from: " + Base32.encode(peerHash.getData()) + ".b32.i2p", ex);
    494542        } catch (OutOfMemoryError oom) {
    495543            // Often actually a file handle limit problem so we can safely send a response
     
    815863     *  From server to I2P: socket null, in non-null.
    816864     *
     865     *  Note: This does not handle RFC 2616 header line splitting,
     866     *  which is obsoleted in RFC 7230.
     867     *
    817868     *  @param socket if null, use in as InputStream
    818869     *  @param in if null, use socket.getInputStream() as InputStream
     
    872923                int split = buf.indexOf(":");
    873924                if (split <= 0)
    874                     throw new BadRequestException("Invalid HTTP header, missing colon");
     925                    throw new BadRequestException("Invalid HTTP header, missing colon: \"" + buf +
     926                                                  "\" request: \"" + command + '"');
    875927                totalSize += buf.length();
    876928                if (totalSize > MAX_TOTAL_HEADER_SIZE)
     
    894946                else if ("x-forwarded-host".equals(lcName))
    895947                    name = "X-Forwarded-Host";
     948                else if ("user-agent".equals(lcName))
     949                    name = "User-Agent";
     950                else if ("referer".equals(lcName))
     951                    name = "Referer";
    896952
    897953                // For incoming, we remove certain headers to prevent spoofing.
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java

    r0717696 re65bd26  
    631631    }
    632632
     633    /** @since 0.9.25 */
     634    public boolean getRejectReferer(int tunnel) {
     635        return getBooleanProperty(tunnel, I2PTunnelHTTPServer.OPT_REJECT_REFERER);
     636    }
     637
     638    /** @since 0.9.25 */
     639    public boolean getRejectUserAgents(int tunnel) {
     640        return getBooleanProperty(tunnel, I2PTunnelHTTPServer.OPT_REJECT_USER_AGENTS);
     641    }
     642
     643    /** @since 0.9.25 */
     644    public String getUserAgents(int tunnel) {
     645        return getProperty(tunnel, I2PTunnelHTTPServer.OPT_USER_AGENTS, "");
     646    }
     647
    633648    public boolean getUniqueLocal(int tunnel) {
    634649        return getBooleanProperty(tunnel, I2PTunnelServer.PROP_UNIQUE_LOCAL);
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java

    r0717696 re65bd26  
    215215            _booleanOptions.remove(I2PTunnelHTTPServer.OPT_REJECT_INPROXY);
    216216    }
     217
     218    /** @since 0.9.25 */
     219    public void setRejectReferer(boolean val) {
     220        if (val)
     221            _booleanOptions.add(I2PTunnelHTTPServer.OPT_REJECT_REFERER);
     222        else
     223            _booleanOptions.remove(I2PTunnelHTTPServer.OPT_REJECT_REFERER);
     224    }
     225
     226    /** @since 0.9.25 */
     227    public void setRejectUserAgents(boolean val) {
     228        if (val)
     229            _booleanOptions.add(I2PTunnelHTTPServer.OPT_REJECT_USER_AGENTS);
     230        else
     231            _booleanOptions.remove(I2PTunnelHTTPServer.OPT_REJECT_USER_AGENTS);
     232    }
     233
     234    /** @since 0.9.25 */
     235    public void setUserAgents(String val) {
     236        if (val != null)
     237            _otherOptions.put(I2PTunnelHTTPServer.OPT_USER_AGENTS, val.trim());
     238    }
     239
    217240    public void setUniqueLocal(boolean val) {
    218241        if (val)
     
    676699        I2PTunnelServer.PROP_USE_SSL,
    677700        I2PTunnelHTTPServer.OPT_REJECT_INPROXY,
     701        I2PTunnelHTTPServer.OPT_REJECT_REFERER,
     702        I2PTunnelHTTPServer.OPT_REJECT_USER_AGENTS,
    678703        I2PTunnelServer.PROP_UNIQUE_LOCAL,
    679704        "shouldBundleReplyInfo"
     
    701726        I2PTunnelHTTPServer.OPT_POST_TOTAL_BAN_TIME,
    702727        I2PTunnelHTTPServer.OPT_POST_MAX,
    703         I2PTunnelHTTPServer.OPT_POST_TOTAL_MAX
     728        I2PTunnelHTTPServer.OPT_POST_TOTAL_MAX,
     729        I2PTunnelHTTPServer.OPT_USER_AGENTS
    704730        };
    705731
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java

    r0717696 re65bd26  
    256256    }
    257257
     258    /** @since 0.9.25 */
     259    public String getUserAgents(int tunnel) {
     260        return _helper.getUserAgents(tunnel);
     261    }
     262   
    258263    /** all proxy auth @since 0.8.2 */
    259264    public boolean getProxyAuth(int tunnel) {
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    r0717696 re65bd26  
    680680    }
    681681
     682    /** @since 0.9.25 */
     683    public void setRejectReferer(String moo) {
     684        _config.setRejectReferer(true);
     685    }
     686
     687    /** @since 0.9.25 */
     688    public boolean isRejectReferer(int tunnel) {
     689        return _helper.getRejectReferer(tunnel);
     690    }
     691
     692    /** @since 0.9.25 */
     693    public void setRejectUserAgents(String moo) {
     694        _config.setRejectUserAgents(true);
     695    }
     696
     697    /** @since 0.9.25 */
     698    public boolean isRejectUserAgents(int tunnel) {
     699        return _helper.getRejectUserAgents(tunnel);
     700    }
     701
     702    /** @since 0.9.25 */
     703    public void setUserAgents(String agents) {
     704        _config.setUserAgents(agents);
     705    }
     706
    682707    /** @since 0.9.13 */
    683708    public void setUniqueLocal(String moo) {
  • apps/i2ptunnel/jsp/editServer.jsp

    r0717696 re65bd26  
    406406                <input value="2" type="radio" id="startOnLoad" name="accessMode" title="Reject listed clients"<%=(editBean.getAccessMode(curTunnel).equals("2") ? " checked=\"checked\"" : "")%> class="tickbox" />               
    407407            </div>
    408             <div id="hostField" class="rowItem">
     408            <div id="accessListField" class="rowItem">
    409409                <label for="accessList" accesskey="s">
    410410                    <%=intl._t("Access List")%>:
    411411                </label>
    412                 <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off" spellcheck="false"><%=editBean.getAccessList(curTunnel)%></textarea>               
     412                <textarea rows="2" style="height: 8em;" cols="60" name="accessList" title="Access List" wrap="off" spellcheck="false"><%=editBean.getAccessList(curTunnel)%></textarea>               
    413413            </div>
    414414                 
     
    425425                    </label>
    426426                    <input value="1" type="checkbox" id="startOnLoad" name="rejectInproxy" title="Deny inproxy access when enabled"<%=(editBean.isRejectInproxy(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />               
     427                </div>
     428              </div>
     429            <div class="rowItem">
     430                <div id="optionsField" class="rowItem">
     431                    <label>
     432                        <%=intl._t("Block Accesses containing Referers")%>:
     433                    </label>
     434                </div>
     435                <div id="portField" class="rowItem">
     436                    <label for="access" accesskey="d">
     437                        <%=intl._t("Enable")%>:
     438                    </label>
     439                    <input value="1" type="checkbox" id="startOnLoad" name="rejectReferer" title="Deny accesseses with referers (probably from inproxies)"<%=(editBean.isRejectReferer(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />               
     440                </div>
     441              </div>
     442            <div class="rowItem">
     443                <div id="optionsField" class="rowItem">
     444                    <label>
     445                        <%=intl._t("Block these User-Agents")%>:
     446                    </label>
     447                </div>
     448                <div id="portField" class="rowItem">
     449                    <label for="access" accesskey="d">
     450                        <%=intl._t("Enable")%>:
     451                    </label>
     452                    <input value="1" type="checkbox" id="startOnLoad" name="rejectUserAgents" title="Deny User-Agents matching these strings (probably from inproxies)"<%=(editBean.isRejectUserAgents(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />               
     453                </div>
     454                <div id="optionsHostField" class="rowItem">
     455                    <input type="text" id="userAgents" name="userAgents" size="20" title="comma separated, e.g. Mozilla,Opera (case-sensitive)" value="<%=editBean.getUserAgents(curTunnel)%>" class="freetext" />               
    427456                </div>
    428457              </div>
  • apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java

    r0717696 re65bd26  
    242242                    if ((!_defaultOptions.getDisableRejectLogging()) || _log.shouldLog(Log.WARN))
    243243                        _log.logAlways(Log.WARN, "Refusing connection since peer is " + why +
    244                            (synPacket.getOptionalFrom() == null ? "" : ": " + synPacket.getOptionalFrom().calculateHash().toBase64()));
     244                           (synPacket.getOptionalFrom() == null ? "" : ": " + synPacket.getOptionalFrom().toBase32()));
    245245                    reject = true;
    246246                } else {
  • installer/resources/themes/console/light/i2ptunnel.css

    r0717696 re65bd26  
    3131#tunnelEditPage #reachField, #tunnelEditPage #hostField, #tunnelEditPage #depthField, #tunnelEditPage #countField, #tunnelEditPage #optionsHostField {
    3232     width: 304px;
     33     margin-right: 4px;
     34}
     35
     36#tunnelEditPage #accessListField {
     37     width: 434px;
    3338     margin-right: 4px;
    3439}
Note: See TracChangeset for help on using the changeset viewer.