commit
e34d38182c
|
@ -3,12 +3,16 @@
|
||||||
# SPDX-License-Identifier: CC0-1.0
|
# SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
parameters:
|
parameters:
|
||||||
level: 0
|
level: 1
|
||||||
|
|
||||||
paths:
|
paths:
|
||||||
- src/
|
- src/
|
||||||
|
|
||||||
scanDirectories:
|
scanDirectories:
|
||||||
- mod
|
- mod
|
||||||
|
- static
|
||||||
- vendor
|
- vendor
|
||||||
- view
|
- view
|
||||||
|
|
||||||
|
dynamicConstantNames:
|
||||||
|
- DB_UPDATE_VERSION
|
||||||
|
|
|
@ -341,13 +341,13 @@ function samplestorage_storage_uninstall()
|
||||||
DI::storageManager()->unregister(SampleStorageBackend::class);
|
DI::storageManager()->unregister(SampleStorageBackend::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
function samplestorage_storage_instance(App $a, array &$data)
|
function samplestorage_storage_instance(AppHelper $appHelper, array &$data)
|
||||||
{
|
{
|
||||||
$config = new SampleStorageBackendConfig(DI::l10n(), DI::config());
|
$config = new SampleStorageBackendConfig(DI::l10n(), DI::config());
|
||||||
$data['storage'] = new SampleStorageBackendConfig($config->getFileName());
|
$data['storage'] = new SampleStorageBackendConfig($config->getFileName());
|
||||||
}
|
}
|
||||||
|
|
||||||
function samplestorage_storage_config(App $a, array &$data)
|
function samplestorage_storage_config(AppHelper $appHelper, array &$data)
|
||||||
{
|
{
|
||||||
$data['storage_config'] = new SampleStorageBackendConfig(DI::l10n(), DI::config());
|
$data['storage_config'] = new SampleStorageBackendConfig(DI::l10n(), DI::config());
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,9 @@ The code will be something like:
|
||||||
// mod/network.php
|
// mod/network.php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\AppHelper;
|
||||||
|
|
||||||
function network_content(App $a) {
|
function network_content(AppHelper $appHelper) {
|
||||||
$itemsmanager = new \Friendica\ItemsManager();
|
$itemsmanager = new \Friendica\ItemsManager();
|
||||||
$items = $itemsmanager->getAll();
|
$items = $itemsmanager->getAll();
|
||||||
|
|
||||||
|
|
|
@ -447,6 +447,7 @@ class App implements AppHelper
|
||||||
$requeststring = ($server['REQUEST_METHOD'] ?? '') . ' ' . ($server['REQUEST_URI'] ?? '') . ' ' . ($server['SERVER_PROTOCOL'] ?? '');
|
$requeststring = ($server['REQUEST_METHOD'] ?? '') . ' ' . ($server['REQUEST_URI'] ?? '') . ' ' . ($server['SERVER_PROTOCOL'] ?? '');
|
||||||
$this->logger->debug('Request received', ['address' => $server['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $server['HTTP_REFERER'] ?? '', 'user-agent' => $server['HTTP_USER_AGENT'] ?? '']);
|
$this->logger->debug('Request received', ['address' => $server['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $server['HTTP_REFERER'] ?? '', 'user-agent' => $server['HTTP_USER_AGENT'] ?? '']);
|
||||||
$request_start = microtime(true);
|
$request_start = microtime(true);
|
||||||
|
$request = $_REQUEST;
|
||||||
|
|
||||||
$this->profiler->set($start_time, 'start');
|
$this->profiler->set($start_time, 'start');
|
||||||
$this->profiler->set(microtime(true), 'classinit');
|
$this->profiler->set(microtime(true), 'classinit');
|
||||||
|
@ -581,7 +582,7 @@ class App implements AppHelper
|
||||||
|
|
||||||
// Processes data from GET requests
|
// Processes data from GET requests
|
||||||
$httpinput = $httpInput->process();
|
$httpinput = $httpInput->process();
|
||||||
$input = array_merge($httpinput['variables'], $httpinput['files'], $request ?? $_REQUEST);
|
$input = array_merge($httpinput['variables'], $httpinput['files'], $request);
|
||||||
|
|
||||||
// Let the module run its internal process (init, get, post, ...)
|
// Let the module run its internal process (init, get, post, ...)
|
||||||
$timestamp = microtime(true);
|
$timestamp = microtime(true);
|
||||||
|
|
|
@ -103,6 +103,8 @@ class BaseURL extends Uri implements UriInterface
|
||||||
* @throws HTTPException\TemporaryRedirectException
|
* @throws HTTPException\TemporaryRedirectException
|
||||||
*
|
*
|
||||||
* @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
|
* @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
|
||||||
|
*
|
||||||
|
* @return never
|
||||||
*/
|
*/
|
||||||
public function redirect(string $toUrl = '', bool $ssl = false)
|
public function redirect(string $toUrl = '', bool $ssl = false)
|
||||||
{
|
{
|
||||||
|
|
|
@ -334,17 +334,17 @@ class Router
|
||||||
|
|
||||||
$stamp = microtime(true);
|
$stamp = microtime(true);
|
||||||
|
|
||||||
try {
|
|
||||||
/** @var ICanHandleRequests $module */
|
/** @var ICanHandleRequests $module */
|
||||||
return $this->dice->create($moduleClass, $this->parameters);
|
$module = $this->dice->create($moduleClass, $this->parameters);
|
||||||
} finally {
|
|
||||||
if ($this->dice_profiler_threshold > 0) {
|
if ($this->dice_profiler_threshold > 0) {
|
||||||
$dur = floatval(microtime(true) - $stamp);
|
$dur = floatval(microtime(true) - $stamp);
|
||||||
if ($dur >= $this->dice_profiler_threshold) {
|
if ($dur >= $this->dice_profiler_threshold) {
|
||||||
$this->logger->notice('Dice module creation lasts too long.', ['duration' => round($dur, 3), 'module' => $moduleClass, 'parameters' => $this->parameters]);
|
$this->logger->notice('Dice module creation lasts too long.', ['duration' => round($dur, 3), 'module' => $moduleClass, 'parameters' => $this->parameters]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return $module;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -245,10 +245,10 @@ abstract class BaseModule implements ICanHandleRequests
|
||||||
|
|
||||||
$this->response->setStatus($e->getCode(), $e->getMessage());
|
$this->response->setStatus($e->getCode(), $e->getMessage());
|
||||||
$this->response->addContent($httpException->content($e));
|
$this->response->addContent($httpException->content($e));
|
||||||
} finally {
|
|
||||||
$this->profiler->set(microtime(true) - $timestamp, 'content');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->profiler->set(microtime(true) - $timestamp, 'content');
|
||||||
|
|
||||||
return $this->response->generate();
|
return $this->response->generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ abstract class BaseModule implements ICanHandleRequests
|
||||||
$request[$parameter] = $this->getRequestValue($input, $parameter, $defaultvalue);
|
$request[$parameter] = $this->getRequestValue($input, $parameter, $defaultvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($input ?? [] as $parameter => $value) {
|
foreach ($input as $parameter => $value) {
|
||||||
if ($parameter == 'pagename') {
|
if ($parameter == 'pagename') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -456,7 +456,7 @@ abstract class BaseModule implements ICanHandleRequests
|
||||||
* @param string $content
|
* @param string $content
|
||||||
* @param string $type
|
* @param string $type
|
||||||
* @param string|null $content_type
|
* @param string|null $content_type
|
||||||
* @return void
|
* @return never
|
||||||
* @throws HTTPException\InternalServerErrorException
|
* @throws HTTPException\InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
public function httpExit(string $content, string $type = Response::TYPE_HTML, ?string $content_type = null)
|
public function httpExit(string $content, string $type = Response::TYPE_HTML, ?string $content_type = null)
|
||||||
|
@ -493,7 +493,7 @@ abstract class BaseModule implements ICanHandleRequests
|
||||||
* @param mixed $content
|
* @param mixed $content
|
||||||
* @param string $content_type
|
* @param string $content_type
|
||||||
* @param int $options A combination of json_encode() binary flags
|
* @param int $options A combination of json_encode() binary flags
|
||||||
* @return void
|
* @return never
|
||||||
* @throws HTTPException\InternalServerErrorException
|
* @throws HTTPException\InternalServerErrorException
|
||||||
* @see json_encode()
|
* @see json_encode()
|
||||||
*/
|
*/
|
||||||
|
@ -508,7 +508,7 @@ abstract class BaseModule implements ICanHandleRequests
|
||||||
* @param int $httpCode
|
* @param int $httpCode
|
||||||
* @param mixed $content
|
* @param mixed $content
|
||||||
* @param string $content_type
|
* @param string $content_type
|
||||||
* @return void
|
* @return never
|
||||||
* @throws HTTPException\InternalServerErrorException
|
* @throws HTTPException\InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
public function jsonError(int $httpCode, $content, string $content_type = 'application/json')
|
public function jsonError(int $httpCode, $content, string $content_type = 'application/json')
|
||||||
|
|
|
@ -12,7 +12,6 @@ use Friendica\Contact\Avatar;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
use Friendica\Model\Photo;
|
use Friendica\Model\Photo;
|
||||||
use Friendica\Util\Images;
|
|
||||||
use Friendica\Object\Image;
|
use Friendica\Object\Image;
|
||||||
use Friendica\Core\Config\Capability\IManageConfigValues;
|
use Friendica\Core\Config\Capability\IManageConfigValues;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
|
@ -115,6 +114,10 @@ HELP;
|
||||||
|
|
||||||
private function storeAvatar(string $resourceid, array $contact, bool $quit_on_invalid)
|
private function storeAvatar(string $resourceid, array $contact, bool $quit_on_invalid)
|
||||||
{
|
{
|
||||||
|
$photo = false;
|
||||||
|
$imgdata = false;
|
||||||
|
$image = null;
|
||||||
|
|
||||||
$valid = !empty($resourceid);
|
$valid = !empty($resourceid);
|
||||||
if ($valid) {
|
if ($valid) {
|
||||||
$this->out('1', false);
|
$this->out('1', false);
|
||||||
|
@ -143,7 +146,7 @@ HELP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($valid) {
|
if ($valid && $image instanceof Image) {
|
||||||
$this->out('4', false);
|
$this->out('4', false);
|
||||||
$fields = Avatar::storeAvatarByImage($contact, $image);
|
$fields = Avatar::storeAvatarByImage($contact, $image);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -142,17 +142,18 @@ class ContactSelector
|
||||||
$replace = array_values($nets);
|
$replace = array_values($nets);
|
||||||
|
|
||||||
$networkname = str_replace($search, $replace, $network);
|
$networkname = str_replace($search, $replace, $network);
|
||||||
|
$platform = '';
|
||||||
|
|
||||||
if (in_array($network, Protocol::FEDERATED) && !empty($gsid)) {
|
if (in_array($network, Protocol::FEDERATED) && !empty($gsid)) {
|
||||||
$gserver = self::getServerForId($gsid);
|
$gserver = self::getServerForId($gsid);
|
||||||
|
|
||||||
if (!empty($gserver['platform'])) {
|
if (!empty($gserver['platform'])) {
|
||||||
$platform = $gserver['platform'];
|
$platform = (string) $gserver['platform'];
|
||||||
} elseif (!empty($gserver['network']) && ($gserver['network'] != Protocol::ACTIVITYPUB)) {
|
} elseif (!empty($gserver['network']) && ($gserver['network'] != Protocol::ACTIVITYPUB)) {
|
||||||
$platform = self::networkToName($gserver['network']);
|
$platform = self::networkToName($gserver['network']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($platform)) {
|
if ($platform !== '') {
|
||||||
$networkname = $platform;
|
$networkname = $platform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,7 +162,7 @@ class ContactSelector
|
||||||
$networkname = DI::l10n()->t('%s (via %s)', $networkname, self::networkToName($protocol));
|
$networkname = DI::l10n()->t('%s (via %s)', $networkname, self::networkToName($protocol));
|
||||||
} elseif (in_array($network, ['', $protocol]) && ($network == Protocol::DFRN)) {
|
} elseif (in_array($network, ['', $protocol]) && ($network == Protocol::DFRN)) {
|
||||||
$networkname .= ' (DFRN)';
|
$networkname .= ' (DFRN)';
|
||||||
} elseif (in_array($network, ['', $protocol]) && ($network == Protocol::DIASPORA) && ($platform != 'diaspora')) {
|
} elseif (in_array($network, ['', $protocol]) && ($network == Protocol::DIASPORA) && ($platform !== 'diaspora')) {
|
||||||
$networkname .= ' (Diaspora)';
|
$networkname .= ' (Diaspora)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,7 @@ class Item
|
||||||
public static function replaceTag(string &$body, int $profile_uid, string $tag, string $network = '')
|
public static function replaceTag(string &$body, int $profile_uid, string $tag, string $network = '')
|
||||||
{
|
{
|
||||||
$replaced = false;
|
$replaced = false;
|
||||||
|
$contact = [];
|
||||||
|
|
||||||
//is it a person tag?
|
//is it a person tag?
|
||||||
if (Tag::isType($tag, Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION)) {
|
if (Tag::isType($tag, Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION)) {
|
||||||
|
@ -247,6 +248,8 @@ class Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$newname = '';
|
||||||
|
|
||||||
// Check if $contact has been successfully loaded
|
// Check if $contact has been successfully loaded
|
||||||
if (DBA::isResult($contact)) {
|
if (DBA::isResult($contact)) {
|
||||||
$profile = $contact['url'];
|
$profile = $contact['url'];
|
||||||
|
|
|
@ -178,7 +178,7 @@ class OEmbed
|
||||||
$oembed->thumbnail_height = $data['images'][0]['height'];
|
$oembed->thumbnail_height = $data['images'][0]['height'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Hook::callAll('oembed_fetch_url', $embedurl, $oembed);
|
Hook::callAll('oembed_fetch_url', $embedurl);
|
||||||
|
|
||||||
return $oembed;
|
return $oembed;
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,7 @@ class PostMedia extends BaseRepository
|
||||||
$heights = [];
|
$heights = [];
|
||||||
$selected = '';
|
$selected = '';
|
||||||
$previews = [];
|
$previews = [];
|
||||||
|
$video = [];
|
||||||
|
|
||||||
foreach ($PostMedias as $PostMedia) {
|
foreach ($PostMedias as $PostMedia) {
|
||||||
foreach ($links as $link) {
|
foreach ($links as $link) {
|
||||||
|
|
|
@ -543,6 +543,8 @@ class NPF
|
||||||
return $npf;
|
return $npf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$block = [];
|
||||||
|
|
||||||
$media = Post\Media::getByURL($uri_id, $attributes['src'], [Post\Media::AUDIO, Post\Media::VIDEO]);
|
$media = Post\Media::getByURL($uri_id, $attributes['src'], [Post\Media::AUDIO, Post\Media::VIDEO]);
|
||||||
if (!empty($media)) {
|
if (!empty($media)) {
|
||||||
switch ($media['type']) {
|
switch ($media['type']) {
|
||||||
|
|
|
@ -114,6 +114,8 @@ class Plaintext
|
||||||
$post['text'] = trim($item['title']);
|
$post['text'] = trim($item['title']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$abstract = '';
|
||||||
|
|
||||||
// Fetch the abstract from the given target network
|
// Fetch the abstract from the given target network
|
||||||
switch ($htmlmode) {
|
switch ($htmlmode) {
|
||||||
case BBCode::TWITTER:
|
case BBCode::TWITTER:
|
||||||
|
@ -242,6 +244,8 @@ class Plaintext
|
||||||
$part = '';
|
$part = '';
|
||||||
$break_pos = 0;
|
$break_pos = 0;
|
||||||
$comma_pos = 0;
|
$comma_pos = 0;
|
||||||
|
$pos = 0;
|
||||||
|
$word = '';
|
||||||
|
|
||||||
$limit = $baselimit;
|
$limit = $baselimit;
|
||||||
|
|
||||||
|
|
|
@ -402,7 +402,7 @@ class Widget
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$commonContacts = Contact\Relation::listCommon($localPCid, $visitorPCid, $condition, 0, 5, true);
|
$commonContacts = Contact\Relation::listCommon($localPCid, $visitorPCid, $condition, 0, 5);
|
||||||
if (!DBA::isResult($commonContacts)) {
|
if (!DBA::isResult($commonContacts)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
@ -479,6 +479,10 @@ class Widget
|
||||||
DI::cache()->set($cachekey, $dthen, Duration::HOUR);
|
DI::cache()->set($cachekey, $dthen, Duration::HOUR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$cutoffday = '';
|
||||||
|
$thisday = '';
|
||||||
|
$nextday = '';
|
||||||
|
|
||||||
if ($dthen) {
|
if ($dthen) {
|
||||||
// Set the start and end date to the beginning of the month
|
// Set the start and end date to the beginning of the month
|
||||||
$cutoffday = $dthen;
|
$cutoffday = $dthen;
|
||||||
|
@ -513,7 +517,6 @@ class Widget
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$cutoff_year = intval(DateTimeFormat::localNow('Y')) - $visible_years;
|
$cutoff_year = intval(DateTimeFormat::localNow('Y')) - $visible_years;
|
||||||
$cutoff = array_key_exists($cutoff_year, $ret);
|
$cutoff = array_key_exists($cutoff_year, $ret);
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ class VCard
|
||||||
public static function getHTML(array $contact, bool $hide_mention = false, bool $hide_follow = false): string
|
public static function getHTML(array $contact, bool $hide_mention = false, bool $hide_follow = false): string
|
||||||
{
|
{
|
||||||
if (!isset($contact['network']) || !isset($contact['id'])) {
|
if (!isset($contact['network']) || !isset($contact['id'])) {
|
||||||
Logger::warning('Incomplete contact', ['contact' => $contact ?? []]);
|
Logger::warning('Incomplete contact', ['contact' => $contact]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$contact_url = Contact::getProfileLink($contact);
|
$contact_url = Contact::getProfileLink($contact);
|
||||||
|
|
|
@ -14,8 +14,8 @@ use Throwable;
|
||||||
*/
|
*/
|
||||||
class AddonInvalidConfigFileException extends \RuntimeException
|
class AddonInvalidConfigFileException extends \RuntimeException
|
||||||
{
|
{
|
||||||
public function __construct($message = '', $code = 0, Throwable $previous = null)
|
public function __construct($message = '')
|
||||||
{
|
{
|
||||||
parent::__construct($message, 500, $previous);
|
parent::__construct($message, 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,17 +47,21 @@ class DatabaseCache extends AbstractCache implements ICanCache
|
||||||
}
|
}
|
||||||
|
|
||||||
$stmt = $this->dba->select('cache', ['k'], $where);
|
$stmt = $this->dba->select('cache', ['k'], $where);
|
||||||
|
} catch (\Exception $exception) {
|
||||||
|
throw new CachePersistenceException(sprintf('Cannot fetch all keys with prefix %s', $prefix), $exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
$keys = [];
|
$keys = [];
|
||||||
while ($key = $this->dba->fetch($stmt)) {
|
while ($key = $this->dba->fetch($stmt)) {
|
||||||
array_push($keys, $key['k']);
|
array_push($keys, $key['k']);
|
||||||
}
|
}
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
throw new CachePersistenceException(sprintf('Cannot fetch all keys with prefix %s', $prefix), $exception);
|
|
||||||
} finally {
|
|
||||||
$this->dba->close($stmt);
|
$this->dba->close($stmt);
|
||||||
|
throw new CachePersistenceException(sprintf('Cannot fetch all keys with prefix %s', $prefix), $exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->dba->close($stmt);
|
||||||
return $keys;
|
return $keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,8 @@ use Throwable;
|
||||||
|
|
||||||
class ConfigFileException extends \RuntimeException
|
class ConfigFileException extends \RuntimeException
|
||||||
{
|
{
|
||||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
public function __construct($message = "")
|
||||||
{
|
{
|
||||||
parent::__construct($message, 500, $previous);
|
parent::__construct($message, 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,7 +245,10 @@ class ConfigFileManager
|
||||||
$fullName = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php';
|
$fullName = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php';
|
||||||
|
|
||||||
$config = [];
|
$config = [];
|
||||||
if (file_exists($fullName)) {
|
if (!file_exists($fullName)) {
|
||||||
|
return $config;
|
||||||
|
}
|
||||||
|
|
||||||
$a = new \stdClass();
|
$a = new \stdClass();
|
||||||
$a->config = [];
|
$a->config = [];
|
||||||
include $fullName;
|
include $fullName;
|
||||||
|
@ -283,7 +286,7 @@ class ConfigFileManager
|
||||||
$config['database']['database'] = $db_data;
|
$config['database']['database'] = $db_data;
|
||||||
unset($db_data);
|
unset($db_data);
|
||||||
}
|
}
|
||||||
if (isset($config['system']['db_charset'])) {
|
if (isset($config['system']) && isset($config['system']['db_charset'])) {
|
||||||
$config['database']['charset'] = $config['system']['db_charset'];
|
$config['database']['charset'] = $config['system']['db_charset'];
|
||||||
}
|
}
|
||||||
if (isset($pidfile)) {
|
if (isset($pidfile)) {
|
||||||
|
@ -298,7 +301,6 @@ class ConfigFileManager
|
||||||
$config['system']['language'] = $lang;
|
$config['system']['language'] = $lang;
|
||||||
unset($lang);
|
unset($lang);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return $config;
|
return $config;
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,17 +182,22 @@ class DatabaseLock extends AbstractLock
|
||||||
}
|
}
|
||||||
|
|
||||||
$stmt = $this->dba->select('locks', ['name'], $where);
|
$stmt = $this->dba->select('locks', ['name'], $where);
|
||||||
|
} catch (\Exception $exception) {
|
||||||
|
throw new LockPersistenceException(sprintf('Cannot get lock with prefix %s', $prefix), $exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
$keys = [];
|
$keys = [];
|
||||||
while ($key = $this->dba->fetch($stmt)) {
|
while ($key = $this->dba->fetch($stmt)) {
|
||||||
array_push($keys, $key['name']);
|
array_push($keys, $key['name']);
|
||||||
}
|
}
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
throw new LockPersistenceException(sprintf('Cannot get lock with prefix %s', $prefix), $exception);
|
|
||||||
} finally {
|
|
||||||
$this->dba->close($stmt);
|
$this->dba->close($stmt);
|
||||||
|
throw new LockPersistenceException(sprintf('Cannot get lock with prefix %s', $prefix), $exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->dba->close($stmt);
|
||||||
|
|
||||||
return $keys;
|
return $keys;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,11 @@ class PConfig
|
||||||
} else {
|
} else {
|
||||||
$configs = $this->db->select(static::$table_name, ['cat', 'v', 'k'], ['cat' => $cat, 'uid' => $uid]);
|
$configs = $this->db->select(static::$table_name, ['cat', 'v', 'k'], ['cat' => $cat, 'uid' => $uid]);
|
||||||
}
|
}
|
||||||
|
} catch (\Exception $exception) {
|
||||||
|
throw new PConfigPersistenceException(sprintf('Cannot load config category "%s" for user %d', $cat, $uid), $exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
while ($config = $this->db->fetch($configs)) {
|
while ($config = $this->db->fetch($configs)) {
|
||||||
$key = $config['k'];
|
$key = $config['k'];
|
||||||
$value = ValueConversion::toConfigValue($config['v']);
|
$value = ValueConversion::toConfigValue($config['v']);
|
||||||
|
@ -71,11 +75,12 @@ class PConfig
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
throw new PConfigPersistenceException(sprintf('Cannot load config category %s for user %d', $cat, $uid), $exception);
|
|
||||||
} finally {
|
|
||||||
$this->db->close($configs);
|
$this->db->close($configs);
|
||||||
|
throw new PConfigPersistenceException(sprintf('Cannot load config category "%s" for user %d', $cat, $uid), $exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->db->close($configs);
|
||||||
|
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,14 @@ use Friendica\Core\Cache\Factory\Cache;
|
||||||
use Friendica\Core\Cache\Type\DatabaseCache;
|
use Friendica\Core\Cache\Type\DatabaseCache;
|
||||||
use Friendica\Core\Config\Capability\IManageConfigValues;
|
use Friendica\Core\Config\Capability\IManageConfigValues;
|
||||||
use Friendica\Core\Session\Capability\IHandleSessions;
|
use Friendica\Core\Session\Capability\IHandleSessions;
|
||||||
use Friendica\Core\Session\Type;
|
use Friendica\Core\Session\Handler\Cache as CacheHandler;
|
||||||
use Friendica\Core\Session\Handler;
|
use Friendica\Core\Session\Handler\Database as DatabaseHandler;
|
||||||
|
use Friendica\Core\Session\Type\Memory;
|
||||||
|
use Friendica\Core\Session\Type\Native;
|
||||||
use Friendica\Database\Database;
|
use Friendica\Database\Database;
|
||||||
use Friendica\Util\Profiler;
|
use Friendica\Util\Profiler;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Throwable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory for creating a valid Session for this run
|
* Factory for creating a valid Session for this run
|
||||||
|
@ -49,36 +52,45 @@ class Session
|
||||||
$profiler->startRecording('session');
|
$profiler->startRecording('session');
|
||||||
$session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT);
|
$session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT);
|
||||||
|
|
||||||
try {
|
|
||||||
if ($mode->isInstall() || $mode->isBackend()) {
|
if ($mode->isInstall() || $mode->isBackend()) {
|
||||||
$session = new Type\Memory();
|
$session = new Memory();
|
||||||
} else {
|
$profiler->stopRecording();
|
||||||
|
return $session;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
switch ($session_handler) {
|
switch ($session_handler) {
|
||||||
case self::HANDLER_DATABASE:
|
case self::HANDLER_DATABASE:
|
||||||
$handler = new Handler\Database($dba, $logger, $server);
|
$handler = new DatabaseHandler($dba, $logger, $server);
|
||||||
break;
|
break;
|
||||||
case self::HANDLER_CACHE:
|
case self::HANDLER_CACHE:
|
||||||
$cache = $cacheFactory->createDistributed();
|
$cache = $cacheFactory->createDistributed();
|
||||||
|
|
||||||
// In case we're using the db as cache driver, use the native db session, not the cache
|
// In case we're using the db as cache driver, use the native db session, not the cache
|
||||||
if ($config->get('system', 'cache_driver') === DatabaseCache::NAME) {
|
if ($config->get('system', 'cache_driver') === DatabaseCache::NAME) {
|
||||||
$handler = new Handler\Database($dba, $logger, $server);
|
$handler = new DatabaseHandler($dba, $logger, $server);
|
||||||
} else {
|
} else {
|
||||||
$handler = new Handler\Cache($cache, $logger);
|
$handler = new CacheHandler($cache, $logger);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$handler = null;
|
$handler = null;
|
||||||
}
|
}
|
||||||
|
} catch (Throwable $e) {
|
||||||
$session = new Type\Native($baseURL, $handler);
|
|
||||||
}
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
$logger->notice('Unable to create session', ['mode' => $mode, 'session_handler' => $session_handler, 'exception' => $e]);
|
$logger->notice('Unable to create session', ['mode' => $mode, 'session_handler' => $session_handler, 'exception' => $e]);
|
||||||
$session = new Type\Memory();
|
$session = new Memory();
|
||||||
} finally {
|
$profiler->stopRecording();
|
||||||
|
return $session;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$session = new Native($baseURL, $handler);
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
$logger->notice('Unable to create session', ['mode' => $mode, 'session_handler' => $session_handler, 'exception' => $e]);
|
||||||
|
$session = new Memory();
|
||||||
|
}
|
||||||
|
|
||||||
$profiler->stopRecording();
|
$profiler->stopRecording();
|
||||||
return $session;
|
return $session;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -54,16 +54,13 @@ class ExternalResource implements ICanReadFromStorage
|
||||||
$this->logger->notice('URL is invalid', ['url' => $data->url, 'error' => $exception]);
|
$this->logger->notice('URL is invalid', ['url' => $data->url, 'error' => $exception]);
|
||||||
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $exception->getCode(), $exception);
|
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $exception->getCode(), $exception);
|
||||||
}
|
}
|
||||||
if (!empty($fetchResult) && $fetchResult->isSuccess()) {
|
|
||||||
$this->logger->debug('Got picture', ['Content-Type' => $fetchResult->getHeader('Content-Type'), 'uid' => $data->uid, 'url' => $data->url]);
|
if (!$fetchResult->isSuccess()) {
|
||||||
return $fetchResult->getBodyString();
|
|
||||||
} else {
|
|
||||||
if (empty($fetchResult)) {
|
|
||||||
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference));
|
|
||||||
} else {
|
|
||||||
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $fetchResult->getReturnCode(), new Exception($fetchResult->getBodyString()));
|
throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $fetchResult->getReturnCode(), new Exception($fetchResult->getBodyString()));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
$this->logger->debug('Got picture', ['Content-Type' => $fetchResult->getHeader('Content-Type'), 'uid' => $data->uid, 'url' => $data->url]);
|
||||||
|
return $fetchResult->getBodyString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -393,6 +393,8 @@ class System
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exit the program execution.
|
* Exit the program execution.
|
||||||
|
*
|
||||||
|
* @return never
|
||||||
*/
|
*/
|
||||||
public static function exit()
|
public static function exit()
|
||||||
{
|
{
|
||||||
|
@ -506,6 +508,8 @@ class System
|
||||||
* @throws TemporaryRedirectException
|
* @throws TemporaryRedirectException
|
||||||
*
|
*
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||||
|
*
|
||||||
|
* @return never
|
||||||
*/
|
*/
|
||||||
public static function externalRedirect($url, $code = 302)
|
public static function externalRedirect($url, $code = 302)
|
||||||
{
|
{
|
||||||
|
|
|
@ -275,7 +275,7 @@ class DBStructure
|
||||||
$is_new_table = false;
|
$is_new_table = false;
|
||||||
$sql3 = "";
|
$sql3 = "";
|
||||||
if (!isset($database[$name])) {
|
if (!isset($database[$name])) {
|
||||||
$sql = DbaDefinitionSqlWriter::createTable($name, $structure, $verbose, $action);
|
$sql = DbaDefinitionSqlWriter::createTable($name, $structure);
|
||||||
if ($verbose) {
|
if ($verbose) {
|
||||||
echo $sql;
|
echo $sql;
|
||||||
}
|
}
|
||||||
|
|
|
@ -534,6 +534,8 @@ class Database
|
||||||
throw new ServiceUnavailableException('The Connection is empty, although connected is set true.');
|
throw new ServiceUnavailableException('The Connection is empty, although connected is set true.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$retval = false;
|
||||||
|
|
||||||
switch ($this->driver) {
|
switch ($this->driver) {
|
||||||
case self::PDO:
|
case self::PDO:
|
||||||
// If there are no arguments we use "query"
|
// If there are no arguments we use "query"
|
||||||
|
@ -1074,6 +1076,8 @@ class Database
|
||||||
*/
|
*/
|
||||||
public function lastInsertId(): int
|
public function lastInsertId(): int
|
||||||
{
|
{
|
||||||
|
$id = 0;
|
||||||
|
|
||||||
switch ($this->driver) {
|
switch ($this->driver) {
|
||||||
case self::PDO:
|
case self::PDO:
|
||||||
$id = $this->connection->lastInsertId();
|
$id = $this->connection->lastInsertId();
|
||||||
|
@ -1681,6 +1685,8 @@ class Database
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$ret = false;
|
||||||
|
|
||||||
switch ($this->driver) {
|
switch ($this->driver) {
|
||||||
case self::PDO:
|
case self::PDO:
|
||||||
$ret = $stmt->closeCursor();
|
$ret = $stmt->closeCursor();
|
||||||
|
@ -1695,8 +1701,6 @@ class Database
|
||||||
} elseif ($stmt instanceof mysqli_result) {
|
} elseif ($stmt instanceof mysqli_result) {
|
||||||
$stmt->free();
|
$stmt->free();
|
||||||
$ret = true;
|
$ret = true;
|
||||||
} else {
|
|
||||||
$ret = false;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -284,7 +284,7 @@ class PostUpdate
|
||||||
}
|
}
|
||||||
|
|
||||||
while ($item = DBA::fetch($items)) {
|
while ($item = DBA::fetch($items)) {
|
||||||
Tag::storeFromBody($item['uri-id'], $item['body'], '#!@', false);
|
Tag::storeFromBody($item['uri-id'], $item['body'], '#!@');
|
||||||
$id = $item['uri-id'];
|
$id = $item['uri-id'];
|
||||||
++$rows;
|
++$rows;
|
||||||
if ($rows % 1000 == 0) {
|
if ($rows % 1000 == 0) {
|
||||||
|
@ -775,11 +775,8 @@ class PostUpdate
|
||||||
|
|
||||||
while ($photo = DBA::fetch($photos)) {
|
while ($photo = DBA::fetch($photos)) {
|
||||||
$img = Photo::getImageForPhoto($photo);
|
$img = Photo::getImageForPhoto($photo);
|
||||||
if (!empty($img)) {
|
|
||||||
$md5 = md5($img->asString());
|
$md5 = md5($img->asString());
|
||||||
} else {
|
|
||||||
$md5 = '';
|
|
||||||
}
|
|
||||||
DBA::update('photo', ['hash' => $md5], ['id' => $photo['id']]);
|
DBA::update('photo', ['hash' => $md5], ['id' => $photo['id']]);
|
||||||
++$rows;
|
++$rows;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,11 +25,11 @@ class View
|
||||||
foreach (['post-view', 'post-thread-view'] as $view) {
|
foreach (['post-view', 'post-thread-view'] as $view) {
|
||||||
if (self::isView($view)) {
|
if (self::isView($view)) {
|
||||||
$sql = sprintf("DROP VIEW IF EXISTS `%s`", DBA::escape($view));
|
$sql = sprintf("DROP VIEW IF EXISTS `%s`", DBA::escape($view));
|
||||||
if (!empty($sql) && $verbose) {
|
if ($verbose) {
|
||||||
echo $sql . ";\n";
|
echo $sql . ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($sql) && $action) {
|
if ($action) {
|
||||||
DBA::e($sql);
|
DBA::e($sql);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,9 @@ class DirectMessage extends BaseFactory
|
||||||
throw new HTTPException\NotFoundException('Direct message with ID ' . $mail . ' not found.');
|
throw new HTTPException\NotFoundException('Direct message with ID ' . $mail . ' not found.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$title = '';
|
||||||
|
$text = '';
|
||||||
|
|
||||||
if (!empty($text_mode)) {
|
if (!empty($text_mode)) {
|
||||||
$title = $mail['title'];
|
$title = $mail['title'];
|
||||||
if ($text_mode == 'html') {
|
if ($text_mode == 'html') {
|
||||||
|
@ -56,7 +59,6 @@ class DirectMessage extends BaseFactory
|
||||||
$text = HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::TWITTER_API), 0);
|
$text = HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::TWITTER_API), 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$title = '';
|
|
||||||
$text = $mail['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::TWITTER_API), 0);
|
$text = $mail['title'] . "\n" . HTML::toPlaintext(BBCode::convertForUriId($mail['uri-id'], $mail['body'], BBCode::TWITTER_API), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ class User extends BaseFactory
|
||||||
['author-id' => $publicContact['id'], 'gravity' => [Item::GRAVITY_COMMENT, Item::GRAVITY_PARENT], 'private' => [Item::PUBLIC, Item::UNLISTED]],
|
['author-id' => $publicContact['id'], 'gravity' => [Item::GRAVITY_COMMENT, Item::GRAVITY_PARENT], 'private' => [Item::PUBLIC, Item::UNLISTED]],
|
||||||
['order' => ['uri-id' => true]]);
|
['order' => ['uri-id' => true]]);
|
||||||
if (!empty($post['uri-id'])) {
|
if (!empty($post['uri-id'])) {
|
||||||
$status = $this->status->createFromUriId($post['uri-id'], $uid)->toArray();
|
$status = $this->status->createFromUriId($post['uri-id'], $uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ class APContact
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$curlResult = HTTPSignature::fetchRaw($url);
|
$curlResult = HTTPSignature::fetchRaw($url);
|
||||||
$failed = empty($curlResult) || empty($curlResult->getBodyString()) ||
|
$failed = empty($curlResult->getBodyString()) ||
|
||||||
(!$curlResult->isSuccess() && ($curlResult->getReturnCode() != 410));
|
(!$curlResult->isSuccess() && ($curlResult->getReturnCode() != 410));
|
||||||
|
|
||||||
if (!$failed) {
|
if (!$failed) {
|
||||||
|
|
|
@ -2364,6 +2364,8 @@ class Contact
|
||||||
$cache_avatar = !DBA::exists('contact', ['nurl' => $contact['nurl'], 'self' => true]);
|
$cache_avatar = !DBA::exists('contact', ['nurl' => $contact['nurl'], 'self' => true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$fields = [];
|
||||||
|
|
||||||
if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) || $cache_avatar) {
|
if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) || $cache_avatar) {
|
||||||
if (Avatar::deleteCache($contact)) {
|
if (Avatar::deleteCache($contact)) {
|
||||||
$force = true;
|
$force = true;
|
||||||
|
@ -2380,6 +2382,8 @@ class Contact
|
||||||
Logger::debug('Use default avatar', ['id' => $cid, 'uid' => $uid]);
|
Logger::debug('Use default avatar', ['id' => $cid, 'uid' => $uid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$local_uid = 0;
|
||||||
|
|
||||||
// Use the data from the self account
|
// Use the data from the self account
|
||||||
if (empty($fields)) {
|
if (empty($fields)) {
|
||||||
$local_uid = User::getIdForURL($contact['url']);
|
$local_uid = User::getIdForURL($contact['url']);
|
||||||
|
@ -2411,8 +2415,15 @@ class Contact
|
||||||
if ($update) {
|
if ($update) {
|
||||||
$photos = Photo::importProfilePhoto($avatar, $uid, $cid, true);
|
$photos = Photo::importProfilePhoto($avatar, $uid, $cid, true);
|
||||||
if ($photos) {
|
if ($photos) {
|
||||||
$fields = ['avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'blurhash' => $photos[3], 'avatar-date' => DateTimeFormat::utcNow()];
|
$fields = [
|
||||||
$update = !empty($fields);
|
'avatar' => $avatar,
|
||||||
|
'photo' => $photos[0],
|
||||||
|
'thumb' => $photos[1],
|
||||||
|
'micro' => $photos[2],
|
||||||
|
'blurhash' => $photos[3],
|
||||||
|
'avatar-date' => DateTimeFormat::utcNow(),
|
||||||
|
];
|
||||||
|
$update = true;
|
||||||
Logger::debug('Created new cached avatars', ['id' => $cid, 'uid' => $uid, 'owner-uid' => $local_uid]);
|
Logger::debug('Created new cached avatars', ['id' => $cid, 'uid' => $uid, 'owner-uid' => $local_uid]);
|
||||||
} else {
|
} else {
|
||||||
$update = false;
|
$update = false;
|
||||||
|
|
|
@ -333,7 +333,7 @@ class Event
|
||||||
$item['uri'] = $event['uri'];
|
$item['uri'] = $event['uri'];
|
||||||
$item['uri-id'] = ItemURI::getIdByURI($event['uri']);
|
$item['uri-id'] = ItemURI::getIdByURI($event['uri']);
|
||||||
$item['guid'] = $event['guid'];
|
$item['guid'] = $event['guid'];
|
||||||
$item['plink'] = $arr['plink'] ?? '';
|
$item['plink'] = '';
|
||||||
$item['post-type'] = Item::PT_EVENT;
|
$item['post-type'] = Item::PT_EVENT;
|
||||||
$item['wall'] = $event['cid'] ? 0 : 1;
|
$item['wall'] = $event['cid'] ? 0 : 1;
|
||||||
$item['contact-id'] = $contact['id'];
|
$item['contact-id'] = $contact['id'];
|
||||||
|
|
|
@ -224,6 +224,8 @@ class GServer
|
||||||
*/
|
*/
|
||||||
public static function reachable(array $contact): bool
|
public static function reachable(array $contact): bool
|
||||||
{
|
{
|
||||||
|
$server = '';
|
||||||
|
|
||||||
if (!empty($contact['gsid'])) {
|
if (!empty($contact['gsid'])) {
|
||||||
$gsid = $contact['gsid'];
|
$gsid = $contact['gsid'];
|
||||||
} elseif (!empty($contact['baseurl'])) {
|
} elseif (!empty($contact['baseurl'])) {
|
||||||
|
@ -800,6 +802,8 @@ class GServer
|
||||||
$serverdata['failed'] = false;
|
$serverdata['failed'] = false;
|
||||||
$serverdata['blocked'] = false;
|
$serverdata['blocked'] = false;
|
||||||
|
|
||||||
|
$id = 0;
|
||||||
|
|
||||||
$gserver = DBA::selectFirst('gserver', ['network'], ['nurl' => Strings::normaliseLink($url)]);
|
$gserver = DBA::selectFirst('gserver', ['network'], ['nurl' => Strings::normaliseLink($url)]);
|
||||||
if (!DBA::isResult($gserver)) {
|
if (!DBA::isResult($gserver)) {
|
||||||
$serverdata['created'] = DateTimeFormat::utcNow();
|
$serverdata['created'] = DateTimeFormat::utcNow();
|
||||||
|
@ -1197,10 +1201,6 @@ class GServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($server)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($server['network'])) {
|
if (empty($server['network'])) {
|
||||||
$server['network'] = Protocol::PHANTOM;
|
$server['network'] = Protocol::PHANTOM;
|
||||||
}
|
}
|
||||||
|
@ -1337,10 +1337,6 @@ class GServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($server)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($server['network'])) {
|
if (empty($server['network'])) {
|
||||||
$server['network'] = Protocol::PHANTOM;
|
$server['network'] = Protocol::PHANTOM;
|
||||||
}
|
}
|
||||||
|
@ -1444,7 +1440,7 @@ class GServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($server) || empty($server['platform'])) {
|
if (empty($server['platform'])) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1652,10 +1648,11 @@ class GServer
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = json_decode($curlResult->getBodyString(), true);
|
$data = json_decode($curlResult->getBodyString(), true);
|
||||||
if (empty($data)) {
|
if (!is_string($data)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return $data ?? '';
|
|
||||||
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function getZotData(string $url, array $serverdata): array
|
private static function getZotData(string $url, array $serverdata): array
|
||||||
|
@ -2310,13 +2307,19 @@ class GServer
|
||||||
return $serverdata;
|
return $serverdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(__DIR__ . '/../../static/platforms.config.php')) {
|
if (!file_exists(__DIR__ . '/../../static/platforms.config.php')) {
|
||||||
require __DIR__ . '/../../static/platforms.config.php';
|
|
||||||
} else {
|
|
||||||
throw new HTTPException\InternalServerErrorException('Invalid platform file');
|
throw new HTTPException\InternalServerErrorException('Invalid platform file');
|
||||||
}
|
}
|
||||||
|
|
||||||
$platforms = array_merge($ap_platforms, $dfrn_platforms, $zap_platforms, $platforms);
|
/** @var array $grouped_platforms */
|
||||||
|
$grouped_platforms = require __DIR__ . '/../../static/platforms.config.php';
|
||||||
|
|
||||||
|
$platforms = array_merge(
|
||||||
|
$grouped_platforms['ap_platforms'],
|
||||||
|
$grouped_platforms['dfrn_platforms'],
|
||||||
|
$grouped_platforms['zap_platforms'],
|
||||||
|
$grouped_platforms['platforms'],
|
||||||
|
);
|
||||||
|
|
||||||
$doc = new DOMDocument();
|
$doc = new DOMDocument();
|
||||||
@$doc->loadHTML($curlResult->getBodyString());
|
@$doc->loadHTML($curlResult->getBodyString());
|
||||||
|
@ -2367,11 +2370,11 @@ class GServer
|
||||||
$platform = $platform_parts[0];
|
$platform = $platform_parts[0];
|
||||||
$serverdata['version'] = $platform_parts[1];
|
$serverdata['version'] = $platform_parts[1];
|
||||||
}
|
}
|
||||||
if (in_array($platform, array_values($dfrn_platforms))) {
|
if (in_array($platform, array_values($grouped_platforms['dfrn_platforms']))) {
|
||||||
$serverdata['network'] = Protocol::DFRN;
|
$serverdata['network'] = Protocol::DFRN;
|
||||||
} elseif (in_array($platform, array_values($ap_platforms))) {
|
} elseif (in_array($platform, array_values($grouped_platforms['ap_platforms']))) {
|
||||||
$serverdata['network'] = Protocol::ACTIVITYPUB;
|
$serverdata['network'] = Protocol::ACTIVITYPUB;
|
||||||
} elseif (in_array($platform, array_values($zap_platforms))) {
|
} elseif (in_array($platform, array_values($grouped_platforms['zap_platforms']))) {
|
||||||
$serverdata['network'] = Protocol::ZOT;
|
$serverdata['network'] = Protocol::ZOT;
|
||||||
}
|
}
|
||||||
if (in_array($platform, array_values($platforms))) {
|
if (in_array($platform, array_values($platforms))) {
|
||||||
|
@ -2414,9 +2417,9 @@ class GServer
|
||||||
$assigned = true;
|
$assigned = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array($attr['content'], array_keys($ap_platforms))) {
|
if (in_array($attr['content'], array_keys($grouped_platforms['ap_platforms']))) {
|
||||||
$serverdata['network'] = Protocol::ACTIVITYPUB;
|
$serverdata['network'] = Protocol::ACTIVITYPUB;
|
||||||
} elseif (in_array($attr['content'], array_values($zap_platforms))) {
|
} elseif (in_array($attr['content'], array_values($grouped_platforms['zap_platforms']))) {
|
||||||
$serverdata['network'] = Protocol::ZOT;
|
$serverdata['network'] = Protocol::ZOT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2492,7 +2495,7 @@ class GServer
|
||||||
*/
|
*/
|
||||||
public static function discover()
|
public static function discover()
|
||||||
{
|
{
|
||||||
if (!DI::config('system', 'discover_servers')) {
|
if (!DI::config()->get('system', 'discover_servers')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -193,6 +193,7 @@ class Item
|
||||||
$fields['vid'] = Verb::getID($fields['verb']);
|
$fields['vid'] = Verb::getID($fields['verb']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$previous = [];
|
||||||
if (!empty($fields['edited'])) {
|
if (!empty($fields['edited'])) {
|
||||||
$previous = Post::selectFirst(['edited'], $condition);
|
$previous = Post::selectFirst(['edited'], $condition);
|
||||||
}
|
}
|
||||||
|
@ -856,6 +857,8 @@ class Item
|
||||||
|
|
||||||
$priority = Worker::PRIORITY_HIGH;
|
$priority = Worker::PRIORITY_HIGH;
|
||||||
|
|
||||||
|
$copy_permissions = false;
|
||||||
|
|
||||||
// If it is a posting where users should get notifications, then define it as wall posting
|
// If it is a posting where users should get notifications, then define it as wall posting
|
||||||
if ($notify) {
|
if ($notify) {
|
||||||
$item = self::prepareOriginPost($item);
|
$item = self::prepareOriginPost($item);
|
||||||
|
@ -3205,7 +3208,7 @@ class Item
|
||||||
} elseif ($remote_user) {
|
} elseif ($remote_user) {
|
||||||
// Authenticated visitor - fetch the matching permissionsets
|
// Authenticated visitor - fetch the matching permissionsets
|
||||||
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
|
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
|
||||||
if (!empty($permissionSets)) {
|
if (count($permissionSets) > 0) {
|
||||||
$condition = [
|
$condition = [
|
||||||
"(`private` != ? OR (`private` = ? AND `wall`
|
"(`private` != ? OR (`private` = ? AND `wall`
|
||||||
AND `psid` IN (" . implode(', ', array_fill(0, count($permissionSets), '?')) . ")))",
|
AND `psid` IN (" . implode(', ', array_fill(0, count($permissionSets), '?')) . ")))",
|
||||||
|
@ -3234,17 +3237,12 @@ class Item
|
||||||
$table = DBA::quoteIdentifier($table) . '.';
|
$table = DBA::quoteIdentifier($table) . '.';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Construct permissions
|
|
||||||
*
|
|
||||||
* default permissions - anonymous user
|
|
||||||
*/
|
|
||||||
$sql = sprintf(" AND " . $table . "`private` != %d", self::PRIVATE);
|
|
||||||
|
|
||||||
// Profile owner - everything is visible
|
// Profile owner - everything is visible
|
||||||
if ($local_user && ($local_user == $owner_id)) {
|
if ($local_user && ($local_user == $owner_id)) {
|
||||||
$sql = '';
|
return '';
|
||||||
} elseif ($remote_user) {
|
}
|
||||||
|
|
||||||
|
if ($remote_user) {
|
||||||
/*
|
/*
|
||||||
* Authenticated visitor. Unless pre-verified,
|
* Authenticated visitor. Unless pre-verified,
|
||||||
* check that the contact belongs to this $owner_id
|
* check that the contact belongs to this $owner_id
|
||||||
|
@ -3254,16 +3252,21 @@ class Item
|
||||||
*/
|
*/
|
||||||
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
|
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
|
||||||
|
|
||||||
if (!empty($permissionSets)) {
|
|
||||||
$sql_set = sprintf(" OR (" . $table . "`private` = %d AND " . $table . "`wall` AND " . $table . "`psid` IN (", self::PRIVATE) . implode(',', $permissionSets->column('id')) . "))";
|
|
||||||
} else {
|
|
||||||
$sql_set = '';
|
$sql_set = '';
|
||||||
|
|
||||||
|
if (count($permissionSets) > 0) {
|
||||||
|
$sql_set = sprintf(" OR (" . $table . "`private` = %d AND " . $table . "`wall` AND " . $table . "`psid` IN (", self::PRIVATE) . implode(',', $permissionSets->column('id')) . "))";
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = sprintf(" AND (" . $table . "`private` != %d", self::PRIVATE) . $sql_set . ")";
|
return sprintf(" AND (" . $table . "`private` != %d", self::PRIVATE) . $sql_set . ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sql;
|
/*
|
||||||
|
* Construct permissions
|
||||||
|
*
|
||||||
|
* default permissions - anonymous user
|
||||||
|
*/
|
||||||
|
return sprintf(" AND " . $table . "`private` != %d", self::PRIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3387,6 +3390,7 @@ class Item
|
||||||
$shared_uri_id = 0;
|
$shared_uri_id = 0;
|
||||||
$shared_links = [];
|
$shared_links = [];
|
||||||
$quote_shared_links = [];
|
$quote_shared_links = [];
|
||||||
|
$shared_item = [];
|
||||||
|
|
||||||
$shared = DI::contentItem()->getSharedPost($item, $fields);
|
$shared = DI::contentItem()->getSharedPost($item, $fields);
|
||||||
if (!empty($shared['post'])) {
|
if (!empty($shared['post'])) {
|
||||||
|
@ -3430,6 +3434,8 @@ class Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$sharedSplitAttachments = [];
|
||||||
|
|
||||||
if (!empty($shared_item['uri-id'])) {
|
if (!empty($shared_item['uri-id'])) {
|
||||||
$shared_uri_id = $shared_item['uri-id'];
|
$shared_uri_id = $shared_item['uri-id'];
|
||||||
$shared_links[] = strtolower($shared_item['plink']);
|
$shared_links[] = strtolower($shared_item['plink']);
|
||||||
|
@ -3503,7 +3509,7 @@ class Item
|
||||||
$s = self::addGallery($s, $sharedSplitAttachments['visual']);
|
$s = self::addGallery($s, $sharedSplitAttachments['visual']);
|
||||||
$s = self::addVisualAttachments($sharedSplitAttachments['visual'], $shared_item, $s, true);
|
$s = self::addVisualAttachments($sharedSplitAttachments['visual'], $shared_item, $s, true);
|
||||||
$s = self::addLinkAttachment($shared_uri_id ?: $item['uri-id'], $sharedSplitAttachments, $body, $s, true, $quote_shared_links);
|
$s = self::addLinkAttachment($shared_uri_id ?: $item['uri-id'], $sharedSplitAttachments, $body, $s, true, $quote_shared_links);
|
||||||
$s = self::addNonVisualAttachments($sharedSplitAttachments['additional'], $item, $s, true);
|
$s = self::addNonVisualAttachments($sharedSplitAttachments['additional'], $item, $s);
|
||||||
$body = BBCode::removeSharedData($body);
|
$body = BBCode::removeSharedData($body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3516,7 +3522,7 @@ class Item
|
||||||
$s = self::addGallery($s, $itemSplitAttachments['visual']);
|
$s = self::addGallery($s, $itemSplitAttachments['visual']);
|
||||||
$s = self::addVisualAttachments($itemSplitAttachments['visual'], $item, $s, false);
|
$s = self::addVisualAttachments($itemSplitAttachments['visual'], $item, $s, false);
|
||||||
$s = self::addLinkAttachment($item['uri-id'], $itemSplitAttachments, $body, $s, false, $shared_links);
|
$s = self::addLinkAttachment($item['uri-id'], $itemSplitAttachments, $body, $s, false, $shared_links);
|
||||||
$s = self::addNonVisualAttachments($itemSplitAttachments['additional'], $item, $s, false);
|
$s = self::addNonVisualAttachments($itemSplitAttachments['additional'], $item, $s);
|
||||||
$s = self::addQuestions($item, $s);
|
$s = self::addQuestions($item, $s);
|
||||||
|
|
||||||
// Map.
|
// Map.
|
||||||
|
|
|
@ -318,6 +318,8 @@ class Engagement
|
||||||
$result = Post::selectPosts(['author-addr', 'author-nick', 'author-contact-type'],
|
$result = Post::selectPosts(['author-addr', 'author-nick', 'author-contact-type'],
|
||||||
['thr-parent-id' => $uri_id, 'gravity' => Item::GRAVITY_ACTIVITY, 'verb' => Activity::ANNOUNCE, 'author-contact-type' => [Contact::TYPE_RELAY, Contact::TYPE_COMMUNITY]]);
|
['thr-parent-id' => $uri_id, 'gravity' => Item::GRAVITY_ACTIVITY, 'verb' => Activity::ANNOUNCE, 'author-contact-type' => [Contact::TYPE_RELAY, Contact::TYPE_COMMUNITY]]);
|
||||||
while ($reshare = Post::fetch($result)) {
|
while ($reshare = Post::fetch($result)) {
|
||||||
|
$prefix = '';
|
||||||
|
|
||||||
switch ($reshare['author-contact-type']) {
|
switch ($reshare['author-contact-type']) {
|
||||||
case Contact::TYPE_RELAY:
|
case Contact::TYPE_RELAY:
|
||||||
$prefix = ' application_';
|
$prefix = ' application_';
|
||||||
|
|
|
@ -113,9 +113,6 @@ class Link
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$curlResult = HTTPSignature::fetchRaw($url, 0, [HttpClientOptions::TIMEOUT => $timeout, HttpClientOptions::ACCEPT_CONTENT => $accept]);
|
$curlResult = HTTPSignature::fetchRaw($url, 0, [HttpClientOptions::TIMEOUT => $timeout, HttpClientOptions::ACCEPT_CONTENT => $accept]);
|
||||||
if (empty($curlResult) || !$curlResult->isSuccess()) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
Logger::notice('Error fetching url', ['url' => $url, 'exception' => $exception]);
|
Logger::notice('Error fetching url', ['url' => $url, 'exception' => $exception]);
|
||||||
return [];
|
return [];
|
||||||
|
|
|
@ -699,7 +699,7 @@ class Media
|
||||||
if (preg_match_all("/\[url\](https?:.*?)\[\/url\]/ism", $body, $matches)) {
|
if (preg_match_all("/\[url\](https?:.*?)\[\/url\]/ism", $body, $matches)) {
|
||||||
foreach ($matches[1] as $url) {
|
foreach ($matches[1] as $url) {
|
||||||
Logger::info('Got page url (link without description)', ['uri-id' => $uriid, 'url' => $url]);
|
Logger::info('Got page url (link without description)', ['uri-id' => $uriid, 'url' => $url]);
|
||||||
$result = self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false, $network);
|
$result = self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false);
|
||||||
if ($result && !in_array($network, [Protocol::ACTIVITYPUB, Protocol::DIASPORA])) {
|
if ($result && !in_array($network, [Protocol::ACTIVITYPUB, Protocol::DIASPORA])) {
|
||||||
self::revertHTMLType($uriid, $url, $fullbody);
|
self::revertHTMLType($uriid, $url, $fullbody);
|
||||||
Logger::debug('Revert HTML type', ['uri-id' => $uriid, 'url' => $url]);
|
Logger::debug('Revert HTML type', ['uri-id' => $uriid, 'url' => $url]);
|
||||||
|
@ -715,7 +715,7 @@ class Media
|
||||||
if (preg_match_all("/\[url\=(https?:.*?)\].*?\[\/url\]/ism", $body, $matches)) {
|
if (preg_match_all("/\[url\=(https?:.*?)\].*?\[\/url\]/ism", $body, $matches)) {
|
||||||
foreach ($matches[1] as $url) {
|
foreach ($matches[1] as $url) {
|
||||||
Logger::info('Got page url (link with description)', ['uri-id' => $uriid, 'url' => $url]);
|
Logger::info('Got page url (link with description)', ['uri-id' => $uriid, 'url' => $url]);
|
||||||
$result = self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false, $network);
|
$result = self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false);
|
||||||
if ($result && !in_array($network, [Protocol::ACTIVITYPUB, Protocol::DIASPORA])) {
|
if ($result && !in_array($network, [Protocol::ACTIVITYPUB, Protocol::DIASPORA])) {
|
||||||
self::revertHTMLType($uriid, $url, $fullbody);
|
self::revertHTMLType($uriid, $url, $fullbody);
|
||||||
Logger::debug('Revert HTML type', ['uri-id' => $uriid, 'url' => $url]);
|
Logger::debug('Revert HTML type', ['uri-id' => $uriid, 'url' => $url]);
|
||||||
|
|
|
@ -49,7 +49,7 @@ class Embed extends BaseAdmin
|
||||||
require_once "view/theme/$theme/config.php";
|
require_once "view/theme/$theme/config.php";
|
||||||
if (function_exists('theme_admin_post')) {
|
if (function_exists('theme_admin_post')) {
|
||||||
self::checkFormSecurityTokenRedirectOnError('/admin/themes/' . $theme . '/embed?mode=minimal', 'admin_theme_settings');
|
self::checkFormSecurityTokenRedirectOnError('/admin/themes/' . $theme . '/embed?mode=minimal', 'admin_theme_settings');
|
||||||
theme_admin_post($this->appHelper);
|
theme_admin_post();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Markers extends BaseApi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($timeline) || empty($last_read_id) || empty($application['id'])) {
|
if ($timeline === '' || $last_read_id === '' || empty($application['id'])) {
|
||||||
$this->logAndJsonError(422, $this->errorFactory->UnprocessableEntity());
|
$this->logAndJsonError(422, $this->errorFactory->UnprocessableEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,12 +28,12 @@ class Show extends ContactEndpoint
|
||||||
$target_cid = BaseApi::getContactIDForSearchterm($this->getRequestValue($request, 'target_screen_name', ''), '', $this->getRequestValue($request, 'target_id', 0), $uid);
|
$target_cid = BaseApi::getContactIDForSearchterm($this->getRequestValue($request, 'target_screen_name', ''), '', $this->getRequestValue($request, 'target_id', 0), $uid);
|
||||||
|
|
||||||
$source = Contact::getById($source_cid);
|
$source = Contact::getById($source_cid);
|
||||||
if (empty($source)) {
|
if ($source === false) {
|
||||||
throw new NotFoundException('Source not found');
|
throw new NotFoundException('Source not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
$target = Contact::getById($target_cid);
|
$target = Contact::getById($target_cid);
|
||||||
if (empty($source)) {
|
if ($target === false) {
|
||||||
throw new NotFoundException('Target not found');
|
throw new NotFoundException('Target not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -511,7 +511,7 @@ class BaseApi extends BaseModule
|
||||||
/**
|
/**
|
||||||
* @param int $errorno
|
* @param int $errorno
|
||||||
* @param Error $error
|
* @param Error $error
|
||||||
* @return void
|
* @return never
|
||||||
* @throws HTTPException\InternalServerErrorException
|
* @throws HTTPException\InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
protected function logAndJsonError(int $errorno, Error $error)
|
protected function logAndJsonError(int $errorno, Error $error)
|
||||||
|
|
|
@ -131,7 +131,7 @@ abstract class BaseNotifications extends BaseModule
|
||||||
|
|
||||||
$notif_tpl = Renderer::getMarkupTemplate('notifications/notifications.tpl');
|
$notif_tpl = Renderer::getMarkupTemplate('notifications/notifications.tpl');
|
||||||
return Renderer::replaceMacros($notif_tpl, [
|
return Renderer::replaceMacros($notif_tpl, [
|
||||||
'$header' => $header ?? $this->t('Notifications'),
|
'$header' => $header ?: $this->t('Notifications'),
|
||||||
'$tabs' => $tabs,
|
'$tabs' => $tabs,
|
||||||
'$notifications' => $notifications,
|
'$notifications' => $notifications,
|
||||||
'$noContent' => $noContent,
|
'$noContent' => $noContent,
|
||||||
|
|
|
@ -140,9 +140,9 @@ class API extends BaseModule
|
||||||
$share = intval($request['share'] ?? 0);
|
$share = intval($request['share'] ?? 0);
|
||||||
$isPreview = intval($request['preview'] ?? 0);
|
$isPreview = intval($request['preview'] ?? 0);
|
||||||
|
|
||||||
$start = DateTimeFormat::convert($strStartDateTime ?? DBA::NULL_DATETIME, 'UTC', $this->timezone);
|
$start = DateTimeFormat::convert($strStartDateTime, 'UTC', $this->timezone);
|
||||||
if (!$noFinish) {
|
if (!$noFinish) {
|
||||||
$finish = DateTimeFormat::convert($strFinishDateTime ?? DBA::NULL_DATETIME, 'UTC', $this->timezone);
|
$finish = DateTimeFormat::convert($strFinishDateTime, 'UTC', $this->timezone);
|
||||||
} else {
|
} else {
|
||||||
$finish = DBA::NULL_DATETIME;
|
$finish = DBA::NULL_DATETIME;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,8 @@ class Circle extends BaseModule
|
||||||
throw new \Exception(DI::l10n()->t('Permission denied.'), 403);
|
throw new \Exception(DI::l10n()->t('Permission denied.'), 403);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$message = '';
|
||||||
|
|
||||||
if (isset($this->parameters['command'])) {
|
if (isset($this->parameters['command'])) {
|
||||||
$circle_id = $this->parameters['circle'];
|
$circle_id = $this->parameters['circle'];
|
||||||
$contact_id = $this->parameters['contact'];
|
$contact_id = $this->parameters['contact'];
|
||||||
|
@ -170,6 +172,8 @@ class Circle extends BaseModule
|
||||||
}
|
}
|
||||||
|
|
||||||
$nocircle = false;
|
$nocircle = false;
|
||||||
|
$members = [];
|
||||||
|
$preselected = [];
|
||||||
|
|
||||||
// @TODO: Replace with parameter from router
|
// @TODO: Replace with parameter from router
|
||||||
if ((DI::args()->getArgc() == 2) && (DI::args()->getArgv()[1] === 'none') ||
|
if ((DI::args()->getArgc() == 2) && (DI::args()->getArgv()[1] === 'none') ||
|
||||||
|
@ -181,9 +185,6 @@ class Circle extends BaseModule
|
||||||
'name' => DI::l10n()->t('Contacts not in any circle'),
|
'name' => DI::l10n()->t('Contacts not in any circle'),
|
||||||
];
|
];
|
||||||
|
|
||||||
$members = [];
|
|
||||||
$preselected = [];
|
|
||||||
|
|
||||||
$context = $context + [
|
$context = $context + [
|
||||||
'$title' => $circle['name'],
|
'$title' => $circle['name'],
|
||||||
'$gname' => ['circle_name', DI::l10n()->t('Circle Name: '), $circle['name'], ''],
|
'$gname' => ['circle_name', DI::l10n()->t('Circle Name: '), $circle['name'], ''],
|
||||||
|
|
|
@ -7,18 +7,19 @@
|
||||||
|
|
||||||
namespace Friendica\Module\Contact;
|
namespace Friendica\Module\Contact;
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App\Arguments;
|
||||||
|
use Friendica\App\BaseURL;
|
||||||
|
use Friendica\App\Page;
|
||||||
use Friendica\BaseModule;
|
use Friendica\BaseModule;
|
||||||
use Friendica\Contact\LocalRelationship\Repository\LocalRelationship;
|
use Friendica\Contact\LocalRelationship\Repository\LocalRelationship;
|
||||||
use Friendica\Content\Conversation;
|
use Friendica\Content\Conversation;
|
||||||
use Friendica\Content\Nav;
|
use Friendica\Content\Nav;
|
||||||
use Friendica\Content\Widget;
|
use Friendica\Content\Widget\VCard;
|
||||||
use Friendica\Core\ACL;
|
use Friendica\Core\ACL;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Core\Session\Capability\IHandleUserSessions;
|
use Friendica\Core\Session\Capability\IHandleUserSessions;
|
||||||
use Friendica\Core\Theme;
|
use Friendica\Core\Theme;
|
||||||
use Friendica\Model;
|
|
||||||
use Friendica\Model\Contact as ModelContact;
|
use Friendica\Model\Contact as ModelContact;
|
||||||
use Friendica\Module\Contact;
|
use Friendica\Module\Contact;
|
||||||
use Friendica\Module\Response;
|
use Friendica\Module\Response;
|
||||||
|
@ -33,7 +34,7 @@ use Psr\Log\LoggerInterface;
|
||||||
class Conversations extends BaseModule
|
class Conversations extends BaseModule
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var App\Page
|
* @var Page
|
||||||
*/
|
*/
|
||||||
private $page;
|
private $page;
|
||||||
/**
|
/**
|
||||||
|
@ -49,7 +50,7 @@ class Conversations extends BaseModule
|
||||||
*/
|
*/
|
||||||
private $userSession;
|
private $userSession;
|
||||||
|
|
||||||
public function __construct(L10n $l10n, LocalRelationship $localRelationship, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, App\Page $page, Conversation $conversation, IHandleUserSessions $userSession, $server, array $parameters = [])
|
public function __construct(L10n $l10n, LocalRelationship $localRelationship, BaseURL $baseUrl, Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, Page $page, Conversation $conversation, IHandleUserSessions $userSession, $server, array $parameters = [])
|
||||||
{
|
{
|
||||||
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
|
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
|
||||||
|
|
||||||
|
@ -67,12 +68,12 @@ class Conversations extends BaseModule
|
||||||
|
|
||||||
// Backward compatibility: Ensure to use the public contact when the user contact is provided
|
// Backward compatibility: Ensure to use the public contact when the user contact is provided
|
||||||
// Remove by version 2022.03
|
// Remove by version 2022.03
|
||||||
$pcid = Model\Contact::getPublicContactId(intval($this->parameters['id']), $this->userSession->getLocalUserId());
|
$pcid = ModelContact::getPublicContactId(intval($this->parameters['id']), $this->userSession->getLocalUserId());
|
||||||
if (!$pcid) {
|
if (!$pcid) {
|
||||||
throw new NotFoundException($this->t('Contact not found.'));
|
throw new NotFoundException($this->t('Contact not found.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$contact = Model\Contact::getAccountById($pcid);
|
$contact = ModelContact::getAccountById($pcid);
|
||||||
if (empty($contact)) {
|
if (empty($contact)) {
|
||||||
throw new NotFoundException($this->t('Contact not found.'));
|
throw new NotFoundException($this->t('Contact not found.'));
|
||||||
}
|
}
|
||||||
|
@ -83,7 +84,7 @@ class Conversations extends BaseModule
|
||||||
}
|
}
|
||||||
|
|
||||||
$localRelationship = $this->localRelationship->getForUserContact($this->userSession->getLocalUserId(), $contact['id']);
|
$localRelationship = $this->localRelationship->getForUserContact($this->userSession->getLocalUserId(), $contact['id']);
|
||||||
if ($localRelationship->rel === Model\Contact::SELF) {
|
if ($localRelationship->rel === ModelContact::SELF) {
|
||||||
$this->baseUrl->redirect('profile/' . $contact['nick']);
|
$this->baseUrl->redirect('profile/' . $contact['nick']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,10 +94,12 @@ class Conversations extends BaseModule
|
||||||
$this->page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css'));
|
$this->page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css'));
|
||||||
$this->page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css'));
|
$this->page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css'));
|
||||||
|
|
||||||
$this->page['aside'] .= Widget\VCard::getHTML($contact, true);
|
$this->page['aside'] .= VCard::getHTML($contact, true);
|
||||||
|
|
||||||
Nav::setSelected('contact');
|
Nav::setSelected('contact');
|
||||||
|
|
||||||
|
$output = '';
|
||||||
|
|
||||||
if (!$contact['ap-posting-restricted']) {
|
if (!$contact['ap-posting-restricted']) {
|
||||||
$options = [
|
$options = [
|
||||||
'lockstate' => ACL::getLockstateForUserId($this->userSession->getLocalUserId()) ? 'lock' : 'unlock',
|
'lockstate' => ACL::getLockstateForUserId($this->userSession->getLocalUserId()) ? 'lock' : 'unlock',
|
||||||
|
@ -104,12 +107,12 @@ class Conversations extends BaseModule
|
||||||
'bang' => '',
|
'bang' => '',
|
||||||
'content' => ($contact['contact-type'] == ModelContact::TYPE_COMMUNITY ? '!' : '@') . ($contact['addr'] ?: $contact['url']),
|
'content' => ($contact['contact-type'] == ModelContact::TYPE_COMMUNITY ? '!' : '@') . ($contact['addr'] ?: $contact['url']),
|
||||||
];
|
];
|
||||||
$o = $this->conversation->statusEditor($options);
|
$output = $this->conversation->statusEditor($options);
|
||||||
}
|
}
|
||||||
|
|
||||||
$o .= Contact::getTabsHTML($contact, Contact::TAB_CONVERSATIONS);
|
$output .= Contact::getTabsHTML($contact, Contact::TAB_CONVERSATIONS);
|
||||||
$o .= Model\Contact::getThreadsFromId($contact['id'], $this->userSession->getLocalUserId(), 0, 0, $request['last_created'] ?? '');
|
$output .= ModelContact::getThreadsFromId($contact['id'], $this->userSession->getLocalUserId(), 0, 0, $request['last_created'] ?? '');
|
||||||
|
|
||||||
return $o;
|
return $output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
|
|
||||||
namespace Friendica\Module\Conversation;
|
namespace Friendica\Module\Conversation;
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App\Arguments;
|
||||||
|
use Friendica\App\BaseURL;
|
||||||
use Friendica\App\Mode;
|
use Friendica\App\Mode;
|
||||||
use Friendica\BaseModule;
|
use Friendica\BaseModule;
|
||||||
use Friendica\Content\Conversation\Collection\Timelines;
|
use Friendica\Content\Conversation\Collection\Timelines;
|
||||||
|
@ -31,6 +32,8 @@ use Friendica\Model\Post;
|
||||||
use Friendica\Model\Post\Engagement;
|
use Friendica\Model\Post\Engagement;
|
||||||
use Friendica\Model\Post\SearchIndex;
|
use Friendica\Model\Post\SearchIndex;
|
||||||
use Friendica\Module\Response;
|
use Friendica\Module\Response;
|
||||||
|
use Friendica\Network\HTTPException\BadRequestException;
|
||||||
|
use Friendica\Network\HTTPException\ForbiddenException;
|
||||||
use Friendica\Protocol\Activity;
|
use Friendica\Protocol\Activity;
|
||||||
use Friendica\Util\DateTimeFormat;
|
use Friendica\Util\DateTimeFormat;
|
||||||
use Friendica\Util\Profiler;
|
use Friendica\Util\Profiler;
|
||||||
|
@ -67,7 +70,7 @@ class Timeline extends BaseModule
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $network;
|
protected $network;
|
||||||
|
|
||||||
/** @var App\Mode $mode */
|
/** @var Mode $mode */
|
||||||
protected $mode;
|
protected $mode;
|
||||||
/** @var IHandleUserSessions */
|
/** @var IHandleUserSessions */
|
||||||
protected $session;
|
protected $session;
|
||||||
|
@ -82,7 +85,7 @@ class Timeline extends BaseModule
|
||||||
/** @var UserDefinedChannel */
|
/** @var UserDefinedChannel */
|
||||||
protected $channelRepository;
|
protected $channelRepository;
|
||||||
|
|
||||||
public function __construct(UserDefinedChannel $channel, Mode $mode, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server = [], array $parameters = [])
|
public function __construct(UserDefinedChannel $channel, Mode $mode, IHandleUserSessions $session, Database $database, IManagePersonalConfigValues $pConfig, IManageConfigValues $config, ICanCache $cache, L10n $l10n, BaseURL $baseUrl, Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server = [], array $parameters = [])
|
||||||
{
|
{
|
||||||
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
|
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
|
||||||
|
|
||||||
|
@ -98,8 +101,8 @@ class Timeline extends BaseModule
|
||||||
/**
|
/**
|
||||||
* Computes module parameters from the request and local configuration
|
* Computes module parameters from the request and local configuration
|
||||||
*
|
*
|
||||||
* @throws HTTPException\BadRequestException
|
* @throws BadRequestException
|
||||||
* @throws HTTPException\ForbiddenException
|
* @throws ForbiddenException
|
||||||
*/
|
*/
|
||||||
protected function parseRequest(array $request)
|
protected function parseRequest(array $request)
|
||||||
{
|
{
|
||||||
|
@ -308,6 +311,8 @@ class Timeline extends BaseModule
|
||||||
{
|
{
|
||||||
$table = 'post-engagement';
|
$table = 'post-engagement';
|
||||||
|
|
||||||
|
$condition = [];
|
||||||
|
|
||||||
if ($this->selectedTab == ChannelEntity::WHATSHOT) {
|
if ($this->selectedTab == ChannelEntity::WHATSHOT) {
|
||||||
if (!is_null($this->accountType)) {
|
if (!is_null($this->accountType)) {
|
||||||
$condition = ["(`comments` > ? OR `activities` > ?) AND `contact-type` = ?", $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), $this->accountType];
|
$condition = ["(`comments` > ? OR `activities` > ?) AND `contact-type` = ?", $this->getMedianComments($uid, 4), $this->getMedianActivities($uid, 4), $this->accountType];
|
||||||
|
@ -684,6 +689,7 @@ class Timeline extends BaseModule
|
||||||
protected function getCommunityItems()
|
protected function getCommunityItems()
|
||||||
{
|
{
|
||||||
$items = $this->selectItems();
|
$items = $this->selectItems();
|
||||||
|
$key = '';
|
||||||
|
|
||||||
if ($this->selectedTab == Community::LOCAL) {
|
if ($this->selectedTab == Community::LOCAL) {
|
||||||
$maxpostperauthor = (int)$this->config->get('system', 'max_author_posts_community_page');
|
$maxpostperauthor = (int)$this->config->get('system', 'max_author_posts_community_page');
|
||||||
|
@ -692,9 +698,15 @@ class Timeline extends BaseModule
|
||||||
$maxpostperauthor = (int)$this->config->get('system', 'max_server_posts_community_page');
|
$maxpostperauthor = (int)$this->config->get('system', 'max_server_posts_community_page');
|
||||||
$key = 'author-gsid';
|
$key = 'author-gsid';
|
||||||
} else {
|
} else {
|
||||||
$maxpostperauthor = 0;
|
$this->setItemsSeenByCondition([
|
||||||
|
'unseen' => true,
|
||||||
|
'uid' => $this->session->getLocalUserId(),
|
||||||
|
'parent-uri-id' => array_column($items, 'uri-id')
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $items;
|
||||||
}
|
}
|
||||||
if ($maxpostperauthor != 0) {
|
|
||||||
$count = 1;
|
$count = 1;
|
||||||
$author_posts = [];
|
$author_posts = [];
|
||||||
$selected_items = [];
|
$selected_items = [];
|
||||||
|
@ -733,9 +745,6 @@ class Timeline extends BaseModule
|
||||||
$items = $this->selectItems();
|
$items = $this->selectItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$selected_items = $items;
|
|
||||||
}
|
|
||||||
|
|
||||||
$condition = ['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($selected_items, 'uri-id')];
|
$condition = ['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($selected_items, 'uri-id')];
|
||||||
$this->setItemsSeenByCondition($condition);
|
$this->setItemsSeenByCondition($condition);
|
||||||
|
|
|
@ -37,26 +37,13 @@ class PageNotFound extends BaseModule
|
||||||
|
|
||||||
public function run(ModuleHTTPException $httpException, array $request = []): ResponseInterface
|
public function run(ModuleHTTPException $httpException, array $request = []): ResponseInterface
|
||||||
{
|
{
|
||||||
/* The URL provided does not resolve to a valid module.
|
// The URL provided does not resolve to a valid module.
|
||||||
*
|
|
||||||
* On Dreamhost sites, quite often things go wrong for no apparent reason and they send us to '/internal_error.html'.
|
|
||||||
* We don't like doing this, but as it occasionally accounts for 10-20% or more of all site traffic -
|
|
||||||
* we are going to trap this and redirect back to the requested page. As long as you don't have a critical error on your page
|
|
||||||
* this will often succeed and eventually do the right thing.
|
|
||||||
*
|
|
||||||
* Otherwise we are going to emit a 404 not found.
|
|
||||||
*/
|
|
||||||
$queryString = $this->server['QUERY_STRING'];
|
$queryString = $this->server['QUERY_STRING'];
|
||||||
// Stupid browser tried to pre-fetch our JavaScript img template. Don't log the event or return anything - just quietly exit.
|
// Stupid browser tried to pre-fetch our JavaScript img template. Don't log the event or return anything - just quietly exit.
|
||||||
if (!empty($queryString) && preg_match('/{[0-9]}/', $queryString) !== 0) {
|
if (!empty($queryString) && preg_match('/{[0-9]}/', $queryString) !== 0) {
|
||||||
System::exit();
|
System::exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($queryString) && ($queryString === 'q=internal_error.html') && isset($dreamhost_error_hack)) {
|
|
||||||
$this->logger->info('index.php: dreamhost_error_hack invoked.', ['Original URI' => $this->server['REQUEST_URI']]);
|
|
||||||
$this->baseUrl->redirect($this->server['REQUEST_URI']);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->logger->debug('index.php: page not found.', [
|
$this->logger->debug('index.php: page not found.', [
|
||||||
'request_uri' => $this->server['REQUEST_URI'],
|
'request_uri' => $this->server['REQUEST_URI'],
|
||||||
'address' => $this->remoteAddress,
|
'address' => $this->remoteAddress,
|
||||||
|
|
|
@ -166,12 +166,13 @@ class Display extends BaseModule
|
||||||
*/
|
*/
|
||||||
protected function displaySidebar(array $item)
|
protected function displaySidebar(array $item)
|
||||||
{
|
{
|
||||||
|
$author = [];
|
||||||
$shared = $this->contentItem->getSharedPost($item, ['author-link']);
|
$shared = $this->contentItem->getSharedPost($item, ['author-link']);
|
||||||
if (!empty($shared) && empty($shared['comment'])) {
|
if (array_key_exists('comment', $shared) && strval($shared['comment']) === '') {
|
||||||
$author = Contact::getByURLForUser($shared['post']['author-link'], $this->session->getLocalUserId());
|
$author = Contact::getByURLForUser($shared['post']['author-link'], $this->session->getLocalUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($contact)) {
|
if ($author === []) {
|
||||||
$author = Contact::getById($item['author-id']);
|
$author = Contact::getById($item['author-id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,31 +65,26 @@ class Magic extends BaseModule
|
||||||
|
|
||||||
$this->logger->debug('Invoked', ['request' => $request]);
|
$this->logger->debug('Invoked', ['request' => $request]);
|
||||||
|
|
||||||
$addr = $request['addr'] ?? '';
|
$addr = (string) $request['addr'] ?? '';
|
||||||
$bdest = $request['bdest'] ?? '';
|
$bdest = (string) $request['bdest'] ?? '';
|
||||||
$dest = $request['dest'] ?? '';
|
$dest = (string) $request['dest'] ?? '';
|
||||||
$rev = intval($request['rev'] ?? 0);
|
|
||||||
$owa = intval($request['owa'] ?? 0);
|
$owa = intval($request['owa'] ?? 0);
|
||||||
$delegate = $request['delegate'] ?? '';
|
|
||||||
|
|
||||||
// bdest is preferred as it is hex-encoded and can survive url rewrite and argument parsing
|
// bdest is preferred as it is hex-encoded and can survive url rewrite and argument parsing
|
||||||
if (!empty($bdest)) {
|
if ($bdest !== '') {
|
||||||
$dest = hex2bin($bdest);
|
$dest = hex2bin($bdest);
|
||||||
$this->logger->debug('bdest detected', ['dest' => $dest]);
|
$this->logger->debug('bdest detected', ['dest' => $dest]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$target = $dest ?: $addr;
|
$target = $dest ?: $addr;
|
||||||
|
|
||||||
if ($addr ?: $dest) {
|
|
||||||
$contact = Contact::getByURL($addr ?: $dest);
|
$contact = Contact::getByURL($addr ?: $dest);
|
||||||
}
|
if ($contact === [] && $owa === 0) {
|
||||||
|
|
||||||
if (empty($contact)) {
|
|
||||||
if (!$owa) {
|
|
||||||
$this->logger->info('No contact record found, no oWA, redirecting to destination.', ['request' => $request, 'server' => $_SERVER, 'dest' => $dest]);
|
$this->logger->info('No contact record found, no oWA, redirecting to destination.', ['request' => $request, 'server' => $_SERVER, 'dest' => $dest]);
|
||||||
$this->appHelper->redirect($dest);
|
$this->appHelper->redirect($dest);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
|
if ($contact !== []) {
|
||||||
// Redirect if the contact is already authenticated on this site.
|
// Redirect if the contact is already authenticated on this site.
|
||||||
if ($this->appHelper->getContactId() && strpos($contact['nurl'], Strings::normaliseLink($this->baseUrl)) !== false) {
|
if ($this->appHelper->getContactId() && strpos($contact['nurl'], Strings::normaliseLink($this->baseUrl)) !== false) {
|
||||||
$this->logger->info('Contact is already authenticated, redirecting to destination.', ['dest' => $dest]);
|
$this->logger->info('Contact is already authenticated, redirecting to destination.', ['dest' => $dest]);
|
||||||
|
@ -99,7 +94,7 @@ class Magic extends BaseModule
|
||||||
$this->logger->debug('Contact found', ['url' => $contact['url']]);
|
$this->logger->debug('Contact found', ['url' => $contact['url']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->userSession->getLocalUserId() || !$owa) {
|
if (!$this->userSession->getLocalUserId() || $owa === 0) {
|
||||||
$this->logger->notice('Not logged in or not OWA, redirecting to destination.', ['uid' => $this->userSession->getLocalUserId(), 'owa' => $owa, 'dest' => $dest]);
|
$this->logger->notice('Not logged in or not OWA, redirecting to destination.', ['uid' => $this->userSession->getLocalUserId(), 'owa' => $owa, 'dest' => $dest]);
|
||||||
$this->appHelper->redirect($dest);
|
$this->appHelper->redirect($dest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,15 +48,18 @@ class Active extends BaseUsers
|
||||||
{
|
{
|
||||||
parent::content();
|
parent::content();
|
||||||
|
|
||||||
$action = $this->parameters['action'] ?? '';
|
$action = (string) $this->parameters['action'] ?? '';
|
||||||
$uid = $this->parameters['uid'] ?? 0;
|
$uid = (int) $this->parameters['uid'] ?? 0;
|
||||||
|
|
||||||
if ($uid) {
|
if ($uid === 0) {
|
||||||
$user = User::getById($uid, ['username', 'blocked']);
|
|
||||||
if (!$user) {
|
|
||||||
$this->systemMessages->addNotice($this->t('User not found'));
|
$this->systemMessages->addNotice($this->t('User not found'));
|
||||||
$this->baseUrl->redirect('moderation/users');
|
$this->baseUrl->redirect('moderation/users');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$user = User::getById($uid, ['username', 'blocked']);
|
||||||
|
if (!is_array($user)) {
|
||||||
|
$this->systemMessages->addNotice($this->t('User not found'));
|
||||||
|
$this->baseUrl->redirect('moderation/users');
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ($action) {
|
switch ($action) {
|
||||||
|
|
|
@ -48,15 +48,18 @@ class Blocked extends BaseUsers
|
||||||
{
|
{
|
||||||
parent::content();
|
parent::content();
|
||||||
|
|
||||||
$action = $this->parameters['action'] ?? '';
|
$action = (string) $this->parameters['action'] ?? '';
|
||||||
$uid = $this->parameters['uid'] ?? 0;
|
$uid = (int) $this->parameters['uid'] ?? 0;
|
||||||
|
|
||||||
if ($uid) {
|
if ($uid === 0) {
|
||||||
$user = User::getById($uid, ['username', 'blocked']);
|
|
||||||
if (!$user) {
|
|
||||||
$this->systemMessages->addNotice($this->t('User not found'));
|
$this->systemMessages->addNotice($this->t('User not found'));
|
||||||
$this->baseUrl->redirect('moderation/users');
|
$this->baseUrl->redirect('moderation/users');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$user = User::getById($uid, ['username', 'blocked']);
|
||||||
|
if (!is_array($user)) {
|
||||||
|
$this->systemMessages->addNotice($this->t('User not found'));
|
||||||
|
$this->baseUrl->redirect('moderation/users');
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ($action) {
|
switch ($action) {
|
||||||
|
|
|
@ -55,15 +55,18 @@ class Index extends BaseUsers
|
||||||
{
|
{
|
||||||
parent::content();
|
parent::content();
|
||||||
|
|
||||||
$action = $this->parameters['action'] ?? '';
|
$action = (string) $this->parameters['action'] ?? '';
|
||||||
$uid = $this->parameters['uid'] ?? 0;
|
$uid = (int) $this->parameters['uid'] ?? 0;
|
||||||
|
|
||||||
if ($uid) {
|
if ($uid === 0) {
|
||||||
$user = User::getById($uid, ['username', 'blocked']);
|
|
||||||
if (!$user) {
|
|
||||||
$this->systemMessages->addNotice($this->t('User not found'));
|
$this->systemMessages->addNotice($this->t('User not found'));
|
||||||
$this->baseUrl->redirect('moderation/users');
|
$this->baseUrl->redirect('moderation/users');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$user = User::getById($uid, ['username', 'blocked']);
|
||||||
|
if (!is_array($user)) {
|
||||||
|
$this->systemMessages->addNotice($this->t('User not found'));
|
||||||
|
$this->baseUrl->redirect('moderation/users');
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ($action) {
|
switch ($action) {
|
||||||
|
|
|
@ -66,12 +66,30 @@ class Token extends BaseApi
|
||||||
$this->logAndJsonError(401, $this->errorFactory->Unauthorized('invalid_client', $this->t('Invalid data or unknown client')));
|
$this->logAndJsonError(401, $this->errorFactory->Unauthorized('invalid_client', $this->t('Invalid data or unknown client')));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request['grant_type'] == 'client_credentials') {
|
$grant_type = (string) $request['grant_type'];
|
||||||
|
|
||||||
|
if (!in_array($grant_type, ['client_credentials', 'authorization_code'])) {
|
||||||
|
Logger::warning('Unsupported or missing grant type', ['request' => $_REQUEST]);
|
||||||
|
$this->logAndJsonError(422, $this->errorFactory->UnprocessableEntity($this->t('Unsupported or missing grant type')));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($grant_type === 'client_credentials') {
|
||||||
// the "client_credentials" are used as a token for the application itself.
|
// the "client_credentials" are used as a token for the application itself.
|
||||||
// see https://aaronparecki.com/oauth-2-simplified/#client-credentials
|
// see https://aaronparecki.com/oauth-2-simplified/#client-credentials
|
||||||
$token = OAuth::createTokenForUser($application, 0, '');
|
$token = OAuth::createTokenForUser($application, 0, '');
|
||||||
$me = null;
|
|
||||||
} elseif ($request['grant_type'] == 'authorization_code') {
|
$object = new \Friendica\Object\Api\Mastodon\Token(
|
||||||
|
$token['access_token'],
|
||||||
|
'Bearer',
|
||||||
|
$application['scopes'],
|
||||||
|
$token['created_at'],
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->jsonExit($object->toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check for $grant_type === 'authorization_code'
|
||||||
// For security reasons only allow freshly created tokens
|
// For security reasons only allow freshly created tokens
|
||||||
$redirect_uri = strtok($request['redirect_uri'],'?');
|
$redirect_uri = strtok($request['redirect_uri'],'?');
|
||||||
$condition = [
|
$condition = [
|
||||||
|
@ -84,14 +102,16 @@ class Token extends BaseApi
|
||||||
$this->logger->notice('Token not found or outdated', $condition);
|
$this->logger->notice('Token not found or outdated', $condition);
|
||||||
$this->logAndJsonError(401, $this->errorFactory->Unauthorized());
|
$this->logAndJsonError(401, $this->errorFactory->Unauthorized());
|
||||||
}
|
}
|
||||||
$owner = User::getOwnerDataById($token['uid']);
|
|
||||||
$me = $owner['url'];
|
|
||||||
} else {
|
|
||||||
Logger::warning('Unsupported or missing grant type', ['request' => $_REQUEST]);
|
|
||||||
$this->logAndJsonError(422, $this->errorFactory->UnprocessableEntity($this->t('Unsupported or missing grant type')));
|
|
||||||
}
|
|
||||||
|
|
||||||
$object = new \Friendica\Object\Api\Mastodon\Token($token['access_token'], 'Bearer', $application['scopes'], $token['created_at'], $me);
|
$owner = User::getOwnerDataById($token['uid']);
|
||||||
|
|
||||||
|
$object = new \Friendica\Object\Api\Mastodon\Token(
|
||||||
|
$token['access_token'],
|
||||||
|
'Bearer',
|
||||||
|
$application['scopes'],
|
||||||
|
$token['created_at'],
|
||||||
|
$owner['url']
|
||||||
|
);
|
||||||
|
|
||||||
$this->jsonExit($object->toArray());
|
$this->jsonExit($object->toArray());
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,6 +143,8 @@ class Photo extends BaseApi
|
||||||
$cacheable = ($photo['allow_cid'] . $photo['allow_gid'] . $photo['deny_cid'] . $photo['deny_gid'] === '') && (isset($photo['cacheable']) ? $photo['cacheable'] : true);
|
$cacheable = ($photo['allow_cid'] . $photo['allow_gid'] . $photo['deny_cid'] . $photo['deny_gid'] === '') && (isset($photo['cacheable']) ? $photo['cacheable'] : true);
|
||||||
|
|
||||||
$stamp = microtime(true);
|
$stamp = microtime(true);
|
||||||
|
$imgdata = '';
|
||||||
|
$mimetype = false;
|
||||||
|
|
||||||
if (empty($request['blur']) || empty($photo['blurhash'])) {
|
if (empty($request['blur']) || empty($photo['blurhash'])) {
|
||||||
$imgdata = MPhoto::getImageDataForPhoto($photo);
|
$imgdata = MPhoto::getImageDataForPhoto($photo);
|
||||||
|
@ -150,7 +152,9 @@ class Photo extends BaseApi
|
||||||
}
|
}
|
||||||
if (empty($imgdata) && empty($photo['blurhash'])) {
|
if (empty($imgdata) && empty($photo['blurhash'])) {
|
||||||
throw new HTTPException\NotFoundException();
|
throw new HTTPException\NotFoundException();
|
||||||
} elseif (empty($imgdata) && !empty($photo['blurhash'])) {
|
}
|
||||||
|
|
||||||
|
if (empty($imgdata) && !empty($photo['blurhash'])) {
|
||||||
$image = new Image('', image_type_to_mime_type(IMAGETYPE_WEBP));
|
$image = new Image('', image_type_to_mime_type(IMAGETYPE_WEBP));
|
||||||
$image->getFromBlurHash($photo['blurhash'], $photo['width'], $photo['height']);
|
$image->getFromBlurHash($photo['blurhash'], $photo['width'], $photo['height']);
|
||||||
$imgdata = $image->asString();
|
$imgdata = $image->asString();
|
||||||
|
@ -376,6 +380,9 @@ class Photo extends BaseApi
|
||||||
Logger::debug('Expected Content-Type', ['mime' => $mimetext, 'url' => $url]);
|
Logger::debug('Expected Content-Type', ['mime' => $mimetext, 'url' => $url]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$url = '';
|
||||||
|
|
||||||
if (empty($mimetext) && !empty($contact['blurhash'])) {
|
if (empty($mimetext) && !empty($contact['blurhash'])) {
|
||||||
$image = new Image('', image_type_to_mime_type(IMAGETYPE_WEBP));
|
$image = new Image('', image_type_to_mime_type(IMAGETYPE_WEBP));
|
||||||
$image->getFromBlurHash($contact['blurhash'], $customsize, $customsize);
|
$image->getFromBlurHash($contact['blurhash'], $customsize, $customsize);
|
||||||
|
|
|
@ -77,11 +77,12 @@ class Remove extends \Friendica\BaseModule
|
||||||
|
|
||||||
$tag_text = Tag::getCSVByURIId($item['uri-id']);
|
$tag_text = Tag::getCSVByURIId($item['uri-id']);
|
||||||
|
|
||||||
$tags = explode(',', $tag_text);
|
if ($tag_text === '') {
|
||||||
if (empty($tags)) {
|
|
||||||
$this->baseUrl->redirect($returnUrl);
|
$this->baseUrl->redirect($returnUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$tags = explode(',', $tag_text);
|
||||||
|
|
||||||
$tag_checkboxes = array_map(function ($tag_text) {
|
$tag_checkboxes = array_map(function ($tag_text) {
|
||||||
return ['tag[' . bin2hex($tag_text) . ']', BBCode::toPlaintext($tag_text)];
|
return ['tag[' . bin2hex($tag_text) . ']', BBCode::toPlaintext($tag_text)];
|
||||||
}, $tags);
|
}, $tags);
|
||||||
|
|
|
@ -128,6 +128,10 @@ class Photos extends \Friendica\Module\BaseProfile
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = ['src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''];
|
$ret = ['src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''];
|
||||||
|
$src = null;
|
||||||
|
$filename = '';
|
||||||
|
$filesize = 0;
|
||||||
|
$type = '';
|
||||||
|
|
||||||
Hook::callAll('photo_post_file', $ret);
|
Hook::callAll('photo_post_file', $ret);
|
||||||
|
|
||||||
|
@ -167,7 +171,11 @@ class Photos extends \Friendica\Module\BaseProfile
|
||||||
$this->systemMessages->addNotice($this->t('Server can\'t accept new file upload at this time, please contact your administrator'));
|
$this->systemMessages->addNotice($this->t('Server can\'t accept new file upload at this time, please contact your administrator'));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($src !== null) {
|
||||||
@unlink($src);
|
@unlink($src);
|
||||||
|
}
|
||||||
|
|
||||||
$foo = 0;
|
$foo = 0;
|
||||||
Hook::callAll('photo_post_end', $foo);
|
Hook::callAll('photo_post_end', $foo);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -96,7 +96,7 @@ class Trust extends BaseModule
|
||||||
// exception wanted!
|
// exception wanted!
|
||||||
throw $e;
|
throw $e;
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$this->logger->warning('Unexpected error during authentication.', ['user' => $this->session->getLocalUserId(), 'exception' => $exception]);
|
$this->logger->warning('Unexpected error during authentication.', ['user' => $this->session->getLocalUserId(), 'exception' => $e]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,6 @@ class Crop extends BaseSettings
|
||||||
$base_image = Photo::selectFirst([], ['resource-id' => $resource_id, 'uid' => DI::userSession()->getLocalUserId(), 'scale' => $scale]);
|
$base_image = Photo::selectFirst([], ['resource-id' => $resource_id, 'uid' => DI::userSession()->getLocalUserId(), 'scale' => $scale]);
|
||||||
if (DBA::isResult($base_image)) {
|
if (DBA::isResult($base_image)) {
|
||||||
$Image = Photo::getImageForPhoto($base_image);
|
$Image = Photo::getImageForPhoto($base_image);
|
||||||
if (empty($Image)) {
|
|
||||||
throw new HTTPException\InternalServerErrorException();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Image->isValid()) {
|
if ($Image->isValid()) {
|
||||||
// If setting for the default profile, unset the profile photo flag from any other photos I own
|
// If setting for the default profile, unset the profile photo flag from any other photos I own
|
||||||
|
@ -185,7 +182,7 @@ class Crop extends BaseSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
$Image = Photo::getImageForPhoto($photos[0]);
|
$Image = Photo::getImageForPhoto($photos[0]);
|
||||||
if (empty($Image)) {
|
if (!$Image->isValid()) {
|
||||||
throw new HTTPException\InternalServerErrorException();
|
throw new HTTPException\InternalServerErrorException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,8 +92,6 @@ class RemoveMe extends BaseSettings
|
||||||
$this->baseUrl->redirect();
|
$this->baseUrl->redirect();
|
||||||
} catch (\RuntimeException $e) {
|
} catch (\RuntimeException $e) {
|
||||||
$this->systemMessages->addNotice($e->getMessage());
|
$this->systemMessages->addNotice($e->getMessage());
|
||||||
} finally {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,8 @@ class Xrd extends BaseModule
|
||||||
|
|
||||||
header('Vary: Accept', false);
|
header('Vary: Accept', false);
|
||||||
|
|
||||||
|
$alias = '';
|
||||||
|
|
||||||
if ($name == User::getActorName()) {
|
if ($name == User::getActorName()) {
|
||||||
$owner = User::getSystemAccount();
|
$owner = User::getSystemAccount();
|
||||||
if (empty($owner)) {
|
if (empty($owner)) {
|
||||||
|
@ -108,7 +110,7 @@ class Xrd extends BaseModule
|
||||||
$parts[] = current(explode(';', $part));
|
$parts[] = current(explode(';', $part));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($parts)) {
|
if ($parts === []) {
|
||||||
return $default;
|
return $default;
|
||||||
} elseif (in_array('application/jrd+json', $parts) && !in_array('application/xrd+xml', $parts)) {
|
} elseif (in_array('application/jrd+json', $parts) && !in_array('application/xrd+xml', $parts)) {
|
||||||
return Response::TYPE_JSON;
|
return Response::TYPE_JSON;
|
||||||
|
|
|
@ -41,13 +41,13 @@ class FormattedNotify extends BaseDataTransferObject
|
||||||
|
|
||||||
public function __construct(string $label, string $link, string $image, string $url, string $text, string $when, string $ago, bool $seen)
|
public function __construct(string $label, string $link, string $image, string $url, string $text, string $when, string $ago, bool $seen)
|
||||||
{
|
{
|
||||||
$this->label = $label ?? '';
|
$this->label = $label;
|
||||||
$this->link = $link ?? '';
|
$this->link = $link;
|
||||||
$this->image = $image ?? '';
|
$this->image = $image;
|
||||||
$this->url = $url ?? '';
|
$this->url = $url;
|
||||||
$this->text = $text ?? '';
|
$this->text = $text;
|
||||||
$this->when = $when ?? '';
|
$this->when = $when;
|
||||||
$this->ago = $ago ?? '';
|
$this->ago = $ago;
|
||||||
$this->seen = $seen ?? false;
|
$this->seen = $seen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,14 +220,16 @@ class Probe
|
||||||
Logger::notice('Got exception', ['code' => $th->getCode(), 'message' => $th->getMessage()]);
|
Logger::notice('Got exception', ['code' => $th->getCode(), 'message' => $th->getMessage()]);
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
|
$ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
|
||||||
|
|
||||||
|
$host_url = $host;
|
||||||
|
|
||||||
if ($curlResult->isSuccess()) {
|
if ($curlResult->isSuccess()) {
|
||||||
$xml = $curlResult->getBodyString();
|
$xml = $curlResult->getBodyString();
|
||||||
$xrd = XML::parseString($xml, true);
|
$xrd = XML::parseString($xml, true);
|
||||||
if (!empty($url)) {
|
if (!empty($url)) {
|
||||||
$host_url = 'https://' . $host;
|
$host_url = 'https://' . $host;
|
||||||
} else {
|
|
||||||
$host_url = $host;
|
|
||||||
}
|
}
|
||||||
} elseif ($curlResult->isTimeout()) {
|
} elseif ($curlResult->isTimeout()) {
|
||||||
Logger::info('Probing timeout', ['url' => $ssl_url]);
|
Logger::info('Probing timeout', ['url' => $ssl_url]);
|
||||||
|
@ -550,6 +552,7 @@ class Probe
|
||||||
public static function getWebfingerArray(string $uri): array
|
public static function getWebfingerArray(string $uri): array
|
||||||
{
|
{
|
||||||
$parts = parse_url($uri);
|
$parts = parse_url($uri);
|
||||||
|
$lrdd = [];
|
||||||
|
|
||||||
if (!empty($parts['scheme']) && !empty($parts['host'])) {
|
if (!empty($parts['scheme']) && !empty($parts['host'])) {
|
||||||
$host = $parts['host'];
|
$host = $parts['host'];
|
||||||
|
@ -562,8 +565,11 @@ class Probe
|
||||||
$nick = '';
|
$nick = '';
|
||||||
$addr = '';
|
$addr = '';
|
||||||
|
|
||||||
$path_parts = explode('/', trim($parts['path'] ?? '', '/'));
|
$path_parts = [];
|
||||||
if (!empty($path_parts)) {
|
|
||||||
|
if (array_key_exists('path', $parts) && trim(strval($parts['path']), '/') !== '') {
|
||||||
|
$path_parts = explode('/', trim($parts['path'], '/'));
|
||||||
|
|
||||||
$nick = ltrim(end($path_parts), '@');
|
$nick = ltrim(end($path_parts), '@');
|
||||||
$addr = $nick . '@' . $host;
|
$addr = $nick . '@' . $host;
|
||||||
}
|
}
|
||||||
|
@ -574,7 +580,7 @@ class Probe
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($webfinger) && empty($lrdd)) {
|
if (empty($webfinger) && empty($lrdd)) {
|
||||||
while (empty($lrdd) && empty($webfinger) && (sizeof($path_parts) > 1)) {
|
while (empty($lrdd) && empty($webfinger) && (count($path_parts) > 1)) {
|
||||||
$host .= '/' . array_shift($path_parts);
|
$host .= '/' . array_shift($path_parts);
|
||||||
$baseurl = $parts['scheme'] . '://' . $host;
|
$baseurl = $parts['scheme'] . '://' . $host;
|
||||||
|
|
||||||
|
@ -668,8 +674,10 @@ class Probe
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$detected = '';
|
||||||
|
|
||||||
// First try the address because this is the primary purpose of webfinger
|
// First try the address because this is the primary purpose of webfinger
|
||||||
if (!empty($addr)) {
|
if ($addr !== '') {
|
||||||
$detected = $addr;
|
$detected = $addr;
|
||||||
$path = str_replace('{uri}', urlencode('acct:' . $addr), $template);
|
$path = str_replace('{uri}', urlencode('acct:' . $addr), $template);
|
||||||
$webfinger = self::webfinger($path, $type);
|
$webfinger = self::webfinger($path, $type);
|
||||||
|
@ -823,13 +831,15 @@ class Probe
|
||||||
*/
|
*/
|
||||||
private static function zot(array $webfinger, array $data): array
|
private static function zot(array $webfinger, array $data): array
|
||||||
{
|
{
|
||||||
|
$zot_url = '';
|
||||||
|
|
||||||
foreach ($webfinger['links'] as $link) {
|
foreach ($webfinger['links'] as $link) {
|
||||||
if (($link['rel'] == 'http://purl.org/zot/protocol/6.0') && !empty($link['href'])) {
|
if (($link['rel'] == 'http://purl.org/zot/protocol/6.0') && !empty($link['href'])) {
|
||||||
$zot_url = $link['href'];
|
$zot_url = $link['href'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($zot_url)) {
|
if ($zot_url === '') {
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1429,7 +1439,7 @@ class Probe
|
||||||
&& !empty($data['guid'])
|
&& !empty($data['guid'])
|
||||||
&& !empty($data['baseurl'])
|
&& !empty($data['baseurl'])
|
||||||
&& !empty($data['pubkey'])
|
&& !empty($data['pubkey'])
|
||||||
&& !empty($hcard_url)
|
&& $hcard_url !== ''
|
||||||
) {
|
) {
|
||||||
$data['network'] = Protocol::DIASPORA;
|
$data['network'] = Protocol::DIASPORA;
|
||||||
$data['manually-approve'] = false;
|
$data['manually-approve'] = false;
|
||||||
|
@ -1776,7 +1786,7 @@ class Probe
|
||||||
$password = '';
|
$password = '';
|
||||||
openssl_private_decrypt(hex2bin($mailacct['pass']), $password, $user['prvkey']);
|
openssl_private_decrypt(hex2bin($mailacct['pass']), $password, $user['prvkey']);
|
||||||
$mbox = Email::connect($mailbox, $mailacct['user'], $password);
|
$mbox = Email::connect($mailbox, $mailacct['user'], $password);
|
||||||
if (!$mbox) {
|
if ($mbox === false) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1828,7 +1838,7 @@ class Probe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($mbox)) {
|
if ($mbox !== false) {
|
||||||
imap_close($mbox);
|
imap_close($mbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ class User extends BaseDataTransferObject
|
||||||
protected $default_profile;
|
protected $default_profile;
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
protected $default_profile_image;
|
protected $default_profile_image;
|
||||||
/** @var Status */
|
/** @var array */
|
||||||
protected $status;
|
protected $status;
|
||||||
/** @var array */
|
/** @var array */
|
||||||
protected $withheld_in_countries;
|
protected $withheld_in_countries;
|
||||||
|
@ -117,12 +117,11 @@ class User extends BaseDataTransferObject
|
||||||
* @param array $publicContact Full contact table record with uid = 0
|
* @param array $publicContact Full contact table record with uid = 0
|
||||||
* @param array $apcontact Optional full apcontact table record
|
* @param array $apcontact Optional full apcontact table record
|
||||||
* @param array $userContact Optional full contact table record with uid != 0
|
* @param array $userContact Optional full contact table record with uid != 0
|
||||||
* @param null $status
|
|
||||||
* @param bool $include_user_entities Whether to add the entities property
|
* @param bool $include_user_entities Whether to add the entities property
|
||||||
*
|
*
|
||||||
* @throws InternalServerErrorException
|
* @throws InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
public function __construct(array $publicContact, array $apcontact = [], array $userContact = [], $status = null, bool $include_user_entities = true)
|
public function __construct(array $publicContact, array $apcontact = [], array $userContact = [], ?Status $status = null, bool $include_user_entities = true)
|
||||||
{
|
{
|
||||||
$uid = $userContact['uid'] ?? 0;
|
$uid = $userContact['uid'] ?? 0;
|
||||||
|
|
||||||
|
@ -156,10 +155,10 @@ class User extends BaseDataTransferObject
|
||||||
$this->default_profile = false;
|
$this->default_profile = false;
|
||||||
$this->default_profile_image = false;
|
$this->default_profile_image = false;
|
||||||
|
|
||||||
if (!empty($status)) {
|
if ($status === null) {
|
||||||
$this->status = $status;
|
|
||||||
} else {
|
|
||||||
unset($this->status);
|
unset($this->status);
|
||||||
|
} else {
|
||||||
|
$this->status = $status->toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unused optional fields
|
// Unused optional fields
|
||||||
|
|
|
@ -771,7 +771,7 @@ class Image
|
||||||
public function getBlurHash(): string
|
public function getBlurHash(): string
|
||||||
{
|
{
|
||||||
$image = New Image($this->asString(), $this->getType(), $this->filename, false);
|
$image = New Image($this->asString(), $this->getType(), $this->filename, false);
|
||||||
if (empty($image) || !$this->isValid()) {
|
if (!$this->isValid()) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,6 +827,7 @@ class Image
|
||||||
{
|
{
|
||||||
$scaled = Images::getScalingDimensions($width, $height, 90);
|
$scaled = Images::getScalingDimensions($width, $height, 90);
|
||||||
$pixels = Blurhash::decode($blurhash, $scaled['width'], $scaled['height']);
|
$pixels = Blurhash::decode($blurhash, $scaled['width'], $scaled['height']);
|
||||||
|
$draw = null;
|
||||||
|
|
||||||
if ($this->isImagick()) {
|
if ($this->isImagick()) {
|
||||||
$this->image = new Imagick();
|
$this->image = new Imagick();
|
||||||
|
@ -839,7 +840,7 @@ class Image
|
||||||
for ($y = 0; $y < $scaled['height']; ++$y) {
|
for ($y = 0; $y < $scaled['height']; ++$y) {
|
||||||
for ($x = 0; $x < $scaled['width']; ++$x) {
|
for ($x = 0; $x < $scaled['width']; ++$x) {
|
||||||
[$r, $g, $b] = $pixels[$y][$x];
|
[$r, $g, $b] = $pixels[$y][$x];
|
||||||
if ($this->isImagick()) {
|
if ($draw !== null) {
|
||||||
$draw->setFillColor("rgb($r, $g, $b)");
|
$draw->setFillColor("rgb($r, $g, $b)");
|
||||||
$draw->point($x, $y);
|
$draw->point($x, $y);
|
||||||
} else {
|
} else {
|
||||||
|
@ -848,7 +849,7 @@ class Image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->isImagick()) {
|
if ($draw !== null) {
|
||||||
$this->image->drawImage($draw);
|
$this->image->drawImage($draw);
|
||||||
$this->width = $this->image->getImageWidth();
|
$this->width = $this->image->getImageWidth();
|
||||||
$this->height = $this->image->getImageHeight();
|
$this->height = $this->image->getImageHeight();
|
||||||
|
|
|
@ -323,7 +323,7 @@ class ClientToServer
|
||||||
$requester_id = Contact::getIdForURL($requester, $owner['uid']);
|
$requester_id = Contact::getIdForURL($requester, $owner['uid']);
|
||||||
if (!empty($requester_id)) {
|
if (!empty($requester_id)) {
|
||||||
$permissionSets = DI::permissionSet()->selectByContactId($requester_id, $owner['uid']);
|
$permissionSets = DI::permissionSet()->selectByContactId($requester_id, $owner['uid']);
|
||||||
if (!empty($permissionSets)) {
|
if (count($permissionSets) > 0) {
|
||||||
$condition = ['psid' => array_merge($permissionSets->column('id'),
|
$condition = ['psid' => array_merge($permissionSets->column('id'),
|
||||||
[DI::permissionSet()->selectPublicForUser($owner['uid'])])];
|
[DI::permissionSet()->selectPublicForUser($owner['uid'])])];
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ class Delivery
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
if (!$serverfail) {
|
if (!$serverfail) {
|
||||||
$result = self::deliverToInbox($post['command'], 0, $inbox, $owner, $post['receivers'], $post['uri-id']);
|
$result = self::deliverToInbox($post['command'], 0, $inbox, $owner, $post['receivers'], $post['uri-id']);
|
||||||
|
|
||||||
|
@ -121,11 +123,12 @@ class Delivery
|
||||||
$serverfail = $response->isTimeout();
|
$serverfail = $response->isTimeout();
|
||||||
} catch (\Throwable $th) {
|
} catch (\Throwable $th) {
|
||||||
Logger::notice('Got exception', ['code' => $th->getCode(), 'message' => $th->getMessage()]);
|
Logger::notice('Got exception', ['code' => $th->getCode(), 'message' => $th->getMessage()]);
|
||||||
|
$response = null;
|
||||||
$success = false;
|
$success = false;
|
||||||
$serverfail = true;
|
$serverfail = true;
|
||||||
}
|
}
|
||||||
$runtime = microtime(true) - $timestamp;
|
$runtime = microtime(true) - $timestamp;
|
||||||
if (!$success) {
|
if ($success === false) {
|
||||||
// 5xx errors are problems on the server. We don't need to continue delivery then.
|
// 5xx errors are problems on the server. We don't need to continue delivery then.
|
||||||
if (!$serverfail && ($response->getReturnCode() >= 500) && ($response->getReturnCode() <= 599)) {
|
if (!$serverfail && ($response->getReturnCode() >= 500) && ($response->getReturnCode() <= 599)) {
|
||||||
$serverfail = true;
|
$serverfail = true;
|
||||||
|
|
|
@ -1361,6 +1361,7 @@ class Processor
|
||||||
}
|
}
|
||||||
|
|
||||||
$hash = substr($tag['name'], 0, 1);
|
$hash = substr($tag['name'], 0, 1);
|
||||||
|
$type = 0;
|
||||||
|
|
||||||
if ($tag['type'] == 'Mention') {
|
if ($tag['type'] == 'Mention') {
|
||||||
if (in_array($hash, [Tag::TAG_CHARACTER[Tag::MENTION],
|
if (in_array($hash, [Tag::TAG_CHARACTER[Tag::MENTION],
|
||||||
|
@ -1616,7 +1617,7 @@ class Processor
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self::isValidObject($object, $url)) {
|
if (!self::isValidObject($object)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1657,10 +1658,6 @@ class Processor
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($curlResult)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$body = $curlResult->getBodyString();
|
$body = $curlResult->getBodyString();
|
||||||
if (!$curlResult->isSuccess() || empty($body)) {
|
if (!$curlResult->isSuccess() || empty($body)) {
|
||||||
if (in_array($curlResult->getReturnCode(), [403, 404, 406, 410])) {
|
if (in_array($curlResult->getReturnCode(), [403, 404, 406, 410])) {
|
||||||
|
@ -1680,7 +1677,7 @@ class Processor
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self::isValidObject($object, $url)) {
|
if (!self::isValidObject($object)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1829,6 +1826,8 @@ class Processor
|
||||||
Logger::notice('Fetch replies - start', ['replies' => $url, 'callstack' => $child['callstack'], 'system' => $callstack]);
|
Logger::notice('Fetch replies - start', ['replies' => $url, 'callstack' => $child['callstack'], 'system' => $callstack]);
|
||||||
$fetched = 0;
|
$fetched = 0;
|
||||||
foreach ($replies as $reply) {
|
foreach ($replies as $reply) {
|
||||||
|
$id = '';
|
||||||
|
|
||||||
if (is_array($reply)) {
|
if (is_array($reply)) {
|
||||||
$ldobject = JsonLD::compact($reply);
|
$ldobject = JsonLD::compact($reply);
|
||||||
$id = JsonLD::fetchElement($ldobject, '@id');
|
$id = JsonLD::fetchElement($ldobject, '@id');
|
||||||
|
@ -2120,9 +2119,8 @@ class Processor
|
||||||
self::transmitPendingEvents($cid, $owner['uid']);
|
self::transmitPendingEvents($cid, $owner['uid']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($contact)) {
|
|
||||||
Contact::update(['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]);
|
Contact::update(['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]);
|
||||||
}
|
|
||||||
Logger::notice('Follow user ' . $uid . ' from contact ' . $cid . ' with id ' . $activity['id']);
|
Logger::notice('Follow user ' . $uid . ' from contact ' . $cid . ' with id ' . $activity['id']);
|
||||||
Queue::remove($activity);
|
Queue::remove($activity);
|
||||||
}
|
}
|
||||||
|
@ -2334,9 +2332,10 @@ class Processor
|
||||||
*/
|
*/
|
||||||
public static function acceptFollowUser(array $activity)
|
public static function acceptFollowUser(array $activity)
|
||||||
{
|
{
|
||||||
|
$check_id = false;
|
||||||
|
|
||||||
if (!empty($activity['object_actor'])) {
|
if (!empty($activity['object_actor'])) {
|
||||||
$uid = User::getIdForURL($activity['object_actor']);
|
$uid = User::getIdForURL($activity['object_actor']);
|
||||||
$check_id = false;
|
|
||||||
} elseif (!empty($activity['receiver']) && (count($activity['receiver']) == 1)) {
|
} elseif (!empty($activity['receiver']) && (count($activity['receiver']) == 1)) {
|
||||||
$uid = array_shift($activity['receiver']);
|
$uid = array_shift($activity['receiver']);
|
||||||
$check_id = true;
|
$check_id = true;
|
||||||
|
|
|
@ -414,7 +414,7 @@ class Queue
|
||||||
{
|
{
|
||||||
$entries = DBA::select('inbox-entry', ['id'], ["NOT `trust` AND `wid` IS NULL"], ['order' => ['id' => true]]);
|
$entries = DBA::select('inbox-entry', ['id'], ["NOT `trust` AND `wid` IS NULL"], ['order' => ['id' => true]]);
|
||||||
while ($entry = DBA::fetch($entries)) {
|
while ($entry = DBA::fetch($entries)) {
|
||||||
$data = self::reprepareActivityById($entry['id'], false);
|
$data = self::reprepareActivityById($entry['id']);
|
||||||
if ($data['trust']) {
|
if ($data['trust']) {
|
||||||
DBA::update('inbox-entry', ['trust' => true], ['id' => $entry['id']]);
|
DBA::update('inbox-entry', ['trust' => true], ['id' => $entry['id']]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,6 +307,7 @@ class Receiver
|
||||||
$id = JsonLD::fetchElement($activity, '@id');
|
$id = JsonLD::fetchElement($activity, '@id');
|
||||||
$type = JsonLD::fetchElement($activity, '@type');
|
$type = JsonLD::fetchElement($activity, '@type');
|
||||||
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
|
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
|
||||||
|
$object_type = '';
|
||||||
|
|
||||||
if (!empty($object_id) && in_array($type, ['as:Create', 'as:Update'])) {
|
if (!empty($object_id) && in_array($type, ['as:Create', 'as:Update'])) {
|
||||||
$fetch_id = $object_id;
|
$fetch_id = $object_id;
|
||||||
|
@ -618,7 +619,7 @@ class Receiver
|
||||||
}
|
}
|
||||||
|
|
||||||
$actor = JsonLD::fetchElement($activity, 'as:actor', '@id');
|
$actor = JsonLD::fetchElement($activity, 'as:actor', '@id');
|
||||||
if (empty($actor)) {
|
if ($actor === null || $actor === '') {
|
||||||
Logger::info('Empty actor', ['activity' => $activity]);
|
Logger::info('Empty actor', ['activity' => $activity]);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -630,7 +631,7 @@ class Receiver
|
||||||
$id = JsonLD::fetchElement($activity, '@id');
|
$id = JsonLD::fetchElement($activity, '@id');
|
||||||
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
|
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
|
||||||
|
|
||||||
if (!empty($published) && !empty($object_id) && in_array($type, ['as:Create', 'as:Update']) && in_array($object_type, self::CONTENT_TYPES)
|
if (!empty($published) && $object_id !== null && in_array($type, ['as:Create', 'as:Update']) && in_array($object_type, self::CONTENT_TYPES)
|
||||||
&& ($push || ($completion != self::COMPLETION_MANUAL)) && DI::contentItem()->isTooOld($published) && !Post::exists(['uri' => $object_id])) {
|
&& ($push || ($completion != self::COMPLETION_MANUAL)) && DI::contentItem()->isTooOld($published) && !Post::exists(['uri' => $object_id])) {
|
||||||
Logger::debug('Activity is too old. It will not be processed', ['push' => $push, 'completion' => $completion, 'type' => $type, 'object-type' => $object_type, 'published' => $published, 'id' => $id, 'object-id' => $object_id]);
|
Logger::debug('Activity is too old. It will not be processed', ['push' => $push, 'completion' => $completion, 'type' => $type, 'object-type' => $object_type, 'published' => $published, 'id' => $id, 'object-id' => $object_id]);
|
||||||
return true;
|
return true;
|
||||||
|
@ -641,7 +642,7 @@ class Receiver
|
||||||
|
|
||||||
// Test the provided signatures against the actor and "attributedTo"
|
// Test the provided signatures against the actor and "attributedTo"
|
||||||
if ($trust_source) {
|
if ($trust_source) {
|
||||||
if (!empty($attributed_to) && !empty($actor)) {
|
if ($attributed_to !== false && $attributed_to !== '') {
|
||||||
$trust_source = (in_array($actor, $signer) && in_array($attributed_to, $signer));
|
$trust_source = (in_array($actor, $signer) && in_array($attributed_to, $signer));
|
||||||
} else {
|
} else {
|
||||||
$trust_source = in_array($actor, $signer);
|
$trust_source = in_array($actor, $signer);
|
||||||
|
@ -1185,6 +1186,8 @@ class Receiver
|
||||||
}
|
}
|
||||||
|
|
||||||
$parent_followers = '';
|
$parent_followers = '';
|
||||||
|
$parent_profile = [];
|
||||||
|
|
||||||
$parent = Post::selectFirstPost(['parent-author-link'], ['uri' => $reply]);
|
$parent = Post::selectFirstPost(['parent-author-link'], ['uri' => $reply]);
|
||||||
if (!empty($parent['parent-author-link'])) {
|
if (!empty($parent['parent-author-link'])) {
|
||||||
$parent_profile = APContact::getByURL($parent['parent-author-link']);
|
$parent_profile = APContact::getByURL($parent['parent-author-link']);
|
||||||
|
|
|
@ -573,11 +573,12 @@ class Transmitter
|
||||||
$exclusive = false;
|
$exclusive = false;
|
||||||
$mention = false;
|
$mention = false;
|
||||||
$audience = [];
|
$audience = [];
|
||||||
|
$owner = false;
|
||||||
|
|
||||||
// Check if we should always deliver our stuff via BCC
|
// Check if we should always deliver our stuff via BCC
|
||||||
if (!empty($item['uid'])) {
|
if (!empty($item['uid'])) {
|
||||||
$owner = User::getOwnerDataById($item['uid']);
|
$owner = User::getOwnerDataById($item['uid']);
|
||||||
if (!empty($owner)) {
|
if (is_array($owner)) {
|
||||||
$always_bcc = $owner['hide-friends'];
|
$always_bcc = $owner['hide-friends'];
|
||||||
$is_group = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
|
$is_group = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
|
||||||
|
|
||||||
|
@ -1399,7 +1400,7 @@ class Transmitter
|
||||||
$type = self::getTypeOfItem($item);
|
$type = self::getTypeOfItem($item);
|
||||||
|
|
||||||
if (!$object_mode) {
|
if (!$object_mode) {
|
||||||
$data = ['@context' => $context ?? ActivityPub::CONTEXT];
|
$data = ['@context' => ActivityPub::CONTEXT];
|
||||||
|
|
||||||
if ($item['deleted'] && ($item['gravity'] == Item::GRAVITY_ACTIVITY)) {
|
if ($item['deleted'] && ($item['gravity'] == Item::GRAVITY_ACTIVITY)) {
|
||||||
$type = 'Undo';
|
$type = 'Undo';
|
||||||
|
@ -1750,6 +1751,7 @@ class Transmitter
|
||||||
|
|
||||||
$title = $item['title'];
|
$title = $item['title'];
|
||||||
$summary = $item['content-warning'] ?: BBCode::toPlaintext(BBCode::getAbstract($item['body'], Protocol::ACTIVITYPUB));
|
$summary = $item['content-warning'] ?: BBCode::toPlaintext(BBCode::getAbstract($item['body'], Protocol::ACTIVITYPUB));
|
||||||
|
$type = '';
|
||||||
|
|
||||||
if ($item['event-type'] == 'event') {
|
if ($item['event-type'] == 'event') {
|
||||||
$type = 'Event';
|
$type = 'Event';
|
||||||
|
|
|
@ -12,7 +12,6 @@ use Friendica\Contact\FriendSuggest\Exception\FriendSuggestNotFoundException;
|
||||||
use Friendica\Core\Logger;
|
use Friendica\Core\Logger;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Core\Worker;
|
use Friendica\Core\Worker;
|
||||||
use Friendica\Database\Database;
|
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
|
@ -48,6 +47,8 @@ class Delivery
|
||||||
$top_level = false;
|
$top_level = false;
|
||||||
$followup = false;
|
$followup = false;
|
||||||
$public_message = false;
|
$public_message = false;
|
||||||
|
$parent = false;
|
||||||
|
$thr_parent = false;
|
||||||
|
|
||||||
$items = [];
|
$items = [];
|
||||||
if ($cmd == self::MAIL) {
|
if ($cmd == self::MAIL) {
|
||||||
|
|
|
@ -623,22 +623,21 @@ class Diaspora
|
||||||
*/
|
*/
|
||||||
private static function validPosting(array $msg)
|
private static function validPosting(array $msg)
|
||||||
{
|
{
|
||||||
$data = XML::parseString($msg['message']);
|
$element = XML::parseString($msg['message']);
|
||||||
|
|
||||||
if (!is_object($data)) {
|
if (!is_object($element)) {
|
||||||
Logger::info('No valid XML', ['message' => $msg['message']]);
|
Logger::info('No valid XML', ['message' => $msg['message']]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$oldXML = false;
|
||||||
|
|
||||||
// Is this the new or the old version?
|
// Is this the new or the old version?
|
||||||
if ($data->getName() == 'XML') {
|
if ($element->getName() === 'XML') {
|
||||||
$oldXML = true;
|
$oldXML = true;
|
||||||
foreach ($data->post->children() as $child) {
|
foreach ($element->post->children() as $child) {
|
||||||
$element = $child;
|
$element = $child;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$oldXML = false;
|
|
||||||
$element = $data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$type = $element->getName();
|
$type = $element->getName();
|
||||||
|
@ -1460,7 +1459,7 @@ class Diaspora
|
||||||
*/
|
*/
|
||||||
|
|
||||||
foreach ($matches as $match) {
|
foreach ($matches as $match) {
|
||||||
if (empty($match)) {
|
if ($match === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3030,7 +3029,7 @@ class Diaspora
|
||||||
// The "addr" field should always be filled.
|
// The "addr" field should always be filled.
|
||||||
// If this isn't the case, it will raise a notice some lines later.
|
// If this isn't the case, it will raise a notice some lines later.
|
||||||
// And in the log we will see where it came from, and we can handle it there.
|
// And in the log we will see where it came from, and we can handle it there.
|
||||||
Logger::notice('Empty addr', ['contact' => $contact ?? []]);
|
Logger::notice('Empty addr', ['contact' => $contact]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $pubkey ?? '', $public_batch);
|
$envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $pubkey ?? '', $public_batch);
|
||||||
|
@ -3655,6 +3654,8 @@ class Diaspora
|
||||||
*/
|
*/
|
||||||
public static function sendFollowup(array $item, array $owner, array $contact, bool $public_batch = false): int
|
public static function sendFollowup(array $item, array $owner, array $contact, bool $public_batch = false): int
|
||||||
{
|
{
|
||||||
|
$type = '';
|
||||||
|
|
||||||
if (in_array($item['verb'], [Activity::ATTEND, Activity::ATTENDNO, Activity::ATTENDMAYBE])) {
|
if (in_array($item['verb'], [Activity::ATTEND, Activity::ATTENDNO, Activity::ATTENDMAYBE])) {
|
||||||
$message = self::constructAttend($item, $owner);
|
$message = self::constructAttend($item, $owner);
|
||||||
$type = 'event_participation';
|
$type = 'event_participation';
|
||||||
|
|
|
@ -25,7 +25,7 @@ class Email
|
||||||
* @param string $mailbox The mailbox name
|
* @param string $mailbox The mailbox name
|
||||||
* @param string $username The username
|
* @param string $username The username
|
||||||
* @param string $password The password
|
* @param string $password The password
|
||||||
* @return Connection|resource|bool
|
* @return Connection|false
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function connect(string $mailbox, string $username, string $password)
|
public static function connect(string $mailbox, string $username, string $password)
|
||||||
|
|
|
@ -736,7 +736,7 @@ class Feed
|
||||||
$publish_at = date(DateTimeFormat::MYSQL, $publish_time);
|
$publish_at = date(DateTimeFormat::MYSQL, $publish_time);
|
||||||
|
|
||||||
if (Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], Post\Delayed::PREPARED, $publish_at, $posting['taglist'], $posting['attachments'])) {
|
if (Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], Post\Delayed::PREPARED, $publish_at, $posting['taglist'], $posting['attachments'])) {
|
||||||
DI::pConfig()->set($item['uid'], 'system', 'last_publish', $publish_time);
|
DI::pConfig()->set($posting['item']['uid'], 'system', 'last_publish', $publish_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1407,7 +1407,7 @@ class Feed
|
||||||
|
|
||||||
$contact = Contact::getByURL($item['author-link']) ?: $owner;
|
$contact = Contact::getByURL($item['author-link']) ?: $owner;
|
||||||
$contact['nickname'] = $contact['nickname'] ?? $contact['nick'];
|
$contact['nickname'] = $contact['nickname'] ?? $contact['nick'];
|
||||||
$author = self::addAuthor($doc, $contact, false);
|
$author = self::addAuthor($doc, $contact);
|
||||||
$entry->appendChild($author);
|
$entry->appendChild($author);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -109,9 +109,9 @@ class NotifyMailBuilder extends MailBuilder
|
||||||
public function withPhoto(string $image, string $link, string $name)
|
public function withPhoto(string $image, string $link, string $name)
|
||||||
{
|
{
|
||||||
$this->photo = [
|
$this->photo = [
|
||||||
'image' => $image ?? '',
|
'image' => $image,
|
||||||
'link' => $link ?? '',
|
'link' => $link,
|
||||||
'name' => $name ?? '',
|
'name' => $name,
|
||||||
];
|
];
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
|
|
@ -480,10 +480,6 @@ class HTTPSignature
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($curlResult)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
|
if (!$curlResult->isSuccess() || empty($curlResult->getBodyString())) {
|
||||||
Logger::debug('Fetching was unsuccessful', ['url' => $request, 'return-code' => $curlResult->getReturnCode(), 'error-number' => $curlResult->getErrorNumber(), 'error' => $curlResult->getError()]);
|
Logger::debug('Fetching was unsuccessful', ['url' => $request, 'return-code' => $curlResult->getReturnCode(), 'error-number' => $curlResult->getErrorNumber(), 'error' => $curlResult->getError()]);
|
||||||
return [];
|
return [];
|
||||||
|
|
|
@ -308,13 +308,13 @@ class Images
|
||||||
|
|
||||||
$data = DI::cache()->get($cacheKey);
|
$data = DI::cache()->get($cacheKey);
|
||||||
|
|
||||||
if (empty($data) || !is_array($data)) {
|
if (!is_array($data)) {
|
||||||
$data = self::getInfoFromURL($url, $ocr);
|
$data = self::getInfoFromURL($url, $ocr);
|
||||||
|
|
||||||
DI::cache()->set($cacheKey, $data);
|
DI::cache()->set($cacheKey, $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $data ?? [];
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -286,7 +286,7 @@ class JsonLD
|
||||||
* @param $type
|
* @param $type
|
||||||
* @param $type_value
|
* @param $type_value
|
||||||
*
|
*
|
||||||
* @return string fetched element
|
* @return string|null fetched element
|
||||||
*/
|
*/
|
||||||
public static function fetchElement($array, $element, $key = '@id', $type = null, $type_value = null)
|
public static function fetchElement($array, $element, $key = '@id', $type = null, $type_value = null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1087,7 +1087,7 @@ class ParseUrl
|
||||||
$content = JsonLD::fetchElement($jsonld, 'logo', 'url', '@type', 'ImageObject');
|
$content = JsonLD::fetchElement($jsonld, 'logo', 'url', '@type', 'ImageObject');
|
||||||
if (!empty($content) && is_string($content)) {
|
if (!empty($content) && is_string($content)) {
|
||||||
$jsonldinfo['publisher_img'] = trim($content);
|
$jsonldinfo['publisher_img'] = trim($content);
|
||||||
} elseif (!empty($content) && is_array($content)) {
|
} elseif (is_array($content) && array_key_exists(0, $content)) {
|
||||||
$jsonldinfo['publisher_img'] = trim($content[0]);
|
$jsonldinfo['publisher_img'] = trim($content[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -220,7 +220,7 @@ class OnePoll
|
||||||
|
|
||||||
Logger::info('Mail is enabled');
|
Logger::info('Mail is enabled');
|
||||||
|
|
||||||
$mbox = null;
|
$mbox = false;
|
||||||
$user = DBA::selectFirst('user', ['prvkey'], ['uid' => $importer_uid]);
|
$user = DBA::selectFirst('user', ['prvkey'], ['uid' => $importer_uid]);
|
||||||
|
|
||||||
$condition = ["`server` != ? AND `user` != ? AND `port` != ? AND `uid` = ?", '', '', 0, $importer_uid];
|
$condition = ["`server` != ? AND `user` != ? AND `port` != ? AND `uid` = ?", '', '', 0, $importer_uid];
|
||||||
|
@ -232,17 +232,18 @@ class OnePoll
|
||||||
$mbox = Email::connect($mailbox, $mailconf['user'], $password);
|
$mbox = Email::connect($mailbox, $mailconf['user'], $password);
|
||||||
unset($password);
|
unset($password);
|
||||||
Logger::notice('Connect', ['user' => $mailconf['user']]);
|
Logger::notice('Connect', ['user' => $mailconf['user']]);
|
||||||
if ($mbox) {
|
|
||||||
$fields = ['last_check' => $updated];
|
if ($mbox === false) {
|
||||||
DBA::update('mailacct', $fields, ['id' => $mailconf['id']]);
|
|
||||||
Logger::notice('Connected', ['user' => $mailconf['user']]);
|
|
||||||
} else {
|
|
||||||
Logger::notice('Connection error', ['user' => $mailconf['user'], 'error' => imap_errors()]);
|
Logger::notice('Connection error', ['user' => $mailconf['user'], 'error' => imap_errors()]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$fields = ['last_check' => $updated];
|
||||||
|
DBA::update('mailacct', $fields, ['id' => $mailconf['id']]);
|
||||||
|
Logger::notice('Connected', ['user' => $mailconf['user']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($mbox)) {
|
if ($mbox === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,3 +129,10 @@ $zap_platforms = [
|
||||||
'hubzilla' => 'hubzilla',
|
'hubzilla' => 'hubzilla',
|
||||||
'osada' => 'osada',
|
'osada' => 'osada',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
return [
|
||||||
|
'ap_platforms' => $ap_platforms,
|
||||||
|
'dfrn_platforms' => $dfrn_platforms,
|
||||||
|
'zap_platforms' => $zap_platforms,
|
||||||
|
'platforms' => $platforms,
|
||||||
|
];
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
namespace Friendica\Test\src\Content;
|
namespace Friendica\Test\src\Content\Text;
|
||||||
|
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Content\Text\Plaintext;
|
use Friendica\Content\Text\Plaintext;
|
||||||
|
@ -32,6 +32,7 @@ class PlaintextTest extends FixtureTest
|
||||||
'Ich ignoriere auch Anfragen, wenn sie von Accounts kommen, die ggf. tausenden von anderen Accounts folgen, da ich davon ausgehe, (5/6)',
|
'Ich ignoriere auch Anfragen, wenn sie von Accounts kommen, die ggf. tausenden von anderen Accounts folgen, da ich davon ausgehe, (5/6)',
|
||||||
'dass da niemand ernsthaft so vielen Accounts folgen kann. (6/6)'
|
'dass da niemand ernsthaft so vielen Accounts folgen kann. (6/6)'
|
||||||
],
|
],
|
||||||
|
],
|
||||||
'test-2' => [
|
'test-2' => [
|
||||||
'data' => 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
|
'data' => 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
|
||||||
'expected' => [
|
'expected' => [
|
||||||
|
@ -42,7 +43,6 @@ class PlaintextTest extends FixtureTest
|
||||||
'sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. (5/6)',
|
'sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. (5/6)',
|
||||||
'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. (6/6)'
|
'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. (6/6)'
|
||||||
],
|
],
|
||||||
]
|
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
|
@ -42,7 +42,7 @@ function theme_admin(AppHelper $appHelper)
|
||||||
return clean_form($appHelper, $colorset, $user);
|
return clean_form($appHelper, $colorset, $user);
|
||||||
}
|
}
|
||||||
|
|
||||||
function theme_admin_post(AppHelper $appHelper)
|
function theme_admin_post()
|
||||||
{
|
{
|
||||||
if (isset($_POST['duepuntozero-settings-submit'])) {
|
if (isset($_POST['duepuntozero-settings-submit'])) {
|
||||||
DI::config()->set('duepuntozero', 'colorset', $_POST['duepuntozero_colorset']);
|
DI::config()->set('duepuntozero', 'colorset', $_POST['duepuntozero_colorset']);
|
||||||
|
|
|
@ -92,7 +92,7 @@ function theme_admin_post()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function theme_content(): string
|
function theme_content(AppHelper $appHelper): string
|
||||||
{
|
{
|
||||||
if (!DI::userSession()->getLocalUserId()) {
|
if (!DI::userSession()->getLocalUserId()) {
|
||||||
return '';
|
return '';
|
||||||
|
@ -115,7 +115,7 @@ function theme_content(): string
|
||||||
return frio_form($arr);
|
return frio_form($arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
function theme_admin(): string
|
function theme_admin(AppHelper $appHelper): string
|
||||||
{
|
{
|
||||||
if (!DI::userSession()->getLocalUserId()) {
|
if (!DI::userSession()->getLocalUserId()) {
|
||||||
return '';
|
return '';
|
||||||
|
|
|
@ -46,7 +46,7 @@ function theme_admin(AppHelper $appHelper) {
|
||||||
return quattro_form($appHelper,$align, $color, $tfs, $pfs);
|
return quattro_form($appHelper,$align, $color, $tfs, $pfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
function theme_admin_post(AppHelper $appHelper) {
|
function theme_admin_post() {
|
||||||
if (isset($_POST['quattro-settings-submit'])){
|
if (isset($_POST['quattro-settings-submit'])){
|
||||||
DI::config()->set('quattro', 'align', $_POST['quattro_align']);
|
DI::config()->set('quattro', 'align', $_POST['quattro_align']);
|
||||||
DI::config()->set('quattro', 'color', $_POST['quattro_color']);
|
DI::config()->set('quattro', 'color', $_POST['quattro_color']);
|
||||||
|
|
|
@ -91,7 +91,7 @@ function theme_admin(AppHelper $appHelper) {
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
function theme_admin_post(AppHelper $appHelper) {
|
function theme_admin_post() {
|
||||||
if (isset($_POST['vier-settings-submit'])){
|
if (isset($_POST['vier-settings-submit'])){
|
||||||
DI::config()->set('vier', 'style', $_POST['vier_style']);
|
DI::config()->set('vier', 'style', $_POST['vier_style']);
|
||||||
DI::config()->set('vier', 'show_pages', $_POST['vier_show_pages']);
|
DI::config()->set('vier', 'show_pages', $_POST['vier_show_pages']);
|
||||||
|
|
Loading…
Reference in New Issue