Changeset aab8b10


Ignore:
Timestamp:
Feb 20, 2014 2:07:02 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
91cdf85
Parents:
5bcfe1ec
Message:
  • i2ptunnel: Add inproxy block option to HTTP server
Location:
apps/i2ptunnel
Files:
3 edited

Legend:

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

    r5bcfe1ec raab8b10  
    4949    public static final String OPT_POST_MAX = "maxPosts";
    5050    public static final String OPT_POST_TOTAL_MAX = "maxTotalPosts";
     51    public static final String OPT_REJECT_INPROXY = "rejectInproxy";
    5152    public static final int DEFAULT_POST_WINDOW = 5*60;
    5253    public static final int DEFAULT_POST_BAN_TIME = 30*60;
     
    9394         "<body><h2>403 Denied</h2>\n" +
    9495         "<p>Denied due to excessive requests. Please try again later.</p>\n" +
     96         "</body></html>")
     97         .getBytes();
     98
     99    private final static byte[] ERR_INPROXY =
     100        ("HTTP/1.1 403 Denied\r\n"+
     101         "Content-Type: text/html; charset=iso-8859-1\r\n"+
     102         "Cache-control: no-cache\r\n"+
     103         "Connection: close\r\n"+
     104         "Proxy-Connection: close\r\n"+
     105         "\r\n"+
     106         "<html><head><title>403 Denied</title></head>\n"+
     107         "<body><h2>403 Denied</h2>\n" +
     108         "<p>Inproxy access denied. You must run <a href=\"https://geti2p.net/\">I2P</a> to access this site.</p>\n" +
    95109         "</body></html>")
    96110         .getBytes();
     
    199213            long afterHeaders = getTunnel().getContext().clock().now();
    200214
     215            Properties opts = getTunnel().getClientOptions();
     216            if (Boolean.parseBoolean(opts.getProperty(OPT_REJECT_INPROXY)) &&
     217                (headers.containsKey("X-Forwarded-For") ||
     218                 headers.containsKey("X-Forwarded-Server") ||
     219                 headers.containsKey("X-Forwarded-Host"))) {
     220                if (_log.shouldLog(Log.WARN))
     221                    _log.warn("Refusing inproxy access: " + peerHash.toBase64());
     222                try {
     223                    // Send a 403, so the user doesn't get an HTTP Proxy error message
     224                    // and blame his router or the network.
     225                    socket.getOutputStream().write(ERR_INPROXY);
     226                } catch (IOException ioe) {}
     227                try {
     228                    socket.close();
     229                } catch (IOException ioe) {}
     230                return;
     231            }
     232
    201233            if (_postThrottler != null &&
    202234                command.length() >= 5 &&
     
    222254
    223255            // Port-specific spoofhost
    224             Properties opts = getTunnel().getClientOptions();
    225256            String spoofHost;
    226257            int ourPort = socket.getLocalPort();
     
    669700                    value = "";
    670701
    671                 if ("accept-encoding".equals(name.toLowerCase(Locale.US)))
     702                String lcName = name.toLowerCase(Locale.US);
     703                if ("accept-encoding".equals(lcName))
    672704                    name = "Accept-encoding";
    673                 else if ("x-accept-encoding".equals(name.toLowerCase(Locale.US)))
     705                else if ("x-accept-encoding".equals(lcName))
    674706                    name = "X-Accept-encoding";
     707                else if ("x-forwarded-for".equals(lcName))
     708                    name = "X-Forwarded-For";
     709                else if ("x-forwarded-server".equals(lcName))
     710                    name = "X-Forwarded-Server";
     711                else if ("x-forwarded-host".equals(lcName))
     712                    name = "X-Forwarded-Host";
    675713
    676714                // For incoming, we remove certain headers to prevent spoofing.
    677715                // For outgoing, we remove certain headers to improve anonymity.
    678716                boolean skip = false;
    679                 String lcName = name.toLowerCase(Locale.US);
    680717                for (String skipHeader: skipHeaders) {
    681718                    if (skipHeader.toLowerCase(Locale.US).equals(lcName)) {
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    r5bcfe1ec raab8b10  
    809809    }
    810810
     811    /** @since 0.9.12 */
     812    public void setRejectInproxy(String moo) {
     813        _booleanOptions.add(I2PTunnelHTTPServer.OPT_REJECT_INPROXY);
     814    }
     815
     816    /** @since 0.9.12 */
     817    public boolean isRejectInproxy(int tunnel) {
     818        TunnelController tun = getController(tunnel);
     819        if (tun != null) {
     820            Properties opts = tun.getClientOptionProps();
     821            return Boolean.parseBoolean(opts.getProperty(I2PTunnelHTTPServer.OPT_REJECT_INPROXY));
     822        }
     823        return false;
     824    }
     825
    811826    protected static final String PROP_ENABLE_ACCESS_LIST = "i2cp.enableAccessList";
    812827    protected static final String PROP_ENABLE_BLACKLIST = "i2cp.enableBlackList";
     
    12441259    private static final String _booleanServerOpts[] = {
    12451260        "i2cp.reduceOnIdle", "i2cp.encryptLeaseSet", PROP_ENABLE_ACCESS_LIST, PROP_ENABLE_BLACKLIST,
    1246         I2PTunnelServer.PROP_USE_SSL
     1261        I2PTunnelServer.PROP_USE_SSL,
     1262        I2PTunnelHTTPServer.OPT_REJECT_INPROXY
    12471263        };
    12481264    private static final String _otherClientOpts[] = {
  • apps/i2ptunnel/jsp/editServer.jsp

    r5bcfe1ec raab8b10  
    382382            </div>
    383383                 
    384             <div class="subdivider">
     384            <% if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
     385            %><div class="rowItem">
     386                <div id="optionsField" class="rowItem">
     387                    <label>
     388                        <%=intl._("Block Access via Inproxies")%>:
     389                    </label>
     390                </div>
     391                <div id="portField" class="rowItem">
     392                    <label for="access" accesskey="d">
     393                        <%=intl._("Enable")%>:
     394                    </label>
     395                    <input value="1" type="checkbox" id="startOnLoad" name="rejectInproxy" title="Deny inproxy access when enabled"<%=(editBean.isRejectInproxy(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />               
     396                </div>
     397              </div>
     398            <% } // httpserver
     399            %><div class="subdivider">
    385400                <hr />
    386401            </div>
Note: See TracChangeset for help on using the changeset viewer.