Merge remote-tracking branch 'upstream/2022.09-rc' into worker-timeout

This commit is contained in:
Michael 2022-09-26 13:26:56 +00:00
commit 5e51ab95fb
28 changed files with 533 additions and 224 deletions

View file

@ -410,13 +410,13 @@ Ex: Wed May 23 06:01:13 +0000 2007
</tr>
<tr>
<td><code>startTime</code></td>
<td><code>start_time</code></td>
<td>String (UTC <code>YYYY-MM-DD HH:II:SS)</code>)</td>
<td></td>
</tr>
<tr>
<td><code>endTime</code></td>
<td><code>end_time</code></td>
<td>String (UTC <code>YYYY-MM-DD HH:II:SS)</code>)</td>
<td>Optional (null date is <code>0001-01-01 00:00:00</code></td>
</tr>

View file

@ -24,6 +24,32 @@ Returns a list of [Event](help/API-Entities#Event) entities for the current logg
- `since_id`: (optional) minimum event id for pagination
- `count`: maximum number of items returned, default 20
### POST api/friendica/event_create
Create a new event for the current logged in user.
#### Parameters
- `id` : (optional) id of event, event will be amended if supplied
- `name` : name of the event (required)
- `start_time` : start of the event (ISO), required
- `end_time` : (optional) end of the event, event is open end, if not supplied
- `desc` : (optional) description of the event
- `place` : (optional) location of the event
- `publish` : (optional) create message for event
- `allow_cid` : (optional) ACL-formatted list of allowed contact ids if private event
- `allow_gid` : (optional) ACL-formatted list of disallowed contact ids if private event
- `deny_cid` : (optional) ACL-formatted list of allowed group ids if private event
- `deny_gid` : (optional) ACL-formatted list of disallowed group ids if private event
### POST api/friendica/event_delete
Delete event from calendar (not the message)
#### Parameters
- `id` : id of event to be deleted
### GET api/externalprofile/show
Returns a [Contact](help/API-Entities#Contact) entity for the provided profile URL.

View file

@ -145,7 +145,7 @@ function pubsub_post(App $a)
}
// We only import feeds from OStatus here
if ($contact['network'] != Protocol::OSTATUS) {
if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS])) {
Logger::warning('Unexpected network', ['contact' => $contact]);
hub_post_return();
}

View file

