]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
BBCode: Add a linefeed between a picture and the following text. This is important...
[friendica.git] / include / diaspora.php
index df6700ae2bf1173a977c80e72c5da9474de6c333..8b85e7b9552c2158b71a81b2d56c8cca5955e427 100755 (executable)
@@ -7,47 +7,6 @@ require_once('include/contact_selectors.php');
 require_once('include/queue_fn.php');
 require_once('include/lock.php');
 
-function diaspora_add_page_info($url) {
-       require_once("mod/parse_url.php");
-       $data = parseurl_getsiteinfo($url, true);
-
-       logger('diaspora_add_page_info: fetch page info for '.$url.' '.print_r($data, true), LOGGER_DATA);
-
-       if (($data["type"] != "link") OR ($data["title"] == $url))
-               return("");
-
-       if (is_string($data["title"]))
-               $text .= "[bookmark=".$url."]".trim($data["title"])."[/bookmark]";
-
-       if (sizeof($data["images"]) > 0) {
-               $imagedata = $data["images"][0];
-               $text .= '[img]'.$imagedata["src"].'[/img]';
-       }
-
-       if (is_string($data["text"]))
-               $text .= "[quote]".$data["text"]."[/quote]";
-
-       return("\n[class=type-".$data["type"]."]".$text."[/class]");
-}
-
-function diaspora_add_page_info_to_body($body) {
-
-       logger('diaspora_add_page_info_to_body: fetch page info for body '.$body, LOGGER_DATA);
-
-       $URLSearchString = "^\[\]";
-
-       // Adding these spaces is a quick hack due to my problems with regular expressions :)
-       preg_match("/[^@#]\[url\]([$URLSearchString]*)\[\/url\]/ism", " ".$body, $matches);
-
-       if (!$matches)
-               preg_match("/[^@#]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", " ".$body, $matches);
-
-       if ($matches)
-               $body .= diaspora_add_page_info($matches[1]);
-
-       return $body;
-}
-
 function diaspora_dispatch_public($msg) {
 
        $enabled = intval(get_config('system','diaspora_enabled'));
@@ -303,7 +262,7 @@ function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) {
 
        logger('diaspora_pubmsg_build: ' . $msg, LOGGER_DATA);
 
-       
+
        $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
 
 //     $b64_data = base64_encode($msg);
@@ -317,7 +276,7 @@ function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) {
        $encoding = 'base64url';
        $alg = 'RSA-SHA256';
 
-       $signable_data = $data  . '.' . base64url_encode($type) . '.' 
+       $signable_data = $data  . '.' . base64url_encode($type) . '.'
                . base64url_encode($encoding) . '.' . base64url_encode($alg) ;
 
        $signature = rsa_sign($signable_data,$prvkey);
@@ -370,7 +329,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey,$public = false)
        $b_outer_aes_key = base64_encode($outer_aes_key);
        $outer_iv = random_string(16);
        $b_outer_iv = base64_encode($outer_iv);
-       
+
        $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
 
        $padded_data = pkcs5_pad($msg,16);
@@ -386,7 +345,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey,$public = false)
        $encoding = 'base64url';
        $alg = 'RSA-SHA256';
 
-       $signable_data = $data  . '.' . base64url_encode($type) . '.' 
+       $signable_data = $data  . '.' . base64url_encode($type) . '.'
                . base64url_encode($encoding) . '.' . base64url_encode($alg) ;
 
        $signature = rsa_sign($signable_data,$prvkey);
