From 0f8268c93e6210d368f9dcd1900274871a9eacdf Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sun, 30 Apr 2017 09:16:55 +0200 Subject: Add client_credentials as grant_type Therefore, username and password are no longer needed Signed-off-by: Thomas Citharel Allow to have global clients, auth through direct token or auth code and bring scopes Signed-off-by: Thomas Citharel fix review Signed-off-by: Thomas Citharel remove redirect uri requirement on specific clients add back password and depreciate it enforce state Signed-off-by: Thomas Citharel Allow apps to register themselves A handful of changes Signed-off-by: Thomas Citharel change timeout values Signed-off-by: Thomas Citharel set access_token lifetime to 1 year and double for refresh_token Signed-off-by: Thomas Citharel --- .../views/Authorize/authorize.html.twig | 7 + .../views/Authorize/authorize_content.html.twig | 53 + .../static/themes/material/css/various.scss | 27 + app/Resources/static/themes/material/index.js | 6 + app/config/config.yml | 42 +- app/config/routing.yml | 3 + app/config/security.yml | 1 + .../Controller/AnnotationRestController.php | 9 +- .../ApiBundle/Controller/AppsController.php | 189 ++ .../ApiBundle/Controller/DeveloperController.php | 105 - .../ApiBundle/Controller/EntryRestController.php | 23 +- .../ApiBundle/Controller/TagRestController.php | 11 +- src/Wallabag/ApiBundle/Entity/AccessToken.php | 2 +- src/Wallabag/ApiBundle/Entity/Client.php | 87 +- src/Wallabag/ApiBundle/Form/Type/ClientType.php | 20 +- .../ApiBundle/Repository/AccessTokenRepository.php | 18 + .../ApiBundle/Resources/config/services.yml | 6 + .../Resources/translations/messages.da.yml | 99 +- .../Resources/translations/messages.de.yml | 66 +- .../Resources/translations/messages.en.yml | 74 +- .../Resources/translations/messages.es.yml | 66 +- .../Resources/translations/messages.fa.yml | 98 +- .../Resources/translations/messages.fr.yml | 68 +- .../Resources/translations/messages.it.yml | 64 +- .../Resources/translations/messages.oc.yml | 44 +- .../Resources/translations/messages.pl.yml | 66 +- .../Resources/translations/messages.pt.yml | 64 +- .../Resources/translations/messages.ro.yml | 98 +- .../Resources/translations/messages.tr.yml | 96 +- .../views/themes/common/Developer/client.html.twig | 12 +- .../common/Developer/client_parameters.html.twig | 13 +- .../themes/common/Developer/howto_app.html.twig | 63 - .../views/themes/common/Developer/index.html.twig | 142 +- .../views/themes/material/layout.html.twig | 4 +- web/assets/appicons/.gitkeep | 0 web/assets/appicons/Firefox-logo.svg | 429 +++ web/assets/appicons/Logo_Google_Chrome.svg | 2859 ++++++++++++++++++++ web/assets/appicons/android_full.png | Bin 0 -> 4501398 bytes web/assets/appicons/appstore.svg | 129 + web/assets/appicons/browser.png | Bin 0 -> 636214 bytes web/assets/appicons/fdroid.png | Bin 0 -> 15174 bytes web/assets/appicons/google_play.png | Bin 0 -> 13957 bytes web/assets/appicons/iOS_full.png | Bin 0 -> 2555555 bytes web/assets/appicons/ios.png | Bin 0 -> 167727 bytes .../appicons/opera-for-computers_icon_128x128.png | Bin 0 -> 10057 bytes web/assets/appicons/windows.jpeg | Bin 0 -> 124406 bytes web/assets/appicons/windowsstore.png | Bin 0 -> 35862 bytes 47 files changed, 4467 insertions(+), 696 deletions(-) create mode 100644 app/Resources/FOSOAuthServerBundle/views/Authorize/authorize.html.twig create mode 100644 app/Resources/FOSOAuthServerBundle/views/Authorize/authorize_content.html.twig create mode 100644 src/Wallabag/ApiBundle/Controller/AppsController.php delete mode 100644 src/Wallabag/ApiBundle/Controller/DeveloperController.php create mode 100644 src/Wallabag/ApiBundle/Repository/AccessTokenRepository.php create mode 100644 src/Wallabag/ApiBundle/Resources/config/services.yml delete mode 100644 src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/howto_app.html.twig create mode 100644 web/assets/appicons/.gitkeep create mode 100644 web/assets/appicons/Firefox-logo.svg create mode 100644 web/assets/appicons/Logo_Google_Chrome.svg create mode 100644 web/assets/appicons/android_full.png create mode 100644 web/assets/appicons/appstore.svg create mode 100644 web/assets/appicons/browser.png create mode 100644 web/assets/appicons/fdroid.png create mode 100644 web/assets/appicons/google_play.png create mode 100644 web/assets/appicons/iOS_full.png create mode 100644 web/assets/appicons/ios.png create mode 100644 web/assets/appicons/opera-for-computers_icon_128x128.png create mode 100644 web/assets/appicons/windows.jpeg create mode 100644 web/assets/appicons/windowsstore.png diff --git a/app/Resources/FOSOAuthServerBundle/views/Authorize/authorize.html.twig b/app/Resources/FOSOAuthServerBundle/views/Authorize/authorize.html.twig new file mode 100644 index 00000000..42566a05 --- /dev/null +++ b/app/Resources/FOSOAuthServerBundle/views/Authorize/authorize.html.twig @@ -0,0 +1,7 @@ +{% extends "WallabagCoreBundle::layout.html.twig" %} + +{% block title %}{{ 'developer.client.page_title'|trans }}{% endblock %} + +{% block content %} +{% include "FOSOAuthServerBundle:Authorize:authorize_content.html.twig" %} +{% endblock content %} diff --git a/app/Resources/FOSOAuthServerBundle/views/Authorize/authorize_content.html.twig b/app/Resources/FOSOAuthServerBundle/views/Authorize/authorize_content.html.twig new file mode 100644 index 00000000..d7f2dbe0 --- /dev/null +++ b/app/Resources/FOSOAuthServerBundle/views/Authorize/authorize_content.html.twig @@ -0,0 +1,53 @@ +
+
+

A new application would like to connect to your account

+ +
+
+
    +
  • + {% if client.image %} + Client icon + {% endif %} + {{ client.name }} +

    {{ client.description }}

    +
  • +
