<?php
-/*
-To-Do:
-- GET /people/9aed8882b9f64896/stream
-*/
+/**
+ * @file include/diaspora.php
+ *
+ * @todo GET /people/9aed8882b9f64896/stream
+ */
require_once('include/crypto.php');
require_once('include/items.php');
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 ",
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);
- }
}
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));
}
// 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']),
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']),
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
}
function diaspora_plink($addr, $guid) {
- $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
+ $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", dbesc($addr));
// Fallback
if (!$r)
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)) {
$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))
$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;
DiasporaFetchGuid($datarray);
$message_id = item_store($datarray);
- // To-Do:
- // Looking if there is some subscribe mechanism in Diaspora to get all comments for this post
+ /// @TODO
+ /// Looking if there is some subscribe mechanism in Diaspora to get all comments for this post
return $message_id;
}
$body = scale_external_images($body);
// Add OEmbed and other information to the body
- // To-Do: It could be a repeated redmatrix item
- // Then we shouldn't add further data to it
+ /// @TODO It could be a repeated redmatrix item
+ /// Then we shouldn't add further data to it
if ($item["object-type"] == ACTIVITY_OBJ_NOTE)
$body = add_page_info_to_body($body, false, true);
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)) {
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)) {
}
-
-
-
-
-
function diaspora_comment($importer,$xml,$msg) {
$a = get_app();
return;
}
- if(! diaspora_post_allow($importer,$contact)) {
+ if(! diaspora_post_allow($importer,$contact, true)) {
logger('diaspora_comment: Ignoring this author.');
return 202;
}
}
}
+ // 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;
$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 {
return;
}
+function diaspora_participation($importer,$xml) {
+ logger("Unsupported message type 'participation' ".print_r($xml, true));
+}
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;
}
return;
}
- if(! diaspora_post_allow($importer,$contact)) {
+ if(! diaspora_post_allow($importer,$contact, false)) {
logger('diaspora_like: Ignoring this author.');
return 202;
}
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;
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'])
// The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always
// 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 origin from item where parent = %d and id = %d limit 1",
- $r[0]['parent'],
- $r[0]['parent']
+ $p = q("SELECT `origin` FROM `item` WHERE `parent` = %d AND `id` = %d LIMIT 1",
+ intval($r[0]['parent']),
+ intval($r[0]['parent'])
);
if(count($p)) {
if(($p[0]['origin']) && (! $parent_author_signature)) {
$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
if(substr($birthday,5) === substr($contact['bd'],5))
$birthday = $contact['bd'];
- // TODO: update name on item['author-name'] if the name changed. See consume_feed()
- // Not doing this currently because D* protocol is scheduled for revision soon.
+ /// @TODO Update name on item['author-name'] if the name changed. See consume_feed()
+ /// (Not doing this currently because D* protocol is scheduled for revision soon).
$r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d",
dbesc($name),