2012-04-28 08:17:40 +02:00
< ? php
require_once ( " boot.php " );
2012-12-17 03:01:40 +01:00
function RemoveReply ( $subject ) {
while ( in_array ( strtolower ( substr ( $subject , 0 , 3 )), array ( " re: " , " aw: " )))
$subject = trim ( substr ( $subject , 4 ));
return ( $subject );
}
2012-11-05 09:28:54 +01:00
function onepoll_run ( & $argv , & $argc ){
2012-04-28 08:17:40 +02:00
global $a , $db ;
if ( is_null ( $a )) {
$a = new App ;
}
if ( is_null ( $db )) {
@ include ( " .htconfig.php " );
2012-12-28 22:51:50 +01:00
require_once ( " include/dba.php " );
2012-04-28 08:17:40 +02:00
$db = new dba ( $db_host , $db_user , $db_pass , $db_data );
unset ( $db_host , $db_user , $db_pass , $db_data );
};
require_once ( 'include/session.php' );
require_once ( 'include/datetime.php' );
require_once ( 'library/simplepie/simplepie.inc' );
require_once ( 'include/items.php' );
require_once ( 'include/Contact.php' );
require_once ( 'include/email.php' );
require_once ( 'include/socgraph.php' );
require_once ( 'include/pidfile.php' );
2012-05-08 00:54:49 +02:00
require_once ( 'include/queue_fn.php' );
2012-04-28 08:17:40 +02:00
load_config ( 'config' );
load_config ( 'system' );
$a -> set_baseurl ( get_config ( 'system' , 'url' ));
load_hooks ();
logger ( 'onepoll: start' );
2013-07-19 23:38:23 +02:00
2012-04-28 08:17:40 +02:00
$manual_id = 0 ;
$generation = 0 ;
$hub_update = false ;
$force = false ;
$restart = false ;
if (( $argc > 1 ) && ( intval ( $argv [ 1 ])))
$contact_id = intval ( $argv [ 1 ]);
if ( ! $contact_id ) {
logger ( 'onepoll: no contact' );
return ;
}
2013-07-19 23:38:23 +02:00
// Test
$lockpath = get_config ( 'system' , 'lockpath' );
if ( $lockpath != '' ) {
$pidfile = new pidfile ( $lockpath , 'onepoll' . $contact_id . '.lck' );
if ( $pidfile -> is_already_running ()) {
logger ( " onepoll: Already running for contact " . $contact_id );
exit ;
}
}
2012-05-08 00:54:49 +02:00
2012-04-28 08:17:40 +02:00
$d = datetime_convert ();
// 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.
$contacts = q ( " SELECT `contact`.* FROM `contact`
WHERE ( `rel` = % d OR `rel` = % d ) AND `poll` != ''
2013-09-04 00:01:00 +02:00
AND NOT `network` IN ( '%s' , '%s' , '%s' )
2012-04-28 08:17:40 +02:00
AND `contact` . `id` = % d
AND `self` = 0 AND `contact` . `blocked` = 0 AND `contact` . `readonly` = 0
AND `contact` . `archive` = 0 LIMIT 1 " ,
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND ),
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_FACEBOOK ),
2013-09-04 00:01:00 +02:00
dbesc ( NETWORK_PUMPIO ),
2012-04-28 08:17:40 +02:00
intval ( $contact_id )
);
if ( ! count ( $contacts )) {
return ;
}
$contact = $contacts [ 0 ];
$xml = false ;
$t = $contact [ 'last-update' ];
if ( $contact [ 'subhub' ]) {
2012-06-12 02:24:16 +02:00
$poll_interval = get_config ( 'system' , 'pushpoll_frequency' );
$contact [ 'priority' ] = (( $poll_interval !== false ) ? intval ( $poll_interval ) : 3 );
2012-04-28 08:17:40 +02:00
$hub_update = false ;
if ( datetime_convert ( 'UTC' , 'UTC' , 'now' ) > datetime_convert ( 'UTC' , 'UTC' , $t . " + 1 day " ))
$hub_update = true ;
}
else
$hub_update = false ;
$importer_uid = $contact [ 'uid' ];
$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 " ,
intval ( $importer_uid )
);
if ( ! count ( $r ))
2012-04-28 13:20:38 +02:00
return ;
2012-04-28 08:17:40 +02:00
$importer = $r [ 0 ];
logger ( " onepoll: poll: ( { $contact [ 'id' ] } ) IMPORTER: { $importer [ 'name' ] } , CONTACT: { $contact [ 'name' ] } " );
$last_update = (( $contact [ 'last-update' ] === '0000-00-00 00:00:00' )
? datetime_convert ( 'UTC' , 'UTC' , 'now - 7 days' , ATOM_TIME )
: datetime_convert ( 'UTC' , 'UTC' , $contact [ 'last-update' ], ATOM_TIME )
);
if ( $contact [ 'network' ] === NETWORK_DFRN ) {
2012-12-06 22:59:20 +01:00
2012-04-28 08:17:40 +02:00
$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 ;
// they have permission to write to us. We already filtered this in the contact query.
$perm = 'rw' ;
2012-12-06 22:59:20 +01:00
// But this may be our first communication, so set the writable flag if it isn't set already.
if ( ! intval ( $contact [ 'writable' ]))
q ( " update contact set writable = 1 where id = %d limit 1 " , intval ( $contact [ 'id' ]));
2012-04-28 08:17:40 +02:00
$url = $contact [ 'poll' ] . '?dfrn_id=' . $idtosend
. '&dfrn_version=' . DFRN_PROTOCOL_VERSION
. '&type=data&last_update=' . $last_update
. '&perm=' . $perm ;
$handshake_xml = fetch_url ( $url );
2012-06-15 01:56:46 +02:00
$html_code = $a -> get_curl_code ();
2012-04-28 08:17:40 +02:00
logger ( 'onepoll: handshake with url ' . $url . ' returns xml: ' . $handshake_xml , LOGGER_DATA );
2012-06-15 01:56:46 +02:00
if (( ! strlen ( $handshake_xml )) || ( $html_code >= 400 ) || ( ! $html_code )) {
2012-04-28 08:17:40 +02:00
logger ( " poller: $url appears to be dead - marking for death " );
2012-06-15 01:56:46 +02:00
2012-04-28 08:17:40 +02:00
// 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.
2012-06-15 01:56:46 +02:00
2012-04-28 08:17:40 +02:00
mark_for_death ( $contact );
// set the last-update so we don't keep polling
$r = q ( " UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $contact [ 'id' ])
);
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02:00
}
if ( ! strstr ( $handshake_xml , '<?xml' )) {
logger ( 'poller: response from ' . $url . ' did not contain XML.' );
2012-06-15 02:38:39 +02:00
mark_for_death ( $contact );
2012-04-28 08:17:40 +02:00
$r = q ( " UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $contact [ 'id' ])
);
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02:00
}
$res = parse_xml_string ( $handshake_xml );
if ( intval ( $res -> status ) == 1 ) {
logger ( " poller: $url replied status 1 - marking for death " );
// we may not be friends anymore. Will keep trying for one month.
// set the last-update so we don't keep polling
$r = q ( " UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $contact [ 'id' ])
);
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 );
}
}
if (( intval ( $res -> status ) != 0 ) || ( ! strlen ( $res -> challenge )) || ( ! strlen ( $res -> dfrn_id )))
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02: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' ])
);
}
$postvars = array ();
$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' ]);
}
$final_dfrn_id = substr ( $final_dfrn_id , 0 , strpos ( $final_dfrn_id , '.' ));
if ( strpos ( $final_dfrn_id , ':' ) == 1 )
$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
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02:00
}
$postvars [ 'dfrn_id' ] = $idtosend ;
$postvars [ 'dfrn_version' ] = DFRN_PROTOCOL_VERSION ;
$postvars [ 'perm' ] = 'rw' ;
$xml = post_url ( $contact [ 'poll' ], $postvars );
}
elseif (( $contact [ 'network' ] === NETWORK_OSTATUS )
|| ( $contact [ 'network' ] === NETWORK_DIASPORA )
|| ( $contact [ 'network' ] === NETWORK_FEED ) ) {
// Upgrading DB fields from an older Friendica version
// Will only do this once per notify-enabled OStatus contact
// or if relationship changes
$stat_writeable = ((( $contact [ 'notify' ]) && ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER || $contact [ 'rel' ] == CONTACT_IS_FRIEND )) ? 1 : 0 );
2012-12-29 11:51:15 +01:00
if ( $contact [ 'network' ] === NETWORK_OSTATUS && get_pconfig ( $importer_uid , 'system' , 'ostatus_autofriend' ))
$stat_writeable = 1 ;
2012-04-28 08:17:40 +02:00
if ( $stat_writeable != $contact [ 'writable' ]) {
q ( " UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1 " ,
intval ( $stat_writeable ),
intval ( $contact [ 'id' ])
);
}
// Are we allowed to import from this person?
if ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER || $contact [ 'blocked' ] || $contact [ 'readonly' ])
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02:00
$xml = fetch_url ( $contact [ 'poll' ]);
}
elseif ( $contact [ 'network' ] === NETWORK_MAIL || $contact [ 'network' ] === NETWORK_MAIL2 ) {
logger ( " onepoll: mail: Fetching " , LOGGER_DEBUG );
$mail_disabled = (( function_exists ( 'imap_open' ) && ( ! get_config ( 'system' , 'imap_disabled' ))) ? 0 : 1 );
if ( $mail_disabled )
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02:00
logger ( " onepoll: Mail: Enabled " , LOGGER_DEBUG );
$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-09-20 04:35:39 +02:00
logger ( " Mail: Connect to " . $mailconf [ 0 ][ 'user' ]);
2012-04-28 08:17:40 +02: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 )
);
}
}
if ( $mbox ) {
$msgs = email_poll ( $mbox , $contact [ 'addr' ]);
if ( count ( $msgs )) {
2012-09-20 04:35:39 +02:00
logger ( " Mail: Parsing " . count ( $msgs ) . " mails for " . $mailconf [ 0 ][ 'user' ], LOGGER_DEBUG );
2012-04-28 08:17:40 +02:00
2012-09-30 01:50:34 +02:00
$metas = email_msg_meta ( $mbox , implode ( ',' , $msgs ));
2012-10-29 19:47:51 +01:00
if ( count ( $metas ) != count ( $msgs )) {
logger ( " onepoll: for " . $mailconf [ 0 ][ 'user' ] . " there are " . count ( $msgs ) . " messages but received " . count ( $metas ) . " metas " , LOGGER_DEBUG );
}
2012-11-06 16:43:19 +01:00
else {
$msgs = array_combine ( $msgs , $metas );
2012-10-29 19:47:51 +01:00
2012-11-06 16:43:19 +01:00
foreach ( $msgs as $msg_uid => $meta ) {
logger ( " Mail: Parsing mail " . $msg_uid , LOGGER_DATA );
2012-04-28 08:17:40 +02:00
2012-11-06 16:43:19 +01:00
$datarray = array ();
// $meta = email_msg_meta($mbox,$msg_uid);
// $headers = email_msg_headers($mbox,$msg_uid);
2012-04-28 08:17:40 +02:00
2012-11-06 16:43:19 +01:00
$datarray [ 'uri' ] = msgid2iri ( trim ( $meta -> message_id , '<>' ));
// 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 )) {
2013-03-14 23:15:15 +01:00
logger ( " Mail: Seen before " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ] . " UID: " . $importer_uid . " URI: " . $datarray [ 'uri' ], LOGGER_DEBUG );
// Only delete when mails aren't automatically moved or deleted
if (( $mailconf [ 0 ][ 'action' ] != 1 ) AND ( $mailconf [ 0 ][ 'action' ] != 3 ))
if ( $meta -> deleted && ! $r [ 0 ][ 'deleted' ]) {
q ( " UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $r [ 0 ][ 'id' ])
);
}
2012-12-19 16:31:06 +01:00
switch ( $mailconf [ 0 ][ 'action' ]) {
2012-11-06 16:43:19 +01:00
case 0 :
logger ( " Mail: Seen before " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ] . " . Doing nothing. " , LOGGER_DEBUG );
break ;
case 1 :
logger ( " Mail: Deleting " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ]);
imap_delete ( $mbox , $msg_uid , FT_UID );
break ;
case 2 :
logger ( " Mail: Mark as seen " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ]);
imap_setflag_full ( $mbox , $msg_uid , " \\ Seen " , ST_UID );
break ;
case 3 :
logger ( " Mail: Moving " . $msg_uid . " to " . $mailconf [ 0 ][ 'movetofolder' ] . " for " . $mailconf [ 0 ][ 'user' ]);
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 ;
2012-12-19 16:31:06 +01:00
}
2012-11-06 16:43:19 +01:00
continue ;
}
2012-04-28 08:17:40 +02:00
2012-11-06 16:43:19 +01:00
// look for a 'references' or an 'in-reply-to' header and try to match with a parent item we have locally.
// $raw_refs = ((x($headers,'references')) ? str_replace("\t",'',$headers['references']) : '');
$raw_refs = (( property_exists ( $meta , 'references' )) ? str_replace ( " \t " , '' , $meta -> references ) : '' );
if ( ! trim ( $raw_refs ))
$raw_refs = (( property_exists ( $meta , 'in_reply_to' )) ? str_replace ( " \t " , '' , $meta -> in_reply_to ) : '' );
$raw_refs = trim ( $raw_refs ); // Don't allow a blank reference in $refs_arr
if ( $raw_refs ) {
$refs_arr = explode ( ' ' , $raw_refs );
if ( count ( $refs_arr )) {
for ( $x = 0 ; $x < count ( $refs_arr ); $x ++ )
$refs_arr [ $x ] = " ' " . msgid2iri ( str_replace ( array ( '<' , '>' , ' ' ), array ( '' , '' , '' ), dbesc ( $refs_arr [ $x ]))) . " ' " ;
}
$qstr = implode ( ',' , $refs_arr );
$r = q ( " SELECT `uri` , `parent-uri` FROM `item` WHERE `uri` IN ( $qstr ) AND `uid` = %d LIMIT 1 " ,
intval ( $importer_uid )
2012-04-28 08:17:40 +02:00
);
2012-11-06 16:43:19 +01:00
if ( count ( $r ))
$datarray [ 'parent-uri' ] = $r [ 0 ][ 'parent-uri' ]; // Set the parent as the top-level item
// $datarray['parent-uri'] = $r[0]['uri'];
2012-04-28 08:17:40 +02:00
}
2012-11-06 16:43:19 +01: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));
$datarray [ 'created' ] = datetime_convert ( 'UTC' , 'UTC' , $meta -> date );
2012-12-17 03:01:40 +01:00
// Is it a reply?
2012-11-06 16:43:19 +01:00
$reply = (( substr ( strtolower ( $datarray [ 'title' ]), 0 , 3 ) == " re: " ) or
( substr ( strtolower ( $datarray [ 'title' ]), 0 , 3 ) == " re- " ) or
2012-12-22 16:16:01 +01:00
( $raw_refs != " " ));
2012-11-06 16:43:19 +01:00
2012-12-17 03:01:40 +01:00
// Remove Reply-signs in the subject
$datarray [ 'title' ] = RemoveReply ( $datarray [ 'title' ]);
// If it seems to be a reply but a header couldn't be found take the last message with matching subject
if ( ! x ( $datarray , 'parent-uri' ) and $reply ) {
2012-12-22 16:16:01 +01:00
//$r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE MATCH (`title`) AGAINST ('".'"%s"'."' IN BOOLEAN MODE) AND `uid` = %d ORDER BY `created` DESC LIMIT 1",
$r = q ( " SELECT `uri` , `parent-uri` FROM `item` WHERE `title` = \" %s \" AND `uid` = %d ORDER BY `created` DESC LIMIT 1 " ,
2012-12-19 12:18:52 +01:00
dbesc ( protect_sprintf ( $datarray [ 'title' ])),
intval ( $importer_uid ));
2012-12-17 03:01:40 +01:00
if ( count ( $r ))
$datarray [ 'parent-uri' ] = $r [ 0 ][ 'parent-uri' ];
}
if ( ! x ( $datarray , 'parent-uri' ))
$datarray [ 'parent-uri' ] = $datarray [ 'uri' ];
2012-11-06 16:43:19 +01:00
$r = email_get_msg ( $mbox , $msg_uid , $reply );
if ( ! $r ) {
logger ( " Mail: can't fetch msg " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ]);
continue ;
}
$datarray [ 'body' ] = escape_tags ( $r [ 'body' ]);
2013-02-23 18:06:59 +01:00
$datarray [ 'body' ] = limit_body_size ( $datarray [ 'body' ]);
2012-11-06 16:43:19 +01:00
logger ( " Mail: Importing " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ]);
// some mailing lists have the original author as 'from' - add this sender info to msg body.
// todo: adding a gravatar for the original author would be cool
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 ;
2012-12-19 15:58:38 +01:00
$fromarr = imap_rfc822_parse_adrlist ( $fromdecoded , $a -> get_hostname ());
$frommail = $fromarr [ 0 ] -> mailbox . " @ " . $fromarr [ 0 ] -> host ;
if ( isset ( $fromarr [ 0 ] -> personal ))
$fromname = $fromarr [ 0 ] -> personal ;
else
$fromname = $frommail ;
//$datarray['body'] = "[b]".t('From: ') . escape_tags($fromdecoded) . "[/b]\n\n" . $datarray['body'];
$datarray [ 'author-name' ] = $fromname ;
$datarray [ 'author-link' ] = " mailto: " . $frommail ;
$datarray [ 'author-avatar' ] = $contact [ 'photo' ];
$datarray [ 'owner-name' ] = $contact [ 'name' ];
$datarray [ 'owner-link' ] = " mailto: " . $contact [ 'addr' ];
$datarray [ 'owner-avatar' ] = $contact [ 'photo' ];
} else {
$datarray [ 'author-name' ] = $contact [ 'name' ];
$datarray [ 'author-link' ] = 'mailbox' ;
$datarray [ 'author-avatar' ] = $contact [ 'photo' ];
2012-11-06 16:43:19 +01:00
}
$datarray [ 'uid' ] = $importer_uid ;
$datarray [ 'contact-id' ] = $contact [ 'id' ];
if ( $datarray [ 'parent-uri' ] === $datarray [ 'uri' ])
$datarray [ 'private' ] = 1 ;
if (( $contact [ 'network' ] === NETWORK_MAIL ) && ( ! get_pconfig ( $importer_uid , 'system' , 'allow_public_email_replies' ))) {
$datarray [ 'private' ] = 1 ;
$datarray [ 'allow_cid' ] = '<' . $contact [ 'id' ] . '>' ;
}
$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 )
);
switch ( $mailconf [ 0 ][ 'action' ]) {
2012-04-28 08:17:40 +02:00
case 0 :
2012-09-30 01:50:34 +02:00
logger ( " Mail: Seen before " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ] . " . Doing nothing. " , LOGGER_DEBUG );
2012-04-28 08:17:40 +02:00
break ;
case 1 :
2012-09-20 04:35:39 +02:00
logger ( " Mail: Deleting " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ]);
2012-04-28 08:17:40 +02:00
imap_delete ( $mbox , $msg_uid , FT_UID );
break ;
case 2 :
2012-09-20 04:35:39 +02:00
logger ( " Mail: Mark as seen " . $msg_uid . " for " . $mailconf [ 0 ][ 'user' ]);
2012-04-28 08:17:40 +02:00
imap_setflag_full ( $mbox , $msg_uid , " \\ Seen " , ST_UID );
break ;
case 3 :
2012-09-20 04:35:39 +02:00
logger ( " Mail: Moving " . $msg_uid . " to " . $mailconf [ 0 ][ 'movetofolder' ] . " for " . $mailconf [ 0 ][ 'user' ]);
2012-04-28 08:17:40 +02:00
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 ;
2012-09-30 01:50:34 +02:00
}
2012-04-28 08:17:40 +02:00
}
}
}
imap_close ( $mbox );
}
}
elseif ( $contact [ 'network' ] === NETWORK_FACEBOOK ) {
// This is picked up by the Facebook plugin on a cron hook.
// Ignored here.
2013-09-04 00:01:00 +02:00
} elseif ( $contact [ 'network' ] === NETWORK_PUMPIO ) {
// This is picked up by the pump.io plugin on a cron hook.
// Ignored here.
2012-04-28 08:17:40 +02:00
}
if ( $xml ) {
logger ( 'poller: received xml : ' . $xml , LOGGER_DATA );
2012-06-17 05:41:23 +02:00
if (( ! strstr ( $xml , '<?xml' )) && ( ! strstr ( $xml , '<rss' ))) {
2012-04-28 08:17:40 +02:00
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' ])
);
2012-04-29 01:54:33 +02:00
return ;
2012-04-28 08:17:40 +02:00
}
consume_feed ( $xml , $importer , $contact , $hub , 1 , 1 );
// do it twice. Ensures that children of parents which may be later in the stream aren't tossed
2013-09-04 00:01:00 +02:00
2012-04-28 08:17:40 +02:00
consume_feed ( $xml , $importer , $contact , $hub , 1 , 2 );
$hubmode = 'subscribe' ;
if ( $contact [ 'network' ] === NETWORK_DFRN || $contact [ 'blocked' ] || $contact [ 'readonly' ])
$hubmode = 'unsubscribe' ;
2013-06-27 15:51:13 +02:00
if (( $contact [ 'network' ] === NETWORK_OSTATUS || $contact [ 'network' ] == NETWORK_FEED ) && ( ! $contact [ 'hub-verify' ]))
2012-06-08 04:53:39 +02:00
$hub_update = true ;
2013-06-27 15:51:13 +02:00
if (( strlen ( $hub )) && ( $hub_update ) && (( $contact [ 'rel' ] != CONTACT_IS_FOLLOWER ) || $contact [ 'network' ] == NETWORK_FEED ) ) {
2012-04-28 08:17:40 +02:00
logger ( 'poller: hub ' . $hubmode . ' : ' . $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 , $hubmode );
}
}
}
}
$updated = datetime_convert ();
$r = q ( " UPDATE `contact` SET `last-update` = '%s', `success_update` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( $updated ),
dbesc ( $updated ),
intval ( $contact [ 'id' ])
);
// 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 )) {
if ( ! $r [ 0 ][ 'total' ]) {
2012-05-01 10:16:47 +02:00
poco_load ( $contact [ 'id' ], $importer_uid , 0 , $contact [ 'poco' ]);
2012-04-28 08:17:40 +02:00
}
}
return ;
}
if ( array_search ( __file__ , get_included_files ()) === 0 ){
onepoll_run ( $argv , $argc );
killme ();
}