commit bfb05b2406749643170404ed8ea985c0997ac754 Author: Lars Vierbergen Date: Fri Aug 25 14:59:04 2017 +0200 Initial commit diff --git a/AuthserverExternalAccountBundle.php b/AuthserverExternalAccountBundle.php new file mode 100644 index 0000000..347f404 --- /dev/null +++ b/AuthserverExternalAccountBundle.php @@ -0,0 +1,28 @@ +. + */ + +namespace vierbergenlars\AuthserverExternalAccountBundle; + +use Symfony\Component\HttpKernel\Bundle\Bundle; +use vierbergenlars\AuthserverExternalAccountBundle\DependencyInjection\AuthserverExternalAccountExtension; + +class AuthserverExternalAccountBundle extends Bundle +{ +} diff --git a/DependencyInjection/AuthserverExternalAccountExtension.php b/DependencyInjection/AuthserverExternalAccountExtension.php new file mode 100644 index 0000000..12591cf --- /dev/null +++ b/DependencyInjection/AuthserverExternalAccountExtension.php @@ -0,0 +1,45 @@ +. + */ + +namespace vierbergenlars\AuthserverExternalAccountBundle\DependencyInjection; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Config\FileLocator; +use Symfony\Component\HttpKernel\DependencyInjection\Extension; +use Symfony\Component\DependencyInjection\Loader; + +/** + * This is the class that loads and manages your bundle configuration + * + * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html} + */ +class AuthserverExternalAccountExtension extends Extension +{ + /** + * {@inheritDoc} + */ + public function load(array $configs, ContainerBuilder $container) + { + $servicesDirectory = __DIR__.'/../Resources/config'; + $fileLocator = new FileLocator($servicesDirectory); + $loader = new Loader\XmlFileLoader($container, $fileLocator); + $loader->load('services.xml'); + } +} diff --git a/Entity/ExternalUser.php b/Entity/ExternalUser.php new file mode 100644 index 0000000..a8388cb --- /dev/null +++ b/Entity/ExternalUser.php @@ -0,0 +1,127 @@ +. + */ + +namespace vierbergenlars\AuthserverExternalAccountBundle\Entity; + +use App\Entity\User; +use Doctrine\ORM\Mapping as ORM; +use Gedmo\Mapping\Annotation as Gedmo; + +/** + * @ORM\Entity + * @ORM\Table(name="vierbergenlars_external_account_external_user") + * @Gedmo\Loggable + */ +class ExternalUser +{ + /** + * @ORM\Column(type="integer") + * @ORM\Id + * @ORM\GeneratedValue(strategy="AUTO") + * @var integer + */ + private $id; + + /** + * @ORM\ManyToOne(targetEntity="App\Entity\User", fetch="EAGER") + * @Gedmo\Versioned + * @var User + */ + private $user; + + /** + * @ORM\Column(type="string") + * @Gedmo\Versioned + * @var string + */ + private $provider; + + /** + * @ORM\Column(type="string") + * @Gedmo\Versioned + * @var string + */ + private $provider_ref; + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @return User + */ + public function getUser() + { + return $this->user; + } + + /** + * @param User $user + * @return ExternalUser + */ + public function setUser($user) + { + $this->user = $user; + + return $this; + } + + /** + * @return string + */ + public function getProvider() + { + return $this->provider; + } + + /** + * @param string $provider + * @return ExternalUser + */ + public function setProvider($provider) + { + $this->provider = $provider; + + return $this; + } + + /** + * @return string + */ + public function getProviderRef() + { + return $this->provider_ref; + } + + /** + * @param string $provider_ref + * @return ExternalUser + */ + public function setProviderRef($provider_ref) + { + $this->provider_ref = $provider_ref; + + return $this; + } +} diff --git a/Event/LoginButtonEvent.php b/Event/LoginButtonEvent.php new file mode 100644 index 0000000..78274be --- /dev/null +++ b/Event/LoginButtonEvent.php @@ -0,0 +1,44 @@ +. + */ + +namespace vierbergenlars\AuthserverExternalAccountBundle\Event; + + +use Symfony\Component\EventDispatcher\Event; + +class LoginButtonEvent extends Event +{ + private $buttons = []; + + public function addButton($text, $linkTarget, $style = 'default', $icon = null) + { + $this->buttons[] = [ + 'text' => $text, + 'target' => $linkTarget, + 'style' => $style, + 'icon' => $icon, + ]; + } + + public function getButtons() + { + return $this->buttons; + } +} diff --git a/EventListener/LoginTemplateEventListener.php b/EventListener/LoginTemplateEventListener.php new file mode 100644 index 0000000..65f44ba --- /dev/null +++ b/EventListener/LoginTemplateEventListener.php @@ -0,0 +1,69 @@ +. + */ + +namespace vierbergenlars\AuthserverExternalAccountBundle\EventListener; + + +use App\AppEvents; +use App\Event\TemplateEvent; +use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use vierbergenlars\AuthserverExternalAccountBundle\Event\LoginButtonEvent; +use vierbergenlars\AuthserverExternalAccountBundle\ExternalAccountEvents; + +class LoginTemplateEventListener implements EventSubscriberInterface +{ + /** + * @var EventDispatcherInterface + */ + private $eventDispatcher; + + public function __construct(EventDispatcherInterface $eventDispatcher) + { + + $this->eventDispatcher = $eventDispatcher; + } + + public static function getSubscribedEvents() + { + return [ + AppEvents::LOGIN_VIEW_BODY => ['onLoginViewBody', 1], + ]; + } + + public function onLoginViewBody(TemplateEvent $event) + { + $loginButtonEvent = new LoginButtonEvent(); + $this->eventDispatcher->dispatch(ExternalAccountEvents::LOGIN_BUTTON, $loginButtonEvent); + + $buttons = $loginButtonEvent->getButtons(); + + if(count($buttons) > 0) { + $event->setArgument('hiddenPasswordLogin', true); + $event->addTemplate(new TemplateReference('AuthserverExternalAccountBundle', 'Login', 'buttons', 'html', 'twig'), [ + 'buttons' => $buttons, + ]); + } + + + } + +} diff --git a/ExternalAccountEvents.php b/ExternalAccountEvents.php new file mode 100644 index 0000000..2d24a3d --- /dev/null +++ b/ExternalAccountEvents.php @@ -0,0 +1,31 @@ +. + */ + +namespace vierbergenlars\AuthserverExternalAccountBundle; + + +final class ExternalAccountEvents +{ + const LOGIN_BUTTON = 'vierbergenlars.authserver_external_account.login_button'; + + private function __construct() + { + } +} diff --git a/Resources/config/services.xml b/Resources/config/services.xml new file mode 100644 index 0000000..ebed173 --- /dev/null +++ b/Resources/config/services.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/Resources/migrations/VersionAuthserverExternalAccount20170824135051.php b/Resources/migrations/VersionAuthserverExternalAccount20170824135051.php new file mode 100644 index 0000000..4fe3254 --- /dev/null +++ b/Resources/migrations/VersionAuthserverExternalAccount20170824135051.php @@ -0,0 +1,46 @@ +. + */ + +namespace Application\Migrations; + +use Doctrine\DBAL\Migrations\AbstractMigration; +use Doctrine\DBAL\Schema\Schema; + +class VersionAuthserverExternalAccount20170824135051 extends AbstractMigration +{ + public function up(Schema $schema) + { + $externalUser = $schema->createTable('vierbergenlars_external_account_external_user'); + + $externalUser->addColumn('id', 'integer')->setAutoincrement(true); + $externalUser->addColumn('user_id', 'integer'); + $externalUser->addColumn('provider', 'string'); + $externalUser->addColumn('provider_ref', 'string'); + + $externalUser->setPrimaryKey(['id']); + $externalUser->addForeignKeyConstraint('auth_users', ['user_id'], ['id']); + } + + public function down(Schema $schema) + { + $schema->dropTable('vierbergenlars_external_account_external_user'); + } +} + diff --git a/Resources/views/Login/buttons.html.twig b/Resources/views/Login/buttons.html.twig new file mode 100644 index 0000000..adb842b --- /dev/null +++ b/Resources/views/Login/buttons.html.twig @@ -0,0 +1,10 @@ +
+ {% for button in buttons %} + + {% if icon %} + {{ icon(icon) }} + {% endif %} + {{ button.text }} + + {% endfor %} +
diff --git a/autoload.php b/autoload.php new file mode 100644 index 0000000..c45c137 --- /dev/null +++ b/autoload.php @@ -0,0 +1,26 @@ +. + */ + +$loader = new \Composer\Autoload\ClassLoader; + +$loader->addPsr4('vierbergenlars\\AuthserverExternalAccountBundle\\', __DIR__); + +$loader->register(); +