]> git.mxchange.org Git - friendica.git/blobdiff - include/poller.php
mail changes
[friendica.git] / include / poller.php
index 9362c28b31bb4997127cf1773a992069a2720148..b8bd0b7081b5a7a6a8193ea57cd743d27b9ac054 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 require_once("boot.php");
 
 function poller_run($argv, $argc){
@@ -15,11 +16,14 @@ function poller_run($argv, $argc){
        unset($db_host, $db_user, $db_pass, $db_data);
        };
 
+       $mbox = null;
+
        require_once('session.php');
        require_once('datetime.php');
        require_once('simplepie/simplepie.inc');
        require_once('include/items.php');
        require_once('include/Contact.php');
+       require_once('include/email.php');
 
        $a->set_baseurl(get_config('system','url'));
 
@@ -85,6 +89,9 @@ function poller_run($argv, $argc){
                        continue;
 
                foreach($res as $contact) {
+
+                       $xml = false;
+
                        if($manual_id)
                                $contact['last-update'] = '0000-00-00 00:00:00';
 
@@ -158,25 +165,29 @@ function poller_run($argv, $argc){
                                : datetime_convert('UTC','UTC',$contact['last-update'], ATOM_TIME)
                        );
 
-                       if($contact['network'] === 'dfrn') {
+                       if($contact['network'] === NETWORK_DFRN) {
 
                                $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
 
                                if(intval($contact['duplex']) && $contact['dfrn-id'])
                                        $idtosend = '0:' . $orig_id;
                                if(intval($contact['duplex']) && $contact['issued-id'])
-                                       $idtosend = '1:' . $orig_id;            
+                                       $idtosend = '1:' . $orig_id;
+
+                               // they have permission to write to us. We already filtered this in the contact query.
+                               $perm = 'rw';
 
                                $url = $contact['poll'] . '?dfrn_id=' . $idtosend 
                                        . '&dfrn_version=' . DFRN_PROTOCOL_VERSION 
-                                       . '&type=data&last_update=' . $last_update ;
+                                       . '&type=data&last_update=' . $last_update 
+                                       . '&perm=' . $perm ;
        
-                               $xml = fetch_url($url);
+                               $handshake_xml = fetch_url($url);
 
-                               logger('poller: handshake with url ' . $url . ' returns xml: ' . $xml, LOGGER_DATA);
+                               logger('poller: handshake with url ' . $url . ' returns xml: ' . $handshake_xml, LOGGER_DATA);
 
 
-                               if(! $xml) {
+                               if(! $handshake_xml) {
                                        logger("poller: $url appears to be dead - marking for death ");
                                        // dead connection - might be a transient event, or this might
                                        // mean the software was uninstalled or the domain expired. 
@@ -193,7 +204,7 @@ function poller_run($argv, $argc){
                                        continue;
                                }
 
-                               if(! strstr($xml,'<?xml')) {
+                               if(! strstr($handshake_xml,'<?xml')) {
                                        logger('poller: response from ' . $url . ' did not contain XML.');
                                        $r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1",
                                                dbesc(datetime_convert()),
@@ -203,7 +214,7 @@ function poller_run($argv, $argc){
                                }
 
 
-                               $res = parse_xml_string($xml);
+                               $res = parse_xml_string($handshake_xml);
        
                                if(intval($res->status) == 1) {
                                        logger("poller: $url replied status 1 - marking for death ");
@@ -250,57 +261,128 @@ function poller_run($argv, $argc){
                                        $final_dfrn_id = substr($final_dfrn_id,2);
 
                                if($final_dfrn_id != $orig_id) {
-       
+                                       logger('poller: ID did not decode: ' . $contact['id'] . ' orig: ' . $orig_id . ' final: ' . $final_dfrn_id);    
                                        // did not decode properly - cannot trust this site 
                                        continue;
                                }
 
                                $postvars['dfrn_id'] = $idtosend;
                                $postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
+                               $postvars['perm'] = 'rw';
 
                                $xml = post_url($contact['poll'],$postvars);
                        }
-                       else {
+                       elseif(($contact['network'] === NETWORK_OSTATUS) 
+                               || ($contact['network'] === NETWORK_DIASPORA)
+                               || ($contact['network'] === NETWORK_FEED) ) {
 
-                               // $contact['network'] !== 'dfrn'
+                               // Upgrading DB fields from an older Friendika version
+                               // Will only do this once per notify-enabled OStatus contact
+
+                               if(($contact['notify']) && (! $contact['writable'])) {
+                                       q("UPDATE `contact` SET `writable` = 1 WHERE `id` = %d LIMIT 1",
+                                               intval($contact['id'])
+                                       );
+                               }
 
                                $xml = fetch_url($contact['poll']);
                        }
-
-                       logger('poller: received xml : ' . $xml, LOGGER_DATA);
-
-                       if(! strstr($xml,'<?xml')) {
-                               logger('poller: post_handshake: response from ' . $url . ' did not contain XML.');
-                               $r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1",
-                                       dbesc(datetime_convert()),
-                                       intval($contact['id'])
-                               );
-                               continue;
+                       elseif($contact['network'] === NETWORK_MAIL) {
+                               if(! $mbox) {
+                                       $x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
+                                               intval($importer_uid)
+                                       );
+                                       $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
+                                               intval($importer_uid)
+                                       );
+                                       if(count($x) && count($r)) {
+                                           $mailbox = construct_mailbox_name($r[0]);
+                                               $password = '';
+                                               openssl_private_decrypt(hex2bin($r[0]['pass']),$password,$x[0]['prvkey']);
+                                               $mbox = email_connect($mailbox,$r[0]['user'],$password);
+                                               unset($password);
+                                       }
+                               }
+                               if($mbox) {
+                                       $msgs = email_poll($mbox,$contact['addr']);
+                                       if(count($msgs)) {
+                                               foreach($msgs as $msg_uid) {
+                                                       $datarray = array();
+                                                       $meta = email_msg_meta($mbox,$msg_uid);
+                                                       $datarray['uri'] = trim($meta->message_id,'<>');
+//FIXME
+                                                       $datarray['parent-uri'] = $datarray['uri'];
+                                                       // Have we seen it before?
+                                                       $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1",
+                                                               intval($importer_uid),
+                                                               dbesc($datarray['uri'])
+                                                       );
+                                                       if(count($r)) {
+                                                               if($meta->deleted && ! $r[0]['deleted']) {
+                                                                       q("UPDATE `item` SET `deleted` = `, `changed` = '%s' WHERE `id` = %d LIMIT 1",
+                                                                               dbesc(datetime_convert()),
+                                                                               intval($r[0]['id'])
+                                                                       );
+                                                               }               
+                                                               continue;
+                                                       }
+                                                       $datarray['title'] = notags(trim($meta->subject));
+                                                       $datarray['created'] = datetime_convert('UTC','UTC',$meta->date);
+       
+                                                       $r = email_get_msg($mbox,$msg_uid);
+                                                       if(! $r)
+                                                               continue;
+                                                       $datarray['body'] = escape_tags($r['body']);
+                                                       $datarray['uid'] = $importer_uid;
+                                                       $datarray['contact-id'] = $contact['id'];
+                                                       $datarray['private'] = 1;
+                                                       $datarray['author-name'] = $contact['name'];
+                                                       $datarray['author-link'] = 'mailbox';
+                                                       $datarray['author-avatar'] = $contact['photo'];
+                                               
+                                                       item_store($datarray);
+                                               }
+                                       }
+                               }
+                       }
+                       elseif($contact['network'] === NETWORK_FACEBOOK) {
+                               // TODO: work in progress                       
                        }
 
+                       if($xml) {
+                               logger('poller: received xml : ' . $xml, LOGGER_DATA);
 
-                       consume_feed($xml,$importer,$contact,$hub,1, true);
-
-                       // do it twice. Ensures that children of parents which may be later in the stream aren't tossed
+                               if(! strstr($xml,'<?xml')) {
+                                       logger('poller: post_handshake: response from ' . $url . ' did not contain XML.');
+                                       $r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1",
+                                               dbesc(datetime_convert()),
+                                               intval($contact['id'])
+                                       );
+                                       continue;
+                               }
 
-                       consume_feed($xml,$importer,$contact,$hub,1);
 
+                               consume_feed($xml,$importer,$contact,$hub,1, true);
 
-                       if((strlen($hub)) && ($hub_update) 
-                               && (($contact['rel'] == REL_BUD) || (($contact['network'] === 'stat') && (! $contact['readonly'])))) {
-                               logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']);
-                               $hubs = explode(',', $hub);
-                               if(count($hubs)) {
-                                       foreach($hubs as $h) {
-                                               $h = trim($h);
-                                               if(! strlen($h))
-                                                       continue;
-                                               subscribe_to_hub($h,$importer,$contact);
+                               // do it twice. Ensures that children of parents which may be later in the stream aren't tossed
+       
+                               consume_feed($xml,$importer,$contact,$hub,1);
+
+
+                               if((strlen($hub)) && ($hub_update) && (($contact['rel'] == REL_BUD) || (($contact['network'] === NETWORK_OSTATUS) && (! $contact['readonly'])))) {
+                                       logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']);
+                                       $hubs = explode(',', $hub);
+                                       if(count($hubs)) {
+                                               foreach($hubs as $h) {
+                                                       $h = trim($h);
+                                                       if(! strlen($h))
+                                                               continue;
+                                                       subscribe_to_hub($h,$importer,$contact);
+                                               }
                                        }
                                }
                        }
 
-
                        $updated = datetime_convert();
 
                        $r = q("UPDATE `contact` SET `last-update` = '%s', `success_update` = '%s' WHERE `id` = %d LIMIT 1",
@@ -312,6 +394,9 @@ function poller_run($argv, $argc){
                        // loop - next contact
                }
        }
+
+       if($mbox && function_exists('imap_close'))
+               imap_close($mbox);
                
        return;
 }