]> git.mxchange.org Git - friendica.git/commitdiff
DFRN-Import is now nearly complete, changed namespace constants
authorMichael Vogel <icarus@dabo.de>
Fri, 29 Jan 2016 22:14:01 +0000 (23:14 +0100)
committerMichael Vogel <icarus@dabo.de>
Fri, 29 Jan 2016 22:14:01 +0000 (23:14 +0100)
include/dfrn.php
include/import-dfrn.php
include/ostatus.php

index 883afe15f7bd642197e4c68493d6aef30922cb70..50d78de3c49fc73da04653e64ce00b2bfaf39a3f 100644 (file)
@@ -386,15 +386,15 @@ class dfrn {
                $root = $doc->createElementNS(NS_ATOM, 'feed');
                $doc->appendChild($root);
 
-               $root->setAttribute("xmlns:thr", NS_THR);
-               $root->setAttribute("xmlns:at", "http://purl.org/atompub/tombstones/1.0");
-               $root->setAttribute("xmlns:media", NS_MEDIA);
-               $root->setAttribute("xmlns:dfrn", "http://purl.org/macgirvin/dfrn/1.0");
-               $root->setAttribute("xmlns:activity", NS_ACTIVITY);
-               $root->setAttribute("xmlns:georss", NS_GEORSS);
-               $root->setAttribute("xmlns:poco", NS_POCO);
-               $root->setAttribute("xmlns:ostatus", NS_OSTATUS);
-               $root->setAttribute("xmlns:statusnet", NS_STATUSNET);
+               $root->setAttribute("xmlns:thr", NAMESPACE_THREAD);
+               $root->setAttribute("xmlns:at", NAMESPACE_TOMB);
+               $root->setAttribute("xmlns:media", NAMESPACE_MEDIA);
+               $root->setAttribute("xmlns:dfrn", NAMESPACE_DFRN);
+               $root->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
+               $root->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
+               $root->setAttribute("xmlns:poco", NAMESPACE_POCO);
+               $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
+               $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
 
                xml_add_element($doc, $root, "id", app::get_baseurl()."/profile/".$owner["nick"]);
                xml_add_element($doc, $root, "title", $owner["name"]);
index c9343803571f2ea144d3dc424e445ab71b061bdf..3265eb6ff50eeed52574e0a43f454bffbcb58a8b 100644 (file)
@@ -263,57 +263,215 @@ $onlyfetch = true; // Test
                return($objxml);
        }
 
-       private function process_mail($header, $xpath, $mail, $importer, $contact) {
+       private function process_mail($xpath, $mail, $importer) {
 
                $msg = array();
                $msg["uid"] = $importer['importer_uid'];
                $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-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["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["title"] = $xpath->query('dfrn:subject/text()', $mail)->item(0)->nodeValue;
                $msg["body"] = $xpath->query('dfrn:content/text()', $mail)->item(0)->nodeValue;
-                $msg["seen"] = 0;
-                $msg["replied"] = 0;
+               $msg["seen"] = 0;
+               $msg["replied"] = 0;
 
                dbesc_array($msg);
 
-                //$r = dbq("INSERT INTO `mail` (`" . implode("`, `", array_keys($msg))
-                //        . "`) VALUES ('" . implode("', '", array_values($msg)) . "')" );
+               $r = dbq("INSERT INTO `mail` (`".implode("`, `", array_keys($msg))."`) VALUES ('".implode("', '", array_values($msg))."')");
+
+               // 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'
+               );
 
-print_r($msg);
+               notification($notif_params);
+       }
 
-                // send notifications.
+       private function process_suggestion($xpath, $suggestion, $importer) {
 
-                require_once('include/enotify.php');
+               $suggest = array();
+               $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;
 
-                $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'
-                );
+               // Does our member already have a friend matching this description?
 
-//                notification($notif_params);
-print_r($notif_params);
+               $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;
 
-       }
 
