]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Add Wallabag\CoreBundle\Helper\UrlHasher
authorOlivier Mehani <shtrom@ssji.net>
Fri, 10 May 2019 12:07:55 +0000 (22:07 +1000)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Fri, 24 May 2019 13:17:46 +0000 (15:17 +0200)
Signed-off-by: Olivier Mehani <shtrom@ssji.net>
src/Wallabag/ApiBundle/Controller/EntryRestController.php
src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Helper/UrlHasher.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Repository/EntryRepository.php

index 17b53a0189d6284e849332d373511fc520e5e391..77eb489e61ea099e4326b4883dc1711760bd177e 100644 (file)
@@ -14,6 +14,7 @@ use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Entity\Tag;
 use Wallabag\CoreBundle\Event\EntryDeletedEvent;
 use Wallabag\CoreBundle\Event\EntrySavedEvent;
+use Wallabag\CoreBundle\Helper\UrlHasher;
 
 class EntryRestController extends WallabagRestController
 {
@@ -56,8 +57,8 @@ class EntryRestController extends WallabagRestController
         }
 
         $urlHashMap = [];
-        foreach($urls as $urlToHash) {
-            $urlHash = hash('sha1', $urlToHash); // XXX: the hash logic would better be in a separate util to avoid duplication with GenerateUrlHashesCommand::generateHashedUrls
+        foreach ($urls as $urlToHash) {
+            $urlHash = UrlHasher::hashUrl($urlToHash);
             $hashedUrls[] = $urlHash;
             $urlHashMap[$urlHash] = $urlToHash;
         }
@@ -77,25 +78,11 @@ class EntryRestController extends WallabagRestController
 
         if (!empty($url) || !empty($hashedUrl)) {
             $hu = array_keys($results)[0];
+
             return $this->sendResponse(['exists' => $results[$hu]]);
         }
-        return $this->sendResponse($results);
-    }
 
-    /**
-     * Replace the hashedUrl keys in $results with the unhashed URL from the
-     * request, as recorded in $urlHashMap.
-     */
-    private function replaceUrlHashes(array $results, array $urlHashMap) {
-        $newResults = [];
-        foreach($results as $hash => $res) {
-            if (isset($urlHashMap[$hash])) {
-                $newResults[$urlHashMap[$hash]] = $res;
-            } else {
-                $newResults[$hash] = $res;
-            }
-        }
-        return $newResults;
+        return $this->sendResponse($results);
     }
 
     /**
@@ -815,6 +802,24 @@ class EntryRestController extends WallabagRestController
         return $this->sendResponse($results);
     }
 
+    /**
+     * Replace the hashedUrl keys in $results with the unhashed URL from the
+     * request, as recorded in $urlHashMap.
+     */
+    private function replaceUrlHashes(array $results, array $urlHashMap)
+    {
+        $newResults = [];
+        foreach ($results as $hash => $res) {
+            if (isset($urlHashMap[$hash])) {
+                $newResults[$urlHashMap[$hash]] = $res;
+            } else {
+                $newResults[$hash] = $res;
+            }
+        }
+
+        return $newResults;
+    }
+
     /**
      * Retrieve value from the request.
      * Used for POST & PATCH on a an entry.
index 45bd8c5ffd08a505120db9c2e28ff4e3fe6316dd..775b04138f3028cd3754ee79f6fdede90f5446f6 100644 (file)
@@ -7,6 +7,7 @@ use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Wallabag\CoreBundle\Helper\UrlHasher;
 use Wallabag\UserBundle\Entity\User;
 
 class GenerateUrlHashesCommand extends ContainerAwareCommand
@@ -65,7 +66,9 @@ class GenerateUrlHashesCommand extends ContainerAwareCommand
 
         $i = 1;
         foreach ($entries as $entry) {
-            $entry->setHashedUrl(hash('sha1', $entry->getUrl()));
+            $entry->setHashedUrl(
+                UrlHasher::hashUrl($entry->getUrl())
+            );
             $em->persist($entry);
 
             if (0 === ($i % 20)) {
index c3fb87d218630875e77047002fad2bad55b091d1..1b4367fd79d6feee50a98a43758f4bd0d2500a9d 100644 (file)
@@ -13,6 +13,7 @@ use JMS\Serializer\Annotation\XmlRoot;
 use Symfony\Component\Validator\Constraints as Assert;
 use Wallabag\AnnotationBundle\Entity\Annotation;
 use Wallabag\CoreBundle\Helper\EntityTimestampsTrait;
+use Wallabag\CoreBundle\Helper\UrlHasher;
 use Wallabag\UserBundle\Entity\User;
 
 /**
@@ -324,7 +325,7 @@ class Entry
     public function setUrl($url)
     {
         $this->url = $url;
-        $this->hashedUrl = hash('sha1', $url);
+        $this->hashedUrl = UrlHasher::hashUrl($url);
 
         return $this;
     }
diff --git a/src/Wallabag/CoreBundle/Helper/UrlHasher.php b/src/Wallabag/CoreBundle/Helper/UrlHasher.php
new file mode 100644 (file)
index 0000000..e44f219
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+namespace Wallabag\CoreBundle\Helper;
+
+/**
+ * Hash URLs for privacy and performance.
+ */
+class UrlHasher
+{
+    /** @var string */
+    const ALGORITHM = 'sha1';
+
+    /**
+     * @param string $url
+     *
+     * @return string hashed $url
+     */
+    public static function hashUrl(string $url)
+    {
+        return hash(static::ALGORITHM, $url);
+    }
+}
index 960b682dfc855395e286288de2507dee0dd3149f..37fc1000fb78af4caf0901e3c3f87807d0600c1b 100644 (file)
@@ -9,6 +9,7 @@ use Pagerfanta\Adapter\DoctrineORMAdapter;
 use Pagerfanta\Pagerfanta;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Entity\Tag;
+use Wallabag\CoreBundle\Helper\UrlHasher;
 
 class EntryRepository extends EntityRepository
 {
@@ -349,7 +350,7 @@ class EntryRepository extends EntityRepository
     public function findByUrlAndUserId($url, $userId)
     {
         return $this->findByHashedUrlAndUserId(
-            hash('sha1', $url), // XXX: the hash logic would better be in a separate util to avoid duplication with GenerateUrlHashesCommand::generateHashedUrls
+            UrlHasher::hashUrl($url),
             $userId);
     }
 
@@ -506,6 +507,32 @@ class EntryRepository extends EntityRepository
         return $this->find($randomId);
     }
 
+    /**
+     * Inject a UrlHasher.
+     *
+     * @param UrlHasher $hasher
+     */
+    public function setUrlHasher(UrlHasher $hasher)
+    {
+        $this->urlHasher = $hasher;
+    }
+
+    /**
+     * Get the UrlHasher, or create a default one if not injected.
+     *
+     * XXX: the default uses the default hash algorithm
+     *
+     * @return UrlHasher
+     */
+    protected function getUrlHasher()
+    {
+        if (!isset($this->urlHasher)) {
+            $this->setUrlHasher(new UrlHasher());
+        }
+
+        return $this->urlHasher;
+    }
+
     /**
      * Return a query builder to be used by other getBuilderFor* method.
      *