]> git.mxchange.org Git - friendica.git/commitdiff
The signature creation now moved into the Diaspora class. That's much cleaner.
authorMichael Vogel <icarus@dabo.de>
Sat, 19 Mar 2016 14:49:47 +0000 (15:49 +0100)
committerMichael Vogel <icarus@dabo.de>
Sat, 19 Mar 2016 14:49:47 +0000 (15:49 +0100)
include/diaspora.php
include/like.php
mod/item.php

index 4e1b3005076c53e7bbbc311755741eb19b023916..59bad946e2fb14bb83da410d73b4555802a93e46 100644 (file)
@@ -2190,13 +2190,18 @@ class diaspora {
         *
         * @return string the handle in the format user@domain.tld
         */
-       private function my_handle($me) {
+       private function my_handle($contact) {
                if ($contact["addr"] != "")
                        return $contact["addr"];
 
                // Normally we should have a filled "addr" field - but in the past this wasn't the case
                // So - just in case - we build the the address here.
-               return $me["nickname"]."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
+               if ($contact["nickname"] != "")
+                       $nick = $contact["nickname"];
+               else
+                       $nick = $contact["nick"];
+
+               return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
        }
 
        /**
@@ -2689,7 +2694,7 @@ class diaspora {
                                "guid" => $item["guid"],
                                "target_type" => $target_type,
                                "parent_guid" => $parent["guid"],
-                               "author_signature" => $authorsig,
+                               "author_signature" => "",
                                "diaspora_handle" => self::my_handle($owner)));
        }
 
@@ -3052,5 +3057,118 @@ class diaspora {
                foreach($recips as $recip)
                        self::build_and_transmit($profile, $recip, "profile", $message, false, "", true);
        }
+
+       /**
+        * @brief Stores the signature for likes that are created on our system
+        *
+        * @param array $contact The contact array of the "like"
+        * @param int $post_id The post id of the "like"
+        *
+        * @return bool Success
+        */
+       function store_like_signature($contact, $post_id) {
+
+               $enabled = intval(get_config('system','diaspora_enabled'));
+               if (!$enabled) {
+                       logger('Diaspora support disabled, not storing like signature', LOGGER_DEBUG);
+                       return false;
+               }
+
+               // Is the contact the owner? Then fetch the private key
+               if (!$contact['self'] OR ($contact['uid'] == 0)) {
+                       logger("No owner post, so not storing signature", LOGGER_DEBUG);
+                       return false;
+               }
+
+               $r = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1", intval($contact['uid']));
+               if(!$r)
+                       return false;
+
+               $contact["uprvkey"] = $r[0]['prvkey'];
+
+               $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", intval($post_id));
+               if (!$r)
+                       return false;
+
+               if (!in_array($r[0]["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE)))
+                       return false;
+
+               $message = self::construct_like($r[0], $contact);
+               $message["author_signature"] = self::signature($contact, $message);
+
+               // In the future we will store the signature more flexible to support new fields.
+               // Right now we cannot change this since old Friendica versions (prior to 3.5) can only handle this format.
+               // (We are transmitting this data here via DFRN)
+
+               $signed_text = $message["positive"].";".$message["guid"].";".$message["target_type"].";".
+                               $message["parent_guid"].";".$message["diaspora_handle"];
+
+               q("INSERT INTO `sign` (`iid`,`signed_text`,`signature`,`signer`) VALUES (%d,'%s','%s','%s')",
+                       intval($post_id),
+                       dbesc($signed_text),
+                       dbesc($message["author_signature"]),
+                       dbesc($message["diaspora_handle"])
+               );
+
+               // This here will replace the lines above, once Diaspora changed its protocol
+               //q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')",
+               //      intval($message_id),
+               //      dbesc(json_encode($message))
+               //);
+
+               logger('Stored diaspora like signature');
+               return true;
+       }
+
+       /**
+        * @brief Stores the signature for comments that are created on our system
+        *
+        * @param array $item The item array of the comment
+        * @param array $contact The contact array of the item owner
+        * @param string $uprvkey The private key of the sender
+        * @param int $message_id The message id of the comment
+        *
+        * @return bool Success
+        */
+       function store_comment_signature($item, $contact, $uprvkey, $message_id) {
+
+               if ($uprvkey == "") {
+                       logger('No private key, so not storing comment signature', LOGGER_DEBUG);
+                       return false;
+               }
+
+               $enabled = intval(get_config('system','diaspora_enabled'));
+               if (!$enabled) {
+                       logger('Diaspora support disabled, not storing comment signature', LOGGER_DEBUG);
+                       return false;
+               }
+
+               $contact["uprvkey"] = $uprvkey;
+
+               $message = self::construct_comment($item, $contact);
+               $message["author_signature"] = self::signature($contact, $message);
+
+               // In the future we will store the signature more flexible to support new fields.
+               // Right now we cannot change this since old Friendica versions (prior to 3.5) can only handle this format.
+               // (We are transmitting this data here via DFRN)
+               $signed_text = $message["guid"].";".$message["parent_guid"].";".
+                               $message["text"].";".$message["diaspora_handle"];
+
+               q("INSERT INTO `sign` (`iid`,`signed_text`,`signature`,`signer`) VALUES (%d,'%s','%s','%s')",
+                       intval($message_id),
+                       dbesc($signed_text),
+                       dbesc($message["author_signature"]),
+                       dbesc($message["diaspora_handle"])
+               );
+
+               // This here will replace the lines above, once Diaspora changed its protocol
+               //q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')",
+               //      intval($message_id),
+               //      dbesc(json_encode($message))
+               //);
+
+               logger('Stored diaspora comment signature');
+               return true;
+       }
 }
 ?>
index 2e5367e51e48aee4008d335094b896edfbf76590..49534ea6137d041ce5ef291c051b9ca670d97b3e 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+require_once("include/diaspora.php");
 
 /**
  * @brief add/remove activity to an item
@@ -237,7 +238,7 @@ EOT;
 
 
        // Save the author information for the like in case we need to relay to Diaspora
-       store_diaspora_like_sig($activity, $post_type, $contact, $post_id);
+       diaspora::store_like_signature($contact, $post_id);
 
        $arr['id'] = $post_id;
 
@@ -247,83 +248,3 @@ EOT;
 
        return true;
 }
-
-function store_diaspora_like_sig($activity, $post_type, $contact, $post_id) {
-       // Note that we can only create a signature for a user of the local server. We don't have
-       // a key for remote users. That is ok, because if a remote user is "unlike"ing a post, it
-       // means we are the relay, and for relayable_retractions, Diaspora
-       // only checks the parent_author_signature if it doesn't have to relay further
-
-       $enabled = intval(get_config('system','diaspora_enabled'));
-       if(! $enabled) {
-               logger('mod_like: diaspora support disabled, not storing like signature', LOGGER_DEBUG);
-               return;
-       }
-
-       logger('mod_like: storing diaspora like signature');
-
-       if(($activity === ACTIVITY_LIKE) && ($post_type === t('status'))) {
-               // Only works for NETWORK_DFRN
-               $contact_baseurl_start = strpos($contact['url'],'://') + 3;
-               $contact_baseurl_length = strpos($contact['url'],'/profile') - $contact_baseurl_start;
-               $contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
-               $diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
-
-
-               // This code could never had worked (the return values form the queries were used in a wrong way.
-               // Additionally it is needlessly complicated. Either the contact is owner or not. And we have this data already.
-/*
-               // Get contact's private key if he's a user of the local Friendica server
-               $r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
-                       dbesc($contact['url'])
-               );
-
-               if( $r) {
-                       $contact_uid = $r['uid'];
-                       $r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
-                               intval($contact_uid)
-                       );
-
-                       if( $r)
-                               $contact_uprvkey = $r['prvkey'];
-               }
-*/
-
-               // Is the contact the owner? Then fetch the private key
-               if ($contact['self'] AND ($contact['uid'] > 0)) {
-                       $r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
-                               intval($contact['uid'])
-                       );
-
-                       if($r)
-                               $contact_uprvkey = $r[0]['prvkey'];
-               }
-
-               $r = q("SELECT guid, parent FROM `item` WHERE id = %d LIMIT 1",
-                       intval($post_id)
-               );
-               if( $r) {
-                       $p = q("SELECT guid FROM `item` WHERE id = %d AND parent = %d LIMIT 1",
-                               intval($r[0]['parent']),
-                               intval($r[0]['parent'])
-                       );
-                       if( $p) {
-                               $signed_text = 'true;'.$r[0]['guid'].';Post;'.$p[0]['guid'].';'.$diaspora_handle;
-
-                               if(isset($contact_uprvkey))
-                                       $authorsig = base64_encode(rsa_sign($signed_text,$contact_uprvkey,'sha256'));
-                               else
-                                       $authorsig = '';
-
-                               q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
-                                       intval($post_id),
-                                       dbesc($signed_text),
-                                       dbesc($authorsig),
-                                       dbesc($diaspora_handle)
-                               );
-                       }
-               }
-       }
-
-       return;
-}
index 2ade524a0500c53dd97e48e42183c5cdf3c6edd4..14c8203c98e26f30d1e461f509c5954424b721b6 100644 (file)
@@ -24,6 +24,7 @@ require_once('include/threads.php');
 require_once('include/text.php');
 require_once('include/items.php');
 require_once('include/Scrape.php');
