2010-07-05 05:45:56 +02:00
< ? php
2010-07-15 08:04:10 +02:00
require_once ( 'simplepie/simplepie.inc' );
2010-07-19 05:49:10 +02:00
require_once ( 'include/items.php' );
2010-07-05 05:45:56 +02:00
2010-07-16 10:26:42 +02:00
function dfrn_notify_post ( & $a ) {
2010-07-31 06:22:52 +02:00
2010-07-05 05:45:56 +02:00
$dfrn_id = notags ( trim ( $_POST [ 'dfrn_id' ]));
$challenge = notags ( trim ( $_POST [ 'challenge' ]));
$data = $_POST [ 'data' ];
$r = q ( " SELECT * FROM `challenge` WHERE `dfrn-id` = '%s' AND `challenge` = '%s' LIMIT 1 " ,
dbesc ( $dfrn_id ),
dbesc ( $challenge )
);
if ( ! count ( $r ))
xml_status ( 3 );
$r = q ( " DELETE FROM `challenge` WHERE `dfrn-id` = '%s' AND `challenge` = '%s' LIMIT 1 " ,
dbesc ( $dfrn_id ),
dbesc ( $challenge )
);
2010-07-16 10:26:42 +02:00
// find the local user who owns this relationship.
2010-08-14 16:55:18 +02:00
$r = q ( " SELECT `contact`.*, `contact`.`uid` AS `importer_uid`, `user`.* FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` WHERE `issued-id` = '%s' LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
dbesc ( $dfrn_id )
);
2010-07-28 07:32:21 +02:00
if ( ! count ( $r )) {
2010-07-16 10:26:42 +02:00
xml_status ( 3 );
2010-07-28 07:32:21 +02:00
return ; //NOTREACHED
}
2010-07-16 10:26:42 +02:00
2010-07-28 07:32:21 +02:00
// We aren't really interested in anything this person has to say. But be polite and make them
// think we're listening intently by acknowledging receipt of their communications - which we quietly ignore.
2010-07-16 10:26:42 +02:00
2010-07-28 07:32:21 +02:00
if ( $r [ 0 ][ 'readonly' ]) {
xml_status ( 0 );
return ; //NOTREACHED
}
2010-07-16 10:26:42 +02:00
$importer = $r [ 0 ];
2010-07-15 08:04:10 +02:00
$feed = new SimplePie ();
$feed -> set_raw_data ( $data );
2010-07-16 10:26:42 +02:00
$feed -> enable_order_by_date ( false );
2010-07-15 08:04:10 +02:00
$feed -> init ();
2010-07-05 05:45:56 +02:00
2010-07-30 15:09:20 +02:00
$ismail = false ;
$rawmail = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'mail' );
if ( isset ( $rawmail [ 0 ][ 'child' ][ NAMESPACE_DFRN ])) {
$ismail = true ;
$base = $rawmail [ 0 ][ 'child' ][ NAMESPACE_DFRN ];
$msg = array ();
2010-08-14 16:55:18 +02:00
$msg [ 'uid' ] = $importer [ 'importer_uid' ];
2010-07-30 15:09:20 +02:00
$msg [ 'from-name' ] = notags ( unxmlify ( $base [ 'sender' ][ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'name' ][ 0 ][ 'data' ]));
$msg [ 'from-photo' ] = notags ( unxmlify ( $base [ 'sender' ][ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'avatar' ][ 0 ][ 'data' ]));
2010-08-09 06:03:08 +02:00
$msg [ 'from-url' ] = notags ( unxmlify ( $base [ 'sender' ][ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'uri' ][ 0 ][ 'data' ]));
2010-07-30 15:09:20 +02:00
$msg [ 'contact-id' ] = $importer [ 'id' ];
$msg [ 'title' ] = notags ( unxmlify ( $base [ 'subject' ][ 0 ][ 'data' ]));
$msg [ 'body' ] = escape_tags ( unxmlify ( $base [ 'content' ][ 0 ][ 'data' ]));
$msg [ 'delivered' ] = 1 ;
$msg [ 'seen' ] = 0 ;
$msg [ 'replied' ] = 0 ;
$msg [ 'uri' ] = notags ( unxmlify ( $base [ 'id' ][ 0 ][ 'data' ]));
$msg [ 'parent-uri' ] = notags ( unxmlify ( $base [ 'in-reply-to' ][ 0 ][ 'data' ]));
$msg [ 'created' ] = datetime_convert ( notags ( unxmlify ( 'UTC' , 'UTC' , $base [ 'sentdate' ][ 0 ][ 'data' ])));
2010-08-13 14:59:59 +02:00
dbesc_array ( $msg );
2010-08-11 07:14:17 +02:00
2010-07-30 15:09:20 +02:00
$r = q ( " INSERT INTO `mail` (` " . implode ( " `, ` " , array_keys ( $msg ))
. " `) VALUES (' " . implode ( " ', ' " , array_values ( $msg )) . " ') " );
// send email notification if requested.
2010-08-14 16:55:18 +02:00
2010-08-10 07:58:58 +02:00
require_once ( 'bbcode.php' );
2010-08-14 16:55:18 +02:00
if ( $importer [ 'notify-flags' ] & NOTIFY_MAIL ) {
2010-08-10 07:58:58 +02:00
$tpl = file_get_contents ( 'view/mail_received_eml.tpl' );
$email_tpl = replace_macros ( $tpl , array (
'$sitename' => $a -> config [ 'sitename' ],
'$siteurl' => $a -> get_baseurl (),
2010-08-14 16:55:18 +02:00
'$username' => $importer [ 'username' ],
'$email' => $importer [ 'email' ],
2010-08-10 07:58:58 +02:00
'$from' => $msg [ 'from-name' ],
'$title' => $msg [ 'title' ],
'$body' => strip_tags ( bbcode ( $msg [ 'body' ]))
2010-08-10 14:58:22 +02:00
));
2010-08-11 07:14:17 +02:00
2010-08-14 16:55:18 +02:00
$res = mail ( $importer [ 'email' ], t ( " New mail received at " ) . $a -> config [ 'sitename' ],
2010-08-11 07:14:17 +02:00
$email_tpl , t ( " From: Administrator@ " ) . $a -> get_hostname () );
2010-08-10 07:58:58 +02:00
}
2010-07-30 15:09:20 +02:00
xml_status ( 0 );
2010-08-11 07:14:17 +02:00
return ; // NOTREACHED
2010-07-30 15:09:20 +02:00
}
2010-07-16 10:26:42 +02:00
foreach ( $feed -> get_items () as $item ) {
2010-07-26 12:33:56 +02:00
$deleted = false ;
2010-07-16 10:26:42 +02:00
$rawdelete = $item -> get_item_tags ( " http://purl.org/atompub/tombstones/1.0 " , 'deleted-entry' );
2010-07-26 12:33:56 +02:00
if ( isset ( $rawdelete [ 0 ][ 'attribs' ][ '' ][ 'ref' ])) {
$uri = $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ];
$deleted = true ;
if ( isset ( $rawdelete [ 0 ][ 'attribs' ][ '' ][ 'when' ])) {
$when = $rawthread [ 0 ][ 'attribs' ][ '' ][ 'when' ];
$when = datetime_convert ( 'UTC' , 'UTC' , $when , 'Y-m-d H:i:s' );
}
else
$when = datetime_convert ( 'UTC' , 'UTC' , 'now' , 'Y-m-d H:i:s' );
}
2010-07-16 10:26:42 +02:00
if ( $deleted ) {
2010-07-26 12:33:56 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $uri ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-26 12:33:56 +02:00
);
if ( count ( $r )) {
if ( $r [ 0 ][ 'uri' ] == $r [ 0 ][ 'parent-uri' ]) {
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s'
2010-07-28 07:32:21 +02:00
WHERE `parent-uri` = '%s' " ,
2010-07-26 12:33:56 +02:00
dbesc ( $when ),
dbesc ( $r [ 0 ][ 'uri' ])
);
}
else {
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s'
WHERE `uri` = '%s' AND `uid` = % d LIMIT 1 " ,
dbesc ( $when ),
dbesc ( $uri ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-26 12:33:56 +02:00
);
}
}
2010-07-16 10:26:42 +02:00
continue ;
}
$is_reply = false ;
$item_id = $item -> get_id ();
$rawthread = $item -> get_item_tags ( " http://purl.org/syndication/thread/1.0 " , 'in-reply-to' );
if ( isset ( $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ])) {
$is_reply = true ;
2010-07-19 08:23:18 +02:00
$parent_uri = $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ];
2010-07-16 10:26:42 +02:00
}
if ( $is_reply ) {
2010-07-17 16:03:06 +02:00
if ( $feed -> get_item_quantity () == 1 ) {
2010-07-16 10:26:42 +02:00
// remote reply to our post. Import and then notify everybody else.
2010-07-17 16:03:06 +02:00
$datarray = get_atom_elements ( $item );
2010-07-18 04:26:00 +02:00
$datarray [ 'type' ] = 'remote-comment' ;
2010-07-19 08:23:18 +02:00
$datarray [ 'parent-uri' ] = $parent_uri ;
2010-08-14 16:55:18 +02:00
$datarray [ 'uid' ] = $importer [ 'importer_uid' ];
2010-07-17 16:03:06 +02:00
$datarray [ 'contact-id' ] = $importer [ 'id' ];
2010-07-18 04:26:00 +02:00
$posted_id = post_remote ( $a , $datarray );
$r = q ( " SELECT `parent` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $posted_id ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-18 04:26:00 +02:00
);
if ( count ( $r )) {
$r1 = q ( " UPDATE `item` SET `last-child` = 0 WHERE `uid` = %d AND `parent` = %d " ,
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ]),
2010-07-18 04:26:00 +02:00
intval ( $r [ 0 ][ 'parent' ])
);
}
$r2 = q ( " UPDATE `item` SET `last-child` = 1 WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ]),
2010-07-18 04:26:00 +02:00
intval ( $posted_id )
);
2010-07-17 16:03:06 +02:00
2010-07-19 08:23:18 +02:00
$url = $a -> get_baseurl ();
2010-07-17 16:03:06 +02:00
2010-08-14 16:55:18 +02:00
proc_close ( proc_open ( " php include/notifier.php $url comment-import $posted_id > remote-notify.log & " ,
array (), $foo ));
if (( $importer [ 'notify-flags' ] & NOTIFY_COMMENT ) && ( ! $importer [ 'self' ])) {
require_once ( 'bbcode.php' );
$from = stripslashes ( $datarray [ 'author-name' ]);
$tpl = file_get_contents ( 'view/cmnt_received_eml.tpl' );
$email_tpl = replace_macros ( $tpl , array (
'$sitename' => $a -> config [ 'sitename' ],
'$siteurl' => $a -> get_baseurl (),
'$username' => $importer [ 'username' ],
'$email' => $importer [ 'email' ],
'$from' => $from ,
'$body' => strip_tags ( bbcode ( stripslashes ( $datarray [ 'body' ])))
));
$res = mail ( $importer [ 'email' ], $from . t ( " commented on your item at " ) . $a -> config [ 'sitename' ],
$email_tpl , t ( " From: Administrator@ " ) . $a -> get_hostname () );
}
2010-07-18 04:26:00 +02:00
xml_status ( 0 );
2010-07-17 16:03:06 +02:00
return ;
2010-07-16 10:26:42 +02:00
}
else {
// regular comment that is part of this total conversation. Have we seen it? If not, import it.
$item_id = $item -> get_id ();
2010-07-19 08:23:18 +02:00
$r = q ( " SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
dbesc ( $item_id ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-16 10:26:42 +02:00
);
2010-07-18 04:26:00 +02:00
// FIXME update content if 'updated' changes
2010-07-16 10:26:42 +02:00
if ( count ( $r )) {
2010-08-14 16:55:18 +02:00
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
2010-07-16 10:26:42 +02:00
if ( $allow && $allow [ 0 ][ 'data' ] != $r [ 0 ][ 'last-child' ]) {
2010-07-19 08:23:18 +02:00
$r = q ( " UPDATE `item` SET `last-child` = %d WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
intval ( $allow [ 0 ][ 'data' ]),
2010-07-18 04:26:00 +02:00
dbesc ( $item_id ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-16 10:26:42 +02:00
);
}
continue ;
}
$datarray = get_atom_elements ( $item );
2010-07-19 08:23:18 +02:00
$datarray [ 'parent-uri' ] = $parent_uri ;
2010-08-14 16:55:18 +02:00
$datarray [ 'uid' ] = $importer [ 'importer_uid' ];
2010-07-16 10:26:42 +02:00
$datarray [ 'contact-id' ] = $importer [ 'id' ];
2010-07-17 16:03:06 +02:00
$r = post_remote ( $a , $datarray );
2010-08-14 16:55:18 +02:00
// find out if our user is involved in this conversation and wants to be notified.
if ( $importer [ 'notify-flags' ] & NOTIFY_COMMENT ) {
$myconv = q ( " SELECT `author-link` FROM `item` WHERE `parent-uri` = '%s' " ,
dbesc ( $parent_uri )
);
if ( count ( $myconv )) {
foreach ( $myconv as $conv ) {
if ( $conv [ 'author-link' ] != $importer [ 'url' ])
continue ;
require_once ( 'bbcode.php' );
$from = stripslashes ( $datarray [ 'author-name' ]);
$tpl = file_get_contents ( 'view/cmnt_received_eml.tpl' );
$email_tpl = replace_macros ( $tpl , array (
'$sitename' => $a -> config [ 'sitename' ],
'$siteurl' => $a -> get_baseurl (),
'$username' => $importer [ 'username' ],
'$email' => $importer [ 'email' ],
'$from' => $from ,
'$body' => strip_tags ( bbcode ( stripslashes ( $datarray [ 'body' ])))
));
$res = mail ( $importer [ 'email' ], $from . t ( " commented on an item at " )
. $a -> config [ 'sitename' ],
$email_tpl , t ( " From: Administrator@ " ) . $a -> get_hostname () );
break ;
}
}
}
2010-07-16 10:26:42 +02:00
continue ;
}
}
else {
// Head post of a conversation. Have we seen it? If not, import it.
$item_id = $item -> get_id ();
2010-07-19 08:23:18 +02:00
$r = q ( " SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
dbesc ( $item_id ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-16 10:26:42 +02:00
);
if ( count ( $r )) {
2010-08-14 16:55:18 +02:00
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
2010-07-16 10:26:42 +02:00
if ( $allow && $allow [ 0 ][ 'data' ] != $r [ 0 ][ 'last-child' ]) {
2010-07-19 08:23:18 +02:00
$r = q ( " UPDATE `item` SET `last-child` = %d WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
intval ( $allow [ 0 ][ 'data' ]),
2010-07-18 04:26:00 +02:00
dbesc ( $item_id ),
2010-08-14 16:55:18 +02:00
intval ( $importer [ 'importer_uid' ])
2010-07-16 10:26:42 +02:00
);
}
continue ;
}
$datarray = get_atom_elements ( $item );
2010-07-19 15:58:03 +02:00
$datarray [ 'parent-uri' ] = $item_id ;
2010-08-14 16:55:18 +02:00
$datarray [ 'uid' ] = $importer [ 'importer_uid' ];
2010-07-16 10:26:42 +02:00
$datarray [ 'contact-id' ] = $importer [ 'id' ];
2010-07-17 16:03:06 +02:00
$r = post_remote ( $a , $datarray );
2010-07-16 10:26:42 +02:00
continue ;
}
2010-07-15 08:04:10 +02:00
}
2010-07-05 05:45:56 +02:00
2010-07-18 04:26:00 +02:00
xml_status ( 0 );
2010-07-15 08:04:10 +02:00
killme ();
2010-07-05 05:45:56 +02:00
}
function dfrn_notify_content ( & $a ) {
if ( x ( $_GET , 'dfrn_id' )) {
// initial communication from external contact
$hash = random_string ();
$status = 0 ;
$r = q ( " DELETE FROM `challenge` WHERE `expire` < " . intval ( time ()));
$r = q ( " INSERT INTO `challenge` ( `challenge`, `dfrn-id`, `expire` )
VALUES ( '%s' , '%s' , '%s' ) " ,
dbesc ( $hash ),
dbesc ( notags ( trim ( $_GET [ 'dfrn_id' ]))),
intval ( time () + 60 )
);
2010-07-19 15:58:03 +02:00
$r = q ( " SELECT * FROM `contact` WHERE `issued-id` = '%s' AND `blocked` = 0 AND `pending` = 0 LIMIT 1 " ,
2010-07-05 05:45:56 +02:00
dbesc ( $_GET [ 'dfrn_id' ]));
if (( ! count ( $r )) || ( ! strlen ( $r [ 0 ][ 'prvkey' ])))
$status = 1 ;
$challenge = '' ;
openssl_private_encrypt ( $hash , $challenge , $r [ 0 ][ 'prvkey' ]);
2010-07-08 16:03:25 +02:00
$challenge = bin2hex ( $challenge );
2010-08-05 11:57:03 +02:00
$encrypted_id = '' ;
$id_str = $_GET [ 'dfrn_id' ] . '.' . mt_rand ( 1000 , 9999 );
openssl_private_encrypt ( $id_str , $encrypted_id , $r [ 0 ][ 'prvkey' ]);
$encrypted_id = bin2hex ( $encrypted_id );
2010-08-14 16:55:18 +02:00
echo '<?xml version="1.0" encoding="UTF-8"?><dfrn_notify><status>' . $status . '</status><dfrn_id>' . $encrypted_id . '</dfrn_id>' . '<challenge>' . $challenge . '</challenge></dfrn_notify>' . " \r \n " ;
2010-07-05 05:45:56 +02:00
session_write_close ();
exit ;
}
}