From 2140c2ea37737e591b562cccc71c63e95abd8667 Mon Sep 17 00:00:00 2001 From: friendica Date: Tue, 21 Aug 2012 23:11:27 -0700 Subject: basic hub registration --- boot.php | 6 ++++++ include/zot.php | 45 +++++++++++++++++++++++++-------------------- mod/post.php | 8 ++++---- mod/zfinger.php | 25 ++++++++++++++----------- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/boot.php b/boot.php index 06094e42b..cf9aa3d57 100644 --- a/boot.php +++ b/boot.php @@ -204,6 +204,12 @@ define ( 'NOTIFY_POKE', 0x0200 ); define ( 'NOTIFY_SYSTEM', 0x8000 ); + +define ( 'HUBLOC_FLAGS_PRIMARY', 0x0001); +define ( 'HUBLOC_FLAGS_UNVERIFIED', 0x0002); + + + /** * Tag/term types */ diff --git a/include/zot.php b/include/zot.php index dd5d39ef2..04b84900b 100644 --- a/include/zot.php +++ b/include/zot.php @@ -19,6 +19,7 @@ function zot_new_uid($entity_id) { * Given an array of zot_uid(s), return all distinct hubs * If primary is true, return only primary hubs * Result is ordered by url to assist in batching. + * Return only the first primary hub as there should only be one. * */ @@ -37,8 +38,9 @@ function zot_get_hubloc($arr,$primary = false) { if(! strlen($tmp)) return array(); - $sql_extra = (($primary) ? " and hubloc_primary = 1 " : "" ); - return q("select * from hubloc where hubloc_guid in ( $tmp ) $sql_extra order by hubloc_url"); + $sql_extra = (($primary) ? " and hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) : "" ); + $limit = (($primary) ? " limit 1 " : ""); + return q("select * from hubloc where hubloc_guid in ( $tmp ) $sql_extra order by hubloc_url $limit"); } @@ -85,28 +87,31 @@ function zot_gethub($arr) { } function zot_register_hub($arr) { + $total = 0; if((x($arr,'hub')) && (x($arr,'guid'))) { $x = z_fetch_url($arr['hub'] . '/.well-known/zot-guid/' . $arr['guid']); if($x['success']) { $record = json_decode($x['body']); - if($record->guid === $arr['guid'] && $record->url === $arr['hub']) { - $r = q("insert into hubloc (hubloc_guid, hubloc_primary, hubloc_url, - hubloc_callback, hubloc_sitekey, hubloc_key) - values ( '%s', %d, '%s', '%s', '%s', '%s' )", - dbesc($arr['guid']), - intval($record->primary), - dbesc($record->url), - dbesc($record->callback), - dbesc($record->sitekey), - dbesc($record->key) - ); - - // return the discovery record so we can further process - - if($r) - return $record; + if($record->hub && count($record->hub)) { + foreach($record->hub as $h) { + // store any hubs we don't know about + if( ! zot_gethub(array('hub' => $h->url, 'guid' => $arr['guid']))) { + $r = q("insert into hubloc (hubloc_guid, hubloc_flags, hubloc_url, + hubloc_callback, hubloc_sitekey, hubloc_key) + values ( '%s', %d, '%s', '%s', '%s', '%s' )", + dbesc($arr['guid']), + intval((($h->primary) ? HUBLOC_FLAGS_PRIMARY : 0) | HUBLOC_FLAGS_UNVERIFIED ), + dbesc($h->url), + dbesc($h->callback), + dbesc($h->sitekey), + dbesc($record->key) + ); + if($r) + $total ++; + } + } } } } - return false; -} \ No newline at end of file + return $total; +} diff --git a/mod/post.php b/mod/post.php index c44e6114d..a33c44e57 100644 --- a/mod/post.php +++ b/mod/post.php @@ -15,16 +15,16 @@ function post_post(&$a) { if($msgtype === 'notify') { - $hub = zot_gethub($_REQUEST['guid']); + $hub = zot_gethub($_REQUEST); if(! $hub) { $result = zot_register_hub($_REQUEST); - if(! $result) { + if((! $result) || (! zot_gethub($_REQUEST))) { $ret['message'] = 'Hub not available.'; - json_return_and_dir($ret); + json_return_and_die($ret); } } - // check which hub is primary and take action if mismatched + // check which hub is primary and take action if mismatched // add to receive queue // qreceive_add($_REQUEST); diff --git a/mod/zfinger.php b/mod/zfinger.php index 1da5c613b..77d9555d3 100644 --- a/mod/zfinger.php +++ b/mod/zfinger.php @@ -25,27 +25,30 @@ function zfinger_init(&$a) { $ret['success'] = true; + // Communication details + $ret['guid'] = $e['entity_global_id']; - $ret['url'] = z_root(); - $ret['primary'] = (bool) $e['entity_primary']; - $ret['callback'] = z_root() . '/' . 'post'; - $ret['sitekey'] = get_config('system','pubkey'); - $ret['key'] = $e['pubkey']; + $ret['key'] = $e['pubkey']; + + // array of (verified) hubs this entity uses $ret['hubs'] = array(); $x = zot_get_hubloc(array($e['entity_global_id'])); if($x && count($x)) { foreach($x as $hub) { - $ret['hubs'][] = array( - 'primary' => (bool) $hub['hubloc_primary'], - 'url' => $hub['hubloc_url'], + if(! ($hub['hubloc_flags'] & HUBLOC_FLAGS_UNVERIFIED)) { + $ret['hubs'][] = array( + 'primary' => (($hub['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) ? true : false), + 'url' => $hub['hubloc_url'], 'callback' => $hub['hubloc_callback'], - 'sitekey' => $hub['hubloc_sitekey'] - ); + 'sitekey' => $hub['hubloc_sitekey'] + ); + } } } - // more stuff + + // more stuff, e.g. the basic public profile json_return_and_die($ret); -- cgit v1.2.3