diff --git a/README.md b/README.md new file mode 100644 index 0000000..7cc913c --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# oxtotp (2FA) +Modul für eine 2-Faktor-Authentisierung (2FA) zum Login in Front- und Backend zusätzlich zu Benutzername und Passwort. + +- Authentisierung wird nur bei Benutzerkonten gezeigt, die dieses aktiviert haben - sonst nur Standardanmeldung die Basis der Passwortgenerierung wird für jedes Benutzerkonto individuell angelegt + +- Einrichtung des Zugangs in der Auth-App kann durch scanbaren QR-Code oder kopierbare Zeichenkette erfolgen + +- Validierung der Einmalpassworte und Generierung der QR-Codes werden ausschließlich innerhalb des Shops durchgeführt - keine Kommunikation nach außen nötig + +- statische Backupcodes ermöglichen auch eine (begrenzte) Anmeldung ohne Zugang zum Generierungstool diff --git a/composer.json b/composer.json index eb0ce36..0243b7f 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,12 @@ "email": "info@shopmodule.com", "homepage": "https://www.d3data.de", "role": "Owner" + }, + { + "name": "Tobi Matthaiou", + "email": "tm@loberon.com", + "homepage": "http://www.loberon.de", + "role": "Contributor" } ], "support": { @@ -32,9 +38,10 @@ }, "require": { "php": ">=5.6", - "oxid-esales/oxideshop-metapackage-ce": "~6.0.3 || ~6.1.0 || ~6.2.0", + "ext-xmlwriter": "*", + "oxid-esales/oxideshop-metapackage-ce": "~6.0.3 || ~6.1.0 || ~6.2.0 || ~6.3.0 || ~6.4.0 || ~6.5.0", "spomky-labs/otphp": "^8.3", - "bacon/bacon-qr-code": "^1.0", + "bacon/bacon-qr-code": "^1.0 || ^2.0", "zendframework/zend-math": "^3.2" }, "suggest": { diff --git a/src/Application/Factory/BaconQrCodeFactory.php b/src/Application/Factory/BaconQrCodeFactory.php new file mode 100644 index 0000000..69808fe --- /dev/null +++ b/src/Application/Factory/BaconQrCodeFactory.php @@ -0,0 +1,47 @@ +setHeight($size); + $renderer->setWidth($size); + + return $renderer; + } +} diff --git a/src/Application/Model/d3totp.php b/src/Application/Model/d3totp.php index 4b35a4c..6630bec 100644 --- a/src/Application/Model/d3totp.php +++ b/src/Application/Model/d3totp.php @@ -15,9 +15,9 @@ namespace D3\Totp\Application\Model; -use BaconQrCode\Renderer\Image\Svg; use BaconQrCode\Renderer\RendererInterface; use BaconQrCode\Writer; +use D3\Totp\Application\Factory\BaconQrCodeFactory; use D3\Totp\Application\Model\Exceptions\d3totp_wrongOtpException; use Doctrine\DBAL\DBALException; use OTPHP\TOTP; @@ -177,10 +177,7 @@ class d3totp extends BaseModel */ public function getQrCodeElement() { - $renderer = oxNew(Svg::class); - $renderer->setHeight(200); - $renderer->setWidth(200); - + $renderer = BaconQrCodeFactory::renderer(200); $writer = $this->d3GetWriter($renderer); return $writer->writeString($this->getTotp()->getProvisioningUri()); } diff --git a/src/tests/unit/Application/Model/d3totpTest.php b/src/tests/unit/Application/Model/d3totpTest.php index df22d25..a6fbde7 100644 --- a/src/tests/unit/Application/Model/d3totpTest.php +++ b/src/tests/unit/Application/Model/d3totpTest.php @@ -17,8 +17,8 @@ namespace D3\Totp\tests\unit\Application\Model; -use BaconQrCode\Renderer\Image\Svg; use BaconQrCode\Writer; +use D3\Totp\Application\Factory\BaconQrCodeFactory; use D3\Totp\Application\Model\d3backupcodelist; use D3\Totp\Application\Model\d3totp; use D3\Totp\Application\Model\Exceptions\d3totp_wrongOtpException; @@ -484,7 +484,7 @@ class d3totpTest extends d3TotpUnitTestCase 'getFieldData', )); $oUserMock->method('getFieldData')->willReturn('username'); - + /** @var d3totp|PHPUnit_Framework_MockObject_MockObject $oModelMock */ $oModelMock = $this->getMock(d3totp::class, array( 'getUser', @@ -544,7 +544,7 @@ class d3totpTest extends d3TotpUnitTestCase 'getQrCodeUri' )); $oTotpMock->expects($this->once())->method('getQrCodeUri')->willReturn(true); - + /** @var d3totp|PHPUnit_Framework_MockObject_MockObject $oModelMock */ $oModelMock = $this->getMock(d3totp::class, array( 'getTotp' @@ -562,7 +562,7 @@ class d3totpTest extends d3TotpUnitTestCase */ public function getQrCodeElement() { - $renderer = oxNew(Svg::class); + $renderer = BaconQrCodeFactory::renderer(200); /** @var d3totp|PHPUnit_Framework_MockObject_MockObject $oTotpMock */ $oTotpMock = $this->getMock(d3totp::class, array( @@ -595,14 +595,14 @@ class d3totpTest extends d3TotpUnitTestCase */ public function d3GetWriterReturnsRightInstance() { - $renderer = oxNew(Svg::class); + $renderer = BaconQrCodeFactory::renderer(200);; $this->assertInstanceOf( Writer::class, $this->callMethod($this->_oModel, 'd3GetWriter', [$renderer]) ); } - + /** * @test * @throws ReflectionException @@ -878,4 +878,4 @@ class d3totpTest extends d3TotpUnitTestCase $this->callMethod($this->_oModel, 'delete') ); } -} \ No newline at end of file +}