]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
give post a chance to arrive before rejecting photos from Diaspora
[friendica.git] / include / diaspora.php
index a23c11bd2161f947d50361602e6ce7601601d507..4b81efef8172faac9bed6384f5924be1770d4bc9 100755 (executable)
@@ -16,7 +16,9 @@ function diaspora_dispatch_public($msg) {
                return;
        }
 
-       $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) AND `account_expired` = 0 ",
+       $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN
+               ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' )
+               AND `account_expired` = 0 AND `account_removed` = 0 ",
                dbesc(NETWORK_DIASPORA),
                dbesc($msg['author'])
        );
@@ -32,7 +34,7 @@ function diaspora_dispatch_public($msg) {
 
 
 
-function diaspora_dispatch($importer,$msg) {
+function diaspora_dispatch($importer,$msg,$attempt=1) {
 
        $ret = 0;
 
@@ -88,7 +90,7 @@ function diaspora_dispatch($importer,$msg) {
                $ret = diaspora_signed_retraction($importer,$xmlbase->relayable_retraction,$msg);
        }
        elseif($xmlbase->photo) {
-               $ret = diaspora_photo($importer,$xmlbase->photo,$msg);
+               $ret = diaspora_photo($importer,$xmlbase->photo,$msg,$attempt);
        }
        elseif($xmlbase->conversation) {
                $ret = diaspora_conversation($importer,$xmlbase->conversation,$msg);
@@ -102,6 +104,37 @@ function diaspora_dispatch($importer,$msg) {
        return $ret;
 }
 
+function diaspora_handle_from_contact($contact_id) {
+       $handle = False;
+
+       logger("diaspora_handle_from_contact: contact id is " . $contact_id, LOGGER_DEBUG);
+
+       $r = q("SELECT network, addr, self, url, nick FROM contact WHERE id = %d",
+              intval($contact_id)
+       );
+       if($r) {
+               $contact = $r[0];
+
+               logger("diaspora_handle_from_contact: contact 'self' = " . $contact['self'] . " 'url' = " . $contact['url'], LOGGER_DEBUG);
+
+               if($contact['network'] === NETWORK_DIASPORA) {
+                       $handle = $contact['addr'];
+
+//                     logger("diaspora_handle_from_contact: contact id is a Diaspora person, handle = " . $handle, LOGGER_DEBUG);
+               }
+               elseif(($contact['network'] === NETWORK_DFRN) || ($contact['self'] == 1)) {
+                       $baseurl_start = strpos($contact['url'],'://') + 3;
+                       $baseurl_length = strpos($contact['url'],'/profile') - $baseurl_start; // allows installations in a subdirectory--not sure how Diaspora will handle
+                       $baseurl = substr($contact['url'], $baseurl_start, $baseurl_length);
+                       $handle = $contact['nick'] . '@' . $baseurl;
+
+//                     logger("diaspora_handle_from_contact: contact id is a DFRN person, handle = " . $handle, LOGGER_DEBUG);
+               }
+       }
+
+       return $handle;
+}
+
 function diaspora_get_contact_by_handle($uid,$handle) {
        $r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
                dbesc(NETWORK_DIASPORA),
@@ -110,6 +143,17 @@ function diaspora_get_contact_by_handle($uid,$handle) {
        );
        if($r && count($r))
                return $r[0];
+
+       $handle_parts = explode("@", $handle);
+       $nurl_sql = '%%://' . $handle_parts[1] . '%%/profile/' . $handle_parts[0];
+       $r = q("SELECT * FROM contact WHERE network = '%s' AND uid = %d AND nurl LIKE '%s' LIMIT 1",
+              dbesc(NETWORK_DFRN),
+              intval($uid),
+              dbesc($nurl_sql)
+       );
+       if($r && count($r))
+               return $r[0];
+
        return false;
 }
 
@@ -710,7 +754,7 @@ function diaspora_request($importer,$xml) {
 }
 
 function diaspora_post_allow($importer,$contact) {
-       if(($contact['blocked']) || ($contact['readonly']))
+       if(($contact['blocked']) || ($contact['readonly']) || ($contact['archive']))
                return false;
        if($contact['rel'] == CONTACT_IS_SHARING || $contact['rel'] == CONTACT_IS_FRIEND)
                return true;
@@ -817,7 +861,8 @@ function diaspora_post($importer,$xml,$msg) {
        $datarray['parent'] = 0;
        $datarray['owner-name'] = $contact['name'];
        $datarray['owner-link'] = $contact['url'];
-       $datarray['owner-avatar'] = $contact['thumb'];
+       //$datarray['owner-avatar'] = $contact['thumb'];
+       $datarray['owner-avatar'] = ((x($contact,'thumb')) ? $contact['thumb'] : $contact['photo']);
        $datarray['author-name'] = $contact['name'];
        $datarray['author-link'] = $contact['url'];
        $datarray['author-avatar'] = $contact['thumb'];
@@ -880,6 +925,7 @@ function diaspora_reshare($importer,$xml,$msg) {
        $orig_guid = notags(unxmlify($xml->root_guid));
 
        $source_url = 'https://' . substr($orig_author,strpos($orig_author,'@')+1) . '/p/' . $orig_guid . '.xml';
+       $orig_url = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid;
        $x = fetch_url($source_url);
        if(! $x)
                $x = fetch_url(str_replace('https://','http://',$source_url));
@@ -916,12 +962,12 @@ function diaspora_reshare($importer,$xml,$msg) {
 
        $person = find_diaspora_person_by_handle($orig_author);
 
-       if(is_array($person) && x($person,'name') && x($person,'url'))
+       /*if(is_array($person) && x($person,'name') && x($person,'url'))
                $details = '[url=' . $person['url'] . ']' . $person['name'] . '[/url]';
        else
                $details = $orig_author;
-       
-       $prefix = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . $details . "\n"; 
+
+       $prefix = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . $details . "\n";*/
 
 
        // allocate a guid on our system - we aren't fixing any collisions.
@@ -968,7 +1014,7 @@ function diaspora_reshare($importer,$xml,$msg) {
                        }
                }
        }
-       
+
        $datarray['uid'] = $importer['uid'];
        $datarray['contact-id'] = $contact['id'];
        $datarray['wall'] = 0;
@@ -979,11 +1025,24 @@ function diaspora_reshare($importer,$xml,$msg) {
        $datarray['parent'] = 0;
        $datarray['owner-name'] = $contact['name'];
        $datarray['owner-link'] = $contact['url'];
-       $datarray['owner-avatar'] = $contact['thumb'];
-       $datarray['author-name'] = $contact['name'];
-       $datarray['author-link'] = $contact['url'];
-       $datarray['author-avatar'] = $contact['thumb'];
-       $datarray['body'] = $prefix . $body;
+       $datarray['owner-avatar'] = ((x($contact,'thumb')) ? $contact['thumb'] : $contact['photo']);
+       if (intval(get_config('system','new_share'))) {
+               $prefix = "[share author='".str_replace("'", "'",$person['name']).
+                               "' profile='".$person['url'].
+                               "' avatar='".((x($person,'thumb')) ? $person['thumb'] : $person['photo']).
+                               "' link='".$orig_url."']";
+               $datarray['author-name'] = $contact['name'];
+               $datarray['author-link'] = $contact['url'];
+               $datarray['author-avatar'] = $contact['thumb'];
+               $datarray['body'] = $prefix.$body."[/share]";
+       } else {
+               // Let reshared messages look like wall-to-wall posts
+               $datarray['author-name'] = $person['name'];
+               $datarray['author-link'] = $person['url'];
+               $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
+               $datarray['body'] = $body;
+       }
+
        $datarray['tag'] = $str_tags;
        $datarray['app']  = 'Diaspora';
 
@@ -1074,7 +1133,8 @@ function diaspora_asphoto($importer,$xml,$msg) {
        $datarray['parent'] = 0;
        $datarray['owner-name'] = $contact['name'];
        $datarray['owner-link'] = $contact['url'];
-       $datarray['owner-avatar'] = $contact['thumb'];
+       //$datarray['owner-avatar'] = $contact['thumb'];
+       $datarray['owner-avatar'] = ((x($contact,'thumb')) ? $contact['thumb'] : $contact['photo']);
        $datarray['author-name'] = $contact['name'];
        $datarray['author-link'] = $contact['url'];
        $datarray['author-avatar'] = $contact['thumb'];
@@ -1282,7 +1342,7 @@ function diaspora_comment($importer,$xml,$msg) {
                // the existence of parent_author_signature means the parent_author or owner
                // is already relaying.
 
-               proc_run('php','include/notifier.php','comment',$message_id);
+               proc_run('php','include/notifier.php','comment-import',$message_id);
        }
 
        $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0 ",
@@ -1319,7 +1379,7 @@ function diaspora_comment($importer,$xml,$msg) {
                                'verb'         => ACTIVITY_POST,
                                'otype'        => 'item',
                                'parent'       => $conv_parent,
-
+                               'parent_uri'   => $parent_uri
                        ));
 
                        // only send one notification
@@ -1597,7 +1657,7 @@ function diaspora_message($importer,$xml,$msg) {
 }
 
 
-function diaspora_photo($importer,$xml,$msg) {
+function diaspora_photo($importer,$xml,$msg,$attempt=1) {
 
        $a = get_app();
 
@@ -1635,7 +1695,14 @@ function diaspora_photo($importer,$xml,$msg) {
                dbesc($status_message_guid)
        );
        if(! count($r)) {
-               logger('diaspora_photo: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid);
+               if($attempt <= 3) {
+                       q("INSERT INTO dsprphotoq (uid, msg, attempt) VALUES (%d, '%s', %d)",
+                          intval($importer['uid']),
+                          dbesc(serialize($msg)),
+                          intval($attempt + 1)
+                       );
+               }
+               logger('diaspora_photo: attempt = ' . $attempt . '; status message not found: ' . $status_message_guid . ' for photo: ' . $guid);
                return;
        }
 
@@ -1822,7 +1889,8 @@ EOT;
 
        $arr['owner-name'] = $parent_item['name'];
        $arr['owner-link'] = $parent_item['url'];
-       $arr['owner-avatar'] = $parent_item['thumb'];
+       //$arr['owner-avatar'] = $parent_item['thumb'];
+       $arr['owner-avatar'] = ((x($parent_item,'thumb')) ? $parent_item['thumb'] : $parent_item['photo']);
 
        $arr['author-name'] = $person['name'];
        $arr['author-link'] = $person['url'];
@@ -1867,7 +1935,7 @@ EOT;
        // is already relaying. The parent_item['origin'] indicates the message was created on our system
 
        if(($parent_item['origin']) && (! $parent_author_signature))
-               proc_run('php','include/notifier.php','comment',$message_id);
+               proc_run('php','include/notifier.php','comment-import',$message_id);
 
        return;
 }
@@ -1918,7 +1986,7 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
 
        $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
        if(! $contact) {
-               logger('diaspora_signed_retraction: no contact');
+               logger('diaspora_signed_retraction: no contact ' . $diaspora_handle . ' for ' . $importer['uid']);
                return;
        }
 
@@ -1993,7 +2061,7 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
                                                // is already relaying.
                                                logger('diaspora_signed_retraction: relaying relayable_retraction');
 
-                                               proc_run('php','include/notifier.php','relayable_retraction',$r[0]['id']);
+                                               proc_run('php','include/notifier.php','drop',$r[0]['id']);
                                        }
                                }
                        }
@@ -2030,11 +2098,20 @@ function diaspora_profile($importer,$xml,$msg) {
        $image_url = unxmlify($xml->image_url);
        $birthday = unxmlify($xml->birthday);
 
-       $r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE  `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ",
+
+       $handle_parts = explode("@", $diaspora_handle);
+       if($name === '') {
+               $name = $handle_parts[0];
+       }
+       if(strpos($image_url, $handle_parts[1]) === false) {
+               $image_url = "http://" . $handle_parts[1] . $image_url;
+       }
+
+/*     $r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE  `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ",
                intval($importer['uid']),
                intval($contact['id'])
        );
-       $oldphotos = ((count($r)) ? $r : null);
+       $oldphotos = ((count($r)) ? $r : null);*/
 
        require_once('include/Photo.php');
 
@@ -2067,7 +2144,7 @@ function diaspora_profile($importer,$xml,$msg) {
                intval($importer['uid'])
        ); 
 
-       if($r) {
+/*     if($r) {
                if($oldphotos) {
                        foreach($oldphotos as $ph) {
                                q("DELETE FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' AND `resource-id` = '%s' ",
@@ -2077,7 +2154,7 @@ function diaspora_profile($importer,$xml,$msg) {
                                );
                        }
                }
-       }       
+       }       */
 
        return;
 
@@ -2129,7 +2206,7 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
        $images = array();
 
        $title = $item['title'];
-       $body = $item['body'];
+       $body = fix_private_photos($item['body'], $owner['uid'], $item, $contact['id']);
 
 /*
        // We're trying to match Diaspora's split message/photo protocol but
@@ -2153,12 +2230,6 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
                }
        }
 */
-       /**
-        * Transform #tags, strip off the [url] and replace spaces with underscore
-        */
-       $body = preg_replace_callback('/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', create_function('$match',
-               'return \'#\'. str_replace(\' \', \'_\', $match[2]);'
-       ), $body);
 
        //if(strlen($title))
        //      $body = "[b]".html_entity_decode($title)."[/b]\n\n".$body;
@@ -2257,7 +2328,8 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
        $myaddr = $owner['nickname'] . '@' .  substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
 //     $theiraddr = $contact['addr'];
 
-       if($item['thr-parent']) {
+       // Diaspora doesn't support threaded comments
+       if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
                $p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
                        dbesc($item['thr-parent'])
                      );
@@ -2332,8 +2404,8 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
        $body = $item['body'];
        $text = html_entity_decode(bb2diaspora($body));
 
-
-       if($item['thr-parent']) {
+       // Diaspora doesn't support threaded comments
+       if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
                $p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
                        dbesc($item['thr-parent'])
                      );
@@ -2343,8 +2415,8 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
                // return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent.
                // The only item with `parent` and `id` as the parent id is the parent item.
                $p = q("select guid, type, uri, `parent-uri` from item where parent = %d and id = %d limit 1",
-                       intval($item['parent']),
-                       intval($item['parent'])
+                      intval($item['parent']),
+                      intval($item['parent'])
                      );
        }
        if(count($p))
@@ -2367,7 +2439,6 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
                $like = true;
 
                $target_type = ( $parent['uri'] === $parent['parent-uri']  ? 'Post' : 'Comment');
-//             $target_type = (strpos($parent['type'], 'comment') ? 'Comment' : 'Post');
 //             $positive = (($item['deleted']) ? 'false' : 'true');
                $positive = 'true';
 
@@ -2381,7 +2452,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
        // fetch the original signature if the relayable was created by a Diaspora
        // or DFRN user. Relayables for other networks are not supported.
 
-       $r = q("select * from sign where " . $sql_sign_id . " = %d limit 1",
+/*     $r = q("select * from sign where " . $sql_sign_id . " = %d limit 1",
                intval($item['id'])
        );
        if(count($r)) { 
@@ -2397,7 +2468,25 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
                // function is called
                logger('diaspora_send_relay: original author signature not found, cannot send relayable');
                return;
-       }
+       }*/
+
+       /* Since the author signature is only checked by the parent, not by the relay recipients,
+        * I think it may not be necessary for us to do so much work to preserve all the original
+        * signatures. The important thing that Diaspora DOES need is the original creator's handle.
+        * Let's just generate that and forget about all the original author signature stuff.
+        *
+        * Note: this might be more of an problem if we want to support likes on comments for older
+        * versions of Diaspora (diaspora-pistos), but since there are a number of problems with
+        * doing that, let's ignore it for now.
+        *
+        * Currently, only DFRN contacts are supported. StatusNet shouldn't be hard, but it hasn't
+        * been done yet
+        */
+
+       $handle = diaspora_handle_from_contact($item['contact-id']);
+       if(! $handle)
+               return;
+
 
        if($relay_retract)
                $sender_signed_text = $item['guid'] . ';' . $target_type;