From b824619289403ff53f6950a25580c213061bd17b Mon Sep 17 00:00:00 2001 From: Rishabh Goyal Date: Mon, 30 Jan 2017 12:35:24 +0530 Subject: [PATCH 1/4] Only sending ascii characters for maxmind headers --- pom.xml | 2 +- .../geoip2/provider/MaxMindInfoProvider.java | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 6328a7e..ee71dc5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.dropwizard dropwizard-maxmind - 1.0.5-1 + 1.0.5-2 jar dropwizard-maxmind diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java index 2cdf877..ab43c1e 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java @@ -60,16 +60,16 @@ public MaxMindInfo provide() { final HttpServletRequest request = context.getResource(HttpServletRequest.class); final String anonymousIp = request.getHeader(MaxMindHeaders.X_ANONYMOUS_IP); final String anonymousVpn = request.getHeader(MaxMindHeaders.X_ANONYMOUS_VPN); - final String tor = request.getHeader(MaxMindHeaders.X_TOR); - final String city = request.getHeader(MaxMindHeaders.X_CITY); - final String state = request.getHeader(MaxMindHeaders.X_STATE); - final String stateIso = request.getHeader(MaxMindHeaders.X_STATE_ISO); - final String postal = request.getHeader(MaxMindHeaders.X_POSTAL); - final String connectionType = request.getHeader(MaxMindHeaders.X_CONNECTION_TYPE); - final String userType = request.getHeader(MaxMindHeaders.X_USER_TYPE); - final String country = request.getHeader(MaxMindHeaders.X_COUNTRY); - final String countryIso = request.getHeader(MaxMindHeaders.X_COUNTRY_ISO); - final String isp = request.getHeader(MaxMindHeaders.X_ISP); + final String tor = toAscii(request.getHeader(MaxMindHeaders.X_TOR)); + final String city = toAscii(request.getHeader(MaxMindHeaders.X_CITY)); + final String state = toAscii(request.getHeader(MaxMindHeaders.X_STATE)); + final String stateIso = toAscii(request.getHeader(MaxMindHeaders.X_STATE_ISO)); + final String postal = toAscii(request.getHeader(MaxMindHeaders.X_POSTAL)); + final String connectionType = toAscii(request.getHeader(MaxMindHeaders.X_CONNECTION_TYPE)); + final String userType = toAscii(request.getHeader(MaxMindHeaders.X_USER_TYPE)); + final String country = toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY)); + final String countryIso = toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY_ISO)); + final String isp = toAscii(request.getHeader(MaxMindHeaders.X_ISP)); final String latitude = request.getHeader(MaxMindHeaders.X_LATITUDE); final String longitude = request.getHeader(MaxMindHeaders.X_LONGITUDE); final String accuracy = request.getHeader(MaxMindHeaders.X_LOCATION_ACCURACY); @@ -108,4 +108,12 @@ protected AbstractContainerRequestValueFactory createValueFactory(Parameter p } return new MaxMinfInfoParamValueFactory(); } + + private static String toAscii(String s) { + if (s == null || s.isEmpty()) { + return s; + } + return s.replaceAll("[^\\x20-\\x7e]", ""); + } + } From 79f23ded4fbee4e349aa20af23de1af19f0ba3f2 Mon Sep 17 00:00:00 2001 From: Rishabh Goyal Date: Mon, 30 Jan 2017 12:44:35 +0530 Subject: [PATCH 2/4] Added test cases for conversion to ascii characters --- .../dropwizard/maxmind/geoip2/Characters.java | 12 ++++++++ .../geoip2/provider/MaxMindInfoProvider.java | 28 ++++++++----------- .../maxmind/geoip2/CharactersTest.java | 25 +++++++++++++++++ 3 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 src/main/java/io/dropwizard/maxmind/geoip2/Characters.java create mode 100644 src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/Characters.java b/src/main/java/io/dropwizard/maxmind/geoip2/Characters.java new file mode 100644 index 0000000..d7c1923 --- /dev/null +++ b/src/main/java/io/dropwizard/maxmind/geoip2/Characters.java @@ -0,0 +1,12 @@ +package io.dropwizard.maxmind.geoip2; + +public class Characters { + + public static String toAscii(String s) { + if (s == null || s.isEmpty()) { + return s; + } + return s.replaceAll("[^\\x20-\\x7e]", ""); + } + +} diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java index ab43c1e..20fde04 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java @@ -18,6 +18,7 @@ package io.dropwizard.maxmind.geoip2.provider; import com.google.common.base.Strings; +import io.dropwizard.maxmind.geoip2.Characters; import io.dropwizard.maxmind.geoip2.core.MaxMindHeaders; import io.dropwizard.maxmind.geoip2.core.MaxMindInfo; import lombok.extern.slf4j.Slf4j; @@ -60,16 +61,16 @@ public MaxMindInfo provide() { final HttpServletRequest request = context.getResource(HttpServletRequest.class); final String anonymousIp = request.getHeader(MaxMindHeaders.X_ANONYMOUS_IP); final String anonymousVpn = request.getHeader(MaxMindHeaders.X_ANONYMOUS_VPN); - final String tor = toAscii(request.getHeader(MaxMindHeaders.X_TOR)); - final String city = toAscii(request.getHeader(MaxMindHeaders.X_CITY)); - final String state = toAscii(request.getHeader(MaxMindHeaders.X_STATE)); - final String stateIso = toAscii(request.getHeader(MaxMindHeaders.X_STATE_ISO)); - final String postal = toAscii(request.getHeader(MaxMindHeaders.X_POSTAL)); - final String connectionType = toAscii(request.getHeader(MaxMindHeaders.X_CONNECTION_TYPE)); - final String userType = toAscii(request.getHeader(MaxMindHeaders.X_USER_TYPE)); - final String country = toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY)); - final String countryIso = toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY_ISO)); - final String isp = toAscii(request.getHeader(MaxMindHeaders.X_ISP)); + final String tor = Characters.toAscii(request.getHeader(MaxMindHeaders.X_TOR)); + final String city = Characters.toAscii(request.getHeader(MaxMindHeaders.X_CITY)); + final String state = Characters.toAscii(request.getHeader(MaxMindHeaders.X_STATE)); + final String stateIso = Characters.toAscii(request.getHeader(MaxMindHeaders.X_STATE_ISO)); + final String postal = Characters.toAscii(request.getHeader(MaxMindHeaders.X_POSTAL)); + final String connectionType = Characters.toAscii(request.getHeader(MaxMindHeaders.X_CONNECTION_TYPE)); + final String userType = Characters.toAscii(request.getHeader(MaxMindHeaders.X_USER_TYPE)); + final String country = Characters.toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY)); + final String countryIso = Characters.toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY_ISO)); + final String isp = Characters.toAscii(request.getHeader(MaxMindHeaders.X_ISP)); final String latitude = request.getHeader(MaxMindHeaders.X_LATITUDE); final String longitude = request.getHeader(MaxMindHeaders.X_LONGITUDE); final String accuracy = request.getHeader(MaxMindHeaders.X_LOCATION_ACCURACY); @@ -109,11 +110,4 @@ protected AbstractContainerRequestValueFactory createValueFactory(Parameter p return new MaxMinfInfoParamValueFactory(); } - private static String toAscii(String s) { - if (s == null || s.isEmpty()) { - return s; - } - return s.replaceAll("[^\\x20-\\x7e]", ""); - } - } diff --git a/src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java b/src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java new file mode 100644 index 0000000..7b473ca --- /dev/null +++ b/src/test/java/io/dropwizard/maxmind/geoip2/CharactersTest.java @@ -0,0 +1,25 @@ +package io.dropwizard.maxmind.geoip2; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class CharactersTest { + + @Test + public void testAsciiOnlyAsciiString(){ + String s = "example abcd"; + assertEquals(s, Characters.toAscii(s)); + } + + @Test + public void testAsciiNullString(){ + assertEquals(null, Characters.toAscii(null)); + } + + @Test + public void testAsciiWithNonAsciiCharacters(){ + assertEquals("orpsd", Characters.toAscii("orčpžsíáýd")); + } + +} \ No newline at end of file From 1c0739633bf406ecd647870f812557b25be0f398 Mon Sep 17 00:00:00 2001 From: Rishabh Goyal Date: Mon, 30 Jan 2017 13:02:17 +0530 Subject: [PATCH 3/4] Corrected header conversion to ascii --- .../filter/MaxMindGeoIpRequestFilter.java | 28 +++++++++++++------ .../geoip2/provider/MaxMindInfoProvider.java | 20 ++++++------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java b/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java index 286827a..56f7aab 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/filter/MaxMindGeoIpRequestFilter.java @@ -28,6 +28,7 @@ import com.maxmind.geoip2.model.CountryResponse; import com.maxmind.geoip2.model.EnterpriseResponse; import com.maxmind.geoip2.record.*; +import io.dropwizard.maxmind.geoip2.Characters; import io.dropwizard.maxmind.geoip2.config.MaxMindConfig; import io.dropwizard.maxmind.geoip2.core.MaxMindHeaders; import lombok.extern.slf4j.Slf4j; @@ -175,26 +176,32 @@ public void filter(final ContainerRequestContext containerRequestContext) throws private void addCountryInfo(Country country, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(country.getName())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY, country.getName()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY, + Characters.toAscii(country.getName())); if (!Strings.isNullOrEmpty(country.getIsoCode())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY_ISO, country.getIsoCode()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_COUNTRY_ISO, + Characters.toAscii(country.getIsoCode())); } private void addStateInfo(Subdivision subdivision, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(subdivision.getName())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE, subdivision.getName()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE, + Characters.toAscii(subdivision.getName())); if (!Strings.isNullOrEmpty(subdivision.getIsoCode())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE_ISO, subdivision.getIsoCode()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_STATE_ISO, + Characters.toAscii(subdivision.getIsoCode())); } private void addCityInfo(City city, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(city.getName())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CITY, city.getName()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CITY, + Characters.toAscii(city.getName())); } private void addPostalInfo(Postal postal, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(postal.getCode())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_POSTAL, postal.getCode()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_POSTAL, + Characters.toAscii(postal.getCode())); } private void addLocationInfo(Location location, final ContainerRequestContext containerRequestContext) { @@ -208,11 +215,14 @@ private void addLocationInfo(Location location, final ContainerRequestContext co private void addTraitsInfo(Traits traits, final ContainerRequestContext containerRequestContext) { if (!Strings.isNullOrEmpty(traits.getUserType())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_USER_TYPE, traits.getUserType()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_USER_TYPE, + Characters.toAscii(traits.getUserType())); if (!Strings.isNullOrEmpty(traits.getIsp())) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_ISP, traits.getIsp()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_ISP, + Characters.toAscii(traits.getIsp())); if (traits.getConnectionType() != null) - containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CONNECTION_TYPE, traits.getConnectionType().name()); + containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_CONNECTION_TYPE, + Characters.toAscii(traits.getConnectionType().name())); containerRequestContext.getHeaders().putSingle(MaxMindHeaders.X_PROXY_LEGAL, String.valueOf(traits.isLegitimateProxy())); } diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java index 20fde04..46d6bdb 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java @@ -61,16 +61,16 @@ public MaxMindInfo provide() { final HttpServletRequest request = context.getResource(HttpServletRequest.class); final String anonymousIp = request.getHeader(MaxMindHeaders.X_ANONYMOUS_IP); final String anonymousVpn = request.getHeader(MaxMindHeaders.X_ANONYMOUS_VPN); - final String tor = Characters.toAscii(request.getHeader(MaxMindHeaders.X_TOR)); - final String city = Characters.toAscii(request.getHeader(MaxMindHeaders.X_CITY)); - final String state = Characters.toAscii(request.getHeader(MaxMindHeaders.X_STATE)); - final String stateIso = Characters.toAscii(request.getHeader(MaxMindHeaders.X_STATE_ISO)); - final String postal = Characters.toAscii(request.getHeader(MaxMindHeaders.X_POSTAL)); - final String connectionType = Characters.toAscii(request.getHeader(MaxMindHeaders.X_CONNECTION_TYPE)); - final String userType = Characters.toAscii(request.getHeader(MaxMindHeaders.X_USER_TYPE)); - final String country = Characters.toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY)); - final String countryIso = Characters.toAscii(request.getHeader(MaxMindHeaders.X_COUNTRY_ISO)); - final String isp = Characters.toAscii(request.getHeader(MaxMindHeaders.X_ISP)); + final String tor = request.getHeader(MaxMindHeaders.X_TOR); + final String city = request.getHeader(MaxMindHeaders.X_CITY); + final String state = request.getHeader(MaxMindHeaders.X_STATE); + final String stateIso = request.getHeader(MaxMindHeaders.X_STATE_ISO); + final String postal = request.getHeader(MaxMindHeaders.X_POSTAL); + final String connectionType = request.getHeader(MaxMindHeaders.X_CONNECTION_TYPE); + final String userType = request.getHeader(MaxMindHeaders.X_USER_TYPE); + final String country = request.getHeader(MaxMindHeaders.X_COUNTRY); + final String countryIso = request.getHeader(MaxMindHeaders.X_COUNTRY_ISO); + final String isp = request.getHeader(MaxMindHeaders.X_ISP); final String latitude = request.getHeader(MaxMindHeaders.X_LATITUDE); final String longitude = request.getHeader(MaxMindHeaders.X_LONGITUDE); final String accuracy = request.getHeader(MaxMindHeaders.X_LOCATION_ACCURACY); From c2d38bf887420dc59f55d82fd7904b7674bb8c6b Mon Sep 17 00:00:00 2001 From: Rishabh Goyal Date: Mon, 30 Jan 2017 13:03:29 +0530 Subject: [PATCH 4/4] Removed unused imports --- .../dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java index 46d6bdb..2cdf877 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java @@ -18,7 +18,6 @@ package io.dropwizard.maxmind.geoip2.provider; import com.google.common.base.Strings; -import io.dropwizard.maxmind.geoip2.Characters; import io.dropwizard.maxmind.geoip2.core.MaxMindHeaders; import io.dropwizard.maxmind.geoip2.core.MaxMindInfo; import lombok.extern.slf4j.Slf4j; @@ -109,5 +108,4 @@ protected AbstractContainerRequestValueFactory createValueFactory(Parameter p } return new MaxMinfInfoParamValueFactory(); } - }