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 '';
|
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 '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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',
|
||||||
|
|
Loading…
Reference in a new issue