-       private function process_suggestion($header, $xpath, $suggestion, $importer, $contact) {
+               $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_relocation($header, $xpath, $relocation, $importer, $contact) {
+       private function process_relocation($xpath, $relocation, $importer) {
+
+               $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) {
@@ -511,7 +669,11 @@ print_r($notif_params);
                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();
 
@@ -524,16 +686,19 @@ print_r($notif_params);
                @$doc->loadXML($xml);
 
                $xpath = new DomXPath($doc);
-               $xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");
-               $xpath->registerNamespace('thr', "http://purl.org/syndication/thread/1.0");
-               $xpath->registerNamespace('at', "http://purl.org/atompub/tombstones/1.0");
-               $xpath->registerNamespace('media', "http://purl.org/syndication/atommedia");
-               $xpath->registerNamespace('dfrn', "http://purl.org/macgirvin/dfrn/1.0");
-               $xpath->registerNamespace('activity', "http://activitystrea.ms/spec/1.0/");
-               $xpath->registerNamespace('georss', "http://www.georss.org/georss");
-               $xpath->registerNamespace('poco', "http://portablecontacts.net/spec/1.0");
-               $xpath->registerNamespace('ostatus', "http://ostatus.org/schema/1.0");
-               $xpath->registerNamespace('statusnet', "http://status.net/schema/api/1/");
+               $xpath->registerNamespace('atom', NAMESPACE_ATOM1);
+               $xpath->registerNamespace('thr', NAMESPACE_THREAD);
+               $xpath->registerNamespace('at', NAMESPACE_TOMB);
+               $xpath->registerNamespace('media', NAMESPACE_MEDIA);
+               $xpath->registerNamespace('dfrn', NAMESPACE_DFRN);
+               $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY);
+               $xpath->registerNamespace('georss', NAMESPACE_GEORSS);
+               $xpath->registerNamespace('poco', NAMESPACE_POCO);
+               $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
+               $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
+
+               $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `self`", intval($importer["uid"]));
+               $contact = $r[0];
 
                $header = array();
                $header["uid"] = $importer["uid"];
@@ -559,15 +724,15 @@ print_r($notif_params);
 
                $mails = $xpath->query('/atom:feed/dfrn: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');
                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');
                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');
                foreach ($entries AS $entry)
index 37b308db7010469b7200e87ad5fdb8839a90154f..caaeec84f7dd974db3a9b5c079064f7f60e9cbf4 100644 (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_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() {
        $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);
 
        $xpath = new DomXPath($doc);
-       $xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");
-       $xpath->registerNamespace('thr', "http://purl.org/syndication/thread/1.0");
-       $xpath->registerNamespace('georss', "http://www.georss.org/georss");
-       $xpath->registerNamespace('activity', "http://activitystrea.ms/spec/1.0/");
-       $xpath->registerNamespace('media', "http://purl.org/syndication/atommedia");
-       $xpath->registerNamespace('poco', "http://portablecontacts.net/spec/1.0");
-       $xpath->registerNamespace('ostatus', "http://ostatus.org/schema/1.0");
-       $xpath->registerNamespace('statusnet', "http://status.net/schema/api/1/");
+       $xpath->registerNamespace('atom', NAMESPACE_ATOM1);
+       $xpath->registerNamespace('thr', NAMESPACE_THREAD);
+       $xpath->registerNamespace('georss', NAMESPACE_GEORSS);
+       $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY);
+       $xpath->registerNamespace('media', NAMESPACE_MEDIA);
+       $xpath->registerNamespace('poco', NAMESPACE_POCO);
+       $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
+       $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
 
        $entries = $xpath->query('/atom:entry');
 
@@ -224,14 +215,14 @@ function ostatus_import($xml,$importer,&$contact, &$hub) {
        @$doc->loadXML($xml);
 
        $xpath = new DomXPath($doc);
-       $xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");
-       $xpath->registerNamespace('thr', "http://purl.org/syndication/thread/1.0");
-       $xpath->registerNamespace('georss', "http://www.georss.org/georss");
-       $xpath->registerNamespace('activity', "http://activitystrea.ms/spec/1.0/");
-       $xpath->registerNamespace('media', "http://purl.org/syndication/atommedia");
-       $xpath->registerNamespace('poco', "http://portablecontacts.net/spec/1.0");
-       $xpath->registerNamespace('ostatus', "http://ostatus.org/schema/1.0");
-       $xpath->registerNamespace('statusnet', "http://status.net/schema/api/1/");
+       $xpath->registerNamespace('atom', NAMESPACE_ATOM1);
+       $xpath->registerNamespace('thr', NAMESPACE_THREAD);
+       $xpath->registerNamespace('georss', NAMESPACE_GEORSS);
+       $xpath->registerNamespace('activity', NAMESPACE_ACTIVITY);
+       $xpath->registerNamespace('media', NAMESPACE_MEDIA);
+       $xpath->registerNamespace('poco', NAMESPACE_POCO);
+       $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
+       $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
 
        $gub = "";
        $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) {
        $a = get_app();
 
-       $root = $doc->createElementNS(NS_ATOM, 'feed');
+       $root = $doc->createElementNS(NAMESPACE_ATOM1, 'feed');
        $doc->appendChild($root);
 
-       $root->setAttribute("xmlns:thr", NS_THR);
-       $root->setAttribute("xmlns:georss", NS_GEORSS);
-       $root->setAttribute("xmlns:activity", NS_ACTIVITY);
-       $root->setAttribute("xmlns:media", NS_MEDIA);
-       $root->setAttribute("xmlns:poco", NS_POCO);
-       $root->setAttribute("xmlns:ostatus", NS_OSTATUS);
-       $root->setAttribute("xmlns:statusnet", NS_STATUSNET);
+       $root->setAttribute("xmlns:thr", NAMESPACE_THREAD);
+       $root->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
+       $root->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
+       $root->setAttribute("xmlns:media", NAMESPACE_MEDIA);
+       $root->setAttribute("xmlns:poco", NAMESPACE_POCO);
+       $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
+       $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
 
        $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION);
        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");
                $title = sprintf("New note by %s", $owner["nick"]);
        } else {
-               $entry = $doc->createElementNS(NS_ATOM, "entry");
-
-               $entry->setAttribute("xmlns:thr", NS_THR);
-               $entry->setAttribute("xmlns:georss", NS_GEORSS);
-               $entry->setAttribute("xmlns:activity", NS_ACTIVITY);
-               $entry->setAttribute("xmlns:media", NS_MEDIA);
-               $entry->setAttribute("xmlns:poco", NS_POCO);
-               $entry->setAttribute("xmlns:ostatus", NS_OSTATUS);
-               $entry->setAttribute("xmlns:statusnet", NS_STATUSNET);
+               $entry = $doc->createElementNS(NAMESPACE_ATOM1, "entry");
+
+               $entry->setAttribute("xmlns:thr", NAMESPACE_THREAD);
+               $entry->setAttribute("xmlns:georss", NAMESPACE_GEORSS);
+               $entry->setAttribute("xmlns:activity", NAMESPACE_ACTIVITY);
+               $entry->setAttribute("xmlns:media", NAMESPACE_MEDIA);
+               $entry->setAttribute("xmlns:poco", NAMESPACE_POCO);
+               $entry->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS);
+               $entry->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET);
 
                $author = ostatus_add_author($doc, $owner);
                $entry->appendChild($author);