diff --git a/mod/common.php b/mod/common.php index 7d9caf8d1e..d4ee97c4ff 100644 --- a/mod/common.php +++ b/mod/common.php @@ -117,14 +117,6 @@ function common_content(App $a) return $o; } - $entries = []; - foreach ($common_friends as $common_friend) { - $contact = Model\Contact::getByURLForUser($common_friend['url'], local_user()); - if (!empty($contact)) { - $entries[] = Module\Contact::getContactTemplateVars($contact); - } - } - $title = ''; $tab_str = ''; if ($cmd === 'loc' && $cid && local_user() == $uid) { @@ -133,6 +125,14 @@ function common_content(App $a) $title = DI::l10n()->t('Common Friends'); } + $entries = []; + foreach ($common_friends as $common_friend) { + $contact = Model\Contact::getByURLForUser($common_friend['url'], local_user()); + if (!empty($contact)) { + $entries[] = Module\Contact::getContactTemplateVars($contact); + } + } + $tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl'); $o .= Renderer::replaceMacros($tpl, [ diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 325183e10b..9bd63f83dd 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -3056,6 +3056,40 @@ class Contact return array_slice($contacts, $start, $limit); } + /** + * Returns a list of all common friends between two given public contact ids. + * + * @param int $cid1 first public contact id + * @param int $cid2 second public contact id + * @return int + */ + public static function countContactsOfContact(int $cid) + { + return DBA::count('contact', + ["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?) + OR `id` IN (SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)", + $cid, $cid] + ); + } + + /** + * Returns a list of all contacts of a given public contact id. + * + * @param int $cid public contact id + * @param int $start optional, default 0 + * @param int $limit optional, default 80 + * @return array + */ + public static function getContactsOfContact(int $cid, int $start = 0, int $limit = 80) + { + return DBA::selectToArray('contact', [], + ["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?) + OR `id` IN (SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)", + $cid, $cid], + ['limit' => [$start, $limit]] + ); + } + /** * Add public contacts from an array * diff --git a/src/Module/AllFriends.php b/src/Module/AllFriends.php index 68a4f304e6..00614a1330 100644 --- a/src/Module/AllFriends.php +++ b/src/Module/AllFriends.php @@ -54,7 +54,7 @@ class AllFriends extends BaseModule $uid = $app->user['uid']; - $contact = Model\Contact::getContactForUser($cid, local_user(), ['name', 'url', 'photo', 'uid', 'id']); + $contact = Model\Contact::getById($cid, ['name', 'url', 'photo', 'uid', 'id']); if (empty($contact)) { throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid contact.')); @@ -63,25 +63,22 @@ class AllFriends extends BaseModule DI::page()['aside'] = ""; Model\Profile::load($app, "", Model\Contact::getByURL($contact["url"], false)); - $total = Model\GContact::countAllFriends(local_user(), $cid); + $total = Model\Contact::countContactsOfContact($cid); $pager = new Pager(DI::l10n(), DI::args()->getQueryString()); - $friends = Model\GContact::allFriends(local_user(), $cid, $pager->getStart(), $pager->getItemsPerPage()); + $friends = Model\Contact::getContactsOfContact($cid, $pager->getStart(), $pager->getItemsPerPage()); if (empty($friends)) { return DI::l10n()->t('No friends to display.'); } + $tab_str = Contact::getTabsHTML($app, $contact, 4); + $entries = []; foreach ($friends as $friend) { - $contact = Model\Contact::getByURLForUser($friend['url'], local_user()); - if (!empty($contact)) { - $entries[] = Contact::getContactTemplateVars($contact); - } + $entries[] = Contact::getContactTemplateVars($friend); } - $tab_str = Contact::getTabsHTML($app, $contact, 4); - $tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl'); return Renderer::replaceMacros($tpl, [ '$tab_str' => $tab_str, diff --git a/src/Module/Contact.php b/src/Module/Contact.php index bf22470ed4..73be9ecab5 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -179,7 +179,7 @@ class Contact extends BaseModule private static function updateContactFromProbe($contact_id) { - $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); + $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => [0, local_user()], 'deleted' => false]); if (!DBA::isResult($contact)) { return; } @@ -257,19 +257,21 @@ class Contact extends BaseModule DI::page()['aside'] = ''; } - $contact_id = null; $contact = null; // @TODO: Replace with parameter from router if ($a->argc == 2 && intval($a->argv[1]) || $a->argc == 3 && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']) ) { $contact_id = intval($a->argv[1]); - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); - if (!DBA::isResult($contact)) { - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0, 'deleted' => false]); + // Ensure to use the user contact when the public contact was provided + $data = Model\Contact::getPublicAndUserContacID($contact_id, local_user()); + if (!empty($data['user']) && ($contact_id == $data['public'])) { + $contact_id = $data['user']; } + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'deleted' => false]); + // Don't display contacts that are about to be deleted if ($contact['network'] == Protocol::PHANTOM) { $contact = false; @@ -384,9 +386,9 @@ class Contact extends BaseModule // NOTREACHED } - if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { + if ($cmd === 'updateprofile') { self::updateContactFromProbe($contact_id); - DI::baseUrl()->redirect('contact/' . $contact_id . '/advanced/'); + DI::baseUrl()->redirect('contact/' . $contact_id); // NOTREACHED } @@ -862,11 +864,19 @@ class Contact extends BaseModule */ public static function getTabsHTML($a, $contact, $active_tab) { + $cid = $pcid = $contact['id']; + $data = Model\Contact::getPublicAndUserContacID($contact['id'], local_user()); + if (!empty($data['user']) && ($contact['id'] == $data['public'])) { + $cid = $data['user']; + } elseif (!empty($data['public'])) { + $pcid = $data['public']; + } + // tabs $tabs = [ [ 'label' => DI::l10n()->t('Status'), - 'url' => "contact/" . $contact['id'] . "/conversations", + 'url' => "contact/" . $cid . "/conversations", 'sel' => (($active_tab == 1) ? 'active' : ''), 'title' => DI::l10n()->t('Conversations started by this contact'), 'id' => 'status-tab', @@ -874,7 +884,7 @@ class Contact extends BaseModule ], [ 'label' => DI::l10n()->t('Posts and Comments'), - 'url' => "contact/" . $contact['id'] . "/posts", + 'url' => "contact/" . $cid . "/posts", 'sel' => (($active_tab == 2) ? 'active' : ''), 'title' => DI::l10n()->t('Status Messages and Posts'), 'id' => 'posts-tab', @@ -882,7 +892,7 @@ class Contact extends BaseModule ], [ 'label' => DI::l10n()->t('Profile'), - 'url' => "contact/" . $contact['id'], + 'url' => "contact/" . $cid, 'sel' => (($active_tab == 3) ? 'active' : ''), 'title' => DI::l10n()->t('Profile Details'), 'id' => 'profile-tab', @@ -891,10 +901,10 @@ class Contact extends BaseModule ]; // Show this tab only if there is visible friend list - $x = Model\GContact::countAllFriends(local_user(), $contact['id']); + $x = Model\Contact::countContactsOfContact($pcid); if ($x) { $tabs[] = ['label' => DI::l10n()->t('Contacts'), - 'url' => "allfriends/" . $contact['id'], + 'url' => "allfriends/" . $pcid, 'sel' => (($active_tab == 4) ? 'active' : ''), 'title' => DI::l10n()->t('View all contacts'), 'id' => 'allfriends-tab', @@ -902,10 +912,10 @@ class Contact extends BaseModule } // Show this tab only if there is visible common friend list - $common = Model\GContact::countCommonFriends(local_user(), $contact['id']); + $common = Model\GContact::countCommonFriends(local_user(), $cid); if ($common) { $tabs[] = ['label' => DI::l10n()->t('Common Friends'), - 'url' => "common/loc/" . local_user() . "/" . $contact['id'], + 'url' => "common/loc/" . local_user() . "/" . $cid, 'sel' => (($active_tab == 5) ? 'active' : ''), 'title' => DI::l10n()->t('View all common friends'), 'id' => 'common-loc-tab', @@ -913,9 +923,9 @@ class Contact extends BaseModule ]; } - if (!empty($contact['uid'])) { + if ($cid != $pcid) { $tabs[] = ['label' => DI::l10n()->t('Advanced'), - 'url' => 'contact/' . $contact['id'] . '/advanced/', + 'url' => 'contact/' . $cid . '/advanced/', 'sel' => (($active_tab == 6) ? 'active' : ''), 'title' => DI::l10n()->t('Advanced Contact Settings'), 'id' => 'advanced-tab', @@ -1011,6 +1021,15 @@ class Contact extends BaseModule { $alt_text = ''; + if (!empty($contact['url']) && isset($contact['uid']) && ($contact['uid'] == 0) && local_user()) { + $personal = Model\Contact::getByURL($contact['url'], false, ['uid', 'rel', 'self'], local_user()); + if (!empty($personal)) { + $contact['uid'] = $personal['uid']; + $contact['rel'] = $personal['rel']; + $contact['self'] = $personal['self']; + } + } + if (!empty($contact['uid']) && !empty($contact['rel'])) { switch ($contact['rel']) { case Model\Contact::FRIEND: @@ -1105,6 +1124,16 @@ class Contact extends BaseModule ]; } + if (in_array($contact['network'], Protocol::FEDERATED)) { + $contact_actions['updateprofile'] = [ + 'label' => DI::l10n()->t('Refetch contact data'), + 'url' => 'contact/' . $contact['id'] . '/updateprofile', + 'title' => '', + 'sel' => '', + 'id' => 'updateprofile', + ]; + } + $contact_actions['block'] = [ 'label' => (intval($contact['blocked']) ? DI::l10n()->t('Unblock') : DI::l10n()->t('Block')), 'url' => 'contact/' . $contact['id'] . '/block', diff --git a/view/theme/frio/templates/contact_edit.tpl b/view/theme/frio/templates/contact_edit.tpl index 55a7891a82..ca585feab0 100644 --- a/view/theme/frio/templates/contact_edit.tpl +++ b/view/theme/frio/templates/contact_edit.tpl @@ -21,7 +21,8 @@