From 61c3ce7a212156a06ee88285c3a76c823d761f1e Mon Sep 17 00:00:00 2001
From: Michael Vogel <icarus@dabo.de>
Date: Thu, 8 Oct 2015 00:25:55 +0200
Subject: [PATCH] Bugfix: The contact names had to be escaped

---
 include/conversation.php  | 30 +++++++++++++++---------------
 include/diaspora.php      |  8 +++++++-
 include/items.php         | 17 +++++++++++++++--
 mod/allfriends.php        |  8 ++++----
 mod/common.php            | 10 +++++-----
 mod/contacts.php          | 12 ++++++------
 mod/crepair.php           |  6 +++---
 mod/network.php           |  8 ++++----
 mod/viewcontacts.php      |  4 ++--
 object/Item.php           |  2 +-
 view/theme/vier/theme.php |  3 ++-
 11 files changed, 64 insertions(+), 44 deletions(-)

diff --git a/include/conversation.php b/include/conversation.php
index 2397014141..bbb0b921a3 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -396,25 +396,25 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
 		$page_writeable = true;
 		if(!$update) {
 			// The special div is needed for liveUpdate to kick in for this page.
-			// We only launch liveUpdate if you aren't filtering in some incompatible 
+			// We only launch liveUpdate if you aren't filtering in some incompatible
 			// way and also you aren't writing a comment (discovered in javascript).
 
 			$live_update_div = '<div id="live-network"></div>' . "\r\n"
-				. "<script> var profile_uid = " . $_SESSION['uid'] 
+				. "<script> var profile_uid = " . $_SESSION['uid']
 				. "; var netargs = '" . substr($a->cmd,8)
 				. '?f='
 				. ((x($_GET,'cid'))    ? '&cid='    . $_GET['cid']    : '')
-				. ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '') 
-				. ((x($_GET,'star'))   ? '&star='   . $_GET['star']   : '') 
-				. ((x($_GET,'order'))  ? '&order='  . $_GET['order']  : '') 
-				. ((x($_GET,'bmark'))  ? '&bmark='  . $_GET['bmark']  : '') 
-				. ((x($_GET,'liked'))  ? '&liked='  . $_GET['liked']  : '') 
-				. ((x($_GET,'conv'))   ? '&conv='   . $_GET['conv']   : '') 
-				. ((x($_GET,'spam'))   ? '&spam='   . $_GET['spam']   : '') 
-				. ((x($_GET,'nets'))   ? '&nets='   . $_GET['nets']   : '') 
-				. ((x($_GET,'cmin'))   ? '&cmin='   . $_GET['cmin']   : '') 
-				. ((x($_GET,'cmax'))   ? '&cmax='   . $_GET['cmax']   : '') 
-				. ((x($_GET,'file'))   ? '&file='   . $_GET['file']   : '') 
+				. ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '')
+				. ((x($_GET,'star'))   ? '&star='   . $_GET['star']   : '')
+				. ((x($_GET,'order'))  ? '&order='  . $_GET['order']  : '')
+				. ((x($_GET,'bmark'))  ? '&bmark='  . $_GET['bmark']  : '')
+				. ((x($_GET,'liked'))  ? '&liked='  . $_GET['liked']  : '')
+				. ((x($_GET,'conv'))   ? '&conv='   . $_GET['conv']   : '')
+				. ((x($_GET,'spam'))   ? '&spam='   . $_GET['spam']   : '')
+				. ((x($_GET,'nets'))   ? '&nets='   . $_GET['nets']   : '')
+				. ((x($_GET,'cmin'))   ? '&cmin='   . $_GET['cmin']   : '')
+				. ((x($_GET,'cmax'))   ? '&cmax='   . $_GET['cmax']   : '')
+				. ((x($_GET,'file'))   ? '&file='   . $_GET['file']   : '')
 
 				. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
 		}
@@ -431,7 +431,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
 				// because browser prefetching might change it on us. We have to deliver it with the page.
 
 				$live_update_div = '<div id="live-profile"></div>' . "\r\n"
-					. "<script> var profile_uid = " . $a->profile['profile_uid'] 
+					. "<script> var profile_uid = " . $a->profile['profile_uid']
 					. "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
 			}
 		}
