This is an automated email from the ASF dual-hosted git repository. panjuan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new b3c88c7 Revise #10163 and complete testcases (#10182) b3c88c7 is described below commit b3c88c7d67ce14c5b9719e874e1a39eae9bff503 Author: 吴伟杰 <wuwei...@apache.org> AuthorDate: Sat Apr 24 21:27:13 2021 +0800 Revise #10163 and complete testcases (#10182) --- .../PostgreSQLAuthenticationHandler.java | 5 +++- .../PostgreSQLAuthenticationEngineTest.java | 32 +++++++++++++--------- .../PostgreSQLAuthenticationHandlerTest.java | 12 ++++++-- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandler.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandler.java index bb3be67..2299d23 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandler.java +++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandler.java @@ -57,9 +57,12 @@ public final class PostgreSQLAuthenticationHandler { } String md5Digest = passwordMessagePacket.getMd5Digest(); String expectedMd5Digest = md5Encode(username, user.get().getPassword(), md5Salt); - if (!expectedMd5Digest.equals(md5Digest) || !Strings.isNullOrEmpty(databaseName) && !ProxyContext.getInstance().schemaExists(databaseName)) { + if (!expectedMd5Digest.equals(md5Digest)) { return new PostgreSQLLoginResult(PostgreSQLErrorCode.INVALID_PASSWORD, String.format("password authentication failed for user \"%s\"", username)); } + if (!Strings.isNullOrEmpty(databaseName) && !ProxyContext.getInstance().schemaExists(databaseName)) { + return new PostgreSQLLoginResult(PostgreSQLErrorCode.INVALID_CATALOG_NAME, String.format("database \"%s\" does not exist", databaseName)); + } return null == databaseName || SQLCheckEngine.check(databaseName, getRules(databaseName), user.get().getGrantee()) ? new PostgreSQLLoginResult(PostgreSQLErrorCode.SUCCESSFUL_COMPLETION, null) : new PostgreSQLLoginResult(PostgreSQLErrorCode.PRIVILEGE_NOT_GRANTED, String.format("Access denied for user '%s' to database '%s'", username, databaseName)); diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java index 71255d9..e48a91e 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java +++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java @@ -32,6 +32,7 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.frontend.authentication.AuthenticationResult; import org.apache.shardingsphere.proxy.frontend.postgresql.authentication.exception.InvalidAuthorizationSpecificationException; import org.apache.shardingsphere.proxy.frontend.postgresql.authentication.exception.PostgreSQLAuthenticationException; +import org.apache.shardingsphere.proxy.frontend.postgresql.authentication.exception.PostgreSQLProtocolViolationException; import org.apache.shardingsphere.transaction.context.TransactionContexts; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -71,19 +72,6 @@ public final class PostgreSQLAuthenticationEngineTest { assertThat(actual.isFinished(), is(false)); } - @Test - public void assertDatabaseNotExist() { - PostgreSQLPacketPayload payload = new PostgreSQLPacketPayload(createByteBuf(32, 512)); - payload.writeInt4(64); - payload.writeInt4(196608); - payload.writeStringNul("user"); - payload.writeStringNul(username); - payload.writeStringNul("database"); - payload.writeStringNul("sharding_db"); - AuthenticationResult actual = new PostgreSQLAuthenticationEngine().authenticate(mock(ChannelHandlerContext.class), payload); - assertThat(actual.isFinished(), is(false)); - } - @Test(expected = InvalidAuthorizationSpecificationException.class) public void assertUserNotSet() { PostgreSQLPacketPayload payload = new PostgreSQLPacketPayload(createByteBuf(8, 512)); @@ -92,6 +80,24 @@ public final class PostgreSQLAuthenticationEngineTest { new PostgreSQLAuthenticationEngine().authenticate(mock(ChannelHandlerContext.class), payload); } + @Test(expected = PostgreSQLProtocolViolationException.class) + public void assertAuthenticateWithNonPasswordMessage() { + PostgreSQLAuthenticationEngine authenticationEngine = new PostgreSQLAuthenticationEngine(); + setAlreadyReceivedStartupMessage(authenticationEngine); + PostgreSQLPacketPayload payload = new PostgreSQLPacketPayload(createByteBuf(8, 16)); + payload.writeInt1('F'); + payload.writeInt8(0); + authenticationEngine.authenticate(mock(ChannelHandlerContext.class), payload); + } + + @SneakyThrows + private void setAlreadyReceivedStartupMessage(final PostgreSQLAuthenticationEngine target) { + Field field = PostgreSQLAuthenticationEngine.class.getDeclaredField("startupMessageReceived"); + field.setAccessible(true); + field.set(target, true); + field.setAccessible(false); + } + @Test public void assertLoginSuccessful() { assertLogin(password); diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandlerTest.java index 6ac3bb6..4d042e9 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandlerTest.java +++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationHandlerTest.java @@ -30,10 +30,10 @@ import org.apache.shardingsphere.infra.context.metadata.impl.StandardMetaDataCon import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType; import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser; -import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUsers; import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource; import org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData; +import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser; +import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUsers; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.junit.Before; import org.junit.Test; @@ -104,6 +104,14 @@ public final class PostgreSQLAuthenticationHandlerTest { assertThat(postgreSQLLoginResult.getErrorCode(), is(PostgreSQLErrorCode.INVALID_PASSWORD)); } + @Test + public void assertLoginWithNonExistDatabase() { + initProxyContext(new ShardingSphereUser(username, password, "%")); + String database = "non_exist_database"; + PostgreSQLLoginResult postgreSQLLoginResult = PostgreSQLAuthenticationHandler.loginWithMd5Password(username, database, md5Salt.getBytes(StandardCharsets.UTF_8), passwordMessagePacket); + assertThat(postgreSQLLoginResult.getErrorCode(), is(PostgreSQLErrorCode.INVALID_CATALOG_NAME)); + } + @SneakyThrows(ReflectiveOperationException.class) private void initProxyContext(final ShardingSphereUser user) { Field field = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");