<?php
+/*
+To-Do:
+- GET /people/9aed8882b9f64896/stream
+*/
+
require_once('include/crypto.php');
require_once('include/items.php');
require_once('include/bb2diaspora.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 ",
+ ( 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'])
);
}
}
else
- logger('diaspora_public: no subscribers');
+ logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true));
}
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));
}
// This will also convert diaspora public key from pkcs#1 to pkcs#8
logger('mod-diaspora: Fetching key for ' . $author_link );
- $key = get_diaspora_key($author_link);
+ $key = get_diaspora_key($author_link);
if(! $key) {
logger('mod-diaspora: Could not retrieve author key.');
// 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']),
$i = item_store($arr);
if($i)
- proc_run('php',"include/notifier.php","activity","$i");
+ proc_run('php',"include/notifier.php","activity","$i");
}
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
+ if ($importer['uid'] == 0)
+ return true;
+
return false;
}
}
function diaspora_plink($addr, $guid) {
- $r = q("SELECT `url`, `nick` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
+ $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr);
// Fallback
if (!$r)
return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid;
+ // Friendica contacts are often detected as Diaspora contacts in the "fcontact" table
+ // So we try another way as well.
+ $s = q("SELECT `network` FROM `gcontact` WHERE `nurl`='%s' LIMIT 1", dbesc(normalise_link($r[0]["url"])));
+ if ($s)
+ $r[0]["network"] = $s[0]["network"];
+
+ if ($r[0]["network"] == NETWORK_DFRN)
+ return(str_replace("/profile/".$r[0]["nick"]."/", "/display/".$guid, $r[0]["url"]."/"));
+
if (diaspora_is_redmatrix($r[0]["url"]))
return $r[0]["url"]."/?f=&mid=".$guid;
}
$contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
- if(! $contact)
- return;
+ if(! $contact) {
+ logger('diaspora_post: A Contact for handle '.$diaspora_handle.' and user '.$importer['uid'].' was not found');
+ 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)) {
logger('diaspora_post: message exists: ' . $guid);
- return;
+ return 208;
}
$created = unxmlify($xml->created_at);
$datarray['body'] = $body;
$datarray['tag'] = $str_tags;
if ($xml->provider_display_name)
- $datarray["app"] = unxmlify($xml->provider_display_name);
+ $datarray["app"] = unxmlify($xml->provider_display_name);
else
$datarray['app'] = 'Diaspora';
DiasporaFetchGuid($datarray);
$message_id = item_store($datarray);
- return;
+ logger("Stored item with message id ".$message_id, LOGGER_DEBUG);
+
+ return 201;
}
function diaspora_store_by_guid($guid, $server, $uid = 0) {
require_once("include/Contact.php");
- $serverparts = parse_url($server);
- $server = $serverparts["scheme"]."://".$serverparts["host"];
+ $serverparts = parse_url($server);
+ $server = $serverparts["scheme"]."://".$serverparts["host"];
logger("Trying to fetch item ".$guid." from ".$server, LOGGER_DEBUG);
$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);
- $datarray = array();
+ $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;
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)) {
$orig_author = notags(unxmlify($xml->root_diaspora_id));
$orig_guid = notags(unxmlify($xml->root_guid));
+ $orig_url = $a->get_baseurl()."/display/".$orig_guid;
$create_original_post = false;
// Do we already have this item?
- $r = q("SELECT `body`, `tag`, `app`, `created`, `author-link`, `plink` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1",
+ $r = q("SELECT `body`, `tag`, `app`, `created`, `plink`, `object`, `object-type`, `uri` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1",
dbesc($orig_guid),
dbesc(NETWORK_DIASPORA)
);
if(count($r)) {
- logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system: '.$orig_url);
+ logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system.');
// Maybe it is already a reshared item?
// Then refetch the content, since there can be many side effects with reshared posts from other networks or reshares from reshares
$str_tags = $r[0]["tag"];
$app = $r[0]["app"];
$orig_created = $r[0]["created"];
- $orig_author = $r[0]["author-link"];
- $create_original_post = ($body != "");
- $orig_url = $a->get_baseurl()."/display/".$orig_guid;
+ $orig_plink = $r[0]["plink"];
+ $orig_uri = $r[0]["uri"];
$object = $r[0]["object"];
$objecttype = $r[0]["object-type"];
}
$str_tags = "";
$app = "";
- $orig_url = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid;
-
$server = 'https://'.substr($orig_author,strpos($orig_author,'@')+1);
logger('1st try: reshared message '.$orig_guid." reshared by ".$guid.' will be fetched from original server: '.$server);
$item = diaspora_fetch_message($orig_guid, $server);
$orig_created = $item["created"];
$orig_author = $item["author"];
$orig_guid = $item["guid"];
+ $orig_plink = diaspora_plink($orig_author, $orig_guid);
+ $orig_uri = $orig_author.':'.$orig_guid;
$create_original_post = ($body != "");
- $orig_url = $a->get_baseurl()."/display/".$orig_guid;
$object = $item["object"];
$objecttype = $item["object-type"];
}
}
+ $plink = diaspora_plink($diaspora_handle, $guid);
+
$person = find_diaspora_person_by_handle($orig_author);
$created = unxmlify($xml->created_at);
$datarray = array();
- $plink = diaspora_plink($diaspora_handle, $guid);
-
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $contact['id'];
$datarray['wall'] = 0;
$datarray2['uid'] = 0;
$datarray2['contact-id'] = get_contact($person['url'], 0);
$datarray2['guid'] = $orig_guid;
- $datarray2['uri'] = $datarray2['parent-uri'] = $orig_author.':'.$orig_guid;
+ $datarray2['uri'] = $datarray2['parent-uri'] = $orig_uri;
$datarray2['changed'] = $datarray2['created'] = $datarray2['edited'] = $datarray2['commented'] = $datarray2['received'] = datetime_convert('UTC','UTC',$orig_created);
- $datarray2['plink'] = diaspora_plink($orig_author, $orig_guid);
+ $datarray2['parent'] = 0;
+ $datarray2['plink'] = $orig_plink;
$datarray2['author-name'] = $person['name'];
$datarray2['author-link'] = $person['url'];
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)) {
return;
}
- if(! diaspora_post_allow($importer,$contact)) {
+ if(! diaspora_post_allow($importer,$contact, true)) {
logger('diaspora_comment: Ignoring this author.');
return 202;
}
$created_at = datetime_convert('UTC','UTC',notags(unxmlify($xml->created_at)));
$parent_uri = $diaspora_handle . ':' . $guid;
-
+
$messages = $xml->message;
if(! count($messages)) {
return;
}
- if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_conversation: Ignoring this author.');
return 202;
}
);
if($r)
$c = q("select * from conv where uid = %d and guid = '%s' limit 1",
- intval($importer['uid']),
- dbesc($guid)
- );
+ intval($importer['uid']),
+ dbesc($guid)
+ );
if(count($c))
- $conversation = $c[0];
+ $conversation = $c[0];
}
if(! $conversation) {
logger('diaspora_conversation: unable to create conversation.');
$msg_diaspora_handle = notags(unxmlify($xml->diaspora_handle));
$msg_conversation_guid = notags(unxmlify($xml->conversation_guid));
- $parent_uri = $diaspora_handle . ':' . $msg_parent_guid;
-
+ $parent_uri = $msg_diaspora_handle . ':' . $msg_parent_guid;
+
$contact = diaspora_get_contact_by_handle($importer['uid'],$msg_diaspora_handle);
if(! $contact) {
logger('diaspora_message: cannot find contact: ' . $msg_diaspora_handle);
return;
}
- if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_message: Ignoring this author.');
return 202;
}
$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;
}
$link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
$link_text = scale_external_images($link_text, true,
- array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
+ array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
if(strpos($parent_item['body'],$link_text) === false) {
$r = q("UPDATE `item` SET `body` = '%s', `visible` = 1 WHERE `id` = %d AND `uid` = %d",
return;
}
- if(! diaspora_post_allow($importer,$contact)) {
+ if(! diaspora_post_allow($importer,$contact, false)) {
logger('diaspora_like: Ignoring this author.');
return 202;
}
$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
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);
+ // 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);
+ // 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);
+ $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);
- $guid = "";
- preg_match("/guid='(.*?)'/ism", $attributes, $matches);
- if ($matches[1] != "")
- $guid = $matches[1];
+ $guid = "";
+ preg_match("/guid='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $guid = $matches[1];
- preg_match('/guid="(.*?)"/ism', $attributes, $matches);
- if ($matches[1] != "")
- $guid = $matches[1];
+ preg_match('/guid="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $guid = $matches[1];
if ($guid != "") {
$r = q("SELECT `contact-id` FROM `item` WHERE `guid` = '%s' AND `network` IN ('%s', '%s') LIMIT 1",
}
}
- $profile = "";
- preg_match("/profile='(.*?)'/ism", $attributes, $matches);
- if ($matches[1] != "")
- $profile = $matches[1];
+ $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];
+ preg_match('/profile="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
- $ret= array();
+ $ret= array();
- $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
- if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == ""))
- return(false);
+ $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];
+ $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];
+ 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);
+ $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
+ if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == ""))
+ return(false);
- return($ret);
+ return($ret);
}
function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) {
// likes on 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'])
+ dbesc($item['thr-parent'])
);
}
else {
// likes on 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'])
+ dbesc($item['thr-parent'])
);
}
else {
$body = bb2diaspora($item['body']);
$created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C');
- $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';'
+ $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';'
. $created . ';' . $myaddr . ';' . $cnv['guid'];
$sig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
$msg = array(
'guid' => xmlify($item['guid']),
'parent_guid' => xmlify($cnv['guid']),
- 'parent_author_signature' => (($item['reply']) ? null : xmlify($sig)),
+ 'parent_author_signature' => xmlify($sig),
'author_signature' => xmlify($sig),
'text' => xmlify($body),
'created_at' => xmlify($created),
return(($return_code) ? $return_code : (-1));
}
+
+function diaspora_fetch_relay() {
+
+ $serverdata = get_config("system", "relay_server");
+ if ($serverdata == "")
+ return array();
+
+ $relay = array();
+
+ $servers = explode(",", $serverdata);
+
+ foreach($servers AS $server) {
+ $server = trim($server);
+ $batch = $server."/receive/public";
+
+ $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
+
+ if (!$relais) {
+ $addr = "relay@".str_replace("http://", "", normalise_link($server));
+
+ $r = q("INSERT INTO `contact` (`uid`, `created`, `name`, `nick`, `addr`, `url`, `nurl`, `batch`, `network`, `rel`, `blocked`, `pending`, `writable`, `name-date`, `uri-date`, `avatar-date`)
+ VALUES (0, '%s', '%s', 'relay', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, '%s', '%s', '%s')",
+ datetime_convert(),
+ dbesc($addr),
+ dbesc($addr),
+ dbesc($server),
+ dbesc(normalise_link($server)),
+ dbesc($batch),
+ dbesc(NETWORK_DIASPORA),
+ intval(CONTACT_IS_FOLLOWER),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert())
+ );
+
+ $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
+ if ($relais)
+ $relay[] = $relais[0];
+ } else
+ $relay[] = $relais[0];
+ }
+
+ return $relay;
+}