diff --git a/include/diaspora.php b/include/diaspora.php index c5e5fc7323..1e31bae8e5 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -18,6 +18,7 @@ require_once("include/group.php"); require_once("include/xml.php"); require_once("include/datetime.php"); require_once("include/queue_fn.php"); +require_once("include/cache.php"); /** * @brief This class contain functions to create and send Diaspora XML files @@ -87,7 +88,7 @@ class Diaspora { * * @return string the repaired signature */ - private function repair_signature($signature, $handle = "", $level = 1) { + private static function repair_signature($signature, $handle = "", $level = 1) { if ($signature == "") return ($signature); @@ -111,7 +112,7 @@ class Diaspora { * * @return string verified data */ - private function verify_magic_envelope($envelope) { + private static function verify_magic_envelope($envelope) { $basedom = parse_xml_string($envelope, false); @@ -412,7 +413,7 @@ class Diaspora { * * @return bool Is the posting valid? */ - private function valid_posting($msg, &$fields) { + private static function valid_posting($msg, &$fields) { $data = parse_xml_string($msg["message"], false); @@ -541,7 +542,7 @@ class Diaspora { * * @return string The public key */ - private function key($handle) { + private static function key($handle) { $handle = strval($handle); logger("Fetching diaspora key for: ".$handle); @@ -560,7 +561,7 @@ class Diaspora { * * @return array the queried data */ - private function person_by_handle($handle) { + private static function person_by_handle($handle) { $r = q("SELECT * FROM `fcontact` WHERE `network` = '%s' AND `addr` = '%s' LIMIT 1", dbesc(NETWORK_DIASPORA), @@ -601,7 +602,7 @@ class Diaspora { * * @return string The id of the fcontact entry */ - private function add_fcontact($arr, $update = false) { + private static function add_fcontact($arr, $update = false) { if($update) { $r = q("UPDATE `fcontact` SET @@ -734,7 +735,7 @@ class Diaspora { * * @return The contact id */ - private function contact_by_handle($uid, $handle) { + private static function contact_by_handle($uid, $handle) { $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `addr` = '%s' LIMIT 1", intval($uid), dbesc($handle) @@ -765,7 +766,7 @@ class Diaspora { * * @return bool is the contact allowed to post? */ - private function post_allow($importer, $contact, $is_comment = false) { + private static function post_allow($importer, $contact, $is_comment = false) { // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. @@ -804,7 +805,7 @@ class Diaspora { * * @return array The contact data */ - private function allowed_contact_by_handle($importer, $handle, $is_comment = false) { + private static function allowed_contact_by_handle($importer, $handle, $is_comment = false) { $contact = self::contact_by_handle($importer["uid"], $handle); if (!$contact) { logger("A Contact for handle ".$handle." and user ".$importer["uid"]." was not found"); @@ -826,7 +827,7 @@ class Diaspora { * * @return int|bool message id if the message already was stored into the system - or false. */ - private function message_exists($uid, $guid) { + private static function message_exists($uid, $guid) { $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", intval($uid), dbesc($guid) @@ -845,7 +846,7 @@ class Diaspora { * * @param array $item The item array */ - private function fetch_guid($item) { + private static function fetch_guid($item) { preg_replace_callback("&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi", function ($match) use ($item){ return(self::fetch_guid_sub($match, $item)); @@ -890,7 +891,7 @@ class Diaspora { * @param array $match array containing a link that has to be checked for a message link * @param array $item The item array */ - private function fetch_guid_sub($match, $item) { + private static function fetch_guid_sub($match, $item) { if (!self::store_by_guid($match[1], $item["author-link"])) self::store_by_guid($match[1], $item["owner-link"]); } @@ -904,7 +905,7 @@ class Diaspora { * * @return int the message id of the stored message or false */ - private function store_by_guid($guid, $server, $uid = 0) { + private static function store_by_guid($guid, $server, $uid = 0) { $serverparts = parse_url($server); $server = $serverparts["scheme"]."://".$serverparts["host"]; @@ -933,7 +934,7 @@ class Diaspora { * 'author' => The author handle * 'key' => The public key of the author */ - private function message($guid, $server, $level = 0) { + private static function message($guid, $server, $level = 0) { if ($level > 5) return false; @@ -1009,7 +1010,7 @@ class Diaspora { * * @return array the item record */ - private function parent_item($uid, $guid, $author, $contact) { + private static function parent_item($uid, $guid, $author, $contact) { $r = q("SELECT `id`, `body`, `wall`, `uri`, `private`, `origin`, `author-name`, `author-link`, `author-avatar`, `owner-name`, `owner-link`, `owner-avatar` @@ -1055,7 +1056,7 @@ class Diaspora { * 'cid' => contact id * 'network' => network type */ - private function author_contact_by_url($contact, $person, $uid) { + private static function author_contact_by_url($contact, $person, $uid) { $r = q("SELECT `id`, `network`, `url` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", dbesc(normalise_link($person["url"])), intval($uid)); @@ -1093,7 +1094,7 @@ class Diaspora { * * @return string the post link */ - private function plink($addr, $guid) { + private static function plink($addr, $guid) { $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", dbesc($addr)); // Fallback @@ -1123,7 +1124,7 @@ class Diaspora { * * @return bool Success */ - private function receive_account_deletion($importer, $data) { + private static function receive_account_deletion($importer, $data) { /// @todo Account deletion should remove the contact from the global contacts as well @@ -1188,7 +1189,7 @@ class Diaspora { * * @return int The message id of the generated comment or "false" if there was an error */ - private function receive_comment($importer, $sender, $data, $xml) { + private static function receive_comment($importer, $sender, $data, $xml) { $guid = notags(unxmlify($data->guid)); $parent_guid = notags(unxmlify($data->parent_guid)); $text = unxmlify($data->text); @@ -1304,7 +1305,7 @@ class Diaspora { * * @return bool "true" if it was successful */ - private function receive_conversation_message($importer, $contact, $data, $msg, $mesg, $conversation) { + private static function receive_conversation_message($importer, $contact, $data, $msg, $mesg, $conversation) { $guid = notags(unxmlify($data->guid)); $subject = notags(unxmlify($data->subject)); $author = notags(unxmlify($data->author)); @@ -1429,7 +1430,7 @@ class Diaspora { * * @return bool Success */ - private function receive_conversation($importer, $msg, $data) { + private static 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))); @@ -1495,7 +1496,7 @@ class Diaspora { * * @return string the body */ - private function construct_like_body($contact, $parent_item, $guid) { + private static function construct_like_body($contact, $parent_item, $guid) { $bodyverb = t('%1$s likes %2$s\'s %3$s'); $ulink = "[url=".$contact["url"]."]".$contact["name"]."[/url]"; @@ -1513,7 +1514,7 @@ class Diaspora { * * @return string The XML */ - private function construct_like_object($importer, $parent_item) { + private static function construct_like_object($importer, $parent_item) { $objtype = ACTIVITY_OBJ_NOTE; $link = ''; $parent_body = $parent_item["body"]; @@ -1537,7 +1538,7 @@ class Diaspora { * * @return int The message id of the generated like or "false" if there was an error */ - private function receive_like($importer, $sender, $data) { + private static function receive_like($importer, $sender, $data) { $positive = notags(unxmlify($data->positive)); $guid = notags(unxmlify($data->guid)); $parent_type = notags(unxmlify($data->parent_type)); @@ -1634,7 +1635,7 @@ class Diaspora { * * @return bool Success? */ - private function receive_message($importer, $data) { + private static function receive_message($importer, $data) { $guid = notags(unxmlify($data->guid)); $parent_guid = notags(unxmlify($data->parent_guid)); $text = unxmlify($data->text); @@ -1715,7 +1716,7 @@ class Diaspora { * * @return bool always true */ - private function receive_participation($importer, $data) { + private static function receive_participation($importer, $data) { // I'm not sure if we can fully support this message type return true; } @@ -1728,7 +1729,7 @@ class Diaspora { * * @return bool always true */ - private function receive_photo($importer, $data) { + private static 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; } @@ -1741,7 +1742,7 @@ class Diaspora { * * @return bool always true */ - private function receive_poll_participation($importer, $data) { + private static function receive_poll_participation($importer, $data) { // We don't support polls by now return true; } @@ -1754,7 +1755,7 @@ class Diaspora { * * @return bool Success */ - private function receive_profile($importer, $data) { + private static function receive_profile($importer, $data) { $author = strtolower(notags(unxmlify($data->author))); $contact = self::contact_by_handle($importer["uid"], $author); @@ -1845,7 +1846,7 @@ class Diaspora { * @param array $importer Array of the importer user * @param array $contact The contact that send the request */ - private function receive_request_make_friend($importer, $contact) { + private static function receive_request_make_friend($importer, $contact) { $a = get_app(); @@ -1914,7 +1915,7 @@ class Diaspora { * * @return string The XML */ - private function construct_new_friend_object($contact) { + private static function construct_new_friend_object($contact) { $objtype = ACTIVITY_OBJ_PERSON; $link = ''."\n". ''."\n"; @@ -1935,7 +1936,7 @@ class Diaspora { * * @return bool Success */ - private function receive_contact_request($importer, $data) { + private static function receive_contact_request($importer, $data) { $author = unxmlify($data->author); $recipient = unxmlify($data->recipient); @@ -2116,7 +2117,7 @@ class Diaspora { * * @return array The fetched item */ - private function original_item($guid, $orig_author, $author) { + private static function original_item($guid, $orig_author, $author) { // Do we already have this item? $r = q("SELECT `body`, `tag`, `app`, `created`, `object-type`, `uri`, `guid`, @@ -2187,7 +2188,7 @@ class Diaspora { * * @return int the message id */ - private function receive_reshare($importer, $data, $xml) { + private static function receive_reshare($importer, $data, $xml) { $root_author = notags(unxmlify($data->root_author)); $root_guid = notags(unxmlify($data->root_guid)); $guid = notags(unxmlify($data->guid)); @@ -2266,7 +2267,7 @@ class Diaspora { * * @return bool success */ - private function item_retraction($importer, $contact, $data) { + private static function item_retraction($importer, $contact, $data) { $target_type = notags(unxmlify($data->target_type)); $target_guid = notags(unxmlify($data->target_guid)); $author = notags(unxmlify($data->author)); @@ -2322,7 +2323,7 @@ class Diaspora { * * @return bool Success */ - private function receive_retraction($importer, $sender, $data) { + private static function receive_retraction($importer, $sender, $data) { $target_type = notags(unxmlify($data->target_type)); $contact = self::contact_by_handle($importer["uid"], $sender); @@ -2364,7 +2365,7 @@ class Diaspora { * * @return int The message id of the newly created item */ - private function receive_status_message($importer, $data, $xml) { + private static function receive_status_message($importer, $data, $xml) { $raw_message = unxmlify($data->raw_message); $guid = notags(unxmlify($data->guid)); $author = notags(unxmlify($data->author)); @@ -2475,7 +2476,7 @@ class Diaspora { * * @return string the handle in the format user@domain.tld */ - private function my_handle($contact) { + private static function my_handle($contact) { if ($contact["addr"] != "") return $contact["addr"]; @@ -2534,7 +2535,7 @@ class Diaspora { * * @return string The envelope */ - private function build_public_message($msg, $user, $contact, $prvkey, $pubkey) { + private static function build_public_message($msg, $user, $contact, $prvkey, $pubkey) { logger("Message: ".$msg, LOGGER_DATA); @@ -2580,7 +2581,7 @@ class Diaspora { * * @return string The envelope */ - private function build_private_message($msg, $user, $contact, $prvkey, $pubkey) { + private static function build_private_message($msg, $user, $contact, $prvkey, $pubkey) { logger("Message: ".$msg, LOGGER_DATA); @@ -2671,7 +2672,7 @@ class Diaspora { * * @return string The message that will be transmitted to other servers */ - private function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) { + private static function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) { if ($public) $magic_env = self::build_public_message($msg,$user,$contact,$prvkey,$pubkey); @@ -2691,7 +2692,7 @@ class Diaspora { * * @return string The signature */ - private function signature($owner, $message) { + private static function signature($owner, $message) { $sigmsg = $message; unset($sigmsg["author_signature"]); unset($sigmsg["parent_author_signature"]); @@ -2798,7 +2799,7 @@ class Diaspora { * * @return int Result of the transmission */ - private function build_and_transmit($owner, $contact, $type, $message, $public_batch = false, $guid = "", $spool = false) { + private static function build_and_transmit($owner, $contact, $type, $message, $public_batch = false, $guid = "", $spool = false) { $msg = self::build_post_xml($type, $message); @@ -2947,36 +2948,49 @@ class Diaspora { * @return array with event data */ private static function build_event($event_id) { - $r = q("SELECT `start`, `finish`, `summary`, `desc`, `location`, `adjust` FROM `event` WHERE `id` = %d", intval($event_id)); + + $r = q("SELECT `uid`, `start`, `finish`, `summary`, `desc`, `location`, `adjust` FROM `event` WHERE `id` = %d", intval($event_id)); if (!dbm::is_result($r)) { return array(); } + $event = $r[0]; + $eventdata = array(); - /// @todo Timezone in start und end? + $r = q("SELECT `timezone` FROM `user` WHERE `uid` = %d", intval($event['uid'])); + if (!dbm::is_result($r)) { + return array(); + } - if ($r[0]['adjust']) { - $eventdata['timezone'] = 'UTC'; + $user = $r[0]; + + if ($event['adjust']) { + $eventdata['timezone'] = $user['timezone']; + + if ($eventdata['timezone'] == "") { + $eventdata['timezone'] = 'UTC'; + } + $mask = 'Y-m-d\TH:i:s\Z'; } else { - $eventdata['timezone'] = date_default_timezone_get(); + $mask = 'Y-m-d\TH:i:s'; } - if ($r[0]['start']) { - $eventdata['start'] = datetime_convert("UTC", "UTC", $r[0]['start'], 'Y-m-d\TH:i:s\Z'); + if ($event['start']) { + $eventdata['start'] = datetime_convert("UTC", "UTC", $event['start'], $mask); } - if ($r[0]['finish']) { - $eventdata['end'] = datetime_convert("UTC", "UTC", $r[0]['finish'], 'Y-m-d\TH:i:s\Z'); + if ($event['finish']) { + $eventdata['end'] = datetime_convert("UTC", "UTC", $event['finish'], $mask); } - if ($r[0]['summary']) { - $eventdata['summary'] = html_entity_decode(bb2diaspora($r[0]['summary'])); + if ($event['summary']) { + $eventdata['summary'] = html_entity_decode(bb2diaspora($event['summary'])); } - if ($r[0]['desc']) { - $eventdata['description'] = html_entity_decode(bb2diaspora($r[0]['desc'])); + if ($event['desc']) { + $eventdata['description'] = html_entity_decode(bb2diaspora($event['desc'])); } - if ($r[0]['location']) { + if ($event['location']) { $location = array(); - $location["address"] = html_entity_decode(bb2diaspora($r[0]['location'])); + $location["address"] = html_entity_decode(bb2diaspora($event['location'])); $location["lat"] = 0; $location["lng"] = 0; $eventdata['location'] = $location; @@ -2997,6 +3011,13 @@ class Diaspora { */ public static function build_status($item, $owner) { + $cachekey = "diaspora:build_status:".$item['guid']; + + $result = Cache::get($cachekey); + if (!is_null($result)) { + return $result; + } + $myaddr = self::my_handle($owner); $public = (($item["private"]) ? "false" : "true"); @@ -3067,7 +3088,12 @@ class Diaspora { $type = "status_message"; } - return array("type" => $type, "message" => $message); + + $msg = array("type" => $type, "message" => $message); + + Cache::set($cachekey, $msg, CACHE_QUARTER_HOUR); + + return $msg; } /** @@ -3095,7 +3121,7 @@ class Diaspora { * * @return array The data for a "like" */ - private function construct_like($item, $owner) { + private static function construct_like($item, $owner) { $p = q("SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($item["thr-parent"])); @@ -3123,7 +3149,7 @@ class Diaspora { * * @return array The data for a comment */ - private function construct_comment($item, $owner) { + private static function construct_comment($item, $owner) { $p = q("SELECT `guid` FROM `item` WHERE `parent` = %d AND `id` = %d LIMIT 1", intval($item["parent"]), @@ -3188,7 +3214,7 @@ class Diaspora { * * @return string The message */ - private function message_from_signature($item, $signature) { + private static function message_from_signature($item, $signature) { // Split the signed text $signed_parts = explode(";", $signature['signed_text']);