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:
commit
a899399989
5 changed files with 275 additions and 41 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,6 +90,7 @@ services:
|
|||
arguments:
|
||||
- "@wallabag_core.graby"
|
||||
- "@wallabag_core.rule_based_tagger"
|
||||
- "@validator"
|
||||
- "@logger"
|
||||
- '%wallabag_core.fetching_error_message%'
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue