X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FProfile.php;h=d089ada3cd172f87908412237ad2fc42f057bc99;hb=235eab0d99891eb1d0bf401856dfb162c6f1ea20;hp=80775c9e86b9e09416083a7e8ef3f5af393553ad;hpb=3e1e3c8b3e317e47abdd63284109da1774e66bdf;p=friendica.git diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 80775c9e86..d089ada3cd 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -35,12 +35,14 @@ 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\Security\PermissionSet\Entity\PermissionSet; use Friendica\Util\DateTimeFormat; use Friendica\Util\HTTPSignature; use Friendica\Util\Network; -use Friendica\Util\Proxy as ProxyUtils; +use Friendica\Util\Proxy; use Friendica\Util\Strings; class Profile @@ -204,11 +206,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 +223,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 +256,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 +282,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; @@ -397,7 +407,7 @@ class Profile } if (!$block && $show_contacts) { - $contact_block = ContactBlock::getHTML($profile); + $contact_block = ContactBlock::getHTML($profile, local_user()); if (is_array($profile) && !$profile['hide-friends']) { $contact_count = DBA::count('contact', [ @@ -432,7 +442,7 @@ class Profile $p['address'] = BBCode::convertForUriId($profile['uri-id'] ?? 0, $p['address']); } - $p['photo'] = Contact::getAvatarUrlForId($cid, ProxyUtils::SIZE_SMALL); + $p['photo'] = Contact::getAvatarUrlForId($cid, Proxy::SIZE_SMALL); $p['url'] = Contact::magicLinkById($cid, $profile['url']); @@ -546,7 +556,7 @@ class Profile $rr['link'] = Contact::magicLinkById($rr['cid']); $rr['title'] = $rr['name']; - $rr['date'] = DI::l10n()->getDay(DateTimeFormat::convert($rr['start'], $a->getTimeZone(), 'UTC', $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); + $rr['date'] = DI::l10n()->getDay(DateTimeFormat::local($rr['start'], $bd_short)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); $rr['startime'] = null; $rr['today'] = $today; } @@ -605,8 +615,8 @@ class Profile $total++; } - $strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC', 'UTC', 'Y-m-d'); - if ($strt === DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) { + $strt = DateTimeFormat::local($rr['start'], 'Y-m-d'); + if ($strt === DateTimeFormat::localNow('Y-m-d')) { $istoday = true; } @@ -621,17 +631,17 @@ class Profile $description = DI::l10n()->t('[No description]'); } - $strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC'); + $strt = DateTimeFormat::local($rr['start']); - if (substr($strt, 0, 10) < DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) { + if (substr($strt, 0, 10) < DateTimeFormat::localNow('Y-m-d')) { continue; } - $today = ((substr($strt, 0, 10) === DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) ? true : false); + $today = substr($strt, 0, 10) === DateTimeFormat::localNow('Y-m-d'); $rr['title'] = $title; $rr['description'] = $description; - $rr['date'] = DI::l10n()->getDay(DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC', 'UTC', $bd_format)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); + $rr['date'] = DI::l10n()->getDay(DateTimeFormat::local($rr['start'], $bd_format)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); $rr['startime'] = $strt; $rr['today'] = $today; @@ -733,7 +743,7 @@ class Profile $magic_path = $basepath . '/magic' . '?owa=1&dest=' . $dest . '&' . $addr_request; // We have to check if the remote server does understand /magic without invoking something - $serverret = DI::httpRequest()->get($basepath . '/magic'); + $serverret = DI::httpClient()->get($basepath . '/magic'); if ($serverret->isSuccess()) { Logger::log('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path, Logger::DEBUG); System::externalRedirect($magic_path); @@ -927,4 +937,86 @@ class Profile return ['total' => $total, 'entries' => $profiles]; } + + /** + * Migrates a legacy profile to the new slimmer profile with extra custom fields. + * Multi profiles are converted to ACl-protected custom fields and deleted. + * + * @param array $profile One profile array + * @throws \Exception + */ + public static function migrate(array $profile) + { + // Already processed, aborting + if ($profile['is-default'] === null) { + return; + } + + $contacts = []; + + if (!$profile['is-default']) { + $contacts = Contact::selectToArray(['id'], [ + 'uid' => $profile['uid'], + 'profile-id' => $profile['id'] + ]); + if (!count($contacts)) { + // No contact visibility selected defaults to user-only permission + $contacts = Contact::selectToArray(['id'], ['uid' => $profile['uid'], 'self' => true]); + } + } + + $permissionSet = DI::permissionSet()->selectOrCreate( + new PermissionSet( + $profile['uid'], + array_column($contacts, 'id') ?? [] + ) + ); + + $order = 1; + + $custom_fields = [ + 'hometown' => DI::l10n()->t('Hometown:'), + 'marital' => DI::l10n()->t('Marital Status:'), + 'with' => DI::l10n()->t('With:'), + 'howlong' => DI::l10n()->t('Since:'), + 'sexual' => DI::l10n()->t('Sexual Preference:'), + 'politic' => DI::l10n()->t('Political Views:'), + 'religion' => DI::l10n()->t('Religious Views:'), + 'likes' => DI::l10n()->t('Likes:'), + 'dislikes' => DI::l10n()->t('Dislikes:'), + 'pdesc' => DI::l10n()->t('Title/Description:'), + 'summary' => DI::l10n()->t('Summary'), + 'music' => DI::l10n()->t('Musical interests'), + 'book' => DI::l10n()->t('Books, literature'), + 'tv' => DI::l10n()->t('Television'), + 'film' => DI::l10n()->t('Film/dance/culture/entertainment'), + 'interest' => DI::l10n()->t('Hobbies/Interests'), + 'romance' => DI::l10n()->t('Love/romance'), + 'work' => DI::l10n()->t('Work/employment'), + 'education' => DI::l10n()->t('School/education'), + 'contact' => DI::l10n()->t('Contact information and Social Networks'), + ]; + + foreach ($custom_fields as $field => $label) { + if (!empty($profile[$field]) && $profile[$field] > DBA::NULL_DATE && $profile[$field] > DBA::NULL_DATETIME) { + DI::profileField()->save(DI::profileFieldFactory()->createFromValues( + $profile['uid'], + $order, + trim($label, ':'), + $profile[$field], + $permissionSet + )); + } + + $profile[$field] = null; + } + + if ($profile['is-default']) { + $profile['profile-name'] = null; + $profile['is-default'] = null; + DBA::update('profile', $profile, ['id' => $profile['id']]); + } else if (!empty($profile['id'])) { + DBA::delete('profile', ['id' => $profile['id']]); + } + } }