diff --git a/include/diaspora2.php b/include/diaspora2.php index b834e3deb9..031058ab75 100644 --- a/include/diaspora2.php +++ b/include/diaspora2.php @@ -116,53 +116,53 @@ class diaspora { switch ($type) { case "account_deletion": // Done - return true; - //return self::import_account_deletion($importer, $fields); + //return true; + return self::receive_account_deletion($importer, $fields); case "comment": // Done - return true; - //return self::import_comment($importer, $sender, $fields); - - case "conversation": //return true; - return self::import_conversation($importer, $msg, $fields); + return self::receive_comment($importer, $sender, $fields); + + case "conversation": // Done + //return true; + return self::receive_conversation($importer, $msg, $fields); case "like": // Done - return true; - //return self::import_like($importer, $sender, $fields); + //return true; + return self::receive_like($importer, $sender, $fields); case "message": // Done - return true; - //return self::import_message($importer, $fields); + //return true; + return self::receive_message($importer, $fields); case "participation": // Not implemented - return self::import_participation($importer, $fields); + return self::receive_participation($importer, $fields); case "photo": // Not needed - return self::import_photo($importer, $fields); + return self::receive_photo($importer, $fields); case "poll_participation": // Not implemented - return self::import_poll_participation($importer, $fields); + return self::receive_poll_participation($importer, $fields); case "profile": // Done - return true; - //return self::import_profile($importer, $fields); + //return true; + return self::receive_profile($importer, $fields); case "request": //return true; - return self::import_request($importer, $fields); + return self::receive_request($importer, $fields); case "reshare": // Done - return true; - //return self::import_reshare($importer, $fields); + //return true; + return self::receive_reshare($importer, $fields); case "retraction": // Done - return true; - //return self::import_retraction($importer, $sender, $fields); - - case "status_message": //return true; - return self::import_status_message($importer, $fields); + return self::receive_retraction($importer, $sender, $fields); + + case "status_message": // Done + //return true; + return self::receive_status_message($importer, $fields); default: logger("Unknown message type ".$type); @@ -633,7 +633,7 @@ class diaspora { return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$guid; } - private function import_account_deletion($importer, $data) { + private function receive_account_deletion($importer, $data) { $author = notags(unxmlify($data->author)); $contact = self::get_contact_by_handle($importer["uid"], $author); @@ -647,7 +647,7 @@ class diaspora { return true; } - private function import_comment($importer, $sender, $data) { + private function receive_comment($importer, $sender, $data) { $guid = notags(unxmlify($data->guid)); $parent_guid = notags(unxmlify($data->parent_guid)); $text = unxmlify($data->text); @@ -722,7 +722,7 @@ class diaspora { return $message_id; } - private function import_conversation_message($importer, $contact, $data, $msg, $mesg) { + private function receive_conversation_message($importer, $contact, $data, $msg, $mesg) { $guid = notags(unxmlify($data->guid)); $subject = notags(unxmlify($data->subject)); $author = notags(unxmlify($data->author)); @@ -735,7 +735,14 @@ class diaspora { $msg_author_signature = notags(unxmlify($mesg->author_signature)); $msg_text = unxmlify($mesg->text); $msg_created_at = datetime_convert("UTC", "UTC", notags(unxmlify($mesg->created_at))); - $msg_author = notags(unxmlify($mesg->diaspora_handle)); + + if ($mesg->diaspora_handle) + $msg_author = notags(unxmlify($mesg->diaspora_handle)); + elseif ($mesg->author) + $msg_author = notags(unxmlify($mesg->author)); + else + return false; + $msg_conversation_guid = notags(unxmlify($mesg->conversation_guid)); if($msg_conversation_guid != $guid) { @@ -829,7 +836,7 @@ class diaspora { )); } - private function import_conversation($importer, $msg, $data) { + private function receive_conversation($importer, $msg, $data) { $guid = notags(unxmlify($data->guid)); $subject = notags(unxmlify($data->subject)); $created_at = datetime_convert("UTC", "UTC", notags(unxmlify($data->created_at))); @@ -881,7 +888,7 @@ class diaspora { } foreach($messages as $mesg) - self::import_conversation_message($importer, $contact, $data, $msg, $mesg); + self::receive_conversation_message($importer, $contact, $data, $msg, $mesg); return true; } @@ -916,7 +923,7 @@ EOT; return $obj; } - private function import_like($importer, $sender, $data) { + private function receive_like($importer, $sender, $data) { $positive = notags(unxmlify($data->positive)); $guid = notags(unxmlify($data->guid)); $parent_type = notags(unxmlify($data->parent_type)); @@ -1002,7 +1009,7 @@ EOT; return $message_id; } - private function import_message($importer, $data) { + private function receive_message($importer, $data) { $guid = notags(unxmlify($data->guid)); $parent_guid = notags(unxmlify($data->parent_guid)); $text = unxmlify($data->text); @@ -1073,22 +1080,22 @@ EOT; return true; } - private function import_participation($importer, $data) { + private function receive_participation($importer, $data) { // I'm not sure if we can fully support this message type return true; } - private function import_photo($importer, $data) { + private function receive_photo($importer, $data) { // There doesn't seem to be a reason for this function, since the photo data is transmitted in the status message as well return true; } - private function import_poll_participation($importer, $data) { + private function receive_poll_participation($importer, $data) { // We don't support polls by now return true; } - private function import_profile($importer, $data) { + private function receive_profile($importer, $data) { $author = notags(unxmlify($data->author)); $contact = self::get_contact_by_handle($importer["uid"], $author); @@ -1171,23 +1178,7 @@ EOT; return true; } - private function import_request($importer, $data) { - // @todo - print_r($data); -/* - $author = unxmlify($data->author); - $recipient = unxmlify($data->recipient); - - if (!$author || !$recipient) - return; - - $contact = self::get_contact_by_handle($importer["uid"],$author); - - if($contact) { - - // perhaps we were already sharing with this person. Now they're sharing with us. - // That makes us friends. - + private function receive_request_make_friend($importer, $contact) { if($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) { q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d", intval(CONTACT_IS_FRIEND), @@ -1201,9 +1192,9 @@ EOT; intval($importer["uid"]) ); - if($r && !$r[0]["hide-friends"] && !$contact["hidden"] && intval(get_pconfig($importer["uid"],'system','post_newfriend'))) { + if($r && !$r[0]["hide-friends"] && !$contact["hidden"] && intval(get_pconfig($importer["uid"], "system", "post_newfriend"))) { - $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1", + $self = q("SELECT * FROM `contact` WHERE `self` AND `uid` = %d LIMIT 1", intval($importer["uid"]) ); @@ -1225,16 +1216,16 @@ EOT; $arr["verb"] = ACTIVITY_FRIEND; $arr["object-type"] = ACTIVITY_OBJ_PERSON; - $A = '[url='.$self[0]["url"] . "]'.$self[0]["name"] .'[/url]'; - $B = '[url='.$contact["url"] . "]'.$contact["name"] .'[/url]'; - $BPhoto = '[url='.$contact["url"] . "]'.'[img]'.$contact["thumb"] .'[/img][/url]'; - $arr["body"] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto; + $A = "[url=".$self[0]["url"]."]".$self[0]["name"]."[/url]"; + $B = "[url=".$contact["url"]."]".$contact["name"]."[/url]"; + $BPhoto = "[url=".$contact["url"]."][img]".$contact["thumb"]."[/img][/url]"; + $arr["body"] = sprintf(t("%1$s is now friends with %2$s"), $A, $B)."\n\n\n".$Bphoto; - $arr["object"] = ''. ACTIVITY_OBJ_PERSON .''.$contact["name"] .'' - .''.$contact["url"] .'/'.$contact["name"] .''; - $arr["object"] .= ''. xmlify(''. "\n"); - $arr["object"] .= xmlify(''. "\n"); - $arr["object"] .= ''. "\n"; + $arr["object"] = "".ACTIVITY_OBJ_PERSON."".$contact["name"]."" + ."".$contact["url"]."/".$contact["name"].""; + $arr["object"] .= "".xmlify(''."\n"); + $arr["object"] .= xmlify(''."\n"); + $arr["object"] .= "\n"; $arr["last-child"] = 1; $arr["allow_cid"] = $user[0]["allow_cid"]; @@ -1244,111 +1235,123 @@ EOT; $i = item_store($arr); if($i) - proc_run('php',"include/notifier.php","activity","$i"); + proc_run("php", "include/notifier.php", "activity", $i); } } - - return; } - $ret = self::get_person_by_handle($author); + private function receive_request($importer, $data) { + $author = unxmlify($data->author); + $recipient = unxmlify($data->recipient); + if (!$author || !$recipient) + return; - if (!$ret || ($ret["network"] != NETWORK_DIASPORA)) { - logger('Cannot resolve diaspora handle '.$author .' for '.$recipient); - return; - } + $contact = self::get_contact_by_handle($importer["uid"],$author); - $batch = (($ret["batch"]) ? $ret["batch"] : implode('/', array_slice(explode('/',$ret["url"]),0,3)) .'/receive/public'); + if($contact) { + // perhaps we were already sharing with this person. Now they're sharing with us. + // That makes us friends. + self::receive_request_make_friend($importer, $contact); + return true; + } - $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`nurl`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) - VALUES ( %d, '%s', '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ", - intval($importer["uid"]), - dbesc($ret["network"]), - dbesc($ret["addr"]), - datetime_convert(), - dbesc($ret["url"]), - dbesc(normalise_link($ret["url"])), - dbesc($batch), - dbesc($ret["name"]), - dbesc($ret["nick"]), - dbesc($ret["photo"]), - dbesc($ret["pubkey"]), - dbesc($ret["notify"]), - dbesc($ret["poll"]), - 1, - 2 - ); + $ret = self::get_person_by_handle($author); - // find the contact record we just created + if (!$ret || ($ret["network"] != NETWORK_DIASPORA)) { + logger("Cannot resolve diaspora handle ".$author ." for ".$recipient); + return false; + } - $contact_record = self::get_contact_by_handle($importer["uid"],$author); + $batch = (($ret["batch"]) ? $ret["batch"] : implode("/", array_slice(explode("/", $ret["url"]), 0, 3))."/receive/public"); - if(! $contact_record) { - logger('unable to locate newly created contact record.'); - return; - } - - $g = q("select def_gid from user where uid = %d limit 1", - intval($importer["uid"]) - ); - if($g && intval($g[0]["def_gid"])) { - group_add_member($importer["uid"],'',$contact_record["id"],$g[0]["def_gid"]); - } - - if($importer["page-flags"] == PAGE_NORMAL) { - - $hash = random_string() . (string) time(); // Generate a confirm_key - - $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime` ) - VALUES ( %d, %d, %d, %d, '%s', '%s', '%s' )", + $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`nurl`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`) + VALUES (%d, '%s', '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d)", intval($importer["uid"]), - intval($contact_record["id"]), - 0, - 0, - dbesc( t('Sharing notification from Diaspora network')), - dbesc($hash), - dbesc(datetime_convert()) - ); - } - else { - - // automatic friend approval - - update_contact_avatar($contact_record["photo"],$importer["uid"],$contact_record["id"]); - - // technically they are sharing with us (CONTACT_IS_SHARING), - // but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX - // we are going to change the relationship and make them a follower. - - if($importer["page-flags"] == PAGE_FREELOVE) - $new_relation = CONTACT_IS_FRIEND; - else - $new_relation = CONTACT_IS_FOLLOWER; - - $r = q("UPDATE `contact` SET `rel` = %d, - `name-date` = '%s', - `uri-date` = '%s', - `blocked` = 0, - `pending` = 0, - `writable` = 1 - WHERE `id` = %d - ", - intval($new_relation), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($contact_record["id"]) + dbesc($ret["network"]), + dbesc($ret["addr"]), + datetime_convert(), + dbesc($ret["url"]), + dbesc(normalise_link($ret["url"])), + dbesc($batch), + dbesc($ret["name"]), + dbesc($ret["nick"]), + dbesc($ret["photo"]), + dbesc($ret["pubkey"]), + dbesc($ret["notify"]), + dbesc($ret["poll"]), + 1, + 2 ); - $u = q("select * from user where uid = %d limit 1",intval($importer["uid"])); - if($u) - $ret = diaspora_share($u[0],$contact_record); - } -*/ + // find the contact record we just created + + $contact_record = self::get_contact_by_handle($importer["uid"],$author); + + if (!$contact_record) { + logger("unable to locate newly created contact record."); + return; + } + + $g = q("SELECT `def_gid` FROM `user` WHERE `uid` = %d LIMIT 1", + intval($importer["uid"]) + ); + + if($g && intval($g[0]["def_gid"])) + group_add_member($importer["uid"], "", $contact_record["id"], $g[0]["def_gid"]); + + if($importer["page-flags"] == PAGE_NORMAL) { + + $hash = random_string().(string)time(); // Generate a confirm_key + + $ret = q("INSERT INTO `intro` (`uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime`) + VALUES (%d, %d, %d, %d, '%s', '%s', '%s')", + intval($importer["uid"]), + intval($contact_record["id"]), + 0, + 0, + dbesc(t("Sharing notification from Diaspora network")), + dbesc($hash), + dbesc(datetime_convert()) + ); + } else { + + // automatic friend approval + + update_contact_avatar($contact_record["photo"],$importer["uid"],$contact_record["id"]); + + // technically they are sharing with us (CONTACT_IS_SHARING), + // but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX + // we are going to change the relationship and make them a follower. + + if($importer["page-flags"] == PAGE_FREELOVE) + $new_relation = CONTACT_IS_FRIEND; + else + $new_relation = CONTACT_IS_FOLLOWER; + + $r = q("UPDATE `contact` SET `rel` = %d, + `name-date` = '%s', + `uri-date` = '%s', + `blocked` = 0, + `pending` = 0, + `writable` = 1 + WHERE `id` = %d + ", + intval($new_relation), + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($contact_record["id"]) + ); + + $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); + if($u) + $ret = diaspora_share($u[0], $contact_record); + } + return true; } @@ -1406,7 +1409,7 @@ EOT; return false; } - private function import_reshare($importer, $data) { + private function receive_reshare($importer, $data) { $root_author = notags(unxmlify($data->root_author)); $root_guid = notags(unxmlify($data->root_guid)); $guid = notags(unxmlify($data->guid)); @@ -1520,7 +1523,7 @@ EOT; } } - private function import_retraction($importer, $sender, $data) { + private function receive_retraction($importer, $sender, $data) { $target_type = notags(unxmlify($data->target_type)); $contact = self::get_contact_by_handle($importer["uid"], $sender); @@ -1548,7 +1551,7 @@ EOT; return true; } - private function import_status_message($importer, $data) { + private function receive_status_message($importer, $data) { $raw_message = unxmlify($data->raw_message); $guid = notags(unxmlify($data->guid));