<?php
/**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
+use Friendica\Core\Search;
use Friendica\Core\Session;
use Friendica\Core\System;
+use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Protocol\Activity;
return DBA::selectToArray('profile', $fields, ['uid' => $uid]);
}
+ /**
+ * Update a profile entry and distribute the changes if needed
+ *
+ * @param array $fields
+ * @param integer $uid
+ * @return boolean
+ */
+ public static function update(array $fields, int $uid): bool
+ {
+ $old_owner = User::getOwnerDataById($uid);
+ if (empty($old_owner)) {
+ return false;
+ }
+
+ if (!DBA::update('profile', $fields, ['uid' => $uid])) {
+ return false;
+ }
+
+ $update = Contact::updateSelfFromUserID($uid);
+
+ $owner = User::getOwnerDataById($uid);
+ if (empty($owner)) {
+ return false;
+ }
+
+ if ($old_owner['name'] != $owner['name']) {
+ User::update(['username' => $owner['name']], $uid);
+ }
+
+ $profile_fields = ['postal-code', 'dob', 'prv_keywords', 'homepage'];
+ foreach ($profile_fields as $field) {
+ if ($old_owner[$field] != $owner[$field]) {
+ $update = true;
+ }
+ }
+
+ if ($update) {
+ self::publishUpdate($uid, ($old_owner['net-publish'] != $owner['net-publish']));
+ }
+
+ return true;
+ }
+
+ /**
+ * Publish a changed profile
+ * @param int $uid
+ * @param bool $force Force publishing to the directory
+ */
+ public static function publishUpdate(int $uid, bool $force = false)
+ {
+ $owner = User::getOwnerDataById($uid);
+ if (empty($owner)) {
+ return;
+ }
+
+ if ($owner['net-publish'] || $force) {
+ // Update global directory in background
+ if (Search::getGlobalDirectory()) {
+ Worker::add(PRIORITY_LOW, 'Directory', $owner['url']);
+ }
+ }
+
+ Worker::add(PRIORITY_LOW, 'ProfileUpdate', $uid);
+ }
+
/**
* Returns a formatted location string from the given profile array
*
}
}
- $profile = User::getOwnerDataById($user['uid'], false);
+ $profile = !empty($user['uid']) ? User::getOwnerDataById($user['uid'], false) : [];
if (empty($profile) && empty($profiledata)) {
Logger::log('profile error: ' . DI::args()->getQueryString(), Logger::DEBUG);
}
/**
- * Get all profile data of a local user
- *
- * If the viewer is an authenticated remote viewer, the profile displayed is the
- * one that has been configured for his/her viewing in the Contact manager.
- * Passing a non-zero profile ID can also allow a preview of a selected profile
- * by the owner
+ * Get the profile for the given nick name
*
* Includes all available profile data
*
* @param string $nickname nick
- * @param int $uid uid
- * @param int $profile_id ID of the profile
* @return array
* @throws \Exception
*/
- public static function getByNickname($nickname, $uid = 0)
+ public static function getByNickname($nickname)
{
- $profile = DBA::selectFirst('owner-view', [], ['nickname' => $nickname, 'uid' => $uid]);
+ $profile = DBA::selectFirst('owner-view', [], ['nickname' => $nickname]);
return $profile;
}
$o = '';
$location = false;
- // This function can also use contact information in $profile
- $is_contact = !empty($profile['cid']);
+ // 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'] ?? '') != local_user()) {
+ $profile_contact = Contact::getById(Contact::getIdForURL($profile['nurl'], local_user()));
+ }
+ if (!empty($profile['cid']) && self::getMyURL()) {
+ $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]);
+ }
+ }
if (empty($profile['nickname'])) {
Logger::warning('Received profile with no nickname', ['profile' => $profile, 'callstack' => System::callstack(10)]);
$subscribe_feed_link = null;
$wallmessage_link = null;
+ // Who is the logged-in user to this profile?
$visitor_contact = [];
if (!empty($profile['uid']) && self::getMyURL()) {
$visitor_contact = Contact::selectFirst(['rel'], ['uid' => $profile['uid'], 'nurl' => Strings::normaliseLink(self::getMyURL())]);
}
- $profile_contact = [];
- if (!empty($profile['cid']) && self::getMyURL()) {
- $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]);
- }
-
$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());
}
} elseif ($profile_is_native) {
if ($visitor_is_following) {
- $unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url);
+ $unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url) . '&auto=1';
} else {
- $follow_link = $visitor_base_path .'/follow?url=' . urlencode($profile_url);
+ $follow_link = $visitor_base_path .'/follow?url=' . urlencode($profile_url) . '&auto=1';
}
}
$subscribe_feed_link = 'dfrn_poll/' . $profile['nickname'];
}
- if (Contact::canReceivePrivateMessages($profile)) {
+ if (Contact::canReceivePrivateMessages($profile_contact)) {
if ($visitor_is_followed || $visitor_is_following) {
- $wallmessage_link = $visitor_base_path . '/message/new/' . base64_encode($profile['addr'] ?? '');
+ $wallmessage_link = $visitor_base_path . '/message/new/' . $profile_contact['id'];
} elseif ($visitor_is_authenticated && !empty($profile['unkmail'])) {
$wallmessage_link = 'wallmessage/' . $profile['nickname'];
}
}
}
- // show edit profile to yourself
- if (!$is_contact && $local_user_is_self) {
+ // show edit profile to yourself, but only if this is not meant to be
+ // rendered as a "contact". i.e., if 'self' (a "contact" table column) isn't
+ // set in $profile.
+ if (!isset($profile['self']) && $local_user_is_self) {
$profile['edit'] = [DI::baseUrl() . '/settings/profile', DI::l10n()->t('Edit profile'), '', DI::l10n()->t('Edit profile')];
$profile['menu'] = [
'chg_photo' => DI::l10n()->t('Change profile photo'),
}
}
- $p = [];
+ // Expected profile/vcard.tpl profile.* template variables
+ $p = [
+ 'address' => null,
+ 'edit' => null,
+ 'upubkey' => null,
+ ];
foreach ($profile as $k => $v) {
$k = str_replace('-', '_', $k);
$p[$k] = $v;
$today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false);
- $rr['link'] = Contact::magicLink($rr['url']);
+ $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['startime'] = null;
$condition = ['parent-uri' => $rr['uri'], 'uid' => $rr['uid'], 'author-id' => public_contact(),
'vid' => [Verb::getID(Activity::ATTEND), Verb::getID(Activity::ATTENDMAYBE)],
'visible' => true, 'deleted' => false];
- if (!Item::exists($condition)) {
+ if (!Post::exists($condition)) {
continue;
}