The new envelope could work now

This commit is contained in:
Michael 2017-06-16 20:57:35 +00:00
parent c031482d7d
commit 9c4bf6b0d5

View file

@ -2659,15 +2659,54 @@ class Diaspora {
return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3); return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
} }
/** /**
* @brief Creates the envelope for the "fetch" endpoint * @brief Creates the data for a private message in the new format
*
* @param string $msg The message that is to be transmitted
* @param array $user The record of the sender
* @param array $contact Target of the communication
* @param string $prvkey The private key of the sender
* @param string $pubkey The public key of the receiver
*
* @return string The encrypted data
*/
public static function encode_private_data($msg, $user, $contact, $prvkey, $pubkey) {
logger("Message: ".$msg, LOGGER_DATA);
// without a public key nothing will work
if (!$pubkey) {
logger("pubkey missing: contact id: ".$contact["id"]);
return false;
}
$aes_key = openssl_random_pseudo_bytes(32);
$b_aes_key = base64_encode($aes_key);
$iv = openssl_random_pseudo_bytes(16);
$b_iv = base64_encode($iv);
$ciphertext = self::aes_encrypt($aes_key, $iv, $msg);
$json = json_encode(array("iv" => $b_iv, "key" => $b_aes_key));
$encrypted_key_bundle = "";
openssl_public_encrypt($json, $encrypted_key_bundle, $pubkey);
$json_object = json_encode(array("aes_key" => base64_encode($encrypted_key_bundle),
"encrypted_magic_envelope" => base64_encode($ciphertext)));
return $json_object;
}
/**
* @brief Creates the envelope for the "fetch" endpoint and for the new format
* *
* @param string $msg The message that is to be transmitted * @param string $msg The message that is to be transmitted
* @param array $user The record of the sender * @param array $user The record of the sender
* *
* @return string The envelope * @return string The envelope
*/ */
public static function build_magic_envelope($msg, $user) { public static function build_magic_envelope($msg, $user) {
$b64url_data = base64url_encode($msg); $b64url_data = base64url_encode($msg);
@ -2841,13 +2880,22 @@ class Diaspora {
*/ */
private static function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) { private static function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) {
//$new = Config::get('system', 'new_diaspora', null, true); $new = Config::get('system', 'new_diaspora', null, true);
if ($public) if ($new) {
$magic_env = self::build_public_message($msg,$user,$contact,$prvkey,$pubkey); if ($public) {
else $msg = Diaspora::encode_private_data($msg, $user, $contact, $prvkey, $pubkey);
$magic_env = self::build_private_message($msg,$user,$contact,$prvkey,$pubkey); }
$slap = Diaspora::build_magic_envelope($msg, $user);
return $slap;
}
if ($public) {
$magic_env = self::build_public_message($msg, $user, $contact, $prvkey, $pubkey);
} else {
$magic_env = self::build_private_message($msg, $user, $contact, $prvkey, $pubkey);
}
// The data that will be transmitted is double encoded via "urlencode", strange ... // The data that will be transmitted is double encoded via "urlencode", strange ...
$slap = "xml=".urlencode(urlencode($magic_env)); $slap = "xml=".urlencode(urlencode($magic_env));
return $slap; return $slap;
@ -3003,13 +3051,27 @@ class Diaspora {
*/ */
public static function send_share($owner, $contact) { public static function send_share($owner, $contact) {
/// @todo support the different possible combinations of "following" and "sharing" /**
/* * @todo support the different possible combinations of "following" and "sharing"
if (in_array($contact["rel"], array(CONTACT_IS_FRIEND, CONTACT_IS_FOLLOWER))) { * Currently, Diaspora only interprets the "sharing" field
$new_relation = CONTACT_IS_FRIEND; *
$new_relation = CONTACT_IS_SHARING; * Before switching this code productive, we have to check all "send_share" calls if "rel" is set correctly
$new_relation = CONTACT_IS_FOLLOWER; */
*/
/*
switch ($contact["rel"]) {
case CONTACT_IS_FRIEND:
$following = true;
$sharing = true;
case CONTACT_IS_SHARING:
$following = false;
$sharing = true;
case CONTACT_IS_FOLLOWER:
$following = true;
$sharing = false;
}
*/
$message = array("author" => self::my_handle($owner), $message = array("author" => self::my_handle($owner),
"recipient" => $contact["addr"], "recipient" => $contact["addr"],
"following" => "true", "following" => "true",