2010-07-05 05:45:56 +02:00
< ? php
2011-06-29 06:11:52 +02:00
require_once ( 'library/simplepie/simplepie.inc' );
2010-07-19 05:49:10 +02:00
require_once ( 'include/items.php' );
2011-06-14 04:06:49 +02:00
require_once ( 'include/event.php' );
2010-07-16 10:26:42 +02:00
function dfrn_notify_post ( & $a ) {
2010-07-31 06:22:52 +02:00
2010-12-01 03:32:34 +01:00
$dfrn_id = (( x ( $_POST , 'dfrn_id' )) ? notags ( trim ( $_POST [ 'dfrn_id' ])) : '' );
$dfrn_version = (( x ( $_POST , 'dfrn_version' )) ? ( float ) $_POST [ 'dfrn_version' ] : 2.0 );
$challenge = (( x ( $_POST , 'challenge' )) ? notags ( trim ( $_POST [ 'challenge' ])) : '' );
$data = (( x ( $_POST , 'data' )) ? $_POST [ 'data' ] : '' );
$key = (( x ( $_POST , 'key' )) ? $_POST [ 'key' ] : '' );
2011-01-25 12:57:10 +01:00
$dissolve = (( x ( $_POST , 'dissolve' )) ? intval ( $_POST [ 'dissolve' ]) : 0 );
2011-04-11 03:38:55 +02:00
$perm = (( x ( $_POST , 'perm' )) ? notags ( trim ( $_POST [ 'perm' ])) : 'r' );
$writable = ( - 1 );
if ( $dfrn_version >= 2.21 ) {
$writable = (( $perm === 'rw' ) ? 1 : 0 );
}
2010-09-13 06:25:37 +02:00
$direction = ( - 1 );
if ( strpos ( $dfrn_id , ':' ) == 1 ) {
$direction = intval ( substr ( $dfrn_id , 0 , 1 ));
$dfrn_id = substr ( $dfrn_id , 2 );
}
2010-07-05 05:45:56 +02:00
$r = q ( " SELECT * FROM `challenge` WHERE `dfrn-id` = '%s' AND `challenge` = '%s' LIMIT 1 " ,
dbesc ( $dfrn_id ),
dbesc ( $challenge )
);
2010-11-24 00:55:11 +01:00
if ( ! count ( $r )) {
2011-02-04 02:40:04 +01:00
logger ( 'dfrn_notify: could not match challenge to dfrn_id ' . $dfrn_id . ' challenge=' . $challenge );
2010-07-05 05:45:56 +02:00
xml_status ( 3 );
2010-11-24 00:55:11 +01:00
}
2010-07-05 05:45:56 +02:00
$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-09-13 06:25:37 +02:00
$sql_extra = '' ;
switch ( $direction ) {
case ( - 1 ) :
2010-10-19 01:38:48 +02:00
$sql_extra = sprintf ( " AND ( `issued-id` = '%s' OR `dfrn-id` = '%s' ) " , dbesc ( $dfrn_id ), dbesc ( $dfrn_id ));
2010-09-13 06:25:37 +02:00
break ;
case 0 :
$sql_extra = sprintf ( " AND `issued-id` = '%s' AND `duplex` = 1 " , dbesc ( $dfrn_id ));
break ;
case 1 :
$sql_extra = sprintf ( " AND `dfrn-id` = '%s' AND `duplex` = 1 " , dbesc ( $dfrn_id ));
break ;
default :
xml_status ( 3 );
break ; // NOTREACHED
}
2011-08-21 03:27:12 +02:00
// be careful - $importer will contain both the contact information for the contact
// sending us the post, and also the user information for the person receiving it.
// since they are mixed together, it is easy to get them confused.
2010-09-13 06:25:37 +02:00
2011-02-13 23:55:48 +01:00
$r = q ( " SELECT `contact`.*, `contact`.`uid` AS `importer_uid`,
`contact` . `pubkey` AS `cpubkey` ,
`contact` . `prvkey` AS `cprvkey` ,
`contact` . `thumb` AS `thumb` ,
`contact` . `url` as `url` ,
`contact` . `name` as `senderName` ,
`user` .*
FROM `contact`
LEFT JOIN `user` ON `contact` . `uid` = `user` . `uid`
WHERE `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2011-09-19 10:17:12 +02:00
AND `user` . `nickname` = '%s' AND `user` . `account_expired` = 0 $sql_extra LIMIT 1 " ,
2010-10-19 01:38:48 +02:00
dbesc ( $a -> argv [ 1 ])
2010-07-16 10:26:42 +02:00
);
2010-08-17 07:05:04 +02:00
2010-07-28 07:32:21 +02:00
if ( ! count ( $r )) {
2010-11-24 00:55:11 +01:00
logger ( 'dfrn_notify: contact not found for dfrn_id ' . $dfrn_id );
2010-07-16 10:26:42 +02:00
xml_status ( 3 );
2010-10-04 13:22:34 +02:00
//NOTREACHED
2010-07-28 07:32:21 +02:00
}
2010-07-16 10:26:42 +02:00
2011-01-25 12:57:10 +01:00
// $importer in this case contains the contact record for the remote contact joined with the user record of our user.
2010-07-16 10:26:42 +02:00
$importer = $r [ 0 ];
2011-04-11 04:29:21 +02:00
if (( $writable != ( - 1 )) && ( $writable != $importer [ 'writable' ])) {
q ( " UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1 " ,
intval ( $writable ),
intval ( $importer [ 'id' ])
);
$importer [ 'writable' ] = $writable ;
}
2010-11-24 00:55:11 +01:00
logger ( 'dfrn_notify: received notify from ' . $importer [ 'name' ] . ' for ' . $importer [ 'username' ]);
logger ( 'dfrn_notify: data: ' . $data , LOGGER_DATA );
2010-10-04 13:22:34 +02:00
2011-01-26 11:32:00 +01:00
if ( $dissolve == 1 ) {
/**
* Relationship is dissolved permanently
*/
require_once ( 'include/Contact.php' );
contact_remove ( $importer [ 'id' ]);
logger ( 'relationship dissolved : ' . $importer [ 'name' ] . ' dissolved ' . $importer [ 'username' ]);
xml_status ( 0 );
}
2010-12-01 03:32:34 +01:00
if ( strlen ( $key )) {
$rawkey = hex2bin ( trim ( $key ));
logger ( 'rino: md5 raw key: ' . md5 ( $rawkey ));
$final_key = '' ;
2011-02-02 07:45:46 +01:00
if ( $dfrn_version >= 2.1 ) {
2011-02-02 06:21:47 +01:00
if ((( $importer [ 'duplex' ]) && strlen ( $importer [ 'cprvkey' ])) || ( ! strlen ( $importer [ 'cpubkey' ]))) {
openssl_private_decrypt ( $rawkey , $final_key , $importer [ 'cprvkey' ]);
}
else {
openssl_public_decrypt ( $rawkey , $final_key , $importer [ 'cpubkey' ]);
}
2010-12-01 03:32:34 +01:00
}
else {
2011-02-02 06:21:47 +01:00
if ((( $importer [ 'duplex' ]) && strlen ( $importer [ 'cpubkey' ])) || ( ! strlen ( $importer [ 'cprvkey' ]))) {
openssl_public_decrypt ( $rawkey , $final_key , $importer [ 'cpubkey' ]);
}
else {
openssl_private_decrypt ( $rawkey , $final_key , $importer [ 'cprvkey' ]);
}
2010-12-01 03:32:34 +01:00
}
logger ( 'rino: received key : ' . $final_key );
$data = aes_decrypt ( hex2bin ( $data ), $final_key );
logger ( 'rino: decrypted data: ' . $data , LOGGER_DATA );
}
2011-01-25 12:57:10 +01:00
if ( $importer [ 'readonly' ]) {
// We aren't receiving stuff from this person. But we will quietly ignore them
// rather than a blatant "go away" message.
logger ( 'dfrn_notify: ignoring' );
xml_status ( 0 );
//NOTREACHED
}
2010-10-04 13:22:34 +02:00
// Consume notification feed. This may differ from consuming a public feed in several ways
2011-06-23 04:08:30 +02:00
// - might contain email or friend suggestions
2010-10-04 13:22:34 +02:00
// - might contain remote followup to our message
// - in which case we need to accept it and then notify other conversants
// - we may need to send various email notifications
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
2011-07-06 04:19:11 +02:00
$reloc = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'relocate' );
if ( isset ( $reloc [ 0 ][ 'child' ][ NAMESPACE_DFRN ])) {
$base = $reloc [ 0 ][ 'child' ][ NAMESPACE_DFRN ];
$newloc = array ();
$newloc [ 'uid' ] = $importer [ 'importer_uid' ];
$newloc [ 'cid' ] = $importer [ 'id' ];
$newloc [ 'name' ] = notags ( unxmlify ( $base [ 'name' ][ 0 ][ 'data' ]));
$newloc [ 'photo' ] = notags ( unxmlify ( $base [ 'photo' ][ 0 ][ 'data' ]));
$newloc [ 'url' ] = notags ( unxmlify ( $base [ 'url' ][ 0 ][ 'data' ]));
$newloc [ 'request' ] = notags ( unxmlify ( $base [ 'request' ][ 0 ][ 'data' ]));
$newloc [ 'confirm' ] = notags ( unxmlify ( $base [ 'confirm' ][ 0 ][ 'data' ]));
$newloc [ 'notify' ] = notags ( unxmlify ( $base [ 'notify' ][ 0 ][ 'data' ]));
$newloc [ 'poll' ] = notags ( unxmlify ( $base [ 'poll' ][ 0 ][ 'data' ]));
$newloc [ 'site-pubkey' ] = notags ( unxmlify ( $base [ 'site-pubkey' ][ 0 ][ 'data' ]));
$newloc [ 'pubkey' ] = notags ( unxmlify ( $base [ 'pubkey' ][ 0 ][ 'data' ]));
$newloc [ 'prvkey' ] = notags ( unxmlify ( $base [ 'prvkey' ][ 0 ][ 'data' ]));
// TODO
// merge with current record, current contents have priority
// update record, set url-updated
// update profile photos
// schedule a scan?
}
2011-06-23 04:08:30 +02:00
// handle friend suggestion notification
$sugg = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'suggest' );
if ( isset ( $sugg [ 0 ][ 'child' ][ NAMESPACE_DFRN ])) {
$base = $sugg [ 0 ][ 'child' ][ NAMESPACE_DFRN ];
$fsugg = array ();
$fsugg [ 'uid' ] = $importer [ 'importer_uid' ];
$fsugg [ 'cid' ] = $importer [ 'id' ];
$fsugg [ 'name' ] = notags ( unxmlify ( $base [ 'name' ][ 0 ][ 'data' ]));
$fsugg [ 'photo' ] = notags ( unxmlify ( $base [ 'photo' ][ 0 ][ 'data' ]));
$fsugg [ 'url' ] = notags ( unxmlify ( $base [ 'url' ][ 0 ][ 'data' ]));
2011-06-27 04:30:57 +02:00
$fsugg [ 'request' ] = notags ( unxmlify ( $base [ 'request' ][ 0 ][ 'data' ]));
2011-06-23 04:08:30 +02:00
$fsugg [ 'body' ] = escape_tags ( unxmlify ( $base [ 'note' ][ 0 ][ 'data' ]));
// Does our member already have a friend matching this description?
$r = q ( " SELECT * FROM `contact` WHERE `name` = '%s' AND `url` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $fsugg [ 'name' ]),
2011-06-26 04:10:38 +02:00
dbesc ( $fsugg [ 'url' ]),
2011-06-23 04:08:30 +02:00
intval ( $fsugg [ 'uid' ])
);
if ( count ( $r ))
xml_status ( 0 );
// Do we already have an fcontact record for this person?
$fid = 0 ;
2011-06-27 04:30:57 +02:00
$r = q ( " SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1 " ,
2011-06-23 04:08:30 +02:00
dbesc ( $fsugg [ 'url' ]),
2011-06-26 04:10:38 +02:00
dbesc ( $fsugg [ 'name' ]),
2011-06-27 04:30:57 +02:00
dbesc ( $fsugg [ 'request' ])
2011-06-23 04:08:30 +02:00
);
if ( count ( $r )) {
$fid = $r [ 0 ][ 'id' ];
}
if ( ! $fid )
2011-06-27 04:30:57 +02:00
$r = q ( " INSERT INTO `fcontact` ( `name`,`url`,`photo`,`request` ) VALUES ( '%s', '%s', '%s', '%s' ) " ,
2011-06-26 04:10:38 +02:00
dbesc ( $fsugg [ 'name' ]),
2011-06-23 04:08:30 +02:00
dbesc ( $fsugg [ 'url' ]),
2011-06-27 04:30:57 +02:00
dbesc ( $fsugg [ 'photo' ]),
dbesc ( $fsugg [ 'request' ])
2011-06-23 04:08:30 +02:00
);
2011-06-27 04:30:57 +02:00
$r = q ( " SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1 " ,
2011-06-23 04:08:30 +02:00
dbesc ( $fsugg [ 'url' ]),
2011-06-26 04:10:38 +02:00
dbesc ( $fsugg [ 'name' ]),
2011-06-27 04:30:57 +02:00
dbesc ( $fsugg [ 'request' ])
2011-06-23 04:08:30 +02:00
);
if ( count ( $r )) {
$fid = $r [ 0 ][ 'id' ];
}
// database record did not get created. Quietly give up.
else
xml_status ( 0 );
$hash = random_string ();
$r = q ( " INSERT INTO `intro` ( `uid`, `fid`, `contact-id`, `note`, `hash`, `datetime`, `blocked` )
VALUES ( % d , % d , % d , '%s' , '%s' , '%s' , % d ) " ,
intval ( $fsugg [ 'uid' ]),
intval ( $fid ),
intval ( $fsugg [ 'cid' ]),
dbesc ( $fsugg [ 'body' ]),
dbesc ( $hash ),
dbesc ( datetime_convert ()),
intval ( 0 )
);
// TODO - send email notify (which may require a new notification preference)
xml_status ( 0 );
}
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 ])) {
2010-08-17 07:05:04 +02:00
2010-11-24 00:55:11 +01:00
logger ( 'dfrn_notify: private message received' );
2010-07-30 15:09:20 +02:00
$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 [ '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-23 05:57:20 +02:00
2010-08-13 14:59:59 +02:00
dbesc_array ( $msg );
2010-08-11 07:14:17 +02:00
2010-11-10 00:11:47 +01:00
$r = dbq ( " INSERT INTO `mail` (` " . implode ( " `, ` " , array_keys ( $msg ))
2010-07-30 15:09:20 +02:00
. " `) 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-10-29 01:05:09 +02:00
2011-05-24 05:30:37 +02:00
push_lang ( $importer [ 'language' ]);
2011-02-15 12:31:20 +01:00
// name of the automated email sender
2011-02-14 12:59:54 +01:00
$msg [ 'notificationfromname' ] = t ( 'Administrator' );
2011-02-15 12:31:20 +01:00
// noreply address to send from
2011-02-14 12:59:54 +01:00
$msg [ 'notificationfromemail' ] = t ( 'noreply' ) . '@' . $a -> get_hostname ();
2011-02-15 12:31:20 +01:00
// text version
// process the message body to display properly in text mode
// 1) substitute a \n character for the "\" then "n", so it behaves properly (it doesn't come in as a \n character)
// 2) remove escape slashes
// 3) decode any bbcode from the message editor
// 4) decode any encoded html tags
// 5) remove html tags
2011-02-14 12:59:54 +01:00
$msg [ 'textversion' ]
2011-02-14 14:44:27 +01:00
= strip_tags ( html_entity_decode ( bbcode ( stripslashes ( str_replace ( array ( " \\ r \\ n " , " \\ r " , " \\ n " ), " \n " , $msg [ 'body' ]))), ENT_QUOTES , 'UTF-8' ));
2011-02-15 12:31:20 +01:00
// html version
// process the message body to display properly in text mode
// 1) substitute a <br /> tag for the "\" then "n", so it behaves properly (it doesn't come in as a \n character)
// 2) remove escape slashes
// 3) decode any bbcode from the message editor
// 4) decode any encoded html tags
2011-02-14 12:59:54 +01:00
$msg [ 'htmlversion' ]
2011-02-15 12:31:20 +01:00
= html_entity_decode ( bbcode ( stripslashes ( str_replace ( array ( " \\ r \\ n " , " \\ r " , " \\ n \\ n " , " \\ n " ), " <br /> \n " , $msg [ 'body' ]))));
2011-02-19 14:35:01 +01:00
2011-02-15 12:31:20 +01:00
// load the template for private message notifications
2011-05-11 13:37:13 +02:00
$tpl = get_intltext_template ( 'mail_received_html_body_eml.tpl' );
2011-02-16 17:05:10 +01:00
$email_html_body_tpl = replace_macros ( $tpl , array (
2011-06-15 05:49:25 +02:00
'$username' => $importer [ 'username' ],
2011-05-22 08:19:50 +02:00
'$siteName' => $a -> config [ 'sitename' ], // name of this site
'$siteurl' => $a -> get_baseurl (), // descriptive url of this site
'$thumb' => $importer [ 'thumb' ], // thumbnail url for sender icon
'$email' => $importer [ 'email' ], // email address to send to
'$url' => $importer [ 'url' ], // full url for the site
'$from' => $msg [ 'from-name' ], // name of the person sending the message
2011-02-16 17:05:10 +01:00
'$title' => stripslashes ( $msg [ 'title' ]), // subject of the message
'$htmlversion' => $msg [ 'htmlversion' ], // html version of the message
'$mimeboundary' => $msg [ 'mimeboundary' ], // mime message divider
2011-05-22 08:19:50 +02:00
'$hostname' => $a -> get_hostname () // name of this host
2011-02-16 17:05:10 +01:00
));
2011-02-15 12:31:20 +01:00
2011-02-16 17:05:10 +01:00
// load the template for private message notifications
2011-05-11 13:37:13 +02:00
$tpl = get_intltext_template ( 'mail_received_text_body_eml.tpl' );
2011-02-16 17:05:10 +01:00
$email_text_body_tpl = replace_macros ( $tpl , array (
2011-06-15 05:49:25 +02:00
'$username' => $importer [ 'username' ],
2011-05-22 08:19:50 +02:00
'$siteName' => $a -> config [ 'sitename' ], // name of this site
'$siteurl' => $a -> get_baseurl (), // descriptive url of this site
'$thumb' => $importer [ 'thumb' ], // thumbnail url for sender icon
'$email' => $importer [ 'email' ], // email address to send to
'$url' => $importer [ 'url' ], // full url for the site
'$from' => $msg [ 'from-name' ], // name of the person sending the message
2011-02-15 12:31:20 +01:00
'$title' => stripslashes ( $msg [ 'title' ]), // subject of the message
'$textversion' => $msg [ 'textversion' ], // text version of the message
'$mimeboundary' => $msg [ 'mimeboundary' ], // mime message divider
2011-05-22 08:19:50 +02:00
'$hostname' => $a -> get_hostname () // name of this host
2010-08-10 14:58:22 +02:00
));
2011-02-17 22:41:56 +01:00
2011-02-19 14:35:01 +01:00
// use the EmailNotification library to send the message
require_once ( " include/EmailNotification.php " );
EmailNotification :: sendTextHtmlEmail (
$msg [ 'notificationfromname' ],
$msg [ 'notificationfromemail' ],
$msg [ 'notificationfromemail' ],
$importer [ 'email' ],
t ( 'New mail received at ' ) . $a -> config [ 'sitename' ],
$email_html_body_tpl ,
$email_text_body_tpl
2010-10-29 01:05:09 +02:00
);
2011-05-24 05:30:37 +02:00
pop_lang ();
2010-08-10 07:58:58 +02:00
}
2010-07-30 15:09:20 +02:00
xml_status ( 0 );
2010-10-04 13:22:34 +02:00
// NOTREACHED
2010-07-30 15:09:20 +02:00
}
2010-11-26 00:03:59 +01:00
logger ( 'dfrn_notify: feed item count = ' . $feed -> get_item_quantity ());
2010-07-30 15:09:20 +02:00
2011-02-08 13:25:27 +01:00
// process any deleted entries
$del_entries = $feed -> get_feed_tags ( NAMESPACE_TOMB , 'deleted-entry' );
if ( is_array ( $del_entries ) && count ( $del_entries )) {
foreach ( $del_entries as $dentry ) {
$deleted = false ;
if ( isset ( $dentry [ 'attribs' ][ '' ][ 'ref' ])) {
$uri = $dentry [ 'attribs' ][ '' ][ 'ref' ];
$deleted = true ;
if ( isset ( $dentry [ 'attribs' ][ '' ][ 'when' ])) {
$when = $dentry [ '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' );
}
if ( $deleted ) {
2011-03-31 02:50:18 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `contact-id` = %d LIMIT 1 " ,
2011-02-08 13:25:27 +01:00
dbesc ( $uri ),
2011-03-31 02:50:18 +02:00
intval ( $importer [ 'importer_uid' ]),
intval ( $importer [ 'id' ])
2011-02-08 13:25:27 +01:00
);
2011-03-31 02:50:18 +02:00
2011-02-08 13:25:27 +01:00
if ( count ( $r )) {
$item = $r [ 0 ];
2010-07-16 10:26:42 +02:00
2011-02-08 13:25:27 +01:00
if ( ! $item [ 'deleted' ])
logger ( 'dfrn_notify: deleting item ' . $item [ 'id' ] . ' uri=' . $item [ 'uri' ], LOGGER_DEBUG );
2010-07-26 12:33:56 +02:00
2011-02-08 13:25:27 +01:00
if ( $item [ 'uri' ] == $item [ 'parent-uri' ]) {
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s'
WHERE `parent-uri` = '%s' AND `uid` = % d " ,
dbesc ( $when ),
2010-08-30 06:55:57 +02:00
dbesc ( datetime_convert ()),
2011-02-08 13:25:27 +01:00
dbesc ( $item [ 'uri' ]),
intval ( $importer [ 'importer_uid' ])
2010-08-30 06:55:57 +02:00
);
2011-02-08 13:25:27 +01:00
}
else {
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s'
WHERE `uri` = '%s' AND `uid` = % d LIMIT 1 " ,
dbesc ( $when ),
dbesc ( datetime_convert ()),
dbesc ( $uri ),
intval ( $importer [ 'importer_uid' ])
2010-08-30 06:55:57 +02:00
);
2011-02-08 13:25:27 +01:00
if ( $item [ 'last-child' ]) {
// ensure that last-child is set in case the comment that had it just got wiped.
2011-02-08 14:08:10 +01:00
q ( " UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d " ,
2011-02-08 13:25:27 +01:00
dbesc ( datetime_convert ()),
dbesc ( $item [ 'parent-uri' ]),
intval ( $item [ 'uid' ])
2010-08-30 06:55:57 +02:00
);
2011-02-08 13:25:27 +01:00
// who is the last child now?
$r = q ( " SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d
ORDER BY `created` DESC LIMIT 1 " ,
dbesc ( $item [ 'parent-uri' ]),
intval ( $importer [ 'importer_uid' ])
);
if ( count ( $r )) {
q ( " UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1 " ,
intval ( $r [ 0 ][ 'id' ])
);
}
}
}
2010-07-26 12:33:56 +02:00
}
2011-02-08 13:25:27 +01:00
}
2010-07-16 10:26:42 +02:00
}
2011-02-08 13:25:27 +01:00
}
foreach ( $feed -> get_items () as $item ) {
2010-07-16 10:26:42 +02:00
$is_reply = false ;
$item_id = $item -> get_id ();
2010-09-10 01:48:33 +02:00
$rawthread = $item -> get_item_tags ( NAMESPACE_THREAD , 'in-reply-to' );
2010-07-16 10:26:42 +02:00
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 ) {
2011-10-05 06:43:21 +02:00
// was the top-level post for this reply written by somebody on this site? Specifically, the recipient?
2011-10-05 22:11:45 +02:00
$r = q ( " select `item`.`id` from `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` where `contact`.`self` = 1 AND `item`.`uri` = '%s' AND `item`.`uid` = %d LIMIT 1 " ,
2011-10-05 06:43:21 +02:00
dbesc ( $parent_uri ),
intval ( $importer [ 'importer_uid' ])
2011-10-05 06:45:15 +02:00
);
2011-10-05 06:43:21 +02:00
if ( $r && count ( $r )) {
2010-11-26 00:03:59 +01:00
logger ( 'dfrn_notify: received remote comment' );
2010-12-03 21:27:54 +01:00
$is_like = false ;
2010-07-16 10:26:42 +02:00
// remote reply to our post. Import and then notify everybody else.
2010-10-25 05:39:24 +02:00
$datarray = get_atom_elements ( $feed , $item );
2010-07-18 04:26:00 +02:00
$datarray [ 'type' ] = 'remote-comment' ;
2010-09-10 04:14:42 +02:00
$datarray [ 'wall' ] = 1 ;
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-09-17 12:10:19 +02:00
if (( $datarray [ 'verb' ] == ACTIVITY_LIKE ) || ( $datarray [ 'verb' ] == ACTIVITY_DISLIKE )) {
2010-12-03 21:27:54 +01:00
$is_like = true ;
2010-09-17 12:10:19 +02:00
$datarray [ 'type' ] = 'activity' ;
$datarray [ 'gravity' ] = GRAVITY_LIKE ;
2010-12-03 21:27:54 +01:00
$datarray [ 'last-child' ] = 0 ;
2010-09-17 12:10:19 +02:00
}
2010-09-14 07:57:31 +02:00
$posted_id = item_store ( $datarray );
2011-02-04 13:25:53 +01:00
$parent = 0 ;
2010-07-18 04:26:00 +02:00
2010-12-03 21:37:57 +01:00
if ( $posted_id ) {
2011-02-04 13:25:53 +01:00
$r = q ( " SELECT `parent` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $posted_id ),
intval ( $importer [ 'importer_uid' ])
);
if ( count ( $r ))
$parent = $r [ 0 ][ 'parent' ];
2011-02-08 13:25:27 +01:00
2010-12-03 21:37:57 +01:00
if ( ! $is_like ) {
2011-02-04 13:25:53 +01:00
$r1 = q ( " UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `uid` = %d AND `parent` = %d " ,
dbesc ( datetime_convert ()),
intval ( $importer [ 'importer_uid' ]),
intval ( $r [ 0 ][ 'parent' ])
2010-12-03 21:37:57 +01:00
);
2011-02-04 13:25:53 +01:00
2010-12-03 21:37:57 +01:00
$r2 = q ( " UPDATE `item` SET `last-child` = 1, `changed` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
2011-02-04 13:25:53 +01:00
dbesc ( datetime_convert ()),
intval ( $importer [ 'importer_uid' ]),
intval ( $posted_id )
2010-09-09 05:14:17 +02:00
);
}
2010-07-17 16:03:06 +02:00
2011-02-04 13:25:53 +01:00
if ( $posted_id && $parent ) {
2011-02-24 00:16:12 +01:00
proc_run ( 'php' , " include/notifier.php " , " comment-import " , " $posted_id " );
2011-01-24 22:00:02 +01:00
2011-02-04 13:25:53 +01:00
if (( ! $is_like ) && ( $importer [ 'notify-flags' ] & NOTIFY_COMMENT ) && ( ! $importer [ 'self' ])) {
2011-05-24 05:30:37 +02:00
push_lang ( $importer [ 'language' ]);
2011-02-04 13:25:53 +01:00
require_once ( 'bbcode.php' );
$from = stripslashes ( $datarray [ 'author-name' ]);
2011-05-22 06:40:16 +02:00
2011-05-22 04:27:56 +02:00
// name of the automated email sender
$msg [ 'notificationfromname' ] = stripslashes ( $datarray [ 'author-name' ]);;
// noreply address to send from
$msg [ 'notificationfromemail' ] = t ( 'noreply' ) . '@' . $a -> get_hostname ();
// text version
// process the message body to display properly in text mode
$msg [ 'textversion' ]
= html_entity_decode ( strip_tags ( bbcode ( stripslashes ( $datarray [ 'body' ]))), ENT_QUOTES , 'UTF-8' );
// html version
// process the message body to display properly in text mode
$msg [ 'htmlversion' ]
= html_entity_decode ( bbcode ( stripslashes ( str_replace ( array ( " \\ r \\ n " , " \\ r " , " \\ n \\ n " , " \\ n " ), " <br /> \n " , $datarray [ 'body' ]))));
2011-08-21 03:27:12 +02:00
$imgtouse = (( link_compare ( $datarray [ 'author-link' ], $importer [ 'url' ])) ? $importer [ 'thumb' ] : $datarray [ 'author-avatar' ]);
2011-05-22 04:27:56 +02:00
// load the template for private message notifications
2011-05-22 06:40:16 +02:00
$tpl = get_intltext_template ( 'cmnt_received_html_body_eml.tpl' );
2011-05-22 04:27:56 +02:00
$email_html_body_tpl = replace_macros ( $tpl , array (
2011-06-15 05:49:25 +02:00
'$username' => $importer [ 'username' ],
2011-05-22 08:19:50 +02:00
'$sitename' => $a -> config [ 'sitename' ], // name of this site
'$siteurl' => $a -> get_baseurl (), // descriptive url of this site
2011-08-21 03:27:12 +02:00
'$thumb' => $imgtouse , // thumbnail url for sender icon
2011-05-22 08:19:50 +02:00
'$email' => $importer [ 'email' ], // email address to send to
2011-08-21 03:27:12 +02:00
'$url' => $datarray [ 'author-link' ], // full url for the site
'$from' => $from , // name of the person sending the message
'$body' => $msg [ 'htmlversion' ], // html version of the message
2011-05-28 03:54:43 +02:00
'$display' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
2011-05-22 04:27:56 +02:00
));
// load the template for private message notifications
2011-05-22 06:40:16 +02:00
$tpl = get_intltext_template ( 'cmnt_received_text_body_eml.tpl' );
2011-05-22 04:27:56 +02:00
$email_text_body_tpl = replace_macros ( $tpl , array (
2011-06-15 05:49:25 +02:00
'$username' => $importer [ 'username' ],
2011-05-22 08:19:50 +02:00
'$sitename' => $a -> config [ 'sitename' ], // name of this site
'$siteurl' => $a -> get_baseurl (), // descriptive url of this site
2011-08-21 03:27:12 +02:00
'$thumb' => $imgtouse , // thumbnail url for sender icon
2011-05-22 08:19:50 +02:00
'$email' => $importer [ 'email' ], // email address to send to
2011-08-21 03:27:12 +02:00
'$url' => $datarray [ 'author-link' ], // full url for the site
'$from' => $from , // name of the person sending the message
2011-05-22 08:19:50 +02:00
'$body' => $msg [ 'textversion' ], // text version of the message
2011-05-28 03:54:43 +02:00
'$display' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
2011-05-22 04:27:56 +02:00
));
// use the EmailNotification library to send the message
require_once ( " include/EmailNotification.php " );
EmailNotification :: sendTextHtmlEmail (
$msg [ 'notificationfromname' ],
2011-05-25 12:23:45 +02:00
t ( " Administrator " ) . '@' . $a -> get_hostname (),
2011-05-22 04:27:56 +02:00
t ( " noreply " ) . '@' . $a -> get_hostname (),
$importer [ 'email' ],
2011-05-25 12:23:45 +02:00
sprintf ( t ( '%s commented on an item at %s' ), $from , $a -> config [ 'sitename' ]),
2011-05-22 04:27:56 +02:00
$email_html_body_tpl ,
$email_text_body_tpl
);
2011-05-24 05:30:37 +02:00
pop_lang ();
2011-02-04 13:25:53 +01:00
}
2010-09-09 05:14:17 +02:00
}
2011-02-04 13:25:53 +01:00
xml_status ( 0 );
// NOTREACHED
}
2010-07-16 10:26:42 +02:00
}
else {
2011-03-01 03:24:32 +01:00
2010-07-16 10:26:42 +02:00
// regular comment that is part of this total conversation. Have we seen it? If not, import it.
2011-03-01 03:24:32 +01:00
$item_id = $item -> get_id ();
$datarray = get_atom_elements ( $feed , $item );
2010-07-16 10:26:42 +02:00
2011-03-01 03:24:32 +01:00
$r = q ( " SELECT `uid`, `last-child`, `edited`, `body` 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
);
2011-03-01 03:24:32 +01:00
// Update content if 'updated' changes
2010-07-16 10:26:42 +02:00
if ( count ( $r )) {
2011-03-01 03:24:32 +01:00
if (( x ( $datarray , 'edited' ) !== false ) && ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) !== $r [ 0 ][ 'edited' ])) {
$r = q ( " UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $datarray [ 'body' ]),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
}
// update last-child if it changes
2010-08-14 16:55:18 +02:00
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
2011-03-01 03:24:32 +01:00
if (( $allow ) && ( $allow [ 0 ][ 'data' ] != $r [ 0 ][ 'last-child' ])) {
$r = q ( " UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d " ,
dbesc ( datetime_convert ()),
dbesc ( $parent_uri ),
intval ( $importer [ 'importer_uid' ])
);
$r = q ( " UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
intval ( $allow [ 0 ][ 'data' ]),
2010-08-23 05:57:20 +02:00
dbesc ( datetime_convert ()),
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 ;
}
2011-03-01 03:24:32 +01:00
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-09-17 12:10:19 +02:00
if (( $datarray [ 'verb' ] == ACTIVITY_LIKE ) || ( $datarray [ 'verb' ] == ACTIVITY_DISLIKE )) {
$datarray [ 'type' ] = 'activity' ;
$datarray [ 'gravity' ] = GRAVITY_LIKE ;
}
2011-05-26 03:15:49 +02:00
$posted_id = item_store ( $datarray );
2010-08-14 16:55:18 +02:00
// find out if our user is involved in this conversation and wants to be notified.
2010-09-17 12:10:19 +02:00
if (( $datarray [ 'type' ] != 'activity' ) && ( $importer [ 'notify-flags' ] & NOTIFY_COMMENT )) {
2010-08-14 16:55:18 +02:00
2011-05-22 04:27:56 +02:00
$myconv = q ( " SELECT `author-link`, `author-avatar` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 " ,
2010-09-09 14:25:01 +02:00
dbesc ( $parent_uri ),
intval ( $importer [ 'importer_uid' ])
2010-08-14 16:55:18 +02:00
);
if ( count ( $myconv )) {
2011-02-13 07:29:32 +01:00
$importer_url = $a -> get_baseurl () . '/profile/' . $importer [ 'nickname' ];
2010-08-14 16:55:18 +02:00
foreach ( $myconv as $conv ) {
2011-02-13 07:29:32 +01:00
if ( ! link_compare ( $conv [ 'author-link' ], $importer_url ))
2010-08-14 16:55:18 +02:00
continue ;
2011-05-24 05:30:37 +02:00
push_lang ( $importer [ 'language' ]);
2010-08-14 16:55:18 +02:00
require_once ( 'bbcode.php' );
$from = stripslashes ( $datarray [ 'author-name' ]);
2011-05-22 04:27:56 +02:00
// name of the automated email sender
$msg [ 'notificationfromname' ] = stripslashes ( $datarray [ 'author-name' ]);;
// noreply address to send from
$msg [ 'notificationfromemail' ] = t ( 'noreply' ) . '@' . $a -> get_hostname ();
// text version
// process the message body to display properly in text mode
$msg [ 'textversion' ]
= html_entity_decode ( strip_tags ( bbcode ( stripslashes ( $datarray [ 'body' ]))), ENT_QUOTES , 'UTF-8' );
// html version
// process the message body to display properly in text mode
$msg [ 'htmlversion' ]
= html_entity_decode ( bbcode ( stripslashes ( str_replace ( array ( " \\ r \\ n " , " \\ r " , " \\ n \\ n " , " \\ n " ), " <br /> \n " , $datarray [ 'body' ]))));
2011-08-21 03:27:12 +02:00
$imgtouse = (( link_compare ( $datarray [ 'author-link' ], $importer [ 'url' ])) ? $importer [ 'thumb' ] : $datarray [ 'author-avatar' ]);
2011-05-22 04:27:56 +02:00
// load the template for private message notifications
2011-05-22 06:40:16 +02:00
$tpl = get_intltext_template ( 'cmnt_received_html_body_eml.tpl' );
2011-05-22 04:27:56 +02:00
$email_html_body_tpl = replace_macros ( $tpl , array (
2011-06-15 05:49:25 +02:00
'$username' => $importer [ 'username' ],
2011-05-22 04:27:56 +02:00
'$sitename' => $a -> config [ 'sitename' ], // name of this site
'$siteurl' => $a -> get_baseurl (), // descriptive url of this site
2011-08-21 03:27:12 +02:00
'$thumb' => $imgtouse , // thumbnail url for sender icon
'$url' => $datarray [ 'author-link' ], // full url for the site
'$from' => $from , // name of the person sending the message
2011-05-22 04:27:56 +02:00
'$body' => $msg [ 'htmlversion' ], // html version of the message
2011-05-26 03:15:49 +02:00
'$display' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
2011-05-22 04:27:56 +02:00
));
// load the template for private message notifications
2011-05-22 06:40:16 +02:00
$tpl = get_intltext_template ( 'cmnt_received_text_body_eml.tpl' );
2011-05-22 04:27:56 +02:00
$email_text_body_tpl = replace_macros ( $tpl , array (
2011-06-15 05:49:25 +02:00
'$username' => $importer [ 'username' ],
2011-05-22 04:27:56 +02:00
'$sitename' => $a -> config [ 'sitename' ], // name of this site
'$siteurl' => $a -> get_baseurl (), // descriptive url of this site
2011-08-21 03:27:12 +02:00
'$thumb' => $imgtouse , // thumbnail url for sender icon
'$url' => $datarray [ 'author-link' ], // full url for the site
'$from' => $from , // name of the person sending the message
2011-05-22 04:27:56 +02:00
'$body' => $msg [ 'textversion' ], // text version of the message
2011-05-26 03:15:49 +02:00
'$display' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
2011-05-22 04:27:56 +02:00
));
// use the EmailNotification library to send the message
require_once ( " include/EmailNotification.php " );
EmailNotification :: sendTextHtmlEmail (
$msg [ 'notificationfromname' ],
t ( " Administrator@ " ) . $a -> get_hostname (),
t ( " noreply " ) . '@' . $a -> get_hostname (),
$importer [ 'email' ],
2011-05-26 03:15:49 +02:00
sprintf ( t ( '%s commented on an item at %s' ), $from , $a -> config [ 'sitename' ]),
2011-05-22 04:27:56 +02:00
$email_html_body_tpl ,
$email_text_body_tpl
);
2011-05-24 05:30:37 +02:00
pop_lang ();
2010-08-14 16:55:18 +02:00
break ;
}
}
}
2010-07-16 10:26:42 +02:00
continue ;
}
}
2011-03-01 03:24:32 +01:00
2010-07-16 10:26:42 +02:00
else {
2011-03-01 03:24:32 +01:00
2010-07-16 10:26:42 +02:00
// Head post of a conversation. Have we seen it? If not, import it.
2011-03-01 03:24:32 +01:00
$item_id = $item -> get_id ();
$datarray = get_atom_elements ( $feed , $item );
2011-06-14 04:06:49 +02:00
if (( x ( $datarray , 'object-type' )) && ( $datarray [ 'object-type' ] === ACTIVITY_OBJ_EVENT )) {
$ev = bbtoevent ( $datarray [ 'body' ]);
if ( x ( $ev , 'desc' ) && x ( $ev , 'start' )) {
$ev [ 'cid' ] = $importer [ 'id' ];
$ev [ 'uid' ] = $importer [ 'uid' ];
2011-06-14 05:42:37 +02:00
$ev [ 'uri' ] = $item_id ;
2011-06-24 03:25:33 +02:00
$ev [ 'edited' ] = $datarray [ 'edited' ];
2011-07-27 11:21:55 +02:00
$ev [ 'private' ] = $datarray [ 'private' ];
2011-06-14 04:06:49 +02:00
$r = q ( " SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
if ( count ( $r ))
$ev [ 'id' ] = $r [ 0 ][ 'id' ];
$xyz = event_store ( $ev );
continue ;
}
}
2011-03-01 03:24:32 +01:00
$r = q ( " SELECT `uid`, `last-child`, `edited`, `body` 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
);
2011-03-01 03:24:32 +01:00
// Update content if 'updated' changes
2010-07-16 10:26:42 +02:00
if ( count ( $r )) {
2011-03-01 03:24:32 +01:00
if (( x ( $datarray , 'edited' ) !== false ) && ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) !== $r [ 0 ][ 'edited' ])) {
$r = q ( " UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $datarray [ 'body' ]),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
}
// update last-child if it changes
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' ]) {
2011-03-01 03:24:32 +01:00
$r = q ( " UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-07-16 10:26:42 +02:00
intval ( $allow [ 0 ][ 'data' ]),
2010-08-23 05:57:20 +02:00
dbesc ( datetime_convert ()),
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 ;
}
2011-07-06 04:55:09 +02:00
// This is my contact on another system, but it's really me.
// Turn this into a wall post.
if ( $contact [ 'remote_self' ])
$datarray [ 'wall' ] = 1 ;
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-09-14 07:57:31 +02:00
$r = item_store ( $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-10-04 13:22:34 +02:00
// NOTREACHED
2010-07-05 05:45:56 +02:00
}
function dfrn_notify_content ( & $a ) {
if ( x ( $_GET , 'dfrn_id' )) {
2010-09-13 06:25:37 +02:00
// initial communication from external contact, $direction is their direction.
// If this is a duplex communication, ours will be the opposite.
$dfrn_id = notags ( trim ( $_GET [ 'dfrn_id' ]));
2010-10-13 05:29:04 +02:00
$dfrn_version = ( float ) $_GET [ 'dfrn_version' ];
2010-11-24 00:55:11 +01:00
logger ( 'dfrn_notify: new notification dfrn_id=' . $dfrn_id );
2010-09-13 06:25:37 +02:00
$direction = ( - 1 );
if ( strpos ( $dfrn_id , ':' ) == 1 ) {
$direction = intval ( substr ( $dfrn_id , 0 , 1 ));
$dfrn_id = substr ( $dfrn_id , 2 );
}
2010-07-05 05:45:56 +02:00
$hash = random_string ();
$status = 0 ;
$r = q ( " DELETE FROM `challenge` WHERE `expire` < " . intval ( time ()));
$r = q ( " INSERT INTO `challenge` ( `challenge`, `dfrn-id`, `expire` )
2011-02-04 02:40:04 +01:00
VALUES ( '%s' , '%s' , % d ) " ,
2010-07-05 05:45:56 +02:00
dbesc ( $hash ),
2010-09-13 06:25:37 +02:00
dbesc ( $dfrn_id ),
2011-02-04 02:40:04 +01:00
intval ( time () + 90 )
2010-07-05 05:45:56 +02:00
);
2011-09-19 12:30:59 +02:00
logger ( 'dfrn_notify: challenge=' . $hash , LOGGER_DEBUG );
2010-09-13 06:25:37 +02:00
$sql_extra = '' ;
switch ( $direction ) {
case ( - 1 ) :
2010-10-19 01:38:48 +02:00
$sql_extra = sprintf ( " AND ( `issued-id` = '%s' OR `dfrn-id` = '%s' ) " , dbesc ( $dfrn_id ), dbesc ( $dfrn_id ));
2010-09-13 06:25:37 +02:00
$my_id = $dfrn_id ;
break ;
case 0 :
$sql_extra = sprintf ( " AND `issued-id` = '%s' AND `duplex` = 1 " , dbesc ( $dfrn_id ));
$my_id = '1:' . $dfrn_id ;
break ;
case 1 :
$sql_extra = sprintf ( " AND `dfrn-id` = '%s' AND `duplex` = 1 " , dbesc ( $dfrn_id ));
$my_id = '0:' . $dfrn_id ;
break ;
default :
$status = 1 ;
break ; // NOTREACHED
}
2010-10-19 01:38:48 +02:00
$r = q ( " SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
2011-09-19 10:17:12 +02:00
WHERE `contact` . `blocked` = 0 AND `contact` . `pending` = 0 AND `user` . `nickname` = '%s'
AND `user` . `account_expired` = 0 $sql_extra LIMIT 1 " ,
2010-10-19 01:38:48 +02:00
dbesc ( $a -> argv [ 1 ])
);
2010-09-13 06:25:37 +02:00
2010-09-02 09:31:11 +02:00
if ( ! count ( $r ))
2010-07-05 05:45:56 +02:00
$status = 1 ;
$challenge = '' ;
2010-08-05 11:57:03 +02:00
$encrypted_id = '' ;
2010-09-13 06:25:37 +02:00
$id_str = $my_id . '.' . mt_rand ( 1000 , 9999 );
2010-08-05 11:57:03 +02:00
2011-09-20 06:24:16 +02:00
$prv_key = trim ( $r [ 0 ][ 'prvkey' ]);
$pub_key = trim ( $r [ 0 ][ 'pubkey' ]);
$dplx = intval ( $r [ 0 ][ 'duplex' ]);
if ((( $dplx ) && ( strlen ( $prv_key ))) || (( strlen ( $prv_key )) && ( ! ( strlen ( $pub_key ))))) {
openssl_private_encrypt ( $hash , $challenge , $prv_key );
openssl_private_encrypt ( $id_str , $encrypted_id , $prv_key );
}
2011-09-21 14:43:26 +02:00
elseif ( strlen ( $pub_key )) {
2011-09-20 06:24:16 +02:00
openssl_public_encrypt ( $hash , $challenge , $pub_key );
openssl_public_encrypt ( $id_str , $encrypted_id , $pub_key );
2011-02-02 06:21:47 +01:00
}
2011-09-21 14:43:26 +02:00
else
$status = 1 ;
2010-09-02 09:31:11 +02:00
$challenge = bin2hex ( $challenge );
2010-08-05 11:57:03 +02:00
$encrypted_id = bin2hex ( $encrypted_id );
2010-12-01 22:39:00 +01:00
$rino = (( function_exists ( 'mcrypt_encrypt' )) ? 1 : 0 );
$rino_enable = get_config ( 'system' , 'rino_encrypt' );
if ( ! $rino_enable )
$rino = 0 ;
2010-10-13 05:29:04 +02:00
header ( " Content-type: text/xml " );
echo '<?xml version="1.0" encoding="UTF-8"?>' . " \r \n "
. '<dfrn_notify>' . " \r \n "
. " \t " . '<status>' . $status . '</status>' . " \r \n "
. " \t " . '<dfrn_version>' . DFRN_PROTOCOL_VERSION . '</dfrn_version>' . " \r \n "
2010-12-01 22:39:00 +01:00
. " \t " . '<rino>' . $rino . '</rino>' . " \r \n "
2010-10-13 05:29:04 +02:00
. " \t " . '<dfrn_id>' . $encrypted_id . '</dfrn_id>' . " \r \n "
. " \t " . '<challenge>' . $challenge . '</challenge>' . " \r \n "
. '</dfrn_notify>' . " \r \n " ;
2010-10-04 13:22:34 +02:00
killme ();
2010-07-05 05:45:56 +02:00
}
2010-10-04 13:22:34 +02:00
}