Allow to reject specific languages on receiving posts via the relay

This commit is contained in:
Michael Vogel 2022-09-19 12:36:12 +02:00
parent 636325efcc
commit f08b08e0d8
5 changed files with 51 additions and 16 deletions

View file

@ -1870,23 +1870,33 @@ class Item
return '';
}
// Convert attachments to links
$naked_body = BBCode::removeAttachment($item['body']);
if (empty($naked_body)) {
$languages = self::getLanguageArray(trim($item['title'] . "\n" . $item['body']));
if (empty($languages)) {
return '';
}
return json_encode($languages);
}
public static function getLanguageArray(string $body): array
{
// Convert attachments to links
$naked_body = BBCode::removeAttachment($body);
if (empty($naked_body)) {
return [];
}
// Remove links and pictures
$naked_body = BBCode::removeLinks($naked_body);
// Convert the title and the body to plain text
$naked_body = trim($item['title'] . "\n" . BBCode::toPlaintext($naked_body));
$naked_body = BBCode::toPlaintext($naked_body);
// Remove possibly remaining links
$naked_body = preg_replace(Strings::autoLinkRegEx(), '', $naked_body);
if (empty($naked_body)) {
return '';
return [];
}
$naked_body = self::getDominantLanguage($naked_body);
@ -1898,12 +1908,7 @@ class Item
$availableLanguages['fa'] = 'fa';
$ld = new Language(array_keys($availableLanguages));
$languages = $ld->detect($naked_body)->limit(0, 3)->close();
if (is_array($languages)) {
return json_encode($languages);
}
return '';
return $ld->detect($naked_body)->limit(0, 3)->close() ?: [];
}
/**

View file

@ -91,7 +91,7 @@ class Processor
* @param string $body
* @return string
*/
protected static function normalizeMentionLinks(string $body): string
public static function normalizeMentionLinks(string $body): string
{
return preg_replace('%\[url=([^\[\]]*)]([#@!])(.*?)\[/url]%ism', '$2[url=$1]$3[/url]', $body);
}

View file

@ -29,6 +29,7 @@ use Friendica\DI;
use Friendica\Model\APContact;
use Friendica\Model\Contact;
use Friendica\Model\GServer;
use Friendica\Model\Item;
use Friendica\Model\Post;
use Friendica\Model\Search;
use Friendica\Model\Tag;
@ -76,6 +77,8 @@ class Relay
return false;
}
$body = ActivityPub\Processor::normalizeMentionLinks($body);
$systemTags = [];
$userTags = [];
$denyTags = [];
@ -125,6 +128,25 @@ class Relay
}
}
$languages = [];
foreach (Item::getLanguageArray($body) as $language => $reliability) {
if ($reliability > 0) {
$languages[] = $language;
}
}
Logger::debug('Got languages', ['languages' => $languages, 'body' => $body]);
if (!empty($languages)) {
if (in_array($languages[0], $config->get('system', 'relay_deny_languages'))) {
Logger::info('Unwanted language found - rejected', ['language' => $languages[0], 'network' => $network, 'url' => $url]);
return false;
}
} elseif ($config->get('system', 'relay_deny_undetected_language')) {
Logger::info('Undetected language found - rejected', ['body' => $body, 'network' => $network, 'url' => $url]);
return false;
}
if ($scope == self::SCOPE_ALL) {
Logger::info('Server accept all posts - accepted', ['network' => $network, 'url' => $url]);
return true;

View file

@ -152,13 +152,13 @@ class Profiler implements ContainerInterface
* Saves a timestamp for a value - f.e. a call
* Necessary for profiling Friendica
*
* @param int $timestamp the Timestamp
* @param float $timestamp the Timestamp
* @param string $value A value to profile
* @param string $callstack A callstack string, generated if absent
*
* @return void
*/
public function saveTimestamp(int $timestamp, string $value, string $callstack = '')
public function saveTimestamp(float $timestamp, string $value, string $callstack = '')
{
if (!$this->enabled) {
return;
@ -358,9 +358,9 @@ class Profiler implements ContainerInterface
* @throws NotFoundExceptionInterface No entry was found for **this** identifier.
* @throws ContainerExceptionInterface Error while retrieving the entry.
*
* @return int Entry.
* @return float Entry.
*/
public function get(string $id): int
public function get(string $id): float
{
if (!$this->has($id)) {
return 0;

View file

@ -525,6 +525,14 @@ return [
// The authentication password for the redis database
'redis_password' => null,
// relay_deny_languages (Array)
// Array of languages that are rejected.
'relay_deny_languages' => [],
// relay_deny_undetected_language (Boolean)
// Deny undetected languages
'relay_deny_undetected_language' => false,
// session_handler (database|cache|native)
// Whether to use Cache to store session data or to use PHP native session storage.
'session_handler' => 'database',