Skip to content

Commit

Permalink
Make oauth2 compaible with open source presto
Browse files Browse the repository at this point in the history
  • Loading branch information
auden-woolfson committed Jan 27, 2025
1 parent d3514e1 commit e5f7203
Show file tree
Hide file tree
Showing 8 changed files with 129 additions and 47 deletions.
95 changes: 81 additions & 14 deletions presto-main/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,33 @@
</properties>

<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.9.0</version>
<exclusions>
<exclusion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>net.jodah</groupId>
<artifactId>failsafe</artifactId>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
</dependency>

<dependency>
<groupId>com.esri.geometry</groupId>
<artifactId>esri-geometry-api</artifactId>
Expand Down Expand Up @@ -134,6 +161,12 @@
<dependency>
<groupId>com.facebook.airlift</groupId>
<artifactId>http-server</artifactId>
<exclusions>
<exclusion>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
Expand Down Expand Up @@ -357,20 +390,6 @@
<artifactId>jts-core</artifactId>
</dependency>

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
</dependency>

<dependency>
<groupId>org.apache.datasketches</groupId>
<artifactId>datasketches-memory</artifactId>
Expand Down Expand Up @@ -514,6 +533,51 @@
<artifactId>mockwebserver</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.14</version>
</dependency>

<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>oauth2-oidc-sdk</artifactId>
<version>9.18</version>
<exclusions>
<exclusion>
<groupId>org.aw2</groupId>
<artifactId>asm</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down Expand Up @@ -574,6 +638,9 @@
<ignorePackages>
<ignorePackage>com.facebook.presto.testing.assertions</ignorePackage>
</ignorePackages>
<ignoreClassNamePatterns>
<ignoreClassNamePattern>com/facebook/presto/server/MockHttpServletRequest</ignoreClassNamePattern>
</ignoreClassNamePatterns>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import com.facebook.airlift.discovery.client.ServiceAnnouncement;
import com.facebook.airlift.event.client.HttpEventModule;
import com.facebook.airlift.event.client.JsonEventModule;
import com.facebook.airlift.http.server.HttpServerModule;
import com.facebook.airlift.jaxrs.JaxrsModule;
import com.facebook.airlift.jmx.JmxHttpModule;
import com.facebook.airlift.jmx.JmxModule;
Expand Down Expand Up @@ -52,8 +51,8 @@
import com.facebook.presto.security.AccessControlManager;
import com.facebook.presto.security.AccessControlModule;
import com.facebook.presto.server.security.PasswordAuthenticatorManager;
import com.facebook.presto.server.security.SecurityConfig;
import com.facebook.presto.server.security.PrestoAuthenticatorManager;
import com.facebook.presto.server.security.SecurityConfig;
import com.facebook.presto.server.security.ServerSecurityModule;
import com.facebook.presto.server.security.oauth2.OAuth2Client;
import com.facebook.presto.sql.analyzer.FeaturesConfig;
Expand Down Expand Up @@ -151,7 +150,7 @@ public void run()

modules.addAll(getAdditionalModules());

Bootstrap app = new Bootstrap(modules.build());
Bootstrap app = new Bootstrap((Module) modules.build());

