Skip to content

Commit 2bb7397

Browse files
authored
Add requestHeaderBlacklist and requestHeaderWhitelist (#81)
* feat: add request header white and black lists * feat: update pom.xml to set source and target at 8
1 parent d541b12 commit 2bb7397

7 files changed

Lines changed: 343 additions & 2 deletions

File tree

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
<artifactId>maven-compiler-plugin</artifactId>
3030
<version>3.5.1</version>
3131
<configuration>
32-
<source>1.7</source>
33-
<target>1.7</target>
32+
<source>8</source>
33+
<target>8</target>
3434
</configuration>
3535
</plugin>
3636

src/main/java/it/geosolutions/httpproxy/HTTPProxy.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,12 +847,41 @@ private ProxyInfo setProxyRequestHeaders(URL url, HttpServletRequest httpServlet
847847

848848
Enumeration enumerationOfHeaderNames = httpServletRequest.getHeaderNames();
849849

850+
// ////////////////////////////////////////
851+
// Load header whitelist/blacklist for
852+
// filtering forwarded request headers.
853+
// ////////////////////////////////////////
854+
855+
Set<String> headerWhitelist = proxyConfig.getRequestHeaderWhitelist();
856+
Set<String> headerBlacklist = proxyConfig.getRequestHeaderBlacklist();
857+
850858
while (enumerationOfHeaderNames.hasMoreElements()) {
851859
String stringHeaderName = (String) enumerationOfHeaderNames.nextElement();
852860

853861
if (stringHeaderName.equalsIgnoreCase(Utils.CONTENT_LENGTH_HEADER_NAME))
854862
continue;
855863

864+
// ////////////////////////////////////////
865+
// Apply header blacklist: always reject
866+
// ////////////////////////////////////////
867+
868+
if (headerBlacklist != null && !headerBlacklist.isEmpty()) {
869+
if (headerBlacklist.contains(stringHeaderName.toLowerCase())) {
870+
continue;
871+
}
872+
}
873+
874+
// ////////////////////////////////////////
875+
// Apply header whitelist: if set, only
876+
// allow headers in the whitelist
877+
// ////////////////////////////////////////
878+
879+
if (headerWhitelist != null && !headerWhitelist.isEmpty()) {
880+
if (!headerWhitelist.contains(stringHeaderName.toLowerCase())) {
881+
continue;
882+
}
883+
}
884+
856885
// ////////////////////////////////////////////////////////////////////////
857886
// As per the Java Servlet API 2.5 documentation:
858887
// Some headers, such as Accept-Language can be sent by clients

src/main/java/it/geosolutions/httpproxy/ProxyConfig.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ final class ProxyConfig {
6565
*/
6666
private Set<String> hostsWhitelist = new HashSet<String>();
6767

68+
/**
69+
* A list of request header names (case-insensitive) that the proxy is permitted to forward.
70+
* If non-empty, only headers in this set will be forwarded.
71+
*/
72+
private Set<String> requestHeaderWhitelist = new HashSet<String>();
73+
74+
/**
75+
* A list of request header names (case-insensitive) that the proxy must NOT forward.
76+
* Headers in this set will always be removed, even if they appear in the whitelist.
77+
*/
78+
private Set<String> requestHeaderBlacklist = new HashSet<String>();
79+
6880
/**
6981
* The servlet context
7082
*/
@@ -137,6 +149,14 @@ private void configProxy() {
137149
if (p != null)
138150
this.setHostsWhitelist(p);
139151

152+
p = Utils.parseWhiteList(props.getProperty("requestHeaderWhitelist"));
153+
if (p != null)
154+
this.setRequestHeaderWhitelist(Utils.toLowerCaseSet(p));
155+
156+
p = Utils.parseWhiteList(props.getProperty("requestHeaderBlacklist"));
157+
if (p != null)
158+
this.setRequestHeaderBlacklist(Utils.toLowerCaseSet(p));
159+
140160
// ////////////////////////////////////////
141161
// Read various request type properties
142162
// ////////////////////////////////////////
@@ -436,6 +456,50 @@ public void setHostsWhitelist(Set<String> hostsWhitelist) {
436456
this.hostsWhitelist = hostsWhitelist;
437457
}
438458

459+
/**
460+
* @return the requestHeaderWhitelist
461+
*/
462+
public Set<String> getRequestHeaderWhitelist() {
463+
Properties props = propertiesLoader();
464+
465+
if (props != null) {
466+
Set<String> set = Utils.parseWhiteList(props.getProperty("requestHeaderWhitelist"));
467+
if (set != null)
468+
this.setRequestHeaderWhitelist(Utils.toLowerCaseSet(set));
469+
}
470+
471+
return requestHeaderWhitelist;
472+
}
473+
474+
/**
475+
* @param requestHeaderWhitelist the requestHeaderWhitelist to set
476+
*/
477+
public void setRequestHeaderWhitelist(Set<String> requestHeaderWhitelist) {
478+
this.requestHeaderWhitelist = requestHeaderWhitelist;
479+
}
480+
481+
/**
482+
* @return the requestHeaderBlacklist
483+
*/
484+
public Set<String> getRequestHeaderBlacklist() {
485+
Properties props = propertiesLoader();
486+
487+
if (props != null) {
488+
Set<String> set = Utils.parseWhiteList(props.getProperty("requestHeaderBlacklist"));
489+
if (set != null)
490+
this.setRequestHeaderBlacklist(Utils.toLowerCaseSet(set));
491+
}
492+
493+
return requestHeaderBlacklist;
494+
}
495+
496+
/**
497+
* @param requestHeaderBlacklist the requestHeaderBlacklist to set
498+
*/
499+
public void setRequestHeaderBlacklist(Set<String> requestHeaderBlacklist) {
500+
this.requestHeaderBlacklist = requestHeaderBlacklist;
501+
}
502+
439503
/**
440504
* @return the context
441505
*/

src/main/java/it/geosolutions/httpproxy/Utils.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import java.net.MalformedURLException;
2626
import java.net.URL;
2727
import java.util.HashSet;
28+
import java.util.Objects;
2829
import java.util.Set;
30+
import java.util.stream.Collectors;
2931

3032
/**
3133
* Utility methods.
@@ -150,6 +152,21 @@ static final Set<String> parseWhiteList(String property) {
150152
}
151153
}
152154

155+
/**
156+
* Converts all strings in the given set to lower case.
157+
*
158+
* @param set the input set
159+
* @return a new set with all strings converted to lower case
160+
*/
161+
static Set<String> toLowerCaseSet(Set<String> set) {
162+
if (set == null) {
163+
return null;
164+
}
165+
return set.stream().filter(Objects::nonNull)
166+
.map(String::trim).map(String::toLowerCase)
167+
.collect(Collectors.toSet());
168+
}
169+
153170
static URL buildURL(String value) throws MalformedURLException {
154171
URL url = new URL(value);
155172

src/main/resources/proxy.properties

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ methodsWhitelist = GET,POST,PUT
2222

2323
#hostsWhitelist = 127.0.0.1
2424

25+
# Optional: only forward these request headers (comma-separated, case-insensitive).
26+
# If empty or commented out, all headers are forwarded (except those in the blacklist).
27+
#requestHeaderWhitelist = Accept,Accept-Language,Content-Type,Authorization,Host
28+
29+
# Optional: never forward these request headers (comma-separated, case-insensitive).
30+
# Blacklist takes precedence over whitelist.
31+
#requestHeaderBlacklist = Cookie,X-Custom-Secret
32+
2533
#reqtypeWhitelist.capabilities = (([&]?([Rr][Ee][Qq][Uu][Ee][Ss][Tt]=[Gg]et[Cc]apabilities))|([&]?(version=1\\.1\\.1)))+
2634
reqtypeWhitelist.capabilities = .*[Gg]et[Cc]apabilities.*
2735
reqtypeWhitelist.featureinfo = .*[Gg]et[Ff]eature[Ii]nfo.*

0 commit comments

Comments
 (0)