1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-08-01 17:38:38 +00:00

Merge pull request #3192 from wallabag/validate-content-fields

Validate language & preview picture fields
This commit is contained in:
Jérémy Benoist 2017-06-09 13:51:26 +02:00 committed by GitHub
commit a899399989
5 changed files with 275 additions and 41 deletions

View file

@ -7,6 +7,9 @@ use Psr\Log\LoggerInterface;
use Wallabag\CoreBundle\Entity\Entry;
use Wallabag\CoreBundle\Tools\Utils;
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser;
use Symfony\Component\Validator\Constraints\Locale as LocaleConstraint;
use Symfony\Component\Validator\Constraints\Url as UrlConstraint;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* This kind of proxy class take care of getting the content from an url
@ -16,15 +19,17 @@ class ContentProxy
{
protected $graby;
protected $tagger;
protected $validator;
protected $logger;
protected $mimeGuesser;
protected $fetchingErrorMessage;
protected $eventDispatcher;
public function __construct(Graby $graby, RuleBasedTagger $tagger, LoggerInterface $logger, $fetchingErrorMessage)
public function __construct(Graby $graby, RuleBasedTagger $tagger, ValidatorInterface $validator, LoggerInterface $logger, $fetchingErrorMessage)
{
$this->graby = $graby;
$this->tagger = $tagger;
$this->validator = $validator;
$this->logger = $logger;
$this->mimeGuesser = new MimeTypeExtensionGuesser();
$this->fetchingErrorMessage = $fetchingErrorMessage;
@ -113,7 +118,24 @@ class ContentProxy
$entry->setHeaders($content['all_headers']);
}
$entry->setLanguage(isset($content['language']) ? $content['language'] : '');
$this->validateAndSetLanguage(
$entry,
isset($content['language']) ? $content['language'] : ''
);
$this->validateAndSetPreviewPicture(
$entry,
isset($content['open_graph']['og_image']) ? $content['open_graph']['og_image'] : ''
);
// if content is an image, define it as a preview too
if (!empty($content['content_type']) && in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) {
$this->validateAndSetPreviewPicture(
$entry,
$content['url']
);
}
$entry->setMimetype(isset($content['content_type']) ? $content['content_type'] : '');
$entry->setReadingTime(Utils::getReadingTime($html));
@ -122,15 +144,6 @@ class ContentProxy
$entry->setDomainName($domainName);
}
if (!empty($content['open_graph']['og_image'])) {
$entry->setPreviewPicture($content['open_graph']['og_image']);
}
// if content is an image define as a preview too
if (!empty($content['content_type']) && in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) {
$entry->setPreviewPicture($content['url']);
}
try {
$this->tagger->tag($entry);
} catch (\Exception $e) {
@ -152,4 +165,52 @@ class ContentProxy
{
return !empty($content['title']) && !empty($content['html']) && !empty($content['url']);
}
/**
* Use a Symfony validator to ensure the language is well formatted.
*
* @param Entry $entry
* @param string $value Language to validate
*/
private function validateAndSetLanguage($entry, $value)
{
// some lang are defined as fr-FR, es-ES.
// replacing - by _ might increase language support
$value = str_replace('-', '_', $value);
$errors = $this->validator->validate(
$value,
(new LocaleConstraint())
);
if (0 === count($errors)) {
$entry->setLanguage($value);
return;
}
$this->logger->warning('Language validation failed. '.(string) $errors);
}
/**
* Use a Symfony validator to ensure the preview picture is a real url.
*
* @param Entry $entry
* @param string $value URL to validate
*/
private function validateAndSetPreviewPicture($entry, $value)
{
$errors = $this->validator->validate(
$value,
(new UrlConstraint())
);
if (0 === count($errors)) {
$entry->setPreviewPicture($value);
return;
}
$this->logger->warning('PreviewPicture validation failed. '.(string) $errors);
}
}

View file

@ -90,6 +90,7 @@ services:
arguments:
- "@wallabag_core.graby"
- "@wallabag_core.rule_based_tagger"
- "@validator"
- "@logger"
- '%wallabag_core.fetching_error_message%'