diff --git a/client/trino-cli/src/main/java/io/trino/cli/ClientOptions.java b/client/trino-cli/src/main/java/io/trino/cli/ClientOptions.java index dfac2b4dbf65..e2d75d8cfc92 100644 --- a/client/trino-cli/src/main/java/io/trino/cli/ClientOptions.java +++ b/client/trino-cli/src/main/java/io/trino/cli/ClientOptions.java @@ -215,7 +215,7 @@ public ClientSession toClientSession() { return new ClientSession( parseServer(server), - user.orElse(null), + user, sessionUser, source, Optional.ofNullable(traceToken), diff --git a/client/trino-cli/src/test/java/io/trino/cli/TestQueryRunner.java b/client/trino-cli/src/test/java/io/trino/cli/TestQueryRunner.java index 63e74490c796..f27e53a22d4e 100644 --- a/client/trino-cli/src/test/java/io/trino/cli/TestQueryRunner.java +++ b/client/trino-cli/src/test/java/io/trino/cli/TestQueryRunner.java @@ -104,7 +104,7 @@ static ClientSession createClientSession(MockWebServer server) { return new ClientSession( server.url("/").uri(), - "user", + Optional.of("user"), Optional.empty(), "source", Optional.empty(), diff --git a/client/trino-client/src/main/java/io/trino/client/ClientSession.java b/client/trino-client/src/main/java/io/trino/client/ClientSession.java index abde5c863d1a..06819da0ef35 100644 --- a/client/trino-client/src/main/java/io/trino/client/ClientSession.java +++ b/client/trino-client/src/main/java/io/trino/client/ClientSession.java @@ -34,7 +34,7 @@ public class ClientSession { private final URI server; - private final String principal; + private final Optional principal; private final Optional user; private final String source; private final Optional traceToken; @@ -68,7 +68,7 @@ public static ClientSession stripTransactionId(ClientSession session) public ClientSession( URI server, - String principal, + Optional principal, Optional user, String source, Optional traceToken, @@ -143,7 +143,7 @@ public URI getServer() return server; } - public String getPrincipal() + public Optional getPrincipal() { return principal; } @@ -270,7 +270,7 @@ public String toString() public static final class Builder { private URI server; - private String principal; + private Optional principal; private Optional user; private String source; private Optional traceToken; diff --git a/client/trino-client/src/main/java/io/trino/client/StatementClientV1.java b/client/trino-client/src/main/java/io/trino/client/StatementClientV1.java index a724cc1492d2..f9f6c0e86f26 100644 --- a/client/trino-client/src/main/java/io/trino/client/StatementClientV1.java +++ b/client/trino-client/src/main/java/io/trino/client/StatementClientV1.java @@ -43,6 +43,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Stream; import static com.google.common.base.MoreObjects.firstNonNull; import static com.google.common.base.Preconditions.checkState; @@ -84,7 +85,7 @@ class StatementClientV1 private final AtomicBoolean clearTransactionId = new AtomicBoolean(); private final ZoneId timeZone; private final Duration requestTimeoutNanos; - private final String user; + private final Optional user; private final String clientCapabilities; private final boolean compressionDisabled; @@ -100,7 +101,10 @@ public StatementClientV1(OkHttpClient httpClient, ClientSession session, String this.timeZone = session.getTimeZone(); this.query = query; this.requestTimeoutNanos = session.getClientRequestTimeout(); - this.user = session.getUser().orElse(session.getPrincipal()); + this.user = Stream.of(session.getUser(), session.getPrincipal()) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); this.clientCapabilities = Joiner.on(",").join(ClientCapabilities.values()); this.compressionDisabled = session.isCompressionDisabled(); @@ -310,9 +314,9 @@ public boolean isClearTransactionId() private Request.Builder prepareRequest(HttpUrl url) { Request.Builder builder = new Request.Builder() - .addHeader(TRINO_HEADERS.requestUser(), user) .addHeader(USER_AGENT, USER_AGENT_VALUE) .url(url); + user.ifPresent(requestUser -> builder.addHeader(TRINO_HEADERS.requestUser(), requestUser)); if (compressionDisabled) { builder.header(ACCEPT_ENCODING, "identity"); } diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java index 49416683452e..1fd234f7340f 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java @@ -161,7 +161,7 @@ private static class User { public User() { - super("user", REQUIRED, ALLOWED, NON_EMPTY_STRING_CONVERTER); + super("user", NOT_REQUIRED, ALLOWED, NON_EMPTY_STRING_CONVERTER); } } diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java index b0e61088dcd4..0cf2b9b27be3 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java @@ -93,7 +93,7 @@ public class TrinoConnection private final URI jdbcUri; private final URI httpUri; - private final String user; + private final Optional user; private final Optional sessionUser; private final boolean compressionDisabled; private final boolean assumeLiteralNamesInMetadataCallsForNonConformingClients; @@ -680,11 +680,6 @@ URI getURI() return jdbcUri; } - String getUser() - { - return user; - } - @VisibleForTesting Map getExtraCredentials() { diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDatabaseMetaData.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDatabaseMetaData.java index 61d8eb66071f..66c065a6021d 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDatabaseMetaData.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDatabaseMetaData.java @@ -83,7 +83,10 @@ public String getURL() public String getUserName() throws SQLException { - return connection.getUser(); + try (ResultSet rs = select("SELECT current_user")) { + rs.next(); + return rs.getString(1); + } } @Override diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java index 24756473dcce..6d90e5b2e4fd 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java @@ -167,12 +167,18 @@ public URI getHttpUri() return buildHttpUri(); } - public String getUser() + public String getRequiredUser() throws SQLException { return USER.getRequiredValue(properties); } + public Optional getUser() + throws SQLException + { + return USER.getValue(properties); + } + public Optional getSessionUser() throws SQLException { @@ -258,7 +264,7 @@ public void setupClient(OkHttpClient.Builder builder) if (!useSecureConnection) { throw new SQLException("Authentication using username/password requires SSL to be enabled"); } - builder.addInterceptor(basicAuth(getUser(), password)); + builder.addInterceptor(basicAuth(getRequiredUser(), password)); } if (useSecureConnection) { diff --git a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcExternalAuthentication.java b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcExternalAuthentication.java index d6fc9e94da78..3b984cad6b81 100644 --- a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcExternalAuthentication.java +++ b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestJdbcExternalAuthentication.java @@ -242,7 +242,6 @@ private Connection createConnection() { String url = format("jdbc:trino://localhost:%s", server.getHttpsAddress().getPort()); Properties properties = new Properties(); - properties.setProperty("user", "test"); properties.setProperty("SSL", "true"); properties.setProperty("SSLTrustStorePath", new File(getResource("localhost.truststore").toURI()).getPath()); properties.setProperty("SSLTrustStorePassword", "changeit"); diff --git a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDatabaseMetaData.java b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDatabaseMetaData.java index c13ab6926aff..cf075980f5eb 100644 --- a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDatabaseMetaData.java +++ b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDatabaseMetaData.java @@ -262,6 +262,16 @@ public void testGetDatabaseProductVersion() } } + @Test + public void testGetUserName() + throws Exception + { + try (Connection connection = createConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + assertEquals(metaData.getUserName(), "admin"); + } + } + @Test public void testGetCatalogs() throws Exception diff --git a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriver.java b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriver.java index 1bac53edf6cf..fd0fcaf04e30 100644 --- a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriver.java +++ b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriver.java @@ -391,7 +391,7 @@ public void testDriverPropertyInfoEmpty() assertThat(infos) .extracting(TestTrinoDriver::driverPropertyInfoToString) - .contains("{name=user, required=true}") + .contains("{name=user, required=false}") .contains("{name=password, required=false}") .contains("{name=accessToken, required=false}") .contains("{name=SSL, required=false, choices=[true, false]}"); @@ -413,7 +413,7 @@ public void testDriverPropertyInfoSslEnabled() assertThat(infos) .extracting(TestTrinoDriver::driverPropertyInfoToString) - .contains("{name=user, value=test, required=true}") + .contains("{name=user, value=test, required=false}") .contains("{name=SSL, value=true, required=false, choices=[true, false]}") .contains("{name=SSLVerification, required=false, choices=[FULL, CA, NONE]}") .contains("{name=SSLTrustStorePath, required=false}"); @@ -773,23 +773,11 @@ public void testBadQuery() } } - @Test - public void testUserIsRequired() - { - assertThatThrownBy(() -> DriverManager.getConnection(jdbcUrl())) - .isInstanceOf(SQLException.class) - .hasMessage("Connection property 'user' is required"); - } - @Test public void testNullConnectProperties() throws Exception { - Driver driver = DriverManager.getDriver("jdbc:trino:"); - - assertThatThrownBy(() -> driver.connect(jdbcUrl(), null)) - .isInstanceOf(SQLException.class) - .hasMessage("Connection property 'user' is required"); + DriverManager.getDriver("jdbc:trino:").connect(jdbcUrl(), null); } @Test diff --git a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverAuth.java b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverAuth.java index de65b9a537b0..467cd39669cc 100644 --- a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverAuth.java +++ b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverAuth.java @@ -328,7 +328,6 @@ private Connection createConnection(Map additionalProperties) { String url = format("jdbc:trino://localhost:%s", server.getHttpsAddress().getPort()); Properties properties = new Properties(); - properties.setProperty("user", "test"); properties.setProperty("SSL", "true"); properties.setProperty("SSLTrustStorePath", new File(getResource("localhost.truststore").toURI()).getPath()); properties.setProperty("SSLTrustStorePassword", "changeit"); @@ -341,7 +340,6 @@ private Connection createBasicConnection(Map additionalPropertie { String url = format("jdbc:trino://localhost:%s", server.getHttpsAddress().getPort()); Properties properties = new Properties(); - properties.setProperty("user", "test"); additionalProperties.forEach(properties::setProperty); return DriverManager.getConnection(url, properties); } diff --git a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverUri.java b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverUri.java index c22048e526c2..4dd97b3e2ace 100644 --- a/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverUri.java +++ b/client/trino-jdbc/src/test/java/io/trino/jdbc/TestTrinoDriverUri.java @@ -175,13 +175,6 @@ public void testInvalidUrls() assertInvalid("jdbc:presto://localhost:8080", "Invalid JDBC URL: jdbc:presto://localhost:8080"); } - @Test(expectedExceptions = SQLException.class, expectedExceptionsMessageRegExp = "Connection property 'user' is required") - public void testRequireUser() - throws Exception - { - TrinoDriverUri.create("jdbc:trino://localhost:8080", new Properties()); - } - @Test(expectedExceptions = SQLException.class, expectedExceptionsMessageRegExp = "Connection property 'user' value is empty") public void testEmptyUser() throws Exception diff --git a/testing/trino-product-tests-launcher/src/main/resources/docker/presto-product-tests/conf/environment/multinode-tls-kerberos-delegation/tempto-configuration.yaml b/testing/trino-product-tests-launcher/src/main/resources/docker/presto-product-tests/conf/environment/multinode-tls-kerberos-delegation/tempto-configuration.yaml index 2146da91c140..a7ac49ab3824 100644 --- a/testing/trino-product-tests-launcher/src/main/resources/docker/presto-product-tests/conf/environment/multinode-tls-kerberos-delegation/tempto-configuration.yaml +++ b/testing/trino-product-tests-launcher/src/main/resources/docker/presto-product-tests/conf/environment/multinode-tls-kerberos-delegation/tempto-configuration.yaml @@ -1,7 +1,6 @@ databases: presto: jdbc_url: "jdbc:trino://${databases.presto.host}:${databases.presto.port}/hive/${databases.hive.schema}?\ - user=${databases.presto.cli_kerberos_principal}&\ SSL=true&\ SSLTrustStorePath=${databases.presto.https_keystore_path}&\ SSLTrustStorePassword=${databases.presto.https_keystore_password}&\ diff --git a/testing/trino-product-tests-launcher/src/test/java/io/trino/tests/product/launcher/local/TestManuallyJdbcOauth2.java b/testing/trino-product-tests-launcher/src/test/java/io/trino/tests/product/launcher/local/TestManuallyJdbcOauth2.java index 8c474d9f9239..1a87ab9de2c8 100644 --- a/testing/trino-product-tests-launcher/src/test/java/io/trino/tests/product/launcher/local/TestManuallyJdbcOauth2.java +++ b/testing/trino-product-tests-launcher/src/test/java/io/trino/tests/product/launcher/local/TestManuallyJdbcOauth2.java @@ -58,7 +58,6 @@ public void shouldAuthenticateAndExecuteQuery() throws SQLException { Properties properties = new Properties(); - properties.setProperty("user", "test"); String jdbcUrl = format("jdbc:trino://presto-master:7778?" + "SSL=true&" + "SSLTrustStorePath=%s&" diff --git a/testing/trino-product-tests/src/main/java/io/trino/tests/product/jdbc/TestExternalAuthorizerOAuth2.java b/testing/trino-product-tests/src/main/java/io/trino/tests/product/jdbc/TestExternalAuthorizerOAuth2.java index 1eb9a80c4f40..7bd7d31575e8 100644 --- a/testing/trino-product-tests/src/main/java/io/trino/tests/product/jdbc/TestExternalAuthorizerOAuth2.java +++ b/testing/trino-product-tests/src/main/java/io/trino/tests/product/jdbc/TestExternalAuthorizerOAuth2.java @@ -40,7 +40,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Properties; import static com.google.common.base.Preconditions.checkState; import static io.trino.tempto.assertions.QueryAssert.Row.row; @@ -98,9 +97,7 @@ public void shouldAuthenticateAndExecuteQuery() throws Exception { prepareHandler(); - Properties properties = new Properties(); - properties.setProperty("user", "test"); - try (Connection connection = DriverManager.getConnection(jdbcUrl, properties); + try (Connection connection = DriverManager.getConnection(jdbcUrl); PreparedStatement statement = connection.prepareStatement("SELECT * FROM tpch.tiny.nation"); ResultSet results = statement.executeQuery()) { assertThat(forResultSet(results)).matches(TpchTableResults.PRESTO_NATION_RESULT); @@ -112,9 +109,7 @@ public void shouldAuthenticateAfterTokenExpires() throws Exception { prepareHandler(); - Properties properties = new Properties(); - properties.setProperty("user", "test"); - try (Connection connection = DriverManager.getConnection(jdbcUrl, properties); + try (Connection connection = DriverManager.getConnection(jdbcUrl); PreparedStatement statement = connection.prepareStatement("SELECT * FROM tpch.tiny.nation"); ResultSet results = statement.executeQuery()) { assertThat(forResultSet(results)).matches(TpchTableResults.PRESTO_NATION_RESULT); @@ -133,9 +128,7 @@ public void shouldReturnGroups() throws SQLException { prepareHandler(); - Properties properties = new Properties(); - properties.setProperty("user", "test"); - try (Connection connection = DriverManager.getConnection(jdbcUrl, properties); + try (Connection connection = DriverManager.getConnection(jdbcUrl); PreparedStatement statement = connection.prepareStatement("SELECT array_sort(current_groups())"); ResultSet rs = statement.executeQuery()) { assertThat(forResultSet(rs)).containsOnly(row(ImmutableList.of("admin", "public"))); diff --git a/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java b/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java index a1765283245b..ea845f4d17ee 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java @@ -148,7 +148,7 @@ private static ClientSession toClientSession(Session session, URI server, Durati return new ClientSession( server, - session.getIdentity().getUser(), + Optional.of(session.getIdentity().getUser()), Optional.empty(), session.getSource().orElse(null), session.getTraceToken(), diff --git a/testing/trino-tests/src/test/java/io/trino/execution/TestFinalQueryInfo.java b/testing/trino-tests/src/test/java/io/trino/execution/TestFinalQueryInfo.java index 01670e954d5f..5b5a7ada569e 100644 --- a/testing/trino-tests/src/test/java/io/trino/execution/TestFinalQueryInfo.java +++ b/testing/trino-tests/src/test/java/io/trino/execution/TestFinalQueryInfo.java @@ -65,7 +65,7 @@ private static QueryId startQuery(String sql, DistributedQueryRunner queryRunner try { ClientSession clientSession = new ClientSession( queryRunner.getCoordinator().getBaseUrl(), - "user", + Optional.of("user"), Optional.empty(), "source", Optional.empty(), diff --git a/testing/trino-tests/src/test/java/io/trino/execution/TestUserImpersonationAccessControl.java b/testing/trino-tests/src/test/java/io/trino/execution/TestUserImpersonationAccessControl.java index d707983c44ae..e97c56dbefcd 100644 --- a/testing/trino-tests/src/test/java/io/trino/execution/TestUserImpersonationAccessControl.java +++ b/testing/trino-tests/src/test/java/io/trino/execution/TestUserImpersonationAccessControl.java @@ -86,7 +86,7 @@ private QueryError trySelectQuery(String assumedUser) try { ClientSession clientSession = new ClientSession( getDistributedQueryRunner().getCoordinator().getBaseUrl(), - "user", + Optional.of("user"), Optional.of(assumedUser), "source", Optional.empty(),