Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 5 additions & 14 deletions config/app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,11 @@ knpu_oauth2_client:
redirect_route: 'connect_admin_microsoft_check'
redirect_params: {}

#TODO: a faire dans le plugin
sylius_resource:
resources:
app.authorized_domain:
classes:
model: Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain
repository: Synolia\SyliusAdminOauthPlugin\Repository\AuthorizedDomainRepository
form: Synolia\SyliusAdminOauthPlugin\Form\Type\AuthorizedDomainType

winzou_state_machine:
app_authorized_domain:
class: "%app.model.authorized_domain.class%"
synolia_admin_oauth_authorized_domain:
class: "%synolia_admin_oauth.model.authorized_domain.class%"
property_path: isEnabled
graph: app_authorized_domain
graph: synolia_admin_oauth_authorized_domain
state_machine_class: "%sylius.state_machine.class%"
states:
new: ~
Expand All @@ -55,10 +46,10 @@ winzou_state_machine:
to: enabled
sylius_grid:
grids:
app_admin_authorized_domain:
synolia_admin_oauth_authorized_domain:
driver:
options:
class: Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain
class: "%synolia_admin_oauth.model.authorized_domain.class%"
sorting:
name: asc
isEnabled: asc
Expand Down
11 changes: 6 additions & 5 deletions config/routes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@ controllers:
namespace: Synolia\SyliusAdminOauthPlugin\Controller
type: attribute

app_admin_authorized_domain:
synolia_admin_oauth_authorized_domain:
resource: |
alias: app.authorized_domain
alias: synolia_admin_oauth.authorized_domain
section: admin
templates: "@SyliusAdmin\\Crud"
redirect: index
grid: app_admin_authorized_domain
grid: synolia_admin_oauth_authorized_domain
vars:
all:
header: app.ui.authorized_domains_title
subheader: app.ui.authorized_domains_subheader
header: synolia.sylius_admin_oauth.ui.authorized_domains.title
subheader: synolia.sylius_admin_oauth.ui.authorized_domains.subheader
breadcrumb: synolia.sylius_admin_oauth.ui.authorized_domains.menu_label
index:
icon: 'file image outline'
type: sylius.resource
1 change: 1 addition & 0 deletions dev/phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ parameters:
- ../vendor/autoload.php
excludePaths:
- '../src/DependencyInjection/Configuration.php'
- '../src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php'
- '../src/Factory/AdminUserFactory.php'
ignoreErrors:
- identifier: missingType.iterableValue
Expand Down
52 changes: 51 additions & 1 deletion src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,63 @@

namespace Synolia\SyliusAdminOauthPlugin\DependencyInjection;

use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
use Sylius\Component\Resource\Factory\Factory;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain;
use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomainInterface;
use Synolia\SyliusAdminOauthPlugin\Form\Type\AuthorizedDomainType;
use Synolia\SyliusAdminOauthPlugin\Repository\AuthorizedDomainRepository;

final class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder(): TreeBuilder
{
return new TreeBuilder('synolia_sylius_admin_oauth_plugin');
$treeBuilder = new TreeBuilder('synolia_sylius_admin_oauth_plugin');
$rootNode = $treeBuilder->getRootNode();
$rootNode
->addDefaultsIfNotSet()
->children()
->scalarNode('driver')
->defaultValue(SyliusResourceBundle::DRIVER_DOCTRINE_ORM)
->end()
->end()
;

$this->addResourceSection($rootNode);

return $treeBuilder;
}

private function addResourceSection(ArrayNodeDefinition $node): void
{
$node
->children()
->arrayNode('resources')
->addDefaultsIfNotSet()
->children()
->arrayNode('authorized_domain')
->addDefaultsIfNotSet()
->children()
->arrayNode('classes')
->addDefaultsIfNotSet()
->children()
->scalarNode('model')->defaultValue(AuthorizedDomain::class)->cannotBeEmpty()->end()
->scalarNode('interface')->defaultValue(AuthorizedDomainInterface::class)->cannotBeEmpty()->end()
->scalarNode('controller')->defaultValue(ResourceController::class)->end()
->scalarNode('repository')->defaultValue(AuthorizedDomainRepository::class)->cannotBeEmpty()->end()
->scalarNode('factory')->defaultValue(Factory::class)->end()
->scalarNode('form')->defaultValue(AuthorizedDomainType::class)->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end()
;
}
}
9 changes: 9 additions & 0 deletions src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain;

