You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/04/24 13:27:56 UTC
[shardingsphere] branch master updated: Revise #10163 and complete
testcases (#10182)
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: 吴伟杰 <wu...@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");