diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 80775c9e86..660cc5fb3d 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -35,6 +35,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; +use Friendica\Network\HTTPException; use Friendica\Protocol\Activity; use Friendica\Protocol\Diaspora; use Friendica\Util\DateTimeFormat; @@ -204,11 +205,13 @@ class Profile * the theme is chosen before the _init() function of a theme is run, which will usually * load a lot of theme-specific content * - * @param App $a - * @param string $nickname string - * + * @param App $a + * @param string $nickname string + * @param bool $show_contacts * @return array Profile - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * + * @throws HTTPException\NotFoundException + * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ public static function load(App $a, string $nickname, bool $show_contacts = true) @@ -219,6 +222,12 @@ class Profile return []; } + // System user, aborting + if ($profile['uid'] === 0) { + DI::logger()->warning('System user found in Profile::load', ['nickname' => $nickname, 'callstack' => System::callstack(20)]); + throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.')); + } + $a->setProfileOwner($profile['uid']); DI::page()['title'] = $profile['name'] . ' @ ' . DI::config()->get('config', 'sitename'); @@ -246,7 +255,7 @@ class Profile * By now, the contact block isn't shown, when a different profile is given * But: When this profile was on the same server, then we could display the contacts */ - DI::page()['aside'] .= self::sidebar($profile, $block, $show_contacts); + DI::page()['aside'] .= self::getVCardHtml($profile, $block, $show_contacts); return $profile; } @@ -272,7 +281,7 @@ class Profile * @hooks 'profile_sidebar' * array $arr */ - private static function sidebar(array $profile, bool $block, bool $show_contacts) + public static function getVCardHtml(array $profile, bool $block, bool $show_contacts) { $o = ''; $location = false; diff --git a/src/Model/User.php b/src/Model/User.php index 49423ce9ef..5af5f7f582 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -149,14 +149,20 @@ class User $system['page-flags'] = User::PAGE_FLAGS_SOAPBOX; $system['account-type'] = $system['contact-type']; $system['guid'] = ''; - $system['nickname'] = $system['nick']; - $system['pubkey'] = $system['pubkey']; - $system['locality'] = ''; - $system['region'] = ''; - $system['country-name'] = ''; - $system['net-publish'] = false; $system['picdate'] = ''; $system['theme'] = ''; + $system['publish'] = false; + $system['net-publish'] = false; + $system['hide-friends'] = true; + $system['prv_keywords'] = ''; + $system['pub_keywords'] = ''; + $system['address'] = ''; + $system['locality'] = ''; + $system['region'] = ''; + $system['postal-code'] = ''; + $system['country-name'] = ''; + $system['homepage'] = DI::baseUrl()->get(); + $system['dob'] = '0000-00-00'; // Ensure that the user contains data $user = DBA::selectFirst('user', ['prvkey', 'guid'], ['uid' => 0]); diff --git a/src/Module/HCard.php b/src/Module/HCard.php index 3310749bc3..079f240ae4 100644 --- a/src/Module/HCard.php +++ b/src/Module/HCard.php @@ -34,13 +34,11 @@ use Friendica\Network\HTTPException; */ class HCard extends BaseModule { - public static function rawContent(array $parameters = []) + public static function content(array $parameters = []) { - $a = DI::app(); - if ((local_user()) && ($parameters['action'] ?? '') === 'view') { // A logged in user views a profile of a user - $nickname = $a->getLoggedInUserNickname(); + $nickname = DI::app()->getLoggedInUserNickname(); } elseif (empty($parameters['action'])) { // Show the profile hCard $nickname = $parameters['profile']; @@ -48,7 +46,7 @@ class HCard extends BaseModule throw new HTTPException\NotFoundException(DI::l10n()->t('No profile')); } - $profile = Profile::load($a, $nickname, false); + $profile = User::getOwnerDataByNick($nickname); if (empty($profile)) { throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.')); @@ -67,15 +65,6 @@ class HCard extends BaseModule $page['htmlhead'] .= '' . "\r\n"; } - // check if blocked - if (DI::config()->get('system', 'block_public') && !Session::isAuthenticated()) { - $keywords = $profile['pub_keywords'] ?? ''; - $keywords = str_replace([',', ' ', ',,'], [' ', ',', ','], $keywords); - if (strlen($keywords)) { - $page['htmlhead'] .= '' . "\r\n"; - } - } - $baseUrl = DI::baseUrl(); $uri = urlencode('acct:' . $profile['nickname'] . '@' . $baseUrl->getHostname() . ($baseUrl->getUrlPath() ? '/' . $baseUrl->getUrlPath() : '')); @@ -88,5 +77,20 @@ class HCard extends BaseModule foreach (['request', 'confirm', 'notify', 'poll'] as $dfrn) { $page['htmlhead'] .= "get() . "/dfrn_{$dfrn}/{$nickname}\" />\r\n"; } + + $block = (DI::config()->get('system', 'block_public') && !Session::isAuthenticated()); + + // check if blocked + if ($block) { + $keywords = $profile['pub_keywords'] ?? ''; + $keywords = str_replace([',', ' ', ',,'], [' ', ',', ','], $keywords); + if (strlen($keywords)) { + $page['htmlhead'] .= '' . "\r\n"; + } + } + + $page['aside'] = Profile::getVCardHtml($profile, $block, false); + + return ''; } } diff --git a/src/Module/Profile/Contacts.php b/src/Module/Profile/Contacts.php index 19dbe4cddb..94f301557b 100644 --- a/src/Module/Profile/Contacts.php +++ b/src/Module/Profile/Contacts.php @@ -52,7 +52,7 @@ class Contacts extends Module\BaseProfile $is_owner = $profile['uid'] == local_user(); - if (!empty($profile['hide-friends']) && !$is_owner) { + if ($profile['hide-friends'] && !$is_owner) { throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); }