]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
Bugfix for pull request #2147 (Fix for issue #2122)
[friendica.git] / include / diaspora.php
index 5b242fe3b831936c7299915785ee9df5dc93862e..e0eaf065d6956907b921e9b40b0a0fa8e327bb97 100644 (file)
@@ -22,6 +22,12 @@ function diaspora_dispatch_public($msg) {
                return;
        }
 
+       // Use a dummy importer to import the data for the public copy
+       $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
+       $result = diaspora_dispatch($importer,$msg);
+       logger("Dispatcher reported ".$result, LOGGER_DEBUG);
+
+       // Now distribute it to the followers
        $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 ",
@@ -34,15 +40,8 @@ function diaspora_dispatch_public($msg) {
                        diaspora_dispatch($rr,$msg);
                }
        }
-       else {
+       else
                logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true));
-
-               // Use a dummy importer
-               $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
-               $result = diaspora_dispatch($importer,$msg);
-
-               logger("Dispatcher reported ".$result, LOGGER_DEBUG);
-       }
 }
 
 
@@ -111,6 +110,9 @@ function diaspora_dispatch($importer,$msg,$attempt=1) {
        elseif($xmlbase->message) {
                $ret = diaspora_message($importer,$xmlbase->message,$msg);
        }
+       elseif($xmlbase->participation) {
+               $ret = diaspora_participation($importer,$xmlbase->participation);
+       }
        else {
                logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
        }
@@ -590,7 +592,7 @@ function diaspora_request($importer,$xml) {
                // perhaps we were already sharing with this person. Now they're sharing with us.
                // That makes us friends.
 
-               if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) {
+               if($contact['rel'] == CONTACT_IS_FOLLOWER && in_array($importer['page-flags'], array(PAGE_FREELOVE))) {
                        q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
                                intval(CONTACT_IS_FRIEND),
                                intval($contact['id']),
@@ -767,12 +769,12 @@ function diaspora_request($importer,$xml) {
        return;
 }
 
-function diaspora_post_allow($importer,$contact) {
+function diaspora_post_allow($importer,$contact, $is_comment = false) {
 
        // perhaps we were already sharing with this person. Now they're sharing with us.
        // That makes us friends.
        // Normally this should have handled by getting a request - but this could get lost
-       if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) {
+       if($contact['rel'] == CONTACT_IS_FOLLOWER && in_array($importer['page-flags'], array(PAGE_FREELOVE))) {
                q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
                        intval(CONTACT_IS_FRIEND),
                        intval($contact['id']),
@@ -787,7 +789,7 @@ function diaspora_post_allow($importer,$contact) {
        if($contact['rel'] == CONTACT_IS_SHARING || $contact['rel'] == CONTACT_IS_FRIEND)
                return true;
        if($contact['rel'] == CONTACT_IS_FOLLOWER)
-               if($importer['page-flags'] == PAGE_COMMUNITY)
+               if(($importer['page-flags'] == PAGE_COMMUNITY) OR $is_comment)
                        return true;
 
        // Messages for the global users are always accepted
@@ -840,15 +842,14 @@ function diaspora_post($importer,$xml,$msg) {
                return 203;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_post: Ignoring this author.');
                return 202;
        }
 
        $message_id = $diaspora_handle . ':' . $guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r)) {
@@ -965,9 +966,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
        $objecttype = $item["object-type"];
 
        $message_id = $author.':'.$guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($uid),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r))
@@ -975,9 +975,21 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
 
        $person = find_diaspora_person_by_handle($author);
 
+       $contact_id = get_contact($person['url'], $uid);
+
+       $contacts = q("SELECT * FROM `contact` WHERE `id` = %d", intval($contact_id));
+       $importers = q("SELECT * FROM `user` WHERE `uid` = %d", intval($uid));
+
+       if ($contacts AND $importers)
+               if(!diaspora_post_allow($importers[0],$contacts[0], false)) {
+                       logger('Ignoring author '.$person['url'].' for uid '.$uid);
+                       return false;
+               } else
+                       logger('Author '.$person['url'].' is allowed for uid '.$uid);
+
        $datarray = array();
        $datarray['uid'] = $uid;
-       $datarray['contact-id'] = get_contact($person['url'], $uid);
+       $datarray['contact-id'] = $contact_id;
        $datarray['wall'] = 0;
        $datarray['network']  = NETWORK_DIASPORA;
        $datarray['guid'] = $guid;
@@ -1117,15 +1129,14 @@ function diaspora_reshare($importer,$xml,$msg) {
        if(! $contact)
                return;
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true));
                return 202;
        }
 
        $message_id = $diaspora_handle . ':' . $guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r)) {
@@ -1303,15 +1314,14 @@ function diaspora_asphoto($importer,$xml,$msg) {
        if(! $contact)
                return;
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_asphoto: Ignoring this author.');
                return 202;
        }
 
        $message_id = $diaspora_handle . ':' . $guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r)) {
@@ -1376,11 +1386,6 @@ function diaspora_asphoto($importer,$xml,$msg) {
 
 }
 
-
-
-
-
-
 function diaspora_comment($importer,$xml,$msg) {
 
        $a = get_app();
@@ -1399,7 +1404,7 @@ function diaspora_comment($importer,$xml,$msg) {
                return;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, true)) {
                logger('diaspora_comment: Ignoring this author.');
                return 202;
        }
@@ -1500,16 +1505,27 @@ function diaspora_comment($importer,$xml,$msg) {
                }
        }
 
