Unified BBCode conversion, improved proxy functionality

This commit is contained in:
Michael 2023-07-15 20:12:08 +00:00
parent 81d2d4b70e
commit 8bb33dccd1
22 changed files with 61 additions and 35 deletions

View file

@ -312,8 +312,7 @@ class OEmbed
*/
public static function BBCode2HTML(string $text): string
{
$stopoembed = DI::config()->get('system', 'no_oembed');
if ($stopoembed == true) {
if (DI::config()->get('system', 'no_oembed')) {
return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "<!-- oembed $1 --><i>" . DI::l10n()->t('Embedding disabled') . " : $1</i><!-- /oembed $1 -->", $text);
}
return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", [self::class, 'replaceCallback'], $text);

View file

@ -142,7 +142,7 @@ class BBCode
break;
case 'title':
$value = self::convert(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), false, true);
$value = self::convertForUriId(0, html_entity_decode($value, ENT_QUOTES, 'UTF-8'), BBCode::EXTERNAL);
$value = html_entity_decode($value, ENT_QUOTES, 'UTF-8');
$value = str_replace(['[', ']'], ['&#91;', '&#93;'], $value);
$data['title'] = $value;
@ -236,7 +236,7 @@ class BBCode
// Remove attachment
$text = self::replaceAttachment($text);
$naked_text = HTML::toPlaintext(self::convert($text, false, 0, true), 0, !$keep_urls);
$naked_text = HTML::toPlaintext(self::convert($text, false, BBCode::EXTERNAL, true), 0, !$keep_urls);
DI::profiler()->stopRecording();
return $naked_text;
@ -2065,7 +2065,7 @@ class BBCode
// Convert it to HTML - don't try oembed
if ($for_diaspora) {
$text = self::convert($text, false, self::DIASPORA);
$text = self::convertForUriId(0, $text, self::DIASPORA);
// Add all tags that maybe were removed
if (preg_match_all("/#\[url\=([$url_search_string]*)\](.*?)\[\/url\]/ism", $original_text, $tags)) {
@ -2079,7 +2079,7 @@ class BBCode
$text = $text . ' ' . $tagline;
}
} else {
$text = self::convert($text, false, self::CONNECTORS);
$text = self::convertForUriId(0, $text, self::CONNECTORS);
}
// If a link is followed by a quote then there should be a newline before it

View file

