X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FProfile.php;h=05f88a2b58ce89838c634c2ac1b9c1304ad281cb;hb=1239ce1e7e53298154ed9f1fa50c9dc8f6c02c98;hp=4ff34d4684969bc7949125c670bfbc25ebc01b20;hpb=afe3c8954c92d386fef3cb74217dd7ad593500cf;p=friendica.git diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 4ff34d4684..05f88a2b58 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -1,6 +1,6 @@ getQueryString(), Logger::DEBUG); - return; + Logger::info('profile error: ' . DI::args()->getQueryString()); + return []; } - $a->profile = $profile; - $a->profile_uid = $profile['uid']; + // 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->profile['mobile-theme'] = DI::pConfig()->get($a->profile['uid'], 'system', 'mobile_theme'); - $a->profile['network'] = Protocol::DFRN; + $a->setProfileOwner($profile['uid']); - DI::page()['title'] = $a->profile['name'] . ' @ ' . DI::config()->get('config', 'sitename'); + DI::page()['title'] = $profile['name'] . ' @ ' . DI::config()->get('config', 'sitename'); if (!DI::pConfig()->get(local_user(), 'system', 'always_my_theme')) { - $a->setCurrentTheme($a->profile['theme']); - $a->setCurrentMobileTheme($a->profile['mobile-theme']); + $a->setCurrentTheme($profile['theme']); + $a->setCurrentMobileTheme(DI::pConfig()->get($a->getProfileOwner(), 'system', 'mobile_theme')); } /* @@ -250,9 +256,9 @@ 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($a, $a->profile, $block); + DI::page()['aside'] .= self::getVCardHtml($profile, $block, $show_contacts); - return; + return $profile; } /** @@ -261,9 +267,9 @@ class Profile * It is very difficult to templatise the HTML completely * because of all the conditional logic. * - * @param array $profile - * @param int $block - * @param boolean $show_connect Show connect link + * @param array $profile Profile array + * @param bool $block Block personal details + * @param bool $show_contacts Show contact block * * @return string HTML sidebar module * @@ -276,56 +282,32 @@ class Profile * @hooks 'profile_sidebar' * array $arr */ - private static function sidebar(App $a, array $profile, $block = 0) + public static function getVCardHtml(array $profile, bool $block, bool $show_contacts) { $o = ''; $location = false; - // This function can also use contact information in $profile, but the 'cid' - // value is going to be coming from 'owner-view', which means it's the wrong - // contact ID for the user viewing this page. Use 'nurl' to look up the - // correct contact table entry for the logged-in user. $profile_contact = []; - if (!empty($profile['nurl'])) { - if (local_user() && ($profile['uid'] ?? 0) != local_user()) { - $profile_contact = Contact::getByURL($profile['nurl'], null, ['rel'], local_user()); - } - if (!empty($profile['cid']) && self::getMyURL()) { - $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]); - } + if (local_user() && ($profile['uid'] ?? 0) != local_user()) { + $profile_contact = Contact::getByURL($profile['nurl'], null, [], local_user()); } - - if (empty($profile['nickname'])) { - Logger::warning('Received profile with no nickname', ['profile' => $profile, 'callstack' => System::callstack(10)]); - return $o; + if (!empty($profile['cid']) && self::getMyURL()) { + $profile_contact = Contact::selectFirst([], ['id' => $profile['cid']]); } - $profile['picdate'] = urlencode($profile['picdate'] ?? ''); + $profile['picdate'] = urlencode($profile['picdate']); - if (($profile['network'] != '') && ($profile['network'] != Protocol::DFRN)) { - $profile['network_link'] = Strings::formatNetworkName($profile['network'], $profile['url']); - } else { - $profile['network_link'] = ''; - } + $profile['network_link'] = ''; Hook::callAll('profile_sidebar_enter', $profile); - if (isset($profile['url'])) { - $profile_url = $profile['url']; - } else { - $profile_url = DI::baseUrl()->get() . '/profile/' . $profile['nickname']; - } + $profile_url = $profile['url']; - if (!empty($profile['id'])) { - $cid = $profile['id']; - } else { - $cid = Contact::getIdForURL($profile_url, false); - } + $cid = $profile['id']; $follow_link = null; $unfollow_link = null; - $subscribe_feed_link = null; $wallmessage_link = null; // Who is the logged-in user to this profile? @@ -334,8 +316,6 @@ class Profile $visitor_contact = Contact::selectFirst(['rel'], ['uid' => $profile['uid'], 'nurl' => Strings::normaliseLink(self::getMyURL())]); } - $profile_is_dfrn = $profile['network'] == Protocol::DFRN; - $profile_is_native = in_array($profile['network'], Protocol::NATIVE_SUPPORT); $local_user_is_self = self::getMyURL() && ($profile['url'] == self::getMyURL()); $visitor_is_authenticated = (bool)self::getMyURL(); $visitor_is_following = @@ -352,7 +332,7 @@ class Profile if (!empty($profile['nickname']) && strpos($profile_url, DI::baseUrl()->get()) === 0) { $follow_link = 'remote_follow/' . $profile['nickname']; } - } elseif ($profile_is_native) { + } else { if ($visitor_is_following) { $unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url) . '&auto=1'; } else { @@ -360,10 +340,6 @@ class Profile } } - if ($profile_is_dfrn) { - $subscribe_feed_link = 'dfrn_poll/' . $profile['nickname']; - } - if (Contact::canReceivePrivateMessages($profile_contact)) { if ($visitor_is_followed || $visitor_is_following) { $wallmessage_link = $visitor_base_path . '/message/new/' . $profile_contact['id']; @@ -395,6 +371,7 @@ class Profile $homepage = !empty($profile['homepage']) ? DI::l10n()->t('Homepage:') : false; $about = !empty($profile['about']) ? DI::l10n()->t('About:') : false; $xmpp = !empty($profile['xmpp']) ? DI::l10n()->t('XMPP:') : false; + $matrix = !empty($profile['matrix']) ? DI::l10n()->t('Matrix:') : false; if ((!empty($profile['hidewall']) || $block) && !Session::isAuthenticated()) { $location = $homepage = $about = false; @@ -429,10 +406,10 @@ class Profile $updated = date('c', strtotime($profile['last-item'])); } - if (!$block) { - $contact_block = ContactBlock::getHTML($a->profile); + if (!$block && $show_contacts) { + $contact_block = ContactBlock::getHTML($profile, local_user()); - if (is_array($a->profile) && !$a->profile['hide-friends']) { + if (is_array($profile) && !$profile['hide-friends']) { $contact_count = DBA::count('contact', [ 'uid' => $profile['uid'], 'self' => false, @@ -465,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']); @@ -473,12 +450,13 @@ class Profile $o .= Renderer::replaceMacros($tpl, [ '$profile' => $p, '$xmpp' => $xmpp, + '$matrix' => $matrix, '$follow' => DI::l10n()->t('Follow'), '$follow_link' => $follow_link, '$unfollow' => DI::l10n()->t('Unfollow'), '$unfollow_link' => $unfollow_link, '$subscribe_feed' => DI::l10n()->t('Atom feed'), - '$subscribe_feed_link' => $subscribe_feed_link, + '$subscribe_feed_link' => $profile['poll'], '$wallmessage' => DI::l10n()->t('Message'), '$wallmessage_link' => $wallmessage_link, '$account_type' => $account_type, @@ -578,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->timezone, '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; } @@ -637,8 +615,8 @@ class Profile $total++; } - $strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->timezone : 'UTC', 'UTC', 'Y-m-d'); - if ($strt === DateTimeFormat::timezoneNow($a->timezone, 'Y-m-d')) { + $strt = DateTimeFormat::local($rr['start'], 'Y-m-d'); + if ($strt === DateTimeFormat::localNow('Y-m-d')) { $istoday = true; } @@ -653,17 +631,17 @@ class Profile $description = DI::l10n()->t('[No description]'); } - $strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->timezone : 'UTC'); + $strt = DateTimeFormat::local($rr['start']); - if (substr($strt, 0, 10) < DateTimeFormat::timezoneNow($a->timezone, 'Y-m-d')) { + if (substr($strt, 0, 10) < DateTimeFormat::localNow('Y-m-d')) { continue; } - $today = ((substr($strt, 0, 10) === DateTimeFormat::timezoneNow($a->timezone, '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->timezone : '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; @@ -728,27 +706,27 @@ class Profile // Try to find the public contact entry of the visitor. $cid = Contact::getIdForURL($my_url); if (!$cid) { - Logger::log('No contact record found for ' . $my_url, Logger::DEBUG); + Logger::info('No contact record found for ' . $my_url); return; } $contact = DBA::selectFirst('contact',['id', 'url'], ['id' => $cid]); if (DBA::isResult($contact) && remote_user() && remote_user() == $contact['id']) { - Logger::log('The visitor ' . $my_url . ' is already authenticated', Logger::DEBUG); + Logger::info('The visitor ' . $my_url . ' is already authenticated'); return; } // Avoid endless loops $cachekey = 'zrlInit:' . $my_url; if (DI::cache()->get($cachekey)) { - Logger::log('URL ' . $my_url . ' already tried to authenticate.', Logger::DEBUG); + Logger::info('URL ' . $my_url . ' already tried to authenticate.'); return; } else { DI::cache()->set($cachekey, true, Duration::MINUTE); } - Logger::log('Not authenticated. Invoking reverse magic-auth for ' . $my_url, Logger::DEBUG); + Logger::info('Not authenticated. Invoking reverse magic-auth for ' . $my_url); // Remove the "addr" parameter from the destination. It is later added as separate parameter again. $addr_request = 'addr=' . urlencode($addr); @@ -765,9 +743,9 @@ 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); + Logger::info('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path); System::externalRedirect($magic_path); } } @@ -802,7 +780,7 @@ class Profile Session::setVisitorsContacts(); - $a->contact = $visitor; + $a->setContactId($visitor['id']); Logger::info('Authenticated visitor', ['url' => $visitor['url']]); @@ -863,11 +841,11 @@ class Profile */ Hook::callAll('magic_auth_success', $arr); - $a->contact = $arr['visitor']; + $a->setContactId($arr['visitor']['id']); info(DI::l10n()->t('OpenWebAuth: %1$s welcomes %2$s', DI::baseUrl()->getHostname(), $visitor['name'])); - Logger::log('OpenWebAuth: auth success from ' . $visitor['addr'], Logger::DEBUG); + Logger::info('OpenWebAuth: auth success from ' . $visitor['addr']); } public static function zrl($s, $force = false) @@ -905,7 +883,7 @@ class Profile */ public static function getThemeUid(App $a) { - $uid = !empty($a->profile_uid) ? intval($a->profile_uid) : 0; + $uid = !empty($a->getProfileOwner()) ? intval($a->getProfileOwner()) : 0; if (local_user() && (DI::pConfig()->get(local_user(), 'system', 'always_my_theme') || !$uid)) { return local_user(); } @@ -959,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']]); + } + } }