final class SynoliaSyliusAdminOauthExtension extends AbstractResourceExtension implements PrependExtensionInterface
{
Expand All @@ -20,12 +21,20 @@ final class SynoliaSyliusAdminOauthExtension extends AbstractResourceExtension i
*/
public function load(array $configs, ContainerBuilder $container): void
{
$config = $this->processConfiguration(new Configuration(), $configs);
$this->registerResources(
'synolia_admin_oauth',
$config['driver'],
$config['resources'],
$container
);
$loader = new YamlFileLoader($container, new FileLocator(\dirname(__DIR__, 2) . '/config'));
$loader->load('services.yaml');
}

public function prepend(ContainerBuilder $container): void
{
$container->setParameter('synolia_admin_oauth.model.authorized_domain.class', AuthorizedDomain::class);
$this->prependDoctrineMigrations($container);
}

Expand Down
6 changes: 3 additions & 3 deletions src/Entity/Domain/AuthorizedDomain.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ class AuthorizedDomain implements ResourceInterface
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: Types::INTEGER)]
private int $id;
private ?int $id = null;

#[ORM\Column(type: Types::STRING, nullable: false)]
private string $name;

#[ORM\Column(name: 'is_enabled', type: Types::BOOLEAN)]
private bool $isEnabled = false;

public function getId(): int
public function getId(): ?int
{
return $this->id;
}
Expand All @@ -51,7 +51,7 @@ public function setName(string $name): self
return $this;
}

public function setIsEnabled(bool $isEnabled): self
public function setEnabled(bool $isEnabled): self
{
$this->isEnabled = $isEnabled;

Expand Down
19 changes: 19 additions & 0 deletions src/Entity/Domain/AuthorizedDomainInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace Synolia\SyliusAdminOauthPlugin\Entity\Domain;

use Sylius\Component\Resource\Model\ResourceInterface;
use Sylius\Component\Resource\Model\ToggleableInterface;

interface AuthorizedDomainInterface extends ResourceInterface, ToggleableInterface
{
public function getId(): int;

public function setId(int $id): self;

public function getName(): string;

public function setName(string $name): self;
}
4 changes: 2 additions & 2 deletions src/Factory/OauthClientFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static function createGoogleOauthClient(string $googleClientId): OauthCli
'google_admin',
'connect_admin_google_check',
'google',
'sylius.google_authentication.authentication_failure'
'synolia.sylius_admin_oauth.google_authentication.authentication_failure'
);
}

Expand All @@ -44,7 +44,7 @@ public static function createMicrosoftOauthClient(string $microsoftClientId): Oa
'azure_admin',
'connect_admin_microsoft_check',
'microsoft',
'sylius.microsoft_authentication.authentication_failure'
'synolia.sylius_admin_oauth.microsoft_authentication.authentication_failure'
);
}
}
8 changes: 4 additions & 4 deletions src/Form/Type/AuthorizedDomainType.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class, [
'label' => 'app.form.authorized_domains.name',
'label' => 'synolia.sylius_admin_oauth.form.authorized_domains.name',
])
->add('isEnabled', CheckboxType::class, [
'label' => 'app.form.authorized_domains.authorize',
->add('enabled', CheckboxType::class, [
'label' => 'synolia.sylius_admin_oauth.form.authorized_domains.authorize',
])
;
}

public function getBlockPrefix(): string
{
return 'authorized_domain';
return 'synolia_admin_oauth_authorized_domain';
}
}
4 changes: 2 additions & 2 deletions src/Listener/Menu/AdminMenuListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public function addAdminMenuItems(MenuBuilderEvent $event): void
$newSubmenu = $menu->getChild('configuration');

$newSubmenu
?->addChild('authorized_domain', ['route' => 'app_admin_authorized_domain_index'])
->setLabel('sylius.ui.admin.menu.oauth_submenu_label')
?->addChild('authorized_domain', ['route' => 'synolia_admin_oauth_admin_authorized_domain_index'])
->setLabel('synolia.sylius_admin_oauth.ui.admin.menu.oauth_submenu_label')
->setLabelAttribute('icon', 'cube')
;
}
Expand Down
6 changes: 6 additions & 0 deletions src/Repository/AuthorizedDomainRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Synolia\SyliusAdminOauthPlugin\Repository;

use Doctrine\ORM\EntityManagerInterface;
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain;

