pull the plug on the old location sync section of import_xchan - this has now been split off into its own function. Cross fingers because this is core functionality which was tried and true, well tested; and now it's a bit different.
Please revert this if the matrix breaks in the next few hours.
This commit is contained in:
parent
b019cbb88a
commit
bcc9057d8c
180
include/zot.php
180
include/zot.php
@ -661,6 +661,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
|
||||
}
|
||||
|
||||
$xchan_hash = make_xchan_hash($arr['guid'],$arr['guid_sig']);
|
||||
$arr['hash'] = $xchan_hash;
|
||||
|
||||
$import_photos = false;
|
||||
|
||||
if(! rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$arr['key'])) {
|
||||
@ -843,174 +845,16 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
|
||||
// what we are missing for true hub independence is for any changes in the primary hub to
|
||||
// get reflected not only in the hublocs, but also to update the URLs and addr in the appropriate xchan
|
||||
|
||||
if($arr['locations']) {
|
||||
|
||||
$xisting = q("select hubloc_id, hubloc_url, hubloc_sitekey from hubloc where hubloc_hash = '%s'",
|
||||
dbesc($xchan_hash)
|
||||
);
|
||||
|
||||
// See if a primary is specified
|
||||
|
||||
$has_primary = false;
|
||||
foreach($arr['locations'] as $location) {
|
||||
if($location['primary']) {
|
||||
$has_primary = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($arr['locations'] as $location) {
|
||||
if(! rsa_verify($location['url'],base64url_decode($location['url_sig']),$arr['key'])) {
|
||||
logger('import_xchan: Unable to verify site signature for ' . $location['url']);
|
||||
$ret['message'] .= sprintf( t('Unable to verify site signature for %s'), $location['url']) . EOL;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ensure that they have one primary hub
|
||||
|
||||
if(! $has_primary)
|
||||
$location['primary'] = true;
|
||||
|
||||
|
||||
for($x = 0; $x < count($xisting); $x ++) {
|
||||
if(($xisting[$x]['hubloc_url'] === $location['url']) && ($xisting[$x]['hubloc_sitekey'] === $location['sitekey'])) {
|
||||
$xisting[$x]['updated'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(! $location['sitekey']) {
|
||||
logger('import_xchan: empty hubloc sitekey. ' . print_r($location,true));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Catch some malformed entries from the past which still exist
|
||||
|
||||
if(strpos($location['address'],'/') !== false)
|
||||
$location['address'] = substr($location['address'],0,strpos($location['address'],'/'));
|
||||
|
||||
// match as many fields as possible in case anything at all changed.
|
||||
|
||||
$r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_host = '%s' and hubloc_addr = '%s' and hubloc_callback = '%s' and hubloc_sitekey = '%s' ",
|
||||
dbesc($xchan_hash),
|
||||
dbesc($arr['guid']),
|
||||
dbesc($arr['guid_sig']),
|
||||
dbesc($location['url']),
|
||||
dbesc($location['url_sig']),
|
||||
dbesc($location['host']),
|
||||
dbesc($location['address']),
|
||||
dbesc($location['callback']),
|
||||
dbesc($location['sitekey'])
|
||||
);
|
||||
if($r) {
|
||||
logger('import_xchan: hub exists: ' . $location['url']);
|
||||
// update connection timestamp if this is the site we're talking to
|
||||
if($location['url'] == $arr['site']['url']) {
|
||||
q("update hubloc set hubloc_connected = '%s', hubloc_updated = '%s' where hubloc_id = %d limit 1",
|
||||
dbesc(datetime_convert()),
|
||||
dbesc(datetime_convert()),
|
||||
intval($r[0]['hubloc_id'])
|
||||
);
|
||||
}
|
||||
if($r[0]['hubloc_status'] & HUBLOC_OFFLINE) {
|
||||
q("update hubloc set hubloc_status = (hubloc_status ^ %d) where hubloc_id = %d limit 1",
|
||||
intval(HUBLOC_OFFLINE),
|
||||
intval($r[0]['hubloc_id'])
|
||||
);
|
||||
if($r[0]['hubloc_flags'] & HUBLOC_FLAGS_ORPHANCHECK) {
|
||||
q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where hubloc_id = %d limit 1",
|
||||
intval(HUBLOC_FLAGS_ORPHANCHECK),
|
||||
intval($r[0]['hubloc_id'])
|
||||
);
|
||||
}
|
||||
q("update xchan set xchan_flags = (xchan_flags ^ %d) where (xchan_flags & %d) and xchan_hash = '%s' limit 1",
|
||||
intval(XCHAN_FLAGS_ORPHAN),
|
||||
intval(XCHAN_FLAGS_ORPHAN),
|
||||
dbesc($xchan_hash)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// Remove pure duplicates
|
||||
if(count($r) > 1) {
|
||||
for($h = 1; $h < count($r); $h ++) {
|
||||
q("delete from hubloc where hubloc_id = %d limit 1",
|
||||
intval($r[$h]['hubloc_id'])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if((($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && (! $location['primary']))
|
||||
|| ((! ($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY)) && ($location['primary']))) {
|
||||
$r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_id = %d limit 1",
|
||||
intval(HUBLOC_FLAGS_PRIMARY),
|
||||
dbesc(datetime_convert()),
|
||||
intval($r[0]['hubloc_id'])
|
||||
);
|
||||
$what = 'primary_hub ';
|
||||
$changed = true;
|
||||
}
|
||||
if((($r[0]['hubloc_flags'] & HUBLOC_FLAGS_DELETED) && (! $location['deleted']))
|
||||
|| ((! ($r[0]['hubloc_flags'] & HUBLOC_FLAGS_DELETED)) && ($location['deleted']))) {
|
||||
$r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_id = %d limit 1",
|
||||
intval(HUBLOC_FLAGS_DELETED),
|
||||
dbesc(datetime_convert()),
|
||||
intval($r[0]['hubloc_id'])
|
||||
);
|
||||
$what = 'delete_hub ';
|
||||
$changed = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// new hub claiming to be primary. Make it so.
|
||||
|
||||
if(intval($location['primary'])) {
|
||||
$r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_hash = '%s' and (hubloc_flags & %d )",
|
||||
intval(HUBLOC_FLAGS_PRIMARY),
|
||||
dbesc(datetime_convert()),
|
||||
dbesc($xchan_hash),
|
||||
intval(HUBLOC_FLAGS_PRIMARY)
|
||||
);
|
||||
}
|
||||
logger('import_xchan: new hub: ' . $location['url']);
|
||||
$r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_network, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_updated, hubloc_connected)
|
||||
values ( '%s','%s','%s','%s', '%s', %d ,'%s','%s','%s','%s','%s','%s','%s')",
|
||||
dbesc($arr['guid']),
|
||||
dbesc($arr['guid_sig']),
|
||||
dbesc($xchan_hash),
|
||||
dbesc($location['address']),
|
||||
dbesc('zot'),
|
||||
intval((intval($location['primary'])) ? HUBLOC_FLAGS_PRIMARY : 0),
|
||||
dbesc($location['url']),
|
||||
dbesc($location['url_sig']),
|
||||
dbesc($location['host']),
|
||||
dbesc($location['callback']),
|
||||
dbesc($location['sitekey']),
|
||||
dbesc(datetime_convert()),
|
||||
dbesc(datetime_convert())
|
||||
);
|
||||
$what .= 'newhub ';
|
||||
$changed = true;
|
||||
|
||||
}
|
||||
|
||||
// get rid of any hubs we have for this channel which weren't reported.
|
||||
// This was needed at one time to resolve complicated cross-site inconsistencies, but can cause sync conflict.
|
||||
// currently disabled.
|
||||
|
||||
// if($xisting) {
|
||||
// foreach($xisting as $x) {
|
||||
// if(! array_key_exists('updated',$x)) {
|
||||
// logger('import_xchan: removing unreferenced hub location ' . $x['hubloc_url']);
|
||||
// $r = q("delete from hubloc where hubloc_id = %d limit 1",
|
||||
// intval($x['hubloc_id'])
|
||||
// );
|
||||
// $what .= 'removed_hub';
|
||||
// $changed = true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
$s = sync_locations($arr,$arr);
|
||||
|
||||
if($s) {
|
||||
if($s['change_message'])
|
||||
$what .= $s['change_message'];
|
||||
if($s['changed'])
|
||||
$changed = $s['changed'];
|
||||
if($s['message'])
|
||||
$ret['message'] .= $s['message'];
|
||||
}
|
||||
|
||||
// Which entries in the update table are we interested in updating?
|
||||
@ -1967,7 +1811,7 @@ function sync_locations($sender,$arr,$absolute = false) {
|
||||
intval(HUBLOC_FLAGS_PRIMARY)
|
||||
);
|
||||
}
|
||||
logger('location_delivery: new hub: ' . $location['url']);
|
||||
logger('sync_locations: new hub: ' . $location['url']);
|
||||
$r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_network, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_updated, hubloc_connected)
|
||||
values ( '%s','%s','%s','%s', '%s', %d ,'%s','%s','%s','%s','%s','%s','%s')",
|
||||
dbesc($sender['guid']),
|
||||
@ -1994,7 +1838,7 @@ function sync_locations($sender,$arr,$absolute = false) {
|
||||
if($absolute && $xisting) {
|
||||
foreach($xisting as $x) {
|
||||
if(! array_key_exists('updated',$x)) {
|
||||
logger('import_xchan: removing unreferenced hub location ' . $x['hubloc_url']);
|
||||
logger('sync_locations: removing unreferenced hub location ' . $x['hubloc_url']);
|
||||
$r = q("delete from hubloc where hubloc_id = %d limit 1",
|
||||
intval($x['hubloc_id'])
|
||||
);
|
||||
|
Reference in New Issue
Block a user