2010-07-19 03:49:54 +00:00
< ? php
2011-04-16 06:40:43 +00:00
2011-01-28 13:04:18 +00:00
require_once ( " boot.php " );
2011-07-01 04:56:07 +00:00
2011-01-28 13:04:18 +00:00
function poller_run ( $argv , $argc ){
2011-03-05 04:55:32 +00:00
global $a , $db ;
2011-01-28 13:04:18 +00:00
2011-03-05 04:55:32 +00:00
if ( is_null ( $a )) {
$a = new App ;
}
2011-01-28 13:04:18 +00:00
2011-03-05 04:55:32 +00:00
if ( is_null ( $db )) {
@ include ( " .htconfig.php " );
require_once ( " dba.php " );
$db = new dba ( $db_host , $db_user , $db_pass , $db_data );
unset ( $db_host , $db_user , $db_pass , $db_data );
};
2010-08-17 03:47:40 +00:00
2011-04-16 06:40:43 +00:00
2011-06-29 04:11:52 +00:00
require_once ( 'include/session.php' );
require_once ( 'include/datetime.php' );
require_once ( 'library/simplepie/simplepie.inc' );
2010-09-02 07:31:11 +00:00
require_once ( 'include/items.php' );
2010-09-09 03:14:17 +00:00
require_once ( 'include/Contact.php' );
2011-04-16 06:40:43 +00:00
require_once ( 'include/email.php' );
2011-11-01 03:54:24 +00:00
require_once ( 'include/socgraph.php' );
2012-04-01 18:52:33 +00:00
require_once ( 'include/pidfile.php' );
2010-09-09 03:14:17 +00:00
2011-06-30 08:15:18 +00:00
load_config ( 'config' );
load_config ( 'system' );
2012-04-01 18:52:33 +00:00
$lockpath = get_config ( 'system' , 'lockpath' );
if ( $lockpath != '' ) {
$pidfile = new pidfile ( $lockpath , 'poller.lck' );
if ( $pidfile -> is_already_running ()) {
logger ( " poller: Already running " );
exit ;
}
}
2010-08-17 03:47:40 +00:00
$a -> set_baseurl ( get_config ( 'system' , 'url' ));
2010-07-19 03:49:54 +00:00
2011-04-26 11:39:27 +00:00
load_hooks ();
2010-11-26 02:31:33 +00:00
logger ( 'poller: start' );
2011-01-24 21:01:56 +00:00
2010-11-26 02:22:54 +00:00
// run queue delivery process in the background
2010-11-22 23:30:52 +00:00
2011-02-23 23:16:12 +00:00
proc_run ( 'php' , " include/queue.php " );
2011-01-31 16:16:35 +00:00
2011-09-26 12:43:22 +00:00
// expire any expired accounts
q ( " UPDATE user SET `account_expired` = 1 where `account_expired` = 0
AND `account_expires_on` != '0000-00-00 00:00:00'
AND `account_expires_on` < UTC_TIMESTAMP () " );
2011-09-30 04:20:19 +00:00
$abandon_days = intval ( get_config ( 'system' , 'account_abandon_days' ));
if ( $abandon_days < 1 )
$abandon_days = 0 ;
2011-10-14 07:20:37 +00:00
// once daily run birthday_updates and then expire in background
2011-03-16 00:31:49 +00:00
$d1 = get_config ( 'system' , 'last_expire_day' );
$d2 = intval ( datetime_convert ( 'UTC' , 'UTC' , 'now' , 'd' ));
if ( $d2 != intval ( $d1 )) {
2011-10-14 07:20:37 +00:00
update_contact_birthdays ();
2011-11-29 03:28:33 +00:00
update_suggestions ();
2011-03-16 00:31:49 +00:00
set_config ( 'system' , 'last_expire_day' , $d2 );
proc_run ( 'php' , 'include/expire.php' );
}
2011-01-31 16:16:35 +00:00
// clear old cache
2011-10-24 11:02:38 +00:00
Cache :: clear ();
2010-11-22 23:30:52 +00:00
2012-03-11 18:11:25 +00:00
// clear item cache files if they are older than one day
$cache = get_config ( 'system' , 'itemcache' );
if (( $cache != '' ) and is_dir ( $cache )) {
if ( $dh = opendir ( $cache )) {
while (( $file = readdir ( $dh )) !== false ) {
$fullpath = $cache . " / " . $file ;
2012-03-11 18:45:28 +00:00
if (( filetype ( $fullpath ) == " file " ) and filectime ( $fullpath ) < ( time () - 86400 ))
2012-03-11 18:11:25 +00:00
unlink ( $fullpath );
}
closedir ( $dh );
}
}
2011-02-03 03:56:27 +00:00
$manual_id = 0 ;
2011-07-01 04:56:07 +00:00
$generation = 0 ;
2011-01-10 21:45:42 +00:00
$hub_update = false ;
2011-02-03 03:56:27 +00:00
$force = false ;
2011-07-01 04:56:07 +00:00
$restart = false ;
2011-01-10 21:45:42 +00:00
2010-11-05 03:47:44 +00:00
if (( $argc > 1 ) && ( $argv [ 1 ] == 'force' ))
$force = true ;
2011-07-01 04:56:07 +00:00
if (( $argc > 1 ) && ( $argv [ 1 ] == 'restart' )) {
$restart = true ;
$generation = intval ( $argv [ 2 ]);
if ( ! $generation )
killme ();
}
2011-01-24 04:09:34 +00:00
if (( $argc > 1 ) && intval ( $argv [ 1 ])) {
$manual_id = intval ( $argv [ 1 ]);
2011-02-03 03:56:27 +00:00
$force = true ;
2011-01-24 04:09:34 +00:00
}
$sql_extra = (( $manual_id ) ? " AND `id` = $manual_id " : " " );
2011-04-26 11:39:27 +00:00
reload_plugins ();
2011-03-09 10:12:32 +00:00
$d = datetime_convert ();
2011-04-26 11:39:27 +00:00
2011-07-01 04:56:07 +00:00
if ( ! $restart )
2011-08-15 05:59:34 +00:00
proc_run ( 'php' , 'include/cronhooks.php' );
2011-03-09 10:12:32 +00:00
2011-08-24 01:17:35 +00:00
// Only poll from those with suitable relationships,
// and which have a polling address and ignore Diaspora since
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
2011-09-30 04:20:19 +00:00
$abandon_sql = (( $abandon_days )
? sprintf ( " AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY " , intval ( $abandon_days ))
: ''
);
2011-09-19 08:17:12 +00:00
$contacts = q ( " SELECT `contact`.`id` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
2011-03-05 04:55:32 +00:00
WHERE ( `rel` = % d OR `rel` = % d ) AND `poll` != ''
2011-11-04 22:21:46 +00:00
AND NOT `network` IN ( '%s' , '%s' )
2011-01-24 04:09:34 +00:00
$sql_extra
2011-09-19 08:17:12 +00:00
AND `self` = 0 AND `contact` . `blocked` = 0 AND `contact` . `readonly` = 0
2011-09-30 04:20:19 +00:00
AND `user` . `account_expired` = 0 $abandon_sql ORDER BY RAND () " ,
2011-08-07 23:15:54 +00:00
intval ( CONTACT_IS_SHARING ),
2011-08-24 01:17:35 +00:00
intval ( CONTACT_IS_FRIEND ),
2011-11-04 22:21:46 +00:00
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_FACEBOOK )
2011-03-05 04:55:32 +00:00
);
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
if ( ! count ( $contacts )) {
2011-01-28 13:04:18 +00:00
return ;
2011-01-24 21:01:56 +00:00
}
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
foreach ( $contacts as $c ) {
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
$res = q ( " SELECT * FROM `contact` WHERE `id` = %d LIMIT 1 " ,
intval ( $c [ 'id' ])
);
2011-01-31 03:38:03 +00:00
2011-08-15 05:59:34 +00:00
if (( ! $res ) || ( ! count ( $res )))
2011-03-05 04:55:32 +00:00
continue ;
2010-08-01 12:46:51 +00:00
2011-03-05 04:55:32 +00:00
foreach ( $res as $contact ) {
2011-07-01 05:00:08 +00:00
2011-04-16 06:40:43 +00:00
$xml = false ;
2011-03-05 04:55:32 +00:00
if ( $manual_id )
$contact [ 'last-update' ] = '0000-00-00 00:00:00' ;
2010-12-21 22:51:26 +00:00
2012-03-10 10:29:40 +00:00
if ( $contact [ 'network' ] === NETWORK_DFRN )
$contact [ 'priority' ] = 2 ;
if ( ! get_config ( 'system' , 'ostatus_use_priority' ) and ( $contact [ 'network' ] === NETWORK_OSTATUS ))
2011-11-04 22:21:46 +00:00
$contact [ 'priority' ] = 2 ;
2011-03-05 04:55:32 +00:00
if ( $contact [ 'priority' ] || $contact [ 'subhub' ]) {
2010-10-15 11:58:13 +00:00
2011-03-05 04:55:32 +00:00
$hub_update = true ;
$update = false ;
2010-10-15 11:58:13 +00:00
2011-03-05 04:55:32 +00:00
$t = $contact [ 'last-update' ];
2010-10-15 11:58:13 +00:00
2011-03-05 04:55:32 +00:00
// We should be getting everything via a hub. But just to be sure, let's check once a day.
// (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
// This also lets us update our subscription to the hub, and add or replace hubs in case it
// changed. We will only update hubs once a day, regardless of 'pushpoll_frequency'.
2010-12-21 22:51:26 +00:00
2011-03-05 04:55:32 +00:00
if ( $contact [ 'subhub' ]) {
$interval = get_config ( 'system' , 'pushpoll_frequency' );
$contact [ 'priority' ] = (( $interval !== false ) ? intval ( $interval ) : 3 );
$hub_update = false ;
if (( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 1 day " )) || $force )
$hub_update = true ;
}
2011-09-22 11:11:39 +00:00
else
$hub_update = false ;
2010-12-21 22:51:26 +00:00
2011-03-05 04:55:32 +00:00
/**
* Based on $contact [ 'priority' ], should we poll this site now ? Or later ?
*/
switch ( $contact [ 'priority' ]) {
case 5 :
if ( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 1 month " ))
$update = true ;
break ;
case 4 :
if ( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 1 week " ))
$update = true ;
break ;
case 3 :
if ( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 1 day " ))
$update = true ;
break ;
case 2 :
if ( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 12 hour " ))
$update = true ;
break ;
case 1 :
default :
if ( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 1 hour " ))
$update = true ;
break ;
}
2012-02-23 04:31:33 +00:00
if (( ! $update ) && ( ! $force ))
continue ;
2010-08-01 12:46:51 +00:00
}
2011-03-05 04:55:32 +00:00
2011-07-01 04:56:07 +00:00
// Check to see if we are running out of memory - if so spawn a new process and kill this one
$avail_memory = return_bytes ( ini_get ( 'memory_limit' ));
$memused = memory_get_peak_usage ( true );
if ( intval ( $avail_memory )) {
if (( $memused / $avail_memory ) > 0.95 ) {
if ( $generation + 1 > 10 ) {
logger ( 'poller: maximum number of spawns exceeded. Terminating.' );
killme ();
}
logger ( 'poller: memory exceeded. ' . $memused . ' bytes used. Spawning new poll.' );
proc_run ( 'php' , 'include/poller.php' , 'restart' , ( string ) $generation + 1 );
killme ();
}
}
2011-03-05 04:55:32 +00:00
$importer_uid = $contact [ 'uid' ];
2012-03-19 05:12:36 +00:00
$r = q ( " SELECT `contact`.*, `user`.`page-flags` FROM `contact` LEFT JOIN `user` on `contact`.`uid` = `user`.`uid` WHERE `user`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1 " ,
2011-03-05 04:55:32 +00:00
intval ( $importer_uid )
);
if ( ! count ( $r ))
2010-08-01 12:46:51 +00:00
continue ;
2011-03-05 04:55:32 +00:00
$importer = $r [ 0 ];
2010-07-19 03:49:54 +00:00
2011-11-04 22:21:46 +00:00
logger ( " poller: poll: ( { $contact [ 'id' ] } ) IMPORTER: { $importer [ 'name' ] } , CONTACT: { $contact [ 'name' ] } " );
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
$last_update = (( $contact [ 'last-update' ] === '0000-00-00 00:00:00' )
? datetime_convert ( 'UTC' , 'UTC' , 'now - 30 days' , ATOM_TIME )
: datetime_convert ( 'UTC' , 'UTC' , $contact [ 'last-update' ], ATOM_TIME )
);
2010-07-19 03:49:54 +00:00
2011-04-16 06:40:43 +00:00
if ( $contact [ 'network' ] === NETWORK_DFRN ) {
2010-09-09 12:25:01 +00:00
2011-03-05 04:55:32 +00:00
$idtosend = $orig_id = (( $contact [ 'dfrn-id' ]) ? $contact [ 'dfrn-id' ] : $contact [ 'issued-id' ]);
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
if ( intval ( $contact [ 'duplex' ]) && $contact [ 'dfrn-id' ])
$idtosend = '0:' . $orig_id ;
if ( intval ( $contact [ 'duplex' ]) && $contact [ 'issued-id' ])
2011-04-11 02:29:21 +00:00
$idtosend = '1:' . $orig_id ;
// they have permission to write to us. We already filtered this in the contact query.
$perm = 'rw' ;
2010-09-13 04:25:37 +00:00
2011-03-30 22:04:18 +00:00
$url = $contact [ 'poll' ] . '?dfrn_id=' . $idtosend
2011-03-05 04:55:32 +00:00
. '&dfrn_version=' . DFRN_PROTOCOL_VERSION
2011-04-11 02:29:21 +00:00
. '&type=data&last_update=' . $last_update
. '&perm=' . $perm ;
2011-03-05 04:55:32 +00:00
2011-04-16 06:40:43 +00:00
$handshake_xml = fetch_url ( $url );
2010-09-13 04:25:37 +00:00
2011-04-16 06:40:43 +00:00
logger ( 'poller: handshake with url ' . $url . ' returns xml: ' . $handshake_xml , LOGGER_DATA );
2010-10-13 03:29:04 +00:00
2010-09-02 07:31:11 +00:00
2011-04-16 06:40:43 +00:00
if ( ! $handshake_xml ) {
2011-03-05 04:55:32 +00:00
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.
// Will keep trying for one month.
mark_for_death ( $contact );
2010-09-02 07:31:11 +00:00
2011-03-05 04:55:32 +00:00
// set the last-update so we don't keep polling
2010-12-03 02:32:46 +00:00
2011-03-05 04:55:32 +00:00
$r = q ( " UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $contact [ 'id' ])
);
2010-11-26 02:50:28 +00:00
2011-03-05 04:55:32 +00:00
continue ;
}
2010-11-26 02:50:28 +00:00
2011-04-16 06:40:43 +00:00
if ( ! strstr ( $handshake_xml , '<?xml' )) {
2011-03-05 04:55:32 +00:00
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 ()),
intval ( $contact [ 'id' ])
);
continue ;
}
2010-11-26 02:50:28 +00:00
2010-09-13 04:25:37 +00:00
2011-04-16 06:40:43 +00:00
$res = parse_xml_string ( $handshake_xml );
2011-03-05 04:55:32 +00:00
if ( intval ( $res -> status ) == 1 ) {
logger ( " poller: $url replied status 1 - marking for death " );
2010-12-03 02:32:46 +00:00
2011-03-05 04:55:32 +00:00
// we may not be friends anymore. Will keep trying for one month.
// set the last-update so we don't keep polling
2010-09-13 04:25:37 +00:00
2011-03-05 04:55:32 +00:00
$r = q ( " UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $contact [ 'id' ])
);
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
mark_for_death ( $contact );
}
else {
if ( $contact [ 'term-date' ] != '0000-00-00 00:00:00' ) {
logger ( " poller: $url back from the dead - removing mark for death " );
unmark_for_death ( $contact );
}
}
2010-11-26 02:50:28 +00:00
2011-03-05 04:55:32 +00:00
if (( intval ( $res -> status ) != 0 ) || ( ! strlen ( $res -> challenge )) || ( ! strlen ( $res -> dfrn_id )))
continue ;
2010-11-26 02:50:28 +00:00
2011-11-01 03:39:04 +00:00
if ((( float ) $res -> dfrn_version > 2.21 ) && ( $contact [ 'poco' ] == '' )) {
q ( " update contact set poco = '%s' where id = %d limit 1 " ,
dbesc ( str_replace ( '/profile/' , '/poco/' , $contact [ 'url' ])),
intval ( $contact [ 'id' ])
);
}
2011-03-05 04:55:32 +00:00
$postvars = array ();
2010-11-26 02:50:28 +00:00
2011-03-05 04:55:32 +00:00
$sent_dfrn_id = hex2bin (( string ) $res -> dfrn_id );
$challenge = hex2bin (( string ) $res -> challenge );
$final_dfrn_id = '' ;
if (( $contact [ 'duplex' ]) && strlen ( $contact [ 'prvkey' ])) {
openssl_private_decrypt ( $sent_dfrn_id , $final_dfrn_id , $contact [ 'prvkey' ]);
openssl_private_decrypt ( $challenge , $postvars [ 'challenge' ], $contact [ 'prvkey' ]);
}
else {
openssl_public_decrypt ( $sent_dfrn_id , $final_dfrn_id , $contact [ 'pubkey' ]);
openssl_public_decrypt ( $challenge , $postvars [ 'challenge' ], $contact [ 'pubkey' ]);
2010-11-05 03:47:44 +00:00
}
2010-09-09 03:14:17 +00:00
2011-03-05 04:55:32 +00:00
$final_dfrn_id = substr ( $final_dfrn_id , 0 , strpos ( $final_dfrn_id , '.' ));
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
if ( strpos ( $final_dfrn_id , ':' ) == 1 )
$final_dfrn_id = substr ( $final_dfrn_id , 2 );
2010-07-19 03:49:54 +00:00
2011-03-05 04:55:32 +00:00
if ( $final_dfrn_id != $orig_id ) {
2011-04-11 02:29:21 +00:00
logger ( 'poller: ID did not decode: ' . $contact [ 'id' ] . ' orig: ' . $orig_id . ' final: ' . $final_dfrn_id );
2011-03-05 04:55:32 +00:00
// did not decode properly - cannot trust this site
continue ;
}
2010-08-05 09:57:03 +00:00
2011-03-05 04:55:32 +00:00
$postvars [ 'dfrn_id' ] = $idtosend ;
$postvars [ 'dfrn_version' ] = DFRN_PROTOCOL_VERSION ;
2011-04-11 02:29:21 +00:00
$postvars [ 'perm' ] = 'rw' ;
2010-09-02 07:31:11 +00:00
2011-03-05 04:55:32 +00:00
$xml = post_url ( $contact [ 'poll' ], $postvars );
2010-10-25 03:39:24 +00:00
}
2011-04-16 06:40:43 +00:00
elseif (( $contact [ 'network' ] === NETWORK_OSTATUS )
|| ( $contact [ 'network' ] === NETWORK_DIASPORA )
|| ( $contact [ 'network' ] === NETWORK_FEED ) ) {
2010-09-02 07:31:11 +00:00
2012-02-19 18:32:22 +00:00
// Upgrading DB fields from an older Friendica version
2011-04-16 06:40:43 +00:00
// Will only do this once per notify-enabled OStatus contact
2011-07-02 01:18:01 +00:00
// or if relationship changes
2010-10-25 03:39:24 +00:00
2011-08-07 23:15:54 +00:00
$stat_writeable = ((( $contact [ 'notify' ]) && ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER || $contact [ 'rel' ] == CONTACT_IS_FRIEND )) ? 1 : 0 );
2011-07-02 01:18:01 +00:00
if ( $stat_writeable != $contact [ 'writable' ]) {
q ( " UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1 " ,
intval ( $stat_writeable ),
2011-04-11 10:30:25 +00:00
intval ( $contact [ 'id' ])
);
}
2011-04-16 06:40:43 +00:00
2011-07-02 01:18:01 +00:00
// Are we allowed to import from this person?
2011-08-07 23:15:54 +00:00
if ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER || $contact [ 'blocked' ] || $contact [ 'readonly' ])
2011-07-02 01:18:01 +00:00
continue ;
2011-03-05 04:55:32 +00:00
$xml = fetch_url ( $contact [ 'poll' ]);
}
2012-02-01 04:03:46 +00:00
elseif ( $contact [ 'network' ] === NETWORK_MAIL || $contact [ 'network' ] === NETWORK_MAIL2 ) {
2011-04-19 03:20:04 +00:00
2012-02-22 14:20:49 +00:00
logger ( " Mail: Fetching " );
2011-04-19 03:20:04 +00:00
$mail_disabled = (( function_exists ( 'imap_open' ) && ( ! get_config ( 'system' , 'imap_disabled' ))) ? 0 : 1 );
if ( $mail_disabled )
continue ;
2012-02-22 14:20:49 +00:00
logger ( " Mail: Enabled " );
2011-04-18 22:16:51 +00:00
$mbox = null ;
$x = q ( " SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1 " ,
intval ( $importer_uid )
);
$mailconf = q ( " SELECT * FROM `mailacct` WHERE `server` != '' AND `uid` = %d LIMIT 1 " ,
intval ( $importer_uid )
);
if ( count ( $x ) && count ( $mailconf )) {
$mailbox = construct_mailbox_name ( $mailconf [ 0 ]);
$password = '' ;
openssl_private_decrypt ( hex2bin ( $mailconf [ 0 ][ 'pass' ]), $password , $x [ 0 ][ 'prvkey' ]);
$mbox = email_connect ( $mailbox , $mailconf [ 0 ][ 'user' ], $password );
unset ( $password );
2012-02-22 14:20:49 +00:00
logger ( " Mail: Connect " );
2011-04-18 22:16:51 +00:00
if ( $mbox ) {
q ( " UPDATE `mailacct` SET `last_check` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $mailconf [ 0 ][ 'id' ]),
intval ( $importer_uid )
);
2011-04-16 06:40:43 +00:00
}
}
if ( $mbox ) {
2012-02-22 14:20:49 +00:00
logger ( " Mail: mbox " );
2011-04-18 06:27:11 +00:00
2011-04-16 06:40:43 +00:00
$msgs = email_poll ( $mbox , $contact [ 'addr' ]);
2011-04-18 06:27:11 +00:00
2011-04-16 06:40:43 +00:00
if ( count ( $msgs )) {
2012-02-22 14:20:49 +00:00
logger ( " Mail: Parsing " . count ( $msgs ) . " mails. " );
2011-04-16 15:45:08 +00:00
foreach ( $msgs as $msg_uid ) {
2012-02-22 14:20:49 +00:00
logger ( " Mail: Parsing mail " . $msg_uid );
2011-04-16 15:45:08 +00:00
$datarray = array ();
$meta = email_msg_meta ( $mbox , $msg_uid );
2011-04-18 06:27:11 +00:00
$headers = email_msg_headers ( $mbox , $msg_uid );
// look for a 'references' header and try and match with a parent item we have locally.
$raw_refs = (( x ( $headers , 'references' )) ? str_replace ( " \t " , '' , $headers [ 'references' ]) : '' );
2012-02-25 00:10:45 +00:00
$datarray [ 'uri' ] = msgid2iri ( trim ( $meta -> message_id , '<>' ));
2011-04-18 06:27:11 +00:00
if ( $raw_refs ) {
$refs_arr = explode ( ' ' , $raw_refs );
if ( count ( $refs_arr )) {
for ( $x = 0 ; $x < count ( $refs_arr ); $x ++ )
2012-02-25 00:10:45 +00:00
$refs_arr [ $x ] = " ' " . msgid2iri ( str_replace ( array ( '<' , '>' , ' ' ), array ( '' , '' , '' ), dbesc ( $refs_arr [ $x ]))) . " ' " ;
2011-04-18 06:27:11 +00:00
}
$qstr = implode ( ',' , $refs_arr );
$r = q ( " SELECT `uri` , `parent-uri` FROM `item` WHERE `uri` IN ( $qstr ) AND `uid` = %d LIMIT 1 " ,
intval ( $importer_uid )
);
if ( count ( $r ))
$datarray [ 'parent-uri' ] = $r [ 0 ][ 'uri' ];
}
if ( ! x ( $datarray , 'parent-uri' ))
$datarray [ 'parent-uri' ] = $datarray [ 'uri' ];
2011-04-16 15:45:08 +00:00
// Have we seen it before?
$r = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1 " ,
intval ( $importer_uid ),
dbesc ( $datarray [ 'uri' ])
);
2011-04-18 06:27:11 +00:00
2011-04-16 15:45:08 +00:00
if ( count ( $r )) {
2012-02-22 14:20:49 +00:00
logger ( " Mail: Seen before " . $msg_uid );
2011-04-16 15:45:08 +00:00
if ( $meta -> deleted && ! $r [ 0 ][ 'deleted' ]) {
2011-05-20 01:53:35 +00:00
q ( " UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1 " ,
2011-04-16 15:45:08 +00:00
dbesc ( datetime_convert ()),
intval ( $r [ 0 ][ 'id' ])
);
2012-02-22 14:20:49 +00:00
}
2012-02-26 22:39:29 +00:00
switch ( $mailconf [ 0 ][ 'action' ]) {
case 0 :
break ;
case 1 :
logger ( " Mail: Deleting " . $msg_uid );
imap_delete ( $mbox , $msg_uid , FT_UID );
break ;
case 2 :
logger ( " Mail: Mark as seen " . $msg_uid );
imap_setflag_full ( $mbox , $msg_uid , " \\ Seen " , ST_UID );
break ;
case 3 :
logger ( " Mail: Moving " . $msg_uid . " to " . $mailconf [ 0 ][ 'movetofolder' ]);
imap_setflag_full ( $mbox , $msg_uid , " \\ Seen " , ST_UID );
if ( $mailconf [ 0 ][ 'movetofolder' ] != " " )
imap_mail_move ( $mbox , $msg_uid , $mailconf [ 0 ][ 'movetofolder' ], FT_UID );
break ;
}
2011-04-16 15:45:08 +00:00
continue ;
}
2012-02-24 06:11:26 +00:00
// Decoding the header
$subject = imap_mime_header_decode ( $meta -> subject );
$datarray [ 'title' ] = " " ;
foreach ( $subject as $subpart )
if ( $subpart -> charset != " default " )
$datarray [ 'title' ] .= iconv ( $subpart -> charset , 'UTF-8//IGNORE' , $subpart -> text );
else
$datarray [ 'title' ] .= $subpart -> text ;
$datarray [ 'title' ] = notags ( trim ( $datarray [ 'title' ]));
//$datarray['title'] = notags(trim($meta->subject));
2011-04-16 15:45:08 +00:00
$datarray [ 'created' ] = datetime_convert ( 'UTC' , 'UTC' , $meta -> date );
2012-02-22 14:20:49 +00:00
2012-03-17 10:07:49 +00:00
// Is it reply?
$reply = (( substr ( strtolower ( $datarray [ 'title' ]), 0 , 3 ) == " re: " ) or
( substr ( strtolower ( $datarray [ 'title' ]), 0 , 3 ) == " re- " ) or
( raw_refs != " " ));
$r = email_get_msg ( $mbox , $msg_uid , $reply );
2012-02-22 14:20:49 +00:00
if ( ! $r ) {
logger ( " Mail: can't fetch msg " . $msg_uid );
2011-04-16 15:45:08 +00:00
continue ;
2012-02-22 14:20:49 +00:00
}
2012-03-10 08:52:20 +00:00
$datarray [ 'body' ] = escape_tags ( $r [ 'body' ]);
2011-05-20 01:53:35 +00:00
2012-02-22 14:20:49 +00:00
logger ( " Mail: Importing " . $msg_uid );
// some mailing lists have the original author as 'from' - add this sender info to msg body.
2011-05-20 01:53:35 +00:00
// todo: adding a gravatar for the original author would be cool
2012-02-24 06:11:26 +00:00
if ( ! stristr ( $meta -> from , $contact [ 'addr' ])) {
$from = imap_mime_header_decode ( $meta -> from );
$fromdecoded = " " ;
foreach ( $from as $frompart )
if ( $frompart -> charset != " default " )
$fromdecoded .= iconv ( $frompart -> charset , 'UTF-8//IGNORE' , $frompart -> text );
else
$fromdecoded .= $frompart -> text ;
$datarray [ 'body' ] = " [b] " . t ( 'From: ' ) . escape_tags ( $fromdecoded ) . " [/b] \n \n " . $datarray [ 'body' ];
}
2011-05-20 01:53:35 +00:00
2011-04-16 15:45:08 +00:00
$datarray [ 'uid' ] = $importer_uid ;
$datarray [ 'contact-id' ] = $contact [ 'id' ];
2011-04-18 06:27:11 +00:00
if ( $datarray [ 'parent-uri' ] === $datarray [ 'uri' ])
$datarray [ 'private' ] = 1 ;
2012-02-01 04:03:46 +00:00
if (( $contact [ 'network' ] === NETWORK_MAIL ) && ( ! get_pconfig ( $importer_uid , 'system' , 'allow_public_email_replies' ))) {
2011-08-11 04:06:35 +00:00
$datarray [ 'private' ] = 1 ;
2011-08-11 08:52:31 +00:00
$datarray [ 'allow_cid' ] = '<' . $contact [ 'id' ] . '>' ;
}
2011-04-16 15:45:08 +00:00
$datarray [ 'author-name' ] = $contact [ 'name' ];
$datarray [ 'author-link' ] = 'mailbox' ;
$datarray [ 'author-avatar' ] = $contact [ 'photo' ];
2012-02-22 14:20:49 +00:00
2011-04-18 06:27:11 +00:00
$stored_item = item_store ( $datarray );
q ( " UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d " ,
dbesc ( $datarray [ 'parent-uri' ]),
intval ( $importer_uid )
);
q ( " UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1 " ,
intval ( $stored_item )
);
2012-02-26 22:39:29 +00:00
switch ( $mailconf [ 0 ][ 'action' ]) {
case 0 :
break ;
case 1 :
logger ( " Mail: Deleting " . $msg_uid );
imap_delete ( $mbox , $msg_uid , FT_UID );
break ;
case 2 :
logger ( " Mail: Mark as seen " . $msg_uid );
imap_setflag_full ( $mbox , $msg_uid , " \\ Seen " , ST_UID );
break ;
case 3 :
logger ( " Mail: Moving " . $msg_uid . " to " . $mailconf [ 0 ][ 'movetofolder' ]);
imap_setflag_full ( $mbox , $msg_uid , " \\ Seen " , ST_UID );
if ( $mailconf [ 0 ][ 'movetofolder' ] != " " )
imap_mail_move ( $mbox , $msg_uid , $mailconf [ 0 ][ 'movetofolder' ], FT_UID );
break ;
}
2011-04-16 15:45:08 +00:00
}
2011-04-16 06:40:43 +00:00
}
2011-04-18 22:16:51 +00:00
imap_close ( $mbox );
2011-04-16 06:40:43 +00:00
}
}
elseif ( $contact [ 'network' ] === NETWORK_FACEBOOK ) {
2011-08-10 08:19:27 +00:00
// This is picked up by the Facebook plugin on a cron hook.
2012-02-25 18:40:05 +00:00
// Ignored here.
2010-10-25 03:39:24 +00:00
}
2010-09-13 04:25:37 +00:00
2011-04-16 06:40:43 +00:00
if ( $xml ) {
logger ( 'poller: received xml : ' . $xml , LOGGER_DATA );
2011-04-04 08:18:28 +00:00
2011-04-16 06:40:43 +00:00
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 ;
}
2010-11-12 04:32:20 +00:00
2011-10-04 10:06:34 +00:00
consume_feed ( $xml , $importer , $contact , $hub , 1 , 1 );
2010-11-12 04:32:20 +00:00
2011-04-16 06:40:43 +00:00
// do it twice. Ensures that children of parents which may be later in the stream aren't tossed
2011-10-04 10:06:34 +00:00
consume_feed ( $xml , $importer , $contact , $hub , 1 , 2 );
2011-04-16 06:40:43 +00:00
2011-09-22 11:11:39 +00:00
$hubmode = 'subscribe' ;
if ( $contact [ 'network' ] === NETWORK_DFRN || $contact [ 'blocked' ] || $contact [ 'readonly' ])
$hubmode = 'unsubscribe' ;
2011-04-16 06:40:43 +00:00
2011-09-22 11:11:39 +00:00
if (( strlen ( $hub )) && ( $hub_update ) && ( $contact [ 'rel' ] != CONTACT_IS_FOLLOWER )) {
logger ( 'poller: hub ' . $hubmode . ' : ' . $hub . ' contact name : ' . $contact [ 'name' ] . ' local user : ' . $importer [ 'name' ]);
2011-04-16 06:40:43 +00:00
$hubs = explode ( ',' , $hub );
if ( count ( $hubs )) {
foreach ( $hubs as $h ) {
$h = trim ( $h );
if ( ! strlen ( $h ))
continue ;
2011-09-22 11:11:39 +00:00
subscribe_to_hub ( $h , $importer , $contact , $hubmode );
2011-04-16 06:40:43 +00:00
}
2011-03-05 04:55:32 +00:00
}
2010-10-15 11:20:42 +00:00
}
}
2010-10-01 04:38:45 +00:00
2011-09-22 11:11:39 +00:00
2011-03-05 04:55:32 +00:00
$updated = datetime_convert ();
2011-02-06 23:50:50 +00:00
2011-03-05 04:55:32 +00:00
$r = q ( " UPDATE `contact` SET `last-update` = '%s', `success_update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( $updated ),
dbesc ( $updated ),
intval ( $contact [ 'id' ])
);
2010-07-19 03:49:54 +00:00
2011-11-01 03:54:24 +00:00
// load current friends if possible.
if ( $contact [ 'poco' ]) {
$r = q ( " SELECT count(*) as total from glink
where `cid` = % d and updated > UTC_TIMESTAMP () - INTERVAL 1 DAY " ,
intval ( $contact [ 'id' ])
);
}
if ( count ( $r )) {
2011-11-04 22:21:46 +00:00
if ( ! $r [ 0 ][ 'total' ]) {
2011-11-01 03:54:24 +00:00
poco_load ( $contact [ 'id' ], $importer_uid , $contact [ 'poco' ]);
2011-11-04 22:21:46 +00:00
}
2011-11-01 03:54:24 +00:00
}
2011-03-05 04:55:32 +00:00
// loop - next contact
}
}
2011-04-16 15:45:08 +00:00
2010-07-19 03:49:54 +00:00
2011-01-28 13:04:18 +00:00
return ;
}
2010-07-19 03:49:54 +00:00
2011-01-28 13:04:18 +00:00
if ( array_search ( __file__ , get_included_files ()) === 0 ){
poller_run ( $argv , $argc );
killme ();
}