@ -1867,11 +1867,13 @@ class BBCode
if ($try_oembed) {
$text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
$text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
$text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/shorts\/.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
$text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism", $try_oembed_callback, $text);
}
$text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
$text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
$text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/shorts\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
$text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism", '[youtube]$1[/youtube]', $text);
if ($try_oembed) {

View file

@ -114,7 +114,7 @@ class HTML
/** @var \DOMNode $child */
foreach ($node->childNodes as $key => $child) {
/* Remove empty text nodes at the start or at the end of the children list */
if ($key > 0 && $key < $node->childNodes->length - 1 || $child->nodeName != '#text' || trim($child->nodeValue)) {
if ($key > 0 && $key < $node->childNodes->length - 1 || $child->nodeName != '#text' || trim($child->nodeValue) !== '') {
$newNode = $child->cloneNode(true);
$node->parentNode->insertBefore($newNode, $node);
}
@ -144,10 +144,10 @@ class HTML
public static function toBBCode(string $message, string $basepath = ''): string
{
/*
* Check if message is empty to prevent a lot code below being executed
* Check if message is empty to prevent a lot of code below from being executed
* for just an empty message.
*/
if (empty($message)) {
if ($message === '') {
return '';
}

View file

@ -126,6 +126,7 @@ class Markdown
//$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
$s = BBCode::pregReplaceInTag('/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism', '[youtube]$2[/youtube]', 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism' , '[youtube]$1[/youtube]', 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/www.youtube.com\/shorts\/(.*?)\].*?\[\/url\]/ism' , '[youtube]$1[/youtube]', 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism' , '[vimeo]$2[/vimeo]' , 'url', $s);
$s = BBCode::pregReplaceInTag('/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism' , '[vimeo]$1[/vimeo]' , 'url', $s);

View file

@ -193,7 +193,7 @@ class Cron
*/
private static function addIntros()
{
$contacts = DBA::p("SELECT `uid`, `id`, `created` FROM `contact` WHERE `rel` = ? AND `pending` AND NOT EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id`)", Contact::FOLLOWER);
$contacts = DBA::p("SELECT `uid`, `id`, `created` FROM `contact` WHERE `rel` = ? AND `pending` AND NOT `id` IN (SELECT `contact-id` FROM `intro`)", Contact::FOLLOWER);
while ($contact = DBA::fetch($contacts)) {
$fields = [
'uid' => $contact['uid'],

View file

@ -1153,6 +1153,10 @@ class PostUpdate
while ($contact = DBA::fetch($contacts)) {
$id = $contact['id'];
if (is_null($contact['uri-id'])) {
$contact['uri-id'] = ItemURI::getIdByURI($contact['url']);
DBA::update('contact', ['uri-id' => $contact['uri-id']], ['id' => $contact['id']]);
}
Contact::setAccountUser($contact['id'], $contact['uid'], $contact['uri-id'], $contact['url']);
++$rows;
}

View file

@ -577,15 +577,15 @@ class APContact
*/
public static function isRelay(array $apcontact): bool
{
if ($apcontact['nick'] != 'relay') {
if (empty($apcontact['nick']) || $apcontact['nick'] != 'relay') {
return false;
}
if ($apcontact['type'] == 'Application') {
if (!empty($apcontact['type']) && $apcontact['type'] == 'Application') {
return true;
}
if (in_array($apcontact['type'], ['Group', 'Service']) && is_null($apcontact['outbox'])) {
if (!empty($apcontact['type']) && in_array($apcontact['type'], ['Group', 'Service']) && is_null($apcontact['outbox'])) {
return true;
}

View file

@ -3388,7 +3388,7 @@ class Contact
if (empty($contact['id']) && Network::isValidHttpUrl($url)) {
Worker::add(PRIORITY_LOW, 'AddContact', 0, $url);
++$added;
} elseif (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
} elseif (!empty($contact['network']) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
++$updated;
} else {

View file

@ -61,8 +61,8 @@ class Nodeinfo
$logger->info('user statistics', $userStats);
$posts = DBA::count('post-thread', ["EXISTS(SELECT `uri-id` FROM `post-user` WHERE NOT `deleted` AND `origin` AND `uri-id` = `post-thread`.`uri-id`)"]);
$comments = DBA::count('post', ["NOT `deleted` AND `gravity` = ? AND EXISTS(SELECT `uri-id` FROM `post-user` WHERE `origin` AND `uri-id` = `post`.`uri-id`)", GRAVITY_COMMENT]);
$posts = DBA::count('post-thread', ["`uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE NOT `deleted` AND `origin`)"]);
$comments = DBA::count('post', ["NOT `deleted` AND `gravity` = ? AND `uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE `origin`)", GRAVITY_COMMENT]);
$config->set('nodeinfo', 'local_posts', $posts);
$config->set('nodeinfo', 'local_comments', $comments);

View file

@ -0,0 +1,115 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Api\Friendica\Events;
use Friendica\Core\Protocol;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Event;
use Friendica\Model\Conversation;
use Friendica\Model\Item;
use Friendica\Module\BaseApi;
use Friendica\Network\HTTPException;
use Friendica\Util\DateTimeFormat;
use Friendica\Worker\Delivery;
/**
* API endpoint: /api/friendica/event_create
*/
class Create extends BaseApi
{
protected function post(array $request = [])
{
BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE);
$uid = BaseApi::getCurrentUserID();
// params
$request = $this->getRequest([
'id' => 0, //if provided, event will be amended
'name' => '', //summary of the event
'desc' => '', //description in BBCode
'start_time' => '', //start_time, required
'end_time' => '', //endtime, required if nofinish false
'place' => '', //location of the event
'publish' => 0, //publish message
'allow_cid' => '', //array of allowed person, if access restricted
'allow_gid' => '', //array of allowed groups, if access restricted
'deny_cid' => '', //array of denied person, if access restricted
'deny_gid' => '', //array of denied groups, if access restricted
], $request);
// error if no name specified
if (empty($request['name'])) {
throw new HTTPException\BadRequestException('event name not specified');
}
// error startDate is not specified
if (empty($request['start_time'])) {
throw new HTTPException\BadRequestException('startDate not specified');
}
// nofinish if end_time is not specified
if (empty($request['end_time'])) {
$finish = DBA::NULL_DATETIME;
$nofinish = true;
} else {
$finish = DateTimeFormat::convert($request['end_time'], 'UTC', DI::app()->getTimeZone());
$nofinish = false;
}
$start = DateTimeFormat::convert($request['start_time'], 'UTC', DI::app()->getTimeZone());
// create event
$event = [];
$event['id'] = $request['id'];
$event['uid'] = $uid;
$event['type'] = 'event';
$event['summary'] = $request['name'];
$event['desc'] = $request['desc'];
$event['location'] = $request['place'];
$event['start_time'] = $start;
$event['end_time'] = $finish;
$event['nofinish'] = $nofinish;
$event['allow_cid'] = $request['allow_cid'];
$event['allow_gid'] = $request['allow_gid'];
$event['deny_cid'] = $request['deny_cid'];
$event['deny_gid'] = $request['deny_gid'];
$event['publish'] = $request['publish'];
$event_id = Event::store($event);
if (!empty($request['publish'])) {
$item = ['network' => Protocol::DFRN, 'protocol' => Conversation::PARCEL_DIRECT, 'direction' => Conversation::PUSH];
$item = Event::getItemArrayForId($event_id, $item);
if (Item::insert($item)) {
Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, (int)$item['uri-id'], $uid);
}
}
$result = ['success' => true, 'event_id' => $event_id, 'event' => $event];
$this->response->exit('event_create', ['$result' => $result], $this->parameters['extension'] ?? null);
}
}

View file

@ -0,0 +1,64 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Api\Friendica\Events;
use Friendica\Database\DBA;
use Friendica\Model\Event;
use Friendica\Module\BaseApi;
use Friendica\Network\HTTPException;
/**
* API endpoint: /api/friendica/event_delete
*/
class Delete extends BaseApi
{
protected function post(array $request = [])
{
self::checkAllowedScope(self::SCOPE_WRITE);
$uid = self::getCurrentUserID();
$request = $this->getRequest([
'id' => 0
], $request);
// params
// error if no id specified
if ($request['id'] == 0) {
throw new HTTPException\BadRequestException('id not specified');
}
// error message if specified id is not in database
if (!DBA::exists('event', ['uid' => $uid, 'id' => $request['id']])) {
throw new HTTPException\BadRequestException('id not available');
}
// delete event
$eventid = $request['id'];
Event::delete($eventid);
$success = ['id' => $eventid, 'status' => 'deleted'];
$this->response->exit('event_delete', ['$result' => $success], $this->parameters['extension'] ?? null);
}
}

View file

@ -55,8 +55,8 @@ class Index extends BaseApi
'uri' => $event['uri'],
'name' => $event['summary'],
'desc' => BBCode::convertForUriId($event['uri-id'], $event['desc']),
'startTime' => $event['start'],
'endTime' => $event['finish'],
'start_time' => $event['start'],
'end_time' => $event['finish'],
'type' => $event['type'],
'nofinish' => $event['nofinish'],
'place' => $event['location'],

View file

@ -79,13 +79,13 @@ class Notifications extends BaseApi
if (in_array(Notification::TYPE_INTRODUCTION, $request['exclude_types'])) {
$condition = DBA::mergeConditions($condition,
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND `pending`))",
["(`vid` != ? OR `type` != ? OR NOT `actor-id` IN (SELECT `id` FROM `contact` WHERE `pending`))",
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
}
if (in_array(Notification::TYPE_FOLLOW, $request['exclude_types'])) {
$condition = DBA::mergeConditions($condition,
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND NOT `pending`))",
["(`vid` != ? OR `type` != ? OR NOT `actor-id` IN (SELECT `id` FROM `contact` WHERE NOT `pending`))",
Verb::getID(Activity::FOLLOW), Post\UserNotification::TYPE_NONE]);
}

View file

@ -21,19 +21,36 @@
namespace Friendica\Module\Api\Mastodon;
use Friendica\Core\Logger;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\App;
use Friendica\Core\L10n;
use Friendica\Factory\Api\Mastodon\Error;
use Friendica\Factory\Api\Mastodon\Subscription as SubscriptionFactory;
use Friendica\Model\Subscription;
use Friendica\Module\Api\ApiResponse;
use Friendica\Module\BaseApi;
use Friendica\Object\Api\Mastodon\Notification;
use Friendica\Util\Profiler;
use Psr\Log\LoggerInterface;
/**
* @see https://docs.joinmastodon.org/methods/notifications/push/
*/
class PushSubscription extends BaseApi
{
protected function post(array $request = [])
/** @var SubscriptionFactory */
protected $subscriptionFac;
/** @var Error */
protected $errorFac;
public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, SubscriptionFactory $subscriptionFac, Error $errorFac, array $server, array $parameters = [])
{
parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
$this->subscriptionFac = $subscriptionFac;
$this->errorFac = $errorFac;
}
protected function post(array $request = []): void
{
self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID();
@ -61,12 +78,13 @@ class PushSubscription extends BaseApi
$ret = Subscription::replace($subscription);
Logger::info('Subscription stored', ['ret' => $ret, 'subscription' => $subscription]);
$this->logger->info('Subscription stored', ['ret' => $ret, 'subscription' => $subscription]);
return DI::mstdnSubscription()->createForApplicationIdAndUserId($application['id'], $uid)->toArray();
$subscriptionObj = $this->subscriptionFac->createForApplicationIdAndUserId($application['id'], $uid);
$this->response->exitWithJson($subscriptionObj->toArray());
}
public function put(array $request = [])
public function put(array $request = []): void
{
self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID();
@ -78,8 +96,8 @@ class PushSubscription extends BaseApi
$subscription = Subscription::select($application['id'], $uid, ['id']);
if (empty($subscription)) {
Logger::info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]);
DI::mstdnError()->RecordNotFound();
$this->logger->info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]);
$this->errorFac->RecordNotFound();
}
$fields = [
@ -94,12 +112,18 @@ class PushSubscription extends BaseApi
$ret = Subscription::update($application['id'], $uid, $fields);
Logger::info('Subscription updated', ['result' => $ret, 'application-id' => $application['id'], 'uid' => $uid, 'fields' => $fields]);
$this->logger->info('Subscription updated', [
'result' => $ret,
'application-id' => $application['id'],
'uid' => $uid,
'fields' => $fields,
]);
return DI::mstdnSubscription()->createForApplicationIdAndUserId($application['id'], $uid)->toArray();
$subscriptionObj = $this->subscriptionFac->createForApplicationIdAndUserId($application['id'], $uid);
$this->response->exitWithJson($subscriptionObj->toArray());
}
protected function delete(array $request = [])
protected function delete(array $request = []): void
{
self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID();
@ -107,24 +131,29 @@ class PushSubscription extends BaseApi
$ret = Subscription::delete($application['id'], $uid);
Logger::info('Subscription deleted', ['result' => $ret, 'application-id' => $application['id'], 'uid' => $uid]);
$this->logger->info('Subscription deleted', [
'result' => $ret,
'application-id' => $application['id'],
'uid' => $uid,
]);
System::jsonExit([]);
$this->response->exitWithJson([]);
}
protected function rawContent(array $request = [])
protected function rawContent(array $request = []): void
{
self::checkAllowedScope(self::SCOPE_PUSH);
$uid = self::getCurrentUserID();
$application = self::getCurrentApplication();
if (!Subscription::exists($application['id'], $uid)) {
Logger::info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]);
DI::mstdnError()->RecordNotFound();
$this->logger->info('Subscription not found', ['application-id' => $application['id'], 'uid' => $uid]);
$this->errorFac->RecordNotFound();
}
Logger::info('Fetch subscription', ['application-id' => $application['id'], 'uid' => $uid]);
$this->logger->info('Fetch subscription', ['application-id' => $application['id'], 'uid' => $uid]);
return DI::mstdnSubscription()->createForApplicationIdAndUserId($application['id'], $uid)->toArray();
$subscriptionObj = $this->subscriptionFac->createForApplicationIdAndUserId($application['id'], $uid);
$this->response->exitWithJson($subscriptionObj->toArray());
}
}

View file

@ -180,7 +180,7 @@ class Search extends BaseApi
$params = ['order' => ['name'], 'limit' => [$offset, $limit]];
$condition = ["EXISTS(SELECT `tid` FROM `post-tag` WHERE `type` = ? AND `tid` = `id`) AND `name` LIKE ?", Tag::HASHTAG, $q . '%'];
$condition = ["`id` IN (SELECT `tid` FROM `post-tag` WHERE `type` = ?) AND `name` LIKE ?", Tag::HASHTAG, $q . '%'];
$tags = DBA::select('tag', ['name'], $condition, $params);

View file

@ -92,7 +92,7 @@ class PublicTimeline extends BaseApi
if (!empty($uid)) {
$condition = DBA::mergeConditions($condition,
["NOT EXISTS (SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND `cid` = `parent-author-id` AND (`blocked` OR `ignored`))", $uid]);
["NOT `parent-author-id` IN (SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND (`blocked` OR `ignored`))", $uid]);
}
$items = Post::selectPostsForUser($uid, ['uri-id'], $condition, $params);

View file

@ -210,7 +210,7 @@ class Contact extends BaseModule
switch ($type) {
case 'blocked':
$sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`blocked`)";
$sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`blocked`)";
// This makes the query look for contact.uid = 0
array_unshift($sql_values, 0);
break;
@ -218,7 +218,7 @@ class Contact extends BaseModule
$sql_extra = " AND `hidden` AND NOT `blocked` AND NOT `pending`";
break;
case 'ignored':
$sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`ignored`)";
$sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`ignored`)";
// This makes the query look for contact.uid = 0
array_unshift($sql_values, 0);
break;
@ -227,8 +227,9 @@ class Contact extends BaseModule
break;
case 'pending':
$sql_extra = " AND `pending` AND NOT `archive` AND NOT `failed` AND ((`rel` = ?)
OR EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id` AND NOT `ignore`))";
OR `id` IN (SELECT `contact-id` FROM `intro` WHERE `intro`.`uid` = ? AND NOT `ignore`))";
$sql_values[] = Model\Contact::SHARING;
$sql_values[] = local_user();
break;
default:
$sql_extra = " AND NOT `archive` AND NOT `blocked` AND NOT `pending`";
@ -275,7 +276,7 @@ class Contact extends BaseModule
}
if ($group) {
$sql_extra .= " AND EXISTS(SELECT `id` FROM `group_member` WHERE `gid` = ? AND `contact`.`id` = `contact-id`)";
$sql_extra .= " AND `id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)";
$sql_values[] = $group;
}

