in src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeAuthenticationProvider.java [128:209]
public void connect(String user, String pass, String db) {
ServerSession sessState = this.protocol.getServerSession();
this.username = user;
this.password = pass;
this.database = db;
NativeCapabilities capabilities = (NativeCapabilities) sessState.getCapabilities();
NativePacketPayload buf = capabilities.getInitialHandshakePacket();
SslMode sslMode = this.propertySet.<SslMode>getEnumProperty(PropertyKey.sslMode).getValue();
int capabilityFlags = capabilities.getCapabilityFlags();
if ((capabilityFlags & NativeServerSession.CLIENT_SSL) == 0 && sslMode != SslMode.DISABLED && sslMode != SslMode.PREFERRED) {
// check SSL availability
throw ExceptionFactory.createException(UnableToConnectException.class, Messages.getString("MysqlIO.15"), getExceptionInterceptor());
} else if ((capabilityFlags & NativeServerSession.CLIENT_SECURE_CONNECTION) == 0) {
// TODO: better messaging
throw ExceptionFactory.createException(UnableToConnectException.class, "CLIENT_SECURE_CONNECTION is required", getExceptionInterceptor());
} else if ((capabilityFlags & NativeServerSession.CLIENT_PLUGIN_AUTH) == 0) {
// TODO: better messaging
throw ExceptionFactory.createException(UnableToConnectException.class, "CLIENT_PLUGIN_AUTH is required", getExceptionInterceptor());
}
sessState.setStatusFlags(capabilities.getStatusFlags()); // read status flags (2 bytes)
int authPluginDataLength = capabilities.getAuthPluginDataLength();
StringBuilder fullSeed = new StringBuilder(authPluginDataLength > 0 ? authPluginDataLength : NativeConstants.SEED_LENGTH);
fullSeed.append(capabilities.getSeed()); // read auth-plugin-data-part-1 (string[8])
fullSeed.append(authPluginDataLength > 0 ? // read string[$len] auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8))
buf.readString(StringLengthDataType.STRING_FIXED, "ASCII", authPluginDataLength - 8) : buf.readString(StringSelfDataType.STRING_TERM, "ASCII"));
this.seed = fullSeed.toString();
this.useConnectWithDb = this.database != null && this.database.length() > 0
&& !this.propertySet.getBooleanProperty(PropertyKey.createDatabaseIfNotExist).getValue();
long clientParam = capabilityFlags & NativeServerSession.CLIENT_LONG_PASSWORD //
| (this.propertySet.getBooleanProperty(PropertyKey.useAffectedRows).getValue() ? //
0 : capabilityFlags & NativeServerSession.CLIENT_FOUND_ROWS) //
| capabilityFlags & NativeServerSession.CLIENT_LONG_FLAG //
| (this.useConnectWithDb ? capabilityFlags & NativeServerSession.CLIENT_CONNECT_WITH_DB : 0) //
| (this.propertySet.getBooleanProperty(PropertyKey.useCompression).getValue() ? //
capabilityFlags & NativeServerSession.CLIENT_COMPRESS : 0) //
| (this.propertySet.getBooleanProperty(PropertyKey.allowLoadLocalInfile).getValue()
|| this.propertySet.getStringProperty(PropertyKey.allowLoadLocalInfileInPath).isExplicitlySet() ? //
capabilityFlags & NativeServerSession.CLIENT_LOCAL_FILES : 0) //
| capabilityFlags & NativeServerSession.CLIENT_PROTOCOL_41 //
| (this.propertySet.getBooleanProperty(PropertyKey.interactiveClient).getValue() ? //
capabilityFlags & NativeServerSession.CLIENT_INTERACTIVE : 0) //
| (this.propertySet.<SslMode>getEnumProperty(PropertyKey.sslMode).getValue() != SslMode.DISABLED ? //
capabilityFlags & NativeServerSession.CLIENT_SSL : 0) //
| capabilityFlags & NativeServerSession.CLIENT_TRANSACTIONS // Required to get server status values.
| NativeServerSession.CLIENT_SECURE_CONNECTION //
| (this.propertySet.getBooleanProperty(PropertyKey.allowMultiQueries).getValue() ? //
capabilityFlags & NativeServerSession.CLIENT_MULTI_STATEMENTS : 0) //
| capabilityFlags & NativeServerSession.CLIENT_MULTI_RESULTS // Always allow multiple result sets.
| capabilityFlags & NativeServerSession.CLIENT_PS_MULTI_RESULTS // Always allow multiple result sets for SSPS.
| NativeServerSession.CLIENT_PLUGIN_AUTH //
| (NONE.equals(this.propertySet.getStringProperty(PropertyKey.connectionAttributes).getValue()) ? //
0 : capabilityFlags & NativeServerSession.CLIENT_CONNECT_ATTRS) //
| capabilityFlags & NativeServerSession.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA //
| (this.propertySet.getBooleanProperty(PropertyKey.disconnectOnExpiredPasswords).getValue() ? //
0 : capabilityFlags & NativeServerSession.CLIENT_CAN_HANDLE_EXPIRED_PASSWORD) //
| (this.propertySet.getBooleanProperty(PropertyKey.trackSessionState).getValue() ? //
capabilityFlags & NativeServerSession.CLIENT_SESSION_TRACK : 0) //
| capabilityFlags & NativeServerSession.CLIENT_DEPRECATE_EOF //
| capabilityFlags & NativeServerSession.CLIENT_QUERY_ATTRIBUTES //
| capabilityFlags & NativeServerSession.CLIENT_MULTI_FACTOR_AUTHENTICATION;
sessState.setClientParam(clientParam);
/* First, negotiate SSL connection */
if ((clientParam & NativeServerSession.CLIENT_SSL) != 0) {
this.protocol.negotiateSSLConnection();
}
if (buf.isOKPacket()) {
throw ExceptionFactory.createException(Messages.getString("AuthenticationProvider.UnexpectedAuthenticationApproval"), getExceptionInterceptor());
}
proceedHandshakeWithPluggableAuthentication(buf);
this.password = null;
}