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.
*/
// These fields aren't updated by this routine:
// 'location', 'about', 'keywords', 'gender', 'xmpp', 'unsearchable', 'sensitive'];
$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]);
if (!DBA::isResult($contact)) {
return false;
@ -1847,13 +1851,26 @@ class Contact extends BaseObject
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;
// make sure to not overwrite existing values with blank entries
foreach ($ret as $key => $val) {
if (!array_key_exists($key, $contact)) {
unset($ret[$key]);
} elseif (($contact[$key] != '') && ($val == '')) {
} elseif (($contact[$key] != '') && ($val == '') && !is_bool($ret[$key])) {
$ret[$key] = $contact[$key];
} elseif ($ret[$key] != $contact[$key]) {
$update = true;
@ -1886,6 +1903,17 @@ class Contact extends BaseObject
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
*

View file

@ -913,30 +913,27 @@ class 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
$gcontact['server_url'] = $gcontact['baseurl'];
unset($gcontact['baseurl']);
$gcontact['nsfw'] = $gcontact['sensitive'];
unset($gcontact['sensitive']);
$gcontact['hide'] = $gcontact['unsearchable'];
unset($gcontact['unsearchable']);
$gcontact['archived'] = $gcontact['archive'];
unset($gcontact['archive']);
$gcontact['archive_date'] = $gcontact['term-date'];
unset($gcontact['term-date']);
$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']);
$gcontact['server_url'] = $contact['baseurl'];
$gcontact['nsfw'] = $contact['sensitive'];
$gcontact['hide'] = $contact['unsearchable'];
$gcontact['archived'] = $contact['archive'];
$gcontact['archive_date'] = $contact['term-date'];
$gcontact['birthday'] = $contact['bd'];
$gcontact['photo'] = $contact['avatar'];
$gcontact['last_contact'] = $contact['success_update'];
$gcontact['last_failure'] = $contact['failure_update'];
$gcontact['community'] = ($contact['forum'] || $contact['prv']);
foreach (['last_contact', 'last_failure', 'updated'] as $field) {
if (!empty($old_gcontact[$field]) && ($old_gcontact[$field] >= $gcontact[$field])) {

View file

@ -45,8 +45,8 @@ class Probe
*/
private static function rearrangeData($data)
{
$fields = ["name", "nick", "guid", "url", "addr", "alias",
"photo", "community", "keywords", "location", "about",
$fields = ["name", "nick", "guid", "url", "addr", "alias", "photo",
"account-type", "community", "keywords", "location", "about",
"batch", "notify", "poll", "request", "confirm", "poco",
"priority", "network", "pubkey", "baseurl"];
@ -349,6 +349,8 @@ class Probe
if (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN)) {
$data = $ap_profile;
} elseif (!empty($ap_profile)) {
$data = array_merge($ap_profile, $data);
}
} else {
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\Core\Protocol;
use Friendica\Model\APContact;
use Friendica\Model\User;
use Friendica\Util\HTTPSignature;
/**
@ -88,6 +89,31 @@ class ActivityPub
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
*
@ -112,7 +138,8 @@ class ActivityPub
$profile['addr'] = $apcontact['addr'];
$profile['alias'] = $apcontact['alias'];
$profile['photo'] = $apcontact['photo'];
// $profile['community']
$profile['account-type'] = self::getAccountType($apcontact);
$profile['community'] = ($profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
// $profile['keywords']
// $profile['location']
$profile['about'] = $apcontact['about'];