`contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`,
`contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
`sign`.`signed_text`, `sign`.`signature`, `sign`.`signer`
- FROM `item` USE INDEX (`uid_wall_changed`, `uid_type_changed`) $sql_post_table
+ FROM `item` USE INDEX (`uid_wall_changed`) $sql_post_table
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
AND (NOT `contact`.`blocked` OR `contact`.`pending`)
LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
*
* @return object XML root object
*/
- private function add_header($doc, $owner, $authorelement, $alternatelink = "", $public = false) {
+ private static function add_header($doc, $owner, $authorelement, $alternatelink = "", $public = false) {
if ($alternatelink == "")
$alternatelink = $owner['url'];
*
* @return object XML author object
*/
- private function add_author($doc, $owner, $authorelement, $public) {
+ private static function add_author($doc, $owner, $authorelement, $public) {
// Is the profile hidden or shouldn't be published in the net? Then add the "hide" element
$r = q("SELECT `id` FROM `profile` INNER JOIN `user` ON `user`.`uid` = `profile`.`uid`
*
* @return object XML author object
*/
- private function add_entry_author($doc, $element, $contact_url, $item) {
+ private static function add_entry_author($doc, $element, $contact_url, $item) {
$contact = get_contact_details_by_url($contact_url, $item["uid"]);
*
* @return object XML activity object
*/
- private function create_activity($doc, $element, $activity) {
+ private static function create_activity($doc, $element, $activity) {
if($activity) {
$entry = $doc->createElement($element);
*
* @return object XML attachment object
*/
- private function get_attachment($doc, $root, $item) {
+ private static function get_attachment($doc, $root, $item) {
$arr = explode('[/attach],',$item['attach']);
if(count($arr)) {
foreach($arr as $r) {
*
* @return object XML entry object
*/
- private function entry($doc, $type, $item, $owner, $comment = false, $cid = 0) {
+ private static function entry($doc, $type, $item, $owner, $comment = false, $cid = 0) {
$mentioned = array();
logger('dfrn_deliver: ' . $url);
- $xml = fetch_url($url);
+ $ret = z_fetch_url($url);
+
+ if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
+ return -2; // timed out
+ }
+
+ $xml = $ret['body'];
$curl_stat = $a->get_curl_code();
- if(! $curl_stat)
- return(-1); // timed out
+ if (!$curl_stat) {
+ return -3; // timed out
+ }
logger('dfrn_deliver: ' . $xml, LOGGER_DATA);
$key = Crypto::createNewRandomKey();
} catch (CryptoTestFailed $ex) {
logger('Cannot safely create a key');
- return -1;
+ return -4;
} catch (CannotPerformOperation $ex) {
logger('Cannot safely create a key');
- return -1;
+ return -5;
}
try {
$data = Crypto::encrypt($postvars['data'], $key);
} catch (CryptoTestFailed $ex) {
logger('Cannot safely perform encryption');
- return -1;
+ return -6;
} catch (CannotPerformOperation $ex) {
logger('Cannot safely perform encryption');
- return -1;
+ return -7;
}
break;
default:
logger("rino: invalid requested verision '$rino_remote_version'");
- return -1;
+ return -8;
}
$postvars['rino'] = $rino_remote_version;
logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars,true), LOGGER_DATA);
- $xml = post_url($contact['notify'],$postvars);
+ $xml = post_url($contact['notify'], $postvars);
logger('dfrn_deliver: ' . "RECEIVED: " . $xml, LOGGER_DATA);
$curl_stat = $a->get_curl_code();
- if((! $curl_stat) || (! strlen($xml)))
- return(-1); // timed out
+ if ((!$curl_stat) || (!strlen($xml))) {
+ return -9; // timed out
+ }
- if(($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after')))
- return(-1);
+ if (($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after'))) {
+ return -10;
+ }
if(strpos($xml,'<?xml') === false) {
logger('dfrn_deliver: phase 2: no valid XML returned');
* @param string $birthday Birthday of the contact
*
*/
- private function birthday_event($contact, $birthday) {
+ private static function birthday_event($contact, $birthday) {
+
+ // Check for duplicates
+ $r = q("SELECT `id` FROM `event` WHERE `uid` = %d AND `cid` = %d AND `start` = '%s' AND `type` = '%s' LIMIT 1",
+ intval($contact["uid"]),
+ intval($contact["id"]),
+ dbesc(datetime_convert("UTC","UTC", $birthday)),
+ dbesc("birthday"));
+
+ if (dbm::is_result($r)) {
+ return;
+ }
logger("updating birthday: ".$birthday." for contact ".$contact["id"]);
$bdtext = sprintf(t("%s\'s birthday"), $contact["name"]);
$bdtext2 = sprintf(t("Happy Birthday %s"), " [url=".$contact["url"]."]".$contact["name"]."[/url]") ;
-
$r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`)
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
intval($contact["uid"]),
*
* @return Returns an array with relevant data of the author
*/
- private function fetchauthor($xpath, $context, $importer, $element, $onlyfetch, $xml = "") {
+ private static function fetchauthor($xpath, $context, $importer, $element, $onlyfetch, $xml = "") {
$author = array();
$author["name"] = $xpath->evaluate($element."/atom:name/text()", $context)->item(0)->nodeValue;
*
* @return string XML string
*/
- private function transform_activity($xpath, $activity, $element) {
+ private static function transform_activity($xpath, $activity, $element) {
if (!is_object($activity))
return "";
* @param object $mail mail elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
- private function process_mail($xpath, $mail, $importer) {
+ private static function process_mail($xpath, $mail, $importer) {
logger("Processing mails");
$msg["seen"] = 0;
$msg["replied"] = 0;
- dbesc_array($msg);
+ dbm::esc_array($msg, true);
- $r = dbq("INSERT INTO `mail` (`".implode("`, `", array_keys($msg))."`) VALUES ('".implode("', '", array_values($msg))."')");
+ $r = dbq("INSERT INTO `mail` (`".implode("`, `", array_keys($msg))."`) VALUES (".implode(", ", array_values($msg)).")");
// send notifications.
* @param object $suggestion suggestion elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
- private function process_suggestion($xpath, $suggestion, $importer) {
+ private static function process_suggestion($xpath, $suggestion, $importer) {
$a = get_app();
logger("Processing suggestions");
* @param object $relocation relocation elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
- private function process_relocation($xpath, $relocation, $importer) {
+ private static function process_relocation($xpath, $relocation, $importer) {
logger("Processing relocations");
* @param array $importer Record of the importer user mixed with contact of the content
* @param int $entrytype Is it a toplevel entry, a comment or a relayed comment?
*/
- private function update_content($current, $item, $importer, $entrytype) {
+ private static function update_content($current, $item, $importer, $entrytype) {
$changed = false;
if (edited_timestamp_is_newer($current, $item)) {
*
* @return int Is it a toplevel entry, a comment or a relayed comment?
*/
- private function get_entry_type($importer, $item) {
+ private static function get_entry_type($importer, $item) {
if ($item["parent-uri"] != $item["uri"]) {
$community = false;
* @param array $importer Record of the importer user mixed with contact of the content
* @param int $posted_id The record number of item record that was just posted
*/
- private function do_poke($item, $importer, $posted_id) {
+ private static function do_poke($item, $importer, $posted_id) {
$verb = urldecode(substr($item["verb"],strpos($item["verb"], "#")+1));
if(!$verb)
return;
*
* @return bool Should the processing of the entries be continued?
*/
- private function process_verbs($entrytype, $importer, &$item, &$is_like) {
+ private static function process_verbs($entrytype, $importer, &$item, &$is_like) {
logger("Process verb ".$item["verb"]." and object-type ".$item["object-type"]." for entrytype ".$entrytype, LOGGER_DEBUG);
* @param object $links link elements
* @param array $item the item record
*/
- private function parse_links($links, &$item) {
+ private static function parse_links($links, &$item) {
$rel = "";
$href = "";
$type = "";
* @param object $entry entry elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
- private function process_entry($header, $xpath, $entry, $importer) {
+ private static function process_entry($header, $xpath, $entry, $importer) {
logger("Processing entries");
// Get the uri
$item["uri"] = $xpath->query("atom:id/text()", $entry)->item(0)->nodeValue;
+ $item["edited"] = $xpath->query("atom:updated/text()", $entry)->item(0)->nodeValue;
+
+ $current = q("SELECT `id`, `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($item["uri"]),
+ intval($importer["importer_uid"])
+ );
+
+ // Is there an existing item?
+ if (dbm::is_result($current) AND edited_timestamp_is_newer($current[0], $item) AND
+ (datetime_convert("UTC","UTC",$item["edited"]) < $current[0]["edited"])) {
+ logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG);
+ return;
+ }
+
// Fetch the owner
$owner = self::fetchauthor($xpath, $entry, $importer, "dfrn:owner", true);
$item["title"] = $xpath->query("atom:title/text()", $entry)->item(0)->nodeValue;
$item["created"] = $xpath->query("atom:published/text()", $entry)->item(0)->nodeValue;
- $item["edited"] = $xpath->query("atom:updated/text()", $entry)->item(0)->nodeValue;
$item["body"] = $xpath->query("dfrn:env/text()", $entry)->item(0)->nodeValue;
$item["body"] = str_replace(array(' ',"\t","\r","\n"), array('','','',''),$item["body"]);
}
}
- $r = q("SELECT `id`, `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item["uri"]),
- intval($importer["importer_uid"])
- );
-
if (!self::process_verbs($entrytype, $importer, $item, $is_like)) {
logger("Exiting because 'process_verbs' told us so", LOGGER_DEBUG);
return;
}
// Update content if 'updated' changes
- if (dbm::is_result($r)) {
+ if (dbm::is_result($current)) {
if (self::update_content($r[0], $item, $importer, $entrytype))
logger("Item ".$item["uri"]." was updated.", LOGGER_DEBUG);
else
* @param object $deletion deletion elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
- private function process_deletion($xpath, $deletion, $importer) {
+ private static function process_deletion($xpath, $deletion, $importer) {
logger("Processing deletions");
dbesc($xt->id),
intval($importer["importer_uid"])
);
- if(count($i)) {
+ if (dbm::is_result($i)) {
// For tags, the owner cannot remove the tag on the author's copy of the post.