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 = '';
@@ -46,18 +47,17 @@ $logo = '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');