Skip to content

Commit e9e8cdd

Browse files
OXDEV-9919 Implement login links for providers
1 parent b5b4960 commit e9e8cdd

17 files changed

Lines changed: 183 additions & 4 deletions

File tree

assets/out/src/css/providers.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.sign-in-providers {
2+
padding: 10px 0;
3+
}
4+
5+
.card-body {
6+
.sign-in-providers {
7+
text-align: center;
8+
}
9+
}

src/Authentication/OAuth2/Service/ModuleSettingsService.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public function isFacebookActive(): bool
2929
return $this->moduleSettingService->getBoolean(self::FACEBOOK_ACTIVE, Module::MODULE_ID);
3030
}
3131

32+
public function saveFacebookEnabled(bool $value): void
33+
{
34+
$this->moduleSettingService->saveBoolean(self::FACEBOOK_ACTIVE, $value, Module::MODULE_ID);
35+
}
36+
3237
public function getFacebookClientId(): string
3338
{
3439
return $this->getStringValue(self::FACEBOOK_CLIENT_ID);

src/Authentication/OAuth2/Service/Provider/Facebook/Facebook.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public function __construct(
2727
) {
2828
}
2929

30+
public function isActive(): bool
31+
{
32+
return $this->moduleSettings->isFacebookActive();
33+
}
34+
3035
public function getName(): string
3136
{
3237
return 'facebook';

src/Authentication/OAuth2/Service/Provider/ProviderInterface.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ interface ProviderInterface
1313
*/
1414
public function getName(): string;
1515

16+
/**
17+
* Check if the provider is active/enabled.
18+
*/
19+
public function isActive(): bool;
20+
1621
/**
1722
* Get the underlying OAuth2 client (League provider instance).
1823
*/

src/Shared/Core/ViewConfig.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
namespace OxidEsales\SecurityModule\Shared\Core;
1111

12+
use OxidEsales\SecurityModule\Authentication\OAuth2\Service\ProviderCollectorInterface;
1213
use OxidEsales\SecurityModule\Captcha\Captcha\Image\Service\ImageCaptchaService;
1314
use OxidEsales\SecurityModule\Captcha\Service\CaptchaServiceInterface;
1415
use OxidEsales\SecurityModule\PasswordPolicy\Service\ModuleSettingsServiceInterface as PasswordSettingsServiceInterface;
@@ -50,4 +51,11 @@ public function getImage(): string
5051

5152
return 'data:image/jpeg;base64,' . base64_encode($images[ImageCaptchaService::CAPTCHA_NAME]);
5253
}
54+
55+
public function getActiveProviders(): iterable
56+
{
57+
$providers = $this->getService(ProviderCollectorInterface::class)->getProviders();
58+
59+
return array_filter($providers, fn($provider) => $provider->isActive());
60+
}
5361
}

tests/Codeception/Acceptance/BaseCest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
use Codeception\Util\Fixtures;
1313
use OxidEsales\EshopCommunity\Core\Di\ContainerFacade;
14+
use OxidEsales\SecurityModule\Authentication\OAuth2\Service\ModuleSettingsServiceInterface
15+
as OAuthModuleSettingsServiceInterface;
1416
use OxidEsales\SecurityModule\Captcha\Service\ModuleSettingsServiceInterface as CaptchaSettingsServiceInterface;
1517
use OxidEsales\SecurityModule\PasswordPolicy\Service\ModuleSettingsServiceInterface as PasswordSettingsServiceInterface;
1618

