diff --git a/boot.php b/boot.php index 7fbd2a6fbd..8492b8be07 100644 --- a/boot.php +++ b/boot.php @@ -2,7 +2,7 @@ set_time_limit(0); -define ( 'BUILD_ID', 1037 ); +define ( 'BUILD_ID', 1038 ); define ( 'FRIENDIKA_VERSION', '2.10.0905' ); define ( 'DFRN_PROTOCOL_VERSION', '2.1' ); @@ -1378,10 +1378,12 @@ function webfinger($s) { logger('webfinger: lrdd template: ' . $tpl); if(strlen($tpl)) { $pxrd = str_replace('{uri}', urlencode('acct:'.$s), $tpl); + logger('webfinger: pxrd: ' . $pxrd); $links = fetch_xrd_links($pxrd); if(! count($links)) { // try with double slashes $pxrd = str_replace('{uri}', urlencode('acct://'.$s), $tpl); + logger('webfinger: pxrd: ' . $pxrd); $links = fetch_xrd_links($pxrd); } return $links; @@ -1453,6 +1455,7 @@ function fetch_lrdd_template($host) { $tpl = ''; $url = 'http://' . $host . '/.well-known/host-meta' ; $links = fetch_xrd_links($url); +logger('template: ' . print_r($links,true)); if(count($links)) { foreach($links as $link) if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd') @@ -1479,15 +1482,30 @@ function fetch_xrd_links($url) { $h = simplexml_load_string($xml); $arr = convert_xml_element_to_array($h); + $links = array(); + if(isset($arr['xrd']['link'])) { $link = $arr['xrd']['link']; if(! isset($link[0])) $links = array($link); else $links = $link; - return $links; } - return array(); + if(isset($arr['xrd']['alias'])) { + $alias = $arr['xrd']['alias']; + if(! isset($alias[0])) + $aliases = array($alias); + else + $aliases = $alias; + foreach($aliases as $alias) { + $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias); + } + } + + logger('fetch_xrd_links: ' . print_r($links,true), LOGGER_DATA); + + return $links; + }} // Convert an ACL array to a storable string diff --git a/database.sql b/database.sql index 83e0e4b6f4..34b8079793 100644 --- a/database.sql +++ b/database.sql @@ -64,7 +64,7 @@ CREATE TABLE IF NOT EXISTS `contact` ( `issued-id` char(255) NOT NULL, `dfrn-id` char(255) NOT NULL, `url` char(255) NOT NULL, - `lrdd` char(255) NOT NULL, + `alias` char(255) NOT NULL, `pubkey` text NOT NULL, `prvkey` text NOT NULL, `request` text NOT NULL, diff --git a/include/items.php b/include/items.php index cffd13a01e..b5bdd78335 100644 --- a/include/items.php +++ b/include/items.php @@ -1128,15 +1128,16 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) { } if(($is_reply) && is_array($contact)) { - + // Have we seen it? If not, import it. $item_id = $item->get_id(); - + $r = q("SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($item_id), intval($importer['uid']) ); + // FIXME update content if 'updated' changes if(count($r)) { $allow = $item->get_item_tags( NAMESPACE_DFRN, 'comment-allow'); @@ -1155,6 +1156,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) { } continue; } + $datarray = get_atom_elements($feed,$item); $force_parent = false; if($contact['network'] === 'stat') { diff --git a/mod/follow.php b/mod/follow.php index 8c1dc348fa..eaee7d5aca 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -15,7 +15,7 @@ function follow_post(&$a) { $email_conversant = false; if($url) { - $links = lrdd($url); + $links = @lrdd($url); if(count($links)) { foreach($links as $link) { if($link['@attributes']['rel'] === NAMESPACE_DFRN) @@ -30,6 +30,26 @@ function follow_post(&$a) { $profile = $link['@attributes']['href']; } + + // Status.Net can have more than one profile URL. We need to match the profile URL + // to a contact on incoming messages to prevent spam, and we won't know which one + // to match. So in case of two, one of them is stored as an alias. Only store URL's + // and not webfinger user@host aliases. If they've got more than two non-email style + // aliases, let's hope we're lucky and get one that matches the feed author-uri because + // otherwise we're screwed. + + foreach($links as $link) { + if($link['@attributes']['rel'] === 'alias') { + if(strpos($link['@attributes']['href'],'@') === false) { + if(isset($profile)) { + if($link['@attributes']['href'] !== $profile) + $alias = $link['@attributes']['href']; + } + else + $profile = $link['@attributes']['href']; + } + } + } } else { if((strpos($orig_url,'@')) && validate_email($orig_url)) { @@ -165,12 +185,13 @@ function follow_post(&$a) { } else { // create contact record - $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`, + $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`, `blocked`, `readonly`, `pending` ) - VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, 0, 0, 0 ) ", + VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, 0, 0, 0 ) ", intval(local_user()), dbesc(datetime_convert()), dbesc($profile), + dbesc($alias), dbesc($notify), dbesc($poll), dbesc($vcard['fn']), diff --git a/mod/item.php b/mod/item.php index 2264ea5b9f..737fe83419 100644 --- a/mod/item.php +++ b/mod/item.php @@ -246,18 +246,20 @@ function item_post(&$a) { ); } if(count($r)) { - if($r[0]['network'] === 'stat') - $stat = true; $profile = $r[0]['url']; - $newname = $r[0]['name']; + if($r[0]['network'] === 'stat') { + $newname = $r[0]['nick']; + $stat = true; + } + else + $newname = $r[0]['name']; if(strlen($inform)) $inform .= ','; $inform .= 'cid:' . $r[0]['id']; } } if($profile) { - if(! $stat) - $body = str_replace('@' . $name, '@' . '[url=' . $profile . ']' . $newname . '[/url]', $body); + $body = str_replace('@' . $name, '@' . '[url=' . $profile . ']' . $newname . '[/url]', $body); $profile = str_replace(',','%2c',$profile); if(strlen($str_tags)) $str_tags .= ','; diff --git a/mod/salmon.php b/mod/salmon.php index 8c7d921c86..885ba470c8 100644 --- a/mod/salmon.php +++ b/mod/salmon.php @@ -177,7 +177,7 @@ function salmon_post(&$a) { * */ - $r = q("SELECT * FROM `contact` WHERE `network` = 'stat' AND ( `url` = '%s' OR `lrdd` = '%s') + $r = q("SELECT * FROM `contact` WHERE `network` = 'stat' AND ( `url` = '%s' OR `alias` = '%s') AND `uid` = %d LIMIT 1", dbesc($author_link), dbesc($author_link), diff --git a/update.php b/update.php index e51e8ac33e..84eaebe185 100644 --- a/update.php +++ b/update.php @@ -363,3 +363,10 @@ function update_1036() { } } } + +function update_1037() { + + q("ALTER TABLE `contact` CHANGE `lrdd` `alias` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL "); + +} +