diff --git a/include/conversation.php b/include/conversation.php index 60fa0e4ecd..b8cdd7a061 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -197,10 +197,10 @@ function localize_item(&$item) { } } - $A = '[url=' . Profile::zrl($Alink) . ']' . $Aname . '[/url]'; - $B = '[url=' . Profile::zrl($Blink) . ']' . $Bname . '[/url]'; + $A = '[url=' . Contact::magicLink($Alink) . ']' . $Aname . '[/url]'; + $B = '[url=' . Contact::magicLink($Blink) . ']' . $Bname . '[/url]'; if ($Bphoto != "") { - $Bphoto = '[url=' . Profile::zrl($Blink) . '][img]' . $Bphoto . '[/img][/url]'; + $Bphoto = '[url=' . Contact::magicLink($Blink) . '][img]' . $Bphoto . '[/img][/url]'; } $item['body'] = L10n::t('%1$s is now friends with %2$s', $A, $B)."\n\n\n".$Bphoto; @@ -234,10 +234,10 @@ function localize_item(&$item) { } } - $A = '[url=' . Profile::zrl($Alink) . ']' . $Aname . '[/url]'; - $B = '[url=' . Profile::zrl($Blink) . ']' . $Bname . '[/url]'; + $A = '[url=' . Contact::magicLink($Alink) . ']' . $Aname . '[/url]'; + $B = '[url=' . Contact::magicLink($Blink) . ']' . $Bname . '[/url]'; if ($Bphoto != "") { - $Bphoto = '[url=' . Profile::zrl($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]'; + $Bphoto = '[url=' . Contact::magicLink($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]'; } /* @@ -269,8 +269,8 @@ function localize_item(&$item) { $obj = $r[0]; - $author = '[url=' . Profile::zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]'; - $objauthor = '[url=' . Profile::zrl($obj['author-link']) . ']' . $obj['author-name'] . '[/url]'; + $author = '[url=' . Contact::magicLinkById($item['author-id']) . ']' . $item['author-name'] . '[/url]'; + $objauthor = '[url=' . Contact::magicLinkById($obj['author-id']) . ']' . $obj['author-name'] . '[/url]'; switch ($obj['verb']) { case ACTIVITY_POST: @@ -323,8 +323,8 @@ function localize_item(&$item) { $target = $r[0]; $Bname = $target['author-name']; $Blink = $target['author-link']; - $A = '[url=' . Profile::zrl($Alink) . ']' . $Aname . '[/url]'; - $B = '[url=' . Profile::zrl($Blink) . ']' . $Bname . '[/url]'; + $A = '[url=' . Contact::magicLink($Alink) . ']' . $Aname . '[/url]'; + $B = '[url=' . Contact::magicLink($Blink) . ']' . $Bname . '[/url]'; $P = '[url=' . $target['plink'] . ']' . L10n::t('post/item') . '[/url]'; $item['body'] = L10n::t('%1$s marked %2$s\'s %3$s as favorite', $A, $B, $P)."\n"; } @@ -334,7 +334,7 @@ function localize_item(&$item) { if (preg_match_all('/@\[url=(.*?)\]/is', $item['body'], $matches, PREG_SET_ORDER)) { foreach ($matches as $mtch) { if (!strpos($mtch[1], 'zrl=')) { - $item['body'] = str_replace($mtch[0], '@[url=' . Profile::zrl($mtch[1]) . ']', $item['body']); + $item['body'] = str_replace($mtch[0], '@[url=' . Contact::magicLink($mtch[1]) . ']', $item['body']); } } } @@ -347,16 +347,7 @@ function localize_item(&$item) { } // add sparkle links to appropriate permalinks - - $x = stristr($item['plink'],'/display/'); - if ($x) { - $sparkle = false; - $y = best_link_url($item, $sparkle); - - if (strstr($y, '/redir/')) { - $item['plink'] = $y . '?f=&url=' . $item['plink']; - } - } + $item['plink'] = Contact::magicLinkById($item['author-id'], $item['plink']); } /** @@ -674,16 +665,10 @@ function conversation(App $a, $items, $mode, $update, $preview = false, $order = $tags = \Friendica\Model\Term::populateTagsFromItem($item); - $sp = false; - $profile_link = best_link_url($item, $sp); - if ($profile_link === 'mailbox') { - $profile_link = ''; - } + $profile_link = Contact::magicLinkbyId($item['author-id']); - if ($sp) { + if (strpos($profile_link, 'redir/') === 0) { $sparkle = ' sparkle'; - } else { - $profile_link = Profile::zrl($profile_link); } if (!x($item, 'author-thumb') || ($item['author-thumb'] == "")) { @@ -923,48 +908,6 @@ function conversation_add_children($parents, $block_authors, $order, $uid) { return $items; } -function best_link_url($item, &$sparkle, $url = '') { - - $best_url = ''; - $sparkle = false; - - $clean_url = normalise_link($item['author-link']); - - if (local_user()) { - $condition = [ - 'network' => NETWORK_DFRN, - 'uid' => local_user(), - 'nurl' => normalise_link($clean_url), - 'pending' => false - ]; - $contact = dba::selectFirst('contact', ['id'], $condition); - if (DBM::is_result($contact)) { - $best_url = 'redir/' . $contact['id']; - $sparkle = true; - if ($url != '') { - $hostname = get_app()->get_hostname(); - if (!strstr($url, $hostname)) { - $best_url .= "?url=".$url; - } else { - $best_url = $url; - } - } - } - } - if (!$best_url) { - if ($url != '') { - $best_url = $url; - } elseif (strlen($item['author-link'])) { - $best_url = $item['author-link']; - } else { - $best_url = $item['url']; - } - } - - return $best_url; -} - - function item_photo_menu($item) { $sub_link = ''; $poke_link = ''; @@ -978,11 +921,8 @@ function item_photo_menu($item) { $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;'; } - $sparkle = false; - $profile_link = best_link_url($item, $sparkle); - if ($profile_link === 'mailbox') { - $profile_link = ''; - } + $profile_link = Contact::magicLinkById($item['author-id']); + $sparkle = (strpos($profile_link, 'redir/') === 0); $cid = 0; $network = ''; @@ -1000,7 +940,7 @@ function item_photo_menu($item) { $photos_link = $profile_link . '?url=photos'; $profile_link = $profile_link . '?url=profile'; } else { - $profile_link = Profile::zrl($profile_link); + $profile_link = Contact::magicLink($profile_link); } if ($cid && !$item['self']) { @@ -1088,12 +1028,9 @@ function builtin_activity_puller($item, &$conv_responses) { } if (activity_match($item['verb'], $verb) && ($item['id'] != $item['parent'])) { - $url = $item['author-link']; - if (local_user() && (local_user() == $item['uid']) && ($item['network'] === NETWORK_DFRN) && !$item['self'] && link_compare($item['author-link'], $item['url'])) { - $url = 'redir/' . $item['contact-id']; + $url = Contact::MagicLinkbyId($item['author-id']); + if (strpos($url, 'redir/') === 0) { $sparkle = ' class="sparkle" '; - } else { - $url = Profile::zrl($url); } $url = '' . htmlentities($item['author-name']) . ''; diff --git a/include/text.php b/include/text.php index 53eae1ff33..f145c03e53 100644 --- a/include/text.php +++ b/include/text.php @@ -961,13 +961,9 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) { $redir = false; if ($redirect) { - $redirect_url = 'redir/' . $contact['id']; - if (local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === NETWORK_DFRN)) { - $redir = true; - $url = $redirect_url; + $url = Contact::magicLink($contact['url']); + if (strpos($url, 'redir/') === 0) { $sparkle = ' sparkle'; - } else { - $url = Profile::zrl($url); } } @@ -1300,11 +1296,7 @@ function prepare_body(array &$item, $attach = false, $is_preview = false) foreach ($matches as $mtch) { $mime = $mtch[3]; - if ((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) { - $the_url = 'redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1]; - } else { - $the_url = $mtch[1]; - } + $the_url = Contact::magicLinkById($item['author-id'], $mtch[1]); if (strpos($mime, 'video') !== false) { if (!$vhead) { diff --git a/mod/allfriends.php b/mod/allfriends.php index bf852419d2..d85d3ec9b3 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -70,7 +70,7 @@ function allfriends_content(App $a) } else { $connlnk = System::baseUrl() . '/follow/?url=' . $rr['url']; $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Profile::zrl($rr['url'])], + 'profile' => [L10n::t("View Profile"), Contact::magicLink($rr['url'])], 'follow' => [L10n::t("Connect/Follow"), $connlnk] ]; } diff --git a/mod/contacts.php b/mod/contacts.php index cd9021c17e..9ad7d09b57 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -65,7 +65,7 @@ function contacts_init(App $a) $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ '$name' => htmlentities($a->data['contact']['name']), '$photo' => $a->data['contact']['photo'], - '$url' => ($a->data['contact']['network'] == NETWORK_DFRN) ? "redir/" . $a->data['contact']['id'] : $a->data['contact']['url'], + '$url' => Contact::MagicLink($a->data['contact']['url']), '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), '$network_name' => $networkname, '$network' => L10n::t('Network:'), @@ -536,11 +536,10 @@ function contacts_content(App $a) $relation_text = sprintf($relation_text, htmlentities($contact['name'])); - if (($contact['network'] === NETWORK_DFRN) && ($contact['rel'])) { - $url = "redir/{$contact['id']}"; + $url = Contact::magicLink($contact['url']); + if (strpos($url, 'redir/') === 0) { $sparkle = ' class="sparkle" '; } else { - $url = $contact['url']; $sparkle = ''; } @@ -940,11 +939,11 @@ function _contact_detail_for_template($rr) default: break; } - if (($rr['network'] === NETWORK_DFRN) && ($rr['rel'])) { - $url = "redir/{$rr['id']}"; + + $url = Contact::magicLink($rr['url']); + if (strpos($url, 'redir/') === 0) { $sparkle = ' class="sparkle" '; } else { - $url = $rr['url']; $sparkle = ''; } diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php index ae6017d146..6592bf901f 100644 --- a/mod/dfrn_request.php +++ b/mod/dfrn_request.php @@ -189,7 +189,6 @@ function dfrn_request_post(App $a) } // (ignore reply, nothing we can do it failed) - // Old: goaway(Profile::zrl($dfrn_url)); goaway($forwardurl); return; // NOTREACHED } diff --git a/mod/directory.php b/mod/directory.php index 1179b6c53a..90d7abcc0b 100644 --- a/mod/directory.php +++ b/mod/directory.php @@ -156,7 +156,7 @@ function directory_content(App $a) $location_e = $location; $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Profile::zrl($profile_link)] + 'profile' => [L10n::t("View Profile"), Contact::magicLink($profile_link)] ]; $entry = [ diff --git a/mod/dirfind.php b/mod/dirfind.php index 14ceb6daee..dc86f03a68 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -11,7 +11,6 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Model\Contact; use Friendica\Model\GContact; -use Friendica\Model\Profile; use Friendica\Network\Probe; use Friendica\Protocol\PortableContact; use Friendica\Util\Network; @@ -214,7 +213,7 @@ function dirfind_content(App $a, $prefix = "") { $connlnk = System::baseUrl().'/follow/?url='.(($jj->connect) ? $jj->connect : $jj->url); $conntxt = L10n::t('Connect'); $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Profile::zrl($jj->url)], + 'profile' => [L10n::t("View Profile"), Contact::magicLink($jj->url)], 'follow' => [L10n::t("Connect/Follow"), $connlnk] ]; } @@ -223,7 +222,7 @@ function dirfind_content(App $a, $prefix = "") { $entry = [ 'alt_text' => $alt_text, - 'url' => Profile::magicLink($jj->url), + 'url' => Contact::magicLink($jj->url), 'itemurl' => $itemurl, 'name' => htmlentities($jj->name), 'thumb' => proxy_url($jj->photo, false, PROXY_SIZE_THUMB), diff --git a/mod/hovercard.php b/mod/hovercard.php index 01d9feb1e4..2fb7b8cc78 100644 --- a/mod/hovercard.php +++ b/mod/hovercard.php @@ -72,7 +72,7 @@ function hovercard_content() 'nick' => $contact['nick'], 'addr' => defaults($contact, 'addr', $contact['url']), 'thumb' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB), - 'url' => $cid ? ('redir/' . $cid) : Profile::zrl($contact['url']), + 'url' => Contact::magicLink($contact['url']), 'nurl' => $contact['nurl'], // We additionally store the nurl as identifier 'location' => $contact['location'], 'gender' => $contact['gender'], diff --git a/mod/match.php b/mod/match.php index c5e35031f5..b060074835 100644 --- a/mod/match.php +++ b/mod/match.php @@ -86,14 +86,14 @@ function match_content(App $a) $jj->photo = str_replace("http:///photo/", get_server()."/photo/", $jj->photo); $connlnk = System::baseUrl() . '/follow/?url=' . $jj->url; $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Profile::zrl($jj->url)], + 'profile' => [L10n::t("View Profile"), Contact::magicLink($jj->url)], 'follow' => [L10n::t("Connect/Follow"), $connlnk] ]; $contact_details = Contact::getDetailsByURL($jj->url, local_user()); $entry = [ - 'url' => Profile::zrl($jj->url), + 'url' => Contact::magicLink($jj->url), 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $jj->url), 'name' => $jj->name, 'details' => $contact_details['location'], diff --git a/mod/message.php b/mod/message.php index 6a48eb658e..987babf744 100644 --- a/mod/message.php +++ b/mod/message.php @@ -341,11 +341,8 @@ function message_content(App $a) if ($message['from-url'] == $myprofile) { $from_url = $myprofile; $sparkle = ''; - } elseif ($message['contact-id'] != 0) { - $from_url = 'redir/' . $message['contact-id']; - $sparkle = ' sparkle'; } else { - $from_url = $message['from-url'] . "?zrl=" . urlencode($myprofile); + $from_url = Contact::magicLink($message['from-url']); $sparkle = ' sparkle'; } @@ -470,7 +467,7 @@ function render_messages(array $msg, $t) $rslt .= replace_macros($tpl, [ '$id' => $rr['id'], '$from_name' => $participants, - '$from_url' => (($rr['network'] === NETWORK_DFRN) ? 'redir/' . $rr['contact-id'] : $rr['url']), + '$from_url' => Contact::magicLink($rr['url']), '$from_addr' => $contact['addr'], '$sparkle' => ' sparkle', '$from_photo' => proxy_url($from_photo, false, PROXY_SIZE_THUMB), diff --git a/mod/photos.php b/mod/photos.php index 45e713677a..9bc870ca13 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1538,14 +1538,10 @@ function photos_content(App $a) continue; } - $redirect_url = 'redir/' . $item['cid']; - - if (local_user() && ($item['contact-uid'] == local_user()) - && ($item['network'] == NETWORK_DFRN) && !$item['self']) { - $profile_url = $redirect_url; + $profile_url = Contact::MagicLinkById($item['cid']); + if (strpos($profile_url, 'redir/') === 0) { $sparkle = ' sparkle'; } else { - $profile_url = $item['url']; $sparkle = ''; } diff --git a/mod/randprof.php b/mod/randprof.php index c5154c12d0..18bcb236f8 100644 --- a/mod/randprof.php +++ b/mod/randprof.php @@ -4,6 +4,7 @@ */ use Friendica\App; use Friendica\Core\System; +use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Profile; @@ -12,7 +13,7 @@ function randprof_init(App $a) $x = GContact::getRandomUrl(); if ($x) { - goaway(Profile::zrl($x)); + goaway(Contact::magicLink($x)); } goaway(System::baseUrl() . '/profile'); diff --git a/mod/redir.php b/mod/redir.php index b729238426..e290a29da7 100644 --- a/mod/redir.php +++ b/mod/redir.php @@ -1,89 +1,94 @@ argc > 1) && intval($a->argv[1])) { + $cid = intval($a->argv[1]); + } elseif (local_user() && !empty($con_url)) { + $cid = Contact::getIdForURL($con_url, local_user()); + } else { + $cid = 0; + } - if ($con_url || (local_user() && $a->argc > 1 && intval($a->argv[1]))) { + if (!empty($cid)) { + $fields = ['id', 'uid', 'nurl', 'url', 'name', 'network', 'poll', 'issued-id', 'dfrn-id', 'duplex']; + $contact = dba::selectFirst('contact', $fields, ['id' => $cid, 'uid' => [0, local_user()]]); + if (!DBM::is_result($contact)) { + notice(L10n::t('Contact not found.')); + goaway(System::baseUrl()); + } - if ($con_url) { - $con_url = str_replace('https', 'http', $con_url); + if ($contact['network'] !== NETWORK_DFRN) { + goaway(($url != '' ? $url : $contact['url'])); + } - $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", - dbesc($con_url), - intval(local_user()) - ); + if ($contact['uid'] == 0) { + $contact_url = $contact['url']; + $contact = dba::selectFirst('contact', $fields, ['nurl' => $contact['nurl'], 'uid' => local_user()]); + if (!DBM::is_result($contact)) { + $target_url = ($url != '' ? $url : $contact_url); - if (!DBM::is_result($r)) { - goaway(System::baseUrl()); - } - if ($r[0]['network'] !== NETWORK_DFRN) { - goaway(($url != '' ? $url : $r[0]['url'])); - } - $cid = $r[0]['id']; - } else { - $cid = $a->argv[1]; + $my_profile = Profile::getMyURL(); - $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($cid), - intval(local_user()) - ); + if (!empty($my_profile) && !link_compare($my_profile, $target_url)) { + $separator = strpos($target_url, '?') ? '&' : '?'; - if (!DBM::is_result($r)) { - goaway(System::baseUrl()); - } - if ($r[0]['network'] !== NETWORK_DFRN) { - goaway(($url != '' ? $url : $r[0]['url'])); + $target_url .= $separator . 'zrl=' . urlencode($my_profile); + } + goaway($target_url); + } else { + $cid = $contact['id']; } } - $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']); + $dfrn_id = $orig_id = (($contact['issued-id']) ? $contact['issued-id'] : $contact['dfrn-id']); - if ($r[0]['duplex'] && $r[0]['issued-id']) { - $orig_id = $r[0]['issued-id']; + if ($contact['duplex'] && $contact['issued-id']) { + $orig_id = $contact['issued-id']; $dfrn_id = '1:' . $orig_id; } - if ($r[0]['duplex'] && $r[0]['dfrn-id']) { - $orig_id = $r[0]['dfrn-id']; + if ($contact['duplex'] && $contact['dfrn-id']) { + $orig_id = $contact['dfrn-id']; $dfrn_id = '0:' . $orig_id; } $sec = random_string(); - q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`) - VALUES( %d, %s, '%s', '%s', %d )", - intval(local_user()), - intval($cid), - dbesc($dfrn_id), - dbesc($sec), - intval(time() + 45) - ); + $fields = ['uid' => local_user(), 'cid' => $cid, 'dfrn_id' => $dfrn_id, + 'sec' => $sec, 'expire' => time() + 45]; + dba::insert('profile_check', $fields); - logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG); - $dest = (($url) ? '&destination_url=' . $url : ''); - goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id + logger('mod_redir: ' . $contact['name'] . ' ' . $sec, LOGGER_DEBUG); + + $dest = (!empty($url) ? '&destination_url=' . $url : ''); + + goaway($contact['poll'] . '?dfrn_id=' . $dfrn_id . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest . $quiet); } if (local_user()) { - $handle = $a->user['nickname'] . '@' . substr(System::baseUrl(),strpos(System::baseUrl(),'://')+3); + $handle = $a->user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3); } if (remote_user()) { $handle = $_SESSION['handle']; } - if ($url) { - $url = str_replace('{zid}','&zid=' . $handle,$url); + if (!empty($url)) { + $url = str_replace('{zid}', '&zid=' . $handle, $url); goaway($url); } + notice(L10n::t('Contact not found.')); goaway(System::baseUrl()); } diff --git a/mod/suggest.php b/mod/suggest.php index 5e8dcc5fb7..b1b6e83dac 100644 --- a/mod/suggest.php +++ b/mod/suggest.php @@ -79,7 +79,7 @@ function suggest_content(App $a) { $connlnk = System::baseUrl() . '/follow/?url=' . (($rr['connect']) ? $rr['connect'] : $rr['url']); $ignlnk = System::baseUrl() . '/suggest?ignore=' . $rr['id']; $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Profile::zrl($rr["url"])], + 'profile' => [L10n::t("View Profile"), Contact::magicLink($rr["url"])], 'follow' => [L10n::t("Connect/Follow"), $connlnk], 'hide' => [L10n::t('Ignore/Hide'), $ignlnk] ]; @@ -87,7 +87,7 @@ function suggest_content(App $a) { $contact_details = Contact::getDetailsByURL($rr["url"], local_user(), $rr); $entry = [ - 'url' => Profile::zrl($rr['url']), + 'url' => Contact::magicLink($rr['url']), 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']), 'img_hover' => $rr['url'], 'name' => $contact_details['name'], diff --git a/mod/unfollow.php b/mod/unfollow.php index a26557a9a2..6059c27ab7 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -118,7 +118,7 @@ function unfollow_content(App $a) '$nickname' => "", '$name' => $contact["name"], '$url' => $contact["url"], - '$zrl' => Profile::zrl($contact["url"]), + '$zrl' => Contact::magicLink($contact["url"]), '$url_label' => L10n::t("Profile URL"), '$myaddr' => $myaddr, '$request' => $request, diff --git a/mod/viewcontacts.php b/mod/viewcontacts.php index 7763dc8bf7..af5ecd9d67 100644 --- a/mod/viewcontacts.php +++ b/mod/viewcontacts.php @@ -96,15 +96,6 @@ function viewcontacts_content(App $a) continue; } - $url = $rr['url']; - - // route DFRN profiles through the redirect - if ($is_owner && ($rr['network'] === NETWORK_DFRN) && ($rr['rel'])) { - $url = 'redir/' . $rr['id']; - } else { - $url = Profile::zrl($url); - } - $contact_details = Contact::getDetailsByURL($rr['url'], $a->profile['uid'], $rr); $contacts[] = [ @@ -118,7 +109,7 @@ function viewcontacts_content(App $a) 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], 'account_type' => Contact::getAccountType($contact_details), - 'url' => $url, + 'url' => Contact::magicLink($rr['url']), 'sparkle' => '', 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']), 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), diff --git a/src/Content/ForumManager.php b/src/Content/ForumManager.php index cfd083f9f8..e45dd0c421 100644 --- a/src/Content/ForumManager.php +++ b/src/Content/ForumManager.php @@ -9,6 +9,7 @@ use Friendica\App; use Friendica\Content\Feature; use Friendica\Core\L10n; use Friendica\Core\System; +use Friendica\Model\Contact; use Friendica\Database\DBM; use dba; @@ -107,7 +108,7 @@ class ForumManager $entry = [ 'url' => 'network?f=&cid=' . $contact['id'], - 'external_url' => 'redir/' . $contact['id'], + 'external_url' => Contact::magicLink($contact['url']), 'name' => $contact['name'], 'cid' => $contact['id'], 'selected' => $selected, diff --git a/src/Core/NotificationsManager.php b/src/Core/NotificationsManager.php index 6a13c025c4..6e9d469eb9 100644 --- a/src/Core/NotificationsManager.php +++ b/src/Core/NotificationsManager.php @@ -828,7 +828,7 @@ class NotificationsManager extends BaseObject 'contact_id' => $it['contact-id'], 'photo' => ((x($it, 'fphoto')) ? proxy_url($it['fphoto'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"), 'name' => $it['fname'], - 'url' => Profile::zrl($it['furl']), + 'url' => Contact::magicLink($it['furl']), 'hidden' => $it['hidden'] == 1, 'post_newfriend' => (intval(PConfig::get(local_user(), 'system', 'post_newfriend')) ? '1' : 0), 'knowyou' => $knowyou, @@ -862,7 +862,7 @@ class NotificationsManager extends BaseObject 'hidden' => $it['hidden'] == 1, 'post_newfriend' => (intval(PConfig::get(local_user(), 'system', 'post_newfriend')) ? '1' : 0), 'url' => $it['url'], - 'zrl' => Profile::zrl($it['url']), + 'zrl' => Contact::magicLink($it['url']), 'addr' => $it['gaddr'], 'network' => $it['gnetwork'], 'knowyou' => $it['knowyou'], diff --git a/src/Model/Contact.php b/src/Model/Contact.php index bbfb399238..f4d6f2af0e 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -598,7 +598,7 @@ class Contact extends BaseObject if ($contact['uid'] != $uid) { if ($uid == 0) { - $profile_link = Profile::zrl($contact['url']); + $profile_link = self::magicLink($contact['url']); $menu = ['profile' => [L10n::t('View Profile'), $profile_link, true]]; return $menu; @@ -609,7 +609,7 @@ class Contact extends BaseObject if (DBM::is_result($contact_own)) { return self::photoMenu($contact_own, $uid); } else { - $profile_link = Profile::zrl($contact['url']); + $profile_link = self::magicLink($contact['url']); $connlnk = 'follow/?url=' . $contact['url']; $menu = [ 'profile' => [L10n::t('View Profile'), $profile_link, true], @@ -1686,4 +1686,56 @@ class Contact extends BaseObject $contact_ids = $return; } + + /** + * @brief Returns a magic link to authenticate remote visitors + * + * @param string $contact_url The address of the target contact profile + * @param integer $url An url that we will be redirected to after the authentication + * + * @return string with "redir" link + */ + public static function magicLink($contact_url, $url = '') + { + $cid = self::getIdForURL($contact_url, 0, true); + if (empty($cid)) { + return $url ?: $contact_url; // Equivalent to: ($url != '') ? $url : $contact_url; + } + + return self::magicLinkbyId($cid, $url); + } + + /** + * @brief Returns a magic link to authenticate remote visitors + * + * @param integer $cid The contact id of the target contact profile + * @param integer $url An url that we will be redirected to after the authentication + * + * @return string with "redir" link + */ + public static function magicLinkbyId($cid, $url = '') + { + $contact = dba::selectFirst('contact', ['network', 'url', 'uid'], ['id' => $cid]); + + if ($contact['network'] != NETWORK_DFRN) { + return $url ?: $contact['url']; // Equivalent to ($url != '') ? $url : $contact['url']; + } + + // Only redirections to the same host do make sense + if (($url != '') && (parse_url($url, PHP_URL_HOST) != parse_url($contact['url'], PHP_URL_HOST))) { + return $url; + } + + if ($contact['uid'] != 0) { + return self::magicLink($contact['url'], $url); + } + + $redirect = 'redir/' . $cid; + + if ($url != '') { + $redirect .= '?url=' . $url; + } + + return $redirect; + } } diff --git a/src/Model/Event.php b/src/Model/Event.php index db9e2b9303..1c848dcad7 100644 --- a/src/Model/Event.php +++ b/src/Model/Event.php @@ -868,12 +868,7 @@ class Event extends BaseObject $location = self::locationToArray($item['event-location']); // Construct the profile link (magic-auth). - $sp = false; - $profile_link = best_link_url($item, $sp); - - if (!$sp) { - $profile_link = Profile::zrl($profile_link); - } + $profile_link = Contact::magicLinkById($item['author-id']); $tpl = get_markup_template('event_stream_item.tpl'); $return = replace_macros($tpl, [ diff --git a/src/Model/Profile.php b/src/Model/Profile.php index a2e374e51b..39a89694a8 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -496,7 +496,7 @@ class Profile $p['photo'] = proxy_url($p['photo'], false, PROXY_SIZE_SMALL); } - $p['url'] = self::magicLink($p['url']); + $p['url'] = Contact::magicLink($p['url']); $tpl = get_markup_template('profile_vcard.tpl'); $o .= replace_macros($tpl, [ @@ -594,12 +594,8 @@ class Profile $cids[] = $rr['cid']; $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false); - $url = $rr['url']; - if ($rr['network'] === NETWORK_DFRN) { - $url = System::baseUrl() . '/redir/' . $rr['cid']; - } - $rr['link'] = $url; + $rr['link'] = Contact::magicLink($rr['url']); $rr['title'] = $rr['name']; $rr['date'] = day_translate(DateTimeFormat::convert($rr['start'], $a->timezone, 'UTC', $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . L10n::t('[today]') : ''); $rr['startime'] = null; @@ -1003,29 +999,6 @@ class Profile } } - /** - * @brief Returns a magic link to authenticate remote visitors - * - * @param string $contact_url The address of the contact profile - * @param integer $uid The user id, "local_user" is the default - * - * @return string with "redir" link - */ - public static function magicLink($contact_url, $uid = -1) - { - if ($uid == -1) { - $uid = local_user(); - } - $condition = ['pending' => false, 'uid' => $uid, - 'nurl' => normalise_link($contact_url), - 'network' => NETWORK_DFRN, 'self' => false]; - $contact = dba::selectFirst('contact', ['id'], $condition); - if (DBM::is_result($contact)) { - return System::baseUrl() . '/redir/' . $contact['id']; - } - return self::zrl($contact_url); - } - public static function zrl($s, $force = false) { if (!strlen($s)) { diff --git a/src/Model/Term.php b/src/Model/Term.php index e5490fa7c6..fd44603f97 100644 --- a/src/Model/Term.php +++ b/src/Model/Term.php @@ -196,7 +196,7 @@ class Term $orig_tag = $tag["url"]; - $tag["url"] = best_link_url($item, $sp, $tag["url"]); + $tag["url"] = Contact::magicLinkById($item['author-id'], $tag['url']); if ($tag["type"] == TERM_HASHTAG) { if ($orig_tag != $tag["url"]) { diff --git a/src/Object/Post.php b/src/Object/Post.php index 157f44473d..74dc24b2f3 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -13,7 +13,6 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Database\DBM; use Friendica\Model\Contact; -use Friendica\Model\Profile; use Friendica\Util\DateTimeFormat; use Friendica\Util\Temporal; use dba; @@ -71,7 +70,7 @@ class Post extends BaseObject } $this->writable = $this->getDataValue('writable') || $this->getDataValue('self'); - $this->redirect_url = 'redir/' . $this->getDataValue('cid'); + $this->redirect_url = Contact::magicLinkById($this->getDataValue('cid')); if (!$this->isToplevel()) { $this->threaded = true; @@ -205,16 +204,9 @@ class Post extends BaseObject $profile_name = $item['author-link']; } - $sp = false; - $profile_link = best_link_url($item, $sp); - if ($profile_link === 'mailbox') { - $profile_link = ''; - } - - if ($sp) { + $profile_link = Contact::magicLinkById($item['author-id']); + if (strpos($profile_link, 'redir/') === 0) { $sparkle = ' sparkle'; - } else { - $profile_link = Profile::zrl($profile_link); } if (($item['network'] == NETWORK_FEED) || empty($item['author-thumb'])) { @@ -847,7 +839,7 @@ class Post extends BaseObject // This will have been stored in $a->page_contact by our calling page. // Put this person as the wall owner of the wall-to-wall notice. - $this->owner_url = Profile::zrl($a->page_contact['url']); + $this->owner_url = Contact::magicLink($a->page_contact['url']); $this->owner_photo = $a->page_contact['thumb']; $this->owner_name = $a->page_contact['name']; $this->wall_to_wall = true; @@ -869,14 +861,7 @@ class Post extends BaseObject $this->owner_photo = $this->getDataValue('owner-avatar'); $this->owner_name = $this->getDataValue('owner-name'); $this->wall_to_wall = true; - // If it is our contact, use a friendly redirect link - if ($this->getDataValue('network') === NETWORK_DFRN - && link_compare($this->getDataValue('owner-link'), $this->getDataValue('url')) - ) { - $this->owner_url = $this->getRedirectUrl(); - } else { - $this->owner_url = Profile::zrl($this->getDataValue('owner-link')); - } + $this->owner_url = Contact::magicLinkById($this->getDataValue('owner-id')); } } } diff --git a/view/theme/vier/theme.php b/view/theme/vier/theme.php index c752594653..cc08a7d71f 100644 --- a/view/theme/vier/theme.php +++ b/view/theme/vier/theme.php @@ -17,6 +17,7 @@ use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBM; +use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Profile; @@ -153,7 +154,6 @@ function vier_community_info() foreach ($r as $rr) { $entry = replace_macros($tpl, [ '$id' => $rr['id'], - //'$profile_link' => Profile::zrl($rr['url']), '$profile_link' => 'follow/?url='.urlencode($rr['url']), '$photo' => proxy_url($rr['photo'], false, PROXY_SIZE_MICRO), '$alt_text' => $rr['name'], @@ -234,7 +234,7 @@ function vier_community_info() $entry = [ 'url' => 'network?f=&cid=' . $contact['id'], - 'external_url' => 'redir/' . $contact['id'], + 'external_url' => Contact::magicLink($contact['url']), 'name' => $contact['name'], 'cid' => $contact['id'], 'selected' => $selected, @@ -285,7 +285,7 @@ function vier_community_info() } foreach ($r as $index => $helper) { - $r[$index]["url"] = Profile::zrl($helper["url"]); + $r[$index]["url"] = Contact::magicLink($helper["url"]); } $r[] = ["url" => "help/Quick-Start-guide", "name" => L10n::t("Quick Start")];