The signature creation now moved into the Diaspora class. That's much cleaner.
This commit is contained in:
parent
5c44a787bf
commit
d676ae0f32
3 changed files with 125 additions and 124 deletions
|
@ -2190,13 +2190,18 @@ class diaspora {
|
||||||
*
|
*
|
||||||
* @return string the handle in the format user@domain.tld
|
* @return string the handle in the format user@domain.tld
|
||||||
*/
|
*/
|
||||||
private function my_handle($me) {
|
private function my_handle($contact) {
|
||||||
if ($contact["addr"] != "")
|
if ($contact["addr"] != "")
|
||||||
return $contact["addr"];
|
return $contact["addr"];
|
||||||
|
|
||||||
// Normally we should have a filled "addr" field - but in the past this wasn't the case
|
// Normally we should have a filled "addr" field - but in the past this wasn't the case
|
||||||
// So - just in case - we build the the address here.
|
// So - just in case - we build the the address here.
|
||||||
return $me["nickname"]."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
|
if ($contact["nickname"] != "")
|
||||||
|
$nick = $contact["nickname"];
|
||||||
|
else
|
||||||
|
$nick = $contact["nick"];
|
||||||
|
|
||||||
|
return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2689,7 +2694,7 @@ class diaspora {
|
||||||
"guid" => $item["guid"],
|
"guid" => $item["guid"],
|
||||||
"target_type" => $target_type,
|
"target_type" => $target_type,
|
||||||
"parent_guid" => $parent["guid"],
|
"parent_guid" => $parent["guid"],
|
||||||
"author_signature" => $authorsig,
|
"author_signature" => "",
|
||||||
"diaspora_handle" => self::my_handle($owner)));
|
"diaspora_handle" => self::my_handle($owner)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3052,5 +3057,118 @@ class diaspora {
|
||||||
foreach($recips as $recip)
|
foreach($recips as $recip)
|
||||||
self::build_and_transmit($profile, $recip, "profile", $message, false, "", true);
|
self::build_and_transmit($profile, $recip, "profile", $message, false, "", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores the signature for likes that are created on our system
|
||||||
|
*
|
||||||
|
* @param array $contact The contact array of the "like"
|
||||||
|
* @param int $post_id The post id of the "like"
|
||||||
|
*
|
||||||
|
* @return bool Success
|
||||||
|
*/
|
||||||
|
function store_like_signature($contact, $post_id) {
|
||||||
|
|
||||||
|
$enabled = intval(get_config('system','diaspora_enabled'));
|
||||||
|
if (!$enabled) {
|
||||||
|
logger('Diaspora support disabled, not storing like signature', LOGGER_DEBUG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the contact the owner? Then fetch the private key
|
||||||
|
if (!$contact['self'] OR ($contact['uid'] == 0)) {
|
||||||
|
logger("No owner post, so not storing signature", LOGGER_DEBUG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1", intval($contact['uid']));
|
||||||
|
if(!$r)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$contact["uprvkey"] = $r[0]['prvkey'];
|
||||||
|
|
||||||
|
$r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", intval($post_id));
|
||||||
|
if (!$r)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!in_array($r[0]["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$message = self::construct_like($r[0], $contact);
|
||||||
|
$message["author_signature"] = self::signature($contact, $message);
|
||||||
|
|
||||||
|
// In the future we will store the signature more flexible to support new fields.
|
||||||
|
// Right now we cannot change this since old Friendica versions (prior to 3.5) can only handle this format.
|
||||||
|
// (We are transmitting this data here via DFRN)
|
||||||
|
|
||||||
|
$signed_text = $message["positive"].";".$message["guid"].";".$message["target_type"].";".
|
||||||
|
$message["parent_guid"].";".$message["diaspora_handle"];
|
||||||
|
|
||||||
|
q("INSERT INTO `sign` (`iid`,`signed_text`,`signature`,`signer`) VALUES (%d,'%s','%s','%s')",
|
||||||
|
intval($post_id),
|
||||||
|
dbesc($signed_text),
|
||||||
|
dbesc($message["author_signature"]),
|
||||||
|
dbesc($message["diaspora_handle"])
|
||||||
|
);
|
||||||
|
|
||||||
|
// This here will replace the lines above, once Diaspora changed its protocol
|
||||||
|
//q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')",
|
||||||
|
// intval($message_id),
|
||||||
|
// dbesc(json_encode($message))
|
||||||
|
//);
|
||||||
|
|
||||||
|
logger('Stored diaspora like signature');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores the signature for comments that are created on our system
|
||||||
|
*
|
||||||
|
* @param array $item The item array of the comment
|
||||||
|
* @param array $contact The contact array of the item owner
|
||||||
|
* @param string $uprvkey The private key of the sender
|
||||||
|
* @param int $message_id The message id of the comment
|
||||||
|
*
|
||||||
|
* @return bool Success
|
||||||
|
*/
|
||||||
|
function store_comment_signature($item, $contact, $uprvkey, $message_id) {
|
||||||
|
|
||||||
|
if ($uprvkey == "") {
|
||||||
|
logger('No private key, so not storing comment signature', LOGGER_DEBUG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$enabled = intval(get_config('system','diaspora_enabled'));
|
||||||
|
if (!$enabled) {
|
||||||
|
logger('Diaspora support disabled, not storing comment signature', LOGGER_DEBUG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$contact["uprvkey"] = $uprvkey;
|
||||||
|
|
||||||
|
$message = self::construct_comment($item, $contact);
|
||||||
|
$message["author_signature"] = self::signature($contact, $message);
|
||||||
|
|
||||||
|
// In the future we will store the signature more flexible to support new fields.
|
||||||
|
// Right now we cannot change this since old Friendica versions (prior to 3.5) can only handle this format.
|
||||||
|
// (We are transmitting this data here via DFRN)
|
||||||
|
$signed_text = $message["guid"].";".$message["parent_guid"].";".
|
||||||
|
$message["text"].";".$message["diaspora_handle"];
|
||||||
|
|
||||||
|
q("INSERT INTO `sign` (`iid`,`signed_text`,`signature`,`signer`) VALUES (%d,'%s','%s','%s')",
|
||||||
|
intval($message_id),
|
||||||
|
dbesc($signed_text),
|
||||||
|
dbesc($message["author_signature"]),
|
||||||
|
dbesc($message["diaspora_handle"])
|
||||||
|
);
|
||||||
|
|
||||||
|
// This here will replace the lines above, once Diaspora changed its protocol
|
||||||
|
//q("INSERT INTO `sign` (`iid`,`signed_text`) VALUES (%d,'%s')",
|
||||||
|
// intval($message_id),
|
||||||
|
// dbesc(json_encode($message))
|
||||||
|
//);
|
||||||
|
|
||||||
|
logger('Stored diaspora comment signature');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
require_once("include/diaspora.php");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief add/remove activity to an item
|
* @brief add/remove activity to an item
|
||||||
|
@ -237,7 +238,7 @@ EOT;
|
||||||
|
|
||||||
|
|
||||||
// Save the author information for the like in case we need to relay to Diaspora
|
// Save the author information for the like in case we need to relay to Diaspora
|
||||||
store_diaspora_like_sig($activity, $post_type, $contact, $post_id);
|
diaspora::store_like_signature($contact, $post_id);
|
||||||
|
|
||||||
$arr['id'] = $post_id;
|
$arr['id'] = $post_id;
|
||||||
|
|
||||||
|
@ -247,83 +248,3 @@ EOT;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function store_diaspora_like_sig($activity, $post_type, $contact, $post_id) {
|
|
||||||
// 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
|
|
||||||
|
|
||||||
$enabled = intval(get_config('system','diaspora_enabled'));
|
|
||||||
if(! $enabled) {
|
|
||||||
logger('mod_like: diaspora support disabled, not storing like signature', LOGGER_DEBUG);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger('mod_like: storing diaspora like signature');
|
|
||||||
|
|
||||||
if(($activity === ACTIVITY_LIKE) && ($post_type === t('status'))) {
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
|
|
||||||
// This code could never had worked (the return values form the queries were used in a wrong way.
|
|
||||||
// Additionally it is needlessly complicated. Either the contact is owner or not. And we have this data already.
|
|
||||||
/*
|
|
||||||
// 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'];
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Is the contact the owner? Then fetch the private key
|
|
||||||
if ($contact['self'] AND ($contact['uid'] > 0)) {
|
|
||||||
$r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
|
|
||||||
intval($contact['uid'])
|
|
||||||
);
|
|
||||||
|
|
||||||
if($r)
|
|
||||||
$contact_uprvkey = $r[0]['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 = 'true;'.$r[0]['guid'].';Post;'.$p[0]['guid'].';'.$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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
42
mod/item.php
42
mod/item.php
|
@ -24,6 +24,7 @@ require_once('include/threads.php');
|
||||||
require_once('include/text.php');
|
require_once('include/text.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/Scrape.php');
|
require_once('include/Scrape.php');
|
||||||
|
require_once('include/diaspora.php');
|
||||||
|
|
||||||
function item_post(&$a) {
|
function item_post(&$a) {
|
||||||
|
|
||||||
|
@ -900,7 +901,7 @@ function item_post(&$a) {
|
||||||
|
|
||||||
|
|
||||||
// Store the comment signature information in case we need to relay to Diaspora
|
// Store the comment signature information in case we need to relay to Diaspora
|
||||||
store_diaspora_comment_sig($datarray, $author, ($self ? $user['prvkey'] : false), $parent_item, $post_id);
|
diaspora::store_comment_signature($datarray, $author, ($self ? $user['prvkey'] : false), $post_id);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$parent = $post_id;
|
$parent = $post_id;
|
||||||
|
@ -1245,42 +1246,3 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo
|
||||||
|
|
||||||
return array('replaced' => $replaced, 'contact' => $r[0]);
|
return array('replaced' => $replaced, 'contact' => $r[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function store_diaspora_comment_sig($datarray, $author, $uprvkey, $parent_item, $post_id) {
|
|
||||||
// We won't be able to sign Diaspora comments for authenticated visitors - we don't have their private key
|
|
||||||
|
|
||||||
$enabled = intval(get_config('system','diaspora_enabled'));
|
|
||||||
if(! $enabled) {
|
|
||||||
logger('mod_item: diaspora support disabled, not storing comment signature', LOGGER_DEBUG);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
logger('mod_item: storing diaspora comment signature');
|
|
||||||
|
|
||||||
require_once('include/bb2diaspora.php');
|
|
||||||
$signed_body = html_entity_decode(bb2diaspora($datarray['body']));
|
|
||||||
|
|
||||||
// Only works for NETWORK_DFRN
|
|
||||||
$contact_baseurl_start = strpos($author['url'],'://') + 3;
|
|
||||||
$contact_baseurl_length = strpos($author['url'],'/profile') - $contact_baseurl_start;
|
|
||||||
$contact_baseurl = substr($author['url'], $contact_baseurl_start, $contact_baseurl_length);
|
|
||||||
$diaspora_handle = $author['nick'] . '@' . $contact_baseurl;
|
|
||||||
|
|
||||||
$signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $diaspora_handle;
|
|
||||||
|
|
||||||
if( $uprvkey !== false )
|
|
||||||
$authorsig = rsa_sign($signed_text,$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(base64_encode($authorsig)),
|
|
||||||
dbesc($diaspora_handle)
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue