]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #1545 from wallabag/v2-user-tag
authorNicolas Lœuillet <nicolas@loeuillet.org>
Sat, 2 Jan 2016 11:46:52 +0000 (12:46 +0100)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Sat, 2 Jan 2016 11:46:52 +0000 (12:46 +0100)
v2 – Remove user reference in tag

25 files changed:
.travis.yml
app/config/config.yml
app/config/parameters.yml.dist
app/config/tests/parameters.yml.dist.mysql
app/config/tests/parameters.yml.dist.pgsql
app/config/tests/parameters.yml.dist.sqlite
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/css/main.css
src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.eot
src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.svg
src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.ttf
src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.woff
src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php
src/Wallabag/UserBundle/DependencyInjection/Configuration.php [new file with mode: 0644]
src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php [new file with mode: 0644]
src/Wallabag/UserBundle/Mailer/AuthCodeMailer.php [new file with mode: 0644]
src/Wallabag/UserBundle/Resources/config/services.yml
src/Wallabag/UserBundle/Resources/translations/wallabag_user.en.yml [new file with mode: 0644]
src/Wallabag/UserBundle/Resources/translations/wallabag_user.fr.yml [new file with mode: 0644]
src/Wallabag/UserBundle/Tests/Mailer/AuthCodeMailerTest.php [new file with mode: 0644]

index 4542fdcb6edd3cd00d112500dbe5644b738081e3..7a7c9056c6f105231fc4f6571999b001bb4a5b19 100644 (file)
@@ -32,7 +32,6 @@ matrix:
         - php: hhvm
           env: DB=pgsql  # driver for PostgreSQL currently unsupported by HHVM, requires 3rd party dependency
     allow_failures:
-        - php: 7.0
         - php: hhvm
 
 branches:
index f2538c9027dd8481321f1ae2adad8d9c93899eb6..8403a458f69916a11f2745825de010a2627413c2 100644 (file)
@@ -198,6 +198,7 @@ scheb_two_factor:
         sender_email: %twofactor_sender%
         digits: 6
         template: WallabagUserBundle:Authentication:form.html.twig
+        mailer: wallabag_user.auth_code_mailer
 
 kphoen_rulerz:
     executors:
index b475d63708982ead2cd91f81d07af6503af4d205..149179c2e8afa849aa8b79795a1dae9a121003d9 100644 (file)
@@ -52,10 +52,11 @@ parameters:
     export_mobi: true
     export_pdf: true
     wallabag_url: http://v2.wallabag.org
+    wallabag_support_url: 'https://www.wallabag.org/pages/support.html'
 
     # default user config
     items_on_page: 12
     theme: material
-    language: en_US
+    language: en
     from_email: no-reply@wallabag.org
     rss_limit: 50
index 5b29690c4b04d774c4d5697fd216249c1fe0d71a..096ad8c767fc41aeeaa0ea90d01c36baf0b27576 100644 (file)
@@ -52,6 +52,7 @@ parameters:
     export_mobi: true
     export_pdf: true
     wallabag_url: http://v2.wallabag.org
+    wallabag_support_url: 'https://www.wallabag.org/pages/support.html'
 
     # default user config
     items_on_page: 12
index efdac961725ac117147fac283365b546b9a39361..ca3f6ea20ab59a3347a649203bb0590e9f7d9dd6 100644 (file)
@@ -52,6 +52,7 @@ parameters:
     export_mobi: true
     export_pdf: true
     wallabag_url: http://v2.wallabag.org
+    wallabag_support_url: 'https://www.wallabag.org/pages/support.html'
 
     # default user config
     items_on_page: 12
index 276d1147153dfebe1608f5dda9e7f375b4e2792c..92460bcfc1b12bcf6543d27becfebe7edcc341c5 100644 (file)
@@ -52,6 +52,7 @@ parameters:
     export_mobi: true
     export_pdf: true
     wallabag_url: http://v2.wallabag.org
+    wallabag_support_url: 'https://www.wallabag.org/pages/support.html'
 
     # default user config
     items_on_page: 12
index 2f3fd6a9348ab6ec26c0ae1b301de95610e3778b..fa58013312a74169207f4795c2e8c4dd253f474f 100644 (file)
@@ -266,6 +266,33 @@ class EntryController extends Controller
         );
     }
 
+    /**
+     * Reload an entry.
+     * Refetch content from the website and make it readable again.
+     *
+     * @param Entry $entry
+     *
+     * @Route("/reload/{id}", requirements={"id" = "\d+"}, name="reload_entry")
+     *
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse
+     */
+    public function reloadAction(Entry $entry)
+    {
+        $this->checkUserAction($entry);
+
+        $message = 'Entry reloaded';
+        if (false === $this->updateEntry($entry)) {
+            $message = 'Failed to reload entry';
+        }
+
+        $this->get('session')->getFlashBag()->add(
+            'notice',
+            $message
+        );
+
+        return $this->redirect($this->generateUrl('view', array('id' => $entry->getId())));
+    }
+
     /**
      * Changes read status for an entry.
      *
@@ -347,7 +374,7 @@ class EntryController extends Controller
         );
 
         // don't redirect user to the deleted entry
-        return $this->redirect($url !== $request->headers->get('referer') ?: $this->generateUrl('homepage'));
+        return $this->redirect($url !== $request->headers->get('referer') ? $request->headers->get('referer') : $this->generateUrl('homepage'));
     }
 
     /**
index 84b78a89b8a4f7db73eee519eee2fe28c05a958b..3b3c1e9795d9aa0f06708968432a8cf03ad5926f 100644 (file)
@@ -25,7 +25,7 @@ class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
 
         $adminConfig->setTheme('material');
         $adminConfig->setItemsPerPage(30);
-        $adminConfig->setLanguage('en_US');
+        $adminConfig->setLanguage('en');
 
         $manager->persist($adminConfig);
 
@@ -34,7 +34,7 @@ class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
         $bobConfig = new Config($this->getReference('bob-user'));
         $bobConfig->setTheme('default');
         $bobConfig->setItemsPerPage(10);
-        $bobConfig->setLanguage('fr_FR');
+        $bobConfig->setLanguage('fr');
 
         $manager->persist($bobConfig);
 
index cc797c6323a5841dcd02bde55ca338011ebd23de..d9850f7a974b36b35c54917a332e0d1dca725686 100644 (file)
     {{ form_start(form.rss) }}
         {{ form_errors(form.rss) }}
 
+        <div class="row">
+            {% trans %}RSS feeds provided by wallabag allow you to read your saved articles with your favourite RSS reader.{% endtrans %}
+        </div>
+
         <fieldset class="w500p inline">
             <div class="row">
                 <label>Rss token</label>
         </fieldset>
 
         {% if twofactor_auth %}
+        <div class="row">
+            {% trans %}Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion{% endtrans %}
+        </div>
+
         <fieldset class="w500p inline">
             <div class="row">
                 {{ form_label(form.user.twoFactorAuthentication) }}
index b3f4709802e715af651853ab9c7aa4d60a12661a..1a77e290091b464d1e4cf29140eb299d11f83236 100644 (file)
@@ -7,6 +7,7 @@
         <ul class="links">
             <li class="topPosF"><a href="#top" title="{% trans %}Back to top{% endtrans %}" class="tool top icon icon-arrow-up-thick"><span>{% trans %}Back to top{% endtrans %}</span></a></li>
             <li><a href="{{ entry.url|e }}" target="_blank" title="{% trans %}original{% endtrans %} : {{ entry.title|e }}" class="tool link icon icon-link"><span>{{ entry.domainName|removeWww }}</span></a></li>
+            <li><a title="{% trans %}Reload content{% endtrans %}" class="tool icon icon-reload" href="{{ path('reload_entry', { 'id': entry.id }) }}"><span>{% trans %}Reload content{% endtrans %}</span></a></li>
             <li><a title="{% trans %}Mark as read{% endtrans %}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{% trans %}Toggle mark as read{% endtrans %}</span></a></li>
             <li><a title="{% trans %}Favorite{% endtrans %}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{% trans %}Toggle favorite{% endtrans %}</span></a></li>
             <li><a title="{% trans %}Delete{% endtrans %}" class="tool delete icon icon-trash" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{% trans %}Delete{% endtrans %}</span></a></li>
index 0ba1ec277b8e407a8b58f34f7c8a986b5e18746f..d3f92926e846c89920075fdb31d08a773ffc7dfb 100755 (executable)
@@ -750,6 +750,9 @@ a.add-to-wallabag-link-after:after {
 .icon-print:before {
   content: "\e80d";
 }
+.icon-reload:before {
+  content: "\ea2e";
+}
 
 
 /* .icon-image class, for image-based icons
index 563235166982e94bcbb1275d5f7fe0122b742aa8..057c7bc4e53b1026502171e346538564da634672 100644 (file)
Binary files a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.eot and b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.eot differ
index b458613639e3d09ec0c481c73c111b2c7d06f24b..f4086b53a521589ea951bfc9772020c302dc2337 100644 (file)
@@ -1,41 +1,43 @@
 <?xml version="1.0" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 <svg xmlns="http://www.w3.org/2000/svg">
-<metadata>
-<json>
-{
-       "fontFamily": "icomoon",
-       "majorVersion": 1,
-       "minorVersion": 0,
-       "version": "Version 1.0",
-       "fontId": "icomoon",
-       "psName": "icomoon",
-       "subFamily": "Regular",
-       "fullName": "icomoon",
-       "description": "Generated by IcoMoon"
-}
-</json>
-</metadata>
+<metadata>Generated by IcoMoon</metadata>
 <defs>
-<font id="icomoon" horiz-adv-x="512">
-<font-face units-per-em="512" ascent="480" descent="-32" />
-<missing-glyph horiz-adv-x="512" />
-<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
-<glyph unicode="&#xe600;" d="M256 389.333c-94.272 0-170.667-76.416-170.667-170.666s76.394-170.667 170.667-170.667 170.667 76.416 170.667 170.667-76.394 170.666-170.667 170.666zM335.082 169.749c8.341-8.341 8.341-21.824 0-30.166-4.16-4.16-9.622-6.25-15.082-6.25s-10.923 2.091-15.082 6.25l-48.918 48.918-48.917-48.918c-4.16-4.16-9.621-6.25-15.083-6.25s-10.923 2.091-15.083 6.25c-8.341 8.341-8.341 21.824 0 30.166l48.917 48.918-48.917 48.917c-8.341 8.341-8.341 21.824 0 30.166s21.824 8.341 30.166 0l48.917-48.917 48.918 48.917c8.341 8.341 21.824 8.341 30.166 0s8.341-21.824 0-30.166l-48.918-48.917 48.918-48.918z" />
-<glyph unicode="&#xe601;" d="M245.333 73.109c-37.035 0-71.85 14.421-98.048 40.598-26.176 26.197-40.618 61.014-40.618 98.070s14.442 71.872 40.618 98.070c8.341 8.341 21.824 8.341 30.166 0s8.341-21.824 0-30.166c-18.133-18.154-28.118-42.261-28.118-67.904s9.984-49.771 28.118-67.904c18.133-18.134 42.219-28.096 67.882-28.096s49.749 9.984 67.883 28.096c18.154 18.134 28.118 42.24 28.118 67.904s-9.984 49.771-28.118 67.904c-8.341 8.341-8.341 21.824 0 30.166s21.824 8.341 30.166 0c26.176-26.219 40.618-61.035 40.618-98.070s-14.442-71.872-40.618-98.070c-26.197-26.176-61.014-40.597-98.048-40.597zM245.333 234.667c-11.797 0-21.333 9.558-21.333 21.333v106.667c0 11.776 9.536 21.333 21.334 21.333s21.334-9.558 21.334-21.333v-106.667c0-11.776-9.536-21.333-21.334-21.333z" />
-<glyph unicode="&#xe602;" d="M256 401.664l-136.832-136.832c-16.662-16.661-16.662-43.67 0-60.331s43.669-16.661 60.331 0l33.834 33.835v-154.496c0-23.552 19.094-42.666 42.667-42.666 23.552 0 42.666 19.115 42.666 42.666v154.496l33.834-33.835c8.341-8.341 19.243-12.502 30.166-12.502s21.824 4.16 30.166 12.502c16.661 16.661 16.661 43.67 0 60.331l-136.832 136.832z" />
-<glyph unicode="&#xe800;" d="M0 25.856v263.168q0 91.648 43.52 142.336t132.608 50.688h280.576q-2.56-2.56-26.624-27.136t-51.2-51.712-55.808-55.808-48.64-47.616-21.504-18.944q-7.68 0-7.68 8.192v79.872h-24.576q-30.208 0-48.128-3.072t-32.256-13.312-19.968-29.184-6.144-49.152v-134.144zM34.304-34.048q2.56 2.56 27.136 27.136t51.2 51.712 55.808 56.32 48.64 47.616 20.992 18.432q7.68 0 7.68-8.192v-79.872h24.576q59.392 0 82.944 18.432t23.040 76.288v134.144l114.688 114.176v-263.168q0-91.648-43.008-142.336t-133.12-50.688h-280.576z" horiz-adv-x="491" />
-<glyph unicode="&#xe801;" d="M150.528 104.192q7.168 7.168 17.408 7.168t18.432-7.168q16.384-17.408 0-35.84l-21.504-20.48q-28.672-28.672-67.584-28.672-39.936 0-68.608 28.672t-28.672 67.584q0 39.936 28.672 68.608l75.776 75.776q35.84 34.816 73.728 39.424t65.536-22.016q8.192-8.192 8.192-18.432t-8.192-18.432q-18.432-16.384-35.84 0-25.6 24.576-67.584-17.408l-75.776-74.752q-13.312-13.312-13.312-32.768t13.312-31.744q13.312-13.312 32.256-13.312t32.256 13.312zM380.928 398.080q28.672-28.672 28.672-67.584 0-39.936-28.672-68.608l-80.896-80.896q-37.888-36.864-76.8-36.864-31.744 0-57.344 25.6-7.168 7.168-7.168 17.408t7.168 18.432q7.168 7.168 17.92 7.168t17.92-7.168q25.6-24.576 62.464 12.288l80.896 79.872q14.336 14.336 14.336 32.768 0 19.456-14.336 31.744-12.288 13.312-28.672 15.872t-30.72-10.752l-25.6-25.6q-8.192-7.168-18.432-7.168t-17.408 7.168q-17.408 17.408 0 35.84l25.6 25.6q27.648 27.648 65.024 26.112t66.048-31.232z" horiz-adv-x="410" />
-<glyph unicode="&#xe802;" d="M438.784 96v-36.352q0-7.68-5.12-12.8t-13.312-5.632h-401.92q-7.68 0-12.8 5.632t-5.632 12.8v36.352q0 7.68 5.632 12.8t12.8 5.632h401.92q7.68 0 13.312-5.632t5.12-12.8zM438.784 242.432v-36.864q0-7.168-5.12-12.8t-13.312-5.12h-401.92q-7.68 0-12.8 5.12t-5.632 12.8v36.864q0 7.168 5.632 12.8t12.8 5.12h401.92q7.68 0 13.312-5.12t5.12-12.8zM438.784 388.352v-36.352q0-7.68-5.12-12.8t-13.312-5.632h-401.92q-7.68 0-12.8 5.632t-5.632 12.8v36.352q0 7.68 5.632 13.312t12.8 5.12h401.92q7.68 0 13.312-5.12t5.12-13.312z" horiz-adv-x="439" />
-<glyph unicode="&#xe803;" d="M235.52 459.52q97.28 0 166.4-69.12t69.12-166.4-69.12-166.4-166.4-69.12-166.4 69.12-69.12 166.4 69.12 166.4 166.4 69.12zM235.52 39.68q76.8 0 130.56 54.272t53.76 130.048q0 76.8-53.76 130.56t-130.56 53.76q-75.776 0-130.048-53.76t-54.272-130.56q0-75.776 54.272-130.048t130.048-54.272zM253.952 357.12v-124.928l76.8-76.8-25.6-25.6-87.040 87.040v140.288h35.84z" horiz-adv-x="471" />
-<glyph unicode="&#xe804;" d="M127.488 44.8q-17.408 0-28.672 14.336l-92.16 120.832q-8.192 12.288-6.144 26.624t13.312 23.552 26.112 7.168 24.064-14.336l60.416-78.848 151.552 242.688q8.192 12.288 22.016 15.36t27.136-4.096q12.288-8.192 15.36-22.016t-4.096-27.136l-179.2-286.72q-10.24-16.384-28.672-16.384z" horiz-adv-x="342" />
-<glyph unicode="&#xe805;" d="M225.28 449.28l61.44-172.032h163.84l-134.144-100.352 48.128-178.176-139.264 106.496-139.264-106.496 48.128 178.176-134.144 100.352h163.84z" horiz-adv-x="451" />
-<glyph unicode="&#xe806;" d="M460.8 49.92q-44.032 77.824-106.496 100.864t-168.96 23.040v-111.616l-185.344 171.008 185.344 164.864v-98.304q46.080 0 86.016-13.824t67.072-35.84 49.152-48.64 35.328-53.248 22.528-48.64 12.288-35.328z" horiz-adv-x="461" />
-<glyph unicode="&#xe807;" d="M471.040 370.432q-18.432-27.648-48.128-50.176v-12.288q0-66.56-30.72-128t-95.232-103.936-148.48-42.496q-81.92 0-148.48 43.008 7.168-1.024 23.552-1.024 67.584 0 119.808 40.96-31.744 1.024-56.32 19.456t-33.792 48.128q5.12-2.048 17.408-2.048 13.312 0 25.6 3.072-33.792 7.168-55.296 33.792t-21.504 61.44v1.024q18.432-10.24 43.008-12.288-43.008 29.696-43.008 80.896 0 24.576 13.312 48.128 78.848-96.256 199.68-100.352-3.072 9.216-3.072 21.504 0 39.936 28.16 68.096t69.12 28.16q41.984 0 69.632-29.696 30.72 6.144 61.44 22.528-10.24-33.792-41.984-53.248 28.672 4.096 55.296 15.36z" horiz-adv-x="471" />
-<glyph unicode="&#xe808;" d="M109.568 96q0-23.040-15.872-38.912t-38.912-15.872-38.912 15.872-15.872 38.912 15.872 38.912 38.912 15.872 38.912-15.872 15.872-38.912zM256 60.672q0.512-7.68-4.608-13.312-5.632-6.144-13.824-6.144h-38.4q-7.168 0-12.288 4.608t-5.632 11.776q-6.144 65.536-52.736 112.128t-112.128 52.736q-7.168 0.512-11.776 5.632t-4.608 12.288v38.4q0 8.192 6.144 13.312 4.608 5.12 12.288 5.12h1.536q45.568-3.584 87.040-23.040t74.24-51.712q32.256-32.256 51.712-74.24t23.040-87.552zM402.432 60.16q0.512-7.68-5.12-13.312-5.12-5.632-13.312-5.632h-40.96q-7.168 0-12.8 5.12t-5.632 11.776q-3.072 61.44-28.672 116.736t-66.048 96.256-96.256 66.048-116.224 29.184q-7.168 0-12.288 5.632t-5.12 12.288v40.96q0 7.68 5.632 13.312 5.12 5.12 12.8 5.12h0.512q75.264-4.096 143.36-34.304t121.856-83.968q53.248-53.248 83.968-121.856t34.304-143.36z" horiz-adv-x="402" />
-<glyph unicode="&#xe809;" d="M0 314.112l75.776 75.776 180.224-179.712 180.224 179.712 75.776-75.776-256-256-75.776 75.776z" />
-<glyph unicode="&#xe80a;" d="M475.648 50.432v219.136q-9.216-10.24-19.968-18.944-76.288-58.368-121.856-96.256-14.336-12.288-23.552-19.456t-24.576-13.824-29.184-6.656h-1.024q-13.312 0-29.184 6.656t-24.576 13.824-23.552 19.456q-45.056 37.888-121.856 96.256-10.752 8.704-19.968 18.944v-219.136q0-4.096 3.072-6.656t6.144-2.56h420.864q3.584 0 6.144 2.56t3.072 6.656zM475.648 350.464v7.168t-0.512 3.584-0.512 3.584-1.536 2.56-2.56 2.048-4.096 1.024h-420.864q-3.584 0-6.144-3.072t-3.072-6.144q0-48.128 41.984-81.408 55.296-43.52 114.688-90.624 2.048-1.024 10.24-8.192t12.8-10.752 12.8-9.216 14.336-7.68 12.288-2.56h1.024q5.632 0 12.288 2.56t14.336 7.68 12.8 9.216 12.8 10.752 10.24 8.192q59.392 47.104 114.688 90.624 15.36 12.288 28.672 33.28t13.312 37.376zM512 361.216v-310.784q0-18.944-13.312-32.256t-32.256-13.824h-420.864q-18.432 0-32.256 13.824t-13.312 32.256v310.784q0 18.944 13.312 32.256t32.256 13.312h420.864q18.944 0 32.256-13.312t13.312-32.256z" />
-<glyph unicode="&#xe80b;" d="M0 133.888l256 256 256-256-75.776-75.776-180.224 179.712-180.224-179.712z" />
-<glyph unicode="&#xe80c;" d="M25.6 279.296q62.464-35.84 168.96-35.84t168.96 35.84l-27.648-248.832q-1.024-7.168-17.92-18.432t-51.2-22.016-72.192-10.752-71.68 10.752-51.2 22.016-18.432 18.432zM275.456 432.896q48.128-9.216 80.896-28.16t32.768-36.352v-5.12q0-29.696-57.344-50.688t-137.216-20.992-137.216 20.992-57.344 50.688v5.12q0 17.408 32.768 36.352t80.896 28.16l21.504 24.576q11.264 13.312 35.84 13.312h47.104q26.624 0 35.84-13.312zM247.808 375.552h43.008q-47.104 56.32-53.248 64.512-7.168 8.192-16.384 8.192h-52.224q-11.264 0-16.384-8.192l-54.272-64.512h43.008l32.768 33.792h41.984z" horiz-adv-x="389" />
-<glyph unicode="&#xe80d;" d="M128 448h256v-64h-256zM480 352h-448c-17.6 0-32-14.4-32-32v-160c0-17.6 14.398-32 32-32h96v-128h256v128h96c17.6 0 32 14.4 32 32v160c0 17.6-14.4 32-32 32zM352 32h-192v160h192v-160zM487.2 304c0-12.813-10.387-23.2-23.199-23.2-12.813 0-23.201 10.387-23.201 23.2s10.388 23.2 23.201 23.2c12.813 0 23.199-10.387 23.199-23.2z" />
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" d="" horiz-adv-x="512" />
+<glyph unicode="&#xe600;" d="M512 778.666c-188.544 0-341.334-152.832-341.334-341.332s152.788-341.334 341.334-341.334 341.334 152.832 341.334 341.334-152.788 341.332-341.334 341.332zM670.164 339.498c16.682-16.682 16.682-43.648 0-60.332-8.32-8.32-19.244-12.5-30.164-12.5s-21.846 4.182-30.164 12.5l-97.836 97.836-97.834-97.836c-8.32-8.32-19.242-12.5-30.166-12.5s-21.846 4.182-30.166 12.5c-16.682 16.682-16.682 43.648 0 60.332l97.834 97.836-97.834 97.834c-16.682 16.682-16.682 43.648 0 60.332s43.648 16.682 60.332 0l97.834-97.834 97.836 97.834c16.682 16.682 43.648 16.682 60.332 0s16.682-43.648 0-60.332l-97.836-97.834 97.836-97.836z" />
+<glyph unicode="&#xe601;" d="M490.666 146.218c-74.070 0-143.7 28.842-196.096 81.196-52.352 52.394-81.236 122.028-81.236 196.14s28.884 143.744 81.236 196.14c16.682 16.682 43.648 16.682 60.332 0s16.682-43.648 0-60.332c-36.266-36.308-56.236-84.522-56.236-135.808s19.968-99.542 56.236-135.808c36.266-36.268 84.438-56.192 135.764-56.192s99.498 19.968 135.766 56.192c36.308 36.268 56.236 84.48 56.236 135.808s-19.968 99.542-56.236 135.808c-16.682 16.682-16.682 43.648 0 60.332s43.648 16.682 60.332 0c52.352-52.438 81.236-122.070 81.236-196.14s-28.884-143.744-81.236-196.14c-52.394-52.352-122.028-81.194-196.096-81.194zM490.666 469.334c-23.594 0-42.666 19.116-42.666 42.666v213.334c0 23.552 19.072 42.666 42.668 42.666s42.668-19.116 42.668-42.666v-213.334c0-23.552-19.072-42.666-42.668-42.666z" />
+<glyph unicode="&#xe602;" d="M512 803.328l-273.664-273.664c-33.324-33.322-33.324-87.34 0-120.662s87.338-33.322 120.662 0l67.668 67.67v-308.992c0-47.104 38.188-85.332 85.334-85.332 47.104 0 85.332 38.23 85.332 85.332v308.992l67.668-67.67c16.682-16.682 38.486-25.004 60.332-25.004s43.648 8.32 60.332 25.004c33.322 33.322 33.322 87.34 0 120.662l-273.664 273.664z" />
+<glyph unicode="&#xe603;" d="M887.757 752.282c0 58.88-88.678 65.382-88.678 65.382l-208.333 13.107c0 0-4.454 56.678-46.541 76.39-42.086 19.61-88.371 13.619-121.651 13.312-33.28-0.358-41.114-42.752-41.114-82.79 0-39.987 0.717-86.221 0.717-115.2 0-52.122-22.886-74.189-80.179-74.189h-118.118c-33.024 2.099-58.726-3.277-58.726-30.003 0-26.778 38.861-254.618 92.211-307.2 30.976-30.515 220.416-51.917 260.301-51.917s26.573 117.811 37.683 117.811c11.11 0 23.245-66.509 86.118-82.074 62.771-15.718 146.637-12.8 151.091-57.498 5.786-58.982 11.11-135.27-27.699-140.698l-87.859-3.482c-60.211 4.301-44.032 70.093-17.459 70.093s39.885 0.973 39.885 0.973l3.328 71.987c0 0-137.882 16.282-143.718-76.698-5.376-84.992 9.216-125.082 19.917-133.786 10.701-8.806 29.235-25.805 198.093-25.805 237.926 0 150.733 693.402 150.733 752.282zM790.528 444.416c-9.318-10.035-43.11 16.384-75.366 16.384-32.307 0-67.123-17.101-75.315-5.786-8.192 11.213 7.475 101.888 68.301 101.888s91.802-102.605 82.381-112.486zM297.165 759.501c0 11.725 2.97 152.781 2.97 152.781l-179.456-176.128c0 0 124.006 0 148.378 0 24.371 0.051 28.109 11.725 28.109 23.347z" />
+<glyph unicode="&#xe604;" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" />
+<glyph unicode="&#xe605;" d="M621.254 82.746l320 320c24.994 24.992 24.994 65.516 0 90.51l-320 320c-24.994 24.992-65.516 24.992-90.51 0-24.994-24.994-24.994-65.516 0-90.51l210.746-210.746h-613.49c-35.346 0-64-28.654-64-64s28.654-64 64-64h613.49l-210.746-210.746c-12.496-12.496-18.744-28.876-18.744-45.254s6.248-32.758 18.744-45.254c24.994-24.994 65.516-24.994 90.51 0z" />
+<glyph unicode="&#xe606;" d="M402.746 82.746l-320 320c-24.994 24.992-24.994 65.516 0 90.51l320 320c24.994 24.992 65.516 24.992 90.51 0 24.994-24.994 24.994-65.516 0-90.51l-210.746-210.746h613.49c35.346 0 64-28.654 64-64s-28.654-64-64-64h-613.49l210.746-210.746c12.496-12.496 18.744-28.876 18.744-45.254s-6.248-32.758-18.744-45.254c-24.994-24.994-65.516-24.994-90.51 0z" />
+<glyph unicode="&#xe607;" d="M262.14 960c-113.728-206.032-132.89-520.304 313.86-509.824v253.824l384-384-384-384v248.372c-534.96-13.942-594.572 472.214-313.86 775.628z" />
+<glyph unicode="&#xe800;" d="M0 51.712v526.336q0 183.296 87.040 284.672t265.216 101.376h561.152q-5.12-5.12-53.248-54.272t-102.4-103.424-111.616-111.616-97.28-95.232-43.008-37.888q-15.36 0-15.36 16.384v159.744h-49.152q-60.416 0-96.256-6.144t-64.512-26.624-39.936-58.368-12.288-98.304v-268.288zM68.608-68.096q5.12 5.12 54.272 54.272t102.4 103.424 111.616 112.64 97.28 95.232 41.984 36.864q15.36 0 15.36-16.384v-159.744h49.152q118.784 0 165.888 36.864t46.080 152.576v268.288l229.376 228.352v-526.336q0-183.296-86.016-284.672t-266.24-101.376h-561.152z" horiz-adv-x="982" />
+<glyph unicode="&#xe801;" d="M301.056 208.384q14.336 14.336 34.816 14.336t36.864-14.336q32.768-34.816 0-71.68l-43.008-40.96q-57.344-57.344-135.168-57.344-79.872 0-137.216 57.344t-57.344 135.168q0 79.872 57.344 137.216l151.552 151.552q71.68 69.632 147.456 78.848t131.072-44.032q16.384-16.384 16.384-36.864t-16.384-36.864q-36.864-32.768-71.68 0-51.2 49.152-135.168-34.816l-151.552-149.504q-26.624-26.624-26.624-65.536t26.624-63.488q26.624-26.624 64.512-26.624t64.512 26.624zM761.856 796.16q57.344-57.344 57.344-135.168 0-79.872-57.344-137.216l-161.792-161.792q-75.776-73.728-153.6-73.728-63.488 0-114.688 51.2-14.336 14.336-14.336 34.816t14.336 36.864q14.336 14.336 35.84 14.336t35.84-14.336q51.2-49.152 124.928 24.576l161.792 159.744q28.672 28.672 28.672 65.536 0 38.912-28.672 63.488-24.576 26.624-57.344 31.744t-61.44-21.504l-51.2-51.2q-16.384-14.336-36.864-14.336t-34.816 14.336q-34.816 34.816 0 71.68l51.2 51.2q55.296 55.296 130.048 52.224t132.096-62.464z" horiz-adv-x="820" />
+<glyph unicode="&#xe802;" d="M877.568 192v-72.704q0-15.36-10.24-25.6t-26.624-11.264h-803.84q-15.36 0-25.6 11.264t-11.264 25.6v72.704q0 15.36 11.264 25.6t25.6 11.264h803.84q15.36 0 26.624-11.264t10.24-25.6zM877.568 484.864v-73.728q0-14.336-10.24-25.6t-26.624-10.24h-803.84q-15.36 0-25.6 10.24t-11.264 25.6v73.728q0 14.336 11.264 25.6t25.6 10.24h803.84q15.36 0 26.624-10.24t10.24-25.6zM877.568 776.704v-72.704q0-15.36-10.24-25.6t-26.624-11.264h-803.84q-15.36 0-25.6 11.264t-11.264 25.6v72.704q0 15.36 11.264 26.624t25.6 10.24h803.84q15.36 0 26.624-10.24t10.24-26.624z" horiz-adv-x="878" />
+<glyph unicode="&#xe803;" d="M471.040 919.040q194.56 0 332.8-138.24t138.24-332.8-138.24-332.8-332.8-138.24-332.8 138.24-138.24 332.8 138.24 332.8 332.8 138.24zM471.040 79.36q153.6 0 261.12 108.544t107.52 260.096q0 153.6-107.52 261.12t-261.12 107.52q-151.552 0-260.096-107.52t-108.544-261.12q0-151.552 108.544-260.096t260.096-108.544zM507.904 714.24v-249.856l153.6-153.6-51.2-51.2-174.080 174.080v280.576h71.68z" horiz-adv-x="942" />
+<glyph unicode="&#xe804;" d="M254.976 89.6q-34.816 0-57.344 28.672l-184.32 241.664q-16.384 24.576-12.288 53.248t26.624 47.104 52.224 14.336 48.128-28.672l120.832-157.696 303.104 485.376q16.384 24.576 44.032 30.72t54.272-8.192q24.576-16.384 30.72-44.032t-8.192-54.272l-358.4-573.44q-20.48-32.768-57.344-32.768z" horiz-adv-x="684" />
+<glyph unicode="&#xe805;" d="M450.56 898.56l122.88-344.064h327.68l-268.288-200.704 96.256-356.352-278.528 212.992-278.528-212.992 96.256 356.352-268.288 200.704h327.68z" horiz-adv-x="902" />
+<glyph unicode="&#xe806;" d="M921.6 99.84q-88.064 155.648-212.992 201.728t-337.92 46.080v-223.232l-370.688 342.016 370.688 329.728v-196.608q92.16 0 172.032-27.648t134.144-71.68 98.304-97.28 70.656-106.496 45.056-97.28 24.576-70.656z" horiz-adv-x="922" />
+<glyph unicode="&#xe807;" d="M942.080 740.864q-36.864-55.296-96.256-100.352v-24.576q0-133.12-61.44-256t-190.464-207.872-296.96-84.992q-163.84 0-296.96 86.016 14.336-2.048 47.104-2.048 135.168 0 239.616 81.92-63.488 2.048-112.64 38.912t-67.584 96.256q10.24-4.096 34.816-4.096 26.624 0 51.2 6.144-67.584 14.336-110.592 67.584t-43.008 122.88v2.048q36.864-20.48 86.016-24.576-86.016 59.392-86.016 161.792 0 49.152 26.624 96.256 157.696-192.512 399.36-200.704-6.144 18.432-6.144 43.008 0 79.872 56.32 136.192t138.24 56.32q83.968 0 139.264-59.392 61.44 12.288 122.88 45.056-20.48-67.584-83.968-106.496 57.344 8.192 110.592 30.72z" horiz-adv-x="942" />
+<glyph unicode="&#xe808;" d="M219.136 192q0-46.080-31.744-77.824t-77.824-31.744-77.824 31.744-31.744 77.824 31.744 77.824 77.824 31.744 77.824-31.744 31.744-77.824zM512 121.344q1.024-15.36-9.216-26.624-11.264-12.288-27.648-12.288h-76.8q-14.336 0-24.576 9.216t-11.264 23.552q-12.288 131.072-105.472 224.256t-224.256 105.472q-14.336 1.024-23.552 11.264t-9.216 24.576v76.8q0 16.384 12.288 26.624 9.216 10.24 24.576 10.24h3.072q91.136-7.168 174.080-46.080t148.48-103.424q64.512-64.512 103.424-148.48t46.080-175.104zM804.864 120.32q1.024-15.36-10.24-26.624-10.24-11.264-26.624-11.264h-81.92q-14.336 0-25.6 10.24t-11.264 23.552q-6.144 122.88-57.344 233.472t-132.096 192.512-192.512 132.096-232.448 58.368q-14.336 0-24.576 11.264t-10.24 24.576v81.92q0 15.36 11.264 26.624 10.24 10.24 25.6 10.24h1.024q150.528-8.192 286.72-68.608t243.712-167.936q106.496-106.496 167.936-243.712t68.608-286.72z" horiz-adv-x="804" />
+<glyph unicode="&#xe809;" d="M0 628.224l151.552 151.552 360.448-359.424 360.448 359.424 151.552-151.552-512-512-151.552 151.552z" />
+<glyph unicode="&#xe80a;" d="M951.296 100.864v438.272q-18.432-20.48-39.936-37.888-152.576-116.736-243.712-192.512-28.672-24.576-47.104-38.912t-49.152-27.648-58.368-13.312h-2.048q-26.624 0-58.368 13.312t-49.152 27.648-47.104 38.912q-90.112 75.776-243.712 192.512-21.504 17.408-39.936 37.888v-438.272q0-8.192 6.144-13.312t12.288-5.12h841.728q7.168 0 12.288 5.12t6.144 13.312zM951.296 700.928v14.336t-1.024 7.168-1.024 7.168-3.072 5.12-5.12 4.096-8.192 2.048h-841.728q-7.168 0-12.288-6.144t-6.144-12.288q0-96.256 83.968-162.816 110.592-87.040 229.376-181.248 4.096-2.048 20.48-16.384t25.6-21.504 25.6-18.432 28.672-15.36 24.576-5.12h2.048q11.264 0 24.576 5.12t28.672 15.36 25.6 18.432 25.6 21.504 20.48 16.384q118.784 94.208 229.376 181.248 30.72 24.576 57.344 66.56t26.624 74.752zM1024 722.432v-621.568q0-37.888-26.624-64.512t-64.512-27.648h-841.728q-36.864 0-64.512 27.648t-26.624 64.512v621.568q0 37.888 26.624 64.512t64.512 26.624h841.728q37.888 0 64.512-26.624t26.624-64.512z" />
+<glyph unicode="&#xe80b;" d="M0 267.776l512 512 512-512-151.552-151.552-360.448 359.424-360.448-359.424z" />
+<glyph unicode="&#xe80c;" d="M51.2 558.592q124.928-71.68 337.92-71.68t337.92 71.68l-55.296-497.664q-2.048-14.336-35.84-36.864t-102.4-44.032-144.384-21.504-143.36 21.504-102.4 44.032-36.864 36.864zM550.912 865.792q96.256-18.432 161.792-56.32t65.536-72.704v-10.24q0-59.392-114.688-101.376t-274.432-41.984-274.432 41.984-114.688 101.376v10.24q0 34.816 65.536 72.704t161.792 56.32l43.008 49.152q22.528 26.624 71.68 26.624h94.208q53.248 0 71.68-26.624zM495.616 751.104h86.016q-94.208 112.64-106.496 129.024-14.336 16.384-32.768 16.384h-104.448q-22.528 0-32.768-16.384l-108.544-129.024h86.016l65.536 67.584h83.968z" horiz-adv-x="778" />
+<glyph unicode="&#xe80d;" d="M256 896h512v-128h-512zM960 704h-896c-35.2 0-64-28.8-64-64v-320c0-35.2 28.796-64 64-64h192v-256h512v256h192c35.2 0 64 28.8 64 64v320c0 35.2-28.8 64-64 64zM704 64h-384v320h384v-320zM974.4 608c0-25.626-20.774-46.4-46.398-46.4-25.626 0-46.402 20.774-46.402 46.4s20.776 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
+<glyph unicode="&#xe904;" d="M896 704v128h-896v-704c0-35.346 28.654-64 64-64h864c53.022 0 96 42.978 96 96v544h-128zM832 128h-768v640h768v-640zM128 640h640v-64h-640zM512 512h256v-64h-256zM512 384h256v-64h-256zM512 256h192v-64h-192zM128 512h320v-320h-320z" />
+<glyph unicode="&#xe90d;" d="M959.884 832c0.040-0.034 0.082-0.076 0.116-0.116v-767.77c-0.034-0.040-0.076-0.082-0.116-0.116h-895.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.772c0.034 0.040 0.076 0.082 0.114 0.114h895.77zM960 896h-896c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v768c0 35.2-28.8 64-64 64v0zM832 672c0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM896 128h-768v128l224 384 256-320h64l224 192z" />
+<glyph unicode="&#xe911;" d="M960 960h64v-736c0-88.366-100.29-160-224-160s-224 71.634-224 160c0 88.368 100.29 160 224 160 62.684 0 119.342-18.4 160-48.040v368.040l-512-113.778v-494.222c0-88.366-100.288-160-224-160s-224 71.634-224 160c0 88.368 100.288 160 224 160 62.684 0 119.342-18.4 160-48.040v624.040l576 128z" />
+<glyph unicode="&#xe913;" d="M0 832v-768h1024v768h-1024zM192 128h-128v128h128v-128zM192 384h-128v128h128v-128zM192 640h-128v128h128v-128zM768 128h-512v640h512v-640zM960 128h-128v128h128v-128zM960 384h-128v128h128v-128zM960 640h-128v128h128v-128zM384 640v-384l256 192z" />
+<glyph unicode="&#xe915;" d="M864 768h-512c-88 0-160-72-160-160v-512c0-88 72-160 160-160h512c88 0 160 72 160 160v512c0 88-72 160-160 160zM416 64c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM416 448c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM608 256c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM800 64c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM800 448c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM828.76 832c-14.93 72.804-79.71 128-156.76 128h-512c-88 0-160-72-160-160v-512c0-77.046 55.196-141.83 128-156.76v636.76c0 35.2 28.8 64 64 64h636.76z" />
+<glyph unicode="&#xe936;" d="M1232 960h-384c-26.4 0-63.274-15.274-81.942-33.942l-476.116-476.116c-18.668-18.668-18.668-49.214 0-67.882l412.118-412.118c18.668-18.668 49.214-18.668 67.882 0l476.118 476.118c18.666 18.666 33.94 55.54 33.94 81.94v384c0 26.4-21.6 48-48 48zM992 576c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM128 416l544 544h-80c-26.4 0-63.274-15.274-81.942-33.942l-476.116-476.116c-18.668-18.668-18.668-49.214 0-67.882l412.118-412.118c18.668-18.668 49.214-18.668 67.882 0l30.058 30.058-416 416z" horiz-adv-x="1280" />
+<glyph unicode="&#xe941;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM320 448c0 106.040 85.96 192 192 192s192-85.96 192-192-85.96-192-192-192-192 85.96-192 192zM925.98 276.524v0l-177.42 73.49c12.518 30.184 19.44 63.276 19.44 97.986s-6.922 67.802-19.44 97.986l177.42 73.49c21.908-52.822 34.020-110.73 34.020-171.476s-12.114-118.654-34.020-171.476v0zM683.478 861.98v0 0l-73.49-177.42c-30.184 12.518-63.276 19.44-97.988 19.44s-67.802-6.922-97.986-19.44l-73.49 177.422c52.822 21.904 110.732 34.018 171.476 34.018 60.746 0 118.654-12.114 171.478-34.020zM98.020 619.476l177.422-73.49c-12.518-30.184-19.442-63.276-19.442-97.986s6.922-67.802 19.44-97.986l-177.42-73.49c-21.906 52.822-34.020 110.73-34.020 171.476s12.114 118.654 34.020 171.476zM340.524 34.020l73.49 177.42c30.184-12.518 63.276-19.44 97.986-19.44s67.802 6.922 97.986 19.44l73.49-177.42c-52.822-21.904-110.73-34.020-171.476-34.020-60.744 0-118.654 12.114-171.476 34.020z" />
+<glyph unicode="&#xe96d;" d="M480 960v0c265.096 0 480-173.914 480-388.448s-214.904-388.448-480-388.448c-25.458 0-50.446 1.62-74.834 4.71-103.106-102.694-222.172-121.108-341.166-123.814v25.134c64.252 31.354 116 88.466 116 153.734 0 9.106-0.712 18.048-2.030 26.794-108.558 71.214-177.97 179.988-177.97 301.89 0 214.534 214.904 388.448 480 388.448zM996 89.314c0-55.942 36.314-104.898 92-131.772v-21.542c-103.126 2.318-197.786 18.102-287.142 106.126-21.14-2.65-42.794-4.040-64.858-4.040-95.47 0-183.408 25.758-253.614 69.040 144.674 0.506 281.26 46.854 384.834 130.672 52.208 42.252 93.394 91.826 122.414 147.348 30.766 58.866 46.366 121.582 46.366 186.406 0 10.448-0.45 20.836-1.258 31.168 72.57-59.934 117.258-141.622 117.258-231.676 0-104.488-60.158-197.722-154.24-258.764-1.142-7.496-1.76-15.16-1.76-22.966z" horiz-adv-x="1152" />
+<glyph unicode="&#xe994;" d="M933.79 349.75c-53.726 93.054-21.416 212.304 72.152 266.488l-100.626 174.292c-28.75-16.854-62.176-26.518-97.846-26.518-107.536 0-194.708 87.746-194.708 195.99h-201.258c0.266-33.41-8.074-67.282-25.958-98.252-53.724-93.056-173.156-124.702-266.862-70.758l-100.624-174.292c28.97-16.472 54.050-40.588 71.886-71.478 53.638-92.908 21.512-211.92-71.708-266.224l100.626-174.292c28.65 16.696 61.916 26.254 97.4 26.254 107.196 0 194.144-87.192 194.7-194.958h201.254c-0.086 33.074 8.272 66.57 25.966 97.218 53.636 92.906 172.776 124.594 266.414 71.012l100.626 174.29c-28.78 16.466-53.692 40.498-71.434 71.228zM512 240.668c-114.508 0-207.336 92.824-207.336 207.334 0 114.508 92.826 207.334 207.336 207.334 114.508 0 207.332-92.826 207.332-207.334-0.002-114.51-92.824-207.334-207.332-207.334z" />
+<glyph unicode="&#xe9ca;" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512-0.002c-62.958 0-122.872 13.012-177.23 36.452l233.148 262.29c5.206 5.858 8.082 13.422 8.082 21.26v96c0 17.674-14.326 32-32 32-112.99 0-232.204 117.462-233.374 118.626-6 6.002-14.14 9.374-22.626 9.374h-128c-17.672 0-32-14.328-32-32v-192c0-12.122 6.848-23.202 17.69-28.622l110.31-55.156v-187.886c-116.052 80.956-192 215.432-192 367.664 0 68.714 15.49 133.806 43.138 192h116.862c8.488 0 16.626 3.372 22.628 9.372l128 128c6 6.002 9.372 14.14 9.372 22.628v77.412c40.562 12.074 83.518 18.588 128 18.588 70.406 0 137.004-16.26 196.282-45.2-4.144-3.502-8.176-7.164-12.046-11.036-36.266-36.264-56.236-84.478-56.236-135.764s19.97-99.5 56.236-135.764c36.434-36.432 85.218-56.264 135.634-56.26 3.166 0 6.342 0.080 9.518 0.236 13.814-51.802 38.752-186.656-8.404-372.334-0.444-1.744-0.696-3.488-0.842-5.224-81.324-83.080-194.7-134.656-320.142-134.656z" />
+<glyph unicode="&#xea2e;" d="M889.68 793.68c-93.608 102.216-228.154 166.32-377.68 166.32-282.77 0-512-229.23-512-512h96c0 229.75 186.25 416 416 416 123.020 0 233.542-53.418 309.696-138.306l-149.696-149.694h352v352l-134.32-134.32zM928 448c0-229.75-186.25-416-416-416-123.020 0-233.542 53.418-309.694 138.306l149.694 149.694h-352v-352l134.32 134.32c93.608-102.216 228.154-166.32 377.68-166.32 282.77 0 512 229.23 512 512h-96z" />
 </font></defs></svg>
\ No newline at end of file
index bb1f21f888d3786dd6db4bc0d75ab322b1eaac75..f53c9590df93f94a17e2ccf1a37323008b0d0a40 100644 (file)
Binary files a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.ttf and b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.ttf differ
index bab137795473159c2c2c0c176cfea5d3dce56ec7..2a12440c6e5b489f479da1dd0c0800efcf84e80c 100644 (file)
Binary files a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.woff and b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/public/fonts/icomoon.woff differ
index d060311d4400f1784a92cbcbe561e3fa39f93d11..8743dc1dd0b207f15508376b0a734f60e0afb8d9 100644 (file)
                             </div>
 
                             {% if twofactor_auth %}
+                            <div class="row">
+                                <div class="input-field col s12">
+                                    {% trans %}Enabling two factor authentication means you'll receive an email with a code on every new untrusted connexion{% endtrans %}
+                                </div>
+                            </div>
+
                             <div class="row">
                                 <div class="input-field col s12">
                                     {{ form_widget(form.user.twoFactorAuthentication) }}
index fd84d984edb970d82b206c7f83d94ac633be1397..8140f360679e46c4353b031f7c9fe970ee78512f 100644 (file)
             <div class="collapsible-body"></div>
         </li>
 
+        <li class="bold hide-on-med-and-down">
+            <a class="waves-effect collapsible-header" title="{% trans %}Reload content{% endtrans %}" href="{{ path('reload_entry', { 'id': entry.id }) }}" id="reload">
+                <i class="mdi-action-autorenew small"></i>
+                <span>{% trans %}Reload content{% endtrans %}</span>
+            </a>
+            <div class="collapsible-body"></div>
+        </li>
+
         <li class="bold hide-on-med-and-down">
             <a class="waves-effect collapsible-header" title="{% trans %}Mark as read{% endtrans %}" href="{{ path('archive_entry', { 'id': entry.id }) }}" id="markAsRead">
                 <i class="{% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %} small"></i>
index 9f585d85d722ecf13c89a5d6a287cccd9c0acbca..96f402b0973758cef2fe059bee46e2899d62381e 100644 (file)
@@ -180,6 +180,38 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertContains($content->getTitle(), $client->getResponse()->getContent());
     }
 
+    /**
+     * @depends testPostNewOk
+     *
+     * This test will require an internet connection.
+     */
+    public function testReload()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $content = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findOneByUrl($this->url);
+
+        // empty content
+        $content->setContent('');
+        $client->getContainer()->get('doctrine.orm.entity_manager')->persist($content);
+        $client->getContainer()->get('doctrine.orm.entity_manager')->flush();
+
+        $client->request('GET', '/reload/'.$content->getId());
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+        $content = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findOneByUrl($this->url);
+
+        $this->assertNotEmpty($content->getContent());
+    }
+
     public function testEdit()
     {
         $this->logInAs('admin');
diff --git a/src/Wallabag/UserBundle/DependencyInjection/Configuration.php b/src/Wallabag/UserBundle/DependencyInjection/Configuration.php
new file mode 100644 (file)
index 0000000..4223f8d
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+namespace Wallabag\UserBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+class Configuration implements ConfigurationInterface
+{
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('wallabag_user');
+
+        return $treeBuilder;
+    }
+}
diff --git a/src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php b/src/Wallabag/UserBundle/DependencyInjection/WallabagUserExtension.php
new file mode 100644 (file)
index 0000000..c12a893
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+namespace Wallabag\UserBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+use Symfony\Component\DependencyInjection\Loader;
+
+class WallabagUserExtension extends Extension
+{
+    public function load(array $configs, ContainerBuilder $container)
+    {
+        $configuration = new Configuration();
+        $config = $this->processConfiguration($configuration, $configs);
+
+        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+        $loader->load('services.yml');
+    }
+
+    public function getAlias()
+    {
+        return 'wallabag_user';
+    }
+}
diff --git a/src/Wallabag/UserBundle/Mailer/AuthCodeMailer.php b/src/Wallabag/UserBundle/Mailer/AuthCodeMailer.php
new file mode 100644 (file)
index 0000000..f196007
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+
+namespace Wallabag\UserBundle\Mailer;
+
+use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface;
+use Scheb\TwoFactorBundle\Mailer\AuthCodeMailerInterface;
+use Symfony\Component\Translation\DataCollectorTranslator;
+
+/**
+ * Custom mailer for TwoFactorBundle email.
+ * It adds a custom template to the email so user won't get a lonely authentication code but a complete email.
+ */
+class AuthCodeMailer implements AuthCodeMailerInterface
+{
+    /**
+     * SwiftMailer.
+     *
+     * @var \Swift_Mailer
+     */
+    private $mailer;
+
+    /**
+     * Translator for email content.
+     *
+     * @var DataCollectorTranslator
+     */
+    private $translator;
+
+    /**
+     * Sender email address.
+     *
+     * @var string
+     */
+    private $senderEmail;
+
+    /**
+     * Sender name.
+     *
+     * @var string
+     */
+    private $senderName;
+
+    /**
+     * Support URL to report any bugs.
+     *
+     * @var string
+     */
+    private $supportUrl;
+
+    /**
+     * Initialize the auth code mailer with the SwiftMailer object.
+     *
+     * @param \Swift_Mailer           $mailer
+     * @param DataCollectorTranslator $translator
+     * @param string                  $senderEmail
+     * @param string                  $senderName
+     * @param string                  $supportUrl
+     */
+    public function __construct(\Swift_Mailer $mailer, DataCollectorTranslator $translator, $senderEmail, $senderName, $supportUrl)
+    {
+        $this->mailer = $mailer;
+        $this->translator = $translator;
+        $this->senderEmail = $senderEmail;
+        $this->senderName = $senderName;
+        $this->supportUrl = $supportUrl;
+    }
+
+    /**
+     * Send the auth code to the user via email.
+     *
+     * @param TwoFactorInterface $user
+     */
+    public function sendAuthCode(TwoFactorInterface $user)
+    {
+        $message = new \Swift_Message();
+        $message
+            ->setTo($user->getEmail())
+            ->setFrom($this->senderEmail, $this->senderName)
+            ->setSubject($this->translator->trans('auth_code.mailer.subject', array(), 'wallabag_user'))
+            ->setBody($this->translator->trans(
+                'auth_code.mailer.body',
+                [
+                    '%user%' => $user->getName(),
+                    '%code%' => $user->getEmailAuthCode(),
+                    '%support%' => $this->supportUrl,
+                ],
+                'wallabag_user'
+            ))
+        ;
+
+        $this->mailer->send($message);
+    }
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9109b6a378ab0c2dee6970f159055a38fda8f494 100644 (file)
@@ -0,0 +1,9 @@
+services:
+    wallabag_user.auth_code_mailer:
+        class: Wallabag\UserBundle\Mailer\AuthCodeMailer
+        arguments:
+            - "@mailer"
+            - "@translator"
+            - "%scheb_two_factor.email.sender_email%"
+            - "%scheb_two_factor.email.sender_name%"
+            - "%wallabag_support_url%"
diff --git a/src/Wallabag/UserBundle/Resources/translations/wallabag_user.en.yml b/src/Wallabag/UserBundle/Resources/translations/wallabag_user.en.yml
new file mode 100644 (file)
index 0000000..f806d1d
--- /dev/null
@@ -0,0 +1,10 @@
+# Two factor mail
+auth_code.mailer.subject: 'Wallabag authentication Code'
+auth_code.mailer.body: |
+    Hi %user%,
+
+    Since you enable two factor authentication on your wallabag account and you just logged in from a new device (computer, phone, etc.), we send you a code to validate your connection.
+    Here is the code: %code%
+
+    Please don't hesitate to contact us if you have any problems: %support%
+    The wallabag team
diff --git a/src/Wallabag/UserBundle/Resources/translations/wallabag_user.fr.yml b/src/Wallabag/UserBundle/Resources/translations/wallabag_user.fr.yml
new file mode 100644 (file)
index 0000000..386b2d9
--- /dev/null
@@ -0,0 +1,10 @@
+# Two factor mail
+auth_code.mailer.subject: "Code d'authentification wallabag"
+auth_code.mailer.body: |
+    Bonjour %user%,
+
+    Comme vous avez activé la double authentification sur votre compte wallabag et que vous venez de vous connecter depuis un nouvel appareil (ordinateur, téléphone, etc.), nous vous envoyons un code pour valider votre connexion.
+    Voici le code à renseigner: %code%
+
+    Si vous avez un problème de connexion, n'hésitez pas à contacter le support: %support%
+    L'équipe wallabag
diff --git a/src/Wallabag/UserBundle/Tests/Mailer/AuthCodeMailerTest.php b/src/Wallabag/UserBundle/Tests/Mailer/AuthCodeMailerTest.php
new file mode 100644 (file)
index 0000000..9122576
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+namespace Wallabag\UserBundle\Tests\Mailer;
+
+use Wallabag\UserBundle\Entity\User;
+use Wallabag\UserBundle\Mailer\AuthCodeMailer;
+use Symfony\Component\Translation\Translator;
+use Symfony\Component\Translation\Loader\ArrayLoader;
+use Symfony\Component\Translation\DataCollectorTranslator;
+
+/**
+ * @see https://www.pmg.com/blog/integration-testing-swift-mailer/
+ */
+final class CountableMemorySpool extends \Swift_MemorySpool implements \Countable
+{
+    public function count()
+    {
+        return count($this->messages);
+    }
+
+    public function getMessages()
+    {
+        return $this->messages;
+    }
+}
+
+class AuthCodeMailerTest extends \PHPUnit_Framework_TestCase
+{
+    protected $mailer;
+    protected $spool;
+    protected $dataCollector;
+
+    protected function setUp()
+    {
+        $this->spool = new CountableMemorySpool();
+        $transport = new \Swift_Transport_SpoolTransport(
+            new \Swift_Events_SimpleEventDispatcher(),
+            $this->spool
+        );
+        $this->mailer = new \Swift_Mailer($transport);
+
+        $translator = new Translator('en');
+        $translator->addLoader('array', new ArrayLoader());
+        $translator->addResource('array', array(
+            'auth_code.mailer.subject' => 'auth_code subject',
+            'auth_code.mailer.body' => 'Hi %user%, here is the code: %code% and the support: %support%',
+        ), 'en', 'wallabag_user');
+
+        $this->dataCollector = new DataCollectorTranslator($translator);
+    }
+
+    public function testSendEmail()
+    {
+        $user = new User();
+        $user->setTwoFactorAuthentication(true);
+        $user->setEmailAuthCode(666666);
+        $user->setEmail('test@wallabag.io');
+        $user->setName('Bob');
+
+        $authCodeMailer = new AuthCodeMailer(
+            $this->mailer,
+            $this->dataCollector,
+            'nobody@test.io',
+            'wallabag test',
+            'http://0.0.0.0'
+        );
+
+        $authCodeMailer->sendAuthCode($user);
+
+        $this->assertCount(1, $this->spool);
+
+        $msg = $this->spool->getMessages()[0];
+        $this->assertArrayHasKey('test@wallabag.io', $msg->getTo());
+        $this->assertEquals(array('nobody@test.io' => 'wallabag test'), $msg->getFrom());
+        $this->assertEquals('auth_code subject', $msg->getSubject());
+        $this->assertContains('Hi Bob, here is the code: 666666 and the support: http://0.0.0.0', $msg->toString());
+    }
+}