. */ namespace SP\Tests\Services\Crypt; use SP\Core\Crypt\Crypt; use SP\Services\Account\AccountService; use SP\Services\Crypt\MasterPassService; use SP\Services\Crypt\UpdateMasterPassRequest; use SP\Services\CustomField\CustomFieldService; use SP\Storage\Database\DatabaseConnectionData; use SP\Tests\DatabaseTestCase; use SP\Tests\Services\Account\AccountCryptServiceTest; use function SP\Tests\setupContext; /** * Class MasterPassServiceTest * * @package SP\Tests\Services */ class MasterPassServiceTest extends DatabaseTestCase { /** * @var CustomFieldService */ private static $customFieldService; /** * @var AccountService */ private static $accountService; /** * @var MasterPassService */ private static $service; /** * @throws \DI\NotFoundException * @throws \SP\Core\Context\ContextException * @throws \DI\DependencyException */ public static function setUpBeforeClass() { $dic = setupContext(); self::$dataset = 'syspass_accountCrypt.xml'; // Datos de conexión a la BBDD self::$databaseConnectionData = $dic->get(DatabaseConnectionData::class); // Inicializar el repositorio self::$service = $dic->get(MasterPassService::class); self::$accountService = $dic->get(AccountService::class); self::$customFieldService = $dic->get(CustomFieldService::class); } /** * @throws \Defuse\Crypto\Exception\CryptoException * @throws \Exception */ public function testChangeMasterPassword() { $request = new UpdateMasterPassRequest(AccountCryptServiceTest::CURRENT_MASTERPASS, AccountCryptServiceTest::NEW_MASTERPASS, AccountCryptServiceTest::CURRENT_HASH); self::$service->changeMasterPassword($request); $this->checckAccounts($request); $this->checkAccountsHistory($request); $this->checkCustomFields(); $this->assertTrue(self::$service->checkMasterPassword(AccountCryptServiceTest::NEW_MASTERPASS)); $this->assertTrue(self::$service->checkUserUpdateMPass(time())); $this->assertFalse(self::$service->checkUserUpdateMPass(time() - 10)); } /** * @param UpdateMasterPassRequest $request * * @throws \Defuse\Crypto\Exception\CryptoException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException * @throws \SP\Repositories\NoSuchItemException */ private function checckAccounts(UpdateMasterPassRequest $request) { $account = self::$accountService->getPasswordForId(1); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals('&¿\'f!i$XwSwc', $pass); $account = self::$accountService->getPasswordForId(2); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals('&¿\'f!i$XwSwc', $pass); } /** * @param UpdateMasterPassRequest $request * * @throws \Defuse\Crypto\Exception\CryptoException * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException * @throws \SP\Repositories\NoSuchItemException */ private function checkAccountsHistory(UpdateMasterPassRequest $request) { // Verify accounts' password history data $account = self::$accountService->getPasswordHistoryForId(3); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals($request->getHash(), $account->getMPassHash()); $this->assertEquals('_{/uHL\>\'Oj0', $pass); $account = self::$accountService->getPasswordHistoryForId(4); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals($request->getHash(), $account->getMPassHash()); $this->assertEquals('-{?^··\mjCgetPasswordHistoryForId(5); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals($request->getHash(), $account->getMPassHash()); $this->assertEquals('-{?^··\mjCgetPasswordHistoryForId(6); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals($request->getHash(), $account->getMPassHash()); $this->assertEquals('-{?^··\mjCgetPasswordHistoryForId(7); $pass = Crypt::decrypt($account->getPass(), $account->getKey(), $request->getNewMasterPass()); $this->assertEquals($request->getHash(), $account->getMPassHash()); $this->assertEquals('-{?^··\mjCgetAllEncrypted(); $data = Crypt::decrypt($result[0]->getData(), $result[0]->getKey(), AccountCryptServiceTest::NEW_MASTERPASS); $this->assertEquals('1234', $data); } /** * @throws \SP\Repositories\NoSuchItemException * @throws \SP\Services\ServiceException */ public function testCheckUserUpdateMPass() { $this->assertTrue(self::$service->checkUserUpdateMPass(time())); $this->assertFalse(self::$service->checkUserUpdateMPass(1528236611 - 10)); } /** * @throws \SP\Repositories\NoSuchItemException * @throws \SP\Services\ServiceException */ public function testCheckMasterPassword() { $this->assertTrue(self::$service->checkMasterPassword(AccountCryptServiceTest::CURRENT_MASTERPASS)); $this->assertFalse(self::$service->checkMasterPassword(AccountCryptServiceTest::NEW_MASTERPASS)); } }