We now handling the contact type

This commit is contained in:
Michael 2019-07-04 19:31:42 +00:00
parent ef5be9668f
commit 8d6aa9914c
4 changed files with 81 additions and 27 deletions

View file

@ -1821,8 +1821,12 @@ class Contact extends BaseObject
This will reliably kill your communication with old Friendica contacts. This will reliably kill your communication with old Friendica contacts.
*/ */
// These fields aren't updated by this routine:
// 'location', 'about', 'keywords', 'gender', 'xmpp', 'unsearchable', 'sensitive'];
$fields = ['avatar', 'uid', 'name', 'nick', 'url', 'addr', 'batch', 'notify', $fields = ['avatar', 'uid', 'name', 'nick', 'url', 'addr', 'batch', 'notify',
'poll', 'request', 'confirm', 'poco', 'network', 'alias', 'baseurl']; 'poll', 'request', 'confirm', 'poco', 'network', 'alias', 'baseurl',
'forum', 'prv', 'contact-type'];
$contact = DBA::selectFirst('contact', $fields, ['id' => $id]); $contact = DBA::selectFirst('contact', $fields, ['id' => $id]);
if (!DBA::isResult($contact)) { if (!DBA::isResult($contact)) {
return false; return false;
@ -1847,13 +1851,26 @@ class Contact extends BaseObject
return false; return false;
} }
if (isset($ret['account-type'])) {
$ret['forum'] = false;
$ret['prv'] = false;
$ret['contact-type'] = $ret['account-type'];
if ($ret['contact-type'] == User::ACCOUNT_TYPE_COMMUNITY) {
$apcontact = APContact::getByURL($ret['url'], false);
if (isset($apcontact['manually-approve'])) {
$ret['forum'] = (bool)!$apcontact['manually-approve'];
$ret['prv'] = (bool)!$ret['forum'];
}
}
}
$update = false; $update = false;
// make sure to not overwrite existing values with blank entries // make sure to not overwrite existing values with blank entries
foreach ($ret as $key => $val) { foreach ($ret as $key => $val) {
if (!array_key_exists($key, $contact)) { if (!array_key_exists($key, $contact)) {
unset($ret[$key]); unset($ret[$key]);
} elseif (($contact[$key] != '') && ($val == '')) { } elseif (($contact[$key] != '') && ($val == '') && !is_bool($ret[$key])) {
$ret[$key] = $contact[$key]; $ret[$key] = $contact[$key];
} elseif ($ret[$key] != $contact[$key]) { } elseif ($ret[$key] != $contact[$key]) {
$update = true; $update = true;
@ -1886,6 +1903,17 @@ class Contact extends BaseObject
return true; return true;
} }
public static function updateFromProbeByURL($url, $force = false)
{
$id = self::getIdForURL($url);
if (empty($id)) {
return;
}
self::updateFromProbe($id, '', $force);
}
/** /**
* Detects if a given contact array belongs to a legacy DFRN connection * Detects if a given contact array belongs to a legacy DFRN connection
* *

View file

@ -913,30 +913,27 @@ class GContact
$old_gcontact = []; $old_gcontact = [];
} }
$gcontact = $contact; $gcontact = [];
// These fields are identical in both contact and gcontact
$fields = ['name', 'nick', 'url', 'nurl', 'location', 'about', 'keywords', 'gender',
'contact-type', 'network', 'addr', 'notify', 'alias', 'created', 'updated'];
foreach ($fields as $field) {
$gcontact[$field] = $contact[$field];
}
// These fields are having different names but the same content // These fields are having different names but the same content
$gcontact['server_url'] = $gcontact['baseurl']; $gcontact['server_url'] = $contact['baseurl'];
unset($gcontact['baseurl']); $gcontact['nsfw'] = $contact['sensitive'];
$gcontact['nsfw'] = $gcontact['sensitive']; $gcontact['hide'] = $contact['unsearchable'];
unset($gcontact['sensitive']); $gcontact['archived'] = $contact['archive'];
$gcontact['hide'] = $gcontact['unsearchable']; $gcontact['archive_date'] = $contact['term-date'];
unset($gcontact['unsearchable']); $gcontact['birthday'] = $contact['bd'];
$gcontact['archived'] = $gcontact['archive']; $gcontact['photo'] = $contact['avatar'];
unset($gcontact['archive']); $gcontact['last_contact'] = $contact['success_update'];
$gcontact['archive_date'] = $gcontact['term-date']; $gcontact['last_failure'] = $contact['failure_update'];
unset($gcontact['term-date']); $gcontact['community'] = ($contact['forum'] || $contact['prv']);
$gcontact['birthday'] = $gcontact['bd'];
unset($gcontact['bd']);
$gcontact['photo'] = $gcontact['avatar'];
unset($gcontact['avatar']);
$gcontact['last_contact'] = $gcontact['success_update'];
unset($gcontact['success_update']);
$gcontact['last_failure'] = $gcontact['failure_update'];
unset($gcontact['failure_update']);
$gcontact['community'] = ($gcontact['forum'] || $gcontact['prv']);
unset($gcontact['forum']);
unset($gcontact['prv']);
foreach (['last_contact', 'last_failure', 'updated'] as $field) { foreach (['last_contact', 'last_failure', 'updated'] as $field) {
if (!empty($old_gcontact[$field]) && ($old_gcontact[$field] >= $gcontact[$field])) { if (!empty($old_gcontact[$field]) && ($old_gcontact[$field] >= $gcontact[$field])) {

View file

@ -45,8 +45,8 @@ class Probe
*/ */
private static function rearrangeData($data) private static function rearrangeData($data)
{ {
$fields = ["name", "nick", "guid", "url", "addr", "alias", $fields = ["name", "nick", "guid", "url", "addr", "alias", "photo",
"photo", "community", "keywords", "location", "about", "account-type", "community", "keywords", "location", "about",
"batch", "notify", "poll", "request", "confirm", "poco", "batch", "notify", "poll", "request", "confirm", "poco",
"priority", "network", "pubkey", "baseurl"]; "priority", "network", "pubkey", "baseurl"];
@ -349,6 +349,8 @@ class Probe
if (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN)) { if (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN)) {
$data = $ap_profile; $data = $ap_profile;
} elseif (!empty($ap_profile)) {
$data = array_merge($ap_profile, $data);
} }
} else { } else {
Logger::notice('Time out detected. AP will not be probed.', ['uri' => $uri]); Logger::notice('Time out detected. AP will not be probed.', ['uri' => $uri]);

View file

@ -8,6 +8,7 @@ use Friendica\Util\JsonLD;
use Friendica\Util\Network; use Friendica\Util\Network;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Model\APContact; use Friendica\Model\APContact;
use Friendica\Model\User;
use Friendica\Util\HTTPSignature; use Friendica\Util\HTTPSignature;
/** /**
@ -88,6 +89,31 @@ class ActivityPub
return $content; return $content;
} }
private static function getAccountType($apcontact)
{
$accounttype = -1;
switch($apcontact['type']) {
case 'Person':
$accounttype = User::ACCOUNT_TYPE_PERSON;
break;
case 'Organization':
$accounttype = User::ACCOUNT_TYPE_ORGANISATION;
break;
case 'Service':
$accounttype = User::ACCOUNT_TYPE_NEWS;
break;
case 'Group':
$accounttype = User::ACCOUNT_TYPE_COMMUNITY;
break;
case 'Application':
$accounttype = User::ACCOUNT_TYPE_RELAY;
break;
}
return $accounttype;
}
/** /**
* Fetches a profile from the given url into an array that is compatible to Probe::uri * Fetches a profile from the given url into an array that is compatible to Probe::uri
* *
@ -112,7 +138,8 @@ class ActivityPub
$profile['addr'] = $apcontact['addr']; $profile['addr'] = $apcontact['addr'];
$profile['alias'] = $apcontact['alias']; $profile['alias'] = $apcontact['alias'];
$profile['photo'] = $apcontact['photo']; $profile['photo'] = $apcontact['photo'];
// $profile['community'] $profile['account-type'] = self::getAccountType($apcontact);
$profile['community'] = ($profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
// $profile['keywords'] // $profile['keywords']
// $profile['location'] // $profile['location']
$profile['about'] = $apcontact['about']; $profile['about'] = $apcontact['about'];