improved diaspora discovery

This commit is contained in:
Friendika 2011-08-12 03:01:11 -07:00
parent fda593caed
commit aefc6209a3
3 changed files with 70 additions and 6 deletions

View File

@ -1,6 +1,7 @@
<?php <?php
require_once('library/HTML5/Parser.php'); require_once('library/HTML5/Parser.php');
require_once('include/crypto.php');
if(! function_exists('scrape_dfrn')) { if(! function_exists('scrape_dfrn')) {
function scrape_dfrn($url) { function scrape_dfrn($url) {
@ -171,6 +172,8 @@ function scrape_vcard($url) {
// Pull out hCard profile elements // Pull out hCard profile elements
$largest_photo = 0;
$items = $dom->getElementsByTagName('*'); $items = $dom->getElementsByTagName('*');
foreach($items as $item) { foreach($items as $item) {
if(attribute_contains($item->getAttribute('class'), 'vcard')) { if(attribute_contains($item->getAttribute('class'), 'vcard')) {
@ -179,8 +182,13 @@ function scrape_vcard($url) {
if(attribute_contains($x->getAttribute('class'),'fn')) if(attribute_contains($x->getAttribute('class'),'fn'))
$ret['fn'] = $x->textContent; $ret['fn'] = $x->textContent;
if((attribute_contains($x->getAttribute('class'),'photo')) if((attribute_contains($x->getAttribute('class'),'photo'))
|| (attribute_contains($x->getAttribute('class'),'avatar'))) || (attribute_contains($x->getAttribute('class'),'avatar'))) {
$ret['photo'] = $x->getAttribute('src'); $size = intval($x->getAttribute('width'));
if(($size > $largest_photo) || (! $largest_photo)) {
$ret['photo'] = $x->getAttribute('src');
$largest_photo = $size;
}
}
if((attribute_contains($x->getAttribute('class'),'nickname')) if((attribute_contains($x->getAttribute('class'),'nickname'))
|| (attribute_contains($x->getAttribute('class'),'uid'))) || (attribute_contains($x->getAttribute('class'),'uid')))
$ret['nick'] = $x->textContent; $ret['nick'] = $x->textContent;
@ -289,7 +297,10 @@ function probe_url($url) {
if(! $url) if(! $url)
return $result; return $result;
$diaspora = false; $diaspora = false;
$diaspora_base = '';
$diaspora_guid = '';
$diaspora_key = '';
$email_conversant = false; $email_conversant = false;
$twitter = ((strpos($url,'twitter.com') !== false) ? true : false); $twitter = ((strpos($url,'twitter.com') !== false) ? true : false);
@ -320,8 +331,19 @@ function probe_url($url) {
$hcard = unamp($link['@attributes']['href']); $hcard = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
$profile = unamp($link['@attributes']['href']); $profile = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location') if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location') {
$diaspora_base = unamp($link['@attributes']['href']);
$diaspora = true; $diaspora = true;
}
if($link['@attributes']['rel'] === 'http://joindiaspora.com/guid') {
$diaspora_guid = unamp($link['@attributes']['href']);
$diaspora = true;
}
if($link['@attributes']['rel'] === 'diaspora-public-key') {
$diaspora_key = base64_decode(unamp($link['@attributes']['href']));
$pubkey = rsatopem($diaspora_key);
$diaspora = true;
}
} }
// Status.Net can have more than one profile URL. We need to match the profile URL // Status.Net can have more than one profile URL. We need to match the profile URL
@ -419,8 +441,17 @@ function probe_url($url) {
} }
} }
if($diaspora && $diaspora_base && $diaspora_guid) {
$notify = $diaspora_base . 'receive/post/' . $diaspora_guid;
if(strpos($url,'@'))
$addr = str_replace('acct:', '', $url);
}
if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) { if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
$network = NETWORK_OSTATUS; if($diaspora)
$network = NETWORK_DIASPORA;
else
$network = NETWORK_OSTATUS;
$priority = 0; $priority = 0;
if($hcard) { if($hcard) {

View File

@ -244,6 +244,39 @@ function diaspora_decode($importer,$xml) {
function diaspora_request($importer,$contact,$xml) { function diaspora_request($importer,$contact,$xml) {
$sender_handle = $xml->sender_handle;
$recipient_handle = $xml->recipient_handle;
if(! $sender_handle || ! $recipient_handle)
return;
if($contact) {
q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(CONTACT_IS_FRIEND),
intval($contact['id']),
intval($importer['uid'])
);
// send notification
return;
}
require_once('include/Scrape.php');
$ret = probe_url($sender_handle);
$errors = false;
if((! count($ret)) || ($ret['network'] != NETWORK_DIASPORA)) {
logger('diaspora_request: Cannot resolve diaspora handle ' . $sender_handle . ' for ' . $recipient_handle);
$errors = true;
}
if($errors)
return;
} }
function diaspora_post($importer,$contact,$xml) { function diaspora_post($importer,$contact,$xml) {

View File

@ -71,7 +71,7 @@ function receive_post(&$a) {
$contact = ((count($r)) ? $r[0] : null); $contact = ((count($r)) ? $r[0] : null);
logger('diaspora msg: ' . $msg, LOGGER_DATA);
if($xmlbase->request) { if($xmlbase->request) {
diaspora_request($importer,$contact,$xmlbase->request); diaspora_request($importer,$contact,$xmlbase->request);