diff --git a/boot.php b/boot.php
index b0ff7830c..16b8f9c85 100644
--- a/boot.php
+++ b/boot.php
@@ -7,9 +7,9 @@ require_once('include/text.php');
require_once("include/pgettext.php");
-define ( 'FRIENDIKA_VERSION', '2.2.1080' );
+define ( 'FRIENDIKA_VERSION', '2.2.1081' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
-define ( 'DB_UPDATE_VERSION', 1081 );
+define ( 'DB_UPDATE_VERSION', 1082 );
define ( 'EOL', "
\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
diff --git a/database.sql b/database.sql
index 605433e6e..f659e8049 100644
--- a/database.sql
+++ b/database.sql
@@ -267,6 +267,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`contact-id` int(10) unsigned NOT NULL,
+ `guid` char(64) NOT NULL,
`resource-id` char(255) NOT NULL,
`created` datetime NOT NULL,
`edited` datetime NOT NULL,
@@ -288,7 +289,8 @@ CREATE TABLE IF NOT EXISTS `photo` (
KEY `resource-id` (`resource-id`),
KEY `album` (`album`),
KEY `scale` (`scale`),
- KEY `profile` (`profile`)
+ KEY `profile` (`profile`),
+ KEY `guid` (`guid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
diff --git a/include/Photo.php b/include/Photo.php
index de4c3d9e0..1450374ff 100644
--- a/include/Photo.php
+++ b/include/Photo.php
@@ -185,11 +185,20 @@ class Photo {
public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
+ $r = q("select `guid` from photo where `resource-id` = '%s' and `guid` != '' limit 1",
+ dbesc($rid)
+ );
+ if(count($r))
+ $guid = $r[0]['guid'];
+ else
+ $guid = get_guid();
+
$r = q("INSERT INTO `photo`
- ( `uid`, `contact-id`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
+ ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
intval($uid),
intval($cid),
+ dbesc($guid),
dbesc($rid),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
diff --git a/include/diaspora.php b/include/diaspora.php
index 345ea5562..a1edd08a6 100644
--- a/include/diaspora.php
+++ b/include/diaspora.php
@@ -597,6 +597,57 @@ function diaspora_comment($importer,$xml,$msg) {
}
+function diaspora_photo($importer,$xml,$msg) {
+
+ $remote_photo_path = notags(unxmlify($xml->remote_photo_path));
+
+ $remote_photo_name = notags(unxmlify($xml->remote_photo_name));
+
+ $status_message_guid = notags(unxmlify($xml->status_message_guid));
+
+ $guid = notags(unxmlify($xml->guid));
+
+ $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+
+ $public = notags(unxmlify($xml->public));
+
+ $created_at = notags(unxmlify($xml_created_at));
+
+
+ $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
+ if(! $contact)
+ return;
+
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
+ logger('diaspora_photo: Ignoring this author.');
+ http_status_exit(202);
+ // NOTREACHED
+ }
+
+ $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+ intval($importer['uid']),
+ dbesc($status_message_guid)
+ );
+ if(! count($r)) {
+ logger('diaspora_photo: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid);
+ return;
+ }
+ $parent_item = $r[0];
+
+ $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
+
+ $r = q("update item set `body` = '%s' where `id` = %d and `uid` = %d limit 1",
+ dbesc($link_text . $parent_item['body']),
+ intval($parent_item['id']),
+ intval($parent_item['uid'])
+ );
+
+ return;
+}
+
+
+
+
function diaspora_like($importer,$xml,$msg) {
$a = get_app();
@@ -847,7 +898,25 @@ function diaspora_send_status($item,$owner,$contact) {
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$theiraddr = $contact['addr'];
- $body = xmlify(bb2diaspora($item['body']));
+ $images = array();
+
+ $body = $item['body'];
+
+ $cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $detail = array();
+ $detail['str'] = $mtch[0];
+ $detail['path'] = dirname($mtch[1]);
+ $detail['file'] = basename($mtch[1]);
+ $detail['guid'] = $item['guid'];
+ $detail['handle'] = $myaddr;
+ $images[] = $detail;
+ $body = str_replace($detail['str'],'',$body);
+ }
+ }
+
+ $body = xmlify(bb2diaspora($body));
$public = (($item['private']) ? 'false' : 'true');
require_once('include/datetime.php');
@@ -869,10 +938,55 @@ function diaspora_send_status($item,$owner,$contact) {
post_url($contact['notify'] . '/',$slap);
$return_code = $a->get_curl_code();
logger('diaspora_send_status: returns: ' . $return_code);
+
+ if(count($images)) {
+ diaspora_send_images($item,$owner,$contact,$images);
+ }
+
return $return_code;
}
+function diaspora_send_images($item,$owner,$contact,$images) {
+ $a = get_app();
+ if(! count($images))
+ return;
+ $mysite = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://') + 3) . '/photo';
+
+ $tpl = get_markup_template('diaspora_photo.tpl');
+ foreach($images as $image) {
+ if(! stristr($image['path'],$mysite))
+ continue;
+ $resource = str_replace('.jpg','',$image['file']);
+ $resource = substr($resource,0,strpos($resource,'-'));
+
+ $r = q("select * from photo where `resource-id` = '%s' and `uid` = %d limit 1",
+ dbesc($resource),
+ intval($owner['uid'])
+ );
+ if(! count($r))
+ continue;
+ $public = (($r[0]['allow_cid'] || $r[0]['allow_gid'] || $r[0]['deny_cid'] || $r[0]['deny_gid']) ? 'false' : 'true' );
+ $msg = replace_macros($tpl,array(
+ '$path' => xmlify($image['path']),
+ '$filename' => xmlify($image['file']),
+ '$msg_guid' => xmlify($image['guid']),
+ '$guid' => xmlify($r[0]['guid']),
+ '$handle' => xmlify($image['handle']),
+ '$public' => xmlify($public),
+ '$created_at' => xmlify('UTC','UTC',$r[0]['created'],'Y-m-d h:i:s \U\T\C')
+ ));
+
+ logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA);
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+
+ post_url($contact['notify'] . '/',$slap);
+ $return_code = $a->get_curl_code();
+ logger('diaspora_send_photo: returns: ' . $return_code);
+ }
+
+}
+
function diaspora_send_followup($item,$owner,$contact) {
$a = get_app();
diff --git a/include/group.php b/include/group.php
index 1ebae7b7b..5e3a1511a 100644
--- a/include/group.php
+++ b/include/group.php
@@ -124,9 +124,10 @@ function group_public_members($gid) {
$r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member`
LEFT JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
WHERE `gid` = %d AND `group_member`.`uid` = %d
- AND `contact`.`network` != 'dfrn' AND `contact`.`network` != 'mail' AND `contact`.`network` != 'face' ",
+ AND `contact`.`network` = '%' AND `contact`.`notify` != '' ",
intval($gid),
- intval(local_user())
+ intval(local_user()),
+ dbesc(NETWORK_OSTATUS)
);
if(count($r))
$ret = count($r);
diff --git a/include/poller.php b/include/poller.php
index 651736a99..e80b696bf 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -82,12 +82,18 @@ function poller_run($argv, $argc){
if(! $restart)
proc_run('php','include/cronhooks.php');
+ // Only poll from those with suitable relationships,
+ // and which have a polling address and ignore Diaspora since
+ // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
+
$contacts = q("SELECT `id` FROM `contact`
WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
+ AND `network` != '%s'
$sql_extra
AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()",
intval(CONTACT_IS_SHARING),
- intval(CONTACT_IS_FRIEND)
+ intval(CONTACT_IS_FRIEND),
+ dbesc(NETWORK_DIASPORA)
);
if(! count($contacts)) {
diff --git a/mod/receive.php b/mod/receive.php
index c3738c143..b50774933 100644
--- a/mod/receive.php
+++ b/mod/receive.php
@@ -63,6 +63,9 @@ function receive_post(&$a) {
elseif($xmlbase->retraction) {
diaspora_retraction($importer,$xmlbase->retraction,$msg);
}
+ elseif($xmlbase->photo) {
+ diaspora_photo($importer,$xmlbase->photo,$msg);
+ }
else {
logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true));
}
diff --git a/update.php b/update.php
index adfb5fe02..ef036008f 100644
--- a/update.php
+++ b/update.php
@@ -1,6 +1,6 @@
true
-
+
{{ endfor }}
diff --git a/view/diaspora_photo.tpl b/view/diaspora_photo.tpl
new file mode 100644
index 000000000..75ca7f15c
--- /dev/null
+++ b/view/diaspora_photo.tpl
@@ -0,0 +1,13 @@
+
+
+
+ $path
+ $filename
+ $msg_guid
+ $guid
+ $handle
+ $public
+ $created_at
+
+
+
\ No newline at end of file