From 0083c16e8798e1029231b21d3b0d632fed1cbc81 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 30 Aug 2017 18:05:41 +0000 Subject: [PATCH 1/2] Better updating of contacts --- include/socgraph.php | 18 ++---------- src/Network/Probe.php | 64 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 28 deletions(-) diff --git a/include/socgraph.php b/include/socgraph.php index d944fa064c..ac7f01bc34 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -2201,21 +2201,9 @@ function update_gcontact($contact) { } if ($contact["server_url"] == "") { - $server_url = $contact["url"]; - - $server_url = matching_url($server_url, $contact["alias"]); - if ($server_url != "") { - $contact["server_url"] = $server_url; - } - - $server_url = matching_url($server_url, $contact["photo"]); - if ($server_url != "") { - $contact["server_url"] = $server_url; - } - - $server_url = matching_url($server_url, $contact["notify"]); - if ($server_url != "") { - $contact["server_url"] = $server_url; + $data = Probe::uri($contact["url"]); + if ($data["network"] != NETWORK_PHANTOM) { + $contact["server_url"] = $data['baseurl']; } } else { $contact["server_url"] = normalise_link($contact["server_url"]); diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 10aac01393..af0895a8f4 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -12,6 +12,7 @@ use Friendica\App; use Friendica\Core\System; use Friendica\Core\Config; +use dba; use dbm; use Cache; use xml; @@ -381,19 +382,52 @@ class Probe { && $data["addr"] && $data["poll"] ) { - q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `addr` = '%s', - `notify` = '%s', `poll` = '%s', `alias` = '%s', `success_update` = '%s' - WHERE `nurl` = '%s' AND NOT `self` AND `uid` = 0", - dbesc($data["name"]), - dbesc($data["nick"]), - dbesc($data["url"]), - dbesc($data["addr"]), - dbesc($data["notify"]), - dbesc($data["poll"]), - dbesc($data["alias"]), - dbesc(datetime_convert()), - dbesc(normalise_link($data['url'])) - ); + $fields = array('name' => $data['name'], + 'nick' => $data['nick'], + 'url' => $data['url'], + 'addr' => $data['addr'], + 'photo' => $data['photo'], + 'keywords' => $data['keywords'], + 'location' => $data['location'], + 'about' => $data['about'], + 'notify' => $data['notify'], + 'network' => $data['network'], + 'server_url' => $data['baseurl'], + 'updated' => dbm::date()); + + foreach ($fields AS $key => $val) { + if (empty($val)) { + unset($fields[$key]); + } + } + + dba::update('gcontact', $fields, array('nurl' => normalise_link($data["url"]))); + + $fields = array('name' => $data['name'], + 'nick' => $data['nick'], + 'url' => $data['url'], + 'addr' => $data['addr'], + 'alias' => $data['alias'], + 'keywords' => $data['keywords'], + 'location' => $data['location'], + 'about' => $data['about'], + 'batch' => $data['batch'], + 'notify' => $data['notify'], + 'poll' => $data['poll'], + 'request' => $data['request'], + 'confirm' => $data['confirm'], + 'poco' => $data['poco'], + 'network' => $data['network'], + 'success_update' => dbm::date()); + + foreach ($fields AS $key => $val) { + if (empty($val)) { + unset($fields[$key]); + } + } + + $condition = array('nurl' => normalise_link($data["url"]), 'self' => false, 'uid' => 0); + dba::update('contact', $fields, $condition); } } @@ -648,6 +682,10 @@ class Probe { } $data = $ret['body']; + // This is a bugfix for this issue: https://github.com/redmatrix/hubzilla/issues/851 + // $data = str_replace('&url=', '&url=', $data); + // we have to decide if we want to create a workaround - or we wait for an update + $xrd = parse_xml_string($data, false); if (!is_object($xrd)) { From 1cc50a80f4e2fc76cfbb64ac8b0c1deb5ac4088b Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 30 Aug 2017 19:33:16 +0000 Subject: [PATCH 2/2] Only update if there is a change --- include/socgraph.php | 4 ++++ src/Network/Probe.php | 24 ++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/socgraph.php b/include/socgraph.php index ac7f01bc34..621085b0ee 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -2200,6 +2200,10 @@ function update_gcontact($contact) { $contact["updated"] = dbm::date(); } + if ($contact["network"] == NETWORK_TWITTER) { + $contact["server_url"] = 'http://twitter.com'; + } + if ($contact["server_url"] == "") { $data = Probe::uri($contact["url"]); if ($data["network"] != NETWORK_PHANTOM) { diff --git a/src/Network/Probe.php b/src/Network/Probe.php index af0895a8f4..f36cdf08ed 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -392,16 +392,25 @@ class Probe { 'about' => $data['about'], 'notify' => $data['notify'], 'network' => $data['network'], - 'server_url' => $data['baseurl'], - 'updated' => dbm::date()); + 'server_url' => $data['baseurl']); + + $fieldnames = array(); foreach ($fields AS $key => $val) { if (empty($val)) { unset($fields[$key]); + } else { + $fieldnames[] = $key; } } - dba::update('gcontact', $fields, array('nurl' => normalise_link($data["url"]))); + $fields['updated'] = dbm::date(); + + $condition = array('nurl' => normalise_link($data["url"])); + + $old_fields = dba::select('gcontact', $fieldnames, $condition, array('limit' => 1)); + + dba::update('gcontact', $fields, $condition, $old_fields); $fields = array('name' => $data['name'], 'nick' => $data['nick'], @@ -420,14 +429,21 @@ class Probe { 'network' => $data['network'], 'success_update' => dbm::date()); + $fieldnames = array(); + foreach ($fields AS $key => $val) { if (empty($val)) { unset($fields[$key]); + } else { + $fieldnames[] = $key; } } $condition = array('nurl' => normalise_link($data["url"]), 'self' => false, 'uid' => 0); - dba::update('contact', $fields, $condition); + + $old_fields = dba::select('contact', $fieldnames, $condition, array('limit' => 1)); + + dba::update('contact', $fields, $condition, $old_fields); } }