Merge remote-tracking branch 'upstream/develop' into untrusted
This commit is contained in:
commit
7834359957
7 changed files with 78 additions and 61 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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])) {
|
||||||
|
|
|
@ -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';
|
||||||
|
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue