mirror of
https://github.com/friendica/friendica
synced 2024-12-22 23:20:16 +00:00
Unified BBCode conversion, improved proxy functionality
This commit is contained in:
parent
81d2d4b70e
commit
8bb33dccd1
22 changed files with 61 additions and 35 deletions
|
@ -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);
|
||||
|
|
|
@ -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(['[', ']'], ['[', ']'], $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
|
||||
|
|
|
@ -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 [];
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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'])) {
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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),
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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']),
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.'),
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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 = '';
|
||||
}
|
||||
|
|
|
@ -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'] ?? '',
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue