use Wallabag\CoreBundle\Entity\Tag;
use Wallabag\CoreBundle\Event\EntryDeletedEvent;
use Wallabag\CoreBundle\Event\EntrySavedEvent;
+use Wallabag\CoreBundle\Helper\UrlHasher;
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;
}
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);
}
/**
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.
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
$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)) {
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;
/**
public function setUrl($url)
{
$this->url = $url;
- $this->hashedUrl = hash('sha1', $url);
+ $this->hashedUrl = UrlHasher::hashUrl($url);
return $this;
}
--- /dev/null
+<?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);
+ }
+}
use Pagerfanta\Pagerfanta;
use Wallabag\CoreBundle\Entity\Entry;
use Wallabag\CoreBundle\Entity\Tag;
+use Wallabag\CoreBundle\Helper\UrlHasher;
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);
}
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.
*