未验证 提交 70789fb3 编写于 作者: Z Zhang Yonglun 提交者: GitHub

refactor PostgreSQL Authentication (#7126)

上级 c4fe73d3
...@@ -73,52 +73,60 @@ public final class PostgreSQLAuthenticationEngine implements AuthenticationEngin ...@@ -73,52 +73,60 @@ public final class PostgreSQLAuthenticationEngine implements AuthenticationEngin
} }
payload.getByteBuf().resetReaderIndex(); payload.getByteBuf().resetReaderIndex();
if (!startupMessageReceived.get()) { if (!startupMessageReceived.get()) {
PostgreSQLComStartupPacket comStartupPacket = new PostgreSQLComStartupPacket((PostgreSQLPacketPayload) payload); return beforeStartupMessage(context, (PostgreSQLPacketPayload) payload);
startupMessageReceived.set(true); } else {
String databaseName = comStartupPacket.getParametersMap().get(DATABASE_NAME_KEYWORD); return afterStartupMessage(context, (PostgreSQLPacketPayload) payload);
if (!Strings.isNullOrEmpty(databaseName) && !ProxySchemaContexts.getInstance().schemaExists(databaseName)) { }
PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(PostgreSQLErrorCode.INVALID_CATALOG_NAME, String.format("database \"%s\" does not exist", databaseName)); }
context.writeAndFlush(responsePacket);
context.close(); private AuthenticationResult beforeStartupMessage(final ChannelHandlerContext context, final PostgreSQLPacketPayload payload) {
return AuthenticationResult.continued(); PostgreSQLComStartupPacket comStartupPacket = new PostgreSQLComStartupPacket(payload);
} startupMessageReceived.set(true);
String username = comStartupPacket.getParametersMap().get(USER_NAME_KEYWORD); String databaseName = comStartupPacket.getParametersMap().get(DATABASE_NAME_KEYWORD);
if (null == username || username.isEmpty()) { if (!Strings.isNullOrEmpty(databaseName) && !ProxySchemaContexts.getInstance().schemaExists(databaseName)) {
PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(PostgreSQLErrorCode.SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION, "user not set in StartupMessage"); PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(PostgreSQLErrorCode.INVALID_CATALOG_NAME, String.format("database \"%s\" does not exist", databaseName));
context.writeAndFlush(responsePacket); context.writeAndFlush(responsePacket);
context.close(); context.close();
return AuthenticationResult.continued(); return AuthenticationResult.continued();
} }
md5Salt = PostgreSQLRandomGenerator.getInstance().generateRandomBytes(4); String username = comStartupPacket.getParametersMap().get(USER_NAME_KEYWORD);
context.writeAndFlush(new PostgreSQLAuthenticationMD5PasswordPacket(md5Salt)); if (null == username || username.isEmpty()) {
currentAuthResult = AuthenticationResult.continued(username, databaseName); PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(PostgreSQLErrorCode.SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION, "user not set in StartupMessage");
context.writeAndFlush(responsePacket);
context.close();
return AuthenticationResult.continued();
}
md5Salt = PostgreSQLRandomGenerator.getInstance().generateRandomBytes(4);
context.writeAndFlush(new PostgreSQLAuthenticationMD5PasswordPacket(md5Salt));
currentAuthResult = AuthenticationResult.continued(username, databaseName);
return currentAuthResult;
}
private AuthenticationResult afterStartupMessage(final ChannelHandlerContext context, final PostgreSQLPacketPayload payload) {
char messageType = (char) payload.readInt1();
if ('p' != messageType) {
PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(
PostgreSQLErrorCode.SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION, String.format("PasswordMessage is expected, message type 'p', but not '%s'", messageType));
context.writeAndFlush(responsePacket);
context.close();
currentAuthResult = AuthenticationResult.continued();
return currentAuthResult; return currentAuthResult;
}
PostgreSQLPasswordMessagePacket passwordMessagePacket = new PostgreSQLPasswordMessagePacket(payload);
PostgreSQLLoginResult loginResult = PostgreSQLAuthenticationHandler.loginWithMd5Password(currentAuthResult.getUsername(), currentAuthResult.getDatabase(), md5Salt, passwordMessagePacket);
if (PostgreSQLErrorCode.SUCCESSFUL_COMPLETION != loginResult.getErrorCode()) {
PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(loginResult.getErrorCode(), loginResult.getErrorMessage());
context.writeAndFlush(responsePacket);
context.close();
return AuthenticationResult.continued();
} else { } else {
char messageType = (char) ((PostgreSQLPacketPayload) payload).readInt1(); // TODO implement PostgreSQLServerInfo like MySQLServerInfo
if ('p' != messageType) { context.write(new PostgreSQLAuthenticationOKPacket(true));
PostgreSQLErrorResponsePacket responsePacket = createErrorPacket( context.write(new PostgreSQLParameterStatusPacket("server_version", "12.3"));
PostgreSQLErrorCode.SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION, String.format("PasswordMessage is expected, message type 'p', but not '%s'", messageType)); context.write(new PostgreSQLParameterStatusPacket("client_encoding", "UTF8"));
context.writeAndFlush(responsePacket); context.write(new PostgreSQLParameterStatusPacket("server_encoding", "UTF8"));
context.close(); context.writeAndFlush(new PostgreSQLReadyForQueryPacket());
currentAuthResult = AuthenticationResult.continued(); return AuthenticationResult.finished(currentAuthResult.getUsername(), currentAuthResult.getDatabase());
return currentAuthResult;
}
PostgreSQLPasswordMessagePacket passwordMessagePacket = new PostgreSQLPasswordMessagePacket((PostgreSQLPacketPayload) payload);
PostgreSQLLoginResult loginResult = PostgreSQLAuthenticationHandler.loginWithMd5Password(currentAuthResult.getUsername(), currentAuthResult.getDatabase(), md5Salt, passwordMessagePacket);
if (PostgreSQLErrorCode.SUCCESSFUL_COMPLETION != loginResult.getErrorCode()) {
PostgreSQLErrorResponsePacket responsePacket = createErrorPacket(loginResult.getErrorCode(), loginResult.getErrorMessage());
context.writeAndFlush(responsePacket);
context.close();
return AuthenticationResult.continued();
} else {
// TODO implement PostgreSQLServerInfo like MySQLServerInfo
context.write(new PostgreSQLAuthenticationOKPacket(true));
context.write(new PostgreSQLParameterStatusPacket("server_version", "12.3"));
context.write(new PostgreSQLParameterStatusPacket("client_encoding", "UTF8"));
context.write(new PostgreSQLParameterStatusPacket("server_encoding", "UTF8"));
context.writeAndFlush(new PostgreSQLReadyForQueryPacket());
return AuthenticationResult.finished(currentAuthResult.getUsername(), currentAuthResult.getDatabase());
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册