Merge remote-tracking branch 'upstream/develop' into untrusted

This commit is contained in:
Michael 2022-07-24 21:58:49 +00:00
commit 7834359957
7 changed files with 78 additions and 61 deletions

View file

@ -53,8 +53,8 @@ class FContact
if (is_null($update)) { if (is_null($update)) {
// update record occasionally so it doesn't get stale // update record occasionally so it doesn't get stale
$d = strtotime($person["updated"]." +00:00"); $d = strtotime($person['updated'] . ' +00:00');
if ($d < strtotime("now - 14 days")) { if ($d < strtotime('now - 14 days')) {
$update = true; $update = true;
} }

View file

@ -79,6 +79,7 @@ class Nodeinfo
$config = DI::config(); $config = DI::config();
$usage = new stdClass(); $usage = new stdClass();
$usage->users = [];
if (!empty($config->get('system', 'nodeinfo'))) { if (!empty($config->get('system', 'nodeinfo'))) {
$usage->users = [ $usage->users = [

View file

@ -96,6 +96,7 @@ class Profile
* *
* @param array $fields Profile fields to update * @param array $fields Profile fields to update
* @param integer $uid User id * @param integer $uid User id
*
* @return boolean Whether update was successful * @return boolean Whether update was successful
*/ */
public static function update(array $fields, int $uid): bool public static function update(array $fields, int $uid): bool
@ -139,6 +140,7 @@ class Profile
* *
* @param int $uid User id * @param int $uid User id
* @param bool $force Force publishing to the directory * @param bool $force Force publishing to the directory
*
* @return void * @return void
*/ */
public static function publishUpdate(int $uid, bool $force = false) public static function publishUpdate(int $uid, bool $force = false)
@ -162,6 +164,7 @@ class Profile
* Returns a formatted location string from the given profile array * Returns a formatted location string from the given profile array
* *
* @param array $profile Profile array (Generated from the "profile" table) * @param array $profile Profile array (Generated from the "profile" table)
*
* @return string Location string * @return string Location string
*/ */
public static function formatLocation(array $profile): string public static function formatLocation(array $profile): string
@ -212,13 +215,13 @@ class Profile
* @param App $a * @param App $a
* @param string $nickname string * @param string $nickname string
* @param bool $show_contacts * @param bool $show_contacts
* @return array Profile
* *
* @return array Profile
* @throws HTTPException\NotFoundException * @throws HTTPException\NotFoundException
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function load(App $a, string $nickname, bool $show_contacts = true) public static function load(App $a, string $nickname, bool $show_contacts = true): array
{ {
$profile = User::getOwnerDataByNick($nickname); $profile = User::getOwnerDataByNick($nickname);
if (!isset($profile['account_removed']) || $profile['account_removed']) { if (!isset($profile['account_removed']) || $profile['account_removed']) {
@ -285,7 +288,7 @@ class Profile
* @hooks 'profile_sidebar' * @hooks 'profile_sidebar'
* array $arr * array $arr
*/ */
public static function getVCardHtml(array $profile, bool $block, bool $show_contacts) public static function getVCardHtml(array $profile, bool $block, bool $show_contacts): string
{ {
$o = ''; $o = '';
$location = false; $location = false;
@ -386,16 +389,16 @@ class Profile
if (!empty($profile['guid'])) { if (!empty($profile['guid'])) {
$diaspora = [ $diaspora = [
'guid' => $profile['guid'], 'guid' => $profile['guid'],
'podloc' => DI::baseUrl(), 'podloc' => DI::baseUrl(),
'searchable' => ($profile['net-publish'] ? 'true' : 'false'), 'searchable' => ($profile['net-publish'] ? 'true' : 'false'),
'nickname' => $profile['nickname'], 'nickname' => $profile['nickname'],
'fullname' => $profile['name'], 'fullname' => $profile['name'],
'firstname' => $firstname, 'firstname' => $firstname,
'lastname' => $lastname, 'lastname' => $lastname,
'photo300' => $profile['photo'] ?? '', 'photo300' => $profile['photo'] ?? '',
'photo100' => $profile['thumb'] ?? '', 'photo100' => $profile['thumb'] ?? '',
'photo50' => $profile['micro'] ?? '', 'photo50' => $profile['micro'] ?? '',
]; ];
} else { } else {
$diaspora = false; $diaspora = false;
@ -414,13 +417,13 @@ class Profile
if (is_array($profile) && !$profile['hide-friends']) { if (is_array($profile) && !$profile['hide-friends']) {
$contact_count = DBA::count('contact', [ $contact_count = DBA::count('contact', [
'uid' => $profile['uid'], 'uid' => $profile['uid'],
'self' => false, 'self' => false,
'blocked' => false, 'blocked' => false,
'pending' => false, 'pending' => false,
'hidden' => false, 'hidden' => false,
'archive' => false, 'archive' => false,
'failed' => false, 'failed' => false,
'network' => Protocol::FEDERATED, 'network' => Protocol::FEDERATED,
]); ]);
} }
@ -429,7 +432,7 @@ class Profile
// Expected profile/vcard.tpl profile.* template variables // Expected profile/vcard.tpl profile.* template variables
$p = [ $p = [
'address' => null, 'address' => null,
'edit' => null, 'edit' => null,
'upubkey' => null, 'upubkey' => null,
]; ];
foreach ($profile as $k => $v) { foreach ($profile as $k => $v) {
@ -484,7 +487,6 @@ class Profile
* Returns the upcoming birthdays of contacts of the current user as HTML content * Returns the upcoming birthdays of contacts of the current user as HTML content
* *
* @return string The upcoming birthdays (HTML) * @return string The upcoming birthdays (HTML)
*
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
* @throws HTTPException\ServiceUnavailableException * @throws HTTPException\ServiceUnavailableException
* @throws \ImagickException * @throws \ImagickException
@ -583,7 +585,12 @@ class Profile
]); ]);
} }
public static function getEventsReminderHTML() /**
* Renders HTML for event reminder (e.g. contact birthdays
*
* @return string Rendered HTML
*/
public static function getEventsReminderHTML(): string
{ {
$a = DI::app(); $a = DI::app();
$o = ''; $o = '';
@ -674,9 +681,9 @@ class Profile
* *
* @return string * @return string
*/ */
public static function getMyURL() public static function getMyURL(): string
{ {
return Session::get('my_url'); return Session::get('my_url') ?? '';
} }
/** /**
@ -695,6 +702,8 @@ class Profile
* It would be favourable to harmonize the two implementations. * It would be favourable to harmonize the two implementations.
* *
* @param App $a Application instance. * @param App $a Application instance.
*
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
@ -764,9 +773,10 @@ class Profile
* Set the visitor cookies (see remote_user()) for the given handle * Set the visitor cookies (see remote_user()) for the given handle
* *
* @param string $handle Visitor handle * @param string $handle Visitor handle
*
* @return array Visitor contact array * @return array Visitor contact array
*/ */
public static function addVisitorCookieForHandle($handle) public static function addVisitorCookieForHandle(string $handle): array
{ {
$a = DI::app(); $a = DI::app();
@ -798,9 +808,10 @@ class Profile
/** /**
* Set the visitor cookies (see remote_user()) for signed HTTP requests * Set the visitor cookies (see remote_user()) for signed HTTP requests
(
* @return array Visitor contact array * @return array Visitor contact array
*/ */
public static function addVisitorCookieForHTTPSigner() public static function addVisitorCookieForHTTPSigner(): array
{ {
$requester = HTTPSignature::getSigner('', $_SERVER); $requester = HTTPSignature::getSigner('', $_SERVER);
if (empty($requester)) { if (empty($requester)) {
@ -815,10 +826,12 @@ class Profile
* Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/zid.php * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/zid.php
* *
* @param string $token * @param string $token
*
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function openWebAuthInit($token) public static function openWebAuthInit(string $token)
{ {
$a = DI::app(); $a = DI::app();
@ -857,23 +870,34 @@ class Profile
Logger::info('OpenWebAuth: auth success from ' . $visitor['addr']); Logger::info('OpenWebAuth: auth success from ' . $visitor['addr']);
} }
public static function zrl($s, $force = false) /**
* Returns URL with URL-encoded zrl parameter
*
* @param string $url URL to enhance
* @param bool $force Either to force adding zrl parameter
*
* @return string URL with 'zrl' parameter or original URL in case of no Friendica profile URL
*/
public static function zrl(string $url, bool $force = false): string
{ {
if (!strlen($s)) { if (!strlen($url)) {
return $s; return $url;
} }
if (!strpos($s, '/profile/') && !$force) { if (!strpos($url, '/profile/') && !$force) {
return $s; return $url;
} }
if ($force && substr($s, -1, 1) !== '/') { if ($force && substr($url, -1, 1) !== '/') {
$s = $s . '/'; $url = $url . '/';
} }
$achar = strpos($s, '?') ? '&' : '?';
$achar = strpos($url, '?') ? '&' : '?';
$mine = self::getMyURL(); $mine = self::getMyURL();
if ($mine && !Strings::compareLink($mine, $s)) {
return $s . $achar . 'zrl=' . urlencode($mine); if ($mine && !Strings::compareLink($mine, $url)) {
return $url . $achar . 'zrl=' . urlencode($mine);
} }
return $s;
return $url;
} }
/** /**
@ -885,6 +909,7 @@ class Profile
* want to see anybody else's theme settings except their own while on this site. * want to see anybody else's theme settings except their own while on this site.
* *
* @param App $a * @param App $a
*
* @return int user ID * @return int user ID
* *
* @note Returns local_user instead of user ID if "always_my_theme" is set to true * @note Returns local_user instead of user ID if "always_my_theme" is set to true
@ -897,15 +922,15 @@ class Profile
/** /**
* search for Profiles * search for Profiles
* *
* @param int $start * @param int $start Starting record (see LIMIT start,count)
* @param int $count * @param int $count Maximum records (see LIMIT start,count)
* @param null $search * @param string $search Optional search word (see LIKE %s?%s)
* *
* @return array [ 'total' => 123, 'entries' => [...] ]; * @return array [ 'total' => 123, 'entries' => [...] ];
* *
* @throws \Exception * @throws \Exception
*/ */
public static function searchProfiles($start = 0, $count = 100, $search = null) public static function searchProfiles(int $start = 0, int $count = 100, string $search = null): array
{ {
if (!empty($search)) { if (!empty($search)) {
$publish = (DI::config()->get('system', 'publish_all') ? '' : "AND `publish` "); $publish = (DI::config()->get('system', 'publish_all') ? '' : "AND `publish` ");
@ -946,6 +971,8 @@ class Profile
* Multi profiles are converted to ACl-protected custom fields and deleted. * Multi profiles are converted to ACl-protected custom fields and deleted.
* *
* @param array $profile One profile array * @param array $profile One profile array
*
* @return void
* @throws \Exception * @throws \Exception
*/ */
public static function migrate(array $profile) public static function migrate(array $profile)

View file

@ -276,7 +276,8 @@ class User
/** /**
* Returns true if a user record exists with the provided id * Returns true if a user record exists with the provided id
* *
* @param integer $uid * @param int $uid
*
* @return boolean * @return boolean
* @throws Exception * @throws Exception
*/ */
@ -412,7 +413,7 @@ class User
$owner = DBA::selectFirst('owner-view', [], ['uid' => $uid]); $owner = DBA::selectFirst('owner-view', [], ['uid' => $uid]);
if (!DBA::isResult($owner)) { if (!DBA::isResult($owner)) {
if (!DBA::exists('user', ['uid' => $uid]) || !$repairMissing) { if (!self::exists($uid) || !$repairMissing) {
return false; return false;
} }
if (!DBA::exists('profile', ['uid' => $uid])) { if (!DBA::exists('profile', ['uid' => $uid])) {

View file

@ -63,8 +63,8 @@ class NodeInfo110 extends BaseModule
'friendica' 'friendica'
], ],
], ],
'services' => [], 'services' => Nodeinfo::getServices(),
'usage' => [], 'usage' => Nodeinfo::getUsage(),
'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED, 'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED,
'metadata' => [ 'metadata' => [
'nodeName' => $this->config->get('config', 'sitename'), 'nodeName' => $this->config->get('config', 'sitename'),
@ -81,10 +81,6 @@ class NodeInfo110 extends BaseModule
$nodeinfo['protocols']['outbound'][] = 'gnusocial'; $nodeinfo['protocols']['outbound'][] = 'gnusocial';
} }
$nodeinfo['usage'] = Nodeinfo::getUsage();
$nodeinfo['services'] = Nodeinfo::getServices();
$nodeinfo['metadata']['protocols'] = $nodeinfo['protocols']; $nodeinfo['metadata']['protocols'] = $nodeinfo['protocols'];
$nodeinfo['metadata']['protocols']['outbound'][] = 'atom1.0'; $nodeinfo['metadata']['protocols']['outbound'][] = 'atom1.0';
$nodeinfo['metadata']['protocols']['inbound'][] = 'atom1.0'; $nodeinfo['metadata']['protocols']['inbound'][] = 'atom1.0';

View file

@ -56,8 +56,8 @@ class NodeInfo120 extends BaseModule
'version' => FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION, 'version' => FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION,
], ],
'protocols' => ['dfrn', 'activitypub'], 'protocols' => ['dfrn', 'activitypub'],
'services' => [], 'services' => Nodeinfo::getServices(),
'usage' => [], 'usage' => Nodeinfo::getUsage(),
'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED, 'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED,
'metadata' => [ 'metadata' => [
'nodeName' => $this->config->get('config', 'sitename'), 'nodeName' => $this->config->get('config', 'sitename'),
@ -72,10 +72,6 @@ class NodeInfo120 extends BaseModule
$nodeinfo['protocols'][] = 'ostatus'; $nodeinfo['protocols'][] = 'ostatus';
} }
$nodeinfo['usage'] = Nodeinfo::getUsage();
$nodeinfo['services'] = Nodeinfo::getServices();
if (Addon::isEnabled('twitter')) { if (Addon::isEnabled('twitter')) {
$nodeinfo['services']['inbound'][] = 'twitter'; $nodeinfo['services']['inbound'][] = 'twitter';
} }

View file

@ -59,9 +59,9 @@ class NodeInfo210 extends BaseModule
], ],
'organization' => Nodeinfo::getOrganization($this->config), 'organization' => Nodeinfo::getOrganization($this->config),
'protocols' => ['dfrn', 'activitypub'], 'protocols' => ['dfrn', 'activitypub'],
'services' => [], 'services' => Nodeinfo::getServices(),
'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED, 'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED,
'usage' => [], 'usage' => Nodeinfo::getUsage(true),
]; ];
if (!empty($this->config->get('system', 'diaspora_enabled'))) { if (!empty($this->config->get('system', 'diaspora_enabled'))) {
@ -72,10 +72,6 @@ class NodeInfo210 extends BaseModule
$nodeinfo['protocols'][] = 'ostatus'; $nodeinfo['protocols'][] = 'ostatus';
} }
$nodeinfo['usage'] = Nodeinfo::getUsage(true);
$nodeinfo['services'] = Nodeinfo::getServices();
if (Addon::isEnabled('twitter')) { if (Addon::isEnabled('twitter')) {
$nodeinfo['services']['inbound'][] = 'twitter'; $nodeinfo['services']['inbound'][] = 'twitter';
} }