aboutsummaryrefslogtreecommitdiffstats
path: root/mod/like.php
diff options
context:
space:
mode:
Diffstat (limited to 'mod/like.php')
-rwxr-xr-x[-rw-r--r--]mod/like.php125
1 files changed, 121 insertions, 4 deletions
diff --git a/mod/like.php b/mod/like.php
index 6b97fafb5..942a04fe7 100644..100755
--- a/mod/like.php
+++ b/mod/like.php
@@ -104,7 +104,8 @@ function like_content(&$a) {
return;
}
- $r = q("SELECT `id` FROM `item` WHERE `verb` = '%s' AND `deleted` = 0
+
+ $r = q("SELECT * FROM `item` WHERE `verb` = '%s' AND `deleted` = 0
AND `contact-id` = %d AND ( `parent` = '%s' OR `parent-uri` = '%s') LIMIT 1",
dbesc($activity),
intval($contact['id']),
@@ -112,13 +113,70 @@ function like_content(&$a) {
dbesc($item_id)
);
if(count($r)) {
+ $like_item = $r[0];
+
// Already voted, undo it
$r = q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()),
- intval($r[0]['id'])
+ intval($like_item['id'])
);
- proc_run('php',"include/notifier.php","like","$post_id");
+ // Clean up the `sign` table
+ $r = q("DELETE FROM `sign` WHERE `iid` = %d",
+ intval($like_item['id'])
+ );
+
+ // Save the author information for the unlike in case we need to relay to Diaspora
+ // Note that we can only create a signature for a user of the local server. We don't have
+ // a key for remote users. That is ok, because if a remote user is "unlike"ing a post, it
+ // means we are the relay, and for relayable_retractions, Diaspora
+ // only checks the parent_author_signature if it doesn't have to relay further
+ //
+ // If $item['resource-id'] exists, it means the item is a photo. Diaspora doesn't support
+ // likes on photos, so don't bother.
+
+ if(($activity === ACTIVITY_LIKE) && (! $item['resource-id'])) {
+ $signed_text = $like_item['guid'] . ';' . 'Like';
+
+ if( $contact['network'] === NETWORK_DIASPORA)
+ $diaspora_handle = $contact['addr'];
+ else { // Only works for NETWORK_DFRN
+ $contact_baseurl_start = strpos($contact['url'],'://') + 3;
+ $contact_baseurl_length = strpos($contact['url'],'/profile') - $contact_baseurl_start;
+ $contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
+ $diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
+
+ // Get contact's private key if he's a user of the local Friendica server
+ $r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
+ dbesc($contact['url'])
+ );
+
+ if( $r) {
+ $contact_uid = $r['uid'];
+ $r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
+ intval($contact_uid)
+ );
+
+ if( $r)
+ $authorsig = base64_encode(rsa_sign($signed_text,$r['prvkey'],'sha256'));
+ }
+ }
+
+ if(! isset($authorsig))
+ $authorsig = '';
+
+ q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+ intval($like_item['id']),
+ dbesc($signed_text),
+ dbesc($authorsig),
+ dbesc($diaspora_handle)
+ );
+ }
+
+
+// proc_run('php',"include/notifier.php","like","$post_id"); // $post_id isn't defined here!
+ $like_item_id = $like_item['id'];
+ proc_run('php',"include/notifier.php","like","$like_item_id");
return;
}
@@ -191,6 +249,65 @@ EOT;
);
}
+
+ // Save the author information for the like in case we need to relay to Diaspora
+ // Note that we can only create a signature for a user of the local server. We don't have
+ // a key for remote users. That is ok, because if a remote user is "unlike"ing a post, it
+ // means we are the relay, and for relayable_retractions, Diaspora
+ // only checks the parent_author_signature if it doesn't have to relay further
+
+ if(($activity === ACTIVITY_LIKE) && ($post_type === t('status'))) {
+ if( $contact['network'] === NETWORK_DIASPORA)
+ $diaspora_handle = $contact['addr'];
+ else { // Only works for NETWORK_DFRN
+ $contact_baseurl_start = strpos($contact['url'],'://') + 3;
+ $contact_baseurl_length = strpos($contact['url'],'/profile') - $contact_baseurl_start;
+ $contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
+ $diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
+
+ // Get contact's private key if he's a user of the local Friendica server
+ $r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
+ dbesc($contact['url'])
+ );
+
+ if( $r) {
+ $contact_uid = $r['uid'];
+ $r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
+ intval($contact_uid)
+ );
+
+ if( $r)
+ $contact_uprvkey = $r['prvkey'];
+ }
+ }
+
+ $r = q("SELECT guid, parent FROM `item` WHERE id = %d LIMIT 1",
+ intval($post_id)
+ );
+ if( $r) {
+ $p = q("SELECT guid FROM `item` WHERE id = %d AND parent = %d LIMIT 1",
+ intval($r[0]['parent']),
+ intval($r[0]['parent'])
+ );
+ if( $p) {
+ $signed_text = $r[0]['guid'] . ';Post;' . $p[0]['guid'] . ';true;' . $diaspora_handle;
+
+ if(isset($contact_uprvkey))
+ $authorsig = base64_encode(rsa_sign($signed_text,$contact_uprvkey,'sha256'));
+ else
+ $authorsig = '';
+
+ q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+ intval($post_id),
+ dbesc($signed_text),
+ dbesc($authorsig),
+ dbesc($diaspora_handle)
+ );
+ }
+ }
+ }
+
+
$arr['id'] = $post_id;
call_hooks('post_local_end', $arr);
@@ -199,4 +316,4 @@ EOT;
killme();
// return; // NOTREACHED
-} \ No newline at end of file
+}