[ https://issues.apache.org/jira/browse/JSPWIKI-1183?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ulf Dittmer updated JSPWIKI-1183: --------------------------------- Description: The IfPlugin.checkIP method has a comment "TODO: Add subnetwork matching, e.g. 10.0.0.0/8". This is a patch to address this. Sorry that this does not come as a PR, but the changes are limited in scope. Additions to pom.xml {{ <ipaddress.version>5.4.0</ipaddress.version> <dependency> <groupId>com.github.seancfoley</groupId> <artifactId>ipaddress</artifactId> <version>${ipaddress.version}</version> </dependency> }} Additions to jspwiki-util/pom.xml {{ <dependency> <groupId>com.github.seancfoley</groupId> <artifactId>ipaddress</artifactId> </dependency>}} Changes in jspwiki-util/src/main/java/org/apache/wiki/util/HttpUtil.java This method now checks whether the IP contains a comma, which can happen if the request goes through more than one proxy. That's not directly related to this patch, but useful nonetheless. {{ /** * returns the remote address by looking into {@code x-forwarded-for} header or, if unavailable, * into {@link HttpServletRequest#getRemoteAddr()}. * * @param req http request * @return remote address associated to the request. */ public static String getRemoteAddress( final HttpServletRequest req ) { String realIP = StringUtils.isNotEmpty ( req.getHeader( "X-Forwarded-For" ) ) ? req.getHeader( "X-Forwarded-For" ) : req.getRemoteAddr(); // can be a comma-separated list of IPs if (realIP.contains(",")) realIP = realIP.substring(realIP.indexOf(",")); return realIP; }}} This method is new {{ /** * Returns whether or not the IP address of the request equals a given IP, or is in a given IP range * * @param req http request * @param ipOrRange IP address or IP range to test against * @return */ public static boolean ipIsInRange ( final HttpServletRequest req, final String ipOrRange ) { String requestIP = getRemoteAddress(req); if (ipOrRange.contains("/")) { IPAddressString testRange = new IPAddressString(ipOrRange); return testRange.contains(new IPAddressString(requestIP)); } else { return requestIP.equals(ipOrRange); } } }} Changes in jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java Instead of {{ include |= ipaddrToCheck.equals( HttpUtil.getRemoteAddress( context.getHttpRequest() ) ) ^ invert;}} now it should read {{ include |= HttpUtil.ipIsInRange( context.getHttpRequest(), ipaddrToCheck ) ^ invert;}} That's all. Now the IfPlugin accepts something like [{If ip='192.168.0.0/16|10.0.0.0/8|127.0.0.1' Secret stuff for localhost and local networks}] was: The IfPlugin.checkIP method has a comment "TODO: Add subnetwork matching, e.g. 10.0.0.0/8". This is a patch to address this. Sorry that this does not come as a PR, but the changes are limited in scope. Additions to pom.xml <ipaddress.version>5.4.0</ipaddress.version> <dependency> <groupId>com.github.seancfoley</groupId> <artifactId>ipaddress</artifactId> <version>${ipaddress.version}</version> </dependency> Additions to jspwiki-util/pom.xml <dependency> <groupId>com.github.seancfoley</groupId> <artifactId>ipaddress</artifactId> </dependency> Changes in jspwiki-util/src/main/java/org/apache/wiki/util/HttpUtil.java This method now checks whether the IP contains a comma, which can happen if the request goes through more than one proxy. That's not directly related to this patch, but useful nonetheless. /** * returns the remote address by looking into {@code x-forwarded-for} header or, if unavailable, * into {@link HttpServletRequest#getRemoteAddr()}. * * @param req http request * @return remote address associated to the request. */ public static String getRemoteAddress( final HttpServletRequest req ) { String realIP = StringUtils.isNotEmpty ( req.getHeader( "X-Forwarded-For" ) ) ? req.getHeader( "X-Forwarded-For" ) : req.getRemoteAddr(); // can be a comma-separated list of IPs if (realIP.contains(",")) realIP = realIP.substring(realIP.indexOf(",")); return realIP; } This method is new /** * Returns whether or not the IP address of the request equals a given IP, or is in a given IP range * * @param req http request * @param ipOrRange IP address or IP range to test against * @return */ public static boolean ipIsInRange ( final HttpServletRequest req, final String ipOrRange ) { String requestIP = getRemoteAddress(req); if (ipOrRange.contains("/")) { IPAddressString testRange = new IPAddressString(ipOrRange); return testRange.contains(new IPAddressString(requestIP)); } else { return requestIP.equals(ipOrRange); } } Changes in jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java Instead of include |= ipaddrToCheck.equals( HttpUtil.getRemoteAddress( context.getHttpRequest() ) ) ^ invert; now it should read include |= HttpUtil.ipIsInRange( context.getHttpRequest(), ipaddrToCheck ) ^ invert; That's all. Now the IfPlugin accepts something like [{If ip='192.168.0.0/16|10.0.0.0/8|127.0.0.1' Secret stuff for localhost and local networks}] > Support IP ranges in IfPlugin > ----------------------------- > > Key: JSPWIKI-1183 > URL: https://issues.apache.org/jira/browse/JSPWIKI-1183 > Project: JSPWiki > Issue Type: Improvement > Components: Plugins > Affects Versions: 2.12.1 > Reporter: Ulf Dittmer > Priority: Minor > > The IfPlugin.checkIP method has a comment "TODO: Add subnetwork matching, > e.g. 10.0.0.0/8". This is a patch to address this. Sorry that this does not > come as a PR, but the changes are limited in scope. > Additions to pom.xml > {{ <ipaddress.version>5.4.0</ipaddress.version> > <dependency> > <groupId>com.github.seancfoley</groupId> > <artifactId>ipaddress</artifactId> > <version>${ipaddress.version}</version> > </dependency> > }} > Additions to jspwiki-util/pom.xml > {{ <dependency> > <groupId>com.github.seancfoley</groupId> > <artifactId>ipaddress</artifactId> > </dependency>}} > Changes in jspwiki-util/src/main/java/org/apache/wiki/util/HttpUtil.java > This method now checks whether the IP contains a comma, which can happen if > the request goes through more than one proxy. That's not directly related to > this patch, but useful nonetheless. > {{ /** > * returns the remote address by looking into {@code x-forwarded-for} > header or, if unavailable, > * into {@link HttpServletRequest#getRemoteAddr()}. > * > * @param req http request > * @return remote address associated to the request. > */ > public static String getRemoteAddress( final HttpServletRequest req ) { > String realIP = StringUtils.isNotEmpty ( req.getHeader( > "X-Forwarded-For" ) ) ? req.getHeader( "X-Forwarded-For" ) : > > req.getRemoteAddr(); > // can be a comma-separated list of IPs > if (realIP.contains(",")) > realIP = realIP.substring(realIP.indexOf(",")); > return realIP; > }}} > This method is new > {{ /** > * Returns whether or not the IP address of the request equals a given > IP, or is in a given IP range > * > * @param req http request > * @param ipOrRange IP address or IP range to test against > * @return > */ > public static boolean ipIsInRange ( final HttpServletRequest req, final > String ipOrRange ) { > String requestIP = getRemoteAddress(req); > if (ipOrRange.contains("/")) { > IPAddressString testRange = new > IPAddressString(ipOrRange); > return testRange.contains(new > IPAddressString(requestIP)); > } else { > return requestIP.equals(ipOrRange); > } > } > }} > Changes in jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java > Instead of > {{ include |= ipaddrToCheck.equals( HttpUtil.getRemoteAddress( > context.getHttpRequest() ) ) ^ invert;}} > now it should read > {{ include |= HttpUtil.ipIsInRange( context.getHttpRequest(), > ipaddrToCheck ) ^ invert;}} > That's all. Now the IfPlugin accepts something like > [{If ip='192.168.0.0/16|10.0.0.0/8|127.0.0.1' > Secret stuff for localhost and local networks}] -- This message was sent by Atlassian Jira (v8.20.10#820010)