From b0da721a5238ece3056ae7af760e9455f7af3e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Mon, 3 Oct 2016 21:39:01 +0200 Subject: Changed relation between API client and refresh token Fix #2350 --- src/Wallabag/ApiBundle/Entity/Client.php | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 3e2f491c..92b2f762 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -25,6 +25,11 @@ class Client extends BaseClient */ protected $name; + /** + * @ORM\OneToMany(targetEntity="RefreshToken", mappedBy="client", cascade={"remove"}) + */ + protected $refreshTokens; + public function __construct() { parent::__construct(); -- cgit v1.2.3 From f0abc22d09d2e38d3dd408425821a89da3d21377 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 7 Oct 2016 20:37:01 +0200 Subject: Ability to check multiple urls in API --- .../Controller/WallabagRestController.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index a0d9d4f3..6dd03c1b 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -27,7 +27,8 @@ class WallabagRestController extends FOSRestController * * @ApiDoc( * parameters={ - * {"name"="url", "dataType"="string", "required"=true, "format"="An url", "description"="Url to check if it exists"} + * {"name"="url", "dataType"="string", "required"=true, "format"="An url", "description"="Url to check if it exists"}, + * {"name"="urls", "dataType"="string", "required"=false, "format"="An array of urls (?urls[]=http...&urls[]=http...)", "description"="Urls (as an array) to check if it exists"} * } * ) * @@ -37,6 +38,25 @@ class WallabagRestController extends FOSRestController { $this->validateAuthentication(); + $urls = $request->query->get('urls', []); + + // handle multiple urls first + if (!empty($urls)) { + $results = []; + foreach ($urls as $url) { + $res = $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->findByUrlAndUserId($url, $this->getUser()->getId()); + + $results[$url] = false === $res ? false : true; + } + + $json = $this->get('serializer')->serialize($results, 'json'); + + return (new JsonResponse())->setJson($json); + } + + // let's see if it is a simple url? $url = $request->query->get('url', ''); if (empty($url)) { -- cgit v1.2.3 From ac8cf632bb3a225c1b69d16e714ff60a2e988c89 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 7 Oct 2016 23:31:53 +0200 Subject: Ensure orphan tag are remove in API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the association between a tag and an entry is removed, if the tag doesn’t have other entries, we can remove it. Also add more tests for that part and ensure TagControllerTest is isolated from the rest of the test suite (finally!) --- .../Controller/WallabagRestController.php | 28 ++++++++++++++++++++++ .../CoreBundle/Controller/TagController.php | 6 +++-- .../CoreBundle/Resources/config/services.yml | 2 +- 3 files changed, 33 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index a0d9d4f3..cc6923a0 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -400,6 +400,8 @@ class WallabagRestController extends FOSRestController ->getRepository('WallabagCoreBundle:Entry') ->removeTag($this->getUser()->getId(), $tag); + $this->cleanOrphanTag($tag); + $json = $this->get('serializer')->serialize($tag, 'json'); return (new JsonResponse())->setJson($json); @@ -440,6 +442,8 @@ class WallabagRestController extends FOSRestController ->getRepository('WallabagCoreBundle:Entry') ->removeTags($this->getUser()->getId(), $tags); + $this->cleanOrphanTag($tags); + $json = $this->get('serializer')->serialize($tags, 'json'); return (new JsonResponse())->setJson($json); @@ -464,6 +468,8 @@ class WallabagRestController extends FOSRestController ->getRepository('WallabagCoreBundle:Entry') ->removeTag($this->getUser()->getId(), $tag); + $this->cleanOrphanTag($tag); + $json = $this->get('serializer')->serialize($tag, 'json'); return (new JsonResponse())->setJson($json); @@ -485,6 +491,28 @@ class WallabagRestController extends FOSRestController return (new JsonResponse())->setJson($json); } + /** + * Remove orphan tag in case no entries are associated to it. + * + * @param Tag|array $tags + */ + private function cleanOrphanTag($tags) + { + if (!is_array($tags)) { + $tags = [$tags]; + } + + $em = $this->getDoctrine()->getManager(); + + foreach ($tags as $tag) { + if (count($tag->getEntries()) === 0) { + $em->remove($tag); + } + } + + $em->flush(); + } + /** * Validate that the first id is equal to the second one. * If not, throw exception. It means a user try to access information from an other user. diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index 623a6146..c5746734 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php @@ -63,10 +63,12 @@ class TagController extends Controller $entry->removeTag($tag); $em = $this->getDoctrine()->getManager(); $em->flush(); - if (count($tag->getEntries()) == 0) { + + // remove orphan tag in case no entries are associated to it + if (count($tag->getEntries()) === 0) { $em->remove($tag); + $em->flush(); } - $em->flush(); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer')); diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml index fb97454e..a4b727f4 100644 --- a/src/Wallabag/CoreBundle/Resources/config/services.yml +++ b/src/Wallabag/CoreBundle/Resources/config/services.yml @@ -29,7 +29,7 @@ services: arguments: - "@doctrine" - wallabag_core.table_prefix_subscriber: + wallabag_core.subscriber.table_prefix: class: Wallabag\CoreBundle\Subscriber\TablePrefixSubscriber arguments: - "%database_table_prefix%" -- cgit v1.2.3 From ee32248f43baef7e995c9e420cd00a137e626cf0 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sat, 8 Oct 2016 00:02:22 +0200 Subject: Ensure access_token are removed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When we remove the client, we should ensure that access_token are also removed. To ensure that, I created a test that generated an access_token. So when we remove the client, this association should be cascaded and shouldn’t generate an error. Also I moved some Api related stuff to the ApiBundle (like the developer controler and ClientType form) --- .../ApiBundle/Controller/DeveloperController.php | 101 +++++++++++++++++++++ src/Wallabag/ApiBundle/Entity/Client.php | 5 + src/Wallabag/ApiBundle/Form/Type/ClientType.php | 46 ++++++++++ .../CoreBundle/Controller/DeveloperController.php | 101 --------------------- src/Wallabag/CoreBundle/Form/Type/ClientType.php | 46 ---------- 5 files changed, 152 insertions(+), 147 deletions(-) create mode 100644 src/Wallabag/ApiBundle/Controller/DeveloperController.php create mode 100644 src/Wallabag/ApiBundle/Form/Type/ClientType.php delete mode 100644 src/Wallabag/CoreBundle/Controller/DeveloperController.php delete mode 100644 src/Wallabag/CoreBundle/Form/Type/ClientType.php (limited to 'src') diff --git a/src/Wallabag/ApiBundle/Controller/DeveloperController.php b/src/Wallabag/ApiBundle/Controller/DeveloperController.php new file mode 100644 index 00000000..5a36a260 --- /dev/null +++ b/src/Wallabag/ApiBundle/Controller/DeveloperController.php @@ -0,0 +1,101 @@ +getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll(); + + return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [ + 'clients' => $clients, + ]); + } + + /** + * Create a client (an app). + * + * @param Request $request + * + * @Route("/developer/client/create", name="developer_create_client") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function createClientAction(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $client = new Client(); + $clientForm = $this->createForm(ClientType::class, $client); + $clientForm->handleRequest($request); + + if ($clientForm->isValid()) { + $client->setAllowedGrantTypes(['token', 'authorization_code', 'password', 'refresh_token']); + $em->persist($client); + $em->flush(); + + $this->get('session')->getFlashBag()->add( + 'notice', + $this->get('translator')->trans('flashes.developer.notice.client_created', ['%name%' => $client->getName()]) + ); + + return $this->render('@WallabagCore/themes/common/Developer/client_parameters.html.twig', [ + 'client_id' => $client->getPublicId(), + 'client_secret' => $client->getSecret(), + 'client_name' => $client->getName(), + ]); + } + + return $this->render('@WallabagCore/themes/common/Developer/client.html.twig', [ + 'form' => $clientForm->createView(), + ]); + } + + /** + * Remove a client. + * + * @param Client $client + * + * @Route("/developer/client/delete/{id}", requirements={"id" = "\d+"}, name="developer_delete_client") + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function deleteClientAction(Client $client) + { + $em = $this->getDoctrine()->getManager(); + $em->remove($client); + $em->flush(); + + $this->get('session')->getFlashBag()->add( + 'notice', + $this->get('translator')->trans('flashes.developer.notice.client_deleted', ['%name%' => $client->getName()]) + ); + + return $this->redirect($this->generateUrl('developer')); + } + + /** + * Display developer how to use an existing app. + * + * @Route("/developer/howto/first-app", name="developer_howto_firstapp") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function howtoFirstAppAction() + { + return $this->render('@WallabagCore/themes/common/Developer/howto_app.html.twig'); + } +} diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 92b2f762..f7898ac8 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -30,6 +30,11 @@ class Client extends BaseClient */ protected $refreshTokens; + /** + * @ORM\OneToMany(targetEntity="AccessToken", mappedBy="client", cascade={"remove"}) + */ + protected $accessTokens; + public function __construct() { parent::__construct(); diff --git a/src/Wallabag/ApiBundle/Form/Type/ClientType.php b/src/Wallabag/ApiBundle/Form/Type/ClientType.php new file mode 100644 index 00000000..0ea1a9c5 --- /dev/null +++ b/src/Wallabag/ApiBundle/Form/Type/ClientType.php @@ -0,0 +1,46 @@ +add('name', TextType::class, ['label' => 'developer.client.form.name_label']) + ->add('redirect_uris', UrlType::class, ['required' => false, 'label' => 'developer.client.form.redirect_uris_label']) + ->add('save', SubmitType::class, ['label' => 'developer.client.form.save_label']) + ; + + $builder->get('redirect_uris') + ->addModelTransformer(new CallbackTransformer( + function ($originalUri) { + return $originalUri; + }, + function ($submittedUri) { + return [$submittedUri]; + } + )) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'Wallabag\ApiBundle\Entity\Client', + ]); + } + + public function getBlockPrefix() + { + return 'client'; + } +} diff --git a/src/Wallabag/CoreBundle/Controller/DeveloperController.php b/src/Wallabag/CoreBundle/Controller/DeveloperController.php deleted file mode 100644 index f3492b74..00000000 --- a/src/Wallabag/CoreBundle/Controller/DeveloperController.php +++ /dev/null @@ -1,101 +0,0 @@ -getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll(); - - return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [ - 'clients' => $clients, - ]); - } - - /** - * Create a client (an app). - * - * @param Request $request - * - * @Route("/developer/client/create", name="developer_create_client") - * - * @return \Symfony\Component\HttpFoundation\Response - */ - public function createClientAction(Request $request) - { - $em = $this->getDoctrine()->getManager(); - $client = new Client(); - $clientForm = $this->createForm(ClientType::class, $client); - $clientForm->handleRequest($request); - - if ($clientForm->isValid()) { - $client->setAllowedGrantTypes(['token', 'authorization_code', 'password', 'refresh_token']); - $em->persist($client); - $em->flush(); - - $this->get('session')->getFlashBag()->add( - 'notice', - $this->get('translator')->trans('flashes.developer.notice.client_created', ['%name%' => $client->getName()]) - ); - - return $this->render('@WallabagCore/themes/common/Developer/client_parameters.html.twig', [ - 'client_id' => $client->getPublicId(), - 'client_secret' => $client->getSecret(), - 'client_name' => $client->getName(), - ]); - } - - return $this->render('@WallabagCore/themes/common/Developer/client.html.twig', [ - 'form' => $clientForm->createView(), - ]); - } - - /** - * Remove a client. - * - * @param Client $client - * - * @Route("/developer/client/delete/{id}", requirements={"id" = "\d+"}, name="developer_delete_client") - * - * @return \Symfony\Component\HttpFoundation\RedirectResponse - */ - public function deleteClientAction(Client $client) - { - $em = $this->getDoctrine()->getManager(); - $em->remove($client); - $em->flush(); - - $this->get('session')->getFlashBag()->add( - 'notice', - $this->get('translator')->trans('flashes.developer.notice.client_deleted', ['%name%' => $client->getName()]) - ); - - return $this->redirect($this->generateUrl('developer')); - } - - /** - * Display developer how to use an existing app. - * - * @Route("/developer/howto/first-app", name="developer_howto_firstapp") - * - * @return \Symfony\Component\HttpFoundation\Response - */ - public function howtoFirstAppAction() - { - return $this->render('@WallabagCore/themes/common/Developer/howto_app.html.twig'); - } -} diff --git a/src/Wallabag/CoreBundle/Form/Type/ClientType.php b/src/Wallabag/CoreBundle/Form/Type/ClientType.php deleted file mode 100644 index d1fa94e6..00000000 --- a/src/Wallabag/CoreBundle/Form/Type/ClientType.php +++ /dev/null @@ -1,46 +0,0 @@ -add('name', TextType::class, ['label' => 'developer.client.form.name_label']) - ->add('redirect_uris', UrlType::class, ['required' => false, 'label' => 'developer.client.form.redirect_uris_label']) - ->add('save', SubmitType::class, ['label' => 'developer.client.form.save_label']) - ; - - $builder->get('redirect_uris') - ->addModelTransformer(new CallbackTransformer( - function ($originalUri) { - return $originalUri; - }, - function ($submittedUri) { - return [$submittedUri]; - } - )) - ; - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'Wallabag\ApiBundle\Entity\Client', - ]); - } - - public function getBlockPrefix() - { - return 'client'; - } -} -- cgit v1.2.3 From c5e4293efdff9c32d9b37865ae127c8f99f7020e Mon Sep 17 00:00:00 2001 From: Krzysztof Szafranek Date: Sun, 9 Oct 2016 03:37:21 +0200 Subject: Fix few invalid HTML tags --- .../CoreBundle/Resources/views/themes/material/Entry/entries.html.twig | 2 +- .../CoreBundle/Resources/views/themes/material/Entry/entry.html.twig | 2 +- .../CoreBundle/Resources/views/themes/material/layout.html.twig | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig index 55b3ee5c..919f94ec 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig @@ -77,7 +77,7 @@
{{ entry.domainName|removeWww|truncate(18) }} - +
  • diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig index 1ddb5a15..5188eb01 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig @@ -225,7 +225,7 @@ link {{ entry.domainName|removeWww }} - comment {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }} + comment {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}
    {% for tag in entry.tags %}
    diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig index c7d6d70d..de0049d3 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig @@ -73,7 +73,7 @@ {{ 'menu.left.howto'|trans }}
  • - {{ 'menu.left.logout'|trans }} + {{ 'menu.left.logout'|trans }}