Move account disconnecting from oauth account to external account

master
Lars Vierbergen 7 years ago
parent eefabdf53d
commit d2ec4db516
  1. 56
      Controller/ConnectController.php
  2. 17
      ExternalAccount/ExternalAccountProviderInterface.php
  3. 9
      ExternalAccount/NullExternalAccountProvider.php
  4. 4
      Resources/config/routing.yml
  5. 27
      Resources/views/Connect/disconnect_service.html.twig
  6. 2
      Resources/views/Profile/external_accounts.html.twig

@ -0,0 +1,56 @@
<?php
/**
* Authserver, an OAuth2-based single-signon authentication provider written in PHP.
*
* Copyright (C) $today.date Lars Vierbergen
*
* his program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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()
]);
}
}

@ -17,52 +17,65 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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
*/

@ -17,16 +17,15 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;
}
}

@ -0,0 +1,4 @@
vierbergenlars_external_account_disconnect:
path: /usr/external/disconnect/{externalUser}
defaults:
_controller: AuthserverExternalAccountBundle:Connect:disconnectService

@ -0,0 +1,27 @@
{% extends '::base.html.twig' %}
{% block title %}{{ parent() }} - Disconnect Account{% endblock %}
{% block body %}
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Disconnecting</h3>
</div>
<div class="panel-body">
<p>Are you sure you want to disconnect your {{ externalAccountProvider.serviceName }} account "{{ externalUser.providerFriendlyName }}"?</p>
<p>
{{ form_start(form) }}
{{ form_widget(form) }}
<div>
<button type="submit" class="btn btn-primary">Disconnect account</button>
<a href="{{ path('user_profile') }}" class="btn btn-link">Cancel</a>
</div>
{{ form_end(form) }}
</p>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

@ -27,7 +27,7 @@
<p>
Connected to {{ externalUser.providerFriendlyName }}
{% if currentProvider.hasDisconnect() %}
<a href="{{ url('vierbergenlars_oauth_account_disconnect', {externalUser: externalUser.id}) }}" class="btn btn-link btn-sm">{{ icon('chain-broken') }} Disconnect account</a>
<a href="{{ url('vierbergenlars_external_account_disconnect', {externalUser: externalUser.id}) }}" class="btn btn-link btn-sm">{{ icon('chain-broken') }} Disconnect account</a>
{% endif %}
</p>
{% endfor %}