# Connection delay tests for valid user accounts

# ----------------------------------------------------------------------

# Setup
# Install connection_control plugin
INSTALL PLUGIN connection_control SONAME 'CONNECTION_CONTROL_LIB';
INSTALL PLUGIN connection_control_failed_login_attempts SONAME 'CONNECTION_CONTROL_LIB';
# Create user accounts for testing
CREATE USER u1@localhost IDENTIFIED BY 'abcd';
CREATE USER u2@localhost IDENTIFIED BY 'abcd';
CREATE USER u3@localhost IDENTIFIED BY 'abcd';
# Save original values of connection_control variables
SET @saved_connections_threshold = @@global.connection_control_failed_connections_threshold;
# Avoid triggering delay
SET @@global.connection_control_failed_connections_threshold = 100;

# ----------------------------------------------------------------------

connect(localhost,u1,,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: NO)
connect(localhost,u1,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: YES)
connect(localhost,u2,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u2'@'localhost' (using password: YES)
# connection_control_failed_login_attempts should contain entries
# for u1@localhost and u2@localhost
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	2
'u2'@'localhost'	1
connect(localhost,u3,,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u3'@'localhost' (using password: NO)
connect(localhost,u2,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u2'@'localhost' (using password: YES)
connect(localhost,u3,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u3'@'localhost' (using password: YES)
# connection_control_failed_login_attempts should contain entries
# for u1@localhost, u2@localhost and u3@localhost
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	2
'u2'@'localhost'	2
'u3'@'localhost'	2
connect(localhost,u2,,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u2'@'localhost' (using password: NO)
connect(localhost,u1,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: YES)
connect(localhost,u3,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u3'@'localhost' (using password: YES)
# failed connection counts should have increased for all users
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	3
'u2'@'localhost'	3
'u3'@'localhost'	3
connect(localhost,u2,,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u2'@'localhost' (using password: NO)
connect(localhost,u1,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: YES)
connect(localhost,u3,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u3'@'localhost' (using password: YES)
connect(localhost,u1,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: YES)
connect(localhost,u3,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u3'@'localhost' (using password: YES)
connect(localhost,u1,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: YES)
# Try various queries
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts
WHERE USERHOST = '\'u1\'@\'localhost\'';
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	6
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts
WHERE USERHOST LIKE '%u2%';
USERHOST	FAILED_ATTEMPTS
'u2'@'localhost'	4
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts
WHERE FAILED_ATTEMPTS > 4;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	6
'u3'@'localhost'	5
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts
WHERE FAILED_ATTEMPTS > 5;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	6
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts
WHERE FAILED_ATTEMPTS < 5;
USERHOST	FAILED_ATTEMPTS
'u2'@'localhost'	4
# After successful login, corresponding entry should disappear
# from the view
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
'u3'@'localhost'	5
# A user without privileges should not be able to any information
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
connect(localhost,u1,,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u1'@'localhost' (using password: NO)
connect(localhost,u3,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u3'@'localhost' (using password: YES)
connect(localhost,u2,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u2'@'localhost' (using password: YES)
# Subsequent failed attempts should put entries back in the view
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	1
'u2'@'localhost'	1
'u3'@'localhost'	1
connect(localhost,u4,,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u4'@'localhost' (using password: NO)
connect(localhost,u5,haha,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u5'@'localhost' (using password: YES)
connect(localhost,u6,efgh,test,MASTER_PORT,MASTER_SOCKET);
ERROR 28000: Access denied for user 'u6'@'localhost' (using password: YES)
# Attempts by invalid accounts should be shown in the view
SELECT * FROM INFORMATION_SCHEMA.connection_control_failed_login_attempts;
USERHOST	FAILED_ATTEMPTS
'u1'@'localhost'	1
'u2'@'localhost'	1
'u3'@'localhost'	1
'u4'@'localhost'	1
'u5'@'localhost'	1
'u6'@'localhost'	1

# ----------------------------------------------------------------------

# Cleanup
# Restore original values of conenction_control variables
SET @@global.connection_control_failed_connections_threshold = @saved_connections_threshold;
# Remove user accounts created for the test
DROP USER u1@localhost;
DROP USER u2@localhost;
DROP USER u3@localhost;
# Uninstall connection_control plugin
UNINSTALL PLUGIN connection_control;
UNINSTALL PLUGIN connection_control_failed_login_attempts;

# ----------------------------------------------------------------------
