xmlify($baseurl), '$feed_title' => xmlify($owner['name']), '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , 'Y-m-d\TH:i:s\Z')) , '$name' => xmlify($owner['name']), '$profile_page' => xmlify($owner['url']), '$photo' => xmlify($owner['photo']) )); if($followup) { $atom .= replace_macros($cmnt_template, array( '$name' => xmlify($contact['name']), '$profile_page' => xmlify($contact['url']), '$thumb' => xmlify($contact['thumb']), '$item_id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$item['hash']}"), '$title' => xmlify($item['title']), '$published' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$content' =>xmlify($item['body']), '$parent_id' => xmlify("{$items[0]['remote-id']}"), '$comment_allow' => 0 )); } else { foreach($items as $item) { if($item['deleted']) { $atom .= replace_macros($tomb_template, array( '$id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$item['hash']}"), '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , 'Y-m-d\TH:i:s\Z')) )); } else { foreach($contacts as $contact) { if($item['contact-id'] == $contact['id']) { if($item['parent'] == $item['id']) { $atom .= replace_macros($item_template, array( '$name' => xmlify($contact['name']), '$profile_page' => xmlify($contact['url']), '$thumb' => xmlify($contact['thumb']), '$owner_name' => xmlify($item['owner-name']), '$owner_profile_page' => xmlify($item['owner-link']), '$owner_thumb' => xmlify($item['owner-avatar']), '$item_id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$item['hash']}"), '$title' => xmlify($contact['name']), '$published' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$content' =>xmlify($item['body']), '$comment_allow' => (($item['last-child'] && strlen($contact['dfrn-id'] && (! $contact['blocked']))) ? 1 : 0) )); } else { $atom .= replace_macros($cmnt_template, array( '$name' => xmlify($contact['name']), '$profile_page' => xmlify($contact['url']), '$thumb' => xmlify($contact['thumb']), '$item_id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$item['hash']}"), '$title' => xmlify($item['title']), '$published' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$content' =>xmlify($item['body']), '$parent_id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$items[0]['hash']}"), '$comment_allow' => (($item['last-child']) ? 1 : 0) )); } } } } } } $atom .= "\r\n"; // create a clone of this feed but with comments disabled to send to those who can't respond. $atom_nowrite = str_replace('1','0',$atom); if($followup) $recip_str = $parent['contact-id']; else $recip_str = implode(', ', $recipients); $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) ", dbesc($recip_str) ); if(! count($r)) killme(); // delivery loop foreach($r as $rr) { if($rr['self']) continue; if(! strlen($rr['dfrn-id'])) continue; $url = $rr['notify'] . '?dfrn_id=' . $rr['dfrn-id']; $xml = fetch_url($url); if(! $xml) continue; $res = simplexml_load_string($xml); if((intval($res->status) != 0) || (! strlen($res->challenge)) || ($res->dfrn_id != $rr['dfrn-id'])) continue; $postvars = array(); $postvars['dfrn_id'] = $rr['dfrn-id']; $challenge = hex2bin($res->challenge); openssl_public_decrypt($challenge,$postvars['challenge'],$rr['pubkey']); if(strlen($rr['dfrn-id']) && (! $rr['blocked'])) $postvars['data'] = $atom; else $postvars['data'] = $atom_nowrite; $xml = post_url($url,$postvars); } killme();