View file

@ -53,11 +53,17 @@ class Community extends BaseModule
{
$this->parseRequest();
$t = Renderer::getMarkupTemplate("community.tpl");
$o = Renderer::replaceMacros($t, [
'$content' => '',
'$header' => '',
'$show_global_community_hint' => (self::$content == 'global') && DI::config()->get('system', 'show_global_community_hint'),
'$global_community_hint' => DI::l10n()->t("This community stream shows all public posts received by this node. They may not reflect the opinions of this nodes users.")
]);
if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) {
$tpl = Renderer::getMarkupTemplate('infinite_scroll_head.tpl');
$o = Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]);
} else {
$o = '';
$o .= Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]);
}
if (empty($_GET['mode']) || ($_GET['mode'] != 'raw')) {
@ -154,13 +160,7 @@ class Community extends BaseModule
$o .= $pager->renderMinimal(count($items));
}
$t = Renderer::getMarkupTemplate("community.tpl");
return Renderer::replaceMacros($t, [
'$content' => $o,
'$header' => '',
'$show_global_community_hint' => (self::$content == 'global') && DI::config()->get('system', 'show_global_community_hint'),
'$global_community_hint' => DI::l10n()->t("This community stream shows all public posts received by this node. They may not reflect the opinions of this nodes users.")
]);
return $o;
}
/**
@ -323,7 +323,7 @@ class Community extends BaseModule
$condition[] = $item_id;
} else {
if (local_user() && !empty($_REQUEST['no_sharer'])) {
$condition[0] .= " AND NOT EXISTS (SELECT `uri-id` FROM `post-user` WHERE `post-user`.`uri-id` = `post-thread-user-view`.`uri-id` AND `post-user`.`uid` = ?)";
$condition[0] .= " AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE `post-user`.`uid` = ?)";
$condition[] = local_user();
}

View file

@ -413,7 +413,7 @@ class Network extends BaseModule
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`contact-id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)", self::$groupId]);
} elseif (self::$forumContactId) {
$conditionStrings = DBA::mergeConditions($conditionStrings,
["((`contact-id` = ?) OR EXISTS(SELECT `uri-id` FROM `post-user-view` WHERE `post-user-view`.`parent-uri-id` = " . DBA::quoteIdentifier($table) . ".`uri-id` AND (`contact-id` = ? AND `gravity` = ? AND `vid` = ? AND `uid` = ?)))",
["((`contact-id` = ?) OR `uri-id` IN (SELECT `parent-uri-id` FROM `post-user-view` WHERE (`contact-id` = ? AND `gravity` = ? AND `vid` = ? AND `uid` = ?)))",
self::$forumContactId, self::$forumContactId, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), local_user()]);
}

View file

@ -175,10 +175,8 @@ class Status extends BaseProfile
$condition = DBA::mergeConditions($condition, ["((`gravity` = ? AND `wall`) OR
(`gravity` = ? AND `vid` = ? AND `origin`
AND EXISTS(SELECT `uri-id` FROM `post` WHERE `gravity` = ? AND `network` IN (?, ?, ?, ?)
AND `uri-id` = `post-user-view`.`thr-parent-id`)))",
GRAVITY_PARENT, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), GRAVITY_PARENT,
Protocol::DFRN, Protocol::ACTIVITYPUB, Protocol::DIASPORA, Protocol::OSTATUS]);
AND `thr-parent-id` IN (SELECT `uri-id` FROM `post` WHERE `gravity` = ? AND `network` = ?)))",
GRAVITY_PARENT, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), GRAVITY_PARENT, Protocol::ACTIVITYPUB]);
$condition = DBA::mergeConditions($condition, ['uid' => $profile['uid'], 'network' => Protocol::FEDERATED,
'visible' => true, 'deleted' => false]);

View file

@ -77,7 +77,7 @@ class Probe
public static function cleanURI(string $rawUri): string
{
// At first remove leading and trailing junk
$rawUri = trim($rawUri, "@#?:/ \t\n\r\0\x0B");
$rawUri = trim($rawUri, "@#?: \t\n\r\0\x0B");
$rawUri = Network::convertToIdn($rawUri);

View file

@ -22,6 +22,7 @@
namespace Friendica\Worker;
use Friendica\Core\Logger;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\GServer;

View file

@ -82,6 +82,8 @@ $apiRoutes = [
'/direct_messages_setseen[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Setseen::class, [ R::POST]],
'/direct_messages_search[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Search ::class, [R::GET ]],
'/events[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Index::class, [R::GET ]],
'/event_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Create::class, [ R::POST]],
'/event_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Delete::class, [ R::POST]],
'/group_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Show::class, [R::GET ]],
'/group_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Create::class, [ R::POST]],
'/group_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Delete::class, [ R::POST]],

View file

@ -82,6 +82,10 @@ its surprisingly good",
'html' => "<p>Now playing</p><pre><code>echo &quot;main(i){for(i=0;;i++)putchar(((i*(i&gt;&gt;8|i&gt;&gt;9)&amp;46&amp;i&gt;&gt;8))^(i&amp;i&gt;&gt;13|i&gt;&gt;6));}&quot; | gcc -o a.out -x c - 2&gt; /dev/null
./a.out | aplay -q 2&gt; /dev/null</code></pre><p>its surprisingly good</p>",
],
'bug-11851-content-0' => [
'expectedBBCode' => '[url=https://dev-friendica.mrpetovan.com/profile/hypolite]@hypolite[/url] 0',
'html' => '<p><span class="h-card"><a href="https://dev-friendica.mrpetovan.com/profile/hypolite" class="u-url mention">@<span>hypolite</span></a></span> 0</p>',
],
];
}

View file

@ -0,0 +1,62 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Test\src\Module\Api\Mastodon;
use Friendica\Test\src\Module\Api\ApiTest;
class PushSubscriptionTest extends ApiTest
{
/**
* Test the api_account_verify_credentials() function.
*
* @return void
*/
public function testApiAccountVerifyCredentials(): void
{
$this->markTestIncomplete('Needs mocking of whole applictaions/Apps first');
// $this->useHttpMethod(Router::POST);
//
// $response = (new PushSubscription(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), DI::mstdnSubscription(), DI::mstdnError(), []))
// ->run();
//
// $json = $this->toJson($response);
// print_r($json);
//
// $this->assertEquals(1,1);
}
/**
* Test the api_account_verify_credentials() function without an authenticated user.
*
* @return void
*/
public function testApiAccountVerifyCredentialsWithoutAuthenticatedUser(): void
{
self::markTestIncomplete('Needs dynamic BasicAuth first');
// $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class);
// BasicAuth::setCurrentUserID();
// $_SESSION['authenticated'] = false;
// api_account_verify_credentials('json');
}
}

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2022.09-rc\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-11 02:40-0400\n"
"POT-Creation-Date: 2022-09-25 07:08+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -19,7 +19,7 @@ msgstr ""
#: mod/cal.php:46 mod/cal.php:50 mod/follow.php:39 mod/redir.php:36
#: mod/redir.php:177 src/Module/Conversation/Community.php:181
#: mod/redir.php:177 src/Module/Conversation/Community.php:183
#: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:57
#: src/Module/Item/Follow.php:42 src/Module/Item/Ignore.php:41
#: src/Module/Item/Pin.php:42 src/Module/Item/Pin.php:57
@ -105,7 +105,7 @@ msgid "calendar"
msgstr ""
#: mod/display.php:143 mod/photos.php:802
#: src/Module/Conversation/Community.php:175 src/Module/Directory.php:49
#: src/Module/Conversation/Community.php:177 src/Module/Directory.php:49
#: src/Module/Search/Index.php:65
msgid "Public access denied."
msgstr ""
@ -426,7 +426,7 @@ msgstr ""
msgid "Basic"
msgstr ""
#: mod/events.php:517 src/Module/Admin/Site.php:441 src/Module/Contact.php:474
#: mod/events.php:517 src/Module/Admin/Site.php:441 src/Module/Contact.php:475
#: src/Module/Profile/Profile.php:249
msgid "Advanced"
msgstr ""
@ -470,7 +470,7 @@ msgid "OStatus support is disabled. Contact can't be added."
msgstr ""
#: mod/follow.php:138 src/Content/Item.php:397 src/Content/Widget.php:80
#: src/Model/Contact.php:1121 src/Model/Contact.php:1132
#: src/Model/Contact.php:1146 src/Model/Contact.php:1157
#: view/theme/vier/theme.php:181
msgid "Connect/Follow"
msgstr ""
@ -507,7 +507,7 @@ msgid "Add a personal note:"
msgstr ""
#: mod/follow.php:163 mod/unfollow.php:109 src/Module/BaseProfile.php:59
#: src/Module/Contact.php:444
#: src/Module/Contact.php:445
msgid "Status Messages and Posts"
msgstr ""
@ -1070,7 +1070,7 @@ msgid "Rotate CCW (left)"
msgstr ""
#: mod/photos.php:1333 mod/photos.php:1389 mod/photos.php:1463
#: src/Module/Contact.php:544 src/Module/Item/Compose.php:160
#: src/Module/Contact.php:545 src/Module/Item/Compose.php:160
#: src/Object/Post.php:989
msgid "This is you"
msgstr ""
@ -1411,7 +1411,7 @@ msgstr ""
msgid "Friend Suggestions"
msgstr ""
#: mod/tagger.php:78 src/Content/Item.php:297 src/Model/Item.php:2834
#: mod/tagger.php:78 src/Content/Item.php:297 src/Model/Item.php:2846
msgid "photo"
msgstr ""
@ -1557,17 +1557,17 @@ msgstr ""
msgid "Apologies but the website is unavailable at the moment."
msgstr ""
#: src/App/Page.php:276
#: src/App/Page.php:281
msgid "Delete this item?"
msgstr ""
#: src/App/Page.php:277
#: src/App/Page.php:282
msgid ""
"Block this author? They won't be able to follow you nor see your public "
"posts, and you won't be able to see their posts and their notifications."
msgstr ""
#: src/App/Page.php:347
#: src/App/Page.php:352
msgid "toggle mobile"
msgstr ""
@ -1595,16 +1595,16 @@ msgid "All contacts"
msgstr ""
#: src/BaseModule.php:424 src/Content/Widget.php:235 src/Core/ACL.php:194
#: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:122
#: src/Module/Contact.php:368 src/Module/PermissionTooltip.php:122
#: src/Module/PermissionTooltip.php:144
msgid "Followers"
msgstr ""
#: src/BaseModule.php:429 src/Content/Widget.php:236 src/Module/Contact.php:368
#: src/BaseModule.php:429 src/Content/Widget.php:236 src/Module/Contact.php:369
msgid "Following"
msgstr ""
#: src/BaseModule.php:434 src/Content/Widget.php:237 src/Module/Contact.php:369
#: src/BaseModule.php:434 src/Content/Widget.php:237 src/Module/Contact.php:370
msgid "Mutual friends"
msgstr ""
@ -1644,63 +1644,63 @@ msgstr ""
msgid "The contact has been blocked from the node"
msgstr ""
#: src/Console/MergeContacts.php:74
#: src/Console/MergeContacts.php:75
#, php-format
msgid "%d %s, %d duplicates."
msgstr ""
#: src/Console/MergeContacts.php:77
#: src/Console/MergeContacts.php:78
#, php-format
msgid "uri-id is empty for contact %s."
msgstr ""
#: src/Console/MergeContacts.php:90
#: src/Console/MergeContacts.php:91
#, php-format
msgid "No valid first contact found for uri-id %d."
msgstr ""
#: src/Console/MergeContacts.php:101
#: src/Console/MergeContacts.php:102
#, php-format
msgid "Wrong duplicate found for uri-id %d in %d (url: %s != %s)."
msgstr ""
#: src/Console/MergeContacts.php:105
#: src/Console/MergeContacts.php:106
#, php-format
msgid "Wrong duplicate found for uri-id %d in %d (nurl: %s != %s)."
msgstr ""
#: src/Console/MergeContacts.php:141
#: src/Console/MergeContacts.php:142
#, php-format
msgid "Deletion of id %d failed"
msgstr ""
#: src/Console/MergeContacts.php:143
#: src/Console/MergeContacts.php:144
#, php-format
msgid "Deletion of id %d was successful"
msgstr ""
#: src/Console/MergeContacts.php:149
#: src/Console/MergeContacts.php:150
#, php-format
msgid "Updating \"%s\" in \"%s\" from %d to %d"
msgstr ""
#: src/Console/MergeContacts.php:151
#: src/Console/MergeContacts.php:152
msgid " - found"
msgstr ""
#: src/Console/MergeContacts.php:158
#: src/Console/MergeContacts.php:159
msgid " - failed"
msgstr ""
#: src/Console/MergeContacts.php:160
#: src/Console/MergeContacts.php:161
msgid " - success"
msgstr ""
#: src/Console/MergeContacts.php:164
#: src/Console/MergeContacts.php:165
msgid " - deleted"
msgstr ""
#: src/Console/MergeContacts.php:167
#: src/Console/MergeContacts.php:168
msgid " - done"
msgstr ""
@ -2292,7 +2292,7 @@ msgstr ""
msgid "show more"
msgstr ""
#: src/Content/Item.php:288 src/Model/Item.php:2832
#: src/Content/Item.php:288 src/Model/Item.php:2844
msgid "event"
msgstr ""
@ -2300,42 +2300,42 @@ msgstr ""
msgid "Follow Thread"
msgstr ""
#: src/Content/Item.php:381 src/Model/Contact.php:1126
#: src/Content/Item.php:381 src/Model/Contact.php:1151
msgid "View Status"
msgstr ""
#: src/Content/Item.php:382 src/Content/Item.php:400 src/Model/Contact.php:1064
#: src/Model/Contact.php:1118 src/Model/Contact.php:1127
#: src/Content/Item.php:382 src/Content/Item.php:400 src/Model/Contact.php:1089
#: src/Model/Contact.php:1143 src/Model/Contact.php:1152
#: src/Module/Directory.php:158 src/Module/Settings/Profile/Index.php:225
msgid "View Profile"
msgstr ""
#: src/Content/Item.php:383 src/Model/Contact.php:1128
#: src/Content/Item.php:383 src/Model/Contact.php:1153
msgid "View Photos"
msgstr ""
#: src/Content/Item.php:384 src/Model/Contact.php:1119
#: src/Model/Contact.php:1129
#: src/Content/Item.php:384 src/Model/Contact.php:1144
#: src/Model/Contact.php:1154
msgid "Network Posts"
msgstr ""
#: src/Content/Item.php:385 src/Model/Contact.php:1120
#: src/Model/Contact.php:1130
#: src/Content/Item.php:385 src/Model/Contact.php:1145
#: src/Model/Contact.php:1155
msgid "View Contact"
msgstr ""
#: src/Content/Item.php:386 src/Model/Contact.php:1131
#: src/Content/Item.php:386 src/Model/Contact.php:1156
msgid "Send PM"
msgstr ""
#: src/Content/Item.php:387 src/Module/Admin/Blocklist/Contact.php:100
#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154
#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348
#: src/Module/Contact.php:399 src/Module/Contact/Profile.php:348
#: src/Module/Contact/Profile.php:449
msgid "Block"
msgstr ""
#: src/Content/Item.php:388 src/Module/Contact.php:399
#: src/Content/Item.php:388 src/Module/Contact.php:400
#: src/Module/Contact/Profile.php:349 src/Module/Contact/Profile.php:457
#: src/Module/Notifications/Introductions.php:132
#: src/Module/Notifications/Introductions.php:204
@ -2381,7 +2381,7 @@ msgid "Sign in"
msgstr ""
#: src/Content/Nav.php:192 src/Module/BaseProfile.php:56
#: src/Module/Contact.php:433 src/Module/Contact/Profile.php:380
#: src/Module/Contact.php:434 src/Module/Contact/Profile.php:380
#: src/Module/Settings/TwoFactor/Index.php:120 view/theme/frio/theme.php:236
msgid "Status"
msgstr ""
@ -2392,7 +2392,7 @@ msgid "Your posts and conversations"
msgstr ""
#: src/Content/Nav.php:193 src/Module/BaseProfile.php:48
#: src/Module/BaseSettings.php:55 src/Module/Contact.php:457
#: src/Module/BaseSettings.php:55 src/Module/Contact.php:458
#: src/Module/Contact/Profile.php:382 src/Module/Profile/Profile.php:241
#: src/Module/Welcome.php:57 view/theme/frio/theme.php:237
msgid "Profile"
@ -2407,7 +2407,7 @@ msgid "Your photos"
msgstr ""
#: src/Content/Nav.php:195 src/Module/BaseProfile.php:72
#: src/Module/BaseProfile.php:75 src/Module/Contact.php:449
#: src/Module/BaseProfile.php:75 src/Module/Contact.php:450
#: view/theme/frio/theme.php:239
msgid "Media"
msgstr ""
@ -2481,8 +2481,8 @@ msgstr ""
#: src/Content/Nav.php:237 src/Content/Nav.php:296
#: src/Content/Text/HTML.php:899 src/Module/BaseProfile.php:125
#: src/Module/BaseProfile.php:128 src/Module/Contact.php:370
#: src/Module/Contact.php:464 view/theme/frio/theme.php:247
#: src/Module/BaseProfile.php:128 src/Module/Contact.php:371
#: src/Module/Contact.php:465 view/theme/frio/theme.php:247
msgid "Contacts"
msgstr ""
@ -2639,8 +2639,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:1213 src/Model/Item.php:3408
#: src/Model/Item.php:3414 src/Model/Item.php:3415
#: src/Content/Text/BBCode.php:1213 src/Model/Item.php:3420
#: src/Model/Item.php:3426 src/Model/Item.php:3427
msgid "Link to source"
msgstr ""
@ -2712,7 +2712,7 @@ msgstr ""
msgid "Examples: Robert Morgenstein, Fishing"
msgstr ""
#: src/Content/Widget.php:82 src/Module/Contact.php:391
#: src/Content/Widget.php:82 src/Module/Contact.php:392
#: src/Module/Directory.php:97 view/theme/vier/theme.php:183
msgid "Find"
msgstr ""
@ -2739,7 +2739,7 @@ msgid "Local Directory"
msgstr ""
#: src/Content/Widget.php:211 src/Model/Group.php:587
#: src/Module/Contact.php:354 src/Module/Welcome.php:76
#: src/Module/Contact.php:355 src/Module/Welcome.php:76
msgid "Groups"
msgstr ""
@ -2751,7 +2751,7 @@ msgstr ""
msgid "Relationships"
msgstr ""
#: src/Content/Widget.php:244 src/Module/Contact.php:306
#: src/Content/Widget.php:244 src/Module/Contact.php:307
#: src/Module/Group.php:293
msgid "All Contacts"
msgstr ""
@ -2795,7 +2795,7 @@ msgstr ""
msgid "Organisations"
msgstr ""
#: src/Content/Widget.php:523 src/Model/Contact.php:1553
#: src/Content/Widget.php:523 src/Model/Contact.php:1582
msgid "News"
msgstr ""
@ -3588,81 +3588,81 @@ msgstr ""
msgid "Legacy module file not found: %s"
msgstr ""
#: src/Model/Contact.php:1122 src/Model/Contact.php:1133
#: src/Model/Contact.php:1147 src/Model/Contact.php:1158
msgid "UnFollow"
msgstr ""
#: src/Model/Contact.php:1139 src/Module/Admin/Users/Pending.php:107
#: src/Model/Contact.php:1164 src/Module/Admin/Users/Pending.php:107
#: src/Module/Notifications/Introductions.php:130
#: src/Module/Notifications/Introductions.php:202
msgid "Approve"
msgstr ""
#: src/Model/Contact.php:1549
#: src/Model/Contact.php:1578
msgid "Organisation"
msgstr ""
#: src/Model/Contact.php:1557
#: src/Model/Contact.php:1586
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:2710
#: src/Model/Contact.php:2774
msgid "Disallowed profile URL."
msgstr ""
#: src/Model/Contact.php:2715 src/Module/Friendica.php:81
#: src/Model/Contact.php:2779 src/Module/Friendica.php:81
msgid "Blocked domain"
msgstr ""
#: src/Model/Contact.php:2720
#: src/Model/Contact.php:2784
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:2729
#: src/Model/Contact.php:2793
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:2771
#: src/Model/Contact.php:2835
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:2773
#: src/Model/Contact.php:2837
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:2776
#: src/Model/Contact.php:2840
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:2779
#: src/Model/Contact.php:2843
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:2782
#: src/Model/Contact.php:2846
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:2783
#: src/Model/Contact.php:2847
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:2789
#: src/Model/Contact.php:2853
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:2794
#: src/Model/Contact.php:2858
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:2853
#: src/Model/Contact.php:2917
msgid "Unable to retrieve contact information."
msgstr ""
@ -3782,66 +3782,66 @@ msgstr ""
msgid "Edit groups"
msgstr ""
#: src/Model/Item.php:1944
#: src/Model/Item.php:1956
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr ""
#: src/Model/Item.php:2836
#: src/Model/Item.php:2848
msgid "activity"
msgstr ""
#: src/Model/Item.php:2838
#: src/Model/Item.php:2850
msgid "comment"
msgstr ""
#: src/Model/Item.php:2841
#: src/Model/Item.php:2853
msgid "post"
msgstr ""
#: src/Model/Item.php:2957
#: src/Model/Item.php:2969
#, php-format
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3320
#: src/Model/Item.php:3332
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3351
#: src/Model/Item.php:3363
#, php-format
msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3353
#: src/Model/Item.php:3365
#, php-format
msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3358
#: src/Model/Item.php:3370
#, php-format
msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3360
#: src/Model/Item.php:3372
#, php-format
msgid "%d voter."
msgid_plural "%d voters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3362
#: src/Model/Item.php:3374
#, php-format
msgid "Poll end: %s"
msgstr ""
#: src/Model/Item.php:3396 src/Model/Item.php:3397
#: src/Model/Item.php:3408 src/Model/Item.php:3409
msgid "View on separate page"
msgstr ""
@ -4357,8 +4357,8 @@ msgstr ""
msgid "List of active accounts"
msgstr ""
#: src/Module/Admin/BaseUsers.php:67 src/Module/Contact.php:314
#: src/Module/Contact.php:374
#: src/Module/Admin/BaseUsers.php:67 src/Module/Contact.php:315
#: src/Module/Contact.php:375
msgid "Pending"
msgstr ""
@ -4366,8 +4366,8 @@ msgstr ""
msgid "List of pending registrations"
msgstr ""
#: src/Module/Admin/BaseUsers.php:75 src/Module/Contact.php:322
#: src/Module/Contact.php:375
#: src/Module/Admin/BaseUsers.php:75 src/Module/Contact.php:323
#: src/Module/Contact.php:376
msgid "Blocked"
msgstr ""
@ -4460,7 +4460,7 @@ msgstr ""
#: src/Module/Admin/Blocklist/Contact.php:101
#: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156
#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348
#: src/Module/Contact.php:399 src/Module/Contact/Profile.php:348
#: src/Module/Contact/Profile.php:449
msgid "Unblock"
msgstr ""
@ -6733,7 +6733,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
#: src/Module/BaseProfile.php:51 src/Module/Contact.php:460
#: src/Module/BaseProfile.php:51 src/Module/Contact.php:461
msgid "Profile Details"
msgstr ""
@ -6807,110 +6807,110 @@ msgid_plural "%d contacts edited."
msgstr[0] ""
msgstr[1] ""
#: src/Module/Contact.php:309
#: src/Module/Contact.php:310
msgid "Show all contacts"
msgstr ""
#: src/Module/Contact.php:317
#: src/Module/Contact.php:318
msgid "Only show pending contacts"
msgstr ""
#: src/Module/Contact.php:325
#: src/Module/Contact.php:326
msgid "Only show blocked contacts"
msgstr ""
#: src/Module/Contact.php:330 src/Module/Contact.php:377
#: src/Module/Contact.php:331 src/Module/Contact.php:378
#: src/Object/Post.php:339
msgid "Ignored"
msgstr ""
#: src/Module/Contact.php:333
#: src/Module/Contact.php:334
msgid "Only show ignored contacts"
msgstr ""
#: src/Module/Contact.php:338 src/Module/Contact.php:378
#: src/Module/Contact.php:339 src/Module/Contact.php:379
msgid "Archived"
msgstr ""
#: src/Module/Contact.php:341
#: src/Module/Contact.php:342
msgid "Only show archived contacts"
msgstr ""
#: src/Module/Contact.php:346 src/Module/Contact.php:376
#: src/Module/Contact.php:347 src/Module/Contact.php:377
msgid "Hidden"
msgstr ""
#: src/Module/Contact.php:349
#: src/Module/Contact.php:350
msgid "Only show hidden contacts"
msgstr ""
#: src/Module/Contact.php:357
#: src/Module/Contact.php:358
msgid "Organize your contact groups"
msgstr ""
#: src/Module/Contact.php:389
#: src/Module/Contact.php:390
msgid "Search your contacts"
msgstr ""
#: src/Module/Contact.php:390 src/Module/Search/Index.php:207
#: src/Module/Contact.php:391 src/Module/Search/Index.php:207
#, php-format
msgid "Results for: %s"
msgstr ""
#: src/Module/Contact.php:397
#: src/Module/Contact.php:398
msgid "Update"
msgstr ""
#: src/Module/Contact.php:399 src/Module/Contact/Profile.php:349
#: src/Module/Contact.php:400 src/Module/Contact/Profile.php:349
#: src/Module/Contact/Profile.php:457
msgid "Unignore"
msgstr ""
#: src/Module/Contact.php:401
#: src/Module/Contact.php:402
msgid "Batch Actions"
msgstr ""
#: src/Module/Contact.php:436
#: src/Module/Contact.php:437
msgid "Conversations started by this contact"
msgstr ""
#: src/Module/Contact.php:441
#: src/Module/Contact.php:442
msgid "Posts and Comments"
msgstr ""
#: src/Module/Contact.php:452
#: src/Module/Contact.php:453
msgid "Posts containing media objects"
msgstr ""
#: src/Module/Contact.php:467
#: src/Module/Contact.php:468
msgid "View all known contacts"
msgstr ""
#: src/Module/Contact.php:477
#: src/Module/Contact.php:478
msgid "Advanced Contact Settings"
msgstr ""
#: src/Module/Contact.php:511
#: src/Module/Contact.php:512
msgid "Mutual Friendship"
msgstr ""
#: src/Module/Contact.php:515
#: src/Module/Contact.php:516
msgid "is a fan of yours"
msgstr ""
#: src/Module/Contact.php:519
#: src/Module/Contact.php:520
msgid "you are a fan of"
msgstr ""
#: src/Module/Contact.php:537
#: src/Module/Contact.php:538
msgid "Pending outgoing contact request"
msgstr ""
#: src/Module/Contact.php:539
#: src/Module/Contact.php:540
msgid "Pending incoming contact request"
msgstr ""
#: src/Module/Contact.php:552 src/Module/Contact/Profile.php:334
#: src/Module/Contact.php:553 src/Module/Contact/Profile.php:334
#, php-format
msgid "Visit %s's profile [%s]"
msgstr ""
@ -7256,50 +7256,50 @@ msgstr ""
msgid "Yes"
msgstr ""
#: src/Module/Conversation/Community.php:68
msgid "Local Community"
msgstr ""
#: src/Module/Conversation/Community.php:71
msgid "Posts from local users on this server"
msgstr ""
#: src/Module/Conversation/Community.php:79
msgid "Global Community"
msgstr ""
#: src/Module/Conversation/Community.php:82
msgid "Posts from users of the whole federated network"
msgstr ""
#: src/Module/Conversation/Community.php:115
msgid "Own Contacts"
msgstr ""
#: src/Module/Conversation/Community.php:119
msgid "Include"
msgstr ""
#: src/Module/Conversation/Community.php:120
msgid "Hide"
msgstr ""
#: src/Module/Conversation/Community.php:137 src/Module/Search/Index.php:152
#: src/Module/Search/Index.php:194
msgid "No results."
msgstr ""
#: src/Module/Conversation/Community.php:162
#: src/Module/Conversation/Community.php:61
msgid ""
"This community stream shows all public posts received by this node. They may "
"not reflect the opinions of this nodes users."
msgstr ""
#: src/Module/Conversation/Community.php:199
#: src/Module/Conversation/Community.php:76
msgid "Local Community"
msgstr ""
#: src/Module/Conversation/Community.php:79
msgid "Posts from local users on this server"
msgstr ""
#: src/Module/Conversation/Community.php:87
msgid "Global Community"
msgstr ""
#: src/Module/Conversation/Community.php:90
msgid "Posts from users of the whole federated network"
msgstr ""
#: src/Module/Conversation/Community.php:123
msgid "Own Contacts"
msgstr ""
#: src/Module/Conversation/Community.php:127
msgid "Include"
msgstr ""
#: src/Module/Conversation/Community.php:128
msgid "Hide"
msgstr ""
#: src/Module/Conversation/Community.php:145 src/Module/Search/Index.php:152
#: src/Module/Search/Index.php:194
msgid "No results."
msgstr ""
#: src/Module/Conversation/Community.php:201
msgid "Community option not available."
msgstr ""
#: src/Module/Conversation/Community.php:215
#: src/Module/Conversation/Community.php:217
msgid "Not available."
msgstr ""
@ -11079,11 +11079,11 @@ msgstr ""
msgid "(no subject)"
msgstr ""
#: src/Worker/PushSubscription.php:111
#: src/Worker/PushSubscription.php:110
msgid "Notification from Friendica"
msgstr ""
#: src/Worker/PushSubscription.php:112
#: src/Worker/PushSubscription.php:111
msgid "Empty Post"
msgstr ""