]> git.mxchange.org Git - friendica.git/commitdiff
Clean up the Diaspora connectivity:
authorZach Prezkuta <fermion@gmx.com>
Sun, 10 Jun 2012 00:39:21 +0000 (18:39 -0600)
committerZach Prezkuta <fermion@gmx.com>
Tue, 26 Jun 2012 01:03:03 +0000 (19:03 -0600)
- Move Diaspora code into separate functions to make it more modular
- Create more checks for whether Diaspora connectivity has been enabled

include/delivery.php
include/items.php
include/notifier.php
mod/item.php
mod/like.php

index e6cfc8155430ecb8f594d8744aa0af1e28787ff0..b60fef3bf70d311cb4730c5fd3e7d25d850774e5 100644 (file)
@@ -492,6 +492,9 @@ function delivery_run($argv, $argc){
                                break;
 
                        case NETWORK_DIASPORA :
+                               if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
+                                       break;
+
                                if($public_message)
                                        $loc = 'public batch ' . $contact['batch'];
                                else 
@@ -499,9 +502,6 @@ function delivery_run($argv, $argc){
 
                                logger('delivery: diaspora batch deliver: ' . $loc);
 
-                               if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
-                                       break;
-
                                if((! $contact['pubkey']) && (! $public_message))
                                        break;
 
index e495393fa571fe1b443937d2c19d9ee66fba41c2..af46eaaa121396c6101371c984a9607a964fee87 100755 (executable)
@@ -383,16 +383,21 @@ function get_atom_elements($feed,$item) {
                        $res['app'] = 'OStatus';
        }                  
 
+
        // base64 encoded json structure representing Diaspora signature
+       $dspr_enabled = intval(get_config('system','diaspora_enabled'));
+
+       if( $dspr_enabled) { 
+               $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature');
+               if($dsig) {
+                       $res['dsprsig'] = unxmlify($dsig[0]['data']);
+               }
 
-       $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature');
-       if($dsig) {
-               $res['dsprsig'] = unxmlify($dsig[0]['data']);
+               $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid');
+               if($dguid)
+                       $res['guid'] = unxmlify($dguid[0]['data']);
        }
 
-       $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid');
-       if($dguid)
-               $res['guid'] = unxmlify($dguid[0]['data']);
 
        $bm = $item->get_item_tags(NAMESPACE_DFRN,'bookmark');
        if($bm)
@@ -699,13 +704,17 @@ function item_store($arr,$force_parent = false) {
 
        // If a Diaspora signature structure was passed in, pull it out of the 
        // item array and set it aside for later storage.
+       $dspr_enabled = intval(get_config('system','diaspora_enabled'));
 
        $dsprsig = null;
+
        if(x($arr,'dsprsig')) {
-               $dsprsig = json_decode(base64_decode($arr['dsprsig']));
+               if($dspr_enabled)
+                       $dsprsig = json_decode(base64_decode($arr['dsprsig']));
                unset($arr['dsprsig']);
        }
 
+
        if(x($arr, 'gravity'))
                $arr['gravity'] = intval($arr['gravity']);
        elseif($arr['parent-uri'] === $arr['uri'])
@@ -934,7 +943,9 @@ function item_store($arr,$force_parent = false) {
                intval($parent_id)
        );
 
-       if($dsprsig) {
+
+       // Store the Diaspora signature if there is one
+       if($dspr_enabled && $dsprsig) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
                        intval($current_post),
                        dbesc($dsprsig->signed_text),
@@ -1008,6 +1019,7 @@ function tag_deliver($uid,$item_id) {
 
        $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']);
 
+
        $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$item['body'],$matches,PREG_SET_ORDER);
        if($cnt) {
                foreach($matches as $mtch) {
@@ -2973,12 +2985,15 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
        if($item['app'])
                $o .= '<statusnet:notice_info local_id="' . $item['id'] . '" source="' . xmlify($item['app']) . '" ></statusnet:notice_info>' . "\r\n";
 
-       if($item['guid'])
-               $o .= '<dfrn:diaspora_guid>' . $item['guid'] . '</dfrn:diaspora_guid>' . "\r\n";
+       $dspr_enabled = intval(get_config('system','diaspora_enabled'));
+       if( $dspr_enabled) {
+               if($item['guid'])
+                       $o .= '<dfrn:diaspora_guid>' . $item['guid'] . '</dfrn:diaspora_guid>' . "\r\n";
 
-       if($item['signed_text']) {
-               $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer'])));
-               $o .= '<dfrn:diaspora_signature>' . xmlify($sign) . '</dfrn:diaspora_signature>' . "\r\n";
+               if($item['signed_text']) {
+                       $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer'])));
+                       $o .= '<dfrn:diaspora_signature>' . xmlify($sign) . '</dfrn:diaspora_signature>' . "\r\n";
+               }
        }
 
        $verb = construct_verb($item);
@@ -3317,7 +3332,9 @@ function drop_item($id,$interactive = true) {
                        // ignore the result
                }
 
-               // clean up item_id and sign meta-data tables
+               // clean up item_id and sign (Diaspora signature) meta-data tables
+               // Clean up the sign table even if Diaspora support is disabled. We may still need to
+               // clean it up if Diaspora support had been enabled in the past
 
                $r = q("DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d)",
                        intval($item['id']),
@@ -3359,40 +3376,8 @@ function drop_item($id,$interactive = true) {
                                );
                        }
 
-                       // Add a relayable_retraction signature for Diaspora. Note that we can't add a target_author_signature
-                       // if the comment was deleted by a remote user. That should be ok, because if a remote user is deleting
-                       // the comment, that means we're the home of the post, and Diaspora will only
-                       // check the parent_author_signature of retractions that it doesn't have to relay further
-                       //
-                       // I don't think this function gets called for an "unlike," but I'll check anyway
-                       $signed_text = $item['guid'] . ';' . ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
-
-                       if(local_user() == $item['uid']) {
-
-                               $handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
-                               $authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha256'));
-                       }
-                       else {
-                               $r = q("SELECT `nick`, `url` FROM `contact` WHERE `id` = '%d' LIMIT 1",
-                                       $item['contact-id']
-                               );
-                               if(count($r)) {
-                                       // The below handle only works for NETWORK_DFRN. I think that's ok, because this function
-                                       // only handles DFRN deletes
-                                       $handle_baseurl_start = strpos($r['url'],'://') + 3;
-                                       $handle_baseurl_length = strpos($r['url'],'/profile') - $handle_baseurl_start;
-                                       $handle = $r['nick'] . '@' . substr($r['url'], $handle_baseurl_start, $handle_baseurl_length);
-                                       $authorsig = '';
-                               }
-                       }
-
-                       if(isset($handle))
-                               q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
-                                       intval($item['id']),
-                                       dbesc($signed_text),
-                                       dbesc($authorsig),
-                                       dbesc($handle)
-                               );
+                       // Add a relayable_retraction signature for Diaspora.
+                       store_diaspora_retract_sig($item, $a->user, $a->get_baseurl());
                }
                $drop_id = intval($item['id']);
 
@@ -3479,4 +3464,52 @@ function posted_date_widget($url,$uid,$wall) {
                '$dates' => $ret
        ));
        return $o;
-}
\ No newline at end of file
+}
+
+
+function store_diaspora_retract_sig($item, $user, $baseurl) {
+       // Note that we can't add a target_author_signature
+       // if the comment was deleted by a remote user. That should be ok, because if a remote user is deleting
+       // the comment, that means we're the home of the post, and Diaspora will only
+       // check the parent_author_signature of retractions that it doesn't have to relay further
+       //
+       // I don't think this function gets called for an "unlike," but I'll check anyway
+
+       $enabled = intval(get_config('system','diaspora_enabled'));
+       if(! $enabled) {
+               return;
+       }
+
+       logger('drop_item: storing diaspora retraction signature');
+
+       $signed_text = $item['guid'] . ';' . ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
+
+       if(local_user() == $item['uid']) {
+
+               $handle = $user['nickname'] . '@' . substr($baseurl, strpos($baseurl,'://') + 3);
+               $authorsig = base64_encode(rsa_sign($signed_text,$user['prvkey'],'sha256'));
+       }
+       else {
+               $r = q("SELECT `nick`, `url` FROM `contact` WHERE `id` = '%d' LIMIT 1",
+                       $item['contact-id']
+               );
+               if(count($r)) {
+                       // The below handle only works for NETWORK_DFRN. I think that's ok, because this function
+                       // only handles DFRN deletes
+                       $handle_baseurl_start = strpos($r['url'],'://') + 3;
+                       $handle_baseurl_length = strpos($r['url'],'/profile') - $handle_baseurl_start;
+                       $handle = $r['nick'] . '@' . substr($r['url'], $handle_baseurl_start, $handle_baseurl_length);
+                       $authorsig = '';
+               }
+       }
+
+       if(isset($handle))
+               q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+                       intval($item['id']),
+                       dbesc($signed_text),
+                       dbesc($authorsig),
+                       dbesc($handle)
+               );
+
+       return;
+}
index f0a1940d498cffd17cc426ddc41f64ebe7d6f535..fe6cc394ed9b3cab191c5e437ff009670a0da741 100644 (file)
@@ -709,11 +709,11 @@ function notifier_run($argv, $argc){
                                        }
                                        break;
                                case NETWORK_DIASPORA:
-                                       require_once('include/diaspora.php');
-
                                        if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')))
                                                break;
 
+                                       require_once('include/diaspora.php');
+
                                        if($mail) {
                                                diaspora_send_mail($item,$owner,$contact);
                                                break;
@@ -860,13 +860,17 @@ function notifier_run($argv, $argc){
 
        }
 
-       // If the item was deleted, clean up the `sign` table
+
+       // If the item was deleted, clean up the `sign` table (for Diaspora signatures)
+       // Do this even if Diaspora support is disabled, as it may have been enabled in
+       // the past
        if($target_item['deleted']) {
                $r = q("DELETE FROM sign where `retract_iid` = %d",
                        intval($target_item['id'])
                );
        }
 
+
        logger('notifier: calling hooks', LOGGER_DEBUG);
 
        if($normal_mode)
index 54f9fc06aaf5d5a87aa862fd7794e629960d953f..5c179bc7a187bc3c7ff063e12b1d5a25ba2f4de7 100644 (file)
@@ -728,26 +728,13 @@ function item_post(&$a) {
                        
                        }
 
-                       // We won't be able to sign Diaspora comments for authenticated visitors - we don't have their private key
-
-                       if($self) {
-                               require_once('include/bb2diaspora.php');
-                               $signed_body = html_entity_decode(bb2diaspora($datarray['body']));
-                               $myaddr = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
-                               if($datarray['verb'] === ACTIVITY_LIKE) 
-                                       $signed_text = $datarray['guid'] . ';' . 'Post' . ';' . $parent_item['guid'] . ';' . 'true' . ';' . $myaddr;
-                               else
-                                       $signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $myaddr;
 
-                               $authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha256'));
+                       // Store the comment signature information in case we need to relay to Diaspora
+                       // May want to have this run for remote users too, in which case the function needs to be
+                       // expanded
+                       if($self)
+                               store_diaspora_comment_sig($datarray, $a->user, $a->get_baseurl(), $parent_item, $post_id);
 
-                               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($myaddr)
-                               );
-                       }
                }
                else {
                        $parent = $post_id;
@@ -1038,3 +1025,38 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
 
        return array('replaced' => $replaced, 'contact' => $r[0]);      
 }
+
+
+function store_diaspora_comment_sig($datarray, $user, $baseurl, $parent_item, $post_id) {
+       // We won't be able to sign Diaspora comments for authenticated visitors - we don't have their private key
+
+       // May want to have this run for remote users too, in which case the function needs to be
+       // expanded
+
+       $enabled = intval(get_config('system','diaspora_enabled'));
+       if(! $enabled) {
+               return;
+       }
+
+
+       logger('mod_item: storing diaspora comment signature');
+
+       require_once('include/bb2diaspora.php');
+       $signed_body = html_entity_decode(bb2diaspora($datarray['body']));
+       $myaddr = $user['nickname'] . '@' . substr($baseurl, strpos($baseurl,'://') + 3);
+       if($datarray['verb'] === ACTIVITY_LIKE) 
+               $signed_text = $datarray['guid'] . ';' . 'Post' . ';' . $parent_item['guid'] . ';' . 'true' . ';' . $myaddr;
+       else
+               $signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $myaddr;
+
+       $authorsig = base64_encode(rsa_sign($signed_text,$user['prvkey'],'sha256'));
+
+       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($myaddr)
+       );
+
+       return;
+}
index 642e948fdd6752f9923b50fe7df08eaab88416b0..29a77aa13543f7625f98f54cfebfe0ec54bb37dc 100755 (executable)
@@ -121,57 +121,16 @@ function like_content(&$a) {
                        intval($like_item['id'])
                );
 