try {
Injector injector = app.initialize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import com.facebook.airlift.http.server.AuthenticationException;
import com.facebook.airlift.http.server.Authenticator;
import com.facebook.presto.ClientRequestFilterManager;
import com.facebook.presto.server.security.oauth2.OAuth2Authenticator;
import com.facebook.presto.spi.ClientRequestFilter;
import com.facebook.presto.spi.PrestoException;
import com.facebook.presto.server.security.oauth2.OAuth2Authenticator;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
Expand Down Expand Up @@ -49,10 +49,10 @@
import java.util.Set;
import java.util.stream.Collectors;

import static com.facebook.presto.spi.StandardErrorCode.HEADER_MODIFICATION_ATTEMPT;
import static com.facebook.presto.server.WebUiResource.UI_ENDPOINT;
import static com.facebook.presto.server.security.oauth2.OAuth2CallbackResource.CALLBACK_ENDPOINT;
import static com.facebook.presto.server.security.oauth2.OAuth2TokenExchangeResource.TOKEN_ENDPOINT;
import static com.facebook.presto.spi.StandardErrorCode.HEADER_MODIFICATION_ATTEMPT;
import static com.google.common.io.ByteStreams.copy;
import static com.google.common.io.ByteStreams.nullOutputStream;
import static com.google.common.net.HttpHeaders.WWW_AUTHENTICATE;
Expand All @@ -66,7 +66,7 @@ public class AuthenticationFilter
implements Filter
{
private static final String HTTPS_PROTOCOL = "https";
private final List<Authenticator> authenticators;
private static List<Authenticator> authenticators;
private static boolean allowForwardedHttps;
private final ClientRequestFilterManager clientRequestFilterManager;
private final List<String> headersBlockList = ImmutableList.of("X-Presto-Transaction-Id", "X-Presto-Started-Transaction-Id", "X-Presto-Clear-Transaction-Id", "X-Presto-Trace-Token");
Expand All @@ -86,10 +86,14 @@ public AuthenticationFilter(List<Authenticator> authenticators, SecurityConfig s
}

@Override
public void init(FilterConfig filterConfig) {}
public void init(FilterConfig filterConfig)
{
}

@Override
public void destroy() {}
public void destroy()
{
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain nextFilter)
Expand Down Expand Up @@ -160,6 +164,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
}
}

private boolean isWebUiRequest(HttpServletRequest request)
{
String pathInfo = request.getPathInfo();
return pathInfo == null || pathInfo.equals(UI_ENDPOINT) || pathInfo.startsWith("/ui");
}