+ {% set scopes = form.scope.vars.value | split(' ') %} + {# TODO : Fix me when https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/309 is ok #} +
    + {% for scope in scopes %} + {% if scope == 'read' %} +
  • +
    visibilityRead Permission
    +
    {{ client.name }} will be able to access the list and contents of your entries, tags and annotations.
    +
  • + {% endif %} + {% if scope == 'write' %} +
  • +
    editEdit Permission
    +
    {{ client.name }} will be able to edit and manage (including deleting) your entries, tags and annotations.
    +
  • + {% endif %} + {% if scope == 'user' %} +
  • +
    personUser Permission
    +
    {{ client.name }} will be able to manage your user account.
    +
  • + {% endif %} + {% endfor %} +
+
+ {{ form_start(form, {'method': 'POST', 'action': path('fos_oauth_server_authorize'), 'label_attr': {'class': 'fos_oauth_server_authorize'} }) }} + + + {{ form_row(form.client_id) }} + {{ form_row(form.response_type) }} + {{ form_row(form.redirect_uri) }} + {{ form_row(form.state) }} + {{ form_row(form.scope) }} + {{ form_rest(form) }} + +
+
+
diff --git a/app/Resources/static/themes/material/css/various.scss b/app/Resources/static/themes/material/css/various.scss index 7daf40ec..5ff18038 100644 --- a/app/Resources/static/themes/material/css/various.scss +++ b/app/Resources/static/themes/material/css/various.scss @@ -30,3 +30,30 @@ nav .input-field input { .tab { flex: 1; } + +.slider .slides { + background: #00acc1; + + li { + img { + background: no-repeat; + background-size: contain; + background-position: unset; + } + + .icon { + width: auto; + height: 180px; + } + + .icon.browser { + width: auto; + height: 100px; + } + + .caption { + width: 85%; + left: 10%; + } + } +} diff --git a/app/Resources/static/themes/material/index.js b/app/Resources/static/themes/material/index.js index d6afbb8a..74f64f9e 100755 --- a/app/Resources/static/themes/material/index.js +++ b/app/Resources/static/themes/material/index.js @@ -75,4 +75,10 @@ $(document).ready(() => { const scrollPercent = (s / (d - c)) * 100; $('.progress .determinate').css('width', `${scrollPercent}%`); }); + + if ($('.slider')) { + $('.slider').slider({ + height: 500, + }); + } }); diff --git a/app/config/config.yml b/app/config/config.yml index 2bc5e3b3..112fa012 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -35,6 +35,42 @@ framework: http_method_override: true assets: ~ +wallabag_core: + version: 2.2.3 + paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb" + languages: + en: 'English' + fr: 'Français' + de: 'Deutsch' + tr: 'Türkçe' + fa: 'فارسی' + ro: 'Română' + pl: 'Polish' + da: 'Dansk' + es: 'Español' + oc: 'Occitan' + it: 'Italiano' + pt: 'Português' + items_on_page: 12 + theme: material + language: '%locale%' + rss_limit: 50 + reading_speed: 1 + cache_lifetime: 10 + action_mark_as_read: 1 + list_mode: 0 + fetching_error_message_title: 'No title found' + fetching_error_message: | + wallabag can't retrieve contents for this article. Please troubleshoot this issue. + api_limit_mass_actions: 10 + +wallabag_user: + registration_enabled: "%fosuser_registration%" + +wallabag_import: + allow_mimetypes: ['application/octet-stream', 'application/json', 'text/plain', 'text/csv'] + resource_dir: "%kernel.root_dir%/../web/uploads/import" + # Twig Configuration twig: debug: "%kernel.debug%" @@ -194,7 +230,11 @@ fos_oauth_server: service: user_provider: fos_user.user_provider.username_email options: - refresh_token_lifetime: 1209600 + access_token_lifetime: 31536000 + refresh_token_lifetime: 63072000 + supported_scopes: read write user + enforce_state: true + auth_code_lifetime: 60 scheb_two_factor: trusted_computer: diff --git a/app/config/routing.yml b/app/config/routing.yml index 0bd2d130..5d26f944 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -44,6 +44,9 @@ fos_user: fos_oauth_server_token: resource: "@FOSOAuthServerBundle/Resources/config/routing/token.xml" +fos_oauth_server_authorize: + resource: "@FOSOAuthServerBundle/Resources/config/routing/authorize.xml" + craue_config_settings_modify: path: /settings defaults: diff --git a/app/config/security.yml b/app/config/security.yml index ffb1d356..0ce37661 100644 --- a/app/config/security.yml +++ b/app/config/security.yml @@ -57,6 +57,7 @@ security: - { path: ^/api/doc, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/api/version, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/api/user, roles: IS_AUTHENTICATED_ANONYMOUSLY } + - { path: ^/api/apps, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } diff --git a/src/Wallabag/ApiBundle/Controller/AnnotationRestController.php b/src/Wallabag/ApiBundle/Controller/AnnotationRestController.php index 2dd26c07..c524a24c 100644 --- a/src/Wallabag/ApiBundle/Controller/AnnotationRestController.php +++ b/src/Wallabag/ApiBundle/Controller/AnnotationRestController.php @@ -4,6 +4,7 @@ namespace Wallabag\ApiBundle\Controller; use Nelmio\ApiDocBundle\Annotation\ApiDoc; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\JsonResponse; use Wallabag\CoreBundle\Entity\Entry; @@ -21,7 +22,7 @@ class AnnotationRestController extends WallabagRestController * ) * * @param Entry $entry - * + * @Security("has_role('ROLE_READ')") * @return JsonResponse */ public function getAnnotationsAction(Entry $entry) @@ -46,7 +47,7 @@ class AnnotationRestController extends WallabagRestController * * @param Request $request * @param Entry $entry - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function postAnnotationAction(Request $request, Entry $entry) @@ -72,7 +73,7 @@ class AnnotationRestController extends WallabagRestController * * @param Annotation $annotation * @param Request $request - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function putAnnotationAction(Annotation $annotation, Request $request) @@ -97,7 +98,7 @@ class AnnotationRestController extends WallabagRestController * @ParamConverter("annotation", class="WallabagAnnotationBundle:Annotation") * * @param Annotation $annotation - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function deleteAnnotationAction(Annotation $annotation) diff --git a/src/Wallabag/ApiBundle/Controller/AppsController.php b/src/Wallabag/ApiBundle/Controller/AppsController.php new file mode 100644 index 00000000..6ef77667 --- /dev/null +++ b/src/Wallabag/ApiBundle/Controller/AppsController.php @@ -0,0 +1,189 @@ +getDoctrine()->getRepository('WallabagApiBundle:Client')->findByUser($this->getUser()->getId()); + + $apps = $this->getDoctrine()->getRepository('WallabagApiBundle:AccessToken')->findAppsByUser($this->getUser()->getId()); + + return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [ + 'clients' => $clients, + 'apps' => $apps, + ]); + } + + /** + * Create a an app + * + * @param Request $request + * + * @Route("/api/apps", name="apps_create") + * @Method("POST") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function createAppAction(Request $request) + { + $em = $this->getDoctrine()->getManager(); + + $clientName = $request->request->get('client_name'); + $redirectURIs = $request->request->get('redirect_uris'); + $logoURI = $request->request->get('logo_uri'); + $description = $request->request->get('description'); + $appURI = $request->request->get('app_uri'); + $nextRedirect = $request->request->get('uri_redirect_after_creation'); + + if (!$clientName) { + return new JsonResponse([ + 'error' => 'invalid_client_name', + 'error_description' => 'The client name cannot be empty', + ], 400); + } + + if (!$redirectURIs) { + return new JsonResponse([ + 'error' => 'invalid_redirect_uri', + 'error_description' => 'One or more redirect_uri values are invalid', + ], 400); + } + + $redirectURIs = (array) $redirectURIs; + + $client = new Client(); + + $client->setName($clientName); + + $client->setDescription($description); + + $client->setRedirectUris($redirectURIs); + + $client->setImage($logoURI); + $client->setAppUrl($appURI); + + $client->setAllowedGrantTypes(['token', 'refresh_token', 'authorization_code']); + $em->persist($client); + $em->flush(); + + return new JsonResponse([ + 'client_id' => $client->getPublicId(), + 'client_secret' => $client->getSecret(), + 'client_name' => $client->getName(), + 'redirect_uri' => $client->getRedirectUris(), + 'description' => $client->getDescription(), + 'logo_uri' => $client->getImage(), + 'app_uri' => $client->getAppUrl(), + ], 201); + } + + /** + * Create a client (an app). + * + * @param Request $request + * + * @Route("/apps/client/create", name="apps_create_client") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function createClientAction(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $client = new Client($this->getUser()); + $clientForm = $this->createForm(ClientType::class, $client); + $clientForm->handleRequest($request); + + if ($clientForm->isSubmitted() && $clientForm->isValid()) { + $client->setAllowedGrantTypes(['password', 'token', 'refresh_token', 'client_credentials']); // Password is depreciated + $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(), + ]); + } + + /** + * Revoke an access token + * @param $token + * @Route("/api/revoke/{token}", name="apps_revoke_access_token") + * @return JsonResponse + */ + public function removeAccessTokenAction($token) + { + if (false === $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) { + throw new AccessDeniedException(); + } + + $em = $this->getDoctrine()->getManager(); + $accessToken = $em->getRepository('WallabagApiBundle:AccessToken')->findOneBy([ + 'user' => $this->getUser()->getId(), + 'token' => $token + ]); + if ($accessToken) { + $em->remove($accessToken); + $em->flush(); + + return new JsonResponse([], 204); + } + return new JsonResponse([], 404); + } + + /** + * Remove a client. + * + * @param Client $client + * + * @Route("/apps/client/delete/{id}", requirements={"id" = "\d+"}, name="apps_delete_client") + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + 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(); + + $this->get('session')->getFlashBag()->add( + 'notice', + $this->get('translator')->trans('flashes.developer.notice.client_deleted', ['%name%' => $client->getName()]) + ); + + return $this->redirect($this->generateUrl('apps')); + } +} diff --git a/src/Wallabag/ApiBundle/Controller/DeveloperController.php b/src/Wallabag/ApiBundle/Controller/DeveloperController.php deleted file mode 100644 index 9cb1b626..00000000 --- a/src/Wallabag/ApiBundle/Controller/DeveloperController.php +++ /dev/null @@ -1,105 +0,0 @@ -getDoctrine()->getRepository('WallabagApiBundle:Client')->findByUser($this->getUser()->getId()); - - 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($this->getUser()); - $clientForm = $this->createForm(ClientType::class, $client); - $clientForm->handleRequest($request); - - if ($clientForm->isSubmitted() && $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) - { - 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(); - - $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/Controller/EntryRestController.php b/src/Wallabag/ApiBundle/Controller/EntryRestController.php index 768c4fdc..93f1f461 100644 --- a/src/Wallabag/ApiBundle/Controller/EntryRestController.php +++ b/src/Wallabag/ApiBundle/Controller/EntryRestController.php @@ -5,6 +5,7 @@ namespace Wallabag\ApiBundle\Controller; use Hateoas\Configuration\Route; use Hateoas\Representation\Factory\PagerfantaFactory; use Nelmio\ApiDocBundle\Annotation\ApiDoc; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\JsonResponse; @@ -25,7 +26,7 @@ class EntryRestController extends WallabagRestController * {"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"} * } * ) - * + * @Security("has_role('ROLE_READ')") * @return JsonResponse */ public function getEntriesExistsAction(Request $request) @@ -80,7 +81,7 @@ class EntryRestController extends WallabagRestController * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0, all entries by default", "description"="filter by entries with a public link"}, * } * ) - * + * @Security("has_role('ROLE_READ')") * @return JsonResponse */ public function getEntriesAction(Request $request) @@ -143,7 +144,7 @@ class EntryRestController extends WallabagRestController * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} * } * ) - * + * @Security("has_role('ROLE_READ')") * @return JsonResponse */ public function getEntryAction(Entry $entry) @@ -162,7 +163,7 @@ class EntryRestController extends WallabagRestController * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} * } * ) - * + * @Security("has_role('ROLE_READ')") * @return Response */ public function getEntryExportAction(Entry $entry, Request $request) @@ -302,7 +303,7 @@ class EntryRestController extends WallabagRestController * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0", "description"="will generate a public link for the entry"}, * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function postEntriesAction(Request $request) @@ -346,7 +347,7 @@ class EntryRestController extends WallabagRestController * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0", "description"="will generate a public link for the entry"}, * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function patchEntriesAction(Entry $entry, Request $request) @@ -368,7 +369,7 @@ class EntryRestController extends WallabagRestController * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function patchEntriesReloadAction(Entry $entry) @@ -410,7 +411,7 @@ class EntryRestController extends WallabagRestController * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function deleteEntriesAction(Entry $entry) @@ -436,7 +437,7 @@ class EntryRestController extends WallabagRestController * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} * } * ) - * + * @Security("has_role('ROLE_READ')") * @return JsonResponse */ public function getEntriesTagsAction(Entry $entry) @@ -458,7 +459,7 @@ class EntryRestController extends WallabagRestController * {"name"="tags", "dataType"="string", "required"=false, "format"="tag1,tag2,tag3", "description"="a comma-separated list of tags."}, * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function postEntriesTagsAction(Request $request, Entry $entry) @@ -487,7 +488,7 @@ class EntryRestController extends WallabagRestController * {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"} * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function deleteEntriesTagsAction(Entry $entry, Tag $tag) diff --git a/src/Wallabag/ApiBundle/Controller/TagRestController.php b/src/Wallabag/ApiBundle/Controller/TagRestController.php index 354187a0..6f460a2d 100644 --- a/src/Wallabag/ApiBundle/Controller/TagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/TagRestController.php @@ -3,6 +3,7 @@ namespace Wallabag\ApiBundle\Controller; use Nelmio\ApiDocBundle\Annotation\ApiDoc; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\JsonResponse; use Wallabag\CoreBundle\Entity\Entry; @@ -14,7 +15,7 @@ class TagRestController extends WallabagRestController * Retrieve all tags. * * @ApiDoc() - * + * @Security("has_role('ROLE_READ')") * @return JsonResponse */ public function getTagsAction() @@ -38,7 +39,7 @@ class TagRestController extends WallabagRestController * {"name"="tag", "dataType"="string", "required"=true, "requirement"="\w+", "description"="Tag as a string"} * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function deleteTagLabelAction(Request $request) @@ -71,7 +72,7 @@ class TagRestController extends WallabagRestController * {"name"="tags", "dataType"="string", "required"=true, "format"="tag1,tag2", "description"="Tags as strings (comma splitted)"} * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function deleteTagsLabelAction(Request $request) @@ -113,7 +114,7 @@ class TagRestController extends WallabagRestController * {"name"="tag", "dataType"="integer", "requirement"="\w+", "description"="The tag"} * } * ) - * + * @Security("has_role('ROLE_WRITE')") * @return JsonResponse */ public function deleteTagAction(Tag $tag) @@ -133,7 +134,7 @@ class TagRestController extends WallabagRestController /** * Remove orphan tag in case no entries are associated to it. - * + * @Security("has_role('ROLE_WRITE')") * @param Tag|array $tags */ private function cleanOrphanTag($tags) diff --git a/src/Wallabag/ApiBundle/Entity/AccessToken.php b/src/Wallabag/ApiBundle/Entity/AccessToken.php index c09a0c80..a8b46742 100644 --- a/src/Wallabag/ApiBundle/Entity/AccessToken.php +++ b/src/Wallabag/ApiBundle/Entity/AccessToken.php @@ -7,7 +7,7 @@ use FOS\OAuthServerBundle\Entity\AccessToken as BaseAccessToken; /** * @ORM\Table("oauth2_access_tokens") - * @ORM\Entity + * @ORM\Entity(repositoryClass="Wallabag\ApiBundle\Repository\AccessTokenRepository") */ class AccessToken extends BaseAccessToken { diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index c15fd3fa..24444c9f 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -8,6 +8,7 @@ use Wallabag\UserBundle\Entity\User; use JMS\Serializer\Annotation\Groups; use JMS\Serializer\Annotation\SerializedName; use JMS\Serializer\Annotation\VirtualProperty; +use Symfony\Component\Validator\Constraints as Assert; /** * @ORM\Table("oauth2_clients") @@ -51,13 +52,39 @@ class Client extends BaseClient /** * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="clients") + * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true) */ private $user; - public function __construct(User $user) + /** + * @ORM\Column(type="string", nullable=true) + */ + private $image; + + /** + * @ORM\Column(type="string", nullable=true) + */ + private $description; + + /** + * @ORM\Column(type="string", nullable=true) + */ + private $appUrl; + + /** + * @ORM\Column(type="datetime", nullable=true) + */ + private $createdAt; + + /** + * Client constructor. + * @param User|null $user + */ + public function __construct(User $user = null) { parent::__construct(); $this->user = $user; + $this->createdAt = new \DateTime(); } /** @@ -99,6 +126,62 @@ class Client extends BaseClient */ public function getClientId() { - return $this->getId().'_'.$this->getRandomId(); + return $this->getId() . '_' . $this->getRandomId(); + } + + /** + * @return string + */ + public function getImage() + { + return $this->image; + } + + /** + * @param string $image + */ + public function setImage($image) + { + $this->image = $image; + } + + /** + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * @param string $description + */ + public function setDescription($description) + { + $this->description = $description; + } + + /** + * @return string + */ + public function getAppUrl() + { + return $this->appUrl; + } + + /** + * @param string $appUrl + */ + public function setAppUrl($appUrl) + { + $this->appUrl = $appUrl; + } + + /** + * @return \DateTime + */ + public function getCreatedAt() + { + return $this->createdAt; } } diff --git a/src/Wallabag/ApiBundle/Form/Type/ClientType.php b/src/Wallabag/ApiBundle/Form/Type/ClientType.php index eaea4feb..58602d22 100644 --- a/src/Wallabag/ApiBundle/Form/Type/ClientType.php +++ b/src/Wallabag/ApiBundle/Form/Type/ClientType.php @@ -15,24 +15,8 @@ class ClientType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('name', TextType::class, ['label' => 'developer.client.form.name_label']) - ->add('redirect_uris', UrlType::class, [ - 'required' => false, - 'label' => 'developer.client.form.redirect_uris_label', - 'property_path' => 'redirectUris', - ]) - ->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]; - } - )) + ->add('name', TextType::class, ['label' => 'apps.old_client.form.name_label']) + ->add('save', SubmitType::class, ['label' => 'apps.old_client.form.save_label']) ; } diff --git a/src/Wallabag/ApiBundle/Repository/AccessTokenRepository.php b/src/Wallabag/ApiBundle/Repository/AccessTokenRepository.php new file mode 100644 index 00000000..2b8d24df --- /dev/null +++ b/src/Wallabag/ApiBundle/Repository/AccessTokenRepository.php @@ -0,0 +1,18 @@ +createQueryBuilder('a') + ->innerJoin('a.client', 'c') + ->addSelect('c') + ->where('a.user =:userId')->setParameter('userId', $userId); + return $qb->getQuery()->getResult(); + } +} diff --git a/src/Wallabag/ApiBundle/Resources/config/services.yml b/src/Wallabag/ApiBundle/Resources/config/services.yml new file mode 100644 index 00000000..1275107d --- /dev/null +++ b/src/Wallabag/ApiBundle/Resources/config/services.yml @@ -0,0 +1,6 @@ +services: + wallabag_api.accesstoken_repository: + class: Wallabag\ApiBundle\Repository\AccessTokenRepository + factory: [ "@doctrine.orm.default_entity_manager", getRepository ] + arguments: + - WallabagApiBundle:AccessToken diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml index 02dd04f2..adf896ee 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml @@ -156,6 +156,7 @@ config: # and: 'One rule AND another' # matches: 'Tests that a subject is matches a search (case-insensitive).
Example: title matches "football"' # notmatches: 'Tests that a subject is not matches a search (case-insensitive).
Example: title notmatches "football"' + entry: page_titles: # unread: 'Unread entries' @@ -442,55 +443,55 @@ import: # description: 'This importer will import all your Instapaper articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").' # how_to: 'Please select your Pinboard export and click on the below button to upload and import it.' -developer: - # page_title: 'API clients management' - # welcome_message: 'Welcome to the wallabag API' - # documentation: 'Documentation' - # how_to_first_app: 'How to create my first application' - # full_documentation: 'View full API documentation' - # list_methods: 'List API methods' - # clients: - # title: 'Clients' - # create_new: 'Create a new client' - # existing_clients: - # title: 'Existing clients' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # field_uris: 'Redirect URIs' - # field_grant_types: 'Grant type allowed' - # no_client: 'No client yet.' - # remove: - # warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !' - # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." - # action: 'Remove this client' - # client: - # page_title: 'API clients management > New client' - # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' - # form: - # name_label: 'Name of the client' - # redirect_uris_label: 'Redirect URIs' - # save_label: 'Create a new client' - # action_back: 'Back' - # client_parameter: - # page_title: 'API clients management > Client parameters' - # page_description: 'Here are your client parameters.' - # field_name: 'Client name' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # back: 'Back' - # read_howto: 'Read the howto "Create my first application"' - # howto: - # page_title: 'Developer > How to create my first application' - # description: - # paragraph_1: 'The following commands make use of the HTTPie library. Make sure it is installed on your system before using it.' - # paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' - # paragraph_3: 'To create this token, you need to create a new client.' - # paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' - # paragraph_5: 'The API will return a response like this:' - # paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' - # paragraph_7: 'This call will return all the entries for your user.' - # paragraph_8: 'If you want to see all the API endpoints, you can have a look to our API documentation.' - # back: 'Back' +apps: + # page_title: 'Apps' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + #old_clients: + # create_new: 'Create a new client' + # title: 'Old clients (depreciated)' + # list: 'Old clients list' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # no_client: 'No client yet.' + #remove: + # warn_message_1: 'You have the ability to remove the client %name%. This action is IRREVERSIBLE !' + # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." + # action: 'Remove the client %name%' + #old_client: + # page_title: 'Apps > New client' + # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' + # form: + # name_label: 'Name of the client' + # save_label: 'Create a new client' + # action_back: 'Back' + # parameters: + # page_title: 'Apps > Client parameters' + # page_description: 'Here are your client parameters.' + # field_name: 'Client name' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # back: 'Back' + # app: + # created_at: 'Created at: %date%' + # documentation: + # title: 'Documentation' + # full_documentation: 'Full documentation' + # list_methods: 'List API methods' user: # page_title: Users management diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml index f6ccdae0..17b8297f 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml @@ -443,55 +443,55 @@ import: description: 'Dieser Import wird all deine Pinboard Artikel importieren. Auf der Seite Backup (https://pinboard.in/settings/backup) klickst du auf "JSON" in dem Abschnitt "Lesezeichen". Eine JSON Datei wird dann heruntergeladen (z.B. "pinboard_export").' how_to: 'Bitte wähle deinen Pinboard Export aus und klicke den nachfolgenden Button zum Importieren.' -developer: +apps: page_title: 'API-Client-Verwaltung' - welcome_message: 'Willkomen zur wallabag API' - documentation: 'Dokumentation' - how_to_first_app: 'Wie erstelle ich meine erste Anwendung' - full_documentation: 'Komplette API-Dokumentation einsehen' - list_methods: 'Liste der API-Methoden' - clients: - title: 'Clients' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + featured: + # title: 'Featured apps' + list: + # title: 'Authorized apps' + old_clients: create_new: 'Neuen Client erstellen' - existing_clients: title: 'Bestehende Clients' + list: 'Clients' field_id: 'Client-ID' field_secret: 'Client-Secret' - field_uris: 'Weiterleitungs-URIs' - field_grant_types: "Erlaubte grant_types" no_client: 'Bisher kein Client.' remove: warn_message_1: 'Du hast die Möglichkeit, diesen Client zu entfernen. DIESE AKTION IST NICHT WIDERRUFBAR!' warn_message_2: "Wenn du ihn entfernst, hat keine der damit konfigurierten Anwendungen mehr die Möglichkeit, sich in deinen wallabag-Konto anzumelden." action: 'Client entfernen' - client: + old_client: page_title: 'API-Client-Verwaltung > Neuer Client' page_description: 'Du bist dabei, einen neuen Client zu erstellen. Fülle das nachfolgende Feld für die Weiterleitungs-URIs deiner Anwendung aus.' form: name_label: 'Name des Clients' - redirect_uris_label: 'Weiterleitungs-URIs' save_label: 'Neuen Client erstellen' action_back: 'Zurück' - client_parameter: - page_title: 'API-Client-Verwaltung > Client-Parameter' - page_description: 'Dies sind deine Client-Parameter.' - field_name: 'Client Name' - field_id: 'Client-ID' - field_secret: 'Client-Secret' - back: 'Zurück' - read_howto: 'Lese des How-To zu "Wie erstelle ich meine erste Anwendung"' - howto: - page_title: 'API-Client-Verwaltung > Wie erstelle ich meine erste Anwendung' - description: - paragraph_1: 'Die folgenden Befehle machen Gebrauch von der HTTPie-Bibliothek. Stelle sicher, dass sie auf deinem System installiert ist, bevor du fortfährst.' - paragraph_2: 'Du benötigst einen Token, damit deine Anwendung mit der wallabag-API kommunizieren kann.' - paragraph_3: 'Um diesen Token zu erstellen, muss ein neuer Client erstellt werden.' - paragraph_4: 'Nun erstelle deinen Token (ersetze client_id, client_secret, username und password mit deinen Werten):' - paragraph_5: 'Die API wird eine Antwort der folgenden Art zurückgeben:' - paragraph_6: 'Der access_token ist nützlich, um die API aufzurufen. Beispiel:' - paragraph_7: 'Dieser Aufruf wird alle Einträge für den Nutzer zurückgeben.' - paragraph_8: 'Wenn du alle API-Endpunkte sehen willst, werfe einen Blick auf die API-Dokumentation.' - back: 'Zurück' + parameters: + page_title: 'API-Client-Verwaltung > Client-Parameter' + page_description: 'Dies sind deine Client-Parameter.' + field_name: 'Client Name' + field_id: 'Client-ID' + field_secret: 'Client-Secret' + back: 'Zurück' + app: + # created_at: 'Created at: %date%' + documentation: + title: 'Dokumentation' + full_documentation: 'Komplette API-Dokumentation einsehen' + list_methods: 'Liste der API-Methoden' user: page_title: Benutzerverwaltung diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml index 902c3046..c78228e0 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml @@ -25,7 +25,7 @@ menu: internal_settings: 'Internal Settings' import: 'Import' howto: 'How to' - developer: 'API clients management' + apps: 'Apps' logout: 'Logout' about: 'About' search: 'Search' @@ -443,55 +443,55 @@ import: description: 'This importer will import all your Pinboard articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").' how_to: 'Please select your Pinboard export and click on the below button to upload and import it.' -developer: - page_title: 'API clients management' - welcome_message: 'Welcome to the wallabag API' - documentation: 'Documentation' - how_to_first_app: 'How to create my first application' - full_documentation: 'View full API documentation' - list_methods: 'List API methods' - clients: - title: 'Clients' +apps: + page_title: 'Apps' + allow: + title: 'A new application would like to connect to your account' + permissions: + read: + label: 'Read your data' + desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + write: + label: 'Edit your data' + desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + user: + label: 'Edit your user settings' + desc: '%name% will be able to manage your user account.' + featured: + title: 'Featured apps' + list: + title: 'Authorized apps' + old_clients: create_new: 'Create a new client' - existing_clients: - title: 'Existing clients' + title: 'Old clients (depreciated)' + list: 'Old clients list' field_id: 'Client ID' field_secret: 'Client secret' - field_uris: 'Redirect URIs' - field_grant_types: 'Grant type allowed' no_client: 'No client yet.' remove: warn_message_1: 'You have the ability to remove the client %name%. This action is IRREVERSIBLE !' warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." action: 'Remove the client %name%' - client: - page_title: 'API clients management > New client' + old_client: + page_title: 'Apps > New client' page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' form: name_label: 'Name of the client' - redirect_uris_label: 'Redirect URIs (optional)' save_label: 'Create a new client' action_back: 'Back' - client_parameter: - page_title: 'API clients management > Client parameters' - page_description: 'Here are your client parameters.' - field_name: 'Client name' - field_id: 'Client ID' - field_secret: 'Client secret' - back: 'Back' - read_howto: 'Read the howto "Create my first application"' - howto: - page_title: 'API clients management > How to create my first application' - description: - paragraph_1: 'The following commands make use of the HTTPie library. Make sure it is installed on your system before using it.' - paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' - paragraph_3: 'To create this token, you need to create a new client.' - paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' - paragraph_5: 'The API will return a response like this:' - paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' - paragraph_7: 'This call will return all the entries for your user.' - paragraph_8: 'If you want to see all the API endpoints, you can have a look to our API documentation.' - back: 'Back' + parameters: + page_title: 'Apps > Client parameters' + page_description: 'Here are your client parameters.' + field_name: 'Client name' + field_id: 'Client ID' + field_secret: 'Client secret' + back: 'Back' + app: + created_at: 'Created at: %date%' + documentation: + title: 'Documentation' + full_documentation: 'Full documentation' + list_methods: 'List API methods' user: page_title: Users management diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml index afd6a7b1..36dd6016 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml @@ -443,55 +443,55 @@ import: description: 'Importa todos tus artículos de Pinboard. En la página de backup (https://pinboard.in/settings/backup), haz clic en "JSON" en la sección "Marcadores". Obtendrás un archivo JSON llamado "pinboard_export".' how_to: 'Seleccione el archivo exportado de Pinboard y haga clic en el botón para subirlo e importarlo.' -developer: +apps: page_title: 'Gestión de clientes API' - welcome_message: 'Bienvenido al API de wallabag' - documentation: 'Documentación' - how_to_first_app: 'Cómo crear mi primera aplicación' - full_documentation: 'Ver documentación completa del API' - list_methods: 'Lista con los métodos del API' - clients: - title: 'Clientes' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + featured: + # title: 'Featured apps' + list: + # title: 'Authorized apps' + old_clients: create_new: 'Crear un nuevo cliente' - existing_clients: title: 'Clientes existentes' + list: 'Clientes' field_id: 'Identificador del cliente' field_secret: 'Secreto del cliente' - field_uris: 'URIs de redirección' - field_grant_types: 'Permisos concedidos' no_client: 'Todavía no hay clientes.' remove: warn_message_1: 'Tienes permiso para eliminar el cliente %name%. ¡Está acción es IRREVERSIBLE!' warn_message_2: "Si lo eliminas, cada aplicación configurada con ese cliente no podrá autenticarse en wallabag." action: 'Eliminar el cliente %name%' - client: + old_client: page_title: 'Gestión de clientes API > Nuevo cliente' page_description: 'Está a punto de crear un nuevo cliente. Por favor, rellene el campo de abajo con la URI de redirección de su aplicación.' form: name_label: 'Nombre del cliente' - redirect_uris_label: 'URIs de redirección' save_label: 'Crear un nuevo cliente' action_back: 'Volver' - client_parameter: - page_title: 'Gestión de clientes API > Parámetros del cliente' - page_description: 'Aquí están los parámetros del cliente.' - field_name: 'Nombre del cliente' - field_id: 'Identificador del cliente' - field_secret: 'Secreto del cliente' - back: 'Volver' - read_howto: 'Lea la guía "Crear mi primera aplicación"' - howto: - page_title: 'Gestión de clientes API > Cómo crear mi primera aplicación' - description: - paragraph_1: 'Los siguientes comandos hacen uso de la biblioteca HTTPie. Compruebe que está instalada en su sistema antes de usarla.' - paragraph_2: 'Necesitas un token para establecer la comunicación entre una aplicación de terceros y la API de wallabag.' - paragraph_3: 'Para crear este token, necesitas crear un nuevo cliente.' - paragraph_4: 'Ahora crea tu token (reemplace client_id, client_secret, username y password con los valores generados):' - paragraph_5: 'Este API devolverá una respuesta como esta:' - paragraph_6: 'El access_token es útil para llamar a los métodos del API. Por ejemplo:' - paragraph_7: 'Esta llamada devolverá todos los artículos de tu usuario.' - paragraph_8: 'Si quiere ver todos los métodos del API, puede verlos en nuestra documentación del API.' - back: 'Volver' + parameters: + page_title: 'Gestión de clientes API > Parámetros del cliente' + page_description: 'Aquí están los parámetros del cliente.' + field_name: 'Nombre del cliente' + field_id: 'Identificador del cliente' + field_secret: 'Secreto del cliente' + back: 'Volver' + app: + # created_at: 'Created at: %date%' + documentation: + title: 'Documentación' + full_documentation: 'Ver documentación completa del API' + list_methods: 'Lista con los métodos del API' user: page_title: Gestión de usuarios diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml index 545514b3..e399c199 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml @@ -443,55 +443,55 @@ import: # description: 'This importer will import all your Instapaper articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").' # how_to: 'Please select your Pinboard export and click on the below button to upload and import it.' -developer: - # page_title: 'API clients management' - # welcome_message: 'Welcome to the wallabag API' - # documentation: 'Documentation' - # how_to_first_app: 'How to create my first application' - # full_documentation: 'View full API documentation' - # list_methods: 'List API methods' - # clients: - # title: 'Clients' - # create_new: 'Create a new client' - # existing_clients: - # title: 'Existing clients' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # field_uris: 'Redirect URIs' - # field_grant_types: 'Grant type allowed' - # no_client: 'No client yet.' - # remove: - # warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !' - # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." - # action: 'Remove this client' - # client: - # page_title: 'API clients management > New client' - # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' - # form: - # name_label: 'Name of the client' - # redirect_uris_label: 'Redirect URIs' - # save_label: 'Create a new client' - # action_back: 'بازگشت' - # client_parameter: - # page_title: 'API clients management > Client parameters' - # page_description: 'Here are your client parameters.' - # field_name: 'Client name' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # back: 'بازگشت' - # read_howto: 'Read the howto "Create my first application"' - # howto: - # page_title: 'API clients management > How to create my first application' - # description: - # paragraph_1: 'The following commands make use of the HTTPie library. Make sure it is installed on your system before using it.' - # paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' - # paragraph_3: 'To create this token, you need to create a new client.' - # paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' - # paragraph_5: 'The API will return a response like this:' - # paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' - # paragraph_7: 'This call will return all the entries for your user.' - # paragraph_8: 'If you want to see all the API endpoints, you can have a look to our API documentation.' - # back: 'بازگشت' +apps: + # page_title: 'Apps' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + #old_clients: + # create_new: 'Create a new client' + # title: 'Old clients (depreciated)' + # list: 'Old clients list' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # no_client: 'No client yet.' + #remove: + # warn_message_1: 'You have the ability to remove the client %name%. This action is IRREVERSIBLE !' + # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." + # action: 'Remove the client %name%' + #old_client: + # page_title: 'Apps > New client' + # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' + # form: + # name_label: 'Name of the client' + # save_label: 'Create a new client' + # action_back: 'Back' + # parameters: + # page_title: 'Apps > Client parameters' + # page_description: 'Here are your client parameters.' + # field_name: 'Client name' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # back: 'Back' + # app: + # created_at: 'Created at: %date%' + # documentation: + # title: 'Documentation' + # full_documentation: 'Full documentation' + # list_methods: 'List API methods' user: # page_title: Users management diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml index e9e79c67..e3967960 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml @@ -443,55 +443,55 @@ import: description: "Sur la page « Backup » (https://pinboard.in/settings/backup), cliquez sur « JSON » dans la section « Bookmarks ». Un fichier json (sans extension) sera téléchargé (« pinboard_export »)." how_to: "Choisissez le fichier de votre export Pinboard et cliquez sur le bouton ci-dessous pour l’importer." -developer: +apps: page_title: "Gestion des clients API" - welcome_message: "Bienvenue sur l’API de wallabag" - documentation: "Documentation" - how_to_first_app: "Comment créer votre première application" - full_documentation: "Voir la documentation complète de l’API" - list_methods: "Lister toutes les méthodes de l’API" - clients: - title: "Clients" + allow: + title: 'Une nouvelle application voudrait accéder à votre compte' + permissions: + read: + label: 'Lire vos données' + desc: '%name% pourra accéder à la liste et au contenu de vos articles, tags et annotations.' + write: + label: 'Modifier vos données' + desc: '%name% pourra modifier et gérer (y compris supprimer) vos articles, tags et annotations.' + user: + label: 'Modifier votre compte utilisateur' + desc: '%name% pourra modifier les détails de votre compte utilisateur.' + featured: + title: 'Applications mises en avant' + list: + title: 'Applications autorisées' + old_clients: create_new: "Créer un nouveau client" - existing_clients: - title: "Les clients existants" + title: "Clients existants (déprécié)" + list: "Liste des clients" field_id: "ID Client" field_secret: "Clé secrète" - field_uris: "Adresse de redirection" - field_grant_types: "Type de privilège accordé" no_client: "Aucun client pour le moment" remove: warn_message_1: "Vous avez la possibilité de supprimer le client %name%. Cette action est IRRÉVERSIBLE !" warn_message_2: "Si vous supprimez le client %name%, toutes les applications qui l’utilisaient ne fonctionneront plus avec votre compte wallabag." action: "Supprimer le client %name%" - client: + old_client: page_title: "Gestion des clients API > Nouveau client" page_description: "Vous allez créer un nouveau client. Merci de remplir l’adresse de redirection vers votre application." form: name_label: "Nom du client" - redirect_uris_label: "Adresses de redirection (optionnel)" save_label: "Créer un nouveau client" action_back: "Retour" - client_parameter: - page_title: "Gestion des clients API > Les paramètres de votre client" - page_description: "Voilà les paramètres de votre client" - field_name: "Nom du client" - field_id: "ID client" - field_secret: "Clé secrète" - back: "Retour" - read_howto: "Lire « comment créer ma première application »" - howto: - page_title: "Gestion des clients API > Comment créer votre première application" - description: - paragraph_1: "Les commandes suivantes utilisent la librarie HTTPie. Assurez-vous qu’elle soit installée avant de l’utiliser." - paragraph_2: "Vous avez besoin d’un token pour échanger entre votre application et l’API de wallabag." - paragraph_3: "Pour créer un token, vous devez créer un nouveau client." - paragraph_4: "Maintenant créez votre token (remplacer client_id, client_secret, username et password avec les bonnes valeurs):" - paragraph_5: "L’API vous retournera une réponse comme ça :" - paragraph_6: "L’access_token doit être utilisé pour faire un appel à l’API. Par exemple :" - paragraph_7: "Cet appel va retourner tous les articles de l’utilisateur." - paragraph_8: "Si vous voulez toutes les méthodes de l’API, jetez un oeil à la documentation de l’API." - back: "Retour" + parameters: + page_title: "Gestion des clients API > Les paramètres de votre client" + page_description: "Voilà les paramètres de votre client" + field_name: "Nom du client" + field_id: "ID client" + field_secret: "Clé secrète" + back: "Retour" + app: + created_at: 'Créé le : %date%' + documentation: + title: "Documentation" + full_documentation: "Voir la documentation complète de l’API" + list_methods: "Lister toutes les méthodes de l’API" user: page_title: "Gestion des utilisateurs" diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml index 0597d3e3..504f990f 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml @@ -443,18 +443,28 @@ import: # description: 'This importer will import all your Instapaper articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").' # how_to: 'Please select your Pinboard export and click on the below button to upload and import it.' -developer: +apps: # page_title: 'API clients management' - welcome_message: 'Benvenuto nelle API di wallabag' - documentation: 'Documentazione' - how_to_first_app: 'Come creare la mia prima applicazione' - full_documentation: 'Consulta la documentazione API completa' - list_methods: 'Elenco dei metodi API' - clients: - title: 'Client' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + old_clients: create_new: 'Crea un nuovo client' - existing_clients: title: 'Client esistenti' + list: 'Client' field_id: 'Client ID' field_secret: 'Client secret' field_uris: 'URI di reindirizzamento' @@ -464,34 +474,26 @@ developer: warn_message_1: "Hai la possibilità di rimuovere questo client. L'operazione è IRREVERSIBILE!" warn_message_2: "Se lo rimuovi, ogni app configurata con questo client non sarà più in grado di autenticarsi." action: 'Rimuovi questo client' - client: + old_client: # page_title: 'API clients management > Nuovo client' page_description: 'Stai per creare un nuovo client. Compila i campi sottostanti per lo URI di reindirizzamento della tua applicazione.' form: # name_label: 'Name of the client' - redirect_uris_label: 'URI di reindirizzamento' save_label: 'Crea un nuovo client' action_back: 'Indietro' - client_parameter: - # page_title: 'API clients management > parametri Client' - page_description: 'Questi sono i tuoi parametri del client.' - # field_name: 'Client name' - field_id: 'Client ID' - field_secret: 'Client secret' - back: 'Indietro' - read_howto: 'Leggi "Come creare la mia prima applicazione"' - howto: - # page_title: 'API clients management > Come creare la mia prima applicazione' - description: - paragraph_1: 'I seguenti comandi fanno uso della libreria HTTPie. Verifica che sia installata sul tuo sistema prima di utilizzarli.' - paragraph_2: 'Hai bisogno di un token per far comunicare la tua applicazione di terze parti e le API di wallabag.' - paragraph_3: 'Per creare questo token, hai bisogno di creare un nuovo client.' - paragraph_4: 'Ora, crea il tuo token (sostituisci client_id, client_secret, username e password con valori reali):' - paragraph_5: 'Le API ritorneranno una risposta di questo tipo:' - paragraph_6: "L'access_token è utile per chiamare un API endpoint. Per esempio:" - paragraph_7: 'Questa chiamata ritornerà tutti i contenuti per il tuo utente.' - paragraph_8: 'Se vuoi visualizzare tutti gli API endpoints, dai una occhiata alla documentazione delle API.' - back: 'Indietro' + parameters: + # page_title: 'API clients management > parametri Client' + page_description: 'Questi sono i tuoi parametri del client.' + # field_name: 'Client name' + field_id: 'Client ID' + field_secret: 'Client secret' + back: 'Indietro' + # app: + # created_at: 'Created at: %date%' + documentation: + title: 'Documentazione' + full_documentation: 'Consulta la documentazione API completa' + list_methods: 'Elenco dei metodi API' user: # page_title: Users management diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml index c172a0f6..ea05fc4c 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml @@ -445,31 +445,38 @@ import: developer: page_title: 'Gestion dels clients API' - welcome_message: "Benvenguda sus l'API de wallabag" - documentation: 'Documentacion' - how_to_first_app: 'Cossí crear vòstra primièra aplicacion' - full_documentation: "Veire la documentacion completa de l'API" - list_methods: "Lista dels metòdes de l'API" - clients: - title: 'Clients' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + old_clients: create_new: 'Crear un novèl client' - existing_clients: title: 'Los clients existents' + list: 'Clients' field_id: 'ID Client' field_secret: 'Clé secreta' - field_uris: 'URLs de redireccion' - field_grant_types: 'Tipe de privilègi acordat' no_client: 'Pas cap de client pel moment.' remove: warn_message_1: 'Avètz la possibilitat de supriimr un client. Aquesta accion es IRREVERSIBLA !' warn_message_2: "Se suprimissètz un client, totas las aplicacions que l'emplegan foncionaràn pas mai amb vòstre compte wallabag." action: 'Suprimir aqueste client' - client: + old_client: page_title: 'Gestion dels clients API > Novèl client' page_description: "Anatz crear un novèl client. Mercés de garnir l'url de redireccion cap a vòstra aplicacion." form: name_label: "Nom del client" - redirect_uris_label: 'URLs de redireccion' save_label: 'Crear un novèl client' action_back: 'Retorn' client_parameter: @@ -492,6 +499,19 @@ developer: paragraph_7: "Aquesta requèsta tornarà totes los articles de l'utilizaire." paragraph_8: "Se volètz totas las adreças d'accès de l'API, donatz un còp d’uèlh a la documentacion de l'API." back: 'Retorn' + parameters: + page_title: 'Gestion dels clients API > Los paramètres de vòstre client' + page_description: 'Vaquí los paramètres de vòstre client.' + field_name: 'Nom del client' + field_id: 'ID Client' + field_secret: 'Clau secreta' + back: 'Retour' + # app: + # created_at: 'Created at: %date%' + documentation: + title: 'Documentacion' + full_documentation: "Veire la documentacion completa de l'API" + list_methods: "Lista dels metòdes de l'API" user: page_title: 'Gestion dels utilizaires' diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml index 82d16767..d2e5c1d5 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml @@ -443,55 +443,55 @@ import: description: 'Ten importer, zaimportuje wszystkie twoje artykuły z Pinboard. W ustawieniach kopii zapasowej (https://pinboard.in/settings/backup), kliknij na "JSON" w sekcji "Bookmarks". Otrzymasz plik "pinboard_export".' how_to: 'Wybierz swój plik eksportu z Pinboard i kliknij poniższy przycisk, aby go załadować.' -developer: +apps: page_title: 'Zarządzanie klientami API' - welcome_message: 'Witaj w API wallabag' - documentation: 'Dokumentacja' - how_to_first_app: 'Jak stworzyć moją pierwszą aplikację' - full_documentation: 'Pokaż pełne API' - list_methods: 'Lista metod API' - clients: - title: 'Klienci' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + old_clients: create_new: 'Utwórz nowego klienta' - existing_clients: title: 'Istniejący klienci' + list: 'Klienci' field_id: 'ID klienta' field_secret: 'Client secret' - field_uris: 'Przekieruj URIs' - field_grant_types: 'Przyznaj pozwolenie' no_client: 'Nie ma jeszcze klienta.' remove: warn_message_1: 'Masz możliwość usunięcia tego klienta. Ta akcja jest NIEODWRACALNA !' warn_message_2: "Jeżeli go usuniesz, aplikacje skonfigurowane z tym klientem nię będa w stanie autoryzować twojego wallabag." action: 'Usuń tego klienta' - client: + old_client: page_title: 'Zarządzanie klientami API > Nowy klient' page_description: 'Tworzysz nowego klienta. Wypełnij poniższe pole w celu przekierowania URI twojej aplikacji.' form: name_label: 'Nazwa klienta' - redirect_uris_label: 'Przekieruj adresy URI' save_label: 'Stwórz nowego klienta' action_back: 'Cofnij' - client_parameter: - page_title: 'Zarządzanie klientami API > Parametry klienta' - page_description: 'Tutaj znajdują się parametry klienta.' - field_name: 'Nazwa klienta' - field_id: 'Client ID' - field_secret: 'Client secret' - back: 'Cofnij' - read_howto: 'Przeczytaj jak "Stworzyć moją pierwszą aplikację"' - howto: - page_title: 'Zarządzanie klientami API > Jak stworzyć moją pierwszą aplikację' - description: - paragraph_1: 'Następujące komendy korzystają Biblioteka HTTPie. Upewnij się, czy zainstalowałeś ją w swoim systemie zanim z niej skorzystasz' - paragraph_2: 'Potrzebujesz tokena w celu nawiązania komunikacji między swoją aplikacją a API wallabag.' - paragraph_3: 'W celu stworzenia tokena musisz stwórz nowego klienta.' - paragraph_4: 'Teraz, utwórz tokena (zmień client_id, client_secret, username i password z poprawnymi wartościami):' - paragraph_5: 'API powinno zwrócić taką informację:' - paragraph_6: 'access_token jest użyteczny do wywołania API endpoint. Na przykład:' - paragraph_7: 'To wywołanie zwróci wszystkie twoje wpisy.' - paragraph_8: 'Jeżeli chcesz wyświetlić wszystkie punkty końcowe API, zobacz Dokumentacja naszego API.' - back: 'Cofnij' + parameters: + page_title: 'Zarządzanie klientami API > Parametry klienta' + page_description: 'Tutaj znajdują się parametry klienta.' + field_name: 'Nazwa klienta' + field_id: 'Client ID' + field_secret: 'Client secret' + back: 'Cofnij' + # app: + # created_at: 'Created at: %date%' + documentation: + title: 'Dokumentacja' + full_documentation: 'Pokaż pełne API' + list_methods: 'Lista metod API' user: page_title: Zarządzanie użytkownikami diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml index b75567d6..0533ddba 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml @@ -445,53 +445,53 @@ import: developer: # page_title: 'API clients management' - welcome_message: 'Bem-vindo a API do wallabag' - documentation: 'Documentação' - how_to_first_app: 'Como criar minha primeira aplicação' - full_documentation: 'Ver a documentação completa da API' - list_methods: 'Lista de métodos da API' - clients: - title: 'Clientes' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + old_clients: create_new: 'Criar um novo cliente' - existing_clients: title: 'Clientes existentes' + list: 'Clientes' field_id: 'ID do cliente' field_secret: 'Chave do cliente' - field_uris: 'URIs de redirecionamento' - field_grant_types: 'Tipo permitido' no_client: 'Nenhum cliente até agora.' remove: warn_message_1: 'Você tem permissão pare remover este cliente. Esta ação é IRREVERSÍVEL !' warn_message_2: 'Se você remover isso, todo o aplicativo configurado com este cliente não poderá se autenticar no seu wallabag.' action: 'Remover este cliente' - client: + old_client: # page_title: 'API clients management > Novo cliente' page_description: 'Você está prestes a criar um novo cliente. Por favor preencha o campo abaixo para a URI de redirecionamento de sua aplicação.' form: name_label: 'Nome do cliente' - redirect_uris_label: 'URIs de redirecionamento' save_label: 'Criar um novo cliente' action_back: 'Voltar' - client_parameter: - # page_title: 'API clients management > Parâmetros de clientes' - page_description: 'Aqui estão os parâmetros de seus clientes.' - field_name: 'Nome do cliente' - field_id: 'ID do cliente' - field_secret: 'Chave do cliente' - back: 'Voltar' - read_howto: 'Leia o how-to "Criar minha primeira aplicação"' - howto: - # page_title: 'API clients management > Criar minha primeira aplicação' - description: - paragraph_1: 'Os seguintes comandos fazem uso da biblioteca HTTPie. Tenha certeza que ela está instalada em seu servidor antes de usá-la.' - paragraph_2: 'Você precisa de um token para a comunicação entre sua aplicação terceira e a API do wallabag.' - paragraph_3: 'Para criar este token, você precisa criar um novo cliente.' - paragraph_4: 'Agora, crie seu token (altere client_id, client_secret, username e password com os valores corretos):' - paragraph_5: 'A API pode retornar uma resposta como essa:' - paragraph_6: 'O access_token é utilizável para fazer uma chamada para o endpoint da API. Por exemplo:' - paragraph_7: 'Esta chamada pode retornar todas as entradas de seu usuário.' - paragraph_8: 'Se você deseja ver todos os endpoints da API, dê uma olhada em nossa documentação da API.' - back: 'Voltar' + parameters: + # page_title: 'API clients management > Parâmetros de clientes' + page_description: 'Aqui estão os parâmetros de seus clientes.' + field_name: 'Nome do cliente' + field_id: 'ID do cliente' + field_secret: 'Chave do cliente' + back: 'Voltar' + # app: + # created_at: 'Created at: %date%' + documentation: + title: 'Documentação' + full_documentation: 'Ver a documentação completa da API' + list_methods: 'Lista de métodos da API' user: page_title: 'Gerenciamento de Usuários' diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml index 95df573d..3cea2900 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml @@ -443,55 +443,55 @@ import: # description: 'This importer will import all your Instapaper articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").' # how_to: 'Please select your Pinboard export and click on the below button to upload and import it.' -developer: - # page_title: 'API clients management' - # welcome_message: 'Welcome to the wallabag API' - # documentation: 'Documentation' - # how_to_first_app: 'How to create my first application' - # full_documentation: 'View full API documentation' - # list_methods: 'List API methods' - # clients: - # title: 'Clients' - # create_new: 'Create a new client' - # existing_clients: - # title: 'Existing clients' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # field_uris: 'Redirect URIs' - # field_grant_types: 'Grant type allowed' - # no_client: 'No client yet.' - # remove: - # warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !' - # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." - # action: 'Remove this client' - # client: - # page_title: 'API clients management > New client' - # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' - # form: - # name_label: 'Name of the client' - # redirect_uris_label: 'Redirect URIs' - # save_label: 'Create a new client' - # action_back: 'Back' - # client_parameter: - # page_title: 'API clients management > Client parameters' - # page_description: 'Here are your client parameters.' - # field_name: 'Client name' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # back: 'Back' - # read_howto: 'Read the howto "Create my first application"' - # howto: - # page_title: 'API clients management > How to create my first application' - # description: - # paragraph_1: 'The following commands make use of the HTTPie library. Make sure it is installed on your system before using it.' - # paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' - # paragraph_3: 'To create this token, you need to create a new client.' - # paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' - # paragraph_5: 'The API will return a response like this:' - # paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' - # paragraph_7: 'This call will return all the entries for your user.' - # paragraph_8: 'If you want to see all the API endpoints, you can have a look to our API documentation.' - # back: 'Back' +apps: + # page_title: 'Apps' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + #old_clients: + # create_new: 'Create a new client' + # title: 'Old clients (depreciated)' + # list: 'Old clients list' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # no_client: 'No client yet.' + #remove: + # warn_message_1: 'You have the ability to remove the client %name%. This action is IRREVERSIBLE !' + # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." + # action: 'Remove the client %name%' + #old_client: + # page_title: 'Apps > New client' + # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' + # form: + # name_label: 'Name of the client' + # save_label: 'Create a new client' + # action_back: 'Back' + # parameters: + # page_title: 'Apps > Client parameters' + # page_description: 'Here are your client parameters.' + # field_name: 'Client name' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # back: 'Back' + # app: + # created_at: 'Created at: %date%' + # documentation: + # title: 'Documentation' + # full_documentation: 'Full documentation' + # list_methods: 'List API methods' user: # page_title: Users management diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml index 61e1a1ea..7c2edba0 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml @@ -441,55 +441,55 @@ import: # description: 'This importer will import all your Instapaper articles. On the backup (https://pinboard.in/settings/backup) page, click on "JSON" in the "Bookmarks" section. A JSON file will be downloaded (like "pinboard_export").' # how_to: 'Please select your Pinboard export and click on the below button to upload and import it.' -developer: - # page_title: 'API clients management' - # welcome_message: 'Welcome to the wallabag API' - # documentation: 'Documentation' - # how_to_first_app: 'How to create my first application' - # full_documentation: 'View full API documentation' - # list_methods: 'List API methods' - # clients: - # title: 'Clients' - # create_new: 'Create a new client' - # existing_clients: - # title: 'Existing clients' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # field_uris: 'Redirect URIs' - # field_grant_types: 'Grant type allowed' - # no_client: 'No client yet.' - # remove: - # warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !' - # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." - # action: 'Remove this client' - # client: - # page_title: 'API clients management > New client' - # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' - # form: +apps: + # page_title: 'Apps' + # allow: + # title: 'A new application would like to connect to your account' + # permissions: + # read: + # label: 'Read your data' + # desc: '%name% will be able to access the list and contents of your entries, tags and annotations.' + # write: + # label: 'Edit your data' + # desc: '%name% will be able to edit and manage (including deleting) your entries, tags and annotations.' + # user: + # label: 'Edit your user settings' + # desc: '%name% will be able to manage your user account.' + #featured: + # title: 'Featured apps' + #list: + # title: 'Authorized apps' + #old_clients: + # create_new: 'Create a new client' + # title: 'Old clients (depreciated)' + # list: 'Old clients list' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # no_client: 'No client yet.' + #remove: + # warn_message_1: 'You have the ability to remove the client %name%. This action is IRREVERSIBLE !' + # warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag." + # action: 'Remove the client %name%' + #old_client: + # page_title: 'Apps > New client' + # page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.' + # form: # name_label: 'Name of the client' - # redirect_uris_label: 'Redirect URIs' - # save_label: 'Create a new client' - # action_back: 'Back' - # client_parameter: - # page_title: 'API clients management > Client parameters' - # page_description: 'Here are your client parameters.' - # field_name: 'Client name' - # field_id: 'Client ID' - # field_secret: 'Client secret' - # back: 'Back' - # read_howto: 'Read the howto "Create my first application"' - # howto: - # page_title: 'API clients management > How to create my first application' - # description: - # paragraph_1: 'The following commands make use of the HTTPie library. Make sure it is installed on your system before using it.' - # paragraph_2: 'You need a token to communicate between your 3rd application and wallabag API.' - # paragraph_3: 'To create this token, you need to create a new client.' - # paragraph_4: 'Now, create your token (replace client_id, client_secret, username and password with the good values):' - # paragraph_5: 'The API will return a response like this:' - # paragraph_6: 'The access_token is useful to do a call to the API endpoint. For example:' - # paragraph_7: 'This call will return all the entries for your user.' - # paragraph_8: 'If you want to see all the API endpoints, you can have a look to our API documentation.' - # back: 'Back' + # save_label: 'Create a new client' + # action_back: 'Back' + # parameters: + # page_title: 'Apps > Client parameters' + # page_description: 'Here are your client parameters.' + # field_name: 'Client name' + # field_id: 'Client ID' + # field_secret: 'Client secret' + # back: 'Back' + # app: + # created_at: 'Created at: %date%' + # documentation: + # title: 'Documentation' + # full_documentation: 'Full documentation' + # list_methods: 'List API methods' user: # page_title: Users management diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client.html.twig index 8a5da71a..09e138ed 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client.html.twig @@ -1,6 +1,6 @@ {% extends "WallabagCoreBundle::layout.html.twig" %} -{% block title %}{{ 'developer.client.page_title'|trans }}{% endblock %} +{% block title %}{{ 'apps.old_client.page_title'|trans }}{% endblock %} {% block content %}
@@ -8,7 +8,7 @@
-

{{ 'developer.client.page_description'|trans }}

+

{{ 'apps.old_client.page_description'|trans }}

{{ form_start(form) }} {{ form_errors(form) }} @@ -18,13 +18,7 @@ {{ form_widget(form.name) }}
-
- {{ form_label(form.redirect_uris) }} - {{ form_errors(form.redirect_uris) }} - {{ form_widget(form.redirect_uris) }} -
- - {{ 'developer.client.action_back'|trans }} + {{ 'apps.old_client.action_back'|trans }} {{ form_widget(form.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }} {{ form_rest(form) }} diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig index b498cceb..30b90252 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig @@ -1,21 +1,20 @@ {% extends "WallabagCoreBundle::layout.html.twig" %} -{% block title %}{{ 'developer.client_parameter.page_title'|trans }}{% endblock %} +{% block title %}{{ 'apps.old_client.parameters.page_title'|trans }}{% endblock %} {% block content %}
-

{{ 'developer.client_parameter.page_description'|trans }}

+

{{ 'apps.old_client.parameters.page_description'|trans }}

    -
  • {{ 'developer.client_parameter.field_name'|trans }}:
    {{ client_name }}
  • -
  • {{ 'developer.client_parameter.field_id'|trans }}:
    {{ client_id }}
  • -
  • {{ 'developer.client_parameter.field_secret'|trans }}:
    {{ client_secret }}
  • +
  • {{ 'apps.old_client.parameters.field_name'|trans }}:
    {{ client_name }}
  • +
  • {{ 'apps.old_client.parameters.field_id'|trans }}:
    {{ client_id }}
  • +
  • {{ 'apps.old_client.parameters.field_secret'|trans }}:
    {{ client_secret }}
- {{ 'developer.client_parameter.back'|trans }} - {{ 'developer.client_parameter.read_howto'|trans }} + {{ 'apps.old_client.parameters.back'|trans }}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/howto_app.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/howto_app.html.twig deleted file mode 100644 index acbc2c88..00000000 --- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/howto_app.html.twig +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "WallabagCoreBundle::layout.html.twig" %} - -{% block title %}{{ 'developer.howto.page_title'|trans }}{% endblock %} - -{% block css %} - {{ parent() }} - -{% endblock %} - -{% block content %} -
-
-
- -
-

{{ 'developer.howto.description.paragraph_1'|trans|raw }}

-

{{ 'developer.howto.description.paragraph_2'|trans }}

-

{{ 'developer.howto.description.paragraph_3'|trans({'%link%': path('developer_create_client')})|raw }}

-

{{ 'developer.howto.description.paragraph_4'|trans }}

-

-

http POST http://v2.wallabag.org/oauth/v2/token \
-    grant_type=password \
-    client_id=12_5um6nz50ceg4088c0840wwc0kgg44g00kk84og044ggkscso0k \
-    client_secret=3qd12zpeaxes8cwg8c0404g888co4wo8kc4gcw0occww8cgw4k \
-    username=yourUsername \
-    password=yourPassw0rd
-

-

{{ 'developer.howto.description.paragraph_5'|trans }}

-

-

HTTP/1.1 200 OK
-Cache-Control: no-store, private
-Connection: close
-Content-Type: application/json
-Date: Tue, 06 Oct 2015 18:24:03 GMT
-Host: localhost:8000
-Pragma: no-cache
-X-Debug-Token: be00a1
-X-Debug-Token-Link: /profiler/be00a1
-X-Powered-By: PHP/5.5.9-1ubuntu4.13
-{
-    "access_token": "ZWFjNjA3ZWMwYWVmYzRkYTBlMmQ3NTllYmVhOGJiZDE0ZTg1NjE4MjczOTVlNzM0ZTRlMWQ0MmRlMmYwNTk5Mw",
-    "expires_in": 3600,
-    "refresh_token": "ODBjODU1NWUwNmUzZTBkNDQ5YWVlZTVlMjQ2Y2I0OWM2NTM1ZGM2M2Y3MDhjMTViM2U2MzYxYzRkMDk5ODRlZg",
-    "scope": null,
-    "token_type": "bearer"
-}
-

-

{{ 'developer.howto.description.paragraph_6'|trans }}

-

-

http GET http://v2.wallabag.org/api/entries.json \
-    "Authorization:Bearer ZWFjNjA3ZWMwYWVmYzRkYTBlMmQ3NTllYmVhOGJiZDE0ZTg1NjE4MjczOTVlNzM0ZTRlMWQ0MmRlMmYwNTk5Mw"
-

-

{{ 'developer.howto.description.paragraph_7'|trans }}

-

{{ 'developer.howto.description.paragraph_8'|trans({'%link%': path('nelmio_api_doc_index')})|raw }}

-

{{ 'developer.howto.back'|trans }}

-
- -
-
-
- - -{% endblock %} diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig index 528b055c..a41e64f7 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig @@ -1,67 +1,153 @@ {% extends "WallabagCoreBundle::layout.html.twig" %} -{% block title %}{{ 'developer.page_title'|trans }}{% endblock %} +{% block title %}{{ 'apps.page_title'|trans }}{% endblock %} {% block content %}
-
-

{{ 'developer.welcome_message'|trans }}

+

{{ 'apps.featured.title'|trans }}

+ +
+
    +
  • + +
    +

    Android

    +
    For all Android 4.4+ devices
    +

    + + Get it on Google Play + + + Get it on F-Droid + +

    +
    +
  • +
  • + +
    +

    iOS

    +
    For your iPhones and iPads
    +

    + + Get it on the AppStore + +

    +
    +
  • +
  • + +
    +

    Windows

    +
    Available on Windows Phones and Windows 10
    +

    + + Get it on the Windows Store + +

    +
    +
  • +
  • + +
    +

    Browser Extension

    +
    Available on Firefox, Chrome and Opera
    +

    + + Get it on the Firefox Addons Website + + + Get it on the Firefox Addons Website + + + Get it on the Firefox Addons Website + +

    +
    +
  • +
+
-

{{ 'developer.documentation'|trans }}

+

{{ 'apps.list.title'|trans }}

-
    -
  • {{ 'developer.how_to_first_app'|trans }}
  • -
  • {{ 'developer.full_documentation'|trans }}
  • -
  • {{ 'developer.list_methods'|trans }}
  • +
      + {% for app in apps %} +
    • + {% if app.client.image %} + + {% endif %} + {{ app.client.name }} +

      {{ app.client.description }}

      +
      + {% for scope in app.scope | split(' ') %} +
      {{ scope }}
      + {% endfor %} +
      +

      {{ 'apps.app.created_at' | trans({'%date%': app.client.createdAt}) }}

      + grade +
    • + {% endfor %}
    -

    {{ 'developer.clients.title'|trans }}

    +

    {{ 'apps.old_clients.title'|trans }}

    -

    {{ 'developer.existing_clients.title'|trans }}

    +
    {{ 'apps.old_clients.list'|trans }}
    {% if clients %}
      {% for client in clients %}
    • -
      {{ client.name }} - #{{ client.id }}
      +
      {{ client.name }}
      - - + + - + - - - - - - - -
      {{ 'developer.existing_clients.field_id'|trans }}{{ client.clientId }}{{ 'apps.old_clients.field_id'|trans }}{{ client.id }}_{{ client.randomId }}
      {{ 'developer.existing_clients.field_secret'|trans }}{{ 'apps.old_clients.field_secret'|trans }} {{ client.secret }}
      {{ 'developer.existing_clients.field_uris'|trans }}{{ client.redirectUris|json_encode() }}
      {{ 'developer.existing_clients.field_grant_types'|trans }}{{ client.allowedGrantTypes|json_encode() }}

      - {{ 'developer.remove.warn_message_1'|trans({'%name%': client.name }) }}
      - {{ 'developer.remove.warn_message_2'|trans({'%name%': client.name }) }}
      - {{ 'developer.remove.action'|trans({'%name%': client.name }) }} + {{ 'apps.remove.warn_message_1'|trans({'%name%': client.name }) }}
      + {{ 'apps.remove.warn_message_2'|trans({'%name%': client.name }) }}
      + {{ 'apps.remove.action'|trans({'%name%': client.name }) }}

      +
    • {% endfor %}
    {% else %} - {{ 'developer.existing_clients.no_client'|trans }} + {{ 'apps.old_clients.no_client'|trans }} {% endif %} -
+

{{ 'apps.documentation.title'|trans }}

+ +
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 2dab1c18..6bee628d 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig @@ -78,8 +78,8 @@
  • {{ 'menu.left.import'|trans }}
  • -
  • - {{ 'menu.left.developer'|trans }} +
  • + {{ 'menu.left.apps'|trans }}
  • {{ 'menu.left.howto'|trans }} diff --git a/web/assets/appicons/.gitkeep b/web/assets/appicons/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/web/assets/appicons/Firefox-logo.svg b/web/assets/appicons/Firefox-logo.svg new file mode 100644 index 00000000..3f71d3d6 --- /dev/null +++ b/web/assets/appicons/Firefox-logo.svg @@ -0,0 +1,429 @@ + + + + + ]> + + + Firefox Logo + Firefox logo in SVG, authored by Jon Hicks, made in Adobe Illustrator (file format cleaned up and slightly modified by Doug Schepers) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/appicons/Logo_Google_Chrome.svg b/web/assets/appicons/Logo_Google_Chrome.svg new file mode 100644 index 00000000..506184a0 --- /dev/null +++ b/web/assets/appicons/Logo_Google_Chrome.svg @@ -0,0 +1,2859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/appicons/android_full.png b/web/assets/appicons/android_full.png new file mode 100644 index 00000000..1d777800 Binary files /dev/null and b/web/assets/appicons/android_full.png differ diff --git a/web/assets/appicons/appstore.svg b/web/assets/appicons/appstore.svg new file mode 100644 index 00000000..ac111e59 --- /dev/null +++ b/web/assets/appicons/appstore.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/assets/appicons/browser.png b/web/assets/appicons/browser.png new file mode 100644 index 00000000..b70e3b8d Binary files /dev/null and b/web/assets/appicons/browser.png differ diff --git a/web/assets/appicons/fdroid.png b/web/assets/appicons/fdroid.png new file mode 100644 index 00000000..23af0e40 Binary files /dev/null and b/web/assets/appicons/fdroid.png differ diff --git a/web/assets/appicons/google_play.png b/web/assets/appicons/google_play.png new file mode 100644 index 00000000..c77b7464 Binary files /dev/null and b/web/assets/appicons/google_play.png differ diff --git a/web/assets/appicons/iOS_full.png b/web/assets/appicons/iOS_full.png new file mode 100644 index 00000000..bd016399 Binary files /dev/null and b/web/assets/appicons/iOS_full.png differ diff --git a/web/assets/appicons/ios.png b/web/assets/appicons/ios.png new file mode 100644 index 00000000..e68fe5e9 Binary files /dev/null and b/web/assets/appicons/ios.png differ diff --git a/web/assets/appicons/opera-for-computers_icon_128x128.png b/web/assets/appicons/opera-for-computers_icon_128x128.png new file mode 100644 index 00000000..a4fc59e9 Binary files /dev/null and b/web/assets/appicons/opera-for-computers_icon_128x128.png differ diff --git a/web/assets/appicons/windows.jpeg b/web/assets/appicons/windows.jpeg new file mode 100644 index 00000000..027baf56 Binary files /dev/null and b/web/assets/appicons/windows.jpeg differ diff --git a/web/assets/appicons/windowsstore.png b/web/assets/appicons/windowsstore.png new file mode 100644 index 00000000..0c27fa04 Binary files /dev/null and b/web/assets/appicons/windowsstore.png differ -- cgit v1.2.3