From 96342878398e394173ba1a2dd825afbcb19e7199 Mon Sep 17 00:00:00 2001
From: Friendika <info@friendika.com>
Date: Wed, 17 Aug 2011 23:01:44 -0700
Subject: [PATCH] fix several probe related issues

---
 boot.php               | 30 ++++++++-----
 include/Scrape.php     | 95 ++++++++++++++++++++++++++----------------
 include/diaspora.php   |  7 ++++
 mod/hcard.php          | 13 +++---
 mod/profile.php        | 13 +++---
 view/profile_vcard.tpl |  3 +-
 6 files changed, 102 insertions(+), 59 deletions(-)

diff --git a/boot.php b/boot.php
index 09d9f4ef87..050cf10ce8 100644
--- a/boot.php
+++ b/boot.php
@@ -803,8 +803,12 @@ function profile_load(&$a, $nickname, $profile = 0) {
 	if(! (x($a->page,'aside')))
 		$a->page['aside'] = '';
 
-	$a->page['aside'] .= profile_sidebar($a->profile);
-	$a->page['aside'] .= contact_block();
+	$block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+
+	$a->page['aside'] .= profile_sidebar($a->profile, $block);
+
+	if(! $block)
+		$a->page['aside'] .= contact_block();
 
 	return;
 }}
