From 8f6d80e4976d69f4ad95dbdb3937bc2674479c01 Mon Sep 17 00:00:00 2001 From: Aman Sai Ankam Date: Mon, 21 Dec 2020 14:13:36 +0530 Subject: [PATCH 1/2] changed provider impl --- config.yml | 8 ++ pom.xml | 10 +- .../maxmind/geoip2/MaxMindBundle.java | 22 ++--- .../geoip2/feature/MaxMindContextFeature.java | 24 +++++ ... => MaxMindContextValueParamProvider.java} | 96 ++++++++++--------- 5 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 config.yml create mode 100644 src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java rename src/main/java/io/dropwizard/maxmind/geoip2/provider/{MaxMindInfoProvider.java => MaxMindContextValueParamProvider.java} (53%) diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..dc85cd5 --- /dev/null +++ b/config.yml @@ -0,0 +1,8 @@ +maxmind: + databaseFilePath: /path/to/maxmind/database/file.mmdb + remoteIpHeader: "CLIENT-IP" #default is X-FORWARDED-FOR (when used behind a loadbalancer) + cacheTTL: 120 #In seconds, Default is 300 seconds + cacheMaxEntries: 102400 #Default is 10240 + enterprise: true #default: false. Enable maxmind enterprise database mode + type: anonymous #If it is not a enterprise database; set the type of database that is being used. Supported: country, city, anonymous + maxMindContext: false #If you need MaxMindInfo injection into resource methods; set it to true \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8140dbd..cb9865a 100644 --- a/pom.xml +++ b/pom.xml @@ -44,10 +44,10 @@ UTF-8 - 1.3.13 + 2.0.16 2.12.0 1.18.8 - 4.12 + 5.7.0 1.8 1.8 @@ -83,11 +83,13 @@ ${lombok.version} provided + - junit - junit + org.junit.jupiter + junit-jupiter-api ${junit.version} test + diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java b/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java index 8cf5cf6..ad08009 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java @@ -18,21 +18,27 @@ import io.dropwizard.Configuration; import io.dropwizard.ConfiguredBundle; import io.dropwizard.maxmind.geoip2.config.MaxMindConfig; +import io.dropwizard.maxmind.geoip2.core.MaxMindInfo; +import io.dropwizard.maxmind.geoip2.feature.MaxMindContextFeature; import io.dropwizard.maxmind.geoip2.filter.MaxMindGeoIpRequestFilter; import io.dropwizard.maxmind.geoip2.provider.MaxMindContext; -import io.dropwizard.maxmind.geoip2.provider.MaxMindInfoProvider; +import io.dropwizard.maxmind.geoip2.provider.MaxMindContextValueParamProvider; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; +import lombok.extern.slf4j.Slf4j; import org.glassfish.hk2.api.InjectionResolver; import org.glassfish.hk2.api.TypeLiteral; -import org.glassfish.hk2.utilities.binding.AbstractBinder; -import org.glassfish.jersey.server.spi.internal.ValueFactoryProvider; + +import org.glassfish.jersey.internal.inject.AbstractBinder; +import org.glassfish.jersey.process.internal.RequestScoped; +import org.glassfish.jersey.server.spi.internal.ValueParamProvider; import javax.inject.Singleton; /** * @author phaneesh */ +@Slf4j public abstract class MaxMindBundle implements ConfiguredBundle { public abstract MaxMindConfig getMaxMindConfig(final T configuration); @@ -47,14 +53,8 @@ public void run(final T configuration, final Environment environment) { MaxMindConfig maxMindConfig = getMaxMindConfig(configuration); environment.jersey().register(new MaxMindGeoIpRequestFilter(maxMindConfig)); if(maxMindConfig.isMaxMindContext()) { - environment.jersey().register(new AbstractBinder() { - @Override - protected void configure() { - bind(MaxMindInfoProvider.class).to(ValueFactoryProvider.class).in(Singleton.class); - bind(MaxMindInfoProvider.InjectResolver.class).to( - new TypeLiteral>() {}).in(Singleton.class); - } - }); + log.info("binding maxmind"); + environment.jersey().register(MaxMindContextFeature.class); } } } diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java b/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java new file mode 100644 index 0000000..bee9fe9 --- /dev/null +++ b/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java @@ -0,0 +1,24 @@ +package io.dropwizard.maxmind.geoip2.feature; + +import io.dropwizard.maxmind.geoip2.provider.MaxMindContextValueParamProvider; +import org.glassfish.jersey.internal.inject.AbstractBinder; +import org.glassfish.jersey.server.spi.internal.ValueParamProvider; + +import javax.inject.Singleton; +import javax.ws.rs.core.Feature; +import javax.ws.rs.core.FeatureContext; + +public class MaxMindContextFeature implements Feature { + @Override + public boolean configure(FeatureContext context) { + context.register(new AbstractBinder() { + @Override + protected void configure() { + bind(MaxMindContextValueParamProvider.class) + .to(ValueParamProvider.class); + } + }); + + return true; + } +} diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java similarity index 53% rename from src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java rename to src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java index 2cdf877..e12e875 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindInfoProvider.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java @@ -21,19 +21,24 @@ import io.dropwizard.maxmind.geoip2.core.MaxMindHeaders; import io.dropwizard.maxmind.geoip2.core.MaxMindInfo; import lombok.extern.slf4j.Slf4j; -import org.glassfish.hk2.api.ServiceLocator; -import org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory; -import org.glassfish.jersey.server.internal.inject.AbstractValueFactoryProvider; +import org.glassfish.hk2.api.*; +import org.glassfish.jersey.server.ContainerRequest; import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider; -import org.glassfish.jersey.server.internal.inject.ParamInjectionResolver; import org.glassfish.jersey.server.model.Parameter; +import org.glassfish.jersey.server.spi.internal.ValueParamProvider; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.container.ResourceContext; import javax.ws.rs.core.Context; import javax.ws.rs.ext.Provider; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; /** * @author phaneesh @@ -41,38 +46,41 @@ @Slf4j @Singleton @Provider -public class MaxMindInfoProvider extends AbstractValueFactoryProvider { +public class MaxMindContextValueParamProvider implements ValueParamProvider { - - public static final class InjectResolver extends ParamInjectionResolver { - - public InjectResolver() { - super(MaxMindInfoProvider.class); + @Override + public Function getValueProvider(Parameter parameter) { + if (parameter.getRawType().equals(MaxMindInfo.class) + && parameter.isAnnotationPresent(MaxMindContext.class)) { + return new MaxMindInfoParamProvider(); } + log.info("class and annotation not compatible"); + return null; } + public static final class MaxMindInfoParamProvider implements Function { - private static final class MaxMinfInfoParamValueFactory extends AbstractContainerRequestValueFactory { - - @Context - private ResourceContext context; - - 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 latitude = request.getHeader(MaxMindHeaders.X_LATITUDE); - final String longitude = request.getHeader(MaxMindHeaders.X_LONGITUDE); - final String accuracy = request.getHeader(MaxMindHeaders.X_LOCATION_ACCURACY); + @Override + public MaxMindInfo apply(@Context ContainerRequest request) { + //final HttpServletRequest request = context.getResource(HttpServletRequest.class); + log.info("container request = {}",request); + if (request.equals(null)){ + log.info("request is null"); + } + final String anonymousIp = getHeader(request,MaxMindHeaders.X_ANONYMOUS_IP); + final String anonymousVpn = getHeader(request,MaxMindHeaders.X_ANONYMOUS_VPN); + final String tor = getHeader(request,MaxMindHeaders.X_TOR); + final String city = getHeader(request,MaxMindHeaders.X_CITY); + final String state = getHeader(request,MaxMindHeaders.X_STATE); + final String stateIso = getHeader(request,MaxMindHeaders.X_STATE_ISO); + final String postal = getHeader(request,MaxMindHeaders.X_POSTAL); + final String connectionType = getHeader(request,MaxMindHeaders.X_CONNECTION_TYPE); + final String userType = getHeader(request,MaxMindHeaders.X_USER_TYPE); + final String country = getHeader(request,MaxMindHeaders.X_COUNTRY); + final String countryIso = getHeader(request,MaxMindHeaders.X_COUNTRY_ISO); + final String isp = getHeader(request,MaxMindHeaders.X_ISP); + final String latitude = getHeader(request,MaxMindHeaders.X_LATITUDE); + final String longitude = getHeader(request,MaxMindHeaders.X_LONGITUDE); + final String accuracy = getHeader(request,MaxMindHeaders.X_LOCATION_ACCURACY); return MaxMindInfo.builder() .anonymousIp(Strings.isNullOrEmpty(anonymousIp) ? false : Boolean.valueOf(anonymousIp)) .anonymousVpn(Strings.isNullOrEmpty(anonymousVpn) ? false : Boolean.valueOf(anonymousVpn)) @@ -91,21 +99,17 @@ public MaxMindInfo provide() { .accuracy(Strings.isNullOrEmpty(accuracy) ? 0 : Integer.valueOf(accuracy)) .build(); } + private String getHeader(ContainerRequest request,String name) { + List headerList = request.getRequestHeader(name); + return Optional.ofNullable(headerList) + .map(Collection::stream) + .orElseGet(Stream::empty) + .findFirst() + .orElse(null); + } } - - @Inject - public MaxMindInfoProvider(MultivaluedParameterExtractorProvider extractorProvider, ServiceLocator locator) { - super(extractorProvider, locator, Parameter.Source.UNKNOWN); - } - @Override - protected AbstractContainerRequestValueFactory createValueFactory(Parameter parameter) { - Class classType = parameter.getRawType(); - - if (classType == null || (!classType.equals(MaxMindInfo.class))) { - log.warn("MaxMindContext annotation was not placed on correct object type; Injection might not work correctly!"); - return null; - } - return new MaxMinfInfoParamValueFactory(); + public PriorityType getPriority() { + return Priority.HIGH; } } From acd9e2049d688c013f073cb5986d2351ad8472f1 Mon Sep 17 00:00:00 2001 From: Aman Sai Ankam Date: Mon, 21 Dec 2020 18:29:32 +0530 Subject: [PATCH 2/2] removed unnecessary imports --- .../io/dropwizard/maxmind/geoip2/MaxMindBundle.java | 11 ----------- .../geoip2/feature/MaxMindContextFeature.java | 2 -- .../provider/MaxMindContextValueParamProvider.java | 13 +------------ 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java b/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java index ad08009..f118b92 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/MaxMindBundle.java @@ -18,22 +18,12 @@ import io.dropwizard.Configuration; import io.dropwizard.ConfiguredBundle; import io.dropwizard.maxmind.geoip2.config.MaxMindConfig; -import io.dropwizard.maxmind.geoip2.core.MaxMindInfo; import io.dropwizard.maxmind.geoip2.feature.MaxMindContextFeature; import io.dropwizard.maxmind.geoip2.filter.MaxMindGeoIpRequestFilter; -import io.dropwizard.maxmind.geoip2.provider.MaxMindContext; -import io.dropwizard.maxmind.geoip2.provider.MaxMindContextValueParamProvider; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import lombok.extern.slf4j.Slf4j; -import org.glassfish.hk2.api.InjectionResolver; -import org.glassfish.hk2.api.TypeLiteral; -import org.glassfish.jersey.internal.inject.AbstractBinder; -import org.glassfish.jersey.process.internal.RequestScoped; -import org.glassfish.jersey.server.spi.internal.ValueParamProvider; - -import javax.inject.Singleton; /** * @author phaneesh @@ -53,7 +43,6 @@ public void run(final T configuration, final Environment environment) { MaxMindConfig maxMindConfig = getMaxMindConfig(configuration); environment.jersey().register(new MaxMindGeoIpRequestFilter(maxMindConfig)); if(maxMindConfig.isMaxMindContext()) { - log.info("binding maxmind"); environment.jersey().register(MaxMindContextFeature.class); } } diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java b/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java index bee9fe9..85b5016 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/feature/MaxMindContextFeature.java @@ -3,8 +3,6 @@ import io.dropwizard.maxmind.geoip2.provider.MaxMindContextValueParamProvider; import org.glassfish.jersey.internal.inject.AbstractBinder; import org.glassfish.jersey.server.spi.internal.ValueParamProvider; - -import javax.inject.Singleton; import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; diff --git a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java index e12e875..0ba9554 100644 --- a/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java +++ b/src/main/java/io/dropwizard/maxmind/geoip2/provider/MaxMindContextValueParamProvider.java @@ -21,17 +21,12 @@ import io.dropwizard.maxmind.geoip2.core.MaxMindHeaders; import io.dropwizard.maxmind.geoip2.core.MaxMindInfo; import lombok.extern.slf4j.Slf4j; -import org.glassfish.hk2.api.*; import org.glassfish.jersey.server.ContainerRequest; -import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider; import org.glassfish.jersey.server.model.Parameter; import org.glassfish.jersey.server.spi.internal.ValueParamProvider; -import javax.inject.Inject; -import javax.inject.Named; + import javax.inject.Singleton; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ResourceContext; import javax.ws.rs.core.Context; import javax.ws.rs.ext.Provider; import java.util.Collection; @@ -54,18 +49,12 @@ public class MaxMindContextValueParamProvider implements ValueParamProvider { && parameter.isAnnotationPresent(MaxMindContext.class)) { return new MaxMindInfoParamProvider(); } - log.info("class and annotation not compatible"); return null; } public static final class MaxMindInfoParamProvider implements Function { @Override public MaxMindInfo apply(@Context ContainerRequest request) { - //final HttpServletRequest request = context.getResource(HttpServletRequest.class); - log.info("container request = {}",request); - if (request.equals(null)){ - log.info("request is null"); - } final String anonymousIp = getHeader(request,MaxMindHeaders.X_ANONYMOUS_IP); final String anonymousVpn = getHeader(request,MaxMindHeaders.X_ANONYMOUS_VPN); final String tor = getHeader(request,MaxMindHeaders.X_TOR);