@ -45,7 +45,7 @@ class NPF
{
$bbcode = self::prepareBody($bbcode);
$html = BBCode::convert($bbcode, false, BBCode::NPF);
$html = BBCode::convertForUriId($uri_id, $bbcode, BBCode::NPF);
if (empty($html)) {
return [];
}

View file

@ -25,6 +25,7 @@ use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\DI;
use Friendica\Model\User;
use Friendica\Module\Response;
use Friendica\Network\HTTPException\FoundException;
use Friendica\Network\HTTPException\MovedPermanentlyException;
@ -226,9 +227,10 @@ class System
* @param integer $depth How many calls to include in the stacks after filtering
* @param int $offset How many calls to shave off the top of the stack, for example if
* this is called from a centralized method that isn't relevant to the callstack
* @param bool $full If enabled, the callstack is not compacted
* @return string
*/
public static function callstack(int $depth = 4, int $offset = 0): string
public static function callstack(int $depth = 4, int $offset = 0, bool $full = false): string
{
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
@ -243,7 +245,7 @@ class System
while ($func = array_pop($trace)) {
if (!empty($func['class'])) {
if (in_array($previous['function'], ['insert', 'fetch', 'toArray', 'exists', 'count', 'selectFirst', 'selectToArray',
if (!$full && in_array($previous['function'], ['insert', 'fetch', 'toArray', 'exists', 'count', 'selectFirst', 'selectToArray',
'select', 'update', 'delete', 'selectFirstForUser', 'selectForUser'])
&& (substr($previous['class'], 0, 15) === 'Friendica\Model')) {
continue;
@ -251,7 +253,7 @@ class System
// Don't show multiple calls from the Database classes to show the essential parts of the callstack
$func['database'] = in_array($func['class'], ['Friendica\Database\DBA', 'Friendica\Database\Database']);
if (!$previous['database'] || !$func['database']) {
if ($full || !$previous['database'] || !$func['database']) {
$classparts = explode("\\", $func['class']);
$callstack[] = array_pop($classparts).'::'.$func['function'] . (isset($func['line']) ? ' (' . $func['line'] . ')' : '');
$previous = $func;
@ -669,7 +671,7 @@ class System
if (DI::config()->get('system', 'tosdisplay')) {
$rulelist = DI::config()->get('system', 'tosrules') ?: DI::config()->get('system', 'tostext');
$html = BBCode::convert($rulelist, false, BBCode::EXTERNAL);
$html = BBCode::convertForUriId(User::getSystemUriId(), $rulelist, BBCode::EXTERNAL);
$msg = HTML::toPlaintext($html, 0, true);
foreach (explode("\n", trim($msg)) as $line) {

View file

@ -38,7 +38,7 @@ class Field extends BaseFactory
*/
public function createFromProfileField(ProfileField $profileField): \Friendica\Object\Api\Mastodon\Field
{
return new \Friendica\Object\Api\Mastodon\Field($profileField->label, BBCode::convert($profileField->value, false, BBCode::ACTIVITYPUB));
return new \Friendica\Object\Api\Mastodon\Field($profileField->label, BBCode::convertForUriId($profileField->uriId, $profileField->value, BBCode::ACTIVITYPUB));
}
/**

View file

@ -928,7 +928,7 @@ class Event
}
// Format the event location.
$location = self::locationToArray($item['event-location']);
$location = self::locationToArray($item['event-location'], $item['uri-id']);
// Construct the profile link (magic-auth).
$author = [
@ -978,7 +978,8 @@ class Event
* Note: The string must only contain location data. A string with no bbcode will be
* handled as location name.
*
* @param string $s The string with the bbcode formatted location data.
* @param string $s The string with the bbcode formatted location data.
* @param int $uri_id The uri-id of the related post
*
* @return array The array with the location data.
* 'name' => The name of the location,<br>
@ -986,7 +987,7 @@ class Event
* 'coordinates' => Latitude and longitude (e.g. '48.864716,2.349014').<br>
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function locationToArray(string $s = ''): array
private static function locationToArray(string $s, int $uri_id): array
{
if ($s == '') {
return [];
@ -1012,7 +1013,7 @@ class Event
}
}
$location['name'] = BBCode::convert($location['name']);
$location['name'] = BBCode::convertForUriId($uri_id, $location['name']);
// Construct the map HTML.
if (isset($location['address'])) {

View file

@ -132,6 +132,17 @@ class User
return null;
}
/**
* Get the Uri-Id of the system account
*
* @return integer
*/
public static function getSystemUriId(): int
{
$system = self::getSystemAccount();
return $system['uri-id'] ?? 0;
}
/**
* Fetch the system account
*

View file

@ -78,7 +78,7 @@ class Show extends BaseApi
foreach ($profileFields as $profileField) {
$custom_fields[] = [
'label' => $profileField->label,
'value' => BBCode::convert($profileField->value, false, BBCode::TWITTER_API),
'value' => BBCode::convertForUriId($profileField->uriId, $profileField->value, BBCode::TWITTER_API),
];
}

View file

@ -58,7 +58,7 @@ class Babel extends BaseModule
'content' => visible_whitespace($plain)
];
$html = Text\BBCode::convert($bbcode);
$html = Text\BBCode::convertForUriId(0, $bbcode);
$results[] = [
'title' => DI::l10n()->t('BBCode::convert (raw HTML)'),
'content' => visible_whitespace($html)
@ -125,7 +125,7 @@ class Babel extends BaseModule
'title' => DI::l10n()->t('PageInfo::appendToBody'),
'content' => visible_whitespace($body2)
];
$html3 = Text\BBCode::convert($body2);
$html3 = Text\BBCode::convertForUriId(0, $body2);
$results[] = [
'title' => DI::l10n()->t('PageInfo::appendToBody => BBCode::convert (raw HTML)'),
'content' => visible_whitespace($html3)
@ -203,7 +203,7 @@ class Babel extends BaseModule
'content' => visible_whitespace($bbcode)
];
$html2 = Text\BBCode::convert($bbcode);
$html2 = Text\BBCode::convertForUriId(0, $bbcode);
$results[] = [
'title' => DI::l10n()->t('HTML::toBBCode => BBCode::convert'),
'content' => $html2

View file

@ -337,7 +337,7 @@ class Create extends BaseModule
'$contact' => $contact,
'$category' => $category,
'$rules' => $rules ?? [],
'$comment' => BBCode::convert($this->session->get('report_comment') ?? '', false, ),
'$comment' => BBCode::convertForUriId($contact['uri-id'] ?? 0, $this->session->get('report_comment') ?? '', BBCode::EXTERNAL),
'$posts' => count($request['uri-ids']),
]);
}

View file

@ -147,7 +147,7 @@ class Introductions extends BaseNotifications
$knowyou = '';
}
$convertedName = BBCode::convert($Introduction->getName());
$convertedName = BBCode::convertForUriId($owner['uri-id'], $Introduction->getName());
$helptext = $this->t('Shall your connection be bidirectional or not?');
$helptext2 = $this->t('Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.', $convertedName, $convertedName);

View file

@ -150,7 +150,7 @@ class Register extends BaseModule
'$invite_label' => DI::l10n()->t('Your invitation code: '),
'$invite_id' => $invite_id,
'$regtitle' => DI::l10n()->t('Registration'),
'$registertext' => BBCode::convert(DI::config()->get('config', 'register_text', '')),
'$registertext' => BBCode::convertForUriId(User::getSystemUriId(), DI::config()->get('config', 'register_text', '')),
'$fillwith' => $fillwith,
'$fillext' => $fillext,
'$oidlabel' => $oidlabel,

View file

@ -27,6 +27,7 @@ use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\L10n;
use Friendica\Core\Renderer;
use Friendica\Content\Text\BBCode;
use Friendica\Model\User;
use Friendica\Util\Profiler;
use Psr\Log\LoggerInterface;
@ -98,9 +99,9 @@ class Tos extends BaseModule
return Renderer::replaceMacros($tpl, [
'$title' => $this->t('Terms of Service'),
'$tostext' => BBCode::convert($this->config->get('system', 'tostext')),
'$tostext' => BBCode::convertForUriId(User::getSystemUriId(), $this->config->get('system', 'tostext')),
'$rulestitle' => $this->t('Rules'),
'$rules' => BBCode::convert($rules),
'$rules' => BBCode::convertForUriId(User::getSystemUriId(), $rules),
'$displayprivstatement' => $this->config->get('system', 'tosprivstatement'),
'$privstatementtitle' => $this->t('Privacy Statement'),
'$privacy_operate' => $this->t('At the time of registration, and for providing communications between the user account and their contacts, the user has to provide a display name (pen name), an username (nickname) and a working email address. The names will be accessible on the profile page of the account by any visitor of the page, even if other profile details are not displayed. The email address will only be used to send the user notifications about interactions, but wont be visibly displayed. The listing of an account in the node\'s user directory or the global user directory is optional and can be controlled in the user settings, it is not necessary for communication.'),

View file

@ -118,7 +118,7 @@ class Notify extends BaseEntity
public function updateMsgFromPreamble($epreamble)
{
$this->msg = Renderer::replaceMacros($epreamble, ['$itemlink' => $this->link->__toString()]);
$this->msg_cache = self::formatMessage($this->name_cache, strip_tags(BBCode::convert($this->msg)));
$this->msg_cache = self::formatMessage($this->name_cache, strip_tags(BBCode::convertForUriId(0, $this->msg, BBCode::EXTERNAL)));
}
/**
@ -134,6 +134,6 @@ class Notify extends BaseEntity
*/
public static function formatMessage(string $name, string $message): string
{
return str_replace('{0}', '<span class="contactname">' . strip_tags(BBCode::convert($name)) . '</span>', htmlspecialchars($message));
return str_replace('{0}', '<span class="contactname">' . strip_tags(BBCode::convertForUriId(0, $name, BBCode::EXTERNAL)) . '</span>', htmlspecialchars($message));
}
}

View file

@ -163,8 +163,8 @@ class Introduction extends BaseFactory
'contact_id' => $intro['contact-id'],
'photo' => Contact::getPhoto($intro),
'name' => $intro['name'],
'location' => BBCode::convert($intro['location'], false),
'about' => BBCode::convert($intro['about'], false),
'location' => BBCode::convertForUriId($intro['uri-id'], $intro['location'], BBCode::EXTERNAL),
'about' => BBCode::convertForUriId ($intro['uri-id'], $intro['about'], BBCode::EXTERNAL),
'keywords' => $intro['keywords'],
'hidden' => $intro['hidden'] == 1,
'post_newfriend' => (intval($this->pConfig->get($this->session->getLocalUserId(), 'system', 'post_newfriend')) ? '1' : 0),

View file

@ -98,7 +98,7 @@ class Notification extends BaseDataTransferObject
$this->date_rel = Temporal::getRelativeDate($this->date);
try {
$this->msg_html = BBCode::convert($this->msg, false);
$this->msg_html = BBCode::convertForUriId($Notify->uriId, $this->msg, BBCode::EXTERNAL);
} catch (\Exception $e) {
$this->msg_html = '';
}

View file

@ -67,7 +67,7 @@ class ScheduledStatus extends BaseDataTransferObject
$this->scheduled_at = DateTimeFormat::utc($delayed_post['delayed'], DateTimeFormat::JSON);
$this->params = [
'text' => BBCode::convert(BBCode::setMentionsToNicknames($parameters['item']['body'] ?? ''), false, BBCode::MASTODON_API),
'text' => BBCode::convertForUriId($parameters['item']['uri-id'] ?? 0, BBCode::setMentionsToNicknames($parameters['item']['body'] ?? ''), BBCode::MASTODON_API),
'media_ids' => $media_ids,
'sensitive' => null,
'spoiler_text' => $parameters['item']['title'] ?? '',

View file

@ -34,6 +34,7 @@ use Friendica\Security\PermissionSet\Entity\PermissionSet;
*
* @property-read int|null $id
* @property-read int $uid
* @property-read int $uriId
* @property-read int $order
* @property-read string $label
* @property-read string $value
@ -50,6 +51,8 @@ class ProfileField extends BaseEntity
/** @var int */
protected $uid;
/** @var int */
protected $uriId;
/** @var int */
protected $order;
/** @var string */
protected $label;
@ -60,7 +63,7 @@ class ProfileField extends BaseEntity
/** @var \DateTime */
protected $edited;
public function __construct(int $uid, int $order, string $label, string $value, \DateTime $created, \DateTime $edited, PermissionSet $permissionSet, int $id = null)
public function __construct(int $uid, int $order, string $label, string $value, \DateTime $created, \DateTime $edited, PermissionSet $permissionSet, int $id = null, int $uriId = null)
{
$this->permissionSet = $permissionSet;
$this->uid = $uid;
@ -70,6 +73,7 @@ class ProfileField extends BaseEntity
$this->created = $created;
$this->edited = $edited;
$this->id = $id;
$this->uriId = $uriId;
}
/**

View file

@ -26,6 +26,7 @@ use Friendica\Profile\ProfileField\Exception\UnexpectedPermissionSetException;
use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
use Friendica\Profile\ProfileField\Entity;
use Friendica\Capabilities\ICanCreateFromTableRow;
use Friendica\Model\User;
use Friendica\Security\PermissionSet\Entity\PermissionSet;
use Psr\Log\LoggerInterface;
@ -54,6 +55,8 @@ class ProfileField extends BaseFactory implements ICanCreateFromTableRow
throw new UnexpectedPermissionSetException('Either set the PermissionSet fields (join) or the PermissionSet itself');
}
$owner = User::getOwnerDataById($row['uid']);
return new Entity\ProfileField(
$row['uid'],
$row['order'],
@ -69,7 +72,8 @@ class ProfileField extends BaseFactory implements ICanCreateFromTableRow
$row['deny_gid'],
$row['psid']
),
$row['id'] ?? null
$row['id'] ?? null,
$owner['uri-id'] ?? null
);
}

View file

@ -179,7 +179,7 @@ class NotifyMailBuilder extends MailBuilder
*/
protected function getHtmlMessage()
{
$htmlVersion = BBCode::convert($this->body);
$htmlVersion = BBCode::convertForUriId(0, $this->body, BBCode::EXTERNAL);
// load the template for private message notifications
$tpl = Renderer::getMarkupTemplate('email/notify/html.tpl');

View file

@ -100,7 +100,7 @@ class SystemMailBuilder extends MailBuilder
'$preamble' => str_replace("\n", "<br>\n", $this->preamble),
'$thanks' => $this->l10n->t('thanks'),
'$site_admin' => $this->siteAdmin,
'$htmlversion' => BBCode::convert($this->body),
'$htmlversion' => BBCode::convertForUriId(0, $this->body, BBCode::EXTERNAL),
]);
}

View file

@ -164,6 +164,10 @@ return [
// Allow pseudonyms (true) or enforce a space between first name and last name in Full name, as an anti spam measure (false).
'no_regfullname' => true,
// no_oembed_rich_content (Boolean)
// If enabled, allow OEmbed for all URLs. Disabled by default.
'no_oembed_rich_content' => true,
// optimize_tables (Boolean)
// Periodically (once an hour) run an "optimize table" command for cache tables
'optimize_tables' => false,