@@ -441,7 +441,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
 		$page_writeable = true;
 		if(!$update) {
 			$live_update_div = '<div id="live-notes"></div>' . "\r\n"
-				. "<script> var profile_uid = " . local_user() 
+				. "<script> var profile_uid = " . local_user()
 				. "; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
 		}
 	}
diff --git a/include/diaspora.php b/include/diaspora.php
index 3145c52ea3..61a0dfc3cf 100644
--- a/include/diaspora.php
+++ b/include/diaspora.php
@@ -110,6 +110,9 @@ function diaspora_dispatch($importer,$msg,$attempt=1) {
 	elseif($xmlbase->message) {
 		$ret = diaspora_message($importer,$xmlbase->message,$msg);
 	}
+	elseif($xmlbase->participation) {
+		$ret = diaspora_participation($importer,$xmlbase->participation);
+	}
 	else {
 		logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
 	}
@@ -1834,7 +1837,7 @@ function diaspora_message($importer,$xml,$msg) {
 
 	$author_signature = base64_decode($msg_author_signature);
 
-	$person = find_diaspora_person_by_handle($msg_diaspora_handle);	
+	$person = find_diaspora_person_by_handle($msg_diaspora_handle);
 	if(is_array($person) && x($person,'pubkey'))
 		$key = $person['pubkey'];
 	else {
@@ -1881,6 +1884,9 @@ function diaspora_message($importer,$xml,$msg) {
 	return;
 }
 
+function diaspora_participation($importer,$xml) {
+	logger("Unsupported message type 'participation' ".print_r($xml, true));
+}
 
 function diaspora_photo($importer,$xml,$msg,$attempt=1) {
 
diff --git a/include/items.php b/include/items.php
index 0d442e3170..8691ccca49 100644
--- a/include/items.php
+++ b/include/items.php
@@ -1287,11 +1287,24 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
 	}
 
 	if ($arr['network'] == "") {
-		$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-			intval($arr['contact-id']),
+		$r = q("SELECT `network` FROM `contact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
+			dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
+			dbesc(normalise_link($arr['author-link'])),
 			intval($arr['uid'])
 		);
 
+		if(!count($r))
+			$r = q("SELECT `network` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' LIMIT 1",
+				dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
+				dbesc(normalise_link($arr['author-link']))
+			);
+
+		if(!count($r))
+			$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+				intval($arr['contact-id']),
+				intval($arr['uid'])
+			);
+
 		if(count($r))
 			$arr['network'] = $r[0]["network"];
 
diff --git a/mod/allfriends.php b/mod/allfriends.php
index 1a45775fb2..784dfb8771 100644
--- a/mod/allfriends.php
+++ b/mod/allfriends.php
@@ -21,7 +21,7 @@ function allfriends_content(&$a) {
 	);
 
 	$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
-		'$name'  => $c[0]['name'],
+		'$name'  => htmlentities($c[0]['name']),
 		'$photo' => $c[0]['photo'],
 		'url'    => z_root() . '/contacts/' . $cid
 	));
@@ -34,7 +34,7 @@ function allfriends_content(&$a) {
 		return;
 
 	$o .= replace_macros(get_markup_template("section_title.tpl"),array(
-		'$title' => sprintf( t('Friends of %s'), $c[0]['name'])
+		'$title' => sprintf( t('Friends of %s'), htmlentities($c[0]['name']))
 	));
 
 
@@ -48,10 +48,10 @@ function allfriends_content(&$a) {
 	$tpl = get_markup_template('common_friends.tpl');
 
 	foreach($r as $rr) {
-			
+
 		$o .= replace_macros($tpl,array(
 			'$url' => $rr['url'],
-			'$name' => $rr['name'],
+			'$name' => htmlentities($rr['name']),
 			'$photo' => $rr['photo'],
 			'$tags' => ''
 		));
diff --git a/mod/common.php b/mod/common.php
index 3118d12479..1e65137ac6 100644
--- a/mod/common.php
+++ b/mod/common.php
@@ -16,7 +16,7 @@ function common_content(&$a) {
 	if(! $uid)
 		return;
 
-	if($cmd === 'loc' && $cid) {	
+	if($cmd === 'loc' && $cid) {
 		$c = q("select name, url, photo from contact where id = %d and uid = %d limit 1",
 			intval($cid),
 			intval($uid)
@@ -26,10 +26,10 @@ function common_content(&$a) {
 		$c = q("select name, url, photo from contact where self = 1 and uid = %d limit 1",
 			intval($uid)
 		);
-	}	
+	}
 
 	$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
-		'$name' => $c[0]['name'],
+		'$name' => htmlentities($c[0]['name']),
 		'$photo' => $c[0]['photo'],
 		'url' => z_root() . '/contacts/' . $cid
 	));
@@ -97,10 +97,10 @@ function common_content(&$a) {
 	$tpl = get_markup_template('common_friends.tpl');
 
 	foreach($r as $rr) {
-			
+
 		$o .= replace_macros($tpl,array(
 			'$url' => $rr['url'],
-			'$name' => $rr['name'],
+			'$name' => htmlentities($rr['name']),
 			'$photo' => $rr['photo'],
 			'$tags' => ''
 		));
diff --git a/mod/contacts.php b/mod/contacts.php
index 25b22658f2..ee62bf3c9e 100644
--- a/mod/contacts.php
+++ b/mod/contacts.php
@@ -33,7 +33,7 @@ function contacts_init(&$a) {
 	if($contact_id) {
 			$a->data['contact'] = $r[0];
 			$vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"),array(
-				'$name' => $a->data['contact']['name'],
+				'$name' => htmlentities($a->data['contact']['name']),
 				'$photo' => $a->data['contact']['photo'],
 			        '$url' => ($a->data['contact']['network'] == NETWORK_DFRN) ? $a->get_baseurl()."/redir/".$a->data['contact']['id'] : $a->data['contact']['url']
 			));
@@ -432,7 +432,7 @@ function contacts_content(&$a) {
 				}
 
 				$a->page['aside'] = '';
-				
+
 				return replace_macros(get_markup_template('contact_drop_confirm.tpl'), array(
 					'$contact' =>  _contact_detail_for_template($orig_record[0]),
 					'$method' => 'get',
@@ -509,7 +509,7 @@ function contacts_content(&$a) {
 		if(!in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)))
 				$relation_text = "";
 
-		$relation_text = sprintf($relation_text,$contact['name']);
+		$relation_text = sprintf($relation_text,htmlentities($contact['name']));
 
 		if(($contact['network'] === NETWORK_DFRN) && ($contact['rel'])) {
 			$url = "redir/{$contact['id']}";
@@ -632,7 +632,7 @@ function contacts_content(&$a) {
 			'$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'],
 			'$ffi_keyword_blacklist' => array('ffi_keyword_blacklist', t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')),
 			'$photo' => $contact['photo'],
-			'$name' => $contact['name'],
+			'$name' => htmlentities($contact['name']),
 			'$dir_icon' => $dir_icon,
 			'$alt_text' => $alt_text,
 			'$sparkle' => $sparkle,
@@ -842,8 +842,8 @@ function _contact_detail_for_template($rr){
 		'alt_text' => $alt_text,
 		'dir_icon' => $dir_icon,
 		'thumb' => proxy_url($rr['thumb'], false, PROXY_SIZE_THUMB),
-		'name' => $rr['name'],
-		'username' => $rr['name'],
+		'name' => htmlentities($rr['name']),
+		'username' => htmlentities($rr['name']),
 		'sparkle' => $sparkle,
 		'itemurl' => $rr['url'],
 		'url' => $url,
diff --git a/mod/crepair.php b/mod/crepair.php
index 457a06685d..686be3948f 100644
--- a/mod/crepair.php
+++ b/mod/crepair.php
@@ -24,7 +24,7 @@ function crepair_init(&$a) {
 			$a->data['contact'] = $r[0];
                         $tpl = get_markup_template("vcard-widget.tpl");
                         $vcard_widget .= replace_macros($tpl, array(
-                                '$name' => $a->data['contact']['name'],
+                                '$name' => htmlentities($a->data['contact']['name']),
                                 '$photo' => $a->data['contact']['photo']
                         ));
 			$a->page['aside'] .= $vcard_widget;
@@ -179,8 +179,8 @@ function crepair_content(&$a) {
 		'$label_remote_self' => t('Remote Self'),
 		'$allow_remote_self' => $allow_remote_self,
 		'$remote_self' => array('remote_self', t('Mirror postings from this contact'), $contact['remote_self'], t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'), $remote_self_options),
-		'$contact_name' => $contact['name'],
-		'$contact_nick' => $contact['nick'],
+		'$contact_name' => htmlentities($contact['name']),
+		'$contact_nick' => htmlentities($contact['nick']),
 		'$contact_id'   => $contact['id'],
 		'$contact_url'  => $contact['url'],
 		'$request'      => $contact['request'],
diff --git a/mod/network.php b/mod/network.php
index a92e0c691b..3d14455cdf 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -568,14 +568,14 @@ function network_content(&$a, $update = 0) {
 			intval($cid)
 		);
 		if(count($r)) {
-			$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item` 
-					    WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." and deleted = 0 
-					    ORDER BY `item`.`received` DESC) AS `temp1` 
+			$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item`
+					    WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." and deleted = 0
+					    ORDER BY `item`.`received` DESC) AS `temp1`
 					    ON $sql_table.$sql_parent = `temp1`.`parent` ";
 			$sql_extra = "";
 
 			$o = replace_macros(get_markup_template("section_title.tpl"),array(
-				'$title' => sprintf( t('Contact: %s'), $r[0]['name'])
+				'$title' => sprintf( t('Contact: %s'), htmlentities($r[0]['name']))
 			)) . $o;
 
 			if($r[0]['network'] === NETWORK_OSTATUS && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
diff --git a/mod/viewcontacts.php b/mod/viewcontacts.php
index 19bf0415c7..a6bf74b288 100644
--- a/mod/viewcontacts.php
+++ b/mod/viewcontacts.php
@@ -63,8 +63,8 @@ function viewcontacts_content(&$a) {
 			'id' => $rr['id'],
 			'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['name'], $rr['url']),
 			'thumb' => proxy_url($rr['thumb'], false, PROXY_SIZE_THUMB),
-			'name' => substr($rr['name'],0,20),
-			'username' => $rr['name'],
+			'name' => htmlentities(substr($rr['name'],0,20)),
+			'username' => htmlentities($rr['name']),
 			'url' => $url,
 			'sparkle' => '',
 			'itemurl' => $rr['url'],
diff --git a/object/Item.php b/object/Item.php
index 0dc4f41985..cc6d08ec2b 100644
--- a/object/Item.php
+++ b/object/Item.php
@@ -134,7 +134,7 @@ class Item extends BaseObject {
 		$filer = (($conv->get_profile_owner() == local_user()) ? t("save to folder") : false);
 
 		$diff_author    = ((link_compare($item['url'],$item['author-link'])) ? false : true);
-		$profile_name   = (((strlen($item['author-name']))   && $diff_author) ? $item['author-name']   : $item['name']);
+		$profile_name   = htmlentities(((strlen($item['author-name']))   && $diff_author) ? $item['author-name']   : $item['name']);
 		if($item['author-link'] && (! $item['author-name']))
 			$profile_name = $item['author-link'];
 
diff --git a/view/theme/vier/theme.php b/view/theme/vier/theme.php
index ff06b63030..e1a75b9512 100644
--- a/view/theme/vier/theme.php
+++ b/view/theme/vier/theme.php
@@ -84,7 +84,8 @@ function cmtBbClose(id) {
 EOT;
 
 	// Hide the left menu bar
-	if (($a->page['aside'] == "") AND in_array($a->argv[0], array("community", "events", "help", "manage", "notifications", "probe", "webfinger", "login")))
+	if (($a->page['aside'] == "") AND in_array($a->argv[0], array("community", "events", "help", "manage", "notifications",
+									"probe", "webfinger", "login", "invite")))
 		$a->page['htmlhead'] .= "<link rel='stylesheet' href='view/theme/vier/hide.css' />";
 }
 
-- 
2.39.5