@@ -35,4 +37,10 @@ protected function setCaptchaState(bool $state)
3537
{
3638
ContainerFacade::get(CaptchaSettingsServiceInterface::class)->saveIsCaptchaEnabled($state);
3739
}
40+
41+
protected function setProviderState(bool $state)
42+
{
43+
ContainerFacade::get(OAuthModuleSettingsServiceInterface::class)
44+
->saveFacebookEnabled($state);
45+
}
3846
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
/**
4+
* Copyright © OXID eSales AG. All rights reserved.
5+
* See LICENSE file for license details.
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace OxidEsales\SecurityModule\Tests\Codeception\Acceptance;
11+
12+
use OxidEsales\Codeception\Page\Account\UserLogin;
13+
use OxidEsales\Codeception\Step\Basket;
14+
use OxidEsales\SecurityModule\Tests\Codeception\Support\AcceptanceTester;
15+
16+
/**
17+
* @group oe_security_module
18+
* @group oe_security_module_providers_visibility
19+
*/
20+
class ProvidersVisibilityCest extends BaseCest
21+
{
22+
public function _before(AcceptanceTester $I): void
23+
{
24+
$this->setProviderState(false);
25+
}
26+
27+
//todo: add % to link to check all providers individually
28+
private $providerLink =
29+
'//div[contains(@class, "sign-in-providers")]' .
30+
'//div[@class="provider"]' .
31+
'//a[contains(@href, "cl=oauth&fnc=redirect&provider=")]';
32+
33+
public function testProvidersVisibilityOnHeaderLogin(AcceptanceTester $I): void
34+
{
35+
$homePage = $I->openShop();
36+
$homePage->openAccountMenu();
37+
$I->dontSeeElement($this->providerLink);
38+
39+
$this->setProviderState(true);
40+
$homePage = $I->openShop();
41+
$homePage->openAccountMenu();
42+
$I->assertGreaterOrEquals(1, count($I->grabMultiple($this->providerLink)));
43+
}
44+
45+
public function testProvidersVisibilityOnMyAccountLogin(AcceptanceTester $I): void
46+
{
47+
$userLoginPage = new UserLogin($I);
48+
$I->amOnPage($userLoginPage->URL);
49+
$I->dontSeeElement($this->providerLink);
50+
51+
$this->setProviderState(true);
52+
$userLoginPage = new UserLogin($I);
53+
$I->amOnPage($userLoginPage->URL);
54+
$I->assertGreaterOrEquals(1, count($I->grabMultiple($this->providerLink)));
55+
}
56+
57+
public function testProviderVisibilityOnCheckoutPage(AcceptanceTester $I): void
58+
{
59+
$basket = new Basket($I);
60+
$basket->addProductToBasketAndOpenUserCheckout('1000', 1);
61+
$I->waitForElementNotVisible($this->providerLink);
62+
63+
$this->setProviderState(true);
64+
$basket = new Basket($I);
65+
$basket->addProductToBasketAndOpenUserCheckout('1000', 1);
66+
$I->waitForElementNotVisible($this->providerLink);
67+
$I->assertGreaterOrEquals(1, count($I->grabMultiple($this->providerLink)));
68+
}
69+
70+
public function testProviderVisibilityOnCheckoutWithoutAccount(AcceptanceTester $I): void
71+
{
72+
$basket = new Basket($I);
73+
$basket
74+
->addProductToBasketAndOpenUserCheckout('1000', 1)
75+
->selectOptionNoRegistration();
76+
$I->waitForElementNotVisible($this->providerLink);
77+
78+
$this->setProviderState(true);
79+
$basket
80+
->addProductToBasketAndOpenUserCheckout('1000', 1)
81+
->selectOptionNoRegistration();
82+
$I->waitForElementNotVisible($this->providerLink);
83+
$I->assertGreaterOrEquals(1, count($I->grabMultiple($this->providerLink)));
84+
}
85+
86+
public function testProviderVisibilityOnCheckoutWithNewAccount(AcceptanceTester $I): void
87+
{
88+
$basket = new Basket($I);
89+
$basket
90+
->addProductToBasketAndOpenUserCheckout('1000', 1)
91+
->selectOptionRegisterNewAccount();
92+
$I->waitForElementNotVisible($this->providerLink);
93+
94+
$this->setProviderState(true);
95+
$basket
96+
->addProductToBasketAndOpenUserCheckout('1000', 1)
97+
->selectOptionRegisterNewAccount();
98+
$I->waitForElementNotVisible($this->providerLink);
99+
$I->assertGreaterOrEquals(1, count($I->grabMultiple($this->providerLink)));
100+
}
101+
}

translations/de/oesecuritymodule_lang.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,7 @@
3838
'ERROR_PASSWORD_STRENGTH_3' => "Stark",
3939
'ERROR_PASSWORD_STRENGTH_4' => "Sehr Stark",
4040

41-
'GENERATE_STRONG_PASSWORD' => 'Starkes Passwort generieren'
41+
'GENERATE_STRONG_PASSWORD' => 'Starkes Passwort generieren',
42+
43+
'SIGN_IN_PROVIDER' => 'Sign in with %s',
4244
];

translations/en/oesecuritymodule_lang.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,7 @@
3838
'ERROR_PASSWORD_STRENGTH_3' => "Strong",
3939
'ERROR_PASSWORD_STRENGTH_4' => "Very strong",
4040

41-
'GENERATE_STRONG_PASSWORD' => 'Generate Strong Password'
41+
'GENERATE_STRONG_PASSWORD' => 'Generate Strong Password',
42+
43+
'SIGN_IN_PROVIDER' => 'Sign in with %s',
4244
];

views/admin_twig/de/oesecuritymodule_lang.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
'SHOP_MODULE_oeSecurityCaptchaLifeTime_30min' => '30 min',
2929

3030
'SHOP_MODULE_GROUP_oauth' => 'OAuth2',
31-
'SHOP_MODULE_oeSecurityFacebookEnable' => 'Enable OAuth2',
31+
'SHOP_MODULE_oeSecurityFacebookEnable' => 'Enable Facebook OAuth2 login',
3232
'SHOP_MODULE_oeSecurityFacebookClientId' => 'Facebook client id',
3333
'SHOP_MODULE_oeSecurityFacebookSecret' => 'Facebook secret',
3434
'SHOP_MODULE_oeSecurityFacebookRedirectUrl' => 'Facebook redirect url',

0 commit comments

Comments
 (0)