@@ -827,7 +831,7 @@ function profile_load(&$a, $nickname, $profile = 0) {
 
 
 if(! function_exists('profile_sidebar')) {
-function profile_sidebar($profile) {
+function profile_sidebar($profile, $block = 0) {
 
 	$a = get_app();
 
@@ -846,10 +850,9 @@ function profile_sidebar($profile) {
 
 	$tabs = '';
 
-	$photo = '<div id="profile-photo-wrapper"><img class="photo" src="' . $profile['photo'] . '" alt="' . $profile['name'] . '" /></div>';
+	$photo = '<div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="' . $profile['photo'] . '" alt="' . $profile['name'] . '" /></div>';
 
 	// don't show connect link to yourself
-	
 	$connect = (($profile['uid'] != local_user()) ? '<li><a id="dfrn-request-link" href="dfrn_request/' . $profile['nickname'] . '">' . t('Connect') . '</a></li>' : '');
 
 	// don't show connect link to authenticated visitors either
@@ -877,6 +880,7 @@ function profile_sidebar($profile) {
 
 	}
 
+
 	$gender = ((x($profile,'gender') == 1) ? '<div class="mf"><span class="gender-label">' . t('Gender:') . '</span> <span class="x-gender">' . $profile['gender'] . '</span></div><div class="profile-clear"></div>' : '');
 
 	$pubkey = ((x($profile,'pubkey') == 1) ? '<div class="key" style="display:none;">' . $profile['pubkey'] . '</div>' : '');
@@ -885,13 +889,13 @@ function profile_sidebar($profile) {
 
 	$homepage = ((x($profile,'homepage') == 1) ? '<div class="homepage"><span class="homepage-label">' . t('Homepage:') . ' </span><span class="homepage-url">' . linkify($profile['homepage']) . '</span></div><div class="profile-clear"></div>' : '');
 
-	if($profile['hidewall'] && (! local_user()) && (! remote_user())) {
-		$location = $gender = $marital = $homepage = '';
+	if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) {
+		$location = $pdesc = $connect = $gender = $marital = $homepage = '';
 	}
 
 	$podloc = $a->get_baseurl();
 	$searchable = (($profile['publish'] && $profile['net-publish']) ? 'true' : 'false' );
-	$nickname = $profile['nick'];
+	$nickname = $profile['nickname'];
 	$photo300 = $a->get_baseurl() . '/photo/custom/300/' . $profile['uid'] . '.jpg';
 	$photo100 = $a->get_baseurl() . '/photo/custom/100/' . $profile['uid'] . '.jpg';
 	$photo50  = $a->get_baseurl() . '/photo/custom/50/'  . $profile['uid'] . '.jpg';
@@ -902,13 +906,19 @@ function profile_sidebar($profile) {
 <dl class='entity_nickname'>
 <dt>Nickname</dt>
 <dd>
-<a class="nickname url uid" href="$podloc" rel="me">$nickname</a>
+<a class="nickname url uid" href="$podloc/" rel="me">$nickname</a>
+</dd>
+</dl>
+<dl class='entity_fn'>
+<dt>Full name</dt>
+<dd>
+<span class='fn'>$fullname</span>
 </dd>
 </dl>
 <dl class="entity_url">
 <dt>URL</dt>
 <dd>
-<a class="url" href="$podloc" id="pod_location" rel="me">$podloc</a>
+<a class="url" href="$podloc/" id="pod_location" rel="me">$podloc/</a>
 </dd>
 </dl>
 <dl class="entity_photo">
diff --git a/include/Scrape.php b/include/Scrape.php
index dbd98c9ecc..1b319481ba 100644
--- a/include/Scrape.php
+++ b/include/Scrape.php
@@ -44,8 +44,9 @@ function scrape_dfrn($url) {
 		$x = $item->getAttribute('rel');
 		if(($x === 'alternate') && ($item->getAttribute('type') === 'application/atom+xml'))
 			$ret['feed_atom'] = $item->getAttribute('href');
-		if(substr($x,0,5) == "dfrn-")
+		if(substr($x,0,5) == "dfrn-") {
 			$ret[$x] = $item->getAttribute('href');
+		}
 		if($x === 'lrdd') {
 			$decoded = urldecode($item->getAttribute('href'));
 			if(preg_match('/acct:([^@]*)@/',$decoded,$matches))
@@ -55,17 +56,28 @@ function scrape_dfrn($url) {
 
 	// Pull out hCard profile elements
 
+	$largest_photo = 0;
+
 	$items = $dom->getElementsByTagName('*');
 	foreach($items as $item) {
 		if(attribute_contains($item->getAttribute('class'), 'vcard')) {
 			$level2 = $item->getElementsByTagName('*');
 			foreach($level2 as $x) {
-				if(attribute_contains($x->getAttribute('class'),'fn'))
+				if(attribute_contains($x->getAttribute('class'),'fn')) {
 					$ret['fn'] = $x->textContent;
-				if(attribute_contains($x->getAttribute('class'),'photo'))
-					$ret['photo'] = $x->getAttribute('src');
-				if(attribute_contains($x->getAttribute('class'),'key'))
+				}
+				if((attribute_contains($x->getAttribute('class'),'photo'))
+					|| (attribute_contains($x->getAttribute('class'),'avatar'))) {
+					$size = intval($x->getAttribute('width'));
+					// dfrn prefers 175, so if we find this, we set largest_size so it can't be topped.
+					if(($size > $largest_photo) || ($size == 175) || (! $largest_photo)) {
+						$ret['photo'] = $x->getAttribute('src');
+						$largest_photo = (($size == 175) ? 9999 : $size);
+					}
+				}
+				if(attribute_contains($x->getAttribute('class'),'key')) {
 					$ret['key'] = $x->textContent;
+				}
 			}
 		}
 	}
@@ -190,8 +202,9 @@ function scrape_vcard($url) {
 					}
 				}
 				if((attribute_contains($x->getAttribute('class'),'nickname'))
-					|| (attribute_contains($x->getAttribute('class'),'uid')))
+					|| (attribute_contains($x->getAttribute('class'),'uid'))) {
 					$ret['nick'] = $x->textContent;
+				}
 			}
 		}
 	}
@@ -288,8 +301,10 @@ function scrape_feed($url) {
 	return $ret;
 }}
 
+define ( 'PROBE_NORMAL',   0);
+define ( 'PROBE_DIASPORA', 1);
 
-function probe_url($url) {
+function probe_url($url, $mode = PROBE_NORMAL) {
 	require_once('include/email.php');
 
 	$result = array();
@@ -366,7 +381,7 @@ function probe_url($url) {
 				}
 			}
 		}
-		else {
+		elseif($mode == PROBE_NORMAL) {
 
 			// Check email
 
@@ -411,38 +426,46 @@ function probe_url($url) {
 		}
 	}	
 
-	if(strlen($zot)) {
-		$s = fetch_url($zot);
-		if($s) {
-			$j = json_decode($s);
-			if($j) {
-				$network = NETWORK_ZOT;
-				$vcard   = array(
-					'fn'    => $j->fullname, 
-					'nick'  => $j->nickname, 
-					'photo' => $j->photo
-				);
-				$profile  = $j->url;
-				$notify   = $j->post;
-				$pubkey   = $j->pubkey;
-				$poll     = 'N/A';
+	if($mode == PROBE_NORMAL) {
+		if(strlen($zot)) {
+			$s = fetch_url($zot);
+			if($s) {
+				$j = json_decode($s);
+				if($j) {
+					$network = NETWORK_ZOT;
+					$vcard   = array(
+						'fn'    => $j->fullname, 
+						'nick'  => $j->nickname, 
+						'photo' => $j->photo
+					);
+					$profile  = $j->url;
+					$notify   = $j->post;
+					$pubkey   = $j->pubkey;
+					$poll     = 'N/A';
+				}
+			}
+		}
+
+		if(strlen($dfrn)) {
+			$ret = scrape_dfrn($dfrn);
+			if(is_array($ret) && x($ret,'dfrn-request')) {
+				$network = NETWORK_DFRN;
+				$request = $ret['dfrn-request'];
+				$confirm = $ret['dfrn-confirm'];
+				$notify  = $ret['dfrn-notify'];
+				$poll    = $ret['dfrn-poll'];
+
+				$vcard = array();
+				$vcard['fn'] = $ret['fn'];
+				$vcard['nick'] = $ret['nick'];
+				$vcard['photo'] = $ret['photo'];
 			}
 		}
 	}
 
-	if(strlen($dfrn)) {
-		$ret = scrape_dfrn($dfrn);
-		if(is_array($ret) && x($ret,'dfrn-request')) {
-			$network = NETWORK_DFRN;
-			$request = $ret['dfrn-request'];
-			$confirm = $ret['dfrn-confirm'];
-			$notify  = $ret['dfrn-notify'];
-			$poll    = $ret['dfrn-poll'];
-		}
-	}
-
 	if($diaspora && $diaspora_base && $diaspora_guid) {
-		$notify = $diaspora_base . 'receive/post/' . $diaspora_guid;
+		if($mode == PROBE_DIASPORA || ! $notify)
+			$notify = $diaspora_base . 'receive/post/' . $diaspora_guid;
 		if(strpos($url,'@'))
 			$addr = str_replace('acct:', '', $url);
 	}			
@@ -454,7 +477,7 @@ function probe_url($url) {
 			$network  = NETWORK_OSTATUS;
 		$priority = 0;
 
-		if($hcard) {
+		if($hcard && ! $vcard) {
 			$vcard = scrape_vcard($hcard);
 
 			// Google doesn't use absolute url in profile photos
diff --git a/include/diaspora.php b/include/diaspora.php
index e089e3f040..9987c21393 100644
--- a/include/diaspora.php
+++ b/include/diaspora.php
@@ -279,6 +279,13 @@ function diaspora_get_contact_by_handle($uid,$handle) {
 }
 
 function find_person_by_handle($handle) {
+		$r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
+			dbesc(NETWORK_DIASPORA),
+			dbesc($handle)
+		);
+		if(count($r))
+			return $r[0];
+
 		// we don't care about the uid, we just want to save an expensive webfinger probe
 		$r = q("select * from contact where network = '%s' and addr = '%s' LIMIT 1",
 			dbesc(NETWORK_DIASPORA),
diff --git a/mod/hcard.php b/mod/hcard.php
index 5505ca08e6..19e649dcb6 100644
--- a/mod/hcard.php
+++ b/mod/hcard.php
@@ -2,8 +2,7 @@
 
 function hcard_init(&$a) {
 
-	if((get_config('system','block_public')) && (! local_user()) && (! remote_user()))
-		return;
+	$blocked = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
 
 	if($a->argc > 1)
 		$which = $a->argv[1];
@@ -31,10 +30,12 @@ function hcard_init(&$a) {
 		$a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
 	}
 
-	$keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
-	$keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
-	if(strlen($keywords))
-		$a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+	if(! $blocked) {
+		$keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
+		$keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
+		if(strlen($keywords))
+			$a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+	}
 
 	$a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ;
 	$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
diff --git a/mod/profile.php b/mod/profile.php
index a4c6ea7107..2dd5df7585 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -2,8 +2,7 @@
 
 function profile_init(&$a) {
 
-	if((get_config('system','block_public')) && (! local_user()) && (! remote_user()))
-		return;
+	$blocked = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
 
 	if($a->argc > 1)
 		$which = $a->argv[1];
@@ -31,10 +30,12 @@ function profile_init(&$a) {
 		$a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
 	}
 
-	$keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
-	$keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
-	if(strlen($keywords))
-		$a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+	if(! $blocked) {
+		$keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
+		$keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
+		if(strlen($keywords))
+			$a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+	}
 
 	$a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ;
 	$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
diff --git a/view/profile_vcard.tpl b/view/profile_vcard.tpl
index 86655951de..34f265ee67 100644
--- a/view/profile_vcard.tpl
+++ b/view/profile_vcard.tpl
@@ -18,11 +18,12 @@
 
 	$pubkey
 
+$diaspora
+
 </div>
 
 $marital
 
 $homepage
 
-$diaspora