Expand All @@ -15,6 +16,11 @@
*/
final class AuthorizedDomainRepository extends EntityRepository
{
public function __construct(EntityManagerInterface $entityManager)
{
parent::__construct($entityManager, $entityManager->getClassMetadata(AuthorizedDomain::class));
}

public function save(AuthorizedDomain $entity, bool $flush = false): void
{
$this->getEntityManager()->persist($entity);
Expand Down
6 changes: 3 additions & 3 deletions src/Security/Authenticator/OauthAuthenticator.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ public function authenticate(Request $request): Passport
new UserBadge($accessToken->getToken(), function () use ($user) {
Assert::isInstanceOf($this->oauthClient, OauthClient::class);
$domains = $this->authorizedDomainRepository->findBy(['isEnabled' => true]);
// If there's no domains, login with plugin is disabled...
// If there are no domains, login with plugin is disabled...
if (0 === \count($domains)) {
$translatedMessage = $this->translator->trans('sylius.oauth_authentication.no_configured_domain');
$translatedMessage = $this->translator->trans('synolia.sylius_admin_oauth.oauth_authentication.no_configured_domain');
throw new AuthenticationException($translatedMessage);
}
// ...else connect compared to authorized domains
Expand All @@ -91,7 +91,7 @@ public function authenticate(Request $request): Passport
return $this->createOauthUserIfDomainCorrespond($user, $domain);
}
}
$translatedMessage = $this->translator->trans('sylius.oauth_authentication.domain_error');
$translatedMessage = $this->translator->trans('synolia.sylius_admin_oauth.oauth_authentication.domain_error');
throw new AuthenticationException($translatedMessage);
})
);
Expand Down
8 changes: 1 addition & 7 deletions templates/state.html.twig
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
{% if data == 1 %}
{% set data = 'true_label' %}
{% else %}
{% set data = 'false_label' %}
{% endif %}

{% set value = 'sylius.ui.' ~ data %}
{% set value = 'synolia.sylius_admin_oauth.ui.' ~ (data is same as true ? 'yes' : 'no') %}

{% if options.vars.labels is defined %}
{% include [(options.vars.labels ~ '/' ~ data ~ '.html.twig'), '@SyliusUi/Label/_default.html.twig'] with {'value': value} %}
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPUnit/AccessToAdminAreaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public function testAccessOAuthConfigPageInAdmin(): void
{
/** @var UrlGeneratorInterface $urlGenerator */
$urlGenerator = self::getContainer()->get(UrlGeneratorInterface::class);
$url = $urlGenerator->generate('app_admin_authorized_domain_index');
$url = $urlGenerator->generate('synolia_admin_oauth_admin_authorized_domain_index');

$this->adminLogin();
$this->client->request('GET', $url);
Expand Down
Empty file removed translations/flashes.en.yaml
Empty file.
Empty file removed translations/flashes.fr.yaml
Empty file.
56 changes: 29 additions & 27 deletions translations/messages.en.yaml
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
sylius:
oauth_authentication:
no_configured_domain: There is no configured domain to connect with
domain_error: Impossible to connect, try again
google_authentication:
login_button: Sign in with google account.
domain_error: Impossible to connect, try again.
authentication_failure: Impossible to connect, try again.
ui:
true_label: yes
false_label: no
is_enabled: Enabled
admin:
menu:
oauth_submenu_label: Oauth authorized domains
authentication:
admin:
microsoft_login_button_label: Sign in with Microsoft

app.ui.authorized_domains_title: Oauth authorized domains
app.ui.authorized_domains.menu_label: Oauth Domain
app.ui.authorized_domains_subheader: Oauth domain connexion management
app.ui.new_authorized_domain: New Oauth domain connexion

app.form.authorized_domains:
name: Name
authorize: Authorized
synolia:
sylius_admin_oauth:
oauth_authentication:
no_configured_domain: There is no configured domain to connect with
domain_error: Impossible to connect, try again
google_authentication:
login_button: Sign in with google account.
domain_error: Impossible to connect, try again.
authentication_failure: Impossible to login with Google, try again.
microsoft_authentication:
authentication_failure: Impossible to login with Microsoft, try again.
ui:
authorized_domains:
menu_label: Oauth Domain
title: Oauth authorized domains
subheader: Oauth domain connexion management
yes: Yes
no: No
is_enabled: Enabled
admin:
menu:
oauth_submenu_label: Oauth authorized domains
authentication:
admin:
microsoft_login_button_label: Sign in with Microsoft
form:
authorized_domains:
name: Name
authorize: Authorized
Loading