]> git.mxchange.org Git - friendica.git/blobdiff - include/dfrn.php
New routines are now enabled
[friendica.git] / include / dfrn.php
index 775455b8332350b481e28a461f6c3f7191887416..cf1adfa24884492d3f2876dfee3af7ed18da0f70 100644 (file)
@@ -1,13 +1,21 @@
 <?php
-
 require_once('include/items.php');
+require_once('include/ostatus.php');
 
+/**
+ * @brief Adds the header elements for the DFRN protocol
+ *
+ * @param array $items Item elements
+ * @param array $owner Owner record
+ *
+ * @return string DFRN entries
+ */
 function dfrn_entries($items,$owner) {
 
        $doc = new DOMDocument('1.0', 'utf-8');
        $doc->formatOutput = true;
 
-       $root = dfrn_add_header($doc, $owner, "dfrn:owner");
+       $root = dfrn_add_header($doc, $owner, "dfrn:owner", "", false);
 
        if(! count($items))
                return trim($doc->saveXML());
@@ -20,9 +28,19 @@ function dfrn_entries($items,$owner) {
        return(trim($doc->saveXML()));
 }
 
+/**
+ * @brief Adds the header elements for the DFRN protocol
+ *
+ * @param App $a
+ * @param string $dfrn_id
+ * @param string $owner_nick Owner nick name
+ * @param string $last_update Date of the last update
+ * @param int $direction
+ *
+ * @return string DFRN feed entries
+ */
 function dfrn_feed(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
 
-
        $sitefeed    = ((strlen($owner_nick)) ? false : true); // not yet implemented, need to rewrite huge chunks of following logic
        $public_feed = (($dfrn_id) ? false : true);
        $starred     = false;   // not yet implemented, possible security issues
@@ -173,7 +191,12 @@ function dfrn_feed(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
        if(isset($category))
                $alternatelink .= "/category/".$category;
 
-       $root = dfrn_add_header($doc, $owner, "author", $alternatelink);
+       if ($public_feed)
+               $author = "dfrn:owner";
+       else
+               $author = "author";
+
+       $root = dfrn_add_header($doc, $owner, $author, $alternatelink, true);
 
        // This hook can't work anymore
        //      call_hooks('atom_feed', $atom);
@@ -217,16 +240,130 @@ function dfrn_feed(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
 }
 
 /**
- * @brief Adds the header elements for thr DFRN protocol
+ * @brief Create XML text for DFRN mail
+ *
+ * @param array $item message elements
+ * @param array $owner Owner record
+ *
+ * @return string DFRN mail
+ */
+function dfrn_mail($item, $owner) {
+       $doc = new DOMDocument('1.0', 'utf-8');
+       $doc->formatOutput = true;
+
+       $root = dfrn_add_header($doc, $owner, "dfrn:owner", "", false);
+
+       $mail = $doc->createElement("dfrn:mail");
+       $sender = $doc->createElement("dfrn:sender");
+
+       xml_add_element($doc, $sender, "dfrn:name", $owner['name']);
+       xml_add_element($doc, $sender, "dfrn:uri", $owner['url']);
+       xml_add_element($doc, $sender, "dfrn:avatar", $owner['thumb']);
+
+       $mail->appendChild($sender);
+
+       xml_add_element($doc, $mail, "dfrn:id", $item['uri']);
+       xml_add_element($doc, $mail, "dfrn:in-reply-to", $item['parent-uri']);
+       xml_add_element($doc, $mail, "dfrn:sentdate", datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME));
+       xml_add_element($doc, $mail, "dfrn:subject", $item['title']);
+       xml_add_element($doc, $mail, "dfrn:content", $item['body']);
+
+       $root->appendChild($mail);
+
+       return(trim($doc->saveXML()));
+}
+
+/**
+ * @brief Create XML text for DFRN suggestions
  *
- * We use the XML from OStatus as a base and are adding the DFRN parts to it.
+ * @param array $item suggestion elements
+ * @param array $owner Owner record
  *
- * @doc Class XML document
- * @owner array Owner record
+ * @return string DFRN suggestions
+ */
+function dfrn_fsuggest($item, $owner) {
+       $doc = new DOMDocument('1.0', 'utf-8');
+       $doc->formatOutput = true;
+
+       $root = dfrn_add_header($doc, $owner, "dfrn:owner", "", false);
+
+       $suggest = $doc->createElement("dfrn:suggest");
+
+       xml_add_element($doc, $suggest, "dfrn:url", $item['url']);
+       xml_add_element($doc, $suggest, "dfrn:name", $item['name']);
+       xml_add_element($doc, $suggest, "dfrn:photo", $item['photo']);
+       xml_add_element($doc, $suggest, "dfrn:request", $item['request']);
+       xml_add_element($doc, $suggest, "dfrn:note", $item['note']);
+
+       $root->appendChild($suggest);
+
+       return(trim($doc->saveXML()));
+}
+
+/**
+ * @brief Create XML text for DFRN relocations
+ *
+ * @param array $owner Owner record
+ * @param int $uid User ID
  *
- * @return Class XML root object
+ * @return string DFRN relocations
  */
-function dfrn_add_header($doc, $owner, $authorelement, $alternatelink = "") {
+function dfrn_relocate($owner, $uid) {
+
+       $a = get_app();
+
+       /* get site pubkey. this could be a new installation with no site keys*/
+       $pubkey = get_config('system','site_pubkey');
+       if(! $pubkey) {
+               $res = new_keypair(1024);
+               set_config('system','site_prvkey', $res['prvkey']);
+               set_config('system','site_pubkey', $res['pubkey']);
+       }
+
+       $rp = q("SELECT `resource-id` , `scale`, type FROM `photo`
+                       WHERE `profile` = 1 AND `uid` = %d ORDER BY scale;", $uid);
+       $photos = array();
+       $ext = Photo::supportedTypes();
+       foreach($rp as $p){
+               $photos[$p['scale']] = $a->get_baseurl().'/photo/'.$p['resource-id'].'-'.$p['scale'].'.'.$ext[$p['type']];
+       }
+       unset($rp, $ext);
+
+       $doc = new DOMDocument('1.0', 'utf-8');
+       $doc->formatOutput = true;
+
+       $root = dfrn_add_header($doc, $owner, "dfrn:owner", "", false);
+
+       $relocate = $doc->createElement("dfrn:relocate");
+
+       xml_add_element($doc, $relocate, "dfrn:url", $owner['url']);
+       xml_add_element($doc, $relocate, "dfrn:name", $owner['name']);
+       xml_add_element($doc, $relocate, "dfrn:photo", $photos[4]);
+       xml_add_element($doc, $relocate, "dfrn:thumb", $photos[5]);
+       xml_add_element($doc, $relocate, "dfrn:micro", $photos[6]);
+       xml_add_element($doc, $relocate, "dfrn:request", $owner['request']);
+       xml_add_element($doc, $relocate, "dfrn:confirm", $owner['confirm']);
+       xml_add_element($doc, $relocate, "dfrn:notify", $owner['notify']);
+       xml_add_element($doc, $relocate, "dfrn:poll", $owner['poll']);
+       xml_add_element($doc, $relocate, "dfrn:sitepubkey", get_config('system','site_pubkey'));
+
+       $root->appendChild($relocate);
+
+       return(trim($doc->saveXML()));
+}
+
+/**
+ * @brief Adds the header elements for the DFRN protocol
+ *
+ * @param object $doc XML document
+ * @param array $owner Owner record
+ * @param string $authorelement Element name for the author
+ * @param string $alternatelink link to profile or category
+ * @param bool $public Is it a header for public posts?
+ *
+ * @return object XML root object
+ */
+function dfrn_add_header($doc, $owner, $authorelement, $alternatelink = "", $public = false) {
        $a = get_app();
 
        if ($alternatelink == "")
@@ -259,14 +396,16 @@ function dfrn_add_header($doc, $owner, $authorelement, $alternatelink = "") {
 
        ostatus_hublinks($doc, $root);
 
-       $attributes = array("rel" => "salmon", "href" => $a->get_baseurl()."/salmon/".$owner["nick"]);
-       xml_add_element($doc, $root, "link", "", $attributes);
+       if ($public) {
+               $attributes = array("rel" => "salmon", "href" => $a->get_baseurl()."/salmon/".$owner["nick"]);
+               xml_add_element($doc, $root, "link", "", $attributes);
 
-       $attributes = array("rel" => "http://salmon-protocol.org/ns/salmon-replies", "href" => $a->get_baseurl()."/salmon/".$owner["nick"]);
-       xml_add_element($doc, $root, "link", "", $attributes);
+               $attributes = array("rel" => "http://salmon-protocol.org/ns/salmon-replies", "href" => $a->get_baseurl()."/salmon/".$owner["nick"]);
+               xml_add_element($doc, $root, "link", "", $attributes);
 
-       $attributes = array("rel" => "http://salmon-protocol.org/ns/salmon-mention", "href" => $a->get_baseurl()."/salmon/".$owner["nick"]);
-       xml_add_element($doc, $root, "link", "", $attributes);
+               $attributes = array("rel" => "http://salmon-protocol.org/ns/salmon-mention", "href" => $a->get_baseurl()."/salmon/".$owner["nick"]);
+               xml_add_element($doc, $root, "link", "", $attributes);
+       }
 
        if ($owner['page-flags'] == PAGE_COMMUNITY)
                xml_add_element($doc, $root, "dfrn:community", 1);
@@ -279,6 +418,15 @@ function dfrn_add_header($doc, $owner, $authorelement, $alternatelink = "") {
        return $root;
 }
 
+/**
+ * @brief Adds the author elements for the DFRN protocol
+ *
+ * @param object $doc XML document
+ * @param array $owner Owner record
+ * @param string $authorelement Element name for the author
+ *
+ * @return object XML author object
+ */
 function dfrn_add_author($doc, $owner, $authorelement) {
        $a = get_app();
 
@@ -310,6 +458,16 @@ function dfrn_add_author($doc, $owner, $authorelement) {
        return $author;
 }
 
+/**
+ * @brief Adds the author elements for the item entries of the DFRN protocol
+ *
+ * @param object $doc XML document
+ * @param string $element Element name for the author
+ * @param string $contact_url Link of the contact
+ * @param array $items Item elements
+ *
+ * @return object XML author object
+ */
 function dfrn_add_entry_author($doc, $element, $contact_url, $item) {
        $a = get_app();
 
@@ -370,6 +528,15 @@ function dfrn_add_entry_author($doc, $element, $contact_url, $item) {
        return $author;
 }
 
+/**
+ * @brief Adds the activity elements
+ *
+ * @param object $doc XML document
+ * @param string $element Element name for the activity
+ * @param string $activity activity value
+ *
+ * @return object XML activity object
+ */
 function dfrn_create_activity($doc, $element, $activity) {
 
        if($activity) {
@@ -408,6 +575,15 @@ function dfrn_create_activity($doc, $element, $activity) {
        return false;
 }
 
+/**
+ * @brief Adds the attachments elements
+ *
+ * @param object $doc XML document
+ * @param object $root XML root
+ * @param array $item Item element
+ *
+ * @return object XML attachment object
+ */
 function dfrn_get_attachment($doc, $root, $item) {
        $arr = explode('[/attach],',$item['attach']);
        if(count($arr)) {
@@ -431,6 +607,18 @@ function dfrn_get_attachment($doc, $root, $item) {
        }
 }
 
+/**
+ * @brief Adds the header elements for the DFRN protocol
+ *
+ * @param object $doc XML document
+ * @param string $type "text" or "html"
+ * @param array $item Item element
+ * @param array $owner Owner record
+ * @param bool $comment Trigger the sending of the "comment" element
+ * @param int $cid
+ *
+ * @return object XML entry object
+ */
 function dfrn_entry($doc, $type, $item, $owner, $comment = false, $cid = 0) {
        $a = get_app();
 
@@ -439,14 +627,13 @@ function dfrn_entry($doc, $type, $item, $owner, $comment = false, $cid = 0) {
        if(!$item['parent'])
                return;
 
-       $entry = $doc->createElement("entry");
-
        if($item['deleted']) {
                $attributes = array("ref" => $item['uri'], "when" => datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME));
-               xml_add_element($doc, $entry, "at:deleted-entry", "", $attributes);
-               return $entry;
+               return xml_create_element($doc, "at:deleted-entry", "", $attributes);
        }
 
+       $entry = $doc->createElement("entry");
+
        if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
                $body = fix_private_photos($item['body'],$owner['uid'],$item,$cid);
        else