function dfrn_dispatch_public($postdata)
{
- $msg = Diaspora::decodeRaw([], $postdata);
+ $msg = Diaspora::decodeRaw([], $postdata, true);
if (!$msg) {
// We have to fail silently to be able to hand it over to the salmon parser
return false;
/**
* @brief: Decodes incoming Diaspora message in the new format
*
- * @param array $importer Array of the importer user
- * @param string $raw raw post message
+ * @param array $importer Array of the importer user
+ * @param string $raw raw post message
+ * @param boolean $no_exit Don't do an http exit on error
*
* @return array
* 'message' -> decoded Diaspora XML message
* 'author' -> author diaspora handle
* 'key' -> author public key (converted to pkcs#8)
*/
- public static function decodeRaw(array $importer, $raw)
+ public static function decodeRaw(array $importer, $raw, $no_exit = false)
{
$data = json_decode($raw);
if (!is_object($j_outer_key_bundle)) {
logger('Outer Salmon did not verify. Discarding.');
- System::httpExit(400);
+ if ($no_exit) {
+ return false;
+ } else {
+ System::httpExit(400);
+ }
}
$outer_iv = base64_decode($j_outer_key_bundle->iv);
if (!is_object($basedom)) {
logger('Received data does not seem to be an XML. Discarding. '.$xml);
- System::httpExit(400);
+ if ($no_exit) {
+ return false;
+ } else {
+ System::httpExit(400);
+ }
}
$base = $basedom->children(NAMESPACE_SALMON_ME);
$author_addr = base64_decode($key_id);
if ($author_addr == '') {
logger('No author could be decoded. Discarding. Message: ' . $xml);
- System::httpExit(400);
+ if ($no_exit) {
+ return false;
+ } else {
+ System::httpExit(400);
+ }
}
$key = self::key($author_addr);
if ($key == '') {
logger("Couldn't get a key for handle " . $author_addr . ". Discarding.");
- System::httpExit(400);
+ if ($no_exit) {
+ return false;
+ } else {
+ System::httpExit(400);
+ }
}
$verify = Crypto::rsaVerify($signed_data, $signature, $key);
if (!$verify) {
logger('Message did not verify. Discarding.');
- System::httpExit(400);
+ if ($no_exit) {
+ return false;
+ } else {
+ System::httpExit(400);
+ }
}
return ['message' => (string)base64url_decode($base->data),
$author["contact-id"] = $contact["id"];
$contact = null;
+
+/*
+ This here would be better, but we would get problems with contacts from the statusnet addon
+ This is kept here as a reminder for the future
+
+ $cid = Contact::getIdForURL($author["author-link"], $importer["uid"]);
+ if ($cid) {
+ $contact = DBA::selectFirst('contact', [], ['id' => $cid]);
+ }
+*/
if ($aliaslink != '') {
$condition = ["`uid` = ? AND `alias` = ? AND `network` != ? AND `rel` IN (?, ?)",
$importer["uid"], $aliaslink, Protocol::STATUSNET,
$gcid = GContact::update($contact);
GContact::link($gcid, $contact["uid"], $contact["id"]);
- } else {
+ } elseif ($contact["network"] != Protocol::DFRN) {
$contact = null;
}
self::$conv_list = [];
}
- logger("Import OStatus message", LOGGER_DEBUG);
+ logger('Import OStatus message for user ' . $importer['uid'], LOGGER_DEBUG);
if ($xml == "") {
return false;