mirror of
https://github.com/wallabag/wallabag.git
synced 2024-11-26 11:01:04 +00:00
Merge pull request #2499 from wallabag/add-relation-client-user
Added relation between API Client and User
This commit is contained in:
commit
5feef9f7a4
6 changed files with 110 additions and 7 deletions
45
app/DoctrineMigrations/Version20161024212538.php
Normal file
45
app/DoctrineMigrations/Version20161024212538.php
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace Application\Migrations;
|
||||
|
||||
use Doctrine\DBAL\Migrations\AbstractMigration;
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
class Version20161024212538 extends AbstractMigration implements ContainerAwareInterface
|
||||
{
|
||||
/**
|
||||
* @var ContainerInterface
|
||||
*/
|
||||
private $container;
|
||||
|
||||
public function setContainer(ContainerInterface $container = null)
|
||||
{
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
private function getTable($tableName)
|
||||
{
|
||||
return $this->container->getParameter('database_table_prefix') . $tableName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $schema
|
||||
*/
|
||||
public function up(Schema $schema)
|
||||
{
|
||||
$this->skipIf($this->connection->getDatabasePlatform()->getName() == 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
|
||||
|
||||
$this->addSql('ALTER TABLE '.$this->getTable('oauth2_clients').' ADD user_id INT(11) DEFAULT NULL');
|
||||
$this->addSql('ALTER TABLE '.$this->getTable('oauth2_clients').' ADD CONSTRAINT FK_clients_user_clients FOREIGN KEY (user_id) REFERENCES '.$this->getTable('user').' (id) ON DELETE CASCADE');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Schema $schema
|
||||
*/
|
||||
public function down(Schema $schema)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@ class DeveloperController extends Controller
|
|||
*/
|
||||
public function indexAction()
|
||||
{
|
||||
$clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll();
|
||||
$clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findByUser($this->getUser()->getId());
|
||||
|
||||
return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [
|
||||
'clients' => $clients,
|
||||
|
@ -38,7 +38,7 @@ class DeveloperController extends Controller
|
|||
public function createClientAction(Request $request)
|
||||
{
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$client = new Client();
|
||||
$client = new Client($this->getUser());
|
||||
$clientForm = $this->createForm(ClientType::class, $client);
|
||||
$clientForm->handleRequest($request);
|
||||
|
||||
|
@ -75,6 +75,10 @@ class DeveloperController extends Controller
|
|||
*/
|
||||
public function deleteClientAction(Client $client)
|
||||
{
|
||||
if (null === $this->getUser() || $client->getUser()->getId() != $this->getUser()->getId()) {
|
||||
throw $this->createAccessDeniedException('You can not access this client.');
|
||||
}
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em->remove($client);
|
||||
$em->flush();
|
||||
|
|
|
@ -4,6 +4,7 @@ namespace Wallabag\ApiBundle\Entity;
|
|||
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use FOS\OAuthServerBundle\Entity\Client as BaseClient;
|
||||
use Wallabag\UserBundle\Entity\User;
|
||||
|
||||
/**
|
||||
* @ORM\Table("oauth2_clients")
|
||||
|
@ -35,9 +36,15 @@ class Client extends BaseClient
|
|||
*/
|
||||
protected $accessTokens;
|
||||
|
||||
public function __construct()
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="clients")
|
||||
*/
|
||||
private $user;
|
||||
|
||||
public function __construct(User $user)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -63,4 +70,12 @@ class Client extends BaseClient
|
|||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return User
|
||||
*/
|
||||
public function getUser()
|
||||
{
|
||||
return $this->user;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ use JMS\Serializer\Annotation\ExclusionPolicy;
|
|||
use JMS\Serializer\Annotation\Expose;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
use Wallabag\ApiBundle\Entity\Client;
|
||||
use Wallabag\CoreBundle\Entity\Config;
|
||||
use Wallabag\CoreBundle\Entity\Entry;
|
||||
|
||||
|
@ -84,6 +85,11 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
|
|||
*/
|
||||
private $trusted;
|
||||
|
||||
/**
|
||||
* @ORM\OneToMany(targetEntity="Wallabag\ApiBundle\Entity\Client", mappedBy="user", cascade={"remove"})
|
||||
*/
|
||||
protected $clients;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
@ -240,4 +246,24 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Client $client
|
||||
*
|
||||
* @return User
|
||||
*/
|
||||
public function addClient(Client $client)
|
||||
{
|
||||
$this->clients[] = $client;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ArrayCollection<Entry>
|
||||
*/
|
||||
public function getClients()
|
||||
{
|
||||
return $this->clients;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ class AnnotationControllerTest extends WallabagAnnotationTestCase
|
|||
/**
|
||||
* This data provider allow to tests annotation from the :
|
||||
* - API POV (when user use the api to manage annotations)
|
||||
* - and User POV (when user use the web interface - using javascript - to manage annotations)
|
||||
* - and User POV (when user use the web interface - using javascript - to manage annotations).
|
||||
*/
|
||||
public function dataForEachAnnotations()
|
||||
{
|
||||
|
|
|
@ -82,11 +82,24 @@ class DeveloperControllerTest extends WallabagCoreTestCase
|
|||
|
||||
public function testRemoveClient()
|
||||
{
|
||||
$this->logInAs('admin');
|
||||
$client = $this->getClient();
|
||||
$em = $client->getContainer()->get('doctrine.orm.entity_manager');
|
||||
$nbClients = $em->getRepository('WallabagApiBundle:Client')->findAll();
|
||||
|
||||
// Try to remove an admin's client with a wrong user
|
||||
$this->logInAs('bob');
|
||||
$client->request('GET', '/developer');
|
||||
$this->assertContains('no_client', $client->getResponse()->getContent());
|
||||
|
||||
// get an ID of a admin's client
|
||||
$this->logInAs('admin');
|
||||
$nbClients = $em->getRepository('WallabagApiBundle:Client')->findByUser($this->getLoggedInUserId());
|
||||
|
||||
$this->logInAs('bob');
|
||||
$client->request('GET', '/developer/client/delete/'.$nbClients[0]->getId());
|
||||
$this->assertEquals(403, $client->getResponse()->getStatusCode());
|
||||
|
||||
// Try to remove the admin's client with the good user
|
||||
$this->logInAs('admin');
|
||||
$crawler = $client->request('GET', '/developer');
|
||||
|
||||
$link = $crawler
|
||||
|
@ -98,7 +111,7 @@ class DeveloperControllerTest extends WallabagCoreTestCase
|
|||
$client->click($link);
|
||||
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||
|
||||
$newNbClients = $em->getRepository('WallabagApiBundle:Client')->findAll();
|
||||
$newNbClients = $em->getRepository('WallabagApiBundle:Client')->findByUser($this->getLoggedInUserId());
|
||||
$this->assertGreaterThan(count($newNbClients), count($nbClients));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue