diff --git a/Controller/ConnectController.php b/Controller/ConnectController.php new file mode 100644 index 0000000..31f9497 --- /dev/null +++ b/Controller/ConnectController.php @@ -0,0 +1,56 @@ +. + */ +namespace vierbergenlars\AuthserverExternalAccountBundle\Controller; + +use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use Symfony\Component\Form\Extension\Core\Type\FormType; +use Symfony\Component\HttpFoundation\Request; +use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; + +class ConnectController extends Controller +{ + + public function disconnectServiceAction(Request $request, ExternalUser $externalUser) + { + $externalAccountProviderManager = $this->get('vierbergenlars.authserver_external_account.account_provider_manager'); + /* @var $externalAccountProviderManager \vierbergenlars\AuthserverExternalAccountBundle\ExternalAccount\ExternalAccountProviderManager */ + + $externalAccountProvider = $externalAccountProviderManager->getProviderForExternalUser($externalUser); + + if (!$externalAccountProvider->hasDisconnect()) + throw $this->createNotFoundException('This account can not be disconnected.'); + + $form = $this->createForm(FormType::class); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $externalAccountProvider->disconnect($externalUser); + + return $this->redirectToRoute('user_profile'); + } + + return $this->render('AuthserverExternalAccountBundle:Connect:disconnect_service.html.twig', [ + 'externalAccountProvider' => $externalAccountProvider, + 'externalUser' => $externalUser, + 'form' => $form->createView() + ]); + } +} diff --git a/ExternalAccount/ExternalAccountProviderInterface.php b/ExternalAccount/ExternalAccountProviderInterface.php index 8f2912b..c3c99c4 100644 --- a/ExternalAccount/ExternalAccountProviderInterface.php +++ b/ExternalAccount/ExternalAccountProviderInterface.php @@ -17,52 +17,65 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ - namespace vierbergenlars\AuthserverExternalAccountBundle\ExternalAccount; - use Symfony\Component\Security\Core\User\UserInterface; use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; use vierbergenlars\AuthserverExternalAccountBundle\ValueObject\Button; interface ExternalAccountProviderInterface { + /** + * * @return string */ public function getName(); /** + * * @return string */ public function getServiceName(); /** + * * @return string */ public function getIcon(); /** + * * @return Button */ public function getLoginButton(); /** + * * @return Button */ public function getConnectButton(); /** + * * @return boolean */ public function hasConnect(); /** + * * @return boolean */ public function hasDisconnect(); /** + * + * @param ExternalUser $externalUser + */ + public function disconnect(ExternalUser $externalUser); + + /** + * * @param mixed $externalProviderData * @return boolean */ diff --git a/ExternalAccount/NullExternalAccountProvider.php b/ExternalAccount/NullExternalAccountProvider.php index a1d2b95..ec08f10 100644 --- a/ExternalAccount/NullExternalAccountProvider.php +++ b/ExternalAccount/NullExternalAccountProvider.php @@ -17,16 +17,15 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ - namespace vierbergenlars\AuthserverExternalAccountBundle\ExternalAccount; - use Symfony\Component\Security\Core\User\UserInterface; use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; use vierbergenlars\AuthserverExternalAccountBundle\ValueObject\Button; class NullExternalAccountProvider implements ExternalAccountProviderInterface { + private $name; public function __construct($name) @@ -66,12 +65,14 @@ class NullExternalAccountProvider implements ExternalAccountProviderInterface public function hasDisconnect() { - return true; + return false; } + public function disconnect(ExternalUser $externalUser) + {} + public function supports($externalProviderData) { return false; } - } diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml new file mode 100644 index 0000000..7af6e5b --- /dev/null +++ b/Resources/config/routing.yml @@ -0,0 +1,4 @@ +vierbergenlars_external_account_disconnect: + path: /usr/external/disconnect/{externalUser} + defaults: + _controller: AuthserverExternalAccountBundle:Connect:disconnectService \ No newline at end of file diff --git a/Resources/views/Connect/disconnect_service.html.twig b/Resources/views/Connect/disconnect_service.html.twig new file mode 100644 index 0000000..39be55a --- /dev/null +++ b/Resources/views/Connect/disconnect_service.html.twig @@ -0,0 +1,27 @@ +{% extends '::base.html.twig' %} +{% block title %}{{ parent() }} - Disconnect Account{% endblock %} +{% block body %} +
+
+
+
+
+

Disconnecting

+
+
+

Are you sure you want to disconnect your {{ externalAccountProvider.serviceName }} account "{{ externalUser.providerFriendlyName }}"?

+

+ {{ form_start(form) }} + {{ form_widget(form) }} +

+ + Cancel +
+ {{ form_end(form) }} +

+
+
+
+
+
+{% endblock %} diff --git a/Resources/views/Profile/external_accounts.html.twig b/Resources/views/Profile/external_accounts.html.twig index 0a69202..37be405 100644 --- a/Resources/views/Profile/external_accounts.html.twig +++ b/Resources/views/Profile/external_accounts.html.twig @@ -27,7 +27,7 @@

Connected to {{ externalUser.providerFriendlyName }} {% if currentProvider.hasDisconnect() %} - {{ icon('chain-broken') }} Disconnect account + {{ icon('chain-broken') }} Disconnect account {% endif %}

{% endfor %}