+       // Fetch the contact id - if we know this contact
+       $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
+               dbesc(normalise_link($person['url'])), intval($importer['uid']));
+       if ($r) {
+               $cid = $r[0]['id'];
+               $network = $r[0]['network'];
+       } else {
+               $cid = $contact['id'];
+               $network = NETWORK_DIASPORA;
+       }
+
        $body = diaspora2bb($text);
        $message_id = $diaspora_handle . ':' . $guid;
 
        $datarray = array();
 
        $datarray['uid'] = $importer['uid'];
-       $datarray['contact-id'] = $contact['id'];
+       $datarray['contact-id'] = $cid;
        $datarray['type'] = 'remote-comment';
        $datarray['wall'] = $parent_item['wall'];
-       $datarray['network']  = NETWORK_DIASPORA;
+       $datarray['network']  = $network;
        $datarray['verb'] = ACTIVITY_POST;
        $datarray['gravity'] = GRAVITY_COMMENT;
        $datarray['guid'] = $guid;
@@ -1827,7 +1843,7 @@ function diaspora_message($importer,$xml,$msg) {
 
        $author_signature = base64_decode($msg_author_signature);
 
-       $person = find_diaspora_person_by_handle($msg_diaspora_handle); 
+       $person = find_diaspora_person_by_handle($msg_diaspora_handle);
        if(is_array($person) && x($person,'pubkey'))
                $key = $person['pubkey'];
        else {
@@ -1874,6 +1890,9 @@ function diaspora_message($importer,$xml,$msg) {
        return;
 }
 
+function diaspora_participation($importer,$xml) {
+       logger("Unsupported message type 'participation' ".print_r($xml, true));
+}
 
 function diaspora_photo($importer,$xml,$msg,$attempt=1) {
 
@@ -1903,7 +1922,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
                return;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_photo: Ignoring this author.');
                return 202;
        }
@@ -1990,7 +2009,7 @@ function diaspora_like($importer,$xml,$msg) {
                return;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_like: Ignoring this author.');
                return 202;
        }
@@ -2142,13 +2161,24 @@ function diaspora_like($importer,$xml,$msg) {
 EOT;
        $bodyverb = t('%1$s likes %2$s\'s %3$s');
 
+       // Fetch the contact id - if we know this contact
+       $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
+               dbesc(normalise_link($person['url'])), intval($importer['uid']));
+       if ($r) {
+               $cid = $r[0]['id'];
+               $network = $r[0]['network'];
+       } else {
+               $cid = $contact['id'];
+               $network = NETWORK_DIASPORA;
+       }
+
        $arr = array();
 
        $arr['uri'] = $uri;
        $arr['uid'] = $importer['uid'];
        $arr['guid'] = $guid;
-       $arr['network']  = NETWORK_DIASPORA;
-       $arr['contact-id'] = $contact['id'];
+       $arr['network']  = $network;
+       $arr['contact-id'] = $cid;
        $arr['type'] = 'activity';
        $arr['wall'] = $parent_item['wall'];
        $arr['gravity'] = GRAVITY_LIKE;
@@ -2224,8 +2254,23 @@ function diaspora_retraction($importer,$xml) {
        if($type === 'Person') {
                require_once('include/Contact.php');
                contact_remove($contact['id']);
-       }
-       elseif($type === 'Post') {
+       } elseif($type === 'StatusMessage') {
+               $guid = notags(unxmlify($xml->post_guid));
+
+               $r = q("SELECT * FROM `item` WHERE `guid` = '%s' AND `uid` = %d AND NOT `file` LIKE '%%[%%' LIMIT 1",
+                       dbesc($guid),
+                       intval($importer['uid'])
+               );
+               if(count($r)) {
+                       if(link_compare($r[0]['author-link'],$contact['url'])) {
+                               q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d",
+                                       dbesc(datetime_convert()),
+                                       intval($r[0]['id'])
+                               );
+                               delete_thread($r[0]['id'], $r[0]['parent-uri']);
+                       }
+               }
+       } elseif($type === 'Post') {
                $r = q("select * from item where guid = '%s' and uid = %d and not file like '%%[%%' limit 1",
                        dbesc('guid'),
                        intval($importer['uid'])
@@ -2408,7 +2453,8 @@ function diaspora_profile($importer,$xml,$msg) {
 
        $birthday = str_replace('1000','1901',$birthday);
 
-       $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
+       if ($birthday != "")
+               $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
 
        // this is to prevent multiple birthday notifications in a single year
        // if we already have a stored birthday and the 'm-d' part hasn't changed, preserve the entry, which will preserve the notify year