use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
-use Friendica\Core\Session;
use Friendica\Core\System;
use Friendica\Model\Tag;
use Friendica\Core\Worker;
Activity::FOLLOW,
Activity::ANNOUNCE];
+ // Privacy levels
const PUBLIC = 0;
const PRIVATE = 1;
const UNLISTED = 2;
Logger::info('Updating per single row method', ['fields' => $fields, 'condition' => $condition]);
- $items = Post::select(['id', 'origin', 'uri-id', 'uid', 'author-network'], $condition);
+ $items = Post::select(['id', 'origin', 'uri-id', 'uid', 'author-network', 'quote-uri-id'], $condition);
$notify_items = [];
while ($item = DBA::fetch($items)) {
if (!empty($fields['body'])) {
+ if (!empty($item['quote-uri-id'])) {
+ $fields['body'] = BBCode::removeSharedData($fields['body']);
+
+ if (!empty($fields['raw-body'])) {
+ $fields['raw-body'] = BBCode::removeSharedData($fields['raw-body']);
+ }
+ }
+
Post\Media::insertFromAttachmentData($item['uri-id'], $fields['body']);
$content_fields = ['raw-body' => trim($fields['raw-body'] ?? $fields['body'])];
$content_fields['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $content_fields['raw-body']);
$content_fields['raw-body'] = self::setHashtags($content_fields['raw-body']);
- if ($item['author-network'] != Protocol::DFRN) {
- Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body']);
- }
-
+ Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body']);
Post\Content::update($item['uri-id'], $content_fields);
}
public static function isValid(array $item): bool
{
// When there is no content then we don't post it
- if (($item['body'] . $item['title'] == '') && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
+ if (($item['body'] . $item['title'] == '') && empty($item['quote-uri-id']) && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
Logger::notice('No body, no title.');
return false;
}
}
// We have to tell the hooks who we are - this really should be improved
- if (!Session::getLocalUser()) {
+ if (!DI::userSession()->getLocalUserId()) {
$_SESSION['authenticated'] = true;
$_SESSION['uid'] = $uid;
$dummy_session = true;
unset($item['attachments']);
}
+ if (empty($item['quote-uri-id'])) {
+ $quote_id = self::getQuoteUriId($item['body']);
+ if (!empty($quote_id)) {
+ // This is one of these "should not happen" situations.
+ // The protocol implementations should already have done this job.
+ Logger::notice('Quote-uri-id detected in post', ['id' => $quote_id, 'guid' => $item['guid'], 'uri-id' => $item['uri-id'], 'callstack' => System::callstack(20)]);
+ $item['quote-uri-id'] = $quote_id;
+ }
+ }
+
+ if (!empty($item['quote-uri-id'])) {
+ $item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
+ $item['body'] = BBCode::removeSharedData($item['body']);
+ }
+
Post\Media::insertFromAttachmentData($item['uri-id'], $item['body']);
// Remove all media attachments from the body and store them in the post-media table
$item['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $item['raw-body']);
$item['raw-body'] = self::setHashtags($item['raw-body']);
- $quote_id = self::getQuoteUriId($item['body']);
-
- if (!empty($quote_id) && Post::exists(['uri-id' => $quote_id, 'network' => Protocol::FEDERATED])) {
- $item['quote-uri-id'] = $quote_id;
- $item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
- }
-
- if (!DBA::exists('contact', ['id' => $item['author-id'], 'network' => Protocol::DFRN])) {
- Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']);
- }
+ Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']);
// Check for hashtags in the body and repair or add hashtag links
$item['body'] = self::setHashtags($item['body']);
*/
public static function getPermissionsConditionArrayByUserId(int $owner_id): array
{
- $local_user = Session::getLocalUser();
- $remote_user = Session::getRemoteContactID($owner_id);
+ $local_user = DI::userSession()->getLocalUserId();
+ $remote_user = DI::userSession()->getRemoteContactID($owner_id);
// default permissions - anonymous user
$condition = ["`private` != ?", self::PRIVATE];
*/
public static function getPermissionsSQLByUserId(int $owner_id, string $table = ''): string
{
- $local_user = Session::getLocalUser();
- $remote_user = Session::getRemoteContactID($owner_id);
+ $local_user = DI::userSession()->getLocalUserId();
+ $remote_user = DI::userSession()->getRemoteContactID($owner_id);
if (!empty($table)) {
$table = DBA::quoteIdentifier($table) . '.';
$item['mentions'] = $tags['mentions'];
$body = $item['body'] ?? '';
- $shared = self::getShareArray($item);
- if (!empty($shared['guid'])) {
- $shared_item = Post::selectFirst(['uri-id', 'guid', 'plink', 'has-media'], ['guid' => $shared['guid'], 'uid' => [$item['uid'], 0]]);
- }
$fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media'];
$shared_uri_id = 0;
$shared_links = [];
- if (empty($shared_item['uri-id']) && !empty($item['quote-uri-id'])) {
- $shared_item = Post::selectFirst($fields, ['uri-id' => $item['quote-uri-id']]);
- $quote_uri_id = $item['quote-uri-id'] ?? 0;
- $shared_links[] = strtolower($item['quote-uri']);
+ $shared = DI::contentItem()->getSharedPost($item, $fields);
+ if (!empty($shared['post'])) {
+ $shared_item = $shared['post'];
+ $quote_uri_id = $shared['post']['uri-id'];
+ $shared_links[] = strtolower($shared['post']['uri']);
+ $item['body'] = BBCode::removeSharedData($item['body']);
} elseif (empty($shared_item['uri-id']) && empty($item['quote-uri-id'])) {
$media = Post\Media::getByURIId($item['uri-id'], [Post\Media::ACTIVITY]);
if (!empty($media)) {
// Compile eventual content filter reasons
$filter_reasons = [];
- if (!$is_preview && Session::getPublicContact() != $item['author-id']) {
- if (!empty($item['content-warning']) && (!Session::getLocalUser() || !DI::pConfig()->get(Session::getLocalUser(), 'system', 'disable_cw', false))) {
+ if (!$is_preview && DI::userSession()->getPublicContactId() != $item['author-id']) {
+ if (!empty($item['content-warning']) && (!DI::userSession()->getLocalUserId() || !DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'disable_cw', false))) {
$filter_reasons[] = DI::l10n()->t('Content warning: %s', $item['content-warning']);
}
{
// Make sure that for example site parameters aren't used when testing if the link is contained in the body
$urlparts = parse_url($url);
- if (!empty($urlparts)) {
- unset($urlparts['query']);
- unset($urlparts['fragment']);
+ if (empty($urlparts)) {
+ return false;
+ }
+
+ unset($urlparts['query']);
+ unset($urlparts['fragment']);
+
+ try {
$url = (string)Uri::fromParts($urlparts);
- } else {
+ } catch (\InvalidArgumentException $e) {
+ DI::logger()->notice('Invalid URL', ['$url' => $url, '$urlparts' => $urlparts]);
+ /* See https://github.com/friendica/friendica/issues/12113
+ * Malformed URLs will result in a Fatal Error
+ */
return false;
}
if (strpos($body, $url)) {
return true;
}
+
foreach ([0, 1, 2] as $size) {
if (preg_match('#/photo/.*-' . $size . '\.#ism', $url) &&
strpos(preg_replace('#(/photo/.*)-[012]\.#ism', '$1-' . $size . '.', $body), $url)) {
return true;
}
}
+
return false;
}
$percent = $option['replies'] / $question['voters'] * 100;
$options[$key]['vote'] = DI::l10n()->tt('%2$s (%3$d%%, %1$d vote)', '%2$s (%3$d%%, %1$d votes)', $option['replies'], $option['name'], round($percent, 1));
} else {
- $options[$key]['vote'] = DI::l10n()->tt('%2$s (%1$d vote)', '%2$s (%1$d votes)', $option['replies'], $option['name'], );
+ $options[$key]['vote'] = DI::l10n()->tt('%2$s (%1$d vote)', '%2$s (%1$d votes)', $option['replies'], $option['name']);
}
}
$plink = $item['uri'];
}
- if (Session::getLocalUser()) {
+ if (DI::userSession()->getLocalUserId()) {
$ret = [
'href' => "display/" . $item['guid'],
'orig' => "display/" . $item['guid'],
return 0;
}
- /**
- * Return share data from an item array (if the item is shared item)
- * We are providing the complete Item array, because at some time in the future
- * we hopefully will define these values not in the body anymore but in some item fields.
- * This function is meant to replace all similar functions in the system.
- *
- * @param array $item
- *
- * @return array with share information
- */
- public static function getShareArray(array $item): array
- {
- $attributes = BBCode::fetchShareAttributes($item['body'] ?? '');
- if (!empty($attributes)) {
- return $attributes;
- }
-
- if (!empty($item['quote-uri-id'])) {
- $shared = Post::selectFirst(['author-name', 'author-link', 'author-avatar', 'plink', 'created', 'guid', 'uri', 'body'], ['uri-id' => $item['quote-uri-id']]);
- if (!empty($shared)) {
- return [
- 'author' => $shared['author-name'],
- 'profile' => $shared['author-link'],
- 'avatar' => $shared['author-avatar'],
- 'link' => $shared['plink'],
- 'posted' => $shared['created'],
- 'guid' => $shared['guid'],
- 'message_id' => $shared['uri'],
- 'comment' => $item['body'],
- 'shared' => $shared['body'],
- ];
- }
- }
-
- return [];
- }
-
/**
* Check a prospective item array against user-level permissions
*
}
/**
- * Improve the data in shared posts
+ * Fetch the uri-id of a quote
*
- * @param array $item
- * @param bool $add_media
- * @return string body
+ * @param string $body
+ * @return integer
*/
- public static function improveSharedDataInBody(array $item, bool $add_media = false): string
+ public static function getQuoteUriId(string $body, int $uid = 0): int
{
- $shared = BBCode::fetchShareAttributes($item['body']);
+ $shared = BBCode::fetchShareAttributes($body);
if (empty($shared['guid']) && empty($shared['message_id'])) {
- return $item['body'];
+ return 0;
}
- $link = $shared['link'] ?: $shared['message_id'];
-
- if (empty($shared_content)) {
- $shared_content = DI::contentItem()->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
+ if (empty($shared['link']) && empty($shared['message_id'])) {
+ Logger::notice('Invalid share block.', ['share' => $shared]);
+ return 0;
}
- if (empty($shared_content)) {
- return $item['body'];
+ if (!empty($shared['guid'])) {
+ $shared_item = Post::selectFirst(['uri-id'], ['guid' => $shared['guid'], 'uid' => [0, $uid]]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Found post by guid', ['guid' => $shared['guid'], 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
}
- $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
+ if (!empty($shared['message_id'])) {
+ $shared_item = Post::selectFirst(['uri-id'], ['uri' => $shared['message_id'], 'uid' => [0, $uid]]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Found post by message_id', ['message_id' => $shared['message_id'], 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
+ }
- Logger::debug('New shared data', ['uri-id' => $item['uri-id'], 'link' => $link, 'guid' => $item['guid']]);
- return $item['body'];
- }
+ if (!empty($shared['link'])) {
+ $shared_item = Post::selectFirst(['uri-id'], ['plink' => $shared['link'], 'uid' => [0, $uid]]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Found post by link', ['link' => $shared['link'], 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
+ }
- /**
- * Fetch the uri-id of a quote
- *
- * @param string $body
- * @return integer
- */
- private static function getQuoteUriId(string $body): int
- {
- $shared = BBCode::fetchShareAttributes($body);
- if (empty($shared['message_id'])) {
+ $url = $shared['message_id'] ?: $shared['link'];
+ $id = self::fetchByLink($url);
+ if (!$id) {
+ Logger::notice('Post could not be fetched.', ['url' => $url, 'uid' => $uid]);
return 0;
}
- return ItemURI::getIdByURI($shared['message_id']);
+
+ $shared_item = Post::selectFirst(['uri-id'], ['id' => $id]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Fetched shared post', ['id' => $id, 'url' => $url, 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
+
+ Logger::warning('Post does not exist although it was supposed to had been fetched.', ['id' => $id, 'url' => $url, 'uid' => $uid]);
+ return 0;
}
}