Merge pull request #11908 from annando/relay-languages
Allow to reject specific languages on receiving posts via the relay
This commit is contained in:
commit
ddfc0f2cd9
5 changed files with 58 additions and 16 deletions
|
@ -1870,23 +1870,40 @@ 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']), 3);
|
||||
if (empty($languages)) {
|
||||
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
|
||||
$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 +1915,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, $count)->close() ?: [];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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, 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) {
|
||||
Logger::info('Server accept all posts - accepted', ['network' => $network, 'url' => $url]);
|
||||
return true;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -525,6 +525,14 @@ return [
|
|||
// The authentication password for the redis database
|
||||
'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)
|
||||
// Whether to use Cache to store session data or to use PHP native session storage.
|
||||
'session_handler' => 'database',
|
||||
|
|
Loading…
Reference in a new issue