From 9c4e7cfcc3736c2020f53fff75a11a32f9d3955d Mon Sep 17 00:00:00 2001 From: Daniel Seifert Date: Wed, 28 Sep 2022 00:08:36 +0200 Subject: [PATCH] refactor tests --- .gitignore | 2 + .../Controller/Admin/d3user_totp.php | 8 +- .../Controller/d3_account_totp.php | 5 +- src/Application/Controller/d3totplogin.php | 10 +- .../Factory/BaconQrCodeFactory.php | 4 +- .../Exceptions/d3totp_wrongOtpException.php | 2 + src/Application/Model/d3RandomGenerator.php | 21 +- src/Application/Model/d3backupcode.php | 3 + src/Application/Model/d3backupcodelist.php | 4 +- src/Application/Model/d3totp.php | 24 +- .../translations/de/d3_totp_lang.php | 2 + .../translations/en/d3_totp_lang.php | 2 + .../blocks/d3totp_login_admin_login_form.tpl | 2 +- .../views/admin/de/d3totp_lang.php | 1 + .../views/admin/en/d3totp_lang.php | 1 + src/Application/views/tpl/d3totplogin.tpl | 2 +- .../Component/d3_totp_UserComponent.php | 6 +- .../Admin/d3_totp_LoginController.php | 16 +- .../Controller/d3_totp_OrderController.php | 2 + .../Controller/d3_totp_PaymentController.php | 2 + .../Controller/d3_totp_UserController.php | 2 + .../Controller/d3_totp_getUserTrait.php | 5 +- .../Application/Model/d3_totp_user.php | 4 +- src/Modules/Core/d3_totp_utils.php | 6 +- src/Setup/Events.php | 113 +++- src/metadata.php | 18 +- src/tests/d3totp_config.php | 2 +- .../Controller/Admin/d3user_totpTest.php | 329 +++++++----- .../Controller/d3_account_totpTest.php | 198 ++++--- .../Controller/d3totploginTest.php | 79 +-- .../d3totp_wrongOtpExceptionTest.php | 4 +- .../Model/d3RandomGeneratorTest.php | 4 +- .../Application/Model/d3backupcodeTest.php | 53 +- .../Model/d3backupcodelistTest.php | 246 +++++---- .../unit/Application/Model/d3totpTest.php | 491 +++++++++--------- .../Component/d3_totp_UserComponentTest.php | 357 +++++++------ .../Admin/d3_totp_LoginControllerTest.php | 431 ++++++++------- .../d3_totp_OrderControllerTest.php | 7 +- .../d3_totp_PaymentControllerTest.php | 4 +- .../Controller/d3_totp_UserControllerTest.php | 4 +- .../Controller/d3_totp_getUserTestTrait.php | 144 ++--- .../Application/Model/d3_totp_userTest.php | 22 +- .../unit/Modules/Core/d3_totp_utilsTest.php | 138 ++--- 43 files changed, 1579 insertions(+), 1201 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b3f958 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +src/tests/.phpunit.result.cache +src/tests/reports/ diff --git a/src/Application/Controller/Admin/d3user_totp.php b/src/Application/Controller/Admin/d3user_totp.php index e344079..2009025 100644 --- a/src/Application/Controller/Admin/d3user_totp.php +++ b/src/Application/Controller/Admin/d3user_totp.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Controller\Admin; use D3\Totp\Application\Model\d3totp; @@ -93,12 +95,10 @@ class d3user_totp extends AdminDetailsController $aParams = Registry::getRequest()->getRequestEscapedParameter("editval"); try { - /** @var d3totp $oTotp */ $oTotp = $this->getTotpObject(); if ($oTotp->checkIfAlreadyExist($this->getEditObjectId())) { - $oException = oxNew(StandardException::class, 'D3_TOTP_ALREADY_EXIST'); - throw $oException; - }; + throw oxNew(StandardException::class, 'D3_TOTP_ALREADY_EXIST'); + } $oTotpBackupCodes = $this->getBackupcodeListObject(); if ($aParams['d3totp__oxid']) { diff --git a/src/Application/Controller/d3_account_totp.php b/src/Application/Controller/d3_account_totp.php index c433a39..c31e16d 100644 --- a/src/Application/Controller/d3_account_totp.php +++ b/src/Application/Controller/d3_account_totp.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Controller; use D3\Totp\Application\Model\d3backupcodelist; @@ -45,7 +47,7 @@ class d3_account_totp extends AccountController } /** - * @param $aCodes + * @param array $aCodes */ public function setBackupCodes(array $aCodes) { @@ -119,7 +121,6 @@ class d3_account_totp extends AccountController /** * @throws DatabaseConnectionException - * @throws DBALException */ public function delete() { diff --git a/src/Application/Controller/d3totplogin.php b/src/Application/Controller/d3totplogin.php index ebccf0c..2b81409 100644 --- a/src/Application/Controller/d3totplogin.php +++ b/src/Application/Controller/d3totplogin.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Controller; use D3\Totp\Application\Model\d3backupcodelist; @@ -29,7 +31,7 @@ class d3totplogin extends FrontendController if (Registry::getSession()->hasVariable(d3totp::TOTP_SESSION_VARNAME) || false == Registry::getSession()->hasVariable(d3totp::TOTP_SESSION_CURRENTUSER) ) { - $this->getUtils()->redirect('index.php?cl=start', true, 302); + $this->getUtils()->redirect('index.php?cl=start'); if (false == defined('OXID_PHP_UNIT')) { // @codeCoverageIgnoreStart exit; @@ -64,9 +66,7 @@ class d3totplogin extends FrontendController Registry::getLang()->translateString('D3_TOTP_AVAILBACKUPCODECOUNT', null, true), $iCount ); - }; - - return; + } } /** @@ -86,7 +86,7 @@ class d3totplogin extends FrontendController { $sClassKey = Registry::getSession()->getVariable(d3totp::TOTP_SESSION_CURRENTCLASS); $resolvedClass = Registry::getControllerClassNameResolver()->getClassNameById($sClassKey); - $resolvedClass = $resolvedClass ? $resolvedClass : 'start'; + $resolvedClass = $resolvedClass ?: 'start'; /** @var FrontendController $oController */ $oController = oxNew($resolvedClass); diff --git a/src/Application/Factory/BaconQrCodeFactory.php b/src/Application/Factory/BaconQrCodeFactory.php index 81c4cf4..c686964 100644 --- a/src/Application/Factory/BaconQrCodeFactory.php +++ b/src/Application/Factory/BaconQrCodeFactory.php @@ -22,12 +22,10 @@ class BaconQrCodeFactory private static function v200($size) { - $renderer = oxNew( + return oxNew( ImageRenderer::class, oxNew(RendererStyle::class, $size), oxNew(SvgImageBackEnd::class), ); - - return $renderer; } } diff --git a/src/Application/Model/Exceptions/d3totp_wrongOtpException.php b/src/Application/Model/Exceptions/d3totp_wrongOtpException.php index 0dc0efc..9681038 100644 --- a/src/Application/Model/Exceptions/d3totp_wrongOtpException.php +++ b/src/Application/Model/Exceptions/d3totp_wrongOtpException.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Model\Exceptions; use Exception; diff --git a/src/Application/Model/d3RandomGenerator.php b/src/Application/Model/d3RandomGenerator.php index bda41b9..3108c84 100644 --- a/src/Application/Model/d3RandomGenerator.php +++ b/src/Application/Model/d3RandomGenerator.php @@ -1,20 +1,25 @@ + * @link https://www.oxidmodule.com + */ + +declare(strict_types=1); + namespace D3\Totp\Application\Model; use Laminas\Math\Rand; class d3RandomGenerator extends Rand { - const CHAR_UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - const CHAR_LOWER = 'abcdefghijklmnopqrstuvwxyz'; const CHAR_DIGITS = '0123456789'; - const CHAR_UPPER_HEX = 'ABCDEF'; - const CHAR_LOWER_HEX = 'abcdef'; - const CHAR_BASE64 = '+/'; - const CHAR_SYMBOLS = '!"#$%&\'()* +,-./:;<=>?@[\]^_`{|}~'; - const CHAR_BRACKETS = '()[]{}<>'; - const CHAR_PUNCT = ',.;:'; /** * @return string diff --git a/src/Application/Model/d3backupcode.php b/src/Application/Model/d3backupcode.php index 3a848c2..c08125f 100644 --- a/src/Application/Model/d3backupcode.php +++ b/src/Application/Model/d3backupcode.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Model; use OxidEsales\Eshop\Application\Model\User; @@ -48,6 +50,7 @@ class d3backupcode extends BaseModel /** * @param $code + * @param $sUserId * @return false|string * @throws DatabaseConnectionException */ diff --git a/src/Application/Model/d3backupcodelist.php b/src/Application/Model/d3backupcodelist.php index 42efde4..0fdbba1 100644 --- a/src/Application/Model/d3backupcodelist.php +++ b/src/Application/Model/d3backupcodelist.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Model; use D3\Totp\Application\Controller\Admin\d3user_totp; @@ -46,7 +48,7 @@ class d3backupcodelist extends ListModel for ($i = 1; $i <= 10; $i++) { $oBackupCode = $this->getD3BackupCodeObject(); $this->_backupCodes[] = $oBackupCode->generateCode($sUserId); - $this->offsetSet(md5(rand()), $oBackupCode); + $this->offsetSet(md5((string) rand()), $oBackupCode); } /** @var d3user_totp $oActView */ diff --git a/src/Application/Model/d3totp.php b/src/Application/Model/d3totp.php index c41871a..798cc09 100644 --- a/src/Application/Model/d3totp.php +++ b/src/Application/Model/d3totp.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Application\Model; use BaconQrCode\Renderer\RendererInterface; @@ -201,22 +203,20 @@ class d3totp extends BaseModel */ public function verify($totp, $seed = null) { - $blVerify = $this->getTotp($seed)->verify($totp, null, $this->timeWindow); + $blNotVerified = $this->getTotp($seed)->verify($totp, null, $this->timeWindow) == false; - if (false == $blVerify && null == $seed) { + if ($blNotVerified && null == $seed) { $oBC = $this->d3GetBackupCodeListObject(); - $blVerify = $oBC->verify($totp); + $blNotVerified = $oBC->verify($totp) == false; - if (false == $blVerify) { - $oException = oxNew(d3totp_wrongOtpException::class); - throw $oException; + if ($blNotVerified) { + throw oxNew(d3totp_wrongOtpException::class); } - } elseif (false == $blVerify && $seed) { - $oException = oxNew(d3totp_wrongOtpException::class); - throw $oException; + } elseif ($blNotVerified && $seed) { + throw oxNew(d3totp_wrongOtpException::class); } - return $blVerify; + return !$blNotVerified; } /** @@ -282,8 +282,6 @@ class d3totp extends BaseModel $oBackupCodeList = $this->d3GetBackupCodeListObject(); $oBackupCodeList->deleteAllFromUser($this->getFieldData('oxuserid')); - $blDelete = parent::delete(); - - return $blDelete; + return parent::delete(); } } diff --git a/src/Application/translations/de/d3_totp_lang.php b/src/Application/translations/de/d3_totp_lang.php index 627c3d0..15a3088 100644 --- a/src/Application/translations/de/d3_totp_lang.php +++ b/src/Application/translations/de/d3_totp_lang.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + $sLangName = "Deutsch"; $aLang = [ diff --git a/src/Application/translations/en/d3_totp_lang.php b/src/Application/translations/en/d3_totp_lang.php index 00a328c..8d34f15 100644 --- a/src/Application/translations/en/d3_totp_lang.php +++ b/src/Application/translations/en/d3_totp_lang.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + $sLangName = "English"; $aLang = [ diff --git a/src/Application/views/admin/blocks/d3totp_login_admin_login_form.tpl b/src/Application/views/admin/blocks/d3totp_login_admin_login_form.tpl index 84a6490..f24b1db 100644 --- a/src/Application/views/admin/blocks/d3totp_login_admin_login_form.tpl +++ b/src/Application/views/admin/blocks/d3totp_login_admin_login_form.tpl @@ -4,7 +4,7 @@ - [{if $Errors.default|@count}] + [{if !empty($Errors.default)}] [{include file="inc_error.tpl" Errorlist=$Errors.default}] [{/if}] diff --git a/src/Application/views/admin/de/d3totp_lang.php b/src/Application/views/admin/de/d3totp_lang.php index 58ef300..0a06db7 100644 --- a/src/Application/views/admin/de/d3totp_lang.php +++ b/src/Application/views/admin/de/d3totp_lang.php @@ -30,6 +30,7 @@ $aLang = [ 'D3_TOTP_CURROTP' => 'Bestätigung mit Einmalpasswort', 'D3_TOTP_CURROTP_HELP' => 'Haben Sie dieses Kundenkonto in Ihrer Authentisierungs-App registriert, generieren Sie damit ein Einmalpasswort, tragen Sie es hier ein und senden das Formular direkt darauf hin ab.', + 'SHOP_MODULE_GROUP_d3totp_main' => 'Grundeinstellungen', 'D3_TOTP_FORCE2FATITLE' => 'Verpflichtet Zwei-Faktor-Authentisierung', 'D3_TOTP_FORCE2FASUB' => 'Alle Administratoren müssen es aktivieren', 'D3_TOTP_ADMINBACKEND' => 'Admin-Oberfläche', diff --git a/src/Application/views/admin/en/d3totp_lang.php b/src/Application/views/admin/en/d3totp_lang.php index f84a61d..b337f2e 100644 --- a/src/Application/views/admin/en/d3totp_lang.php +++ b/src/Application/views/admin/en/d3totp_lang.php @@ -30,6 +30,7 @@ $aLang = [ 'D3_TOTP_CURROTP' => 'Confirmation with one-time password', 'D3_TOTP_CURROTP_HELP' => 'If you have registered this customer account in your authentication app, you generate a one-time password, enter it here and send the form out immediately.', + 'SHOP_MODULE_GROUP_d3totp_main' => 'Basic settings', 'D3_TOTP_FORCE2FATITLE' => 'Mandates two-factor authentication', 'D3_TOTP_FORCE2FASUB' => 'All administrators need to activate it', 'D3_TOTP_ADMINBACKEND' => 'Admin-Backend', diff --git a/src/Application/views/tpl/d3totplogin.tpl b/src/Application/views/tpl/d3totplogin.tpl index c2facdb..49bfa75 100644 --- a/src/Application/views/tpl/d3totplogin.tpl +++ b/src/Application/views/tpl/d3totplogin.tpl @@ -15,7 +15,7 @@ [{$navFormParams}] - [{if $Errors.default|@count}] + [{if !empty($Errors.default)}] [{include file="inc_error.tpl" Errorlist=$Errors.default}] [{/if}] diff --git a/src/Modules/Application/Component/d3_totp_UserComponent.php b/src/Modules/Application/Component/d3_totp_UserComponent.php index 81e425d..26dd849 100644 --- a/src/Modules/Application/Component/d3_totp_UserComponent.php +++ b/src/Modules/Application/Component/d3_totp_UserComponent.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Component; use D3\Totp\Application\Model\d3totp; @@ -40,7 +42,7 @@ class d3_totp_UserComponent extends d3_totp_UserComponent_parent $totp->loadByUserId($oUser->getId()); if ($totp->isActive() - && false == Registry::getSession()->getVariable(d3totp::TOTP_SESSION_VARNAME) + && !Registry::getSession()->getVariable(d3totp::TOTP_SESSION_VARNAME) ) { Registry::getSession()->setVariable( d3totp::TOTP_SESSION_CURRENTCLASS, @@ -82,7 +84,7 @@ class d3_totp_UserComponent extends d3_totp_UserComponent_parent $totp->loadByUserId($sUserId); try { - if (false == $this->isNoTotpOrNoLogin($totp) && $this->hasValidTotp($sTotp, $totp)) { + if (!$this->isNoTotpOrNoLogin($totp) && $this->hasValidTotp($sTotp, $totp)) { $this->d3TotpRelogin($oUser, $sTotp); $this->d3TotpClearSessionVariables(); diff --git a/src/Modules/Application/Controller/Admin/d3_totp_LoginController.php b/src/Modules/Application/Controller/Admin/d3_totp_LoginController.php index 1009655..3f5a27a 100644 --- a/src/Modules/Application/Controller/Admin/d3_totp_LoginController.php +++ b/src/Modules/Application/Controller/Admin/d3_totp_LoginController.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Controller\Admin; use D3\Totp\Application\Model\d3totp; @@ -41,7 +43,7 @@ class d3_totp_LoginController extends d3_totp_LoginController_parent if ($auth && $totp->isActive() - && false == $this->d3GetSession()->getVariable(d3totp::TOTP_SESSION_VARNAME) + && !$this->d3GetSession()->getVariable(d3totp::TOTP_SESSION_VARNAME) ) { // set auth as secured parameter; $this->d3GetSession()->setVariable("auth", $auth); @@ -98,7 +100,7 @@ class d3_totp_LoginController extends d3_totp_LoginController_parent $return = 'login'; try { - if ($this->isNoTotpOrNoLogin($totp)) { + if ($this->isNoTotpOrNoLogin($totp) && $this->hasLoginCredentials()) { $return = parent::checklogin(); } elseif ($this->hasValidTotp($sTotp, $totp)) { $this->d3GetSession()->setVariable(d3totp::TOTP_SESSION_VARNAME, $sTotp); @@ -125,9 +127,7 @@ class d3_totp_LoginController extends d3_totp_LoginController_parent Registry::getLang()->translateString('D3_TOTP_AVAILBACKUPCODECOUNT'), $iCount ); - }; - - return; + } } /** @@ -140,6 +140,12 @@ class d3_totp_LoginController extends d3_totp_LoginController_parent || false == $totp->isActive(); } + protected function hasLoginCredentials() + { + return Registry::getRequest()->getRequestEscapedParameter( 'user') && + Registry::getRequest()->getRequestEscapedParameter('pwd'); + } + /** * @param string $sTotp * @param d3totp $totp diff --git a/src/Modules/Application/Controller/d3_totp_OrderController.php b/src/Modules/Application/Controller/d3_totp_OrderController.php index ce80591..24aa8a9 100644 --- a/src/Modules/Application/Controller/d3_totp_OrderController.php +++ b/src/Modules/Application/Controller/d3_totp_OrderController.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Controller; class d3_totp_OrderController extends d3_totp_OrderController_parent diff --git a/src/Modules/Application/Controller/d3_totp_PaymentController.php b/src/Modules/Application/Controller/d3_totp_PaymentController.php index 3df3365..56cf88e 100644 --- a/src/Modules/Application/Controller/d3_totp_PaymentController.php +++ b/src/Modules/Application/Controller/d3_totp_PaymentController.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Controller; class d3_totp_PaymentController extends d3_totp_PaymentController_parent diff --git a/src/Modules/Application/Controller/d3_totp_UserController.php b/src/Modules/Application/Controller/d3_totp_UserController.php index a40a5bd..5bdc3c1 100644 --- a/src/Modules/Application/Controller/d3_totp_UserController.php +++ b/src/Modules/Application/Controller/d3_totp_UserController.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Controller; class d3_totp_UserController extends d3_totp_UserController_parent diff --git a/src/Modules/Application/Controller/d3_totp_getUserTrait.php b/src/Modules/Application/Controller/d3_totp_getUserTrait.php index 93b1e13..f809346 100644 --- a/src/Modules/Application/Controller/d3_totp_getUserTrait.php +++ b/src/Modules/Application/Controller/d3_totp_getUserTrait.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Controller; use D3\Totp\Application\Model\d3totp; @@ -25,7 +27,6 @@ trait d3_totp_getUserTrait /** * @return bool|object|User * @throws DatabaseConnectionException - * @throws DBALException */ public function getUser() { @@ -36,7 +37,7 @@ trait d3_totp_getUserTrait $totp->loadByUserId($oUser->getId()); if ($totp->isActive() - && false == $this->d3GetSessionObject()->getVariable(d3totp::TOTP_SESSION_VARNAME) + && !$this->d3GetSessionObject()->getVariable(d3totp::TOTP_SESSION_VARNAME) ) { return false; } diff --git a/src/Modules/Application/Model/d3_totp_user.php b/src/Modules/Application/Model/d3_totp_user.php index deccb0d..faf9d53 100644 --- a/src/Modules/Application/Model/d3_totp_user.php +++ b/src/Modules/Application/Model/d3_totp_user.php @@ -11,11 +11,11 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Application\Model; use D3\Totp\Application\Model\d3totp; -use Doctrine\DBAL\DBALException; -use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Registry; use OxidEsales\Eshop\Core\Session; diff --git a/src/Modules/Core/d3_totp_utils.php b/src/Modules/Core/d3_totp_utils.php index f78a274..51bc889 100644 --- a/src/Modules/Core/d3_totp_utils.php +++ b/src/Modules/Core/d3_totp_utils.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Modules\Core; use D3\Totp\Application\Model\d3totp; @@ -43,7 +45,7 @@ class d3_totp_utils extends d3_totp_utils_parent && $blAuth && $totp->isActive() === false ) { - $this->redirect('index.php?cl=d3force_2fa', true, 302); + $this->redirect('index.php?cl=d3force_2fa'); if (false == defined('OXID_PHP_UNIT')) { // @codeCoverageIgnoreStart exit; @@ -53,7 +55,7 @@ class d3_totp_utils extends d3_totp_utils_parent //staten der prüfung vom einmalpasswort if ($blAuth && $totp->isActive() && false === $totpAuth) { - $this->redirect('index.php?cl=login', true, 302); + $this->redirect('index.php?cl=login'); if (false == defined('OXID_PHP_UNIT')) { // @codeCoverageIgnoreStart exit; diff --git a/src/Setup/Events.php b/src/Setup/Events.php index e99ef1e..e680fe1 100644 --- a/src/Setup/Events.php +++ b/src/Setup/Events.php @@ -11,32 +11,27 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + namespace D3\Totp\Setup; -use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException; -use D3\ModCfg\Application\Model\Install\d3install; -use Doctrine\DBAL\DBALException; +use OxidEsales\Eshop\Core\DatabaseProvider; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; -use OxidEsales\Eshop\Core\Exception\StandardException; -use OxidEsales\Eshop\Core\Exception\SystemComponentException; class Events { /** - * @codeCoverageIgnore - * @throws d3ShopCompatibilityAdapterException - * @throws DBALException + * @return void * @throws DatabaseConnectionException * @throws DatabaseErrorException - * @throws StandardException - * @throws SystemComponentException */ - public static function onActivate() + public static function onActivate(): void { - if (class_exists(d3install::class)) { - d3install::checkUpdateStart(); - } + self::addTotpTable(); + self::addTotpBackupCodesTable(); + self::addSeoItem1(); + self::addSeoItem2(); } /** @@ -45,4 +40,94 @@ class Events public static function onDeactivate() { } + + /** + * @return void + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public static function addTotpTable(): void + { + $query = "CREATE TABLE IF NOT EXISTS `d3totp` ( + `OXID` CHAR(32) NOT NULL , + `OXUSERID` CHAR(32) NOT NULL , + `USETOTP` TINYINT(1) NOT NULL DEFAULT 0, + `SEED` VARCHAR(256) NOT NULL , + `OXTIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Timestamp', + PRIMARY KEY (`OXID`) , + UNIQUE KEY `OXUSERID` (`OXUSERID`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='totp setting';"; + + DatabaseProvider::getDb()->execute( $query ); + } + + /** + * @return void + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public static function addTotpBackupCodesTable(): void + { + $query = "CREATE TABLE IF NOT EXISTS `d3totp_backupcodes` ( + `OXID` CHAR(32) NOT NULL , + `OXUSERID` CHAR(32) NOT NULL COMMENT 'user id', + `BACKUPCODE` VARCHAR(64) NOT NULL COMMENT 'BackupCode', + `OXTIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Timestamp', + PRIMARY KEY (`OXID`) , + KEY `OXUSERID` (`OXUSERID`) , + KEY `BACKUPCODE` (`BACKUPCODE`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='totp backup codes';"; + + DatabaseProvider::getDb()->execute( $query ); + } + + /** + * @return void + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public static function addSeoItem1(): void + { + if (!DatabaseProvider::getDb()->getOne('SELECT 1 FROM oxseo WHERE oxident = "76282e134ad4e40a3578e121a6cb1f6a"')) { + $query = "INSERT INTO `oxseo` + ( + `OXOBJECTID`, `OXIDENT`, `OXSHOPID`, + `OXLANG`, `OXSTDURL`, `OXSEOURL`, + `OXTYPE`, `OXFIXED`, `OXEXPIRED`, + `OXPARAMS`, `OXTIMESTAMP` + ) VALUES ( + '39f744f17e974988e515558698a29df4', '76282e134ad4e40a3578e121a6cb1f6a', 1, + 1, 'index.php?cl=d3_account_totp', 'en/2-factor-authintication/', + 'static', 0, 0, + '', NOW() + );"; + + DatabaseProvider::getDb()->execute( $query ); + } + } + + /** + * @return void + * @throws DatabaseConnectionException + * @throws DatabaseErrorException + */ + public static function addSeoItem2(): void + { + if (!DatabaseProvider::getDb()->getOne('SELECT 1 FROM oxseo WHERE oxident = "c1f8b5506e2b5d6ac184dcc5ebdfb591"')) { + $query = "INSERT INTO `oxseo` + ( + `OXOBJECTID`, `OXIDENT`, `OXSHOPID`, + `OXLANG`, `OXSTDURL`, `OXSEOURL`, + `OXTYPE`, `OXFIXED`, `OXEXPIRED`, + `OXPARAMS`, `OXTIMESTAMP` + ) VALUES ( + '39f744f17e974988e515558698a29df4', 'c1f8b5506e2b5d6ac184dcc5ebdfb591', 1, + 0, 'index.php?cl=d3_account_totp', '2-faktor-authentisierung/', + 'static', 0, 0, + '', NOW() + );"; + + DatabaseProvider::getDb()->execute( $query ); + } + } } \ No newline at end of file diff --git a/src/metadata.php b/src/metadata.php index 231d0db..e580f04 100644 --- a/src/metadata.php +++ b/src/metadata.php @@ -11,6 +11,8 @@ * @link https://www.oxidmodule.com */ +declare(strict_types=1); + use D3\Totp\Application\Controller\Admin\d3user_totp; use D3\Totp\Application\Controller\Admin\d3force_2fa; use D3\Totp\Application\Controller\d3_account_totp; @@ -23,7 +25,6 @@ use D3\Totp\Modules\Application\Controller\d3_totp_UserController; use D3\Totp\Modules\Application\Model\d3_totp_user; use D3\Totp\Modules\Core\d3_totp_utils; use D3\Totp\Setup as ModuleSetup; -use D3\ModCfg\Application\Model\d3utils; use OxidEsales\Eshop\Application\Component\UserComponent; use OxidEsales\Eshop\Application\Controller\Admin\LoginController; use OxidEsales\Eshop\Application\Controller\OrderController; @@ -35,7 +36,7 @@ use OxidEsales\Eshop\Application\Model as OxidModel; /** * Metadata version */ -$sMetadataVersion = '2.0'; +$sMetadataVersion = '2.1'; $sModuleId = 'd3totp'; $logo = '(D3)'; @@ -46,18 +47,17 @@ $logo = '(D3)getMock(d3totp::class, array( - 'loadByUserId', - 'isActive', - ), array(), '', false); + /** @var d3totp|MockObject $oTotpMock */ + $oTotpMock = $this->getMockBuilder(d3totp::class) + ->onlyMethods([ + 'loadByUserId', + 'isActive', + ]) + ->disableOriginalConstructor() + ->getMock(); $oTotpMock->method('loadByUserId')->willReturn(true); $oTotpMock->method('isActive')->willReturn(false); - /** @var d3_totp_utils|PHPUnit_Framework_MockObject_MockObject $oCoreMock */ - $oCoreMock = $this->getMock(Utils::class, array( - 'd3GetTotpObject', - 'd3GetUtilsObject' - )); + /** @var d3_totp_utils|MockObject $oCoreMock */ + $oCoreMock = $this->getMockBuilder(Utils::class) + ->onlyMethods(['d3GetTotpObject']) + ->getMock(); $oCoreMock->method('d3GetTotpObject')->willReturn($oTotpMock); - $oCoreMock->expects($this->never())->method('d3GetUtilsObject'); $this->_oCoreClass = $oCoreMock; @@ -83,22 +84,25 @@ class d3_totp_utilsTest extends d3TotpUnitTestCase { Registry::getSession()->setVariable("auth", 'foo'); - /** @var d3totp|PHPUnit_Framework_MockObject_MockObject $oTotpMock */ - $oTotpMock = $this->getMock(d3totp::class, array( - 'loadByUserId', - 'isActive', - ), array(), '', false); + /** @var d3totp|MockObject $oTotpMock */ + $oTotpMock = $this->getMockBuilder(d3totp::class) + ->onlyMethods([ + 'loadByUserId', + 'isActive' + ]) + ->disableOriginalConstructor() + ->getMock(); $oTotpMock->method('loadByUserId')->willReturn(true); $oTotpMock->method('isActive')->willReturn(false); - /** @var d3_totp_utils|PHPUnit_Framework_MockObject_MockObject $oCoreMock */ - $oCoreMock = $this->getMock(Utils::class, array( - 'd3GetTotpObject', - 'd3GetUtilsObject', - 'fetchRightsForUser' - )); + /** @var d3_totp_utils|MockObject $oCoreMock */ + $oCoreMock = $this->getMockBuilder(Utils::class) + ->onlyMethods([ + 'd3GetTotpObject', + 'fetchRightsForUser' + ]) + ->getMock(); $oCoreMock->method('d3GetTotpObject')->willReturn($oTotpMock); - $oCoreMock->expects($this->never())->method('d3GetUtilsObject'); $oCoreMock->method('fetchRightsForUser')->willReturn('malladmin'); $this->_oCoreClass = $oCoreMock; @@ -116,27 +120,32 @@ class d3_totp_utilsTest extends d3TotpUnitTestCase { Registry::getSession()->setVariable("auth", 'foo'); - /** @var Session|PHPUnit_Framework_MockObject_MockObject $oSessionMock */ - $oSessionMock = $this->getMock(Session::class, array( - 'getVariable', - )); + /** @var Session|MockObject $oSessionMock */ + $oSessionMock = $this->getMockBuilder(Session::class) + ->onlyMethods(['getVariable']) + ->getMock(); $oSessionMock->method('getVariable')->will($this->onConsecutiveCalls('foo', true)); - /** @var d3totp|PHPUnit_Framework_MockObject_MockObject $oTotpMock */ - $oTotpMock = $this->getMock(d3totp::class, array( - 'loadByUserId', - 'isActive', - ), array(), '', false); + /** @var d3totp|MockObject $oTotpMock */ + $oTotpMock = $this->getMockBuilder(d3totp::class) + ->onlyMethods([ + 'loadByUserId', + 'isActive' + ]) + ->disableOriginalConstructor() + ->getMock(); $oTotpMock->method('loadByUserId')->willReturn(true); $oTotpMock->method('isActive')->willReturn(true); - /** @var d3_totp_utils|PHPUnit_Framework_MockObject_MockObject $oCoreMock */ - $oCoreMock = $this->getMock(Utils::class, array( - 'd3GetTotpObject', - 'd3GetSessionObject', - 'fetchRightsForUser', - 'redirect' - )); + /** @var d3_totp_utils|MockObject $oCoreMock */ + $oCoreMock = $this->getMockBuilder(Utils::class) + ->onlyMethods([ + 'd3GetTotpObject', + 'd3GetSessionObject', + 'fetchRightsForUser', + 'redirect' + ]) + ->getMock(); $oCoreMock->method('d3GetTotpObject')->willReturn($oTotpMock); $oCoreMock->method('d3GetSessionObject')->willReturn($oSessionMock); $oCoreMock->method('fetchRightsForUser')->willReturn('malladmin'); @@ -157,33 +166,38 @@ class d3_totp_utilsTest extends d3TotpUnitTestCase { Registry::getSession()->setVariable("auth", 'foo'); - /** @var Session|PHPUnit_Framework_MockObject_MockObject $oSessionMock */ - $oSessionMock = $this->getMock(Session::class, array( - 'getVariable', - )); + /** @var Session|MockObject $oSessionMock */ + $oSessionMock = $this->getMockBuilder(Session::class) + ->onlyMethods(['getVariable']) + ->getMock(); $oSessionMock->method('getVariable')->will($this->onConsecutiveCalls('foo', false)); - /** @var Session|PHPUnit_Framework_MockObject_MockObject $oSessionMock */ - $oSessionMock = $this->getMock(Session::class, array( - 'getVariable', - )); + /** @var Session|MockObject $oSessionMock */ + $oSessionMock = $this->getMockBuilder(Session::class) + ->onlyMethods(['getVariable']) + ->getMock(); $oSessionMock->method('getVariable')->will($this->onConsecutiveCalls('foo', false)); - /** @var d3totp|PHPUnit_Framework_MockObject_MockObject $oTotpMock */ - $oTotpMock = $this->getMock(d3totp::class, array( - 'loadByUserId', - 'isActive', - ), array(), '', false); + /** @var d3totp|MockObject $oTotpMock */ + $oTotpMock = $this->getMockBuilder(d3totp::class) + ->onlyMethods([ + 'loadByUserId', + 'isActive', + ]) + ->disableOriginalConstructor() + ->getMock(); $oTotpMock->method('loadByUserId')->willReturn(true); $oTotpMock->method('isActive')->willReturn(true); - /** @var d3_totp_utils|PHPUnit_Framework_MockObject_MockObject $oCoreMock */ - $oCoreMock = $this->getMock(Utils::class, array( - 'd3GetTotpObject', - 'd3GetSessionObject', - 'fetchRightsForUser', - 'redirect' - )); + /** @var d3_totp_utils|MockObject $oCoreMock */ + $oCoreMock = $this->getMockBuilder(Utils::class) + ->onlyMethods([ + 'd3GetTotpObject', + 'd3GetSessionObject', + 'fetchRightsForUser', + 'redirect' + ]) + ->getMock(); $oCoreMock->method('d3GetTotpObject')->willReturn($oTotpMock); $oCoreMock->method('d3GetSessionObject')->willReturn($oSessionMock); $oCoreMock->method('fetchRightsForUser')->willReturn('malladmin');