DFRN-Import is now nearly complete, changed namespace constants

This commit is contained in:
Michael Vogel 2016-01-29 23:14:01 +01:00
parent 1cdcb9fc2e
commit decaac6c31
3 changed files with 248 additions and 92 deletions

View file

@ -386,15 +386,15 @@ class dfrn {
$root = $doc->createElementNS(NS_ATOM, 'feed'); $root = $doc->createElementNS(NS_ATOM, 'feed');
$doc->appendChild($root); $doc->appendChild($root);
$root->setAttribute("xmlns:thr", NS_THR); $root->setAttribute("xmlns:thr", NAMESPACE_THREAD);
$root->setAttribute("xmlns:at", "http://purl.org/atompub/tombstones/1.0"); $root->setAttribute("xmlns:at", NAMESPACE_TOMB);
$root->setAttribute("xmlns:media", NS_MEDIA); $root->setAttribute("xmlns:media", NAMESPACE_MEDIA);
$root->setAttribute("xmlns:dfrn", "http://purl.org/macgirvin/dfrn/1.0"); $root->setAttribute("xmlns:dfrn", NAMESPACE_DFRN);
$root->setAttribute("xmlns:activity", NS_ACTIVITY); $root->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
$root->setAttribute("xmlns:georss", NS_GEORSS); $root->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
$root->setAttribute("xmlns:poco", NS_POCO); $root->setAttribute("xmlns:poco", NAMESPACE_POCO);
$root->setAttribute("xmlns:ostatus", NS_OSTATUS); $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
$root->setAttribute("xmlns:statusnet", NS_STATUSNET); $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
xml_add_element($doc, $root, "id", app::get_baseurl()."/profile/".$owner["nick"]); xml_add_element($doc, $root, "id", app::get_baseurl()."/profile/".$owner["nick"]);
xml_add_element($doc, $root, "title", $owner["name"]); xml_add_element($doc, $root, "title", $owner["name"]);

View file

@ -263,57 +263,215 @@ $onlyfetch = true; // Test
return($objxml); return($objxml);
} }
private function process_mail($header, $xpath, $mail, $importer, $contact) { private function process_mail($xpath, $mail, $importer) {
$msg = array(); $msg = array();
$msg["uid"] = $importer['importer_uid']; $msg["uid"] = $importer['importer_uid'];
$msg["from-name"] = $xpath->query('dfrn:sender/dfrn:name/text()', $mail)->item(0)->nodeValue; $msg["from-name"] = $xpath->query('dfrn:sender/dfrn:name/text()', $mail)->item(0)->nodeValue;
$msg["from-url"] = $xpath->query('dfrn:sender/dfrn:uri/text()', $mail)->item(0)->nodeValue; $msg["from-url"] = $xpath->query('dfrn:sender/dfrn:uri/text()', $mail)->item(0)->nodeValue;
$msg["from-photo"] = $xpath->query('dfrn:sender/dfrn:avatar/text()', $mail)->item(0)->nodeValue; $msg["from-photo"] = $xpath->query('dfrn:sender/dfrn:avatar/text()', $mail)->item(0)->nodeValue;
$msg["contact-id"] = $importer["id"]; $msg["contact-id"] = $importer["id"];
$msg["uri"] = $xpath->query('dfrn:id/text()', $mail)->item(0)->nodeValue; $msg["uri"] = $xpath->query('dfrn:id/text()', $mail)->item(0)->nodeValue;
$msg["parent-uri"] = $xpath->query('dfrn:in-reply-to/text()', $mail)->item(0)->nodeValue; $msg["parent-uri"] = $xpath->query('dfrn:in-reply-to/text()', $mail)->item(0)->nodeValue;
$msg["created"] = $xpath->query('dfrn:sentdate/text()', $mail)->item(0)->nodeValue; $msg["created"] = $xpath->query('dfrn:sentdate/text()', $mail)->item(0)->nodeValue;
$msg["title"] = $xpath->query('dfrn:subject/text()', $mail)->item(0)->nodeValue; $msg["title"] = $xpath->query('dfrn:subject/text()', $mail)->item(0)->nodeValue;
$msg["body"] = $xpath->query('dfrn:content/text()', $mail)->item(0)->nodeValue; $msg["body"] = $xpath->query('dfrn:content/text()', $mail)->item(0)->nodeValue;
$msg["seen"] = 0; $msg["seen"] = 0;
$msg["replied"] = 0; $msg["replied"] = 0;
dbesc_array($msg); dbesc_array($msg);
//$r = dbq("INSERT INTO `mail` (`" . implode("`, `", array_keys($msg)) $r = dbq("INSERT INTO `mail` (`".implode("`, `", array_keys($msg))."`) VALUES ('".implode("', '", array_values($msg))."')");
// . "`) VALUES ('" . implode("', '", array_values($msg)) . "')" );
print_r($msg); // send notifications.
// send notifications. $notif_params = array(
'type' => NOTIFY_MAIL,
'notify_flags' => $importer['notify-flags'],
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
'uid' => $importer['importer_uid'],
'item' => $msg,
'source_name' => $msg['from-name'],
'source_link' => $importer['url'],
'source_photo' => $importer['thumb'],
'verb' => ACTIVITY_POST,
'otype' => 'mail'
);
require_once('include/enotify.php'); notification($notif_params);
}
$notif_params = array( private function process_suggestion($xpath, $suggestion, $importer) {
'type' => NOTIFY_MAIL,
'notify_flags' => $importer['notify-flags'],
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
'uid' => $importer['importer_uid'],
'item' => $msg,
'source_name' => $msg['from-name'],
'source_link' => $importer['url'],
'source_photo' => $importer['thumb'],
'verb' => ACTIVITY_POST,
'otype' => 'mail'
);
// notification($notif_params); $suggest = array();
print_r($notif_params); $suggest["uid"] = $importer["importer_uid"];
$suggest["cid"] = $importer["id"];
$suggest["url"] = $xpath->query('dfrn:url/text()', $suggestion)->item(0)->nodeValue;
$suggest["name"] = $xpath->query('dfrn:name/text()', $suggestion)->item(0)->nodeValue;
$suggest["photo"] = $xpath->query('dfrn:photo/text()', $suggestion)->item(0)->nodeValue;
$suggest["request"] = $xpath->query('dfrn:request/text()', $suggestion)->item(0)->nodeValue;
$suggest["note"] = $xpath->query('dfrn:note/text()', $suggestion)->item(0)->nodeValue;
// Does our member already have a friend matching this description?
$r = q("SELECT `id` FROM `contact` WHERE `name` = '%s' AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
dbesc($suggest["name"]),
dbesc(normalise_link($suggest["url"])),
intval($suggest["uid"])
);
if(count($r))
return false;
// Do we already have an fcontact record for this person?
$fid = 0;
$r = q("SELECT `id` FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1",
dbesc($suggest["url"]),
dbesc($suggest["name"]),
dbesc($suggest["request"])
);
if(count($r)) {
$fid = $r[0]["id"];
// OK, we do. Do we already have an introduction for this person ?
$r = q("SELECT `id` FROM `intro` WHERE `uid` = %d AND `fid` = %d LIMIT 1",
intval($suggest["uid"]),
intval($fid)
);
if(count($r))
return false;
}
if(!$fid)
$r = q("INSERT INTO `fcontact` (`name`,`url`,`photo`,`request`) VALUES ('%s', '%s', '%s', '%s')",
dbesc($suggest["name"]),
dbesc($suggest["url"]),
dbesc($suggest["photo"]),
dbesc($suggest["request"])
);
$r = q("SELECT `id` FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1",
dbesc($suggest["url"]),
dbesc($suggest["name"]),
dbesc($suggest["request"])
);
if(count($r))
$fid = $r[0]["id"];
else
// database record did not get created. Quietly give up.
return false;
$hash = random_string();
$r = q("INSERT INTO `intro` (`uid`, `fid`, `contact-id`, `note`, `hash`, `datetime`, `blocked`)
VALUES(%d, %d, %d, '%s', '%s', '%s', %d)",
intval($suggest["uid"]),
intval($fid),
intval($suggest["cid"]),
dbesc($suggest["body"]),
dbesc($hash),
dbesc(datetime_convert()),
intval(0)
);
notification(array(
'type' => NOTIFY_SUGGEST,
'notify_flags' => $importer["notify-flags"],
'language' => $importer["language"],
'to_name' => $importer["username"],
'to_email' => $importer["email"],
'uid' => $importer["importer_uid"],
'item' => $suggest,
'link' => App::get_baseurl()."/notifications/intros",
'source_name' => $importer["name"],
'source_link' => $importer["url"],
'source_photo' => $importer["photo"],
'verb' => ACTIVITY_REQ_FRIEND,
'otype' => "intro"
));
return true;
} }
private function process_suggestion($header, $xpath, $suggestion, $importer, $contact) { private function process_relocation($xpath, $relocation, $importer) {
}
private function process_relocation($header, $xpath, $relocation, $importer, $contact) { $relocate = array();
$relocate["uid"] = $importer["importer_uid"];
$relocate["cid"] = $importer["id"];
$relocate["url"] = $xpath->query('dfrn:url/text()', $relocation)->item(0)->nodeValue;
$relocate["name"] = $xpath->query('dfrn:name/text()', $relocation)->item(0)->nodeValue;
$relocate["photo"] = $xpath->query('dfrn:photo/text()', $relocation)->item(0)->nodeValue;
$relocate["thumb"] = $xpath->query('dfrn:thumb/text()', $relocation)->item(0)->nodeValue;
$relocate["micro"] = $xpath->query('dfrn:micro/text()', $relocation)->item(0)->nodeValue;
$relocate["request"] = $xpath->query('dfrn:request/text()', $relocation)->item(0)->nodeValue;
$relocate["confirm"] = $xpath->query('dfrn:confirm/text()', $relocation)->item(0)->nodeValue;
$relocate["notify"] = $xpath->query('dfrn:notify/text()', $relocation)->item(0)->nodeValue;
$relocate["poll"] = $xpath->query('dfrn:poll/text()', $relocation)->item(0)->nodeValue;
$relocate["sitepubkey"] = $xpath->query('dfrn:sitepubkey/text()', $relocation)->item(0)->nodeValue;
// update contact
$r = q("SELECT `photo`, `url` FROM `contact` WHERE `id` = %d AND `uid` = %d;",
intval($importer["id"]),
intval($importer["importer_uid"]));
if (!$r)
return false;
$old = $r[0];
$x = q("UPDATE `contact` SET
`name` = '%s',
`photo` = '%s',
`thumb` = '%s',
`micro` = '%s',
`url` = '%s',
`nurl` = '%s',
`request` = '%s',
`confirm` = '%s',
`notify` = '%s',
`poll` = '%s',
`site-pubkey` = '%s'
WHERE `id` = %d AND `uid` = %d;",
dbesc($relocate["name"]),
dbesc($relocate["photo"]),
dbesc($relocate["thumb"]),
dbesc($relocate["micro"]),
dbesc($relocate["url"]),
dbesc(normalise_link($relocate["url"])),
dbesc($relocate["request"]),
dbesc($relocate["confirm"]),
dbesc($relocate["notify"]),
dbesc($relocate["poll"]),
dbesc($relocate["sitepubkey"]),
intval($importer["id"]),
intval($importer["importer_uid"]));
if ($x === false)
return false;
// update items
$fields = array(
'owner-link' => array($old["url"], $relocate["url"]),
'author-link' => array($old["url"], $relocate["url"]),
'owner-avatar' => array($old["photo"], $relocate["photo"]),
'author-avatar' => array($old["photo"], $relocate["photo"]),
);
foreach ($fields as $n=>$f){
$x = q("UPDATE `item` SET `%s` = '%s' WHERE `%s` = '%s' AND `uid` = %d",
$n, dbesc($f[1]),
$n, dbesc($f[0]),
intval($importer["importer_uid"]));
if ($x === false)
return false;
}
/// @TODO
/// merge with current record, current contents have priority
/// update record, set url-updated
/// update profile photos
/// schedule a scan?
return true;
} }
private function process_entry($header, $xpath, $entry, $importer, $contact) { private function process_entry($header, $xpath, $entry, $importer, $contact) {
@ -511,7 +669,11 @@ print_r($notif_params);
return $item_id; return $item_id;
} }
function import($xml,$importer,&$contact, &$hub) { private function process_deletion($header, $xpath, $entry, $importer, $contact) {
die("blubb");
}
function import($xml,$importer) {
$a = get_app(); $a = get_app();
@ -524,16 +686,19 @@ print_r($notif_params);
@$doc->loadXML($xml); @$doc->loadXML($xml);
$xpath = new DomXPath($doc); $xpath = new DomXPath($doc);
$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom"); $xpath->registerNamespace('atom', NAMESPACE_ATOM1);
$xpath->registerNamespace('thr', "http://purl.org/syndication/thread/1.0"); $xpath->registerNamespace('thr', NAMESPACE_THREAD);
$xpath->registerNamespace('at', "http://purl.org/atompub/tombstones/1.0"); $xpath->registerNamespace('at', NAMESPACE_TOMB);
$xpath->registerNamespace('media', "http://purl.org/syndication/atommedia"); $xpath->registerNamespace('media', NAMESPACE_MEDIA);
$xpath->registerNamespace('dfrn', "http://purl.org/macgirvin/dfrn/1.0"); $xpath->registerNamespace('dfrn', NAMESPACE_DFRN);
$xpath->registerNamespace('activity', "http://activitystrea.ms/spec/1.0/"); $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY);
$xpath->registerNamespace('georss', "http://www.georss.org/georss"); $xpath->registerNamespace('georss', NAMESPACE_GEORSS);
$xpath->registerNamespace('poco', "http://portablecontacts.net/spec/1.0"); $xpath->registerNamespace('poco', NAMESPACE_POCO);
$xpath->registerNamespace('ostatus', "http://ostatus.org/schema/1.0"); $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
$xpath->registerNamespace('statusnet', "http://status.net/schema/api/1/"); $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `self`", intval($importer["uid"]));
$contact = $r[0];
$header = array(); $header = array();
$header["uid"] = $importer["uid"]; $header["uid"] = $importer["uid"];
@ -559,15 +724,15 @@ print_r($notif_params);
$mails = $xpath->query('/atom:feed/dfrn:mail'); $mails = $xpath->query('/atom:feed/dfrn:mail');
foreach ($mails AS $mail) foreach ($mails AS $mail)
self::process_mail($header, $xpath, $mail, $importer, $contact); self::process_mail($xpath, $mail, $importer);
$suggestions = $xpath->query('/atom:feed/dfrn:suggest'); $suggestions = $xpath->query('/atom:feed/dfrn:suggest');
foreach ($suggestions AS $suggestion) foreach ($suggestions AS $suggestion)
self::process_suggestion($header, $xpath, $suggestion, $importer, $contact); self::process_suggestion($xpath, $suggestion, $importer);
$relocations = $xpath->query('/atom:feed/dfrn:relocate'); $relocations = $xpath->query('/atom:feed/dfrn:relocate');
foreach ($relocations AS $relocation) foreach ($relocations AS $relocation)
self::process_relocation($header, $xpath, $relocation, $importer, $contact); self::process_relocation($xpath, $relocation, $importer);
$entries = $xpath->query('/atom:feed/atom:entry'); $entries = $xpath->query('/atom:feed/atom:entry');
foreach ($entries AS $entry) foreach ($entries AS $entry)

View file

@ -17,15 +17,6 @@ define('OSTATUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes
define('OSTATUS_DEFAULT_POLL_TIMEFRAME', 1440); // given in minutes define('OSTATUS_DEFAULT_POLL_TIMEFRAME', 1440); // given in minutes
define('OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS', 14400); // given in minutes define('OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS', 14400); // given in minutes
define("NS_ATOM", "http://www.w3.org/2005/Atom");
define("NS_THR", "http://purl.org/syndication/thread/1.0");
define("NS_GEORSS", "http://www.georss.org/georss");
define("NS_ACTIVITY", "http://activitystrea.ms/spec/1.0/");
define("NS_MEDIA", "http://purl.org/syndication/atommedia");
define("NS_POCO", "http://portablecontacts.net/spec/1.0");
define("NS_OSTATUS", "http://ostatus.org/schema/1.0");
define("NS_STATUSNET", "http://status.net/schema/api/1/");
function ostatus_check_follow_friends() { function ostatus_check_follow_friends() {
$r = q("SELECT `uid`,`v` FROM `pconfig` WHERE `cat`='system' AND `k`='ostatus_legacy_contact' AND `v` != ''"); $r = q("SELECT `uid`,`v` FROM `pconfig` WHERE `cat`='system' AND `k`='ostatus_legacy_contact' AND `v` != ''");
@ -193,14 +184,14 @@ function ostatus_salmon_author($xml, $importer) {
@$doc->loadXML($xml); @$doc->loadXML($xml);
$xpath = new DomXPath($doc); $xpath = new DomXPath($doc);
$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom"); $xpath->registerNamespace('atom', NAMESPACE_ATOM1);
$xpath->registerNamespace('thr', "http://purl.org/syndication/thread/1.0"); $xpath->registerNamespace('thr', NAMESPACE_THREAD);
$xpath->registerNamespace('georss', "http://www.georss.org/georss"); $xpath->registerNamespace('georss', NAMESPACE_GEORSS);
$xpath->registerNamespace('activity', "http://activitystrea.ms/spec/1.0/"); $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY);
$xpath->registerNamespace('media', "http://purl.org/syndication/atommedia"); $xpath->registerNamespace('media', NAMESPACE_MEDIA);
$xpath->registerNamespace('poco', "http://portablecontacts.net/spec/1.0"); $xpath->registerNamespace('poco', NAMESPACE_POCO);
$xpath->registerNamespace('ostatus', "http://ostatus.org/schema/1.0"); $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
$xpath->registerNamespace('statusnet', "http://status.net/schema/api/1/"); $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
$entries = $xpath->query('/atom:entry'); $entries = $xpath->query('/atom:entry');
@ -224,14 +215,14 @@ function ostatus_import($xml,$importer,&$contact, &$hub) {
@$doc->loadXML($xml); @$doc->loadXML($xml);
$xpath = new DomXPath($doc); $xpath = new DomXPath($doc);
$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom"); $xpath->registerNamespace('atom', NAMESPACE_ATOM1);
$xpath->registerNamespace('thr', "http://purl.org/syndication/thread/1.0"); $xpath->registerNamespace('thr', NAMESPACE_THREAD);
$xpath->registerNamespace('georss', "http://www.georss.org/georss"); $xpath->registerNamespace('georss', NAMESPACE_GEORSS);
$xpath->registerNamespace('activity', "http://activitystrea.ms/spec/1.0/"); $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY);
$xpath->registerNamespace('media', "http://purl.org/syndication/atommedia"); $xpath->registerNamespace('media', NAMESPACE_MEDIA);
$xpath->registerNamespace('poco', "http://portablecontacts.net/spec/1.0"); $xpath->registerNamespace('poco', NAMESPACE_POCO);
$xpath->registerNamespace('ostatus', "http://ostatus.org/schema/1.0"); $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
$xpath->registerNamespace('statusnet', "http://status.net/schema/api/1/"); $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
$gub = ""; $gub = "";
$hub_attributes = $xpath->query("/atom:feed/atom:link[@rel='hub']")->item(0)->attributes; $hub_attributes = $xpath->query("/atom:feed/atom:link[@rel='hub']")->item(0)->attributes;
@ -1120,16 +1111,16 @@ function ostatus_format_picture_post($body) {
function ostatus_add_header($doc, $owner) { function ostatus_add_header($doc, $owner) {
$a = get_app(); $a = get_app();
$root = $doc->createElementNS(NS_ATOM, 'feed'); $root = $doc->createElementNS(NAMESPACE_ATOM1, 'feed');
$doc->appendChild($root); $doc->appendChild($root);
$root->setAttribute("xmlns:thr", NS_THR); $root->setAttribute("xmlns:thr", NAMESPACE_THREAD);
$root->setAttribute("xmlns:georss", NS_GEORSS); $root->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
$root->setAttribute("xmlns:activity", NS_ACTIVITY); $root->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
$root->setAttribute("xmlns:media", NS_MEDIA); $root->setAttribute("xmlns:media", NAMESPACE_MEDIA);
$root->setAttribute("xmlns:poco", NS_POCO); $root->setAttribute("xmlns:poco", NAMESPACE_POCO);
$root->setAttribute("xmlns:ostatus", NS_OSTATUS); $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
$root->setAttribute("xmlns:statusnet", NS_STATUSNET); $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
$attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION); $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION);
xml_add_element($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes); xml_add_element($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes);
@ -1343,15 +1334,15 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false, $repeat = false)
$entry = $doc->createElement("activity:object"); $entry = $doc->createElement("activity:object");
$title = sprintf("New note by %s", $owner["nick"]); $title = sprintf("New note by %s", $owner["nick"]);
} else { } else {
$entry = $doc->createElementNS(NS_ATOM, "entry"); $entry = $doc->createElementNS(NAMESPACE_ATOM1, "entry");
$entry->setAttribute("xmlns:thr", NS_THR); $entry->setAttribute("xmlns:thr", NAMESPACE_THREAD);
$entry->setAttribute("xmlns:georss", NS_GEORSS); $entry->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
$entry->setAttribute("xmlns:activity", NS_ACTIVITY); $entry->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
$entry->setAttribute("xmlns:media", NS_MEDIA); $entry->setAttribute("xmlns:media", NAMESPACE_MEDIA);
$entry->setAttribute("xmlns:poco", NS_POCO); $entry->setAttribute("xmlns:poco", NAMESPACE_POCO);
$entry->setAttribute("xmlns:ostatus", NS_OSTATUS); $entry->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
$entry->setAttribute("xmlns:statusnet", NS_STATUSNET); $entry->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
$author = ostatus_add_author($doc, $owner); $author = ostatus_add_author($doc, $owner);
$entry->appendChild($author); $entry->appendChild($author);