-               // Clean up the `sign` table
+
+               // Clean up the Diaspora signatures for this like
+               // Go ahead and do it even if Diaspora support is disabled. We still want to clean up
+               // if it had been enabled in the past
                $r = q("DELETE FROM `sign` WHERE `iid` = %d",
                        intval($like_item['id'])
                );
 
                // Save the author information for the unlike in case we need to relay to Diaspora
-               // 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
-               //
-               // If $item['resource-id'] exists, it means the item is a photo. Diaspora doesn't support
-               // likes on photos, so don't bother.
-
-               if(($activity === ACTIVITY_LIKE) && (! $item['resource-id'])) {
-                       $signed_text = $like_item['guid'] . ';' . 'Like';
-
-                       if( $contact['network'] === NETWORK_DIASPORA)
-                               $diaspora_handle = $contact['addr'];
-                       else { // 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;
-
-                               // 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)
-                                               $authorsig = base64_encode(rsa_sign($signed_text,$r['prvkey'],'sha256'));
-                               }
-                       }
-
-                       if(! isset($authorsig))
-                               $authorsig = '';
-
-                       q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
-                               intval($like_item['id']),
-                               dbesc($signed_text),
-                               dbesc($authorsig),
-                               dbesc($diaspora_handle)
-                       );
-               }
+               store_diaspora_like_retract_sig($activity, $item, $like_item, $contact);
 
 
 //             proc_run('php',"include/notifier.php","like","$post_id"); // $post_id isn't defined here!
