Merge pull request #11908 from annando/relay-languages

Allow to reject specific languages on receiving posts via the relay
This commit is contained in:
Hypolite Petovan 2022-09-20 21:04:58 -04:00 committed by GitHub
commit ddfc0f2cd9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 16 deletions

View file

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

View file

@ -91,7 +91,7 @@ class Processor
* @param string $body * @param string $body
* @return string * @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); 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\APContact;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Model\GServer; use Friendica\Model\GServer;
use Friendica\Model\Item;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Model\Search; use Friendica\Model\Search;
use Friendica\Model\Tag; use Friendica\Model\Tag;
@ -76,6 +77,8 @@ class Relay
return false; return false;
} }
$body = ActivityPub\Processor::normalizeMentionLinks($body);
$systemTags = []; $systemTags = [];
$userTags = []; $userTags = [];
$denyTags = []; $denyTags = [];
@ -125,6 +128,25 @@ class Relay
} }
} }
$languages = [];
foreach (Item::getLanguageArray($body, 10) 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) { if ($scope == self::SCOPE_ALL) {
Logger::info('Server accept all posts - accepted', ['network' => $network, 'url' => $url]); Logger::info('Server accept all posts - accepted', ['network' => $network, 'url' => $url]);
return true; return true;

View file

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

View file

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