public HttpServletRequest mergeExtraHeaders(HttpServletRequest request, Principal principal)
{
List<ClientRequestFilter> clientRequestFilters = clientRequestFilterManager.getClientRequestFilters();
Expand Down Expand Up @@ -218,8 +228,7 @@ private boolean doesRequestSupportAuthentication(HttpServletRequest request)
public static ServletRequest withPrincipal(HttpServletRequest request, Principal principal)
{
requireNonNull(principal, "principal is null");
return new HttpServletRequestWrapper(request)
{
return new HttpServletRequestWrapper(request) {
@Override
public Principal getUserPrincipal()
{
Expand Down Expand Up @@ -284,25 +293,6 @@ public Enumeration<String> getHeaders(String name)
return enumeration(ImmutableList.of(customHeaders.get(name)));
}
return super.getHeaders(name);
}

private boolean doesRequestSupportAuthentication(HttpServletRequest request)
{
if (isPublic(request)) {
return false;
}
if (authenticators.isEmpty()) {
return false;
}
if (request.isSecure()) {
return true;
}
return allowForwardedHttps && Strings.nullToEmpty(request.getHeader(HttpHeaders.X_FORWARDED_PROTO)).equalsIgnoreCase(HTTPS_PROTOCOL);
}

private boolean isWebUiRequest(HttpServletRequest request)
{
String pathInfo = request.getPathInfo();
return pathInfo == null || pathInfo.equals(UI_ENDPOINT) || pathInfo.startsWith("/ui");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.facebook.airlift.http.server.CertificateAuthenticator;
import com.facebook.airlift.http.server.KerberosAuthenticator;
import com.facebook.airlift.http.server.KerberosConfig;
import com.facebook.airlift.http.server.TheServlet;
import com.facebook.presto.server.security.SecurityConfig.AuthenticationType;
import com.facebook.presto.server.security.oauth2.OAuth2AuthenticationSupportModule;
import com.facebook.presto.server.security.oauth2.OAuth2Authenticator;
Expand All @@ -27,15 +28,19 @@
import com.google.inject.Scopes;
import com.google.inject.multibindings.Multibinder;

import javax.servlet.Filter;

import java.util.List;

import static com.facebook.airlift.configuration.ConfigBinder.configBinder;
import static com.facebook.presto.server.security.SecurityConfig.AuthenticationType.CERTIFICATE;
import static com.facebook.presto.server.security.SecurityConfig.AuthenticationType.CUSTOM;
import static com.facebook.presto.server.security.SecurityConfig.AuthenticationType.JWT;
import static com.facebook.presto.server.security.SecurityConfig.AuthenticationType.KERBEROS;
import static com.facebook.presto.server.security.SecurityConfig.AuthenticationType.OAUTH2;
import static com.facebook.presto.server.security.SecurityConfig.AuthenticationType.PASSWORD;
import static com.google.inject.multibindings.Multibinder.newSetBinder;
import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder;

public class ServerSecurityModule
extends AbstractConfigurationAwareModule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
import com.facebook.airlift.http.server.Authenticator;
import com.facebook.presto.server.MockHttpServletRequest;
import com.facebook.presto.server.security.AuthenticationFilter;
import com.facebook.presto.server.security.DefaultWebUiAuthenticationManager;
import com.facebook.presto.server.security.SecurityConfig;
import com.facebook.presto.server.security.WebUiAuthenticationManager;
import com.facebook.presto.server.testing.TestingPrestoServer;
import com.facebook.presto.spi.ClientRequestFilter;
import com.facebook.presto.spi.ClientRequestFilterFactory;
Expand All @@ -38,6 +40,8 @@

public class TestClientRequestFilterPlugin
{
private final WebUiAuthenticationManager webUiAuthenticationManager = new DefaultWebUiAuthenticationManager();

@Test
public void testCustomRequestFilterWithHeaders() throws Exception
{
Expand Down Expand Up @@ -112,7 +116,7 @@ private AuthenticationFilter setupAuthenticationFilter(List<ClientRequestFilterF
List<Authenticator> authenticators = createAuthenticators();
SecurityConfig securityConfig = createSecurityConfig();

return new AuthenticationFilter(authenticators, securityConfig, clientRequestFilterManager);
return new AuthenticationFilter(authenticators, securityConfig, webUiAuthenticationManager, clientRequestFilterManager);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public class MockHttpServletRequest
private final ListMultimap<String, String> headers;
private final String remoteAddress;
private final Map<String, Object> attributes;
private final String requestUrl;

public MockHttpServletRequest(ListMultimap<String, String> headers, String remoteAddress, Map<String, Object> attributes)
{
Expand All @@ -67,10 +68,11 @@ public MockHttpServletRequest(ListMultimap<String, String> headers)
this(headers, DEFAULT_ADDRESS, ImmutableMap.of());
}

public MockHttpServletRequest(ListMultimap<String, String> headers, String remoteAddress, String requestUrl)
public MockHttpServletRequest(ListMultimap<String, String> headers, String remoteAddress, String requestUrl, Map<String, Object> attributes)
{
this.headers = ImmutableListMultimap.copyOf(requireNonNull(headers, "headers is null"));
this.remoteAddress = requireNonNull(remoteAddress, "remoteAddress is null");
this.attributes = attributes;
this.requestUrl = requireNonNull(requestUrl, "requestUrl is null");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import com.facebook.presto.server.MockHttpServletRequest;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import org.testng.annotations.Test;

import javax.servlet.http.HttpServletRequest;
Expand All @@ -33,7 +34,8 @@ public void testGetSchemeUriBuilderNoProtoHeader()
ImmutableListMultimap.<String, String>builder()
.build(),
"testRemote",
"http://www.example.com");
"http://www.example.com",
ImmutableMap.of());

UriBuilder builder = getSchemeUriBuilder(request);
assertEquals(builder.build().getScheme(), "http");
Expand All @@ -47,7 +49,8 @@ public void testGetSchemeUriBuilderProtoHeader()
.put(X_FORWARDED_PROTO, "https")
.build(),
"testRemote",
"http://www.example.com");
"http://www.example.com",
ImmutableMap.of());

UriBuilder builder = getSchemeUriBuilder(request);
assertEquals(builder.build().getScheme(), "https");
Expand Down
12 changes: 12 additions & 0 deletions presto-native-execution/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-main</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
Expand All @@ -68,6 +74,12 @@
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-tests</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
Expand Down

0 comments on commit e5f7203

Please sign in to comment.