Fix COM_CHANGE_USER handling in MySQLBackend
When a COM_CHANGE_USER statement was executed, the new user credentials were copied after the authentication message was sent. This caused the COM_CHANGE_USER to always succeed the first time as it used the current credentials. The user credentials would always lag behind by one.
This commit is contained in:
@ -1900,13 +1900,19 @@ static int gw_change_user(DCB *backend,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rv = gw_send_change_user_to_backend(database, username, client_sha1, backend_protocol);
|
/** This assumes that authentication will succeed. If authentication fails,
|
||||||
/*
|
* the internal session will represent the wrong user. This is wrong and
|
||||||
* Now copy new data into user session
|
* a check whether the COM_CHANGE_USER succeeded should be done in the
|
||||||
*/
|
* backend protocol reply handling.
|
||||||
|
*
|
||||||
|
* For the time being, it is simpler to assume a COM_CHANGE_USER will always
|
||||||
|
* succeed if the authentication in MaxScale is successful. In practice this
|
||||||
|
* might not be true but these cases are handled by the router modules
|
||||||
|
* and the servers that fail to execute the COM_CHANGE_USER are discarded. */
|
||||||
strcpy(current_session->user, username);
|
strcpy(current_session->user, username);
|
||||||
strcpy(current_session->db, database);
|
strcpy(current_session->db, database);
|
||||||
memcpy(current_session->client_sha1, client_sha1, sizeof(current_session->client_sha1));
|
memcpy(current_session->client_sha1, client_sha1, sizeof(current_session->client_sha1));
|
||||||
|
rv = gw_send_change_user_to_backend(database, username, client_sha1, backend_protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
retblock:
|
retblock:
|
||||||
|
Reference in New Issue
Block a user