@@ -252,11 +211,88 @@ EOT;
 
 
        // Save the author information for the like in case we need to relay to Diaspora
+       store_diaspora_like_sig($activity, $item, $like_item, $contact);
+
+
+       $arr['id'] = $post_id;
+
+       call_hooks('post_local_end', $arr);
+
+       proc_run('php',"include/notifier.php","like","$post_id");
+
+       killme();
+//     return; // NOTREACHED
+}
+
+
+function store_diaspora_like_retract_sig($activity, $item, $like_item, $contact) {
+       // 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
+       //
+       // If $item['resource-id'] exists, it means the item is a photo. Diaspora doesn't support
+       // likes on photos, so don't bother.
+
+       $enabled = intval(get_config('system','diaspora_enabled'));
+       if(! $enabled)
+               return;
+
+       logger('mod_like: storing diaspora like retraction signature');
+
+       if(($activity === ACTIVITY_LIKE) && (! $item['resource-id'])) {
+               $signed_text = $like_item['guid'] . ';' . 'Like';
+
+               if( $contact['network'] === NETWORK_DIASPORA)
+                       $diaspora_handle = $contact['addr'];
+               else { // 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;
+
+                       // 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)
+                                       $authorsig = base64_encode(rsa_sign($signed_text,$r['prvkey'],'sha256'));
+                       }
+               }
+
+               if(! isset($authorsig))
+                       $authorsig = '';
+
+               q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+                       intval($like_item['id']),
+                       dbesc($signed_text),
+                       dbesc($authorsig),
+                       dbesc($diaspora_handle)
+               );
+       }
+
+       return;
+}
+
+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)
+               return;
+
+       logger('mod_like: storing diaspora like signature');
+
        if(($activity === ACTIVITY_LIKE) && ($post_type === t('status'))) {
                if( $contact['network'] === NETWORK_DIASPORA)
                        $diaspora_handle = $contact['addr'];
@@ -308,13 +344,5 @@ EOT;
                }
        }
 
-
-       $arr['id'] = $post_id;
-
-       call_hooks('post_local_end', $arr);
-
-       proc_run('php',"include/notifier.php","like","$post_id");
-
-       killme();
-//     return; // NOTREACHED
+       return;
 }