+require_once('include/diaspora.php');
 
 function item_post(&$a) {
 
@@ -900,7 +901,7 @@ function item_post(&$a) {
 
 
                // Store the comment signature information in case we need to relay to Diaspora
-               store_diaspora_comment_sig($datarray, $author, ($self ? $user['prvkey'] : false), $parent_item, $post_id);
+               diaspora::store_comment_signature($datarray, $author, ($self ? $user['prvkey'] : false), $post_id);
 
        } else {
                $parent = $post_id;
@@ -1245,42 +1246,3 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo
 
        return array('replaced' => $replaced, 'contact' => $r[0]);
 }
-
-
-function store_diaspora_comment_sig($datarray, $author, $uprvkey, $parent_item, $post_id) {
-       // We won't be able to sign Diaspora comments for authenticated visitors - we don't have their private key
-
-       $enabled = intval(get_config('system','diaspora_enabled'));
-       if(! $enabled) {
-               logger('mod_item: diaspora support disabled, not storing comment signature', LOGGER_DEBUG);
-               return;
-       }
-
-
-       logger('mod_item: storing diaspora comment signature');
-
-       require_once('include/bb2diaspora.php');
-       $signed_body = html_entity_decode(bb2diaspora($datarray['body']));
-
-       // Only works for NETWORK_DFRN
-       $contact_baseurl_start = strpos($author['url'],'://') + 3;
-       $contact_baseurl_length = strpos($author['url'],'/profile') - $contact_baseurl_start;
-       $contact_baseurl = substr($author['url'], $contact_baseurl_start, $contact_baseurl_length);
-       $diaspora_handle = $author['nick'] . '@' . $contact_baseurl;
-
-       $signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $diaspora_handle;
-
-       if( $uprvkey !== false )
-               $authorsig = rsa_sign($signed_text,$uprvkey,'sha256');
-       else
-               $authorsig = '';
-
-       q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
-               intval($post_id),
-               dbesc($signed_text),
-               dbesc(base64_encode($authorsig)),
-               dbesc($diaspora_handle)
-       );
-
-       return;
-}