phpmyadmin/test/classes/Server/Privileges/AccountLockingTest.php
Maurício Meneghini Fauth f7fc4177af
Add support for account locking
- https://dev.mysql.com/doc/refman/en/account-locking.html
- https://mariadb.com/kb/en/account-locking/

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2021-08-21 00:55:33 -03:00

135 lines
5.4 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Tests\Server\Privileges;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Server\Privileges\AccountLocking;
use PHPUnit\Framework\TestCase;
use Throwable;
/**
* @covers \PhpMyAdmin\Server\Privileges\AccountLocking
*/
class AccountLockingTest extends TestCase
{
public function testLockWithValidAccount(): void
{
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects($this->once())->method('isMariaDB')->willReturn(true);
$dbi->expects($this->once())->method('getVersion')->willReturn(100402);
$dbi->expects($this->exactly(2))
->method('escapeString')
->withConsecutive([$this->equalTo('test.user')], [$this->equalTo('test.host')])
->willReturnOnConsecutiveCalls('test.user', 'test.host');
$dbi->expects($this->once())
->method('tryQuery')
->with($this->equalTo('ALTER USER \'test.user\'@\'test.host\' ACCOUNT LOCK;'))
->willReturn(true);
$dbi->expects($this->never())->method('getError');
$accountLocking = new AccountLocking($dbi);
$accountLocking->lock('test.user', 'test.host');
}
public function testLockWithInvalidAccount(): void
{
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects($this->once())->method('isMariaDB')->willReturn(true);
$dbi->expects($this->once())->method('getVersion')->willReturn(100402);
$dbi->expects($this->exactly(2))
->method('escapeString')
->withConsecutive([$this->equalTo('test.user')], [$this->equalTo('test.host')])
->willReturnOnConsecutiveCalls('test.user', 'test.host');
$dbi->expects($this->once())
->method('tryQuery')
->with($this->equalTo('ALTER USER \'test.user\'@\'test.host\' ACCOUNT LOCK;'))
->willReturn(false);
$dbi->expects($this->once())->method('getError')->willReturn('Invalid account.');
$accountLocking = new AccountLocking($dbi);
$this->expectException(Throwable::class);
$this->expectExceptionMessage('Invalid account.');
$accountLocking->lock('test.user', 'test.host');
}
public function testLockWithUnsupportedServer(): void
{
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects($this->once())->method('isMariaDB')->willReturn(true);
$dbi->expects($this->once())->method('getVersion')->willReturn(100401);
$dbi->expects($this->never())->method('escapeString');
$dbi->expects($this->never())->method('tryQuery');
$dbi->expects($this->never())->method('getError');
$accountLocking = new AccountLocking($dbi);
$this->expectException(Throwable::class);
$this->expectExceptionMessage('Account locking is not supported.');
$accountLocking->lock('test.user', 'test.host');
}
public function testUnlockWithValidAccount(): void
{
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects($this->once())->method('isMariaDB')->willReturn(true);
$dbi->expects($this->once())->method('getVersion')->willReturn(100402);
$dbi->expects($this->exactly(2))
->method('escapeString')
->withConsecutive([$this->equalTo('test.user')], [$this->equalTo('test.host')])
->willReturnOnConsecutiveCalls('test.user', 'test.host');
$dbi->expects($this->once())
->method('tryQuery')
->with($this->equalTo('ALTER USER \'test.user\'@\'test.host\' ACCOUNT UNLOCK;'))
->willReturn(true);
$dbi->expects($this->never())->method('getError');
$accountLocking = new AccountLocking($dbi);
$accountLocking->unlock('test.user', 'test.host');
}
public function testUnlockWithInvalidAccount(): void
{
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects($this->once())->method('isMariaDB')->willReturn(true);
$dbi->expects($this->once())->method('getVersion')->willReturn(100402);
$dbi->expects($this->exactly(2))
->method('escapeString')
->withConsecutive([$this->equalTo('test.user')], [$this->equalTo('test.host')])
->willReturnOnConsecutiveCalls('test.user', 'test.host');
$dbi->expects($this->once())
->method('tryQuery')
->with($this->equalTo('ALTER USER \'test.user\'@\'test.host\' ACCOUNT UNLOCK;'))
->willReturn(false);
$dbi->expects($this->once())->method('getError')->willReturn('Invalid account.');
$accountLocking = new AccountLocking($dbi);
$this->expectException(Throwable::class);
$this->expectExceptionMessage('Invalid account.');
$accountLocking->unlock('test.user', 'test.host');
}
public function testUnlockWithUnsupportedServer(): void
{
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects($this->once())->method('isMariaDB')->willReturn(false);
$dbi->expects($this->once())->method('getVersion')->willReturn(50705);
$dbi->expects($this->never())->method('escapeString');
$dbi->expects($this->never())->method('tryQuery');
$dbi->expects($this->never())->method('getError');
$accountLocking = new AccountLocking($dbi);
$this->expectException(Throwable::class);
$this->expectExceptionMessage('Account locking is not supported.');
$accountLocking->unlock('test.user', 'test.host');
}
}