@@ -466,7 +425,7 @@ function diaspora_decode($importer,$xml) {
        else {
 
                $encrypted_header = json_decode(base64_decode($children->encrypted_header));
-       
+
                $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key);
                $ciphertext = base64_decode($encrypted_header->ciphertext);
 
@@ -526,7 +485,7 @@ function diaspora_decode($importer,$xml) {
                $base = $dom->env;
        elseif($dom->data)
                $base = $dom;
-       
+
        if(! $base) {
                logger('mod-diaspora: unable to locate salmon data in xml ');
                http_status_exit(400);
@@ -654,7 +613,7 @@ function diaspora_request($importer,$xml) {
                                $arr['author-avatar'] = $arr['owner-avatar'] = $self[0]['thumb'];
                                $arr['verb'] = ACTIVITY_FRIEND;
                                $arr['object-type'] = ACTIVITY_OBJ_PERSON;
-                               
+
                                $A = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url]';
                                $B = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
                                $BPhoto = '[url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]';
@@ -713,7 +672,7 @@ function diaspora_request($importer,$xml) {
                1,
                2
        );
-                
+
        // find the contact record we just created
 
        $contact_record = diaspora_get_contact_by_handle($importer['uid'],$sender_handle);
@@ -734,7 +693,7 @@ function diaspora_request($importer,$xml) {
        if($importer['page-flags'] == PAGE_NORMAL) {
 
                $hash = random_string() . (string) time();   // Generate a confirm_key
-       
+
                $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime` )
                        VALUES ( %d, %d, %d, %d, '%s', '%s', '%s' )",
                        intval($importer['uid']),
@@ -753,8 +712,8 @@ function diaspora_request($importer,$xml) {
                require_once('include/Photo.php');
 
                $photos = import_profile_photo($contact_record['photo'],$importer['uid'],$contact_record['id']);
-               
-               // technically they are sharing with us (CONTACT_IS_SHARING), 
+
+               // technically they are sharing with us (CONTACT_IS_SHARING),
                // but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX
                // we are going to change the relationship and make them a follower.
 
@@ -868,7 +827,7 @@ function diaspora_post($importer,$xml,$msg) {
        $body = diaspora2bb($xml->raw_message);
 
        // Add OEmbed and other information to the body
-       $body = diaspora_add_page_info_to_body($body);
+       $body = add_page_info_to_body($body, false, true);
 
        $datarray = array();
 
@@ -913,7 +872,8 @@ function diaspora_post($importer,$xml,$msg) {
        $datarray['uid'] = $importer['uid'];
        $datarray['contact-id'] = $contact['id'];
        $datarray['wall'] = 0;
-       $datarray['network']  = NETWORK_DIASPORA;
+       $datarray['network'] = NETWORK_DIASPORA;
+       $datarray['verb'] = ACTIVITY_POST;
        $datarray['guid'] = $guid;
        $datarray['uri'] = $datarray['parent-uri'] = $message_id;
        $datarray['changed'] = $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created);
@@ -1009,20 +969,36 @@ function diaspora_reshare($importer,$xml,$msg) {
        }
        elseif($source_xml->post->status_message) {
                $body = diaspora2bb($source_xml->post->status_message->raw_message);
+
+               // Checking for embedded pictures
+               if($source_xml->post->status_message->photo->remote_photo_path AND
+                       $source_xml->post->status_message->photo->remote_photo_name) {
+
+                       $remote_photo_path = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_path));
+                       $remote_photo_name = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_name));
+
+                       $body = '[img]'.$remote_photo_path.$remote_photo_name.'[/img]'."\n".$body;
+
+                       logger('diaspora_reshare: embedded picture link found: '.$body, LOGGER_DEBUG);
+               }
+
                $body = scale_external_images($body);
 
                // Add OEmbed and other information to the body
-               $body = diaspora_add_page_info_to_body($body);
+               $body = add_page_info_to_body($body, false, true);
        }
        else {
+               // Maybe it is a reshare of a photo that will be delivered at a later time (testing)
                logger('diaspora_reshare: no reshare content found: ' . print_r($source_xml,true));
-               return;
-       }
-       if(! $body) {
-               logger('diaspora_reshare: empty body: source= ' . $x);
-               return;
+               $body = "";
+               //return;
        }
 
+       //if(! $body) {
+       //      logger('diaspora_reshare: empty body: source= ' . $x);
+       //      return;
+       //}
+
        $person = find_diaspora_person_by_handle($orig_author);
 
        /*if(is_array($person) && x($person,'name') && x($person,'url'))
@@ -1113,6 +1089,9 @@ function diaspora_reshare($importer,$xml,$msg) {
        $datarray['tag'] = $str_tags;
        $datarray['app']  = 'Diaspora';
 
+       // if empty content it might be a photo that hasn't arrived yet. If a photo arrives, we'll make it visible. (testing)
+       $datarray['visible'] = ((strlen($body)) ? 1 : 0);
+
        $message_id = item_store($datarray);
 
        //if($message_id) {
@@ -1368,6 +1347,7 @@ function diaspora_comment($importer,$xml,$msg) {
        $datarray['type'] = 'remote-comment';
        $datarray['wall'] = $parent_item['wall'];
        $datarray['network']  = NETWORK_DIASPORA;
+       $datarray['verb'] = ACTIVITY_POST;
        $datarray['gravity'] = GRAVITY_COMMENT;
        $datarray['guid'] = $guid;
        $datarray['uri'] = $message_id;
@@ -1393,12 +1373,13 @@ function diaspora_comment($importer,$xml,$msg) {
 
        $message_id = item_store($datarray);
 
-       if($message_id) {
-               q("update item set plink = '%s' where id = %d",
-                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
-                       intval($message_id)
-               );
-       }
+       //if($message_id) {
+               //q("update item set plink = '%s' where id = %d",
+               //      //dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+               //      dbesc($a->get_baseurl().'/display/'.$datarray['guid']),
+               //      intval($message_id)
+               //);
+       //}
 
        if(($parent_item['origin']) && (! $parent_author_signature)) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
@@ -1426,12 +1407,12 @@ function diaspora_comment($importer,$xml,$msg) {
                foreach($myconv as $conv) {
 
                        // now if we find a match, it means we're in this conversation
-       
+
                        if(! link_compare($conv['author-link'],$importer_url))
                                continue;
 
                        require_once('include/enotify.php');
-                                                               
+
                        $conv_parent = $conv['parent'];
 
                        notification(array(
@@ -1442,7 +1423,7 @@ function diaspora_comment($importer,$xml,$msg) {
                                'to_email'     => $importer['email'],
                                'uid'          => $importer['uid'],
                                'item'         => $datarray,
-                               'link'             => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id,
+                               'link'             => $a->get_baseurl().'/display/'.urlencode($datarray['guid']),
                                'source_name'  => $datarray['author-name'],
                                'source_link'  => $datarray['author-link'],
                                'source_photo' => $datarray['author-avatar'],
@@ -1625,7 +1606,7 @@ function diaspora_conversation($importer,$xml,$msg) {
                        'verb' => ACTIVITY_POST,
                        'otype' => 'mail'
                ));
-       }       
+       }
 
        return;
 }
@@ -1890,8 +1871,12 @@ function diaspora_like($importer,$xml,$msg) {
                $parent_author_signature = base64_decode($parent_author_signature);
 
                if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
-                       logger('diaspora_like: top-level owner verification failed.');
-                       return;
+                       if (intval(get_config('system','ignore_diaspora_like_signature')))
+                               logger('diaspora_like: top-level owner verification failed. Proceeding anyway.');
+                       else {
+                               logger('diaspora_like: top-level owner verification failed.');
+                               return;
+                       }
                }
        }
        else {
@@ -1903,8 +1888,12 @@ function diaspora_like($importer,$xml,$msg) {
                $author_signature = base64_decode($author_signature);
 
                if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) {
-                       logger('diaspora_like: like creator verification failed.');
-                       return;
+                       if (intval(get_config('system','ignore_diaspora_like_signature')))
+                               logger('diaspora_like: like creator verification failed. Proceeding anyway');
+                       else {
+                               logger('diaspora_like: like creator verification failed.');
+                               return;
+                       }
                }
        }
 
@@ -1969,7 +1958,8 @@ EOT;
 
        $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
        $alink = '[url=' . $parent_item['author-link'] . ']' . $parent_item['author-name'] . '[/url]';
-       $plink = '[url=' . $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $parent_item['id'] . ']' . $post_type . '[/url]';
+       //$plink = '[url=' . $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $parent_item['id'] . ']' . $post_type . '[/url]';
+       $plink = '[url='.$a->get_baseurl().'/display/'.urlencode($guid).']'.$post_type.'[/url]';
        $arr['body'] =  sprintf( $bodyverb, $ulink, $alink, $plink );
 
        $arr['app']  = 'Diaspora';
@@ -1985,12 +1975,13 @@ EOT;
        $message_id = item_store($arr);
 
 
-       if($message_id) {
-               q("update item set plink = '%s' where id = %d",
-                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
-                       intval($message_id)
-               );
-       }
+       //if($message_id) {
+       //      q("update item set plink = '%s' where id = %d",
+       //              //dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+       //              dbesc($a->get_baseurl().'/display/'.$guid),
+       //              intval($message_id)
+       //      );
+       //}
 
        if(! $parent_author_signature) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
@@ -2323,7 +2314,7 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
                                $body .= '[' . $mtch[3] . '](' . $mtch[1] . ')' . "\n";
                        }
                }
-       }       
+       }
 
 
        $public = (($item['private']) ? 'false' : 'true');
@@ -2331,22 +2322,40 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
        require_once('include/datetime.php');
        $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C');
 
-       $tpl = get_markup_template('diaspora_post.tpl');
-       $msg = replace_macros($tpl, array(
-               '$body' => $body,
-               '$guid' => $item['guid'],
-               '$handle' => xmlify($myaddr),
-               '$public' => $public,
-               '$created' => $created
-       ));
+       // Detect a share element and do a reshare
+       // see: https://github.com/Raven24/diaspora-federation/blob/master/lib/diaspora-federation/entities/reshare.rb
+       if (!$item['private'] AND ($ret = diaspora_is_reshare($item["body"]))) {
+               $tpl = get_markup_template('diaspora_reshare.tpl');
+               $msg = replace_macros($tpl, array(
+                       '$root_handle' => xmlify($ret['root_handle']),
+                       '$root_guid' => $ret['root_guid'],
+                       '$guid' => $item['guid'],
+                       '$handle' => xmlify($myaddr),
+                       '$public' => $public,
+                       '$created' => $created,
+                       '$provider' => $item["app"]
+               ));
+       } else {
+               $tpl = get_markup_template('diaspora_post.tpl');
+               $msg = replace_macros($tpl, array(
+                       '$body' => $body,
+                       '$guid' => $item['guid'],
+                       '$handle' => xmlify($myaddr),
+                       '$public' => $public,
+                       '$created' => $created,
+                       '$provider' => $item["app"]
+               ));
+       }
 
-       logger('diaspora_send_status: ' . $owner['username'] . ' -> ' . $contact['name'] . ' base message: ' . $msg, LOGGER_DATA);
+       logger('diaspora_send_status: '.$owner['username'].' -> '.$contact['name'].' base message: '.$msg, LOGGER_DATA);
 
        $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
        //$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch));
 
        $return_code = diaspora_transmit($owner,$contact,$slap,$public_batch);
 
+       logger('diaspora_send_status: guid: '.$item['guid'].' result '.$return_code, LOGGER_DEBUG);
+
        if(count($images)) {
                diaspora_send_images($item,$owner,$contact,$images,$public_batch);
        }
@@ -2354,6 +2363,53 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
        return $return_code;
 }
 
+function diaspora_is_reshare($body) {
+       $body = trim($body);
+
+        // Skip if it isn't a pure repeated messages
+        // Does it start with a share?
+        if (strpos($body, "[share") > 0)
+                return(false);
+
+        // Does it end with a share?
+        if (strlen($body) > (strrpos($body, "[/share]") + 8))
+                return(false);
+
+        $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
+        // Skip if there is no shared message in there
+        if ($body == $attributes)
+                return(false);
+
+        $profile = "";
+        preg_match("/profile='(.*?)'/ism", $attributes, $matches);
+        if ($matches[1] != "")
+                $profile = $matches[1];
+
+        preg_match('/profile="(.*?)"/ism', $attributes, $matches);
+        if ($matches[1] != "")
+                $profile = $matches[1];
+
+        $ret= array();
+
+        $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
+        if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == ""))
+                return(false);
+
+        $link = "";
+        preg_match("/link='(.*?)'/ism", $attributes, $matches);
+        if ($matches[1] != "")
+                $link = $matches[1];
+
+        preg_match('/link="(.*?)"/ism', $attributes, $matches);
+        if ($matches[1] != "")
+                $link = $matches[1];
+
+        $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
+        if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == ""))
+                return(false);
+
+        return($ret);
+}
 
 function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) {
        $a = get_app();