2010-07-18 15:02:55 +02:00
< ? php
2011-08-20 13:53:11 +02:00
require_once ( 'include/bbcode.php' );
require_once ( 'include/oembed.php' );
2011-02-01 14:10:04 +01:00
require_once ( 'include/salmon.php' );
2011-08-20 13:53:11 +02:00
require_once ( 'include/crypto.php' );
2012-07-08 00:20:24 +02:00
require_once ( 'include/Photo.php' );
2010-07-18 15:02:55 +02:00
2011-01-13 06:04:49 +01:00
function get_feed_for ( & $a , $dfrn_id , $owner_nick , $last_update , $direction = 0 ) {
2010-09-09 05:14:17 +02:00
2011-02-08 02:06:04 +01:00
2012-03-27 02:57:27 +02:00
$sitefeed = (( strlen ( $owner_nick )) ? false : true ); // not yet implemented, need to rewrite huge chunks of following logic
2011-08-24 14:58:31 +02:00
$public_feed = (( $dfrn_id ) ? false : true );
2012-03-27 02:57:27 +02:00
$starred = false ; // not yet implemented, possible security issues
$converse = false ;
2011-08-24 14:58:31 +02:00
if ( $public_feed && $a -> argc > 2 ) {
for ( $x = 2 ; $x < $a -> argc ; $x ++ ) {
if ( $a -> argv [ $x ] == 'converse' )
$converse = true ;
2011-09-01 15:29:29 +02:00
if ( $a -> argv [ $x ] == 'starred' )
$starred = true ;
2012-04-14 13:19:41 +02:00
if ( $a -> argv [ $x ] === 'category' && $a -> argc > ( $x + 1 ) && strlen ( $a -> argv [ $x + 1 ]))
$category = $a -> argv [ $x + 1 ];
2011-08-24 14:58:31 +02:00
}
}
2012-04-14 13:19:41 +02:00
2012-03-27 02:57:27 +02:00
// default permissions - anonymous user
2011-08-24 14:58:31 +02:00
2011-02-08 02:06:04 +01:00
$sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' " ;
2010-07-19 05:49:10 +02:00
2012-03-19 06:12:36 +01:00
$r = q ( " SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
2011-02-08 02:06:04 +01:00
FROM `contact` LEFT JOIN `user` ON `user` . `uid` = `contact` . `uid`
WHERE `contact` . `self` = 1 AND `user` . `nickname` = '%s' LIMIT 1 " ,
dbesc ( $owner_nick )
2010-07-18 15:02:55 +02:00
);
2011-02-08 02:06:04 +01:00
if ( ! count ( $r ))
2010-07-18 15:02:55 +02:00
killme ();
2011-02-08 02:06:04 +01:00
$owner = $r [ 0 ];
$owner_id = $owner [ 'user_uid' ];
$owner_nick = $owner [ 'nickname' ];
$birthday = feed_birthday ( $owner_id , $owner [ 'timezone' ]);
2011-01-13 06:04:49 +01:00
2011-08-24 14:58:31 +02:00
if ( ! $public_feed ) {
2010-09-17 12:10:19 +02:00
$sql_extra = '' ;
switch ( $direction ) {
case ( - 1 ) :
$sql_extra = sprintf ( " AND `issued-id` = '%s' " , dbesc ( $dfrn_id ));
$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 :
return false ;
break ; // NOTREACHED
}
2010-07-18 15:02:55 +02:00
2010-09-17 12:10:19 +02:00
$r = q ( " SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `contact`.`uid` = %d $sql_extra LIMIT 1 " ,
2010-09-10 04:48:08 +02:00
intval ( $owner_id )
2010-07-18 15:02:55 +02:00
);
2010-09-17 12:10:19 +02:00
2010-07-18 15:02:55 +02:00
if ( ! count ( $r ))
2011-02-08 02:06:04 +01:00
killme ();
2010-07-18 15:02:55 +02:00
$contact = $r [ 0 ];
2012-10-21 23:41:10 +02:00
require_once ( 'include/security.php' );
2010-07-18 15:02:55 +02:00
$groups = init_groups_visitor ( $contact [ 'id' ]);
if ( count ( $groups )) {
2010-08-03 04:06:36 +02:00
for ( $x = 0 ; $x < count ( $groups ); $x ++ )
$groups [ $x ] = '<' . intval ( $groups [ $x ]) . '>' ;
$gs = implode ( '|' , $groups );
}
else
$gs = '<<>>' ; // Impossible to match
2010-09-09 05:14:17 +02:00
$sql_extra = sprintf ( "
AND ( `allow_cid` = '' OR `allow_cid` REGEXP '<%d>' )
AND ( `deny_cid` = '' OR NOT `deny_cid` REGEXP '<%d>' )
AND ( `allow_gid` = '' OR `allow_gid` REGEXP '%s' )
AND ( `deny_gid` = '' OR NOT `deny_gid` REGEXP '%s' )
" ,
2010-07-19 05:49:10 +02:00
intval ( $contact [ 'id' ]),
intval ( $contact [ 'id' ]),
2010-07-18 15:02:55 +02:00
dbesc ( $gs ),
dbesc ( $gs )
);
}
2011-08-24 14:58:31 +02:00
if ( $public_feed )
2010-09-10 10:45:58 +02:00
$sort = 'DESC' ;
else
$sort = 'ASC' ;
2010-07-18 15:02:55 +02:00
if ( ! strlen ( $last_update ))
2010-11-02 01:56:36 +01:00
$last_update = 'now -30 days' ;
2010-09-21 04:34:44 +02:00
2012-04-17 13:33:50 +02:00
if ( isset ( $category )) {
2012-04-14 13:19:41 +02:00
$sql_extra .= file_tag_file_query ( 'item' , $category , 'category' );
}
2011-08-24 14:58:31 +02:00
if ( $public_feed ) {
if ( ! $converse )
$sql_extra .= " AND `contact`.`self` = 1 " ;
}
2010-07-18 15:02:55 +02:00
$check_date = datetime_convert ( 'UTC' , 'UTC' , $last_update , 'Y-m-d H:i:s' );
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
2012-05-11 14:11:53 +02:00
`contact` . `name` , `contact` . `network` , `contact` . `photo` , `contact` . `url` ,
2010-08-09 06:03:08 +02:00
`contact` . `name-date` , `contact` . `uri-date` , `contact` . `avatar-date` ,
2010-07-18 15:02:55 +02:00
`contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2011-08-29 04:22:27 +02:00
`contact` . `id` AS `contact-id` , `contact` . `uid` AS `contact-uid` ,
`sign` . `signed_text` , `sign` . `signature` , `sign` . `signer`
2010-07-18 15:02:55 +02:00
FROM `item` LEFT JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
2011-08-29 04:22:27 +02:00
LEFT JOIN `sign` ON `sign` . `iid` = `item` . `id`
2012-01-24 05:56:11 +01:00
WHERE `item` . `uid` = % d AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `parent` != 0
2010-09-17 12:10:19 +02:00
AND `item` . `wall` = 1 AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2010-08-23 05:57:20 +02:00
AND ( `item` . `edited` > '%s' OR `item` . `changed` > '%s' )
2010-07-18 15:02:55 +02:00
$sql_extra
2010-09-10 10:45:58 +02:00
ORDER BY `parent` % s , `created` ASC LIMIT 0 , 300 " ,
2010-07-18 15:02:55 +02:00
intval ( $owner_id ),
2010-08-23 05:57:20 +02:00
dbesc ( $check_date ),
2010-09-10 10:45:58 +02:00
dbesc ( $check_date ),
dbesc ( $sort )
2010-07-18 15:02:55 +02:00
);
2010-09-21 04:34:44 +02:00
// Will check further below if this actually returned results.
2011-02-08 02:06:04 +01:00
// We will provide an empty feed if that is the case.
2010-07-18 15:02:55 +02:00
$items = $r ;
2011-08-13 06:01:51 +02:00
$feed_template = get_markup_template (( $dfrn_id ) ? 'atom_feed_dfrn.tpl' : 'atom_feed.tpl' );
2010-07-18 15:02:55 +02:00
$atom = '' ;
2011-02-08 02:06:04 +01:00
$hubxml = feed_hublinks ();
2010-10-22 03:07:22 +02:00
2011-02-08 02:06:04 +01:00
$salmon = feed_salmonlinks ( $owner_nick );
2010-07-18 15:02:55 +02:00
$atom .= replace_macros ( $feed_template , array (
2011-11-24 08:17:26 +01:00
'$version' => xmlify ( FRIENDICA_VERSION ),
2010-10-02 12:38:53 +02:00
'$feed_id' => xmlify ( $a -> get_baseurl () . '/profile/' . $owner_nick ),
'$feed_title' => xmlify ( $owner [ 'name' ]),
2010-11-01 00:38:22 +01:00
'$feed_updated' => xmlify ( datetime_convert ( 'UTC' , 'UTC' , 'now' , ATOM_TIME )) ,
2010-10-02 12:38:53 +02:00
'$hub' => $hubxml ,
2010-10-07 04:46:44 +02:00
'$salmon' => $salmon ,
2010-10-02 12:38:53 +02:00
'$name' => xmlify ( $owner [ 'name' ]),
'$profile_page' => xmlify ( $owner [ 'url' ]),
'$photo' => xmlify ( $owner [ 'photo' ]),
'$thumb' => xmlify ( $owner [ 'thumb' ]),
'$picdate' => xmlify ( datetime_convert ( 'UTC' , 'UTC' , $owner [ 'avatar-date' ] . '+00:00' , ATOM_TIME )) ,
'$uridate' => xmlify ( datetime_convert ( 'UTC' , 'UTC' , $owner [ 'uri-date' ] . '+00:00' , ATOM_TIME )) ,
2011-01-13 06:04:49 +01:00
'$namdate' => xmlify ( datetime_convert ( 'UTC' , 'UTC' , $owner [ 'name-date' ] . '+00:00' , ATOM_TIME )) ,
2012-03-19 06:12:36 +01:00
'$birthday' => (( strlen ( $birthday )) ? '<dfrn:birthday>' . xmlify ( $birthday ) . '</dfrn:birthday>' : '' ),
'$community' => (( $owner [ 'page-flags' ] == PAGE_COMMUNITY ) ? '<dfrn:community>1</dfrn:community>' : '' )
2010-07-18 15:02:55 +02:00
));
2010-12-25 03:32:23 +01:00
call_hooks ( 'atom_feed' , $atom );
2010-09-21 04:34:44 +02:00
if ( ! count ( $items )) {
2010-12-25 03:32:23 +01:00
call_hooks ( 'atom_feed_end' , $atom );
2010-09-21 04:34:44 +02:00
$atom .= '</feed>' . " \r \n " ;
return $atom ;
}
2010-07-18 15:02:55 +02:00
foreach ( $items as $item ) {
2010-09-09 05:14:17 +02:00
2012-05-31 04:11:01 +02:00
// prevent private email from leaking.
if ( $item [ 'network' ] === NETWORK_MAIL )
continue ;
2010-09-09 05:14:17 +02:00
// public feeds get html, our own nodes use bbcode
2011-08-24 14:58:31 +02:00
if ( $public_feed ) {
2010-09-09 05:14:17 +02:00
$type = 'html' ;
2011-08-11 06:46:19 +02:00
// catch any email that's in a public conversation and make sure it doesn't leak
if ( $item [ 'private' ])
continue ;
2010-09-09 05:14:17 +02:00
}
else {
$type = 'text' ;
}
2010-11-02 01:56:36 +01:00
$atom .= atom_entry ( $item , $type , null , $owner , true );
2010-07-18 15:02:55 +02:00
}
2010-12-25 03:32:23 +01:00
call_hooks ( 'atom_feed_end' , $atom );
2010-08-14 16:55:18 +02:00
$atom .= '</feed>' . " \r \n " ;
2010-12-25 04:04:40 +01:00
2010-07-18 15:02:55 +02:00
return $atom ;
2010-09-09 05:14:17 +02:00
}
function construct_verb ( $item ) {
if ( $item [ 'verb' ])
return $item [ 'verb' ];
return ACTIVITY_POST ;
}
2010-11-04 00:48:21 +01:00
function construct_activity_object ( $item ) {
2010-09-09 05:14:17 +02:00
2010-09-17 12:10:19 +02:00
if ( $item [ 'object' ]) {
$o = '<as:object>' . " \r \n " ;
2011-06-10 10:51:14 +02:00
$r = parse_xml_string ( $item [ 'object' ], false );
if ( ! $r )
return '' ;
2010-09-17 12:10:19 +02:00
if ( $r -> type )
2010-10-11 05:02:29 +02:00
$o .= '<as:object-type>' . xmlify ( $r -> type ) . '</as:object-type>' . " \r \n " ;
2010-09-17 12:10:19 +02:00
if ( $r -> id )
2010-10-11 05:02:29 +02:00
$o .= '<id>' . xmlify ( $r -> id ) . '</id>' . " \r \n " ;
2010-11-05 04:47:44 +01:00
if ( $r -> title )
$o .= '<title>' . xmlify ( $r -> title ) . '</title>' . " \r \n " ;
2010-11-04 00:48:21 +01:00
if ( $r -> link ) {
2011-06-10 10:51:14 +02:00
if ( substr ( $r -> link , 0 , 1 ) === '<' ) {
// patch up some facebook "like" activity objects that got stored incorrectly
// for a couple of months prior to 9-Jun-2011 and generated bad XML.
// we can probably remove this hack here and in the following function in a few months time.
if ( strstr ( $r -> link , '&' ) && ( ! strstr ( $r -> link , '&' )))
$r -> link = str_replace ( '&' , '&' , $r -> link );
$r -> link = preg_replace ( '/\<link(.*?)\"\>/' , '<link$1"/>' , $r -> link );
2010-11-05 04:47:44 +01:00
$o .= $r -> link ;
2011-06-10 10:51:14 +02:00
}
2010-11-04 00:48:21 +01:00
else
$o .= '<link rel="alternate" type="text/html" href="' . xmlify ( $r -> link ) . '" />' . " \r \n " ;
}
2010-09-17 12:10:19 +02:00
if ( $r -> content )
2010-10-11 05:02:29 +02:00
$o .= '<content type="html" >' . xmlify ( bbcode ( $r -> content )) . '</content>' . " \r \n " ;
2010-09-17 12:10:19 +02:00
$o .= '</as:object>' . " \r \n " ;
return $o ;
2010-09-09 05:14:17 +02:00
}
2010-09-17 12:10:19 +02:00
2010-09-09 05:14:17 +02:00
return '' ;
2010-07-19 05:49:10 +02:00
}
2010-11-04 00:48:21 +01:00
function construct_activity_target ( $item ) {
if ( $item [ 'target' ]) {
$o = '<as:target>' . " \r \n " ;
2011-06-10 10:51:14 +02:00
$r = parse_xml_string ( $item [ 'target' ], false );
if ( ! $r )
return '' ;
2010-11-04 00:48:21 +01:00
if ( $r -> type )
$o .= '<as:object-type>' . xmlify ( $r -> type ) . '</as:object-type>' . " \r \n " ;
if ( $r -> id )
$o .= '<id>' . xmlify ( $r -> id ) . '</id>' . " \r \n " ;
2010-11-05 04:47:44 +01:00
if ( $r -> title )
$o .= '<title>' . xmlify ( $r -> title ) . '</title>' . " \r \n " ;
2010-11-04 00:48:21 +01:00
if ( $r -> link ) {
2011-06-10 10:51:14 +02:00
if ( substr ( $r -> link , 0 , 1 ) === '<' ) {
if ( strstr ( $r -> link , '&' ) && ( ! strstr ( $r -> link , '&' )))
$r -> link = str_replace ( '&' , '&' , $r -> link );
$r -> link = preg_replace ( '/\<link(.*?)\"\>/' , '<link$1"/>' , $r -> link );
2010-11-05 04:47:44 +01:00
$o .= $r -> link ;
2011-06-10 10:51:14 +02:00
}
2010-11-04 00:48:21 +01:00
else
$o .= '<link rel="alternate" type="text/html" href="' . xmlify ( $r -> link ) . '" />' . " \r \n " ;
}
if ( $r -> content )
$o .= '<content type="html" >' . xmlify ( bbcode ( $r -> content )) . '</content>' . " \r \n " ;
$o .= '</as:target>' . " \r \n " ;
return $o ;
}
return '' ;
2012-07-07 01:09:23 +02:00
}
/* limit_body_size ()
*
* The purpose of this function is to apply system message length limits to
* imported messages without including any embedded photos in the length
*/
if ( ! function_exists ( 'limit_body_size' )) {
function limit_body_size ( $body ) {
logger ( 'limit_body_size: start' , LOGGER_DEBUG );
$maxlen = get_max_import_size ();
// If the length of the body, including the embedded images, is smaller
2012-07-08 00:20:24 +02:00
// than the maximum, then don't waste time looking for the images
2012-07-07 01:09:23 +02:00
if ( $maxlen && ( strlen ( $body ) > $maxlen )) {
2012-07-08 00:20:24 +02:00
logger ( 'limit_body_size: the total body length exceeds the limit' , LOGGER_DEBUG );
$orig_body = $body ;
$new_body = '' ;
$textlen = 0 ;
$max_found = false ;
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
$img_start = strpos ( $orig_body , '[img' );
$img_st_close = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), ']' ) : false );
$img_end = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), '[/img]' ) : false );
while (( $img_st_close !== false ) && ( $img_end !== false )) {
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
$img_st_close ++ ; // make it point to AFTER the closing bracket
$img_end += $img_start ;
$img_end += strlen ( '[/img]' );
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
if ( ! strcmp ( substr ( $orig_body , $img_start + $img_st_close , 5 ), 'data:' )) {
// This is an embedded image
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
if ( ( $textlen + $img_start ) > $maxlen ) {
if ( $textlen < $maxlen ) {
logger ( 'limit_body_size: the limit happens before an embedded image' , LOGGER_DEBUG );
$new_body = $new_body . substr ( $orig_body , 0 , $maxlen - $textlen );
$textlen = $maxlen ;
}
2012-07-07 01:09:23 +02:00
}
2012-07-08 00:20:24 +02:00
else {
$new_body = $new_body . substr ( $orig_body , 0 , $img_start );
2012-07-08 02:47:13 +02:00
$textlen += $img_start ;
2012-07-08 00:20:24 +02:00
}
$new_body = $new_body . substr ( $orig_body , $img_start , $img_end - $img_start );
2012-07-07 01:09:23 +02:00
}
else {
2012-07-08 00:20:24 +02:00
if ( ( $textlen + $img_end ) > $maxlen ) {
if ( $textlen < $maxlen ) {
logger ( 'limit_body_size: the limit happens before the end of a non-embedded image' , LOGGER_DEBUG );
$new_body = $new_body . substr ( $orig_body , 0 , $maxlen - $textlen );
$textlen = $maxlen ;
}
}
else {
$new_body = $new_body . substr ( $orig_body , 0 , $img_end );
$textlen += $img_end ;
}
2012-07-07 01:09:23 +02:00
}
2012-07-08 00:20:24 +02:00
$orig_body = substr ( $orig_body , $img_end );
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
if ( $orig_body === false ) // in case the body ends on a closing image tag
$orig_body = '' ;
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
$img_start = strpos ( $orig_body , '[img' );
$img_st_close = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), ']' ) : false );
$img_end = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), '[/img]' ) : false );
}
2012-07-07 01:09:23 +02:00
2012-07-08 00:20:24 +02:00
if ( ( $textlen + strlen ( $orig_body )) > $maxlen ) {
if ( $textlen < $maxlen ) {
logger ( 'limit_body_size: the limit happens after the end of the last image' , LOGGER_DEBUG );
$new_body = $new_body . substr ( $orig_body , 0 , $maxlen - $textlen );
$textlen = $maxlen ;
}
2012-07-07 01:09:23 +02:00
}
else {
2012-07-08 00:20:24 +02:00
logger ( 'limit_body_size: the text size with embedded images extracted did not violate the limit' , LOGGER_DEBUG );
$new_body = $new_body . $orig_body ;
$textlen += strlen ( $orig_body );
2012-07-07 01:09:23 +02:00
}
2012-07-08 00:20:24 +02:00
return $new_body ;
2012-07-07 01:09:23 +02:00
}
else
return $body ;
}}
2010-11-04 00:48:21 +01:00
2012-06-30 09:25:22 +02:00
function title_is_body ( $title , $body ) {
$title = strip_tags ( $title );
$title = trim ( $title );
$title = str_replace ( array ( " \n " , " \r " , " \t " , " " ), array ( " " , " " , " " , " " ), $title );
$body = strip_tags ( $body );
$body = trim ( $body );
$body = str_replace ( array ( " \n " , " \r " , " \t " , " " ), array ( " " , " " , " " , " " ), $body );
if ( strlen ( $title ) < strlen ( $body ))
$body = substr ( $body , 0 , strlen ( $title ));
if (( $title != $body ) and ( substr ( $title , - 3 ) == " ... " )) {
$pos = strrpos ( $title , " ... " );
if ( $pos > 0 ) {
$title = substr ( $title , 0 , $pos );
$body = substr ( $body , 0 , $pos );
}
}
return ( $title == $body );
}
2010-07-19 05:49:10 +02:00
2010-10-25 05:39:24 +02:00
function get_atom_elements ( $feed , $item ) {
2010-07-19 05:49:10 +02:00
2010-09-09 05:14:17 +02:00
require_once ( 'library/HTMLPurifier.auto.php' );
require_once ( 'include/html2bbcode.php' );
2010-10-25 05:39:24 +02:00
$best_photo = array ();
2010-07-19 05:49:10 +02:00
2010-10-25 05:39:24 +02:00
$res = array ();
2010-09-09 05:14:17 +02:00
2010-07-19 05:49:10 +02:00
$author = $item -> get_author ();
2011-04-05 04:36:18 +02:00
if ( $author ) {
$res [ 'author-name' ] = unxmlify ( $author -> get_name ());
$res [ 'author-link' ] = unxmlify ( $author -> get_link ());
}
else {
$res [ 'author-name' ] = unxmlify ( $feed -> get_title ());
$res [ 'author-link' ] = unxmlify ( $feed -> get_permalink ());
}
2010-07-19 08:23:18 +02:00
$res [ 'uri' ] = unxmlify ( $item -> get_id ());
2010-07-19 05:49:10 +02:00
$res [ 'title' ] = unxmlify ( $item -> get_title ());
$res [ 'body' ] = unxmlify ( $item -> get_content ());
2011-02-16 11:07:11 +01:00
$res [ 'plink' ] = unxmlify ( $item -> get_link ( 0 ));
2010-10-25 05:39:24 +02:00
2012-06-30 09:25:22 +02:00
// removing the content of the title if its identically to the body
// This helps with auto generated titles e.g. from tumblr
if ( title_is_body ( $res [ " title " ], $res [ " body " ]))
$res [ 'title' ] = " " ;
2012-06-29 21:40:54 +02:00
2012-01-18 01:30:32 +01:00
if ( $res [ 'plink' ])
$base_url = implode ( '/' , array_slice ( explode ( '/' , $res [ 'plink' ]), 0 , 3 ));
else
$base_url = '' ;
2010-10-25 05:39:24 +02:00
// look for a photo. We should check media size and find the best one,
// but for now let's just find any author photo
$rawauthor = $item -> get_item_tags ( SIMPLEPIE_NAMESPACE_ATOM_10 , 'author' );
if ( $rawauthor && $rawauthor [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ]) {
$base = $rawauthor [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ];
foreach ( $base as $link ) {
2012-02-26 21:43:51 +01:00
if ( ! x ( $res , 'author-avatar' ) || ! $res [ 'author-avatar' ]) {
2010-10-25 05:39:24 +02:00
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'photo' || $link [ 'attribs' ][ '' ][ 'rel' ] === 'avatar' )
$res [ 'author-avatar' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
}
}
2012-07-05 23:36:00 +02:00
}
2010-10-25 05:39:24 +02:00
$rawactor = $item -> get_item_tags ( NAMESPACE_ACTIVITY , 'actor' );
2010-10-28 00:50:44 +02:00
if ( $rawactor && activity_match ( $rawactor [ 0 ][ 'child' ][ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ], ACTIVITY_OBJ_PERSON )) {
2010-10-25 05:39:24 +02:00
$base = $rawactor [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ];
if ( $base && count ( $base )) {
foreach ( $base as $link ) {
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'alternate' && ( ! $res [ 'author-link' ]))
$res [ 'author-link' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
2012-02-26 21:43:51 +01:00
if ( ! x ( $res , 'author-avatar' ) || ! $res [ 'author-avatar' ]) {
2010-10-25 05:39:24 +02:00
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'avatar' || $link [ 'attribs' ][ '' ][ 'rel' ] === 'photo' )
$res [ 'author-avatar' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
}
}
}
}
// No photo/profile-link on the item - look at the feed level
2010-11-10 05:38:24 +01:00
if (( ! ( x ( $res , 'author-link' ))) || ( ! ( x ( $res , 'author-avatar' )))) {
2010-10-25 05:39:24 +02:00
$rawauthor = $feed -> get_feed_tags ( SIMPLEPIE_NAMESPACE_ATOM_10 , 'author' );
if ( $rawauthor && $rawauthor [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ]) {
$base = $rawauthor [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ];
foreach ( $base as $link ) {
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'alternate' && ( ! $res [ 'author-link' ]))
$res [ 'author-link' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
if ( ! $res [ 'author-avatar' ]) {
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'photo' || $link [ 'attribs' ][ '' ][ 'rel' ] === 'avatar' )
$res [ 'author-avatar' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
}
}
2012-07-05 23:36:00 +02:00
}
2010-10-25 05:39:24 +02:00
$rawactor = $feed -> get_feed_tags ( NAMESPACE_ACTIVITY , 'subject' );
2010-10-28 00:50:44 +02:00
if ( $rawactor && activity_match ( $rawactor [ 0 ][ 'child' ][ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ], ACTIVITY_OBJ_PERSON )) {
2010-10-25 05:39:24 +02:00
$base = $rawactor [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ];
if ( $base && count ( $base )) {
foreach ( $base as $link ) {
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'alternate' && ( ! $res [ 'author-link' ]))
$res [ 'author-link' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
2010-11-10 05:38:24 +01:00
if ( ! ( x ( $res , 'author-avatar' ))) {
2010-10-25 05:39:24 +02:00
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'avatar' || $link [ 'attribs' ][ '' ][ 'rel' ] === 'photo' )
$res [ 'author-avatar' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
}
}
}
}
}
2011-06-21 04:08:40 +02:00
$apps = $item -> get_item_tags ( NAMESPACE_STATUSNET , 'notice_info' );
if ( $apps && $apps [ 0 ][ 'attribs' ][ '' ][ 'source' ]) {
2011-06-24 00:58:43 +02:00
$res [ 'app' ] = strip_tags ( unxmlify ( $apps [ 0 ][ 'attribs' ][ '' ][ 'source' ]));
2011-06-21 04:08:40 +02:00
if ( $res [ 'app' ] === 'web' )
$res [ 'app' ] = 'OStatus' ;
2012-07-05 23:36:00 +02:00
}
2010-10-25 05:39:24 +02:00
2011-08-29 04:22:27 +02:00
// base64 encoded json structure representing Diaspora signature
$dsig = $item -> get_item_tags ( NAMESPACE_DFRN , 'diaspora_signature' );
if ( $dsig ) {
$res [ 'dsprsig' ] = unxmlify ( $dsig [ 0 ][ 'data' ]);
}
$dguid = $item -> get_item_tags ( NAMESPACE_DFRN , 'diaspora_guid' );
if ( $dguid )
$res [ 'guid' ] = unxmlify ( $dguid [ 0 ][ 'data' ]);
2011-09-05 04:58:03 +02:00
$bm = $item -> get_item_tags ( NAMESPACE_DFRN , 'bookmark' );
if ( $bm )
$res [ 'bookmark' ] = (( unxmlify ( $bm [ 0 ][ 'data' ]) === 'true' ) ? 1 : 0 );
2011-08-29 04:22:27 +02:00
2011-02-01 14:10:04 +01:00
/**
* If there ' s a copy of the body content which is guaranteed to have survived mangling in transit , use it .
*/
$have_real_body = false ;
$rawenv = $item -> get_item_tags ( NAMESPACE_DFRN , 'env' );
if ( $rawenv ) {
$have_real_body = true ;
$res [ 'body' ] = $rawenv [ 0 ][ 'data' ];
$res [ 'body' ] = str_replace ( array ( ' ' , " \t " , " \r " , " \n " ), array ( '' , '' , '' , '' ), $res [ 'body' ]);
2011-02-02 02:50:49 +01:00
// make sure nobody is trying to sneak some html tags by us
2012-08-04 03:36:45 +02:00
$res [ 'body' ] = notags ( base64url_decode ( $res [ 'body' ]));
2011-02-01 14:10:04 +01:00
}
2012-07-07 01:09:23 +02:00
$res [ 'body' ] = limit_body_size ( $res [ 'body' ]);
2010-07-19 05:49:10 +02:00
2010-09-09 05:14:17 +02:00
// It isn't certain at this point whether our content is plaintext or html and we'd be foolish to trust
// the content type. Our own network only emits text normally, though it might have been converted to
2011-01-18 04:50:18 +01:00
// html if we used a pubsubhubbub transport. But if we see even one html tag in our text, we will
2010-09-09 05:14:17 +02:00
// have to assume it is all html and needs to be purified.
// It doesn't matter all that much security wise - because before this content is used anywhere, we are
// going to escape any tags we find regardless, but this lets us import a limited subset of html from
// the wild, by sanitising it and converting supported tags to bbcode before we rip out any remaining
// html.
2012-04-01 12:19:37 +02:00
if (( strpos ( $res [ 'body' ], '<' ) !== false ) && ( strpos ( $res [ 'body' ], '>' ) !== false )) {
2010-09-09 05:14:17 +02:00
2012-01-18 01:30:32 +01:00
$res [ 'body' ] = reltoabs ( $res [ 'body' ], $base_url );
2011-10-12 03:24:37 +02:00
$res [ 'body' ] = html2bb_video ( $res [ 'body' ]);
2011-05-21 00:46:41 +02:00
2011-02-02 03:20:25 +01:00
$res [ 'body' ] = oembed_html2bbcode ( $res [ 'body' ]);
2011-02-17 02:32:15 +01:00
2011-02-02 03:20:25 +01:00
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
2010-09-09 05:14:17 +02:00
2011-02-02 03:20:25 +01:00
// we shouldn't need a whitelist, because the bbcode converter
// will strip out any unsupported tags.
2010-09-09 05:14:17 +02:00
2011-02-02 03:20:25 +01:00
$purifier = new HTMLPurifier ( $config );
$res [ 'body' ] = $purifier -> purify ( $res [ 'body' ]);
2010-09-09 11:00:54 +02:00
2012-04-01 12:19:37 +02:00
$res [ 'body' ] = @ html2bbcode ( $res [ 'body' ]);
2012-06-20 14:04:51 +02:00
2011-01-18 04:50:18 +01:00
}
2012-04-02 00:43:57 +02:00
elseif ( ! $have_real_body ) {
// it's not one of our messages and it has no tags
// so it's probably just text. We'll escape it just to be safe.
$res [ 'body' ] = escape_tags ( $res [ 'body' ]);
}
2012-08-04 03:33:11 +02:00
2012-04-02 00:43:57 +02:00
// this tag is obsolete but we keep it for really old sites
2011-02-17 02:32:15 +01:00
2010-08-03 04:06:36 +02:00
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
2010-07-19 05:49:10 +02:00
if ( $allow && $allow [ 0 ][ 'data' ] == 1 )
$res [ 'last-child' ] = 1 ;
else
$res [ 'last-child' ] = 0 ;
2010-12-08 05:47:53 +01:00
$private = $item -> get_item_tags ( NAMESPACE_DFRN , 'private' );
2012-06-29 02:43:29 +02:00
if ( $private && intval ( $private [ 0 ][ 'data' ]) > 0 )
$res [ 'private' ] = intval ( $private [ 0 ][ 'data' ]);
2010-12-08 05:47:53 +01:00
else
$res [ 'private' ] = 0 ;
2011-05-23 03:40:00 +02:00
$extid = $item -> get_item_tags ( NAMESPACE_DFRN , 'extid' );
if ( $extid && $extid [ 0 ][ 'data' ])
$res [ 'extid' ] = $extid [ 0 ][ 'data' ];
2010-07-19 05:49:10 +02:00
2010-08-25 01:25:02 +02:00
$rawlocation = $item -> get_item_tags ( NAMESPACE_DFRN , 'location' );
2010-08-20 23:33:15 +02:00
if ( $rawlocation )
$res [ 'location' ] = unxmlify ( $rawlocation [ 0 ][ 'data' ]);
2011-01-25 04:36:20 +01:00
$rawcreated = $item -> get_item_tags ( SIMPLEPIE_NAMESPACE_ATOM_10 , 'published' );
if ( $rawcreated )
$res [ 'created' ] = unxmlify ( $rawcreated [ 0 ][ 'data' ]);
2010-07-19 05:49:10 +02:00
$rawedited = $item -> get_item_tags ( SIMPLEPIE_NAMESPACE_ATOM_10 , 'updated' );
if ( $rawedited )
2011-02-02 01:50:19 +01:00
$res [ 'edited' ] = unxmlify ( $rawedited [ 0 ][ 'data' ]);
2010-07-19 05:49:10 +02:00
2011-02-02 01:50:19 +01:00
if (( x ( $res , 'edited' )) && ( ! ( x ( $res , 'created' ))))
2011-02-02 02:05:17 +01:00
$res [ 'created' ] = $res [ 'edited' ];
2011-01-25 04:36:20 +01:00
if ( ! $res [ 'created' ])
2011-02-02 01:50:19 +01:00
$res [ 'created' ] = $item -> get_date ( 'c' );
2011-01-25 04:36:20 +01:00
if ( ! $res [ 'edited' ])
2011-02-02 01:50:19 +01:00
$res [ 'edited' ] = $item -> get_date ( 'c' );
2011-01-25 04:36:20 +01:00
2011-03-15 02:34:58 +01:00
// Disallow time travelling posts
$d1 = strtotime ( $res [ 'created' ]);
$d2 = strtotime ( $res [ 'edited' ]);
$d3 = strtotime ( 'now' );
if ( $d1 > $d3 )
$res [ 'created' ] = datetime_convert ();
if ( $d2 > $d3 )
$res [ 'edited' ] = datetime_convert ();
2010-08-03 04:06:36 +02:00
$rawowner = $item -> get_item_tags ( NAMESPACE_DFRN , 'owner' );
2010-09-09 05:14:17 +02:00
if ( $rawowner [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'name' ][ 0 ][ 'data' ])
$res [ 'owner-name' ] = unxmlify ( $rawowner [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'name' ][ 0 ][ 'data' ]);
elseif ( $rawowner [ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'name' ][ 0 ][ 'data' ])
2010-08-03 04:06:36 +02:00
$res [ 'owner-name' ] = unxmlify ( $rawowner [ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'name' ][ 0 ][ 'data' ]);
2010-09-09 05:14:17 +02:00
if ( $rawowner [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'uri' ][ 0 ][ 'data' ])
$res [ 'owner-link' ] = unxmlify ( $rawowner [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'uri' ][ 0 ][ 'data' ]);
elseif ( $rawowner [ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'uri' ][ 0 ][ 'data' ])
2010-08-03 04:06:36 +02:00
$res [ 'owner-link' ] = unxmlify ( $rawowner [ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'uri' ][ 0 ][ 'data' ]);
2010-09-09 05:14:17 +02:00
2010-10-25 05:39:24 +02:00
if ( $rawowner [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ]) {
$base = $rawowner [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ];
foreach ( $base as $link ) {
2012-02-26 21:43:51 +01:00
if ( ! x ( $res , 'owner-avatar' ) || ! $res [ 'owner-avatar' ]) {
2012-07-05 23:36:00 +02:00
if ( $link [ 'attribs' ][ '' ][ 'rel' ] === 'photo' || $link [ 'attribs' ][ '' ][ 'rel' ] === 'avatar' )
2010-10-25 05:39:24 +02:00
$res [ 'owner-avatar' ] = unxmlify ( $link [ 'attribs' ][ '' ][ 'href' ]);
}
}
}
2010-07-19 05:49:10 +02:00
2010-10-20 05:52:05 +02:00
$rawgeo = $item -> get_item_tags ( NAMESPACE_GEORSS , 'point' );
if ( $rawgeo )
$res [ 'coord' ] = unxmlify ( $rawgeo [ 0 ][ 'data' ]);
2010-10-22 06:48:22 +02:00
2010-09-09 05:14:17 +02:00
$rawverb = $item -> get_item_tags ( NAMESPACE_ACTIVITY , 'verb' );
2011-01-04 11:20:00 +01:00
2010-09-09 05:14:17 +02:00
// select between supported verbs
2011-01-04 11:20:00 +01:00
if ( $rawverb ) {
2010-09-09 05:14:17 +02:00
$res [ 'verb' ] = unxmlify ( $rawverb [ 0 ][ 'data' ]);
2011-01-04 11:20:00 +01:00
}
// translate OStatus unfollow to activity streams if it happened to get selected
if (( x ( $res , 'verb' )) && ( $res [ 'verb' ] === 'http://ostatus.org/schema/1.0/unfollow' ))
$res [ 'verb' ] = ACTIVITY_UNFOLLOW ;
2011-04-06 02:41:02 +02:00
$cats = $item -> get_categories ();
if ( $cats ) {
$tag_arr = array ();
foreach ( $cats as $cat ) {
$term = $cat -> get_term ();
if ( ! $term )
$term = $cat -> get_label ();
$scheme = $cat -> get_scheme ();
if ( $scheme && $term && stristr ( $scheme , 'X-DFRN:' ))
$tag_arr [] = substr ( $scheme , 7 , 1 ) . '[url=' . unxmlify ( substr ( $scheme , 9 )) . ']' . unxmlify ( $term ) . '[/url]' ;
elseif ( $term )
2011-04-07 04:41:16 +02:00
$tag_arr [] = notags ( trim ( $term ));
2011-04-06 02:41:02 +02:00
}
$res [ 'tag' ] = implode ( ',' , $tag_arr );
}
2010-09-09 05:14:17 +02:00
2011-04-07 04:41:16 +02:00
$attach = $item -> get_enclosures ();
if ( $attach ) {
$att_arr = array ();
foreach ( $attach as $att ) {
2011-04-13 10:53:40 +02:00
$len = intval ( $att -> get_length ());
$link = str_replace ( array ( ',' , '"' ), array ( '%2D' , '%22' ), notags ( trim ( unxmlify ( $att -> get_link ()))));
$title = str_replace ( array ( ',' , '"' ), array ( '%2D' , '%22' ), notags ( trim ( unxmlify ( $att -> get_title ()))));
$type = str_replace ( array ( ',' , '"' ), array ( '%2D' , '%22' ), notags ( trim ( unxmlify ( $att -> get_type ()))));
if ( strpos ( $type , ';' ))
$type = substr ( $type , 0 , strpos ( $type , ';' ));
2011-04-07 04:41:16 +02:00
if (( ! $link ) || ( strpos ( $link , 'http' ) !== 0 ))
continue ;
if ( ! $title )
$title = ' ' ;
if ( ! $type )
$type = 'application/octet-stream' ;
2011-08-04 04:18:58 +02:00
$att_arr [] = '[attach]href="' . $link . '" length="' . $len . '" type="' . $type . '" title="' . $title . '"[/attach]' ;
2011-04-07 04:41:16 +02:00
}
$res [ 'attach' ] = implode ( ',' , $att_arr );
}
2010-09-09 05:14:17 +02:00
$rawobj = $item -> get_item_tags ( NAMESPACE_ACTIVITY , 'object' );
2010-09-17 12:10:19 +02:00
2010-09-09 05:14:17 +02:00
if ( $rawobj ) {
2010-09-17 12:10:19 +02:00
$res [ 'object' ] = '<object>' . " \n " ;
2012-04-17 13:33:50 +02:00
$child = $rawobj [ 0 ][ 'child' ];
if ( $child [ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ]) {
$res [ 'object-type' ] = $child [ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ];
$res [ 'object' ] .= '<type>' . $child [ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ] . '</type>' . " \n " ;
2010-09-17 12:10:19 +02:00
}
2012-04-17 13:33:50 +02:00
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'id' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'id' ][ 0 ][ 'data' ])
$res [ 'object' ] .= '<id>' . $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'id' ][ 0 ][ 'data' ] . '</id>' . " \n " ;
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'link' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ])
$res [ 'object' ] .= '<link>' . encode_rel_links ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ]) . '</link>' . " \n " ;
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'title' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'title' ][ 0 ][ 'data' ])
$res [ 'object' ] .= '<title>' . $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'title' ][ 0 ][ 'data' ] . '</title>' . " \n " ;
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'content' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'content' ][ 0 ][ 'data' ]) {
$body = $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'content' ][ 0 ][ 'data' ];
2010-09-17 12:10:19 +02:00
if ( ! $body )
2012-04-17 13:33:50 +02:00
$body = $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'summary' ][ 0 ][ 'data' ];
2011-01-12 22:21:37 +01:00
// preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events
$res [ 'object' ] .= '<orig>' . xmlify ( $body ) . '</orig>' . " \n " ;
2011-02-02 03:20:25 +01:00
if (( strpos ( $body , '<' ) !== false ) || ( strpos ( $body , '>' ) !== false )) {
2010-09-17 12:10:19 +02:00
2011-10-12 03:24:37 +02:00
$body = html2bb_video ( $body );
2011-05-21 00:46:41 +02:00
2010-09-17 12:10:19 +02:00
$config = HTMLPurifier_Config :: createDefault ();
2010-10-25 05:39:24 +02:00
$config -> set ( 'Cache.DefinitionImpl' , null );
2010-09-17 12:10:19 +02:00
$purifier = new HTMLPurifier ( $config );
$body = $purifier -> purify ( $body );
2011-01-18 04:50:18 +01:00
$body = html2bbcode ( $body );
2010-09-17 12:10:19 +02:00
}
$res [ 'object' ] .= '<content>' . $body . '</content>' . " \n " ;
}
$res [ 'object' ] .= '</object>' . " \n " ;
2010-09-09 05:14:17 +02:00
}
2010-11-04 00:48:21 +01:00
$rawobj = $item -> get_item_tags ( NAMESPACE_ACTIVITY , 'target' );
if ( $rawobj ) {
$res [ 'target' ] = '<target>' . " \n " ;
2012-04-17 13:33:50 +02:00
$child = $rawobj [ 0 ][ 'child' ];
if ( $child [ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ]) {
$res [ 'target' ] .= '<type>' . $child [ NAMESPACE_ACTIVITY ][ 'object-type' ][ 0 ][ 'data' ] . '</type>' . " \n " ;
2010-11-04 00:48:21 +01:00
}
2012-04-17 13:33:50 +02:00
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'id' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'id' ][ 0 ][ 'data' ])
$res [ 'target' ] .= '<id>' . $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'id' ][ 0 ][ 'data' ] . '</id>' . " \n " ;
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'link' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ])
$res [ 'target' ] .= '<link>' . encode_rel_links ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'link' ]) . '</link>' . " \n " ;
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'data' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'title' ][ 0 ][ 'data' ])
$res [ 'target' ] .= '<title>' . $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'title' ][ 0 ][ 'data' ] . '</title>' . " \n " ;
if ( x ( $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ], 'data' ) && $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'content' ][ 0 ][ 'data' ]) {
$body = $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'content' ][ 0 ][ 'data' ];
2010-11-04 00:48:21 +01:00
if ( ! $body )
2012-04-17 13:33:50 +02:00
$body = $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ 'summary' ][ 0 ][ 'data' ];
2011-01-12 22:21:37 +01:00
// preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events
2011-10-23 09:24:37 +02:00
$res [ 'target' ] .= '<orig>' . xmlify ( $body ) . '</orig>' . " \n " ;
2011-02-02 03:20:25 +01:00
if (( strpos ( $body , '<' ) !== false ) || ( strpos ( $body , '>' ) !== false )) {
2010-11-04 00:48:21 +01:00
2011-10-12 03:24:37 +02:00
$body = html2bb_video ( $body );
2011-05-21 00:46:41 +02:00
2010-11-04 00:48:21 +01:00
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$body = $purifier -> purify ( $body );
2011-01-18 04:50:18 +01:00
$body = html2bbcode ( $body );
2010-11-04 00:48:21 +01:00
}
$res [ 'target' ] .= '<content>' . $body . '</content>' . " \n " ;
}
$res [ 'target' ] .= '</target>' . " \n " ;
}
2012-07-14 19:54:27 +02:00
// This is some experimental stuff. By now retweets are shown with "RT:"
// But: There is data so that the message could be shown similar to native retweets
// There is some better way to parse this array - but it didn't worked for me.
$child = $item -> feed -> data [ " child " ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ " feed " ][ 0 ][ " child " ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ " entry " ][ 0 ][ " child " ][ " http://activitystrea.ms/spec/1.0/ " ][ object ][ 0 ][ " child " ];
if ( is_array ( $child )) {
$message = $child [ " http://activitystrea.ms/spec/1.0/ " ][ " object " ][ 0 ][ " child " ][ SIMPLEPIE_NAMESPACE_ATOM_10 ][ " content " ][ 0 ][ " data " ];
$author = $child [ SIMPLEPIE_NAMESPACE_ATOM_10 ][ " author " ][ 0 ][ " child " ][ SIMPLEPIE_NAMESPACE_ATOM_10 ];
$uri = $author [ " uri " ][ 0 ][ " data " ];
$name = $author [ " name " ][ 0 ][ " data " ];
$avatar = @ array_shift ( $author [ " link " ][ 2 ][ " attribs " ]);
$avatar = $avatar [ " href " ];
if (( $name != " " ) and ( $uri != " " ) and ( $avatar != " " ) and ( $message != " " )) {
$res [ " owner-name " ] = $res [ " author-name " ];
$res [ " owner-link " ] = $res [ " author-link " ];
$res [ " owner-avatar " ] = $res [ " author-avatar " ];
$res [ " author-name " ] = $name ;
$res [ " author-link " ] = $uri ;
$res [ " author-avatar " ] = $avatar ;
$res [ " body " ] = html2bbcode ( $message );
}
}
2010-12-26 00:01:02 +01:00
$arr = array ( 'feed' => $feed , 'item' => $item , 'result' => $res );
call_hooks ( 'parse_atom' , $arr );
2010-12-25 03:32:23 +01:00
2012-07-05 23:36:00 +02:00
//if (($res["title"] != "") or (strpos($res["body"], "RT @") > 0)) {
2012-07-14 13:59:42 +02:00
//if (strpos($res["body"], "RT @") !== false) {
// $debugfile = tempnam("/home/ike/log", "item-res2-");
// file_put_contents($debugfile, serialize($arr));
//}
2012-07-05 23:36:00 +02:00
2010-07-19 05:49:10 +02:00
return $res ;
}
2010-11-04 00:48:21 +01:00
function encode_rel_links ( $links ) {
$o = '' ;
if ( ! (( is_array ( $links )) && ( count ( $links ))))
return $o ;
foreach ( $links as $link ) {
$o .= '<link ' ;
if ( $link [ 'attribs' ][ '' ][ 'rel' ])
$o .= 'rel="' . $link [ 'attribs' ][ '' ][ 'rel' ] . '" ' ;
if ( $link [ 'attribs' ][ '' ][ 'type' ])
$o .= 'type="' . $link [ 'attribs' ][ '' ][ 'type' ] . '" ' ;
if ( $link [ 'attribs' ][ '' ][ 'href' ])
2011-01-18 01:06:22 +01:00
$o .= 'href="' . $link [ 'attribs' ][ '' ][ 'href' ] . '" ' ;
2010-11-04 08:37:29 +01:00
if ( ( x ( $link [ 'attribs' ], NAMESPACE_MEDIA )) && $link [ 'attribs' ][ NAMESPACE_MEDIA ][ 'width' ])
2010-11-04 00:48:21 +01:00
$o .= 'media:width="' . $link [ 'attribs' ][ NAMESPACE_MEDIA ][ 'width' ] . '" ' ;
2010-11-04 08:37:29 +01:00
if ( ( x ( $link [ 'attribs' ], NAMESPACE_MEDIA )) && $link [ 'attribs' ][ NAMESPACE_MEDIA ][ 'height' ])
2010-11-04 00:48:21 +01:00
$o .= 'media:height="' . $link [ 'attribs' ][ NAMESPACE_MEDIA ][ 'height' ] . '" ' ;
$o .= ' />' . " \n " ;
}
return xmlify ( $o );
}
2012-06-11 14:28:08 +02:00
2011-02-04 02:40:04 +01:00
function item_store ( $arr , $force_parent = false ) {
2010-07-19 05:49:10 +02:00
2011-08-29 04:22:27 +02:00
// If a Diaspora signature structure was passed in, pull it out of the
// item array and set it aside for later storage.
$dsprsig = null ;
if ( x ( $arr , 'dsprsig' )) {
$dsprsig = json_decode ( base64_decode ( $arr [ 'dsprsig' ]));
unset ( $arr [ 'dsprsig' ]);
}
2012-02-27 23:08:00 +01:00
if ( x ( $arr , 'gravity' ))
2010-09-10 09:42:53 +02:00
$arr [ 'gravity' ] = intval ( $arr [ 'gravity' ]);
2011-10-12 11:21:18 +02:00
elseif ( $arr [ 'parent-uri' ] === $arr [ 'uri' ])
2010-09-10 07:02:28 +02:00
$arr [ 'gravity' ] = 0 ;
2010-10-28 00:50:44 +02:00
elseif ( activity_match ( $arr [ 'verb' ], ACTIVITY_POST ))
2010-09-10 07:02:28 +02:00
$arr [ 'gravity' ] = 6 ;
2010-11-10 05:38:24 +01:00
else
$arr [ 'gravity' ] = 6 ; // extensible catchall
2010-09-10 07:02:28 +02:00
2010-07-19 05:49:10 +02:00
if ( ! x ( $arr , 'type' ))
2010-11-10 05:38:24 +01:00
$arr [ 'type' ] = 'remote' ;
2011-02-02 03:20:25 +01:00
// Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin.
if (( strpos ( $arr [ 'body' ], '<' ) !== false ) || ( strpos ( $arr [ 'body' ], '>' ) !== false ))
$arr [ 'body' ] = strip_tags ( $arr [ 'body' ]);
2012-07-12 07:45:14 +02:00
2012-07-14 00:38:02 +02:00
if ( version_compare ( PHP_VERSION , '5.3.0' , '>=' )) {
require_once ( 'Text/LanguageDetect.php' );
$naked_body = preg_replace ( '/\[(.+?)\]/' , '' , $arr [ 'body' ]);
$l = new Text_LanguageDetect ;
$lng = $l -> detectConfidence ( $naked_body );
$arr [ 'postopts' ] = (( $lng [ 'language' ]) ? 'lang=' . $lng [ 'language' ] . ';' . $lng [ 'confidence' ] : '' );
}
2011-02-02 03:20:25 +01:00
2010-11-10 05:38:24 +01:00
$arr [ 'wall' ] = (( x ( $arr , 'wall' )) ? intval ( $arr [ 'wall' ]) : 0 );
$arr [ 'uri' ] = (( x ( $arr , 'uri' )) ? notags ( trim ( $arr [ 'uri' ])) : random_string ());
2011-05-23 03:40:00 +02:00
$arr [ 'extid' ] = (( x ( $arr , 'extid' )) ? notags ( trim ( $arr [ 'extid' ])) : '' );
2010-11-10 05:38:24 +01:00
$arr [ 'author-name' ] = (( x ( $arr , 'author-name' )) ? notags ( trim ( $arr [ 'author-name' ])) : '' );
$arr [ 'author-link' ] = (( x ( $arr , 'author-link' )) ? notags ( trim ( $arr [ 'author-link' ])) : '' );
$arr [ 'author-avatar' ] = (( x ( $arr , 'author-avatar' )) ? notags ( trim ( $arr [ 'author-avatar' ])) : '' );
$arr [ 'owner-name' ] = (( x ( $arr , 'owner-name' )) ? notags ( trim ( $arr [ 'owner-name' ])) : '' );
$arr [ 'owner-link' ] = (( x ( $arr , 'owner-link' )) ? notags ( trim ( $arr [ 'owner-link' ])) : '' );
$arr [ 'owner-avatar' ] = (( x ( $arr , 'owner-avatar' )) ? notags ( trim ( $arr [ 'owner-avatar' ])) : '' );
$arr [ 'created' ] = (( x ( $arr , 'created' ) !== false ) ? datetime_convert ( 'UTC' , 'UTC' , $arr [ 'created' ]) : datetime_convert ());
$arr [ 'edited' ] = (( x ( $arr , 'edited' ) !== false ) ? datetime_convert ( 'UTC' , 'UTC' , $arr [ 'edited' ]) : datetime_convert ());
2011-09-19 04:04:11 +02:00
$arr [ 'commented' ] = datetime_convert ();
2011-06-24 02:56:59 +02:00
$arr [ 'received' ] = datetime_convert ();
2010-11-10 05:38:24 +01:00
$arr [ 'changed' ] = datetime_convert ();
$arr [ 'title' ] = (( x ( $arr , 'title' )) ? notags ( trim ( $arr [ 'title' ])) : '' );
$arr [ 'location' ] = (( x ( $arr , 'location' )) ? notags ( trim ( $arr [ 'location' ])) : '' );
$arr [ 'coord' ] = (( x ( $arr , 'coord' )) ? notags ( trim ( $arr [ 'coord' ])) : '' );
$arr [ 'last-child' ] = (( x ( $arr , 'last-child' )) ? intval ( $arr [ 'last-child' ]) : 0 );
$arr [ 'visible' ] = (( x ( $arr , 'visible' ) !== false ) ? intval ( $arr [ 'visible' ]) : 1 );
$arr [ 'deleted' ] = 0 ;
$arr [ 'parent-uri' ] = (( x ( $arr , 'parent-uri' )) ? notags ( trim ( $arr [ 'parent-uri' ])) : '' );
$arr [ 'verb' ] = (( x ( $arr , 'verb' )) ? notags ( trim ( $arr [ 'verb' ])) : '' );
$arr [ 'object-type' ] = (( x ( $arr , 'object-type' )) ? notags ( trim ( $arr [ 'object-type' ])) : '' );
$arr [ 'object' ] = (( x ( $arr , 'object' )) ? trim ( $arr [ 'object' ]) : '' );
$arr [ 'target-type' ] = (( x ( $arr , 'target-type' )) ? notags ( trim ( $arr [ 'target-type' ])) : '' );
$arr [ 'target' ] = (( x ( $arr , 'target' )) ? trim ( $arr [ 'target' ]) : '' );
2011-02-16 11:07:11 +01:00
$arr [ 'plink' ] = (( x ( $arr , 'plink' )) ? notags ( trim ( $arr [ 'plink' ])) : '' );
2010-11-12 05:32:20 +01:00
$arr [ 'allow_cid' ] = (( x ( $arr , 'allow_cid' )) ? trim ( $arr [ 'allow_cid' ]) : '' );
$arr [ 'allow_gid' ] = (( x ( $arr , 'allow_gid' )) ? trim ( $arr [ 'allow_gid' ]) : '' );
$arr [ 'deny_cid' ] = (( x ( $arr , 'deny_cid' )) ? trim ( $arr [ 'deny_cid' ]) : '' );
$arr [ 'deny_gid' ] = (( x ( $arr , 'deny_gid' )) ? trim ( $arr [ 'deny_gid' ]) : '' );
2010-12-08 05:47:53 +01:00
$arr [ 'private' ] = (( x ( $arr , 'private' )) ? intval ( $arr [ 'private' ]) : 0 );
2011-09-05 04:58:03 +02:00
$arr [ 'bookmark' ] = (( x ( $arr , 'bookmark' )) ? intval ( $arr [ 'bookmark' ]) : 0 );
2011-02-02 03:20:25 +01:00
$arr [ 'body' ] = (( x ( $arr , 'body' )) ? trim ( $arr [ 'body' ]) : '' );
2011-04-06 02:41:02 +02:00
$arr [ 'tag' ] = (( x ( $arr , 'tag' )) ? notags ( trim ( $arr [ 'tag' ])) : '' );
2011-04-07 06:59:07 +02:00
$arr [ 'attach' ] = (( x ( $arr , 'attach' )) ? notags ( trim ( $arr [ 'attach' ])) : '' );
2011-06-21 04:08:40 +02:00
$arr [ 'app' ] = (( x ( $arr , 'app' )) ? notags ( trim ( $arr [ 'app' ])) : '' );
2011-10-17 23:52:03 +02:00
$arr [ 'origin' ] = (( x ( $arr , 'origin' )) ? intval ( $arr [ 'origin' ]) : 0 );
2011-08-21 02:46:33 +02:00
$arr [ 'guid' ] = (( x ( $arr , 'guid' )) ? notags ( trim ( $arr [ 'guid' ])) : get_guid ());
2010-11-12 05:32:20 +01:00
2012-08-05 13:30:51 +02:00
$arr [ 'thr-parent' ] = $arr [ 'parent-uri' ];
2010-11-12 05:32:20 +01:00
if ( $arr [ 'parent-uri' ] === $arr [ 'uri' ]) {
$parent_id = 0 ;
2012-02-28 13:56:16 +01:00
$parent_deleted = 0 ;
2010-11-12 05:32:20 +01:00
$allow_cid = $arr [ 'allow_cid' ];
$allow_gid = $arr [ 'allow_gid' ];
$deny_cid = $arr [ 'deny_cid' ];
$deny_gid = $arr [ 'deny_gid' ];
}
else {
// find the parent and snarf the item id and ACL's
2011-03-08 23:40:33 +01:00
// and anything else we need to inherit
2010-11-12 05:32:20 +01:00
2011-10-12 11:21:18 +02:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1 " ,
2010-11-12 05:32:20 +01:00
dbesc ( $arr [ 'parent-uri' ]),
intval ( $arr [ 'uid' ])
);
if ( count ( $r )) {
2010-12-05 08:16:16 +01:00
// is the new message multi-level threaded?
// even though we don't support it now, preserve the info
// and re-attach to the conversation parent.
if ( $r [ 0 ][ 'uri' ] != $r [ 0 ][ 'parent-uri' ]) {
$arr [ 'parent-uri' ] = $r [ 0 ][ 'parent-uri' ];
2012-07-13 02:53:51 +02:00
$z = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `parent-uri` = '%s' AND `uid` = %d
2011-10-12 11:21:18 +02:00
ORDER BY `id` ASC LIMIT 1 " ,
2011-08-09 04:10:36 +02:00
dbesc ( $r [ 0 ][ 'parent-uri' ]),
dbesc ( $r [ 0 ][ 'parent-uri' ]),
intval ( $arr [ 'uid' ])
);
if ( $z && count ( $z ))
$r = $z ;
2010-12-05 08:16:16 +01:00
}
2011-02-04 13:25:53 +01:00
$parent_id = $r [ 0 ][ 'id' ];
$parent_deleted = $r [ 0 ][ 'deleted' ];
$allow_cid = $r [ 0 ][ 'allow_cid' ];
$allow_gid = $r [ 0 ][ 'allow_gid' ];
$deny_cid = $r [ 0 ][ 'deny_cid' ];
$deny_gid = $r [ 0 ][ 'deny_gid' ];
2011-03-08 23:40:33 +01:00
$arr [ 'wall' ] = $r [ 0 ][ 'wall' ];
2012-06-11 14:28:08 +02:00
// if the parent is private, force privacy for the entire conversation
// This differs from the above settings as it subtly allows comments from
// email correspondents to be private even if the overall thread is not.
if ( $r [ 0 ][ 'private' ])
2012-06-29 02:43:29 +02:00
$arr [ 'private' ] = $r [ 0 ][ 'private' ];
2012-06-11 14:28:08 +02:00
2012-06-19 02:19:56 +02:00
// Edge case. We host a public forum that was originally posted to privately.
// The original author commented, but as this is a comment, the permissions
// weren't fixed up so it will still show the comment as private unless we fix it here.
if (( intval ( $r [ 0 ][ 'forum_mode' ]) == 1 ) && ( ! $r [ 0 ][ 'private' ]))
$arr [ 'private' ] = 0 ;
2010-11-12 05:32:20 +01:00
}
else {
2011-02-04 02:40:04 +01:00
// Allow one to see reply tweets from status.net even when
// we don't have or can't see the original post.
if ( $force_parent ) {
logger ( 'item_store: $force_parent=true, reply converted to top-level post.' );
$parent_id = 0 ;
$arr [ 'parent-uri' ] = $arr [ 'uri' ];
2011-05-04 11:20:44 +02:00
$arr [ 'gravity' ] = 0 ;
2011-02-04 02:40:04 +01:00
}
else {
logger ( 'item_store: item parent was not found - ignoring item' );
return 0 ;
}
2012-02-27 23:08:00 +01:00
$parent_deleted = 0 ;
2010-11-12 05:32:20 +01:00
}
}
2010-07-19 05:49:10 +02:00
2011-10-03 15:04:17 +02:00
$r = q ( " SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $arr [ 'uri' ]),
2011-10-12 11:21:18 +02:00
intval ( $arr [ 'uid' ])
2011-10-03 15:04:17 +02:00
);
if ( $r && count ( $r )) {
logger ( 'item-store: duplicate item ignored. ' . print_r ( $arr , true ));
return 0 ;
}
2011-08-08 02:29:26 +02:00
2010-12-22 23:16:22 +01:00
call_hooks ( 'post_remote' , $arr );
2012-01-31 05:49:54 +01:00
if ( x ( $arr , 'cancel' )) {
logger ( 'item_store: post cancelled by plugin.' );
return 0 ;
}
2010-07-19 05:49:10 +02:00
dbesc_array ( $arr );
2010-08-20 23:33:15 +02:00
2010-11-04 03:47:07 +01:00
logger ( 'item_store: ' . print_r ( $arr , true ), LOGGER_DATA );
2010-11-10 00:11:47 +01:00
$r = dbq ( " INSERT INTO `item` (` "
2010-07-19 05:49:10 +02:00
. implode ( " `, ` " , array_keys ( $arr ))
. " `) VALUES (' "
. implode ( " ', ' " , array_values ( $arr ))
. " ') " );
2010-11-12 05:32:20 +01:00
// find the item we just created
2010-07-19 05:49:10 +02:00
2011-10-15 12:26:37 +02:00
$r = q ( " SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC " ,
2010-09-09 05:14:17 +02:00
$arr [ 'uri' ], // already dbesc'd
2010-07-19 05:49:10 +02:00
intval ( $arr [ 'uid' ])
);
2011-05-30 07:50:36 +02:00
2010-11-04 03:47:07 +01:00
if ( count ( $r )) {
2010-07-19 05:49:10 +02:00
$current_post = $r [ 0 ][ 'id' ];
2010-11-04 03:47:07 +01:00
logger ( 'item_store: created item ' . $current_post );
}
2010-11-12 05:32:20 +01:00
else {
logger ( 'item_store: could not locate created item' );
2010-09-09 05:14:17 +02:00
return 0 ;
}
2011-10-12 11:21:18 +02:00
if ( count ( $r ) > 1 ) {
logger ( 'item_store: duplicated post occurred. Removing duplicates.' );
q ( " DELETE FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `id` != %d " ,
$arr [ 'uri' ],
intval ( $arr [ 'uid' ]),
intval ( $current_post )
);
}
2010-07-19 05:49:10 +02:00
2011-02-04 22:37:04 +01:00
if (( ! $parent_id ) || ( $arr [ 'parent-uri' ] === $arr [ 'uri' ]))
2010-11-12 05:32:20 +01:00
$parent_id = $current_post ;
2011-02-04 22:37:04 +01:00
if ( strlen ( $allow_cid ) || strlen ( $allow_gid ) || strlen ( $deny_cid ) || strlen ( $deny_gid ))
2010-12-08 05:47:53 +01:00
$private = 1 ;
else
$private = $arr [ 'private' ];
2010-11-12 05:32:20 +01:00
// Set parent id - and also make sure to inherit the parent's ACL's.
2010-09-29 07:32:48 +02:00
$r = q ( " UPDATE `item` SET `parent` = %d, `allow_cid` = '%s', `allow_gid` = '%s',
2011-02-04 22:40:51 +01:00
`deny_cid` = '%s' , `deny_gid` = '%s' , `private` = % d , `deleted` = % d WHERE `id` = % d LIMIT 1 " ,
2010-07-19 05:49:10 +02:00
intval ( $parent_id ),
2010-09-29 07:32:48 +02:00
dbesc ( $allow_cid ),
dbesc ( $allow_gid ),
dbesc ( $deny_cid ),
dbesc ( $deny_gid ),
2010-12-08 05:47:53 +01:00
intval ( $private ),
2011-02-04 13:25:53 +01:00
intval ( $parent_deleted ),
2010-07-19 05:49:10 +02:00
intval ( $current_post )
);
2012-06-12 07:09:50 +02:00
$arr [ 'id' ] = $current_post ;
$arr [ 'parent' ] = $parent_id ;
$arr [ 'allow_cid' ] = $allow_cid ;
$arr [ 'allow_gid' ] = $allow_gid ;
$arr [ 'deny_cid' ] = $deny_cid ;
$arr [ 'deny_gid' ] = $deny_gid ;
$arr [ 'private' ] = $private ;
$arr [ 'deleted' ] = $parent_deleted ;
call_hooks ( 'post_remote_end' , $arr );
2011-09-19 04:04:11 +02:00
// update the commented timestamp on the parent
2011-09-16 15:49:24 +02:00
2011-09-19 04:04:11 +02:00
q ( " UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
2011-09-16 15:49:24 +02:00
dbesc ( datetime_convert ()),
intval ( $parent_id )
);
2011-08-29 04:22:27 +02:00
if ( $dsprsig ) {
q ( " insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') " ,
intval ( $current_post ),
dbesc ( $dsprsig -> signed_text ),
dbesc ( $dsprsig -> signature ),
dbesc ( $dsprsig -> signer )
);
}
2011-03-15 02:34:58 +01:00
/**
* If this is now the last - child , force all _other_ children of this parent to * not * be last - child
*/
if ( $arr [ 'last-child' ]) {
$r = q ( " UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d " ,
dbesc ( $arr [ 'uri' ]),
intval ( $arr [ 'uid' ]),
intval ( $current_post )
);
}
2012-02-10 06:18:50 +01:00
tag_deliver ( $arr [ 'uid' ], $current_post );
2011-11-16 05:30:34 +01:00
2010-07-19 05:49:10 +02:00
return $current_post ;
}
2010-09-27 01:30:21 +02:00
function get_item_contact ( $item , $contacts ) {
if ( ! count ( $contacts ) || ( ! is_array ( $item )))
return false ;
foreach ( $contacts as $contact ) {
if ( $contact [ 'id' ] == $item [ 'contact-id' ]) {
return $contact ;
break ; // NOTREACHED
}
}
return false ;
}
2012-02-10 06:18:50 +01:00
function tag_deliver ( $uid , $item_id ) {
2011-11-16 05:30:34 +01:00
2012-02-10 06:18:50 +01:00
// look for mention tags and setup a second delivery chain for forum/community posts if appropriate
2011-11-19 07:20:08 +01:00
2011-11-16 05:30:34 +01:00
$a = get_app ();
2012-02-10 06:18:50 +01:00
$mention = false ;
2011-11-16 05:30:34 +01:00
2012-05-07 08:06:21 +02:00
$u = q ( " select * from user where uid = %d limit 1 " ,
2012-02-10 06:18:50 +01:00
intval ( $uid )
2011-11-16 05:30:34 +01:00
);
if ( ! count ( $u ))
return ;
2012-02-10 06:18:50 +01:00
$community_page = (( $u [ 0 ][ 'page-flags' ] == PAGE_COMMUNITY ) ? true : false );
2012-05-18 04:35:24 +02:00
$prvgroup = (( $u [ 0 ][ 'page-flags' ] == PAGE_PRVGROUP ) ? true : false );
2012-02-10 06:18:50 +01:00
2011-11-19 12:13:46 +01:00
$i = q ( " select * from item where id = %d and uid = %d limit 1 " ,
2011-11-16 05:30:34 +01:00
intval ( $item_id ),
intval ( $uid )
);
if ( ! count ( $i ))
return ;
$item = $i [ 0 ];
$link = normalise_link ( $a -> get_baseurl () . '/profile/' . $u [ 0 ][ 'nickname' ]);
2012-01-04 22:50:12 +01:00
// Diaspora uses their own hardwired link URL in @-tags
// instead of the one we supply with webfinger
$dlink = normalise_link ( $a -> get_baseurl () . '/u/' . $u [ 0 ][ 'nickname' ]);
2012-01-03 23:27:00 +01:00
$cnt = preg_match_all ( '/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism' , $item [ 'body' ], $matches , PREG_SET_ORDER );
2011-11-16 05:30:34 +01:00
if ( $cnt ) {
foreach ( $matches as $mtch ) {
2012-01-04 22:50:12 +01:00
if ( link_compare ( $link , $mtch [ 1 ]) || link_compare ( $dlink , $mtch [ 1 ])) {
2012-02-10 06:18:50 +01:00
$mention = true ;
logger ( 'tag_deliver: mention found: ' . $mtch [ 2 ]);
2011-11-16 05:30:34 +01:00
}
}
}
2012-05-18 07:44:52 +02:00
if ( ! $mention )
2011-11-16 05:30:34 +01:00
return ;
2012-05-18 07:44:52 +02:00
// send a notification
2012-09-13 02:19:26 +02:00
// use a local photo if we have one
2012-09-27 03:24:19 +02:00
$r = q ( " select * from contact where uid = %d and nurl = '%s' limit 1 " ,
2012-09-13 02:19:26 +02:00
intval ( $u [ 0 ][ 'uid' ]),
dbesc ( normalise_link ( $item [ 'author-link' ]))
);
$photo = (( $r && count ( $r )) ? $r [ 0 ][ 'thumb' ] : $item [ 'author-avatar' ]);
2012-05-18 07:44:52 +02:00
require_once ( 'include/enotify.php' );
notification ( array (
'type' => NOTIFY_TAGSELF ,
'notify_flags' => $u [ 0 ][ 'notify-flags' ],
'language' => $u [ 0 ][ 'language' ],
'to_name' => $u [ 0 ][ 'username' ],
'to_email' => $u [ 0 ][ 'email' ],
'uid' => $u [ 0 ][ 'uid' ],
'item' => $item ,
'link' => $a -> get_baseurl () . '/display/' . $u [ 0 ][ 'nickname' ] . '/' . $item [ 'id' ],
'source_name' => $item [ 'author-name' ],
'source_link' => $item [ 'author-link' ],
2012-09-13 02:19:26 +02:00
'source_photo' => $photo ,
2012-05-18 07:44:52 +02:00
'verb' => ACTIVITY_TAG ,
'otype' => 'item'
));
2012-05-18 04:35:24 +02:00
2012-09-27 03:24:19 +02:00
$arr = array ( 'item' => $item , 'user' => $u [ 0 ], 'contact' => $r [ 0 ]);
call_hooks ( 'tagged' , $arr );
2012-05-22 12:55:11 +02:00
if (( ! $community_page ) && ( ! $prvgroup ))
2012-05-18 07:44:52 +02:00
return ;
2012-05-18 04:35:24 +02:00
2011-11-19 07:20:08 +01:00
2012-02-10 09:08:23 +01:00
// tgroup delivery - setup a second delivery chain
// prevent delivery looping - only proceed
// if the message originated elsewhere and is a top-level post
2011-11-19 07:20:08 +01:00
2012-02-10 09:08:23 +01:00
if (( $item [ 'wall' ]) || ( $item [ 'origin' ]) || ( $item [ 'id' ] != $item [ 'parent' ]))
return ;
2011-11-16 05:30:34 +01:00
2012-02-10 09:08:23 +01:00
// now change this copy of the post to a forum head message and deliver to all the tgroup members
2011-11-16 05:30:34 +01:00
2012-02-10 06:18:50 +01:00
2012-02-17 03:29:09 +01:00
$c = q ( " select name, url, thumb from contact where self = 1 and uid = %d limit 1 " ,
intval ( $u [ 0 ][ 'uid' ])
);
if ( ! count ( $c ))
return ;
2012-05-07 08:06:21 +02:00
// also reset all the privacy bits to the forum default permissions
$private = ( $u [ 0 ][ 'allow_cid' ] || $u [ 0 ][ 'allow_gid' ] || $u [ 0 ][ 'deny_cid' ] || $u [ 0 ][ 'deny_gid' ]) ? 1 : 0 ;
2012-05-18 07:44:52 +02:00
$forum_mode = (( $prvgroup ) ? 2 : 1 );
q ( " update item set wall = 1, origin = 1, forum_mode = %d, `owner-name` = '%s', `owner-link` = '%s', `owner-avatar` = '%s',
2012-05-07 08:06:21 +02:00
`private` = % d , `allow_cid` = '%s' , `allow_gid` = '%s' , `deny_cid` = '%s' , `deny_gid` = '%s' where id = % d limit 1 " ,
2012-05-18 07:44:52 +02:00
intval ( $forum_mode ),
2012-02-17 03:29:09 +01:00
dbesc ( $c [ 0 ][ 'name' ]),
dbesc ( $c [ 0 ][ 'url' ]),
dbesc ( $c [ 0 ][ 'thumb' ]),
2012-05-07 08:06:21 +02:00
intval ( $private ),
dbesc ( $u [ 0 ][ 'allow_cid' ]),
dbesc ( $u [ 0 ][ 'allow_gid' ]),
dbesc ( $u [ 0 ][ 'deny_cid' ]),
dbesc ( $u [ 0 ][ 'deny_gid' ]),
2012-02-10 09:08:23 +01:00
intval ( $item_id )
);
proc_run ( 'php' , 'include/notifier.php' , 'tgroup' , $item_id );
2011-11-16 05:30:34 +01:00
}
2012-09-13 03:53:20 +02:00
function tgroup_check ( $uid , $item ) {
$a = get_app ();
$mention = false ;
// check that the message originated elsewhere and is a top-level post
if (( $item [ 'wall' ]) || ( $item [ 'origin' ]) || ( $item [ 'uri' ] != $item [ 'parent-uri' ]))
return false ;
$u = q ( " select * from user where uid = %d limit 1 " ,
intval ( $uid )
);
if ( ! count ( $u ))
return false ;
$community_page = (( $u [ 0 ][ 'page-flags' ] == PAGE_COMMUNITY ) ? true : false );
$prvgroup = (( $u [ 0 ][ 'page-flags' ] == PAGE_PRVGROUP ) ? true : false );
$link = normalise_link ( $a -> get_baseurl () . '/profile/' . $u [ 0 ][ 'nickname' ]);
// Diaspora uses their own hardwired link URL in @-tags
// instead of the one we supply with webfinger
$dlink = normalise_link ( $a -> get_baseurl () . '/u/' . $u [ 0 ][ 'nickname' ]);
$cnt = preg_match_all ( '/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism' , $item [ 'body' ], $matches , PREG_SET_ORDER );
if ( $cnt ) {
foreach ( $matches as $mtch ) {
if ( link_compare ( $link , $mtch [ 1 ]) || link_compare ( $dlink , $mtch [ 1 ])) {
$mention = true ;
logger ( 'tgroup_check: mention found: ' . $mtch [ 2 ]);
}
}
}
if ( ! $mention )
return false ;
if (( ! $community_page ) && ( ! $prvgroup ))
return false ;
return true ;
}
2011-11-16 05:30:34 +01:00
2011-01-25 12:57:10 +01:00
function dfrn_deliver ( $owner , $contact , $atom , $dissolve = false ) {
2010-09-27 01:30:21 +02:00
2010-11-26 00:03:59 +01:00
$a = get_app ();
2010-09-27 01:30:21 +02:00
$idtosend = $orig_id = (( $contact [ 'dfrn-id' ]) ? $contact [ 'dfrn-id' ] : $contact [ 'issued-id' ]);
if ( $contact [ 'duplex' ] && $contact [ 'dfrn-id' ])
$idtosend = '0:' . $orig_id ;
if ( $contact [ 'duplex' ] && $contact [ 'issued-id' ])
$idtosend = '1:' . $orig_id ;
2010-12-01 03:32:34 +01:00
$rino = (( function_exists ( 'mcrypt_encrypt' )) ? 1 : 0 );
$rino_enable = get_config ( 'system' , 'rino_encrypt' );
if ( ! $rino_enable )
$rino = 0 ;
2012-03-15 04:36:23 +01:00
$ssl_val = intval ( get_config ( 'system' , 'ssl_policy' ));
$ssl_policy = '' ;
2012-03-16 00:38:26 +01:00
2012-03-15 04:36:23 +01:00
switch ( $ssl_val ){
case SSL_POLICY_FULL :
$ssl_policy = 'full' ;
break ;
case SSL_POLICY_SELFSIGN :
$ssl_policy = 'self' ;
break ;
case SSL_POLICY_NONE :
default :
$ssl_policy = 'none' ;
break ;
}
2011-03-31 00:04:18 +02:00
$url = $contact [ 'notify' ] . '&dfrn_id=' . $idtosend . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . (( $rino ) ? '&rino=1' : '' );
2010-09-27 01:30:21 +02:00
2010-11-01 04:36:59 +01:00
logger ( 'dfrn_deliver: ' . $url );
2010-09-27 01:30:21 +02:00
$xml = fetch_url ( $url );
2010-11-26 00:03:59 +01:00
$curl_stat = $a -> get_curl_code ();
if ( ! $curl_stat )
return ( - 1 ); // timed out
2011-08-29 06:41:42 +02:00
logger ( 'dfrn_deliver: ' . $xml , LOGGER_DATA );
2010-09-27 01:30:21 +02:00
if ( ! $xml )
return 3 ;
2011-02-03 04:28:40 +01:00
if ( strpos ( $xml , '<?xml' ) === false ) {
logger ( 'dfrn_deliver: no valid XML returned' );
logger ( 'dfrn_deliver: returned XML: ' . $xml , LOGGER_DATA );
return 3 ;
}
2011-04-05 04:36:18 +02:00
$res = parse_xml_string ( $xml );
2010-09-27 01:30:21 +02:00
if (( intval ( $res -> status ) != 0 ) || ( ! strlen ( $res -> challenge )) || ( ! strlen ( $res -> dfrn_id )))
return (( $res -> status ) ? $res -> status : 3 );
$postvars = array ();
2011-01-18 06:08:16 +01:00
$sent_dfrn_id = hex2bin (( string ) $res -> dfrn_id );
$challenge = hex2bin (( string ) $res -> challenge );
2012-03-29 02:21:56 +02:00
$perm = (( $res -> perm ) ? $res -> perm : null );
2011-02-02 06:21:47 +01:00
$dfrn_version = ( float ) (( $res -> dfrn_version ) ? $res -> dfrn_version : 2.0 );
2010-12-01 03:32:34 +01:00
$rino_allowed = (( intval ( $res -> rino ) === 1 ) ? 1 : 0 );
2012-03-16 00:38:26 +01:00
$page = (( $owner [ 'page-flags' ] == PAGE_COMMUNITY ) ? 1 : 0 );
2010-09-27 01:30:21 +02:00
2012-05-30 07:57:15 +02:00
if ( $owner [ 'page-flags' ] == PAGE_PRVGROUP )
$page = 2 ;
2010-09-27 01:30:21 +02:00
$final_dfrn_id = '' ;
2012-03-29 02:21:56 +02:00
if ( $perm ) {
if ((( $perm == 'rw' ) && ( ! intval ( $contact [ 'writable' ])))
|| (( $perm == 'r' ) && ( intval ( $contact [ 'writable' ])))) {
q ( " update contact set writable = %d where id = %d limit 1 " ,
intval (( $perm == 'rw' ) ? 1 : 0 ),
intval ( $contact [ 'id' ])
);
$contact [ 'writable' ] = ( string ) 1 - intval ( $contact [ 'writable' ]);
}
}
2011-02-02 07:45:46 +01:00
2012-02-17 03:29:09 +01:00
if (( $contact [ 'duplex' ] && strlen ( $contact [ 'pubkey' ]))
|| ( $owner [ 'page-flags' ] == PAGE_COMMUNITY && strlen ( $contact [ 'pubkey' ]))
|| ( $contact [ 'rel' ] == CONTACT_IS_SHARING && strlen ( $contact [ 'pubkey' ]))) {
2011-02-02 07:45:46 +01:00
openssl_public_decrypt ( $sent_dfrn_id , $final_dfrn_id , $contact [ 'pubkey' ]);
openssl_public_decrypt ( $challenge , $postvars [ 'challenge' ], $contact [ 'pubkey' ]);
2010-09-27 01:30:21 +02:00
}
else {
2011-02-02 07:45:46 +01:00
openssl_private_decrypt ( $sent_dfrn_id , $final_dfrn_id , $contact [ 'prvkey' ]);
openssl_private_decrypt ( $challenge , $postvars [ 'challenge' ], $contact [ 'prvkey' ]);
2010-09-27 01:30:21 +02:00
}
$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 ) {
2010-11-01 04:36:59 +01:00
logger ( 'dfrn_deliver: wrong dfrn_id.' );
2010-09-27 01:30:21 +02:00
// did not decode properly - cannot trust this site
return 3 ;
}
2010-10-13 05:29:04 +02:00
$postvars [ 'dfrn_id' ] = $idtosend ;
$postvars [ 'dfrn_version' ] = DFRN_PROTOCOL_VERSION ;
2011-01-25 12:57:10 +01:00
if ( $dissolve )
$postvars [ 'dissolve' ] = '1' ;
2010-09-27 01:30:21 +02:00
2011-04-11 03:38:55 +02:00
2011-08-08 01:15:54 +02:00
if ((( $contact [ 'rel' ]) && ( $contact [ 'rel' ] != CONTACT_IS_SHARING ) && ( ! $contact [ 'blocked' ])) || ( $owner [ 'page-flags' ] == PAGE_COMMUNITY )) {
2010-10-18 12:02:51 +02:00
$postvars [ 'data' ] = $atom ;
2011-04-11 03:38:55 +02:00
$postvars [ 'perm' ] = 'rw' ;
2010-10-18 12:02:51 +02:00
}
2010-09-27 01:30:21 +02:00
else {
$postvars [ 'data' ] = str_replace ( '<dfrn:comment-allow>1' , '<dfrn:comment-allow>0' , $atom );
2011-04-11 03:38:55 +02:00
$postvars [ 'perm' ] = 'r' ;
2010-09-27 01:30:21 +02:00
}
2012-03-15 04:36:23 +01:00
$postvars [ 'ssl_policy' ] = $ssl_policy ;
2012-03-16 00:38:26 +01:00
if ( $page )
2012-05-30 07:57:15 +02:00
$postvars [ 'page' ] = $page ;
2012-03-16 00:38:26 +01:00
2011-01-25 12:57:10 +01:00
if ( $rino && $rino_allowed && ( ! $dissolve )) {
2010-12-01 03:32:34 +01:00
$key = substr ( random_string (), 0 , 16 );
$data = bin2hex ( aes_encrypt ( $postvars [ 'data' ], $key ));
$postvars [ 'data' ] = $data ;
2011-08-29 06:41:42 +02:00
logger ( 'rino: sent key = ' . $key , LOGGER_DEBUG );
2010-12-01 03:32:34 +01:00
2011-02-02 06:21:47 +01:00
2011-02-02 07:45:46 +01:00
if ( $dfrn_version >= 2.1 ) {
2012-02-17 03:29:09 +01:00
if (( $contact [ 'duplex' ] && strlen ( $contact [ 'pubkey' ]))
|| ( $owner [ 'page-flags' ] == PAGE_COMMUNITY && strlen ( $contact [ 'pubkey' ]))
|| ( $contact [ 'rel' ] == CONTACT_IS_SHARING && strlen ( $contact [ 'pubkey' ]))) {
2011-02-02 07:45:46 +01:00
openssl_public_encrypt ( $key , $postvars [ 'key' ], $contact [ 'pubkey' ]);
}
else {
openssl_private_encrypt ( $key , $postvars [ 'key' ], $contact [ 'prvkey' ]);
}
2010-12-01 03:32:34 +01:00
}
else {
2011-02-02 07:45:46 +01:00
if (( $contact [ 'duplex' ] && strlen ( $contact [ 'prvkey' ])) || ( $owner [ 'page-flags' ] == PAGE_COMMUNITY )) {
openssl_private_encrypt ( $key , $postvars [ 'key' ], $contact [ 'prvkey' ]);
}
else {
openssl_public_encrypt ( $key , $postvars [ 'key' ], $contact [ 'pubkey' ]);
}
2010-12-01 03:32:34 +01:00
}
logger ( 'md5 rawkey ' . md5 ( $postvars [ 'key' ]));
$postvars [ 'key' ] = bin2hex ( $postvars [ 'key' ]);
}
logger ( 'dfrn_deliver: ' . " SENDING: " . print_r ( $postvars , true ), LOGGER_DATA );
2010-09-27 01:30:21 +02:00
$xml = post_url ( $contact [ 'notify' ], $postvars );
2010-12-01 03:32:34 +01:00
logger ( 'dfrn_deliver: ' . " RECEIVED: " . $xml , LOGGER_DATA );
2010-11-22 08:00:01 +01:00
2010-11-26 00:03:59 +01:00
$curl_stat = $a -> get_curl_code ();
if (( ! $curl_stat ) || ( ! strlen ( $xml )))
return ( - 1 ); // timed out
2010-09-27 01:30:21 +02:00
2011-09-28 04:27:47 +02:00
if (( $curl_stat == 503 ) && ( stristr ( $a -> get_curl_headers (), 'retry-after' )))
return ( - 1 );
2011-02-03 13:19:05 +01:00
if ( strpos ( $xml , '<?xml' ) === false ) {
logger ( 'dfrn_deliver: phase 2: no valid XML returned' );
logger ( 'dfrn_deliver: phase 2: returned XML: ' . $xml , LOGGER_DATA );
return 3 ;
}
2012-06-20 05:59:22 +02:00
if ( $contact [ 'term-date' ] != '0000-00-00 00:00:00' ) {
logger ( " dfrn_deliver: $url back from the dead - removing mark for death " );
2012-06-21 01:35:49 +02:00
require_once ( 'include/Contact.php' );
2012-06-20 05:59:22 +02:00
unmark_for_death ( $contact );
}
2011-04-05 04:36:18 +02:00
$res = parse_xml_string ( $xml );
2010-09-27 01:30:21 +02:00
2011-04-11 03:38:55 +02:00
return $res -> status ;
2010-09-27 01:30:21 +02:00
}
2010-10-01 04:41:22 +02:00
2011-02-08 06:16:39 +01:00
/**
2010-10-22 06:48:22 +02:00
*
* consume_feed - process atom feed and update anything / everything we might need to update
*
2011-02-08 06:16:39 +01:00
* $xml = the ( atom ) feed to consume - RSS isn ' t as fully supported but may work for simple feeds .
*
2010-10-22 06:48:22 +02:00
* $importer = the contact_record ( joined to user_record ) of the local user who owns this relationship .
* It is this person ' s stuff that is going to be updated .
* $contact = the person who is sending us stuff . If not set , we MAY be processing a " follow " activity
* from an external network and MAY create an appropriate contact record . Otherwise , we MUST
* have a contact record .
2010-12-01 22:39:00 +01:00
* $hub = should we find a hub declation in the feed , pass it back to our calling process , who might ( or
2010-10-22 06:48:22 +02:00
* might not ) try and subscribe to it .
2011-10-04 13:38:58 +02:00
* $datedir sorts in reverse order
* $pass - by default ( $pass = 0 ) we cannot guarantee that a parent item has been
* imported prior to its children being seen in the stream unless we are certain
* of how the feed is arranged / ordered .
* With $pass = 1 , we only pull parent items out of the stream .
* With $pass = 2 , we only pull children ( comments / likes ) .
2010-10-22 06:48:22 +02:00
*
2011-10-04 13:38:58 +02:00
* So running this twice , first with pass 1 and then with pass 2 will do the right
* thing regardless of feed ordering . This won ' t be adequate in a fully - threaded
* model where comments can have sub - threads . That would require some massive sorting
* to get all the feed items into a mostly linear ordering , and might still require
* recursion .
2010-10-22 06:48:22 +02:00
*/
2011-10-04 12:06:34 +02:00
function consume_feed ( $xml , $importer , & $contact , & $hub , $datedir = 0 , $pass = 0 ) {
2010-10-01 04:41:22 +02:00
2011-06-29 06:11:52 +02:00
require_once ( 'library/simplepie/simplepie.inc' );
2010-10-01 04:41:22 +02:00
2011-08-04 06:05:39 +02:00
if ( ! strlen ( $xml )) {
logger ( 'consume_feed: empty input' );
return ;
}
2010-10-01 04:41:22 +02:00
$feed = new SimplePie ();
$feed -> set_raw_data ( $xml );
2010-11-08 10:11:50 +01:00
if ( $datedir )
$feed -> enable_order_by_date ( true );
else
$feed -> enable_order_by_date ( false );
2010-10-01 04:41:22 +02:00
$feed -> init ();
2011-01-31 04:38:03 +01:00
if ( $feed -> error ())
logger ( 'consume_feed: Error parsing XML: ' . $feed -> error ());
2011-04-05 04:36:18 +02:00
$permalink = $feed -> get_permalink ();
2011-01-31 04:38:03 +01:00
2010-10-01 04:41:22 +02:00
// Check at the feed level for updated contact name and/or photo
$name_updated = '' ;
$new_name = '' ;
$photo_timestamp = '' ;
$photo_url = '' ;
2011-01-14 00:45:42 +01:00
$birthday = '' ;
2010-10-01 06:38:45 +02:00
2010-10-15 13:20:42 +02:00
$hubs = $feed -> get_links ( 'hub' );
2012-06-08 04:53:39 +02:00
logger ( 'consume_feed: hubs: ' . print_r ( $hubs , true ), LOGGER_DATA );
2010-10-01 06:38:45 +02:00
2010-10-15 13:20:42 +02:00
if ( count ( $hubs ))
$hub = implode ( ',' , $hubs );
2010-10-01 06:38:45 +02:00
2011-08-13 06:01:51 +02:00
$rawtags = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'owner' );
if ( ! $rawtags )
$rawtags = $feed -> get_feed_tags ( SIMPLEPIE_NAMESPACE_ATOM_10 , 'author' );
2010-10-01 04:41:22 +02:00
if ( $rawtags ) {
$elems = $rawtags [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ];
if ( $elems [ 'name' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ]) {
$name_updated = $elems [ 'name' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ];
$new_name = $elems [ 'name' ][ 0 ][ 'data' ];
}
2010-11-08 06:07:47 +01:00
if (( x ( $elems , 'link' )) && ( $elems [ 'link' ][ 0 ][ 'attribs' ][ '' ][ 'rel' ] === 'photo' ) && ( $elems [ 'link' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ])) {
2010-10-01 04:41:22 +02:00
$photo_timestamp = datetime_convert ( 'UTC' , 'UTC' , $elems [ 'link' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ]);
$photo_url = $elems [ 'link' ][ 0 ][ 'attribs' ][ '' ][ 'href' ];
}
2011-01-14 00:45:42 +01:00
if (( x ( $rawtags [ 0 ][ 'child' ], NAMESPACE_DFRN )) && ( x ( $rawtags [ 0 ][ 'child' ][ NAMESPACE_DFRN ], 'birthday' ))) {
$birthday = datetime_convert ( 'UTC' , 'UTC' , $rawtags [ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'birthday' ][ 0 ][ 'data' ]);
}
2010-10-01 04:41:22 +02:00
}
2010-11-10 03:24:35 +01:00
if (( is_array ( $contact )) && ( $photo_timestamp ) && ( strlen ( $photo_url )) && ( $photo_timestamp > $contact [ 'avatar-date' ])) {
2011-01-14 00:45:42 +01:00
logger ( 'consume_feed: Updating photo for ' . $contact [ 'name' ]);
2010-10-01 04:41:22 +02:00
require_once ( " Photo.php " );
$photo_failure = false ;
2010-11-10 03:24:35 +01:00
$have_photo = false ;
2010-10-01 04:41:22 +02:00
$r = q ( " SELECT `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $contact [ 'id' ]),
intval ( $contact [ 'uid' ])
);
if ( count ( $r )) {
$resource_id = $r [ 0 ][ 'resource-id' ];
2010-11-10 03:24:35 +01:00
$have_photo = true ;
}
else {
$resource_id = photo_new_resource ();
}
$img_str = fetch_url ( $photo_url , true );
2012-06-07 17:42:13 +02:00
// guess mimetype from headers or filename
$type = guess_image_type ( $photo_url , true );
$img = new Photo ( $img_str , $type );
2010-11-10 03:24:35 +01:00
if ( $img -> is_valid ()) {
if ( $have_photo ) {
q ( " DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d " ,
2010-10-01 04:41:22 +02:00
dbesc ( $resource_id ),
intval ( $contact [ 'id' ]),
intval ( $contact [ 'uid' ])
);
2010-11-10 03:24:35 +01:00
}
2010-10-01 04:41:22 +02:00
2010-11-10 03:24:35 +01:00
$img -> scaleImageSquare ( 175 );
2010-10-01 04:41:22 +02:00
2010-11-10 03:24:35 +01:00
$hash = $resource_id ;
2011-06-29 07:33:02 +02:00
$r = $img -> store ( $contact [ 'uid' ], $contact [ 'id' ], $hash , basename ( $photo_url ), 'Contact Photos' , 4 );
2010-11-10 03:24:35 +01:00
$img -> scaleImage ( 80 );
2011-06-29 07:33:02 +02:00
$r = $img -> store ( $contact [ 'uid' ], $contact [ 'id' ], $hash , basename ( $photo_url ), 'Contact Photos' , 5 );
2010-11-10 03:24:35 +01:00
$img -> scaleImage ( 48 );
2011-06-29 07:33:02 +02:00
$r = $img -> store ( $contact [ 'uid' ], $contact [ 'id' ], $hash , basename ( $photo_url ), 'Contact Photos' , 6 );
2010-11-10 03:24:35 +01:00
$a = get_app ();
q ( " UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
WHERE `uid` = % d AND `id` = % d LIMIT 1 " ,
dbesc ( datetime_convert ()),
2012-06-07 17:42:13 +02:00
dbesc ( $a -> get_baseurl () . '/photo/' . $hash . '-4.' . $img -> getExt ()),
dbesc ( $a -> get_baseurl () . '/photo/' . $hash . '-5.' . $img -> getExt ()),
dbesc ( $a -> get_baseurl () . '/photo/' . $hash . '-6.' . $img -> getExt ()),
2010-11-10 03:24:35 +01:00
intval ( $contact [ 'uid' ]),
intval ( $contact [ 'id' ])
);
2010-10-01 04:41:22 +02:00
}
}
2010-10-22 06:48:22 +02:00
if (( is_array ( $contact )) && ( $name_updated ) && ( strlen ( $new_name )) && ( $name_updated > $contact [ 'name-date' ])) {
2012-02-25 05:40:09 +01:00
$r = q ( " select * from contact where uid = %d and id = %d limit 1 " ,
intval ( $contact [ 'uid' ]),
intval ( $contact [ 'id' ])
);
$x = q ( " UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
2010-10-01 04:41:22 +02:00
dbesc ( notags ( trim ( $new_name ))),
dbesc ( datetime_convert ()),
intval ( $contact [ 'uid' ]),
intval ( $contact [ 'id' ])
);
2012-02-25 05:40:09 +01:00
// do our best to update the name on content items
if ( count ( $r )) {
q ( " update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d " ,
dbesc ( notags ( trim ( $new_name ))),
dbesc ( $r [ 0 ][ 'name' ]),
dbesc ( $r [ 0 ][ 'url' ]),
intval ( $contact [ 'uid' ])
);
}
2010-10-01 04:41:22 +02:00
}
2011-01-14 00:45:42 +01:00
if ( strlen ( $birthday )) {
if ( substr ( $birthday , 0 , 4 ) != $contact [ 'bdyear' ]) {
logger ( 'consume_feed: updating birthday: ' . $birthday );
/**
*
* Add new birthday event for this person
*
* $bdtext is just a readable placeholder in case the event is shared
* with others . We will replace it during presentation to our $importer
* to contain a sparkle link and perhaps a photo .
*
*/
2012-06-26 06:37:38 +02:00
$bdtext = sprintf ( t ( '%s\'s birthday' ), $contact [ 'name' ]);
2012-06-26 06:39:07 +02:00
$bdtext2 = sprintf ( t ( 'Happy Birthday %s' ), ' [url=' . $contact [ 'url' ] . ']' . $contact [ 'name' ] . '[/url]' ) ;
2011-01-14 00:45:42 +01:00
2012-06-26 06:37:38 +02:00
$r = q ( " INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`)
VALUES ( % d , % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' ) " ,
2011-01-14 00:45:42 +01:00
intval ( $contact [ 'uid' ]),
intval ( $contact [ 'id' ]),
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $birthday )),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $birthday . ' + 1 day ' )),
dbesc ( $bdtext ),
2012-06-26 06:37:38 +02:00
dbesc ( $bdtext2 ),
2011-01-14 00:45:42 +01:00
dbesc ( 'birthday' )
);
// update bdyear
q ( " UPDATE `contact` SET `bdyear` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
dbesc ( substr ( $birthday , 0 , 4 )),
intval ( $contact [ 'uid' ]),
intval ( $contact [ 'id' ])
);
// This function is called twice without reloading the contact
// Make sure we only create one event. This is why &$contact
// is a reference var in this function
$contact [ 'bdyear' ] = substr ( $birthday , 0 , 4 );
}
}
2012-03-19 06:12:36 +01:00
$community_page = 0 ;
$rawtags = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'community' );
if ( $rawtags ) {
$community_page = intval ( $rawtags [ 0 ][ 'data' ]);
}
if ( is_array ( $contact ) && intval ( $contact [ 'forum' ]) != $community_page ) {
q ( " update contact set forum = %d where id = %d limit 1 " ,
intval ( $community_page ),
intval ( $contact [ 'id' ])
);
$contact [ 'forum' ] = ( string ) $community_page ;
}
2011-01-07 23:31:05 +01:00
2011-02-08 13:25:27 +01:00
// process any deleted entries
2010-10-01 04:41:22 +02:00
2011-02-08 13:25:27 +01:00
$del_entries = $feed -> get_feed_tags ( NAMESPACE_TOMB , 'deleted-entry' );
2011-10-04 12:06:34 +02:00
if ( is_array ( $del_entries ) && count ( $del_entries ) && $pass != 2 ) {
2011-02-08 13:25:27 +01:00
foreach ( $del_entries as $dentry ) {
2010-10-01 04:41:22 +02:00
$deleted = false ;
2011-02-08 13:25:27 +01:00
if ( isset ( $dentry [ 'attribs' ][ '' ][ 'ref' ])) {
$uri = $dentry [ 'attribs' ][ '' ][ 'ref' ];
2010-10-01 04:41:22 +02:00
$deleted = true ;
2011-02-08 13:25:27 +01:00
if ( isset ( $dentry [ 'attribs' ][ '' ][ 'when' ])) {
$when = $dentry [ 'attribs' ][ '' ][ 'when' ];
2010-10-01 04:41:22 +02:00
$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-10-22 06:48:22 +02:00
if ( $deleted && is_array ( $contact )) {
2011-11-02 03:16:33 +01:00
$r = q ( " SELECT `item`.*, `contact`.`self` FROM `item` left join `contact` on `item`.`contact-id` = `contact`.`id`
2012-03-24 12:16:27 +01:00
WHERE `uri` = '%s' AND `item` . `uid` = % d AND `contact-id` = % d AND NOT `item` . `file` LIKE '%%[%%' LIMIT 1 " ,
2010-10-01 04:41:22 +02:00
dbesc ( $uri ),
2010-10-22 06:48:22 +02:00
intval ( $importer [ 'uid' ]),
intval ( $contact [ 'id' ])
2010-10-01 04:41:22 +02:00
);
if ( count ( $r )) {
$item = $r [ 0 ];
2011-02-08 13:25:27 +01:00
if ( ! $item [ 'deleted' ])
2011-02-08 14:08:10 +01:00
logger ( 'consume_feed: deleting item ' . $item [ 'id' ] . ' uri=' . $item [ 'uri' ], LOGGER_DEBUG );
2011-02-08 13:25:27 +01:00
2012-04-17 21:31:06 +02:00
if (( $item [ 'verb' ] === ACTIVITY_TAG ) && ( $item [ 'object-type' ] === ACTIVITY_OBJ_TAGTERM )) {
2011-10-24 13:17:46 +02:00
$xo = parse_xml_string ( $item [ 'object' ], false );
$xt = parse_xml_string ( $item [ 'target' ], false );
if ( $xt -> type === ACTIVITY_OBJ_NOTE ) {
$i = q ( " select * from `item` where uri = '%s' and uid = %d limit 1 " ,
dbesc ( $xt -> id ),
intval ( $importer [ 'importer_uid' ])
);
if ( count ( $i )) {
// For tags, the owner cannot remove the tag on the author's copy of the post.
$owner_remove = (( $item [ 'contact-id' ] == $i [ 0 ][ 'contact-id' ]) ? true : false );
$author_remove = (( $item [ 'origin' ] && $item [ 'self' ]) ? true : false );
$author_copy = (( $item [ 'origin' ]) ? true : false );
if ( $owner_remove && $author_copy )
continue ;
if ( $author_remove || $owner_remove ) {
$tags = explode ( ',' , $i [ 0 ][ 'tag' ]);
$newtags = array ();
if ( count ( $tags )) {
foreach ( $tags as $tag )
if ( trim ( $tag ) !== trim ( $xo -> body ))
$newtags [] = trim ( $tag );
}
q ( " update item set tag = '%s' where id = %d limit 1 " ,
dbesc ( implode ( ',' , $newtags )),
intval ( $i [ 0 ][ 'id' ])
);
}
}
}
}
2010-10-01 04:41:22 +02:00
if ( $item [ 'uri' ] == $item [ 'parent-uri' ]) {
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
`body` = '' , `title` = ''
WHERE `parent-uri` = '%s' AND `uid` = % d " ,
dbesc ( $when ),
dbesc ( datetime_convert ()),
dbesc ( $item [ 'uri' ]),
intval ( $importer [ 'uid' ])
);
}
else {
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
`body` = '' , `title` = ''
WHERE `uri` = '%s' AND `uid` = % d LIMIT 1 " ,
dbesc ( $when ),
dbesc ( datetime_convert ()),
dbesc ( $uri ),
intval ( $importer [ 'uid' ])
);
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 " ,
2010-10-01 04:41:22 +02:00
dbesc ( datetime_convert ()),
dbesc ( $item [ 'parent-uri' ]),
intval ( $item [ 'uid' ])
);
// who is the last child now?
2012-01-24 05:56:11 +01:00
$r = q ( " SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `moderated` = 0 AND `uid` = %d
2010-10-04 13:22:34 +02:00
ORDER BY `created` DESC LIMIT 1 " ,
2010-10-01 04:41:22 +02:00
dbesc ( $item [ 'parent-uri' ]),
intval ( $importer [ 'uid' ])
);
if ( count ( $r )) {
q ( " UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1 " ,
intval ( $r [ 0 ][ 'id' ])
);
}
}
}
}
}
2011-02-08 13:25:27 +01:00
}
}
// Now process the feed
2012-07-05 23:36:00 +02:00
if ( $feed -> get_item_quantity ()) {
2011-02-08 13:25:27 +01:00
logger ( 'consume_feed: feed item count = ' . $feed -> get_item_quantity ());
// in inverse date order
if ( $datedir )
$items = array_reverse ( $feed -> get_items ());
else
$items = $feed -> get_items ();
2010-10-01 04:41:22 +02:00
2011-02-08 13:25:27 +01:00
foreach ( $items as $item ) {
2012-07-05 23:36:00 +02:00
$is_reply = false ;
2010-10-01 04:41:22 +02:00
$item_id = $item -> get_id ();
$rawthread = $item -> get_item_tags ( NAMESPACE_THREAD , 'in-reply-to' );
if ( isset ( $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ])) {
$is_reply = true ;
$parent_uri = $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ];
}
2011-10-20 06:54:33 +02:00
if (( $is_reply ) && is_array ( $contact )) {
if ( $pass == 1 )
continue ;
2011-02-09 03:44:30 +01:00
2012-09-13 03:53:20 +02:00
// not allowed to post
if ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER )
continue ;
2010-10-01 04:41:22 +02:00
// Have we seen it? If not, import it.
2012-07-05 23:36:00 +02:00
2011-03-01 03:24:32 +01:00
$item_id = $item -> get_id ();
$datarray = get_atom_elements ( $feed , $item );
2011-02-09 03:44:30 +01:00
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-name' )) && ( $contact [ 'network' ] != NETWORK_DFRN ))
2011-05-06 15:30:33 +02:00
$datarray [ 'author-name' ] = $contact [ 'name' ];
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-link' )) && ( $contact [ 'network' ] != NETWORK_DFRN ))
2011-05-06 15:30:33 +02:00
$datarray [ 'author-link' ] = $contact [ 'url' ];
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-avatar' )) && ( $contact [ 'network' ] != NETWORK_DFRN ))
2011-05-06 15:30:33 +02:00
$datarray [ 'author-avatar' ] = $contact [ 'thumb' ];
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-name' )) || ( ! x ( $datarray , 'author-link' ))) {
logger ( 'consume_feed: no author information! ' . print_r ( $datarray , true ));
continue ;
}
2011-07-06 04:55:09 +02:00
2012-06-29 01:04:00 +02:00
$force_parent = false ;
if ( $contact [ 'network' ] === NETWORK_OSTATUS || stristr ( $contact [ 'url' ], 'twitter.com' )) {
if ( $contact [ 'network' ] === NETWORK_OSTATUS )
$force_parent = true ;
if ( strlen ( $datarray [ 'title' ]))
unset ( $datarray [ 'title' ]);
$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 [ 'uid' ])
);
$datarray [ 'last-child' ] = 1 ;
}
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-10-01 04:41:22 +02:00
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
2011-02-09 03:44:30 +01:00
2011-03-01 03:24:32 +01:00
// Update content if 'updated' changes
2010-10-01 04:41:22 +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' ])) {
2012-06-12 03:14:49 +02:00
// do not accept (ignore) an earlier edit than one we currently have.
2012-06-12 11:47:05 +02:00
if ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) < $r [ 0 ][ 'edited' ])
2012-06-12 03:14:49 +02:00
continue ;
2012-03-23 00:17:10 +01:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2012-02-10 00:58:26 +01:00
dbesc ( $datarray [ 'title' ]),
2011-03-01 03:24:32 +01:00
dbesc ( $datarray [ 'body' ]),
2012-03-23 00:17:10 +01:00
dbesc ( $datarray [ 'tag' ]),
2011-03-01 03:24:32 +01:00
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
}
// update last-child if it changes
2010-10-01 04:41:22 +02:00
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
2010-11-09 05:56:09 +01:00
if (( $allow ) && ( $allow [ 0 ][ 'data' ] != $r [ 0 ][ 'last-child' ])) {
2010-10-01 04:41:22 +02:00
$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 [ 'uid' ])
);
$r = q ( " UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2010-11-09 05:56:09 +01:00
intval ( $allow [ 0 ][ 'data' ]),
2010-10-01 04:41:22 +02:00
dbesc ( datetime_convert ()),
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
}
continue ;
}
2011-02-09 03:44:30 +01:00
2011-01-26 11:32:00 +01:00
2011-10-04 12:06:34 +02:00
if (( $contact [ 'network' ] === NETWORK_FEED ) || ( ! strlen ( $contact [ 'notify' ]))) {
2011-01-25 04:36:20 +01:00
// one way feed - no remote comment ability
$datarray [ 'last-child' ] = 0 ;
}
2010-10-01 04:41:22 +02:00
$datarray [ 'parent-uri' ] = $parent_uri ;
$datarray [ 'uid' ] = $importer [ 'uid' ];
$datarray [ 'contact-id' ] = $contact [ 'id' ];
2010-10-28 00:50:44 +02:00
if (( activity_match ( $datarray [ 'verb' ], ACTIVITY_LIKE )) || ( activity_match ( $datarray [ 'verb' ], ACTIVITY_DISLIKE ))) {
2010-10-01 04:41:22 +02:00
$datarray [ 'type' ] = 'activity' ;
$datarray [ 'gravity' ] = GRAVITY_LIKE ;
2012-03-06 11:17:55 +01:00
// only one like or dislike per person
2012-06-29 06:32:49 +02:00
$r = q ( " select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent-uri` = '%s' OR `thr-parent` = '%s') limit 1 " ,
2012-03-06 11:17:55 +01:00
intval ( $datarray [ 'uid' ]),
intval ( $datarray [ 'contact-id' ]),
2012-06-24 06:11:18 +02:00
dbesc ( $datarray [ 'verb' ]),
dbesc ( $parent_uri ),
dbesc ( $parent_uri )
2012-03-06 11:17:55 +01:00
);
if ( $r && count ( $r ))
continue ;
2010-10-01 04:41:22 +02:00
}
2011-10-24 13:17:46 +02:00
if (( $datarray [ 'verb' ] === ACTIVITY_TAG ) && ( $datarray [ 'object-type' ] === ACTIVITY_OBJ_TAGTERM )) {
$xo = parse_xml_string ( $datarray [ 'object' ], false );
$xt = parse_xml_string ( $datarray [ 'target' ], false );
if ( $xt -> type == ACTIVITY_OBJ_NOTE ) {
$r = q ( " select * from item where `uri` = '%s' AND `uid` = %d limit 1 " ,
dbesc ( $xt -> id ),
intval ( $importer [ 'importer_uid' ])
);
if ( ! count ( $r ))
continue ;
// extract tag, if not duplicate, add to parent item
2011-11-17 02:09:58 +01:00
if ( $xo -> id && $xo -> content ) {
$newtag = '#[url=' . $xo -> id . ']' . $xo -> content . '[/url]' ;
if ( ! ( stristr ( $r [ 0 ][ 'tag' ], $newtag ))) {
2011-10-24 13:17:46 +02:00
q ( " UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1 " ,
2011-11-17 02:09:58 +01:00
dbesc ( $r [ 0 ][ 'tag' ] . ( strlen ( $r [ 0 ][ 'tag' ]) ? ',' : '' ) . $newtag ),
2011-10-24 13:17:46 +02:00
intval ( $r [ 0 ][ 'id' ])
);
}
}
}
}
2011-02-04 02:40:04 +01:00
$r = item_store ( $datarray , $force_parent );
2010-10-01 04:41:22 +02:00
continue ;
}
else {
2011-03-01 03:24:32 +01:00
2010-10-01 04:41:22 +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 ();
2011-04-05 04:36:18 +02:00
2011-03-01 03:24:32 +01:00
$datarray = get_atom_elements ( $feed , $item );
2011-05-06 15:30:33 +02:00
if ( is_array ( $contact )) {
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-name' )) && ( $contact [ 'network' ] != NETWORK_DFRN ))
2011-05-06 15:30:33 +02:00
$datarray [ 'author-name' ] = $contact [ 'name' ];
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-link' )) && ( $contact [ 'network' ] != NETWORK_DFRN ))
2011-05-06 15:30:33 +02:00
$datarray [ 'author-link' ] = $contact [ 'url' ];
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-avatar' )) && ( $contact [ 'network' ] != NETWORK_DFRN ))
2011-05-06 15:30:33 +02:00
$datarray [ 'author-avatar' ] = $contact [ 'thumb' ];
}
2012-02-25 05:03:13 +01:00
if (( ! x ( $datarray , 'author-name' )) || ( ! x ( $datarray , 'author-link' ))) {
logger ( 'consume_feed: no author information! ' . print_r ( $datarray , true ));
continue ;
}
2011-10-04 12:06:34 +02:00
// special handling for events
2011-06-11 05:39:46 +02:00
if (( x ( $datarray , 'object-type' )) && ( $datarray [ 'object-type' ] === ACTIVITY_OBJ_EVENT )) {
$ev = bbtoevent ( $datarray [ 'body' ]);
if ( x ( $ev , 'desc' ) && x ( $ev , 'start' )) {
2011-06-14 04:06:49 +02:00
$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 05:42:37 +02:00
2011-06-14 04:06:49 +02:00
if ( is_array ( $contact ))
$ev [ 'cid' ] = $contact [ 'id' ];
2011-06-11 05:39:46 +02:00
$r = q ( " SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
2011-06-14 04:06:49 +02:00
if ( count ( $r ))
$ev [ 'id' ] = $r [ 0 ][ 'id' ];
$xyz = event_store ( $ev );
continue ;
2011-06-11 05:39:46 +02:00
}
}
2011-06-14 04:06:49 +02:00
2012-06-29 01:04:00 +02:00
if ( $contact [ 'network' ] === NETWORK_OSTATUS || stristr ( $contact [ 'url' ], 'twitter.com' )) {
if ( strlen ( $datarray [ 'title' ]))
unset ( $datarray [ 'title' ]);
$datarray [ 'last-child' ] = 1 ;
}
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-10-01 04:41:22 +02:00
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
2011-03-01 03:24:32 +01:00
// Update content if 'updated' changes
2010-10-01 04:41:22 +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' ])) {
2012-06-12 03:14:49 +02:00
// do not accept (ignore) an earlier edit than one we currently have.
2012-06-12 11:47:05 +02:00
if ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) < $r [ 0 ][ 'edited' ])
2012-06-12 03:14:49 +02:00
continue ;
2012-03-23 00:17:10 +01:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2012-02-10 00:58:26 +01:00
dbesc ( $datarray [ 'title' ]),
2011-03-01 03:24:32 +01:00
dbesc ( $datarray [ 'body' ]),
2012-03-23 00:17:10 +01:00
dbesc ( $datarray [ 'tag' ]),
2011-03-01 03:24:32 +01:00
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
}
// update last-child if it changes
2010-10-01 04:41:22 +02:00
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
if ( $allow && $allow [ 0 ][ 'data' ] != $r [ 0 ][ 'last-child' ]) {
$r = q ( " UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
intval ( $allow [ 0 ][ 'data' ]),
dbesc ( datetime_convert ()),
dbesc ( $item_id ),
intval ( $importer [ 'uid' ])
);
}
continue ;
}
2010-10-25 05:39:24 +02:00
2010-10-28 00:50:44 +02:00
if ( activity_match ( $datarray [ 'verb' ], ACTIVITY_FOLLOW )) {
2010-10-27 07:09:13 +02:00
logger ( 'consume-feed: New follower' );
2010-10-25 05:39:24 +02:00
new_follower ( $importer , $contact , $datarray , $item );
2010-10-22 06:48:22 +02:00
return ;
}
2010-10-28 00:50:44 +02:00
if ( activity_match ( $datarray [ 'verb' ], ACTIVITY_UNFOLLOW )) {
2010-10-25 05:39:24 +02:00
lose_follower ( $importer , $contact , $datarray , $item );
2010-10-22 06:48:22 +02:00
return ;
}
2011-10-03 01:18:01 +02:00
if ( activity_match ( $datarray [ 'verb' ], ACTIVITY_REQ_FRIEND )) {
logger ( 'consume-feed: New friend request' );
new_follower ( $importer , $contact , $datarray , $item , true );
return ;
}
if ( activity_match ( $datarray [ 'verb' ], ACTIVITY_UNFRIEND )) {
lose_sharer ( $importer , $contact , $datarray , $item );
return ;
}
2010-10-22 06:48:22 +02:00
if ( ! is_array ( $contact ))
return ;
2010-10-25 05:39:24 +02:00
2010-11-09 05:56:09 +01:00
2012-06-12 06:50:10 +02:00
if (( $contact [ 'network' ] === NETWORK_FEED ) || ( ! strlen ( $contact [ 'notify' ]))) {
2012-06-11 14:28:08 +02:00
// one way feed - no remote comment ability
$datarray [ 'last-child' ] = 0 ;
2011-01-25 04:36:20 +01:00
}
2012-06-12 06:50:10 +02:00
if ( $contact [ 'network' ] === NETWORK_FEED )
2012-06-29 02:43:29 +02:00
$datarray [ 'private' ] = 2 ;
2011-01-25 04:36:20 +01:00
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.
2012-06-29 03:52:49 +02:00
if ( $contact [ 'remote_self' ]) {
2011-07-06 04:55:09 +02:00
$datarray [ 'wall' ] = 1 ;
2012-06-29 03:52:49 +02:00
if ( $contact [ 'network' ] === NETWORK_FEED ) {
$datarray [ 'private' ] = 0 ;
}
}
2011-07-06 04:55:09 +02:00
2010-10-01 04:41:22 +02:00
$datarray [ 'parent-uri' ] = $item_id ;
$datarray [ 'uid' ] = $importer [ 'uid' ];
$datarray [ 'contact-id' ] = $contact [ 'id' ];
2012-03-05 03:50:32 +01:00
2012-03-08 03:23:55 +01:00
if ( ! link_compare ( $datarray [ 'owner-link' ], $contact [ 'url' ])) {
2012-03-05 03:50:32 +01:00
// The item owner info is not our contact. It's OK and is to be expected if this is a tgroup delivery,
// but otherwise there's a possible data mixup on the sender's system.
// the tgroup delivery code called from item_store will correct it if it's a forum,
// but we're going to unconditionally correct it here so that the post will always be owned by our contact.
2012-03-23 00:17:10 +01:00
logger ( 'consume_feed: Correcting item owner.' , LOGGER_DEBUG );
2012-03-05 03:50:32 +01:00
$datarray [ 'owner-name' ] = $contact [ 'name' ];
$datarray [ 'owner-link' ] = $contact [ 'url' ];
$datarray [ 'owner-avatar' ] = $contact [ 'thumb' ];
}
2012-09-13 03:53:20 +02:00
// We've allowed "followers" to reach this point so we can decide if they are
// posting an @-tag delivery, which followers are allowed to do for certain
// page types. Now that we've parsed the post, let's check if it is legit. Otherwise ignore it.
if (( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER ) && ( ! tgroup_check ( $importer [ 'uid' ], $datarray )))
continue ;
2010-10-01 04:41:22 +02:00
$r = item_store ( $datarray );
continue ;
}
}
}
2010-10-01 06:38:45 +02:00
}
2011-10-07 04:10:57 +02:00
function local_delivery ( $importer , $data ) {
2011-10-07 02:27:37 +02:00
$a = get_app ();
2012-10-31 17:13:45 +01:00
logger ( __function__ , LOGGER_TRACE );
2011-10-07 02:27:37 +02: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.
2011-10-07 04:10:57 +02:00
logger ( 'local_delivery: ignoring' );
2011-10-07 02:27:37 +02:00
return 0 ;
//NOTREACHED
}
// Consume notification feed. This may differ from consuming a public feed in several ways
// - might contain email or friend suggestions
// - 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
$feed = new SimplePie ();
$feed -> set_raw_data ( $data );
$feed -> enable_order_by_date ( false );
$feed -> init ();
2012-07-24 05:00:00 +02:00
if ( $feed -> error ())
logger ( 'local_delivery: Error parsing XML: ' . $feed -> error ());
// Check at the feed level for updated contact name and/or photo
$name_updated = '' ;
$new_name = '' ;
$photo_timestamp = '' ;
$photo_url = '' ;
$rawtags = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'owner' );
2012-09-07 05:17:50 +02:00
// Fallback should not be needed here. If it isn't DFRN it won't have DFRN updated tags
// if(! $rawtags)
// $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
2012-07-24 05:00:00 +02:00
if ( $rawtags ) {
$elems = $rawtags [ 0 ][ 'child' ][ SIMPLEPIE_NAMESPACE_ATOM_10 ];
if ( $elems [ 'name' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ]) {
$name_updated = $elems [ 'name' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ];
$new_name = $elems [ 'name' ][ 0 ][ 'data' ];
}
if (( x ( $elems , 'link' )) && ( $elems [ 'link' ][ 0 ][ 'attribs' ][ '' ][ 'rel' ] === 'photo' ) && ( $elems [ 'link' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ])) {
$photo_timestamp = datetime_convert ( 'UTC' , 'UTC' , $elems [ 'link' ][ 0 ][ 'attribs' ][ NAMESPACE_DFRN ][ 'updated' ]);
$photo_url = $elems [ 'link' ][ 0 ][ 'attribs' ][ '' ][ 'href' ];
}
}
2012-08-13 03:42:43 +02:00
if (( $photo_timestamp ) && ( strlen ( $photo_url )) && ( $photo_timestamp > $importer [ 'avatar-date' ])) {
2012-07-24 05:00:00 +02:00
logger ( 'local_delivery: Updating photo for ' . $importer [ 'name' ]);
require_once ( " Photo.php " );
$photo_failure = false ;
$have_photo = false ;
$r = q ( " SELECT `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $importer [ 'id' ]),
intval ( $importer [ 'importer_uid' ])
);
if ( count ( $r )) {
$resource_id = $r [ 0 ][ 'resource-id' ];
$have_photo = true ;
}
else {
$resource_id = photo_new_resource ();
}
$img_str = fetch_url ( $photo_url , true );
// guess mimetype from headers or filename
$type = guess_image_type ( $photo_url , true );
$img = new Photo ( $img_str , $type );
if ( $img -> is_valid ()) {
if ( $have_photo ) {
q ( " DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d " ,
dbesc ( $resource_id ),
intval ( $importer [ 'id' ]),
intval ( $importer [ 'importer_uid' ])
);
}
$img -> scaleImageSquare ( 175 );
$hash = $resource_id ;
$r = $img -> store ( $importer [ 'importer_uid' ], $importer [ 'id' ], $hash , basename ( $photo_url ), 'Contact Photos' , 4 );
$img -> scaleImage ( 80 );
$r = $img -> store ( $importer [ 'importer_uid' ], $importer [ 'id' ], $hash , basename ( $photo_url ), 'Contact Photos' , 5 );
$img -> scaleImage ( 48 );
$r = $img -> store ( $importer [ 'importer_uid' ], $importer [ 'id' ], $hash , basename ( $photo_url ), 'Contact Photos' , 6 );
$a = get_app ();
q ( " UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
WHERE `uid` = % d AND `id` = % d LIMIT 1 " ,
dbesc ( datetime_convert ()),
dbesc ( $a -> get_baseurl () . '/photo/' . $hash . '-4.' . $img -> getExt ()),
dbesc ( $a -> get_baseurl () . '/photo/' . $hash . '-5.' . $img -> getExt ()),
dbesc ( $a -> get_baseurl () . '/photo/' . $hash . '-6.' . $img -> getExt ()),
intval ( $importer [ 'importer_uid' ]),
intval ( $importer [ 'id' ])
);
}
}
2012-08-13 03:42:43 +02:00
if (( $name_updated ) && ( strlen ( $new_name )) && ( $name_updated > $importer [ 'name-date' ])) {
2012-07-24 05:00:00 +02:00
$r = q ( " select * from contact where uid = %d and id = %d limit 1 " ,
intval ( $importer [ 'importer_uid' ]),
intval ( $importer [ 'id' ])
);
$x = q ( " UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
dbesc ( notags ( trim ( $new_name ))),
dbesc ( datetime_convert ()),
intval ( $importer [ 'importer_uid' ]),
intval ( $importer [ 'id' ])
);
// do our best to update the name on content items
if ( count ( $r )) {
q ( " update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d " ,
dbesc ( notags ( trim ( $new_name ))),
dbesc ( $r [ 0 ][ 'name' ]),
dbesc ( $r [ 0 ][ 'url' ]),
intval ( $importer [ 'importer_uid' ])
);
}
}
2012-10-29 17:48:08 +01:00
2012-04-11 04:15:52 +02:00
// Currently unsupported - needs a lot of work
2011-10-07 02:27:37 +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' ]));
2012-10-29 17:48:08 +01:00
$newloc [ 'thumb' ] = notags ( unxmlify ( $base [ 'thumb' ][ 0 ][ 'data' ]));
$newloc [ 'micro' ] = notags ( unxmlify ( $base [ 'micro' ][ 0 ][ 'data' ]));
2011-10-07 02:27:37 +02:00
$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' ]));
2012-10-31 17:13:45 +01:00
$newloc [ 'sitepubkey' ] = notags ( unxmlify ( $base [ 'sitepubkey' ][ 0 ][ 'data' ]));
/** relocated user must have original key pair */
2012-10-29 17:48:08 +01:00
/* $newloc [ 'pubkey' ] = notags ( unxmlify ( $base [ 'pubkey' ][ 0 ][ 'data' ]));
$newloc [ 'prvkey' ] = notags ( unxmlify ( $base [ 'prvkey' ][ 0 ][ 'data' ])); */
2011-10-07 02:27:37 +02:00
2012-10-31 17:13:45 +01:00
logger ( " items:relocate contact " . print_r ( $newloc , true ) . print_r ( $importer , true ), LOGGER_DEBUG );
2012-10-29 17:48:08 +01:00
// update contact
2012-10-31 17:13:45 +01:00
$r = q ( " SELECT photo, url FROM contact WHERE id=%d AND uid=%d; " ,
intval ( $importer [ 'id' ]),
intval ( $importer [ 'importer_uid' ]));
if ( $r === false )
return 1 ;
2012-10-29 17:48:08 +01:00
$old = $r [ 0 ];
$x = q ( " UPDATE contact SET
name = '%s' ,
photo = '%s' ,
thumb = '%s' ,
micro = '%s' ,
url = '%s' ,
request = '%s' ,
confirm = '%s' ,
notify = '%s' ,
poll = '%s' ,
2012-10-31 17:13:45 +01:00
`site-pubkey` = '%s'
2012-10-29 17:48:08 +01:00
WHERE id =% d AND uid =% d ; " ,
dbesc ( $newloc [ 'name' ]),
dbesc ( $newloc [ 'photo' ]),
dbesc ( $newloc [ 'thumb' ]),
dbesc ( $newloc [ 'micro' ]),
dbesc ( $newloc [ 'url' ]),
dbesc ( $newloc [ 'request' ]),
dbesc ( $newloc [ 'confirm' ]),
dbesc ( $newloc [ 'notify' ]),
dbesc ( $newloc [ 'poll' ]),
2012-10-31 17:13:45 +01:00
dbesc ( $newloc [ 'sitepubkey' ]),
intval ( $importer [ 'id' ]),
intval ( $importer [ 'importer_uid' ]));
if ( $x === false )
return 1 ;
2012-10-29 17:48:08 +01:00
// update items
$fields = array (
'owner-link' => array ( $old [ 'url' ], $newloc [ 'url' ]),
'author-link' => array ( $old [ 'url' ], $newloc [ 'url' ]),
'owner-avatar' => array ( $old [ 'photo' ], $newloc [ 'photo' ]),
'author-avatar' => array ( $old [ 'photo' ], $newloc [ 'photo' ]),
);
2012-10-31 17:13:45 +01:00
foreach ( $fields as $n => $f ){
2012-10-29 17:48:08 +01:00
$x = q ( " UPDATE item SET `%s`='%s' WHERE `%s`='%s' AND uid=%d " ,
$n , dbesc ( $f [ 1 ]),
$n , dbesc ( $f [ 0 ]),
intval ( $importer [ 'importer_uid' ]));
2012-10-31 17:13:45 +01:00
if ( $x === false )
return 1 ;
}
2011-10-07 02:27:37 +02:00
// TODO
// merge with current record, current contents have priority
// update record, set url-updated
// update profile photos
// schedule a scan?
2012-10-29 17:48:08 +01:00
return 0 ;
2011-10-07 02:27:37 +02:00
}
2012-10-29 17:48:08 +01:00
2011-10-07 02:27:37 +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' ]));
$fsugg [ 'request' ] = notags ( unxmlify ( $base [ 'request' ][ 0 ][ 'data' ]));
$fsugg [ 'body' ] = escape_tags ( unxmlify ( $base [ 'note' ][ 0 ][ 'data' ]));
// Does our member already have a friend matching this description?
2011-11-09 01:54:32 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `name` = '%s' AND `nurl` = '%s' AND `uid` = %d LIMIT 1 " ,
2011-10-07 02:27:37 +02:00
dbesc ( $fsugg [ 'name' ]),
2011-11-09 01:54:32 +01:00
dbesc ( normalise_link ( $fsugg [ 'url' ])),
2011-10-07 02:27:37 +02:00
intval ( $fsugg [ 'uid' ])
);
if ( count ( $r ))
return 0 ;
// Do we already have an fcontact record for this person?
$fid = 0 ;
$r = q ( " SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1 " ,
dbesc ( $fsugg [ 'url' ]),
dbesc ( $fsugg [ 'name' ]),
dbesc ( $fsugg [ 'request' ])
);
if ( count ( $r )) {
$fid = $r [ 0 ][ 'id' ];
2012-03-24 23:53:53 +01:00
// OK, we do. Do we already have an introduction for this person ?
$r = q ( " select id from intro where uid = %d and fid = %d limit 1 " ,
intval ( $fsugg [ 'uid' ]),
intval ( $fid )
);
if ( count ( $r ))
return 0 ;
2011-10-07 02:27:37 +02:00
}
if ( ! $fid )
$r = q ( " INSERT INTO `fcontact` ( `name`,`url`,`photo`,`request` ) VALUES ( '%s', '%s', '%s', '%s' ) " ,
dbesc ( $fsugg [ 'name' ]),
dbesc ( $fsugg [ 'url' ]),
dbesc ( $fsugg [ 'photo' ]),
dbesc ( $fsugg [ 'request' ])
);
$r = q ( " SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1 " ,
dbesc ( $fsugg [ 'url' ]),
dbesc ( $fsugg [ 'name' ]),
dbesc ( $fsugg [ 'request' ])
);
if ( count ( $r )) {
$fid = $r [ 0 ][ 'id' ];
}
// database record did not get created. Quietly give up.
else
return 0 ;
2012-03-24 23:53:53 +01:00
2011-10-07 02:27:37 +02:00
$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 )
);
2012-01-04 02:29:07 +01:00
notification ( array (
'type' => NOTIFY_SUGGEST ,
'notify_flags' => $importer [ 'notify-flags' ],
'language' => $importer [ 'language' ],
'to_name' => $importer [ 'username' ],
'to_email' => $importer [ 'email' ],
2012-02-18 11:57:42 +01:00
'uid' => $importer [ 'importer_uid' ],
2012-01-04 02:29:07 +01:00
'item' => $fsugg ,
'link' => $a -> get_baseurl () . '/notifications/intros' ,
'source_name' => $importer [ 'name' ],
'source_link' => $importer [ 'url' ],
2012-01-04 05:26:20 +01:00
'source_photo' => $importer [ 'photo' ],
'verb' => ACTIVITY_REQ_FRIEND ,
'otype' => 'intro'
2012-01-04 02:29:07 +01:00
));
2011-10-07 02:27:37 +02:00
return 0 ;
}
$ismail = false ;
$rawmail = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'mail' );
if ( isset ( $rawmail [ 0 ][ 'child' ][ NAMESPACE_DFRN ])) {
2011-10-07 04:10:57 +02:00
logger ( 'local_delivery: private message received' );
2011-10-07 02:27:37 +02:00
$ismail = true ;
$base = $rawmail [ 0 ][ 'child' ][ NAMESPACE_DFRN ];
$msg = array ();
$msg [ 'uid' ] = $importer [ 'importer_uid' ];
$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' ]));
$msg [ 'from-url' ] = notags ( unxmlify ( $base [ 'sender' ][ 0 ][ 'child' ][ NAMESPACE_DFRN ][ 'uri' ][ 0 ][ 'data' ]));
$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' ])));
dbesc_array ( $msg );
$r = dbq ( " INSERT INTO `mail` (` " . implode ( " `, ` " , array_keys ( $msg ))
. " `) VALUES (' " . implode ( " ', ' " , array_values ( $msg )) . " ') " );
2011-12-26 08:00:19 +01:00
// send notifications.
require_once ( 'include/enotify.php' );
2011-10-07 02:27:37 +02:00
2011-12-08 10:28:27 +01:00
$notif_params = array (
'type' => NOTIFY_MAIL ,
2011-12-26 08:00:19 +01:00
'notify_flags' => $importer [ 'notify-flags' ],
2011-12-08 10:28:27 +01:00
'language' => $importer [ 'language' ],
'to_name' => $importer [ 'username' ],
'to_email' => $importer [ 'email' ],
2012-02-18 11:57:42 +01:00
'uid' => $importer [ 'importer_uid' ],
2011-12-24 08:07:05 +01:00
'item' => $msg ,
2011-12-08 10:28:27 +01:00
'source_name' => $msg [ 'from-name' ],
'source_link' => $importer [ 'url' ],
'source_photo' => $importer [ 'thumb' ],
2012-01-04 05:26:20 +01:00
'verb' => ACTIVITY_POST ,
'otype' => 'mail'
2011-12-08 10:28:27 +01:00
);
2011-12-26 08:00:19 +01:00
notification ( $notif_params );
2011-10-07 02:27:37 +02:00
return 0 ;
2011-12-26 08:00:19 +01:00
2011-10-07 02:27:37 +02:00
// NOTREACHED
}
2012-03-19 06:12:36 +01:00
$community_page = 0 ;
$rawtags = $feed -> get_feed_tags ( NAMESPACE_DFRN , 'community' );
if ( $rawtags ) {
$community_page = intval ( $rawtags [ 0 ][ 'data' ]);
}
if ( intval ( $importer [ 'forum' ]) != $community_page ) {
q ( " update contact set forum = %d where id = %d limit 1 " ,
intval ( $community_page ),
intval ( $importer [ 'id' ])
);
$importer [ 'forum' ] = ( string ) $community_page ;
}
2011-10-07 02:27:37 +02:00
2011-10-07 04:10:57 +02:00
logger ( 'local_delivery: feed item count = ' . $feed -> get_item_quantity ());
2011-10-07 02:27:37 +02: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 ) {
2012-06-26 03:15:56 +02:00
// check for relayed deletes to our conversation
2012-06-26 02:45:33 +02:00
$is_reply = false ;
2012-06-26 03:15:56 +02:00
$r = q ( " select * from item where uri = '%s' and uid = %d limit 1 " ,
dbesc ( $uri ),
intval ( $importer [ 'importer_uid' ])
2012-06-26 02:45:33 +02:00
);
if ( count ( $r )) {
$parent_uri = $r [ 0 ][ 'parent-uri' ];
2012-06-26 03:15:56 +02:00
if ( $r [ 0 ][ 'id' ] != $r [ 0 ][ 'parent' ])
2012-06-26 02:45:33 +02:00
$is_reply = true ;
}
if ( $is_reply ) {
$community = false ;
if ( $importer [ 'page-flags' ] == PAGE_COMMUNITY || $importer [ 'page-flags' ] == PAGE_PRVGROUP ) {
$sql_extra = '' ;
$community = true ;
logger ( 'local_delivery: possible community delete' );
}
else
$sql_extra = " and contact.self = 1 and item.wall = 1 " ;
// was the top-level post for this reply written by somebody on this site?
// Specifically, the recipient?
$is_a_remote_delete = false ;
2012-08-10 06:06:18 +02:00
// POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used?
2012-06-26 02:45:33 +02:00
$r = q ( " select `item`.`id`, `item`.`uri`, `item`.`tag`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
`contact` . `name` , `contact` . `url` , `contact` . `thumb` from `item`
LEFT JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
WHERE `item` . `uri` = '%s' AND ( `item` . `parent-uri` = '%s' or `item` . `thr-parent` = '%s' )
AND `item` . `uid` = % d
$sql_extra
LIMIT 1 " ,
dbesc ( $parent_uri ),
dbesc ( $parent_uri ),
dbesc ( $parent_uri ),
intval ( $importer [ 'importer_uid' ])
);
if ( $r && count ( $r ))
2012-08-10 06:06:18 +02:00
$is_a_remote_delete = true ;
2012-06-26 02:45:33 +02:00
// Does this have the characteristics of a community or private group comment?
// If it's a reply to a wall post on a community/prvgroup page it's a
// valid community comment. Also forum_mode makes it valid for sure.
// If neither, it's not.
if ( $is_a_remote_delete && $community ) {
if (( ! $r [ 0 ][ 'forum_mode' ]) && ( ! $r [ 0 ][ 'wall' ])) {
$is_a_remote_delete = false ;
logger ( 'local_delivery: not a community delete' );
}
}
if ( $is_a_remote_delete ) {
logger ( 'local_delivery: received remote delete' );
}
}
2011-10-24 13:17:46 +02:00
$r = q ( " SELECT `item`.*, `contact`.`self` FROM `item` left join contact on `item`.`contact-id` = `contact`.`id`
2012-03-24 12:16:27 +01:00
WHERE `uri` = '%s' AND `item` . `uid` = % d AND `contact-id` = % d AND NOT `item` . `file` LIKE '%%[%%' LIMIT 1 " ,
2011-10-07 02:27:37 +02:00
dbesc ( $uri ),
intval ( $importer [ 'importer_uid' ]),
intval ( $importer [ 'id' ])
);
if ( count ( $r )) {
$item = $r [ 0 ];
2011-10-23 09:24:37 +02:00
if ( $item [ 'deleted' ])
continue ;
logger ( 'local_delivery: deleting item ' . $item [ 'id' ] . ' uri=' . $item [ 'uri' ], LOGGER_DEBUG );
2012-04-17 21:31:06 +02:00
if (( $item [ 'verb' ] === ACTIVITY_TAG ) && ( $item [ 'object-type' ] === ACTIVITY_OBJ_TAGTERM )) {
2011-10-23 09:24:37 +02:00
$xo = parse_xml_string ( $item [ 'object' ], false );
$xt = parse_xml_string ( $item [ 'target' ], false );
2012-03-16 13:41:29 +01:00
2011-10-23 09:24:37 +02:00
if ( $xt -> type === ACTIVITY_OBJ_NOTE ) {
2011-10-24 13:17:46 +02:00
$i = q ( " select * from `item` where uri = '%s' and uid = %d limit 1 " ,
2011-10-23 09:24:37 +02:00
dbesc ( $xt -> id ),
intval ( $importer [ 'importer_uid' ])
);
if ( count ( $i )) {
2011-10-24 13:17:46 +02:00
// For tags, the owner cannot remove the tag on the author's copy of the post.
$owner_remove = (( $item [ 'contact-id' ] == $i [ 0 ][ 'contact-id' ]) ? true : false );
$author_remove = (( $item [ 'origin' ] && $item [ 'self' ]) ? true : false );
$author_copy = (( $item [ 'origin' ]) ? true : false );
if ( $owner_remove && $author_copy )
continue ;
if ( $author_remove || $owner_remove ) {
$tags = explode ( ',' , $i [ 0 ][ 'tag' ]);
$newtags = array ();
if ( count ( $tags )) {
foreach ( $tags as $tag )
if ( trim ( $tag ) !== trim ( $xo -> body ))
$newtags [] = trim ( $tag );
}
q ( " update item set tag = '%s' where id = %d limit 1 " ,
dbesc ( implode ( ',' , $newtags )),
intval ( $i [ 0 ][ 'id' ])
);
2011-10-23 09:24:37 +02:00
}
}
}
}
2011-10-07 02:27:37 +02:00
if ( $item [ 'uri' ] == $item [ 'parent-uri' ]) {
2012-07-06 04:07:01 +02:00
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
`body` = '' , `title` = ''
2011-10-07 02:27:37 +02:00
WHERE `parent-uri` = '%s' AND `uid` = % d " ,
dbesc ( $when ),
dbesc ( datetime_convert ()),
dbesc ( $item [ 'uri' ]),
intval ( $importer [ 'importer_uid' ])
);
}
else {
2012-07-06 04:07:01 +02:00
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
`body` = '' , `title` = ''
2011-10-07 02:27:37 +02:00
WHERE `uri` = '%s' AND `uid` = % d LIMIT 1 " ,
dbesc ( $when ),
dbesc ( datetime_convert ()),
dbesc ( $uri ),
intval ( $importer [ 'importer_uid' ])
);
if ( $item [ 'last-child' ]) {
// ensure that last-child is set in case the comment that had it just got wiped.
q ( " UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d " ,
dbesc ( datetime_convert ()),
dbesc ( $item [ 'parent-uri' ]),
intval ( $item [ 'uid' ])
);
// 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' ])
);
}
}
2012-06-26 03:15:56 +02:00
// if this is a relayed delete, propagate it to other recipients
2012-06-26 02:45:33 +02:00
if ( $is_a_remote_delete )
2012-06-26 03:15:56 +02:00
proc_run ( 'php' , " include/notifier.php " , " drop " , $item [ 'id' ]);
2012-06-26 02:45:33 +02:00
}
2011-10-07 02:27:37 +02:00
}
}
}
}
foreach ( $feed -> get_items () as $item ) {
$is_reply = false ;
$item_id = $item -> get_id ();
$rawthread = $item -> get_item_tags ( NAMESPACE_THREAD , 'in-reply-to' );
if ( isset ( $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ])) {
$is_reply = true ;
$parent_uri = $rawthread [ 0 ][ 'attribs' ][ '' ][ 'ref' ];
}
if ( $is_reply ) {
2011-11-16 05:30:34 +01:00
$community = false ;
2012-05-18 04:59:46 +02:00
if ( $importer [ 'page-flags' ] == PAGE_COMMUNITY || $importer [ 'page-flags' ] == PAGE_PRVGROUP ) {
2011-11-19 12:06:15 +01:00
$sql_extra = '' ;
$community = true ;
2012-02-21 06:07:40 +01:00
logger ( 'local_delivery: possible community reply' );
2011-11-19 12:06:15 +01:00
}
else
2011-11-16 05:30:34 +01:00
$sql_extra = " and contact.self = 1 and item.wall = 1 " ;
2011-10-07 02:27:37 +02:00
// was the top-level post for this reply written by somebody on this site?
// Specifically, the recipient?
2012-02-21 04:50:05 +01:00
$is_a_remote_comment = false ;
2012-08-18 17:17:33 +02:00
$top_uri = $parent_uri ;
$r = q ( " select `item`.`parent-uri` from `item`
WHERE `item` . `uri` = '%s'
2011-11-16 05:30:34 +01:00
LIMIT 1 " ,
2012-08-18 17:17:33 +02:00
dbesc ( $parent_uri )
2011-10-07 02:27:37 +02:00
);
2012-08-18 17:17:33 +02:00
if ( $r && count ( $r )) {
$top_uri = $r [ 0 ][ 'parent-uri' ];
// POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used?
$r = q ( " select `item`.`id`, `item`.`uri`, `item`.`tag`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
`contact` . `name` , `contact` . `url` , `contact` . `thumb` from `item`
LEFT JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
WHERE `item` . `uri` = '%s' AND ( `item` . `parent-uri` = '%s' or `item` . `thr-parent` = '%s' )
AND `item` . `uid` = % d
$sql_extra
LIMIT 1 " ,
dbesc ( $top_uri ),
dbesc ( $top_uri ),
dbesc ( $top_uri ),
intval ( $importer [ 'importer_uid' ])
);
if ( $r && count ( $r ))
$is_a_remote_comment = true ;
}
2011-11-19 22:45:20 +01:00
2012-05-18 04:59:46 +02:00
// Does this have the characteristics of a community or private group comment?
// If it's a reply to a wall post on a community/prvgroup page it's a
2012-02-21 06:07:40 +01:00
// valid community comment. Also forum_mode makes it valid for sure.
// If neither, it's not.
if ( $is_a_remote_comment && $community ) {
if (( ! $r [ 0 ][ 'forum_mode' ]) && ( ! $r [ 0 ][ 'wall' ])) {
$is_a_remote_comment = false ;
logger ( 'local_delivery: not a community reply' );
}
}
2011-10-07 02:27:37 +02:00
2012-02-21 04:50:05 +01:00
if ( $is_a_remote_comment ) {
2011-10-07 04:10:57 +02:00
logger ( 'local_delivery: received remote comment' );
2011-10-07 02:27:37 +02:00
$is_like = false ;
// remote reply to our post. Import and then notify everybody else.
2012-04-30 07:34:05 +02:00
$datarray = get_atom_elements ( $feed , $item );
2011-11-19 22:45:20 +01:00
2012-04-30 07:36:26 +02:00
$r = q ( " SELECT `id`, `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2012-04-16 10:35:27 +02:00
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
// Update content if 'updated' changes
if ( count ( $r )) {
2012-04-16 11:09:00 +02:00
$iid = $r [ 0 ][ 'id' ];
2012-06-12 03:14:49 +02:00
if (( x ( $datarray , 'edited' ) !== false ) && ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) !== $r [ 0 ][ 'edited' ])) {
// do not accept (ignore) an earlier edit than one we currently have.
2012-06-12 11:47:05 +02:00
if ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) < $r [ 0 ][ 'edited' ])
2012-06-12 03:14:49 +02:00
continue ;
2012-04-16 11:09:00 +02:00
logger ( 'received updated comment' , LOGGER_DEBUG );
2012-04-16 10:35:27 +02:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $datarray [ 'title' ]),
dbesc ( $datarray [ 'body' ]),
dbesc ( $datarray [ 'tag' ]),
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
2012-04-16 11:09:00 +02:00
proc_run ( 'php' , " include/notifier.php " , " comment-import " , $iid );
2012-04-16 10:35:27 +02:00
}
continue ;
}
2012-04-30 07:34:05 +02:00
$own = q ( " select name,url,thumb from contact where uid = %d and self = 1 limit 1 " ,
intval ( $importer [ 'importer_uid' ])
);
2011-10-07 02:27:37 +02:00
$datarray [ 'type' ] = 'remote-comment' ;
$datarray [ 'wall' ] = 1 ;
$datarray [ 'parent-uri' ] = $parent_uri ;
$datarray [ 'uid' ] = $importer [ 'importer_uid' ];
2012-04-30 07:34:05 +02:00
$datarray [ 'owner-name' ] = $own [ 0 ][ 'name' ];
$datarray [ 'owner-link' ] = $own [ 0 ][ 'url' ];
$datarray [ 'owner-avatar' ] = $own [ 0 ][ 'thumb' ];
2011-10-07 02:27:37 +02:00
$datarray [ 'contact-id' ] = $importer [ 'id' ];
2012-04-30 07:34:05 +02:00
2011-10-23 09:24:37 +02:00
if (( $datarray [ 'verb' ] === ACTIVITY_LIKE ) || ( $datarray [ 'verb' ] === ACTIVITY_DISLIKE )) {
2011-10-07 02:27:37 +02:00
$is_like = true ;
$datarray [ 'type' ] = 'activity' ;
$datarray [ 'gravity' ] = GRAVITY_LIKE ;
$datarray [ 'last-child' ] = 0 ;
2012-03-06 11:17:55 +01:00
// only one like or dislike per person
2012-06-24 06:11:18 +02:00
$r = q ( " select id from item where uid = %d and `contact-id` = %d and verb = '%s' and (`thr-parent` = '%s' or `parent-uri` = '%s') and deleted = 0 limit 1 " ,
2012-03-06 11:17:55 +01:00
intval ( $datarray [ 'uid' ]),
intval ( $datarray [ 'contact-id' ]),
2012-06-23 15:41:37 +02:00
dbesc ( $datarray [ 'verb' ]),
dbesc ( $datarray [ 'parent-uri' ]),
dbesc ( $datarray [ 'parent-uri' ])
2012-03-06 11:17:55 +01:00
);
if ( $r && count ( $r ))
continue ;
2011-10-07 02:27:37 +02:00
}
2011-10-23 09:24:37 +02:00
if (( $datarray [ 'verb' ] === ACTIVITY_TAG ) && ( $datarray [ 'object-type' ] === ACTIVITY_OBJ_TAGTERM )) {
2012-04-30 07:34:05 +02:00
2011-10-23 09:24:37 +02:00
$xo = parse_xml_string ( $datarray [ 'object' ], false );
$xt = parse_xml_string ( $datarray [ 'target' ], false );
2012-04-30 07:34:05 +02:00
if (( $xt -> type == ACTIVITY_OBJ_NOTE ) && ( $xt -> id )) {
// fetch the parent item
$tagp = q ( " select * from item where uri = '%s' and uid = %d limit 1 " ,
dbesc ( $xt -> id ),
intval ( $importer [ 'importer_uid' ])
);
if ( ! count ( $tagp ))
continue ;
2011-10-23 09:24:37 +02:00
// extract tag, if not duplicate, and this user allows tags, add to parent item
2011-11-17 02:09:58 +01:00
if ( $xo -> id && $xo -> content ) {
$newtag = '#[url=' . $xo -> id . ']' . $xo -> content . '[/url]' ;
2012-04-30 07:34:05 +02:00
if ( ! ( stristr ( $tagp [ 0 ][ 'tag' ], $newtag ))) {
2011-10-23 09:24:37 +02:00
$i = q ( " SELECT `blocktags` FROM `user` where `uid` = %d LIMIT 1 " ,
intval ( $importer [ 'importer_uid' ])
);
2012-04-30 07:34:05 +02:00
if ( count ( $i ) && ! intval ( $i [ 0 ][ 'blocktags' ])) {
q ( " UPDATE item SET tag = '%s', `edited` = '%s' WHERE id = %d LIMIT 1 " ,
dbesc ( $tagp [ 0 ][ 'tag' ] . ( strlen ( $tagp [ 0 ][ 'tag' ]) ? ',' : '' ) . $newtag ),
intval ( $tagp [ 0 ][ 'id' ]),
dbesc ( datetime_convert ())
2011-10-23 09:24:37 +02:00
);
}
}
}
}
}
2011-11-16 05:30:34 +01:00
2011-10-07 02:27:37 +02:00
$posted_id = item_store ( $datarray );
$parent = 0 ;
if ( $posted_id ) {
2012-08-16 02:14:29 +02:00
$r = q ( " SELECT `parent`, `parent-uri` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
2011-10-07 02:27:37 +02:00
intval ( $posted_id ),
intval ( $importer [ 'importer_uid' ])
);
2012-08-16 02:14:29 +02:00
if ( count ( $r )) {
2011-10-07 02:27:37 +02:00
$parent = $r [ 0 ][ 'parent' ];
2012-08-16 02:14:29 +02:00
$parent_uri = $r [ 0 ][ 'parent-uri' ];
}
2011-10-07 02:27:37 +02:00
if ( ! $is_like ) {
$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' ])
);
$r2 = q ( " UPDATE `item` SET `last-child` = 1, `changed` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
dbesc ( datetime_convert ()),
intval ( $importer [ 'importer_uid' ]),
intval ( $posted_id )
);
}
if ( $posted_id && $parent ) {
2012-08-10 06:06:18 +02:00
2011-10-07 02:27:37 +02:00
proc_run ( 'php' , " include/notifier.php " , " comment-import " , " $posted_id " );
2011-12-30 07:32:30 +01:00
if (( ! $is_like ) && ( ! $importer [ 'self' ])) {
2011-12-31 05:48:49 +01:00
require_once ( 'include/enotify.php' );
2011-12-30 07:32:30 +01:00
notification ( array (
'type' => NOTIFY_COMMENT ,
'notify_flags' => $importer [ 'notify-flags' ],
'language' => $importer [ 'language' ],
'to_name' => $importer [ 'username' ],
'to_email' => $importer [ 'email' ],
2012-02-18 11:57:42 +01:00
'uid' => $importer [ 'importer_uid' ],
2011-12-30 07:32:30 +01:00
'item' => $datarray ,
'link' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
'source_name' => stripslashes ( $datarray [ 'author-name' ]),
'source_link' => $datarray [ 'author-link' ],
'source_photo' => (( link_compare ( $datarray [ 'author-link' ], $importer [ 'url' ]))
2012-01-04 05:26:20 +01:00
? $importer [ 'thumb' ] : $datarray [ 'author-avatar' ]),
'verb' => ACTIVITY_POST ,
2012-02-25 22:23:00 +01:00
'otype' => 'item' ,
'parent' => $parent ,
2012-08-16 02:14:29 +02:00
'parent_uri' => $parent_uri ,
2011-10-07 02:27:37 +02:00
));
}
}
2012-02-21 04:50:05 +01:00
2011-10-07 02:27:37 +02:00
return 0 ;
// NOTREACHED
}
}
else {
// regular comment that is part of this total conversation. Have we seen it? If not, import it.
$item_id = $item -> get_id ();
$datarray = get_atom_elements ( $feed , $item );
2012-09-13 03:53:20 +02:00
if ( $importer [ 'rel' ] == CONTACT_IS_FOLLOWER )
continue ;
2011-10-07 02:27:37 +02:00
$r = q ( " SELECT `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
// Update content if 'updated' changes
if ( count ( $r )) {
if (( x ( $datarray , 'edited' ) !== false ) && ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) !== $r [ 0 ][ 'edited' ])) {
2012-06-12 03:14:49 +02:00
// do not accept (ignore) an earlier edit than one we currently have.
2012-06-12 11:47:05 +02:00
if ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) < $r [ 0 ][ 'edited' ])
2012-06-12 03:14:49 +02:00
continue ;
2012-03-23 00:17:10 +01:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2012-02-10 00:58:26 +01:00
dbesc ( $datarray [ 'title' ]),
2011-10-07 02:27:37 +02:00
dbesc ( $datarray [ 'body' ]),
2012-03-23 00:17:10 +01:00
dbesc ( $datarray [ 'tag' ]),
2011-10-07 02:27:37 +02:00
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
}
// update last-child if it changes
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
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 " ,
intval ( $allow [ 0 ][ 'data' ]),
dbesc ( datetime_convert ()),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
}
continue ;
}
$datarray [ 'parent-uri' ] = $parent_uri ;
$datarray [ 'uid' ] = $importer [ 'importer_uid' ];
$datarray [ 'contact-id' ] = $importer [ 'id' ];
if (( $datarray [ 'verb' ] == ACTIVITY_LIKE ) || ( $datarray [ 'verb' ] == ACTIVITY_DISLIKE )) {
$datarray [ 'type' ] = 'activity' ;
$datarray [ 'gravity' ] = GRAVITY_LIKE ;
2012-03-06 11:17:55 +01:00
// only one like or dislike per person
2012-06-24 06:11:18 +02:00
$r = q ( " select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent-uri` = '%s' OR `thr-parent` = '%s') limit 1 " ,
2012-03-06 11:17:55 +01:00
intval ( $datarray [ 'uid' ]),
intval ( $datarray [ 'contact-id' ]),
2012-06-24 06:11:18 +02:00
dbesc ( $datarray [ 'verb' ]),
dbesc ( $parent_uri ),
dbesc ( $parent_uri )
2012-03-06 11:17:55 +01:00
);
if ( $r && count ( $r ))
continue ;
2011-10-07 02:27:37 +02:00
}
2011-10-23 09:24:37 +02:00
if (( $datarray [ 'verb' ] === ACTIVITY_TAG ) && ( $datarray [ 'object-type' ] === ACTIVITY_OBJ_TAGTERM )) {
$xo = parse_xml_string ( $datarray [ 'object' ], false );
$xt = parse_xml_string ( $datarray [ 'target' ], false );
if ( $xt -> type == ACTIVITY_OBJ_NOTE ) {
$r = q ( " select * from item where `uri` = '%s' AND `uid` = %d limit 1 " ,
dbesc ( $xt -> id ),
intval ( $importer [ 'importer_uid' ])
);
if ( ! count ( $r ))
continue ;
// extract tag, if not duplicate, add to parent item
if ( $xo -> content ) {
if ( ! ( stristr ( $r [ 0 ][ 'tag' ], trim ( $xo -> content )))) {
q ( " UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1 " ,
dbesc ( $r [ 0 ][ 'tag' ] . ( strlen ( $r [ 0 ][ 'tag' ]) ? ',' : '' ) . '#[url=' . $xo -> id . ']' . $xo -> content . '[/url]' ),
intval ( $r [ 0 ][ 'id' ])
);
}
}
}
}
2011-10-07 02:27:37 +02:00
$posted_id = item_store ( $datarray );
// find out if our user is involved in this conversation and wants to be notified.
2012-04-17 13:33:50 +02:00
if ( ! x ( $datarray [ 'type' ]) || $datarray [ 'type' ] != 'activity' ) {
2011-10-07 02:27:37 +02:00
2012-04-23 04:19:02 +02:00
$myconv = q ( " SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0 " ,
2012-08-18 17:17:33 +02:00
dbesc ( $top_uri ),
2011-10-07 02:27:37 +02:00
intval ( $importer [ 'importer_uid' ])
);
2011-12-30 07:32:30 +01:00
2011-10-07 02:27:37 +02:00
if ( count ( $myconv )) {
$importer_url = $a -> get_baseurl () . '/profile/' . $importer [ 'nickname' ];
2011-12-30 07:32:30 +01:00
2012-03-01 04:23:01 +01:00
// first make sure this isn't our own post coming back to us from a wall-to-wall event
if ( ! link_compare ( $datarray [ 'author-link' ], $importer_url )) {
2011-10-07 02:27:37 +02:00
2012-02-25 22:23:00 +01:00
2012-03-01 04:23:01 +01:00
foreach ( $myconv as $conv ) {
2012-01-04 05:26:20 +01:00
2012-03-01 04:23:01 +01:00
// now if we find a match, it means we're in this conversation
if ( ! link_compare ( $conv [ 'author-link' ], $importer_url ))
continue ;
2011-10-07 02:27:37 +02:00
2012-03-01 04:23:01 +01:00
require_once ( 'include/enotify.php' );
$conv_parent = $conv [ 'parent' ];
notification ( array (
'type' => NOTIFY_COMMENT ,
'notify_flags' => $importer [ 'notify-flags' ],
'language' => $importer [ 'language' ],
'to_name' => $importer [ 'username' ],
'to_email' => $importer [ 'email' ],
'uid' => $importer [ 'importer_uid' ],
'item' => $datarray ,
'link' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
'source_name' => stripslashes ( $datarray [ 'author-name' ]),
'source_link' => $datarray [ 'author-link' ],
'source_photo' => (( link_compare ( $datarray [ 'author-link' ], $importer [ 'url' ]))
? $importer [ 'thumb' ] : $datarray [ 'author-avatar' ]),
'verb' => ACTIVITY_POST ,
'otype' => 'item' ,
'parent' => $conv_parent ,
2012-08-16 02:14:29 +02:00
'parent_uri' => $parent_uri
2012-03-01 04:23:01 +01:00
));
// only send one notification
break ;
}
2011-10-07 02:27:37 +02:00
}
}
}
continue ;
}
}
else {
// Head post of a conversation. Have we seen it? If not, import it.
$item_id = $item -> get_id ();
$datarray = get_atom_elements ( $feed , $item );
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' ];
$ev [ 'uri' ] = $item_id ;
$ev [ 'edited' ] = $datarray [ 'edited' ];
$ev [ 'private' ] = $datarray [ 'private' ];
$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 ;
}
}
$r = q ( " SELECT `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
// Update content if 'updated' changes
if ( count ( $r )) {
if (( x ( $datarray , 'edited' ) !== false ) && ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) !== $r [ 0 ][ 'edited' ])) {
2012-06-12 03:14:49 +02:00
// do not accept (ignore) an earlier edit than one we currently have.
2012-06-12 11:47:05 +02:00
if ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ]) < $r [ 0 ][ 'edited' ])
2012-06-12 03:14:49 +02:00
continue ;
2012-03-23 00:17:10 +01:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2012-02-10 00:58:26 +01:00
dbesc ( $datarray [ 'title' ]),
2011-10-07 02:27:37 +02:00
dbesc ( $datarray [ 'body' ]),
2012-03-23 00:17:10 +01:00
dbesc ( $datarray [ 'tag' ]),
2011-10-07 02:27:37 +02:00
dbesc ( datetime_convert ( 'UTC' , 'UTC' , $datarray [ 'edited' ])),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
}
// update last-child if it changes
$allow = $item -> get_item_tags ( NAMESPACE_DFRN , 'comment-allow' );
if ( $allow && $allow [ 0 ][ 'data' ] != $r [ 0 ][ 'last-child' ]) {
$r = q ( " UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
intval ( $allow [ 0 ][ 'data' ]),
dbesc ( datetime_convert ()),
dbesc ( $item_id ),
intval ( $importer [ 'importer_uid' ])
);
}
continue ;
}
// This is my contact on another system, but it's really me.
// Turn this into a wall post.
2012-02-28 23:52:23 +01:00
if ( $importer [ 'remote_self' ])
2011-10-07 02:27:37 +02:00
$datarray [ 'wall' ] = 1 ;
$datarray [ 'parent-uri' ] = $item_id ;
$datarray [ 'uid' ] = $importer [ 'importer_uid' ];
$datarray [ 'contact-id' ] = $importer [ 'id' ];
2012-03-05 03:50:32 +01:00
2012-08-13 03:42:43 +02:00
if ( ! link_compare ( $datarray [ 'owner-link' ], $importer [ 'url' ])) {
2012-03-05 03:50:32 +01:00
// The item owner info is not our contact. It's OK and is to be expected if this is a tgroup delivery,
// but otherwise there's a possible data mixup on the sender's system.
// the tgroup delivery code called from item_store will correct it if it's a forum,
// but we're going to unconditionally correct it here so that the post will always be owned by our contact.
logger ( 'local_delivery: Correcting item owner.' , LOGGER_DEBUG );
$datarray [ 'owner-name' ] = $importer [ 'senderName' ];
$datarray [ 'owner-link' ] = $importer [ 'url' ];
$datarray [ 'owner-avatar' ] = $importer [ 'thumb' ];
}
2012-09-13 03:53:20 +02:00
if (( $importer [ 'rel' ] == CONTACT_IS_FOLLOWER ) && ( ! tgroup_check ( $importer [ 'importer_uid' ], $datarray )))
continue ;
2012-07-20 05:13:40 +02:00
$posted_id = item_store ( $datarray );
if ( stristr ( $datarray [ 'verb' ], ACTIVITY_POKE )) {
$verb = urldecode ( substr ( $datarray [ 'verb' ], strpos ( $datarray [ 'verb' ], '#' ) + 1 ));
if ( ! $verb )
continue ;
$xo = parse_xml_string ( $datarray [ 'object' ], false );
if (( $xo -> type == ACTIVITY_OBJ_PERSON ) && ( $xo -> id )) {
// somebody was poked/prodded. Was it me?
$links = parse_xml_string ( " <links> " . unxmlify ( $xo -> link ) . " </links> " , false );
foreach ( $links -> link as $l ) {
$atts = $l -> attributes ();
switch ( $atts [ 'rel' ]) {
case " alternate " :
$Blink = $atts [ 'href' ];
break ;
default :
break ;
}
}
if ( $Blink && link_compare ( $Blink , $a -> get_baseurl () . '/profile/' . $importer [ 'nickname' ])) {
// send a notification
require_once ( 'include/enotify.php' );
notification ( array (
'type' => NOTIFY_POKE ,
'notify_flags' => $importer [ 'notify-flags' ],
'language' => $importer [ 'language' ],
'to_name' => $importer [ 'username' ],
'to_email' => $importer [ 'email' ],
'uid' => $importer [ 'importer_uid' ],
'item' => $datarray ,
'link' => $a -> get_baseurl () . '/display/' . $importer [ 'nickname' ] . '/' . $posted_id ,
'source_name' => stripslashes ( $datarray [ 'author-name' ]),
'source_link' => $datarray [ 'author-link' ],
'source_photo' => (( link_compare ( $datarray [ 'author-link' ], $importer [ 'url' ]))
? $importer [ 'thumb' ] : $datarray [ 'author-avatar' ]),
'verb' => $datarray [ 'verb' ],
'otype' => 'person' ,
'activity' => $verb ,
));
}
}
}
2011-10-07 02:27:37 +02:00
continue ;
}
}
return 0 ;
// NOTREACHED
}
2011-10-03 01:18:01 +02:00
function new_follower ( $importer , $contact , $datarray , $item , $sharing = false ) {
2010-10-25 05:39:24 +02:00
$url = notags ( trim ( $datarray [ 'author-link' ]));
$name = notags ( trim ( $datarray [ 'author-name' ]));
$photo = notags ( trim ( $datarray [ 'author-avatar' ]));
$rawtag = $item -> get_item_tags ( NAMESPACE_ACTIVITY , 'actor' );
if ( $rawtag && $rawtag [ 0 ][ 'child' ][ NAMESPACE_POCO ][ 'preferredUsername' ][ 0 ][ 'data' ])
$nick = $rawtag [ 0 ][ 'child' ][ NAMESPACE_POCO ][ 'preferredUsername' ][ 0 ][ 'data' ];
if ( is_array ( $contact )) {
2011-10-03 01:18:01 +02:00
if (( $contact [ 'network' ] == NETWORK_OSTATUS && $contact [ 'rel' ] == CONTACT_IS_SHARING )
|| ( $sharing && $contact [ 'rel' ] == CONTACT_IS_FOLLOWER )) {
2010-10-27 04:01:16 +02:00
$r = q ( " UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
2011-08-08 01:15:54 +02:00
intval ( CONTACT_IS_FRIEND ),
2010-10-25 05:39:24 +02:00
intval ( $contact [ 'id' ]),
intval ( $importer [ 'uid' ])
);
}
// send email notification to owner?
}
else {
2011-07-02 02:39:16 +02:00
// create contact record
2010-10-22 06:48:22 +02:00
2011-11-02 00:08:07 +01:00
$r = q ( " INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`,
2011-04-12 05:11:21 +02:00
`blocked` , `readonly` , `pending` , `writable` )
2011-11-02 00:08:07 +01:00
VALUES ( % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , % d , 0 , 0 , 1 , 1 ) " ,
2010-10-25 05:39:24 +02:00
intval ( $importer [ 'uid' ]),
dbesc ( datetime_convert ()),
dbesc ( $url ),
2011-11-02 00:08:07 +01:00
dbesc ( normalise_link ( $url )),
2010-10-25 05:39:24 +02:00
dbesc ( $name ),
dbesc ( $nick ),
dbesc ( $photo ),
2011-10-03 01:18:01 +02:00
dbesc (( $sharing ) ? NETWORK_ZOT : NETWORK_OSTATUS ),
intval (( $sharing ) ? CONTACT_IS_SHARING : CONTACT_IS_FOLLOWER )
2010-10-25 05:39:24 +02:00
);
2011-10-03 01:18:01 +02:00
$r = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 LIMIT 1 " ,
2010-10-25 05:39:24 +02:00
intval ( $importer [ 'uid' ]),
2011-10-03 01:18:01 +02:00
dbesc ( $url )
2010-10-25 05:39:24 +02:00
);
if ( count ( $r ))
$contact_record = $r [ 0 ];
// create notification
$hash = random_string ();
if ( is_array ( $contact_record )) {
$ret = q ( " INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `hash`, `datetime`)
VALUES ( % d , % d , 0 , 0 , '%s' , '%s' ) " ,
intval ( $importer [ 'uid' ]),
intval ( $contact_record [ 'id' ]),
dbesc ( $hash ),
dbesc ( datetime_convert ())
);
}
2010-11-06 22:40:19 +01:00
$r = q ( " SELECT * FROM `user` WHERE `uid` = %d LIMIT 1 " ,
intval ( $importer [ 'uid' ])
);
2011-01-09 22:18:56 +01:00
$a = get_app ();
2010-11-06 22:40:19 +01:00
if ( count ( $r )) {
2012-05-18 07:44:52 +02:00
if ( intval ( $r [ 0 ][ 'def_gid' ])) {
require_once ( 'include/group.php' );
group_add_member ( $r [ 0 ][ 'uid' ], '' , $contact_record [ 'id' ], $r [ 0 ][ 'def_gid' ]);
}
2010-11-06 22:40:19 +01:00
if (( $r [ 0 ][ 'notify-flags' ] & NOTIFY_INTRO ) && ( $r [ 0 ][ 'page-flags' ] == PAGE_NORMAL )) {
2011-05-11 13:37:13 +02:00
$email_tpl = get_intltext_template ( 'follow_notify_eml.tpl' );
2010-11-06 22:40:19 +01:00
$email = replace_macros ( $email_tpl , array (
'$requestor' => (( strlen ( $name )) ? $name : t ( '[Name Withheld]' )),
'$url' => $url ,
'$myname' => $r [ 0 ][ 'username' ],
'$siteurl' => $a -> get_baseurl (),
'$sitename' => $a -> config [ 'sitename' ]
));
$res = mail ( $r [ 0 ][ 'email' ],
2011-10-03 01:18:01 +02:00
(( $sharing ) ? t ( 'A new person is sharing with you at ' ) : t ( " You have a new follower at " )) . $a -> config [ 'sitename' ],
2010-11-06 22:40:19 +01:00
$email ,
2011-04-15 02:13:13 +02:00
'From: ' . t ( 'Administrator' ) . '@' . $_SERVER [ 'SERVER_NAME' ] . " \n "
. 'Content-type: text/plain; charset=UTF-8' . " \n "
. 'Content-transfer-encoding: 8bit' );
2010-11-06 22:40:19 +01:00
}
}
2010-10-25 05:39:24 +02:00
}
2010-10-22 06:48:22 +02:00
}
2010-10-25 05:39:24 +02:00
function lose_follower ( $importer , $contact , $datarray , $item ) {
2010-10-22 06:48:22 +02:00
2011-08-08 01:15:54 +02:00
if (( $contact [ 'rel' ] == CONTACT_IS_FRIEND ) || ( $contact [ 'rel' ] == CONTACT_IS_SHARING )) {
2010-10-25 05:39:24 +02:00
q ( " UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1 " ,
2011-08-08 01:15:54 +02:00
intval ( CONTACT_IS_SHARING ),
2010-10-25 05:39:24 +02:00
intval ( $contact [ 'id' ])
);
}
else {
contact_remove ( $contact [ 'id' ]);
}
2010-10-22 06:48:22 +02:00
}
2011-10-03 01:18:01 +02:00
function lose_sharer ( $importer , $contact , $datarray , $item ) {
if (( $contact [ 'rel' ] == CONTACT_IS_FRIEND ) || ( $contact [ 'rel' ] == CONTACT_IS_FOLLOWER )) {
q ( " UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1 " ,
intval ( CONTACT_IS_FOLLOWER ),
intval ( $contact [ 'id' ])
);
}
else {
contact_remove ( $contact [ 'id' ]);
}
}
2010-10-01 06:38:45 +02:00
2011-10-05 03:53:56 +02:00
function subscribe_to_hub ( $url , $importer , $contact , $hubmode = 'subscribe' ) {
2010-10-01 06:38:45 +02:00
2012-06-07 08:10:32 +02:00
$a = get_app ();
2010-10-01 06:38:45 +02:00
if ( is_array ( $importer )) {
$r = q ( " SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1 " ,
intval ( $importer [ 'uid' ])
);
}
2011-09-22 13:11:39 +02:00
// Diaspora has different message-ids in feeds than they do
// through the direct Diaspora protocol. If we try and use
// the feed, we'll get duplicates. So don't.
2011-08-24 13:42:28 +02:00
if (( ! count ( $r )) || $contact [ 'network' ] === NETWORK_DIASPORA )
2010-10-01 06:38:45 +02:00
return ;
$push_url = get_config ( 'system' , 'url' ) . '/pubsub/' . $r [ 0 ][ 'nickname' ] . '/' . $contact [ 'id' ];
2010-10-15 13:20:42 +02:00
// Use a single verify token, even if multiple hubs
$verify_token = (( strlen ( $contact [ 'hub-verify' ])) ? $contact [ 'hub-verify' ] : random_string ());
2010-10-01 06:38:45 +02:00
2011-09-22 13:11:39 +02:00
$params = 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode ( $push_url ) . '&hub.topic=' . urlencode ( $contact [ 'poll' ]) . '&hub.verify=async&hub.verify_token=' . $verify_token ;
2010-10-01 06:38:45 +02:00
2011-10-05 03:53:56 +02:00
logger ( 'subscribe_to_hub: ' . $hubmode . ' ' . $contact [ 'name' ] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token );
2010-11-05 04:47:44 +01:00
2010-10-15 13:20:42 +02:00
if ( ! strlen ( $contact [ 'hub-verify' ])) {
$r = q ( " UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d LIMIT 1 " ,
dbesc ( $verify_token ),
intval ( $contact [ 'id' ])
);
}
2010-10-01 06:38:45 +02:00
2012-06-07 08:10:32 +02:00
post_url ( $url , $params );
logger ( 'subscribe_to_hub: returns: ' . $a -> get_curl_code (), LOGGER_DEBUG );
2010-10-01 06:38:45 +02:00
return ;
2010-11-02 01:56:36 +01:00
}
function atom_author ( $tag , $name , $uri , $h , $w , $photo ) {
$o = '' ;
if ( ! $tag )
return $o ;
$name = xmlify ( $name );
$uri = xmlify ( $uri );
$h = intval ( $h );
$w = intval ( $w );
$photo = xmlify ( $photo );
$o .= " < $tag > \r \n " ;
$o .= " <name> $name </name> \r \n " ;
$o .= " <uri> $uri </uri> \r \n " ;
$o .= '<link rel="photo" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . " \r \n " ;
$o .= '<link rel="avatar" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . " \r \n " ;
2010-12-25 03:32:23 +01:00
call_hooks ( 'atom_author' , $o );
2010-11-02 01:56:36 +01:00
$o .= " </ $tag > \r \n " ;
return $o ;
}
2012-05-28 06:01:58 +02:00
function atom_entry ( $item , $type , $author , $owner , $comment = false , $cid = 0 ) {
2010-11-02 01:56:36 +01:00
2011-05-01 02:24:37 +02:00
$a = get_app ();
2011-10-15 12:26:37 +02:00
if ( ! $item [ 'parent' ])
return ;
2010-11-02 01:56:36 +01:00
if ( $item [ 'deleted' ])
return '<at:deleted-entry ref="' . xmlify ( $item [ 'uri' ]) . '" when="' . xmlify ( datetime_convert ( 'UTC' , 'UTC' , $item [ 'edited' ] . '+00:00' , ATOM_TIME )) . '" />' . " \r \n " ;
2011-05-01 02:24:37 +02:00
if ( $item [ 'allow_cid' ] || $item [ 'allow_gid' ] || $item [ 'deny_cid' ] || $item [ 'deny_gid' ])
2012-05-28 06:01:58 +02:00
$body = fix_private_photos ( $item [ 'body' ], $owner [ 'uid' ], $item , $cid );
2011-05-01 02:24:37 +02:00
else
$body = $item [ 'body' ];
2010-11-02 07:42:26 +01:00
$o = " \r \n \r \n <entry> \r \n " ;
2010-11-02 01:56:36 +01:00
if ( is_array ( $author ))
$o .= atom_author ( 'author' , $author [ 'name' ], $author [ 'url' ], 80 , 80 , $author [ 'thumb' ]);
else
2011-05-14 15:16:21 +02:00
$o .= atom_author ( 'author' ,(( $item [ 'author-name' ]) ? $item [ 'author-name' ] : $item [ 'name' ]),(( $item [ 'author-link' ]) ? $item [ 'author-link' ] : $item [ 'url' ]), 80 , 80 ,(( $item [ 'author-avatar' ]) ? $item [ 'author-avatar' ] : $item [ 'thumb' ]));
2010-11-02 01:56:36 +01:00
if ( strlen ( $item [ 'owner-name' ]))
$o .= atom_author ( 'dfrn:owner' , $item [ 'owner-name' ], $item [ 'owner-link' ], 80 , 80 , $item [ 'owner-avatar' ]);
2012-08-13 03:42:43 +02:00
if (( $item [ 'parent' ] != $item [ 'id' ]) || ( $item [ 'parent-uri' ] !== $item [ 'uri' ]) || (( $item [ 'thr-parent' ] !== '' ) && ( $item [ 'thr-parent' ] !== $item [ 'uri' ]))) {
2012-06-23 15:04:56 +02:00
$parent_item = (( $item [ 'thr-parent' ]) ? $item [ 'thr-parent' ] : $item [ 'parent-uri' ]);
$o .= '<thr:in-reply-to ref="' . xmlify ( $parent_item ) . '" type="text/html" href="' . xmlify ( $a -> get_baseurl () . '/display/' . $owner [ 'nickname' ] . '/' . $item [ 'parent' ]) . '" />' . " \r \n " ;
}
2010-11-02 01:56:36 +01:00
$o .= '<id>' . xmlify ( $item [ 'uri' ]) . '</id>' . " \r \n " ;
$o .= '<title>' . xmlify ( $item [ 'title' ]) . '</title>' . " \r \n " ;
$o .= '<published>' . xmlify ( datetime_convert ( 'UTC' , 'UTC' , $item [ 'created' ] . '+00:00' , ATOM_TIME )) . '</published>' . " \r \n " ;
$o .= '<updated>' . xmlify ( datetime_convert ( 'UTC' , 'UTC' , $item [ 'edited' ] . '+00:00' , ATOM_TIME )) . '</updated>' . " \r \n " ;
2011-05-01 02:24:37 +02:00
$o .= '<dfrn:env>' . base64url_encode ( $body , true ) . '</dfrn:env>' . " \r \n " ;
2011-08-19 04:14:13 +02:00
$o .= '<content type="' . $type . '" >' . xmlify ((( $type === 'html' ) ? bbcode ( $body ) : $body )) . '</content>' . " \r \n " ;
2011-02-16 11:07:11 +01:00
$o .= '<link rel="alternate" type="text/html" href="' . xmlify ( $a -> get_baseurl () . '/display/' . $owner [ 'nickname' ] . '/' . $item [ 'id' ]) . '" />' . " \r \n " ;
2010-11-02 01:56:36 +01:00
if ( $comment )
$o .= '<dfrn:comment-allow>' . intval ( $item [ 'last-child' ]) . '</dfrn:comment-allow>' . " \r \n " ;
2010-11-10 05:38:24 +01:00
if ( $item [ 'location' ]) {
2010-11-02 01:56:36 +01:00
$o .= '<dfrn:location>' . xmlify ( $item [ 'location' ]) . '</dfrn:location>' . " \r \n " ;
2010-11-10 05:38:24 +01:00
$o .= '<poco:address><poco:formatted>' . xmlify ( $item [ 'location' ]) . '</poco:formatted></poco:address>' . " \r \n " ;
}
2010-11-02 01:56:36 +01:00
if ( $item [ 'coord' ])
$o .= '<georss:point>' . xmlify ( $item [ 'coord' ]) . '</georss:point>' . " \r \n " ;
2010-12-08 05:47:53 +01:00
if (( $item [ 'private' ]) || strlen ( $item [ 'allow_cid' ]) || strlen ( $item [ 'allow_gid' ]) || strlen ( $item [ 'deny_cid' ]) || strlen ( $item [ 'deny_gid' ]))
2012-06-29 02:43:29 +02:00
$o .= '<dfrn:private>' . (( $item [ 'private' ]) ? $item [ 'private' ] : 1 ) . '</dfrn:private>' . " \r \n " ;
2010-12-08 05:47:53 +01:00
2011-05-23 03:40:00 +02:00
if ( $item [ 'extid' ])
2011-08-29 04:22:27 +02:00
$o .= '<dfrn:extid>' . xmlify ( $item [ 'extid' ]) . '</dfrn:extid>' . " \r \n " ;
2011-09-05 04:58:03 +02:00
if ( $item [ 'bookmark' ])
$o .= '<dfrn:bookmark>true</dfrn:bookmark>' . " \r \n " ;
2011-05-23 03:40:00 +02:00
2011-06-21 04:08:40 +02:00
if ( $item [ 'app' ])
2011-08-29 04:22:27 +02:00
$o .= '<statusnet:notice_info local_id="' . $item [ 'id' ] . '" source="' . xmlify ( $item [ 'app' ]) . '" ></statusnet:notice_info>' . " \r \n " ;
if ( $item [ 'guid' ])
$o .= '<dfrn:diaspora_guid>' . $item [ 'guid' ] . '</dfrn:diaspora_guid>' . " \r \n " ;
if ( $item [ 'signed_text' ]) {
$sign = base64_encode ( json_encode ( array ( 'signed_text' => $item [ 'signed_text' ], 'signature' => $item [ 'signature' ], 'signer' => $item [ 'signer' ])));
$o .= '<dfrn:diaspora_signature>' . xmlify ( $sign ) . '</dfrn:diaspora_signature>' . " \r \n " ;
}
2010-11-02 01:56:36 +01:00
$verb = construct_verb ( $item );
$o .= '<as:verb>' . xmlify ( $verb ) . '</as:verb>' . " \r \n " ;
2010-11-04 00:48:21 +01:00
$actobj = construct_activity_object ( $item );
2010-11-02 01:56:36 +01:00
if ( strlen ( $actobj ))
$o .= $actobj ;
2010-11-04 00:48:21 +01:00
$actarg = construct_activity_target ( $item );
if ( strlen ( $actarg ))
$o .= $actarg ;
2010-11-02 01:56:36 +01:00
2011-04-06 02:41:02 +02:00
$tags = item_getfeedtags ( $item );
if ( count ( $tags )) {
foreach ( $tags as $t ) {
$o .= '<category scheme="X-DFRN:' . xmlify ( $t [ 0 ]) . ':' . xmlify ( $t [ 1 ]) . '" term="' . xmlify ( $t [ 2 ]) . '" />' . " \r \n " ;
}
}
2011-04-07 04:41:16 +02:00
$o .= item_getfeedattach ( $item );
2010-11-02 01:56:36 +01:00
$mentioned = get_mentions ( $item );
if ( $mentioned )
$o .= $mentioned ;
2010-12-25 03:32:23 +01:00
call_hooks ( 'atom_entry' , $o );
2010-11-02 01:56:36 +01:00
$o .= '</entry>' . " \r \n " ;
return $o ;
}
2011-04-06 02:41:02 +02:00
2012-07-08 00:20:24 +02:00
function fix_private_photos ( $s , $uid , $item = null , $cid = 0 ) {
2011-05-01 02:24:37 +02:00
$a = get_app ();
2012-05-28 06:01:58 +02:00
logger ( 'fix_private_photos' , LOGGER_DEBUG );
2012-05-30 01:44:02 +02:00
$site = substr ( $a -> get_baseurl (), strpos ( $a -> get_baseurl (), '://' ));
2011-05-01 02:24:37 +02:00
2012-07-08 00:20:24 +02:00
$orig_body = $s ;
$new_body = '' ;
$img_start = strpos ( $orig_body , '[img' );
$img_st_close = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), ']' ) : false );
2012-07-08 02:47:13 +02:00
$img_len = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start + $img_st_close + 1 ), '[/img]' ) : false );
2012-07-08 00:20:24 +02:00
while ( ( $img_st_close !== false ) && ( $img_len !== false ) ) {
$img_st_close ++ ; // make it point to AFTER the closing bracket
$image = substr ( $orig_body , $img_start + $img_st_close , $img_len );
2012-05-28 06:01:58 +02:00
logger ( 'fix_private_photos: found photo ' . $image , LOGGER_DEBUG );
2012-07-08 00:20:24 +02:00
2012-05-28 06:01:58 +02:00
if ( stristr ( $image , $site . '/photo/' )) {
2012-07-08 00:20:24 +02:00
// Only embed locally hosted photos
2012-05-28 06:01:58 +02:00
$replace = false ;
2011-05-01 02:24:37 +02:00
$i = basename ( $image );
2012-06-08 01:02:56 +02:00
$i = str_replace ( array ( '.jpg' , '.png' ), array ( '' , '' ), $i );
2011-05-01 02:24:37 +02:00
$x = strpos ( $i , '-' );
2012-07-08 00:20:24 +02:00
2011-05-01 02:24:37 +02:00
if ( $x ) {
$res = substr ( $i , $x + 1 );
$i = substr ( $i , 0 , $x );
$r = q ( " SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` = %d AND `uid` = %d " ,
dbesc ( $i ),
intval ( $res ),
intval ( $uid )
);
if ( count ( $r )) {
2012-05-28 06:01:58 +02:00
// Check to see if we should replace this photo link with an embedded image
// 1. No need to do so if the photo is public
// 2. If there's a contact-id provided, see if they're in the access list
// for the photo. If so, embed it.
// 3. Otherwise, if we have an item, see if the item permissions match the photo
// permissions, regardless of order but first check to see if they're an exact
// match to save some processing overhead.
if ( has_permissions ( $r [ 0 ])) {
if ( $cid ) {
$recips = enumerate_permissions ( $r [ 0 ]);
if ( in_array ( $cid , $recips )) {
$replace = true ;
}
}
elseif ( $item ) {
if ( compare_permissions ( $item , $r [ 0 ]))
$replace = true ;
}
}
if ( $replace ) {
2012-07-08 00:20:24 +02:00
$data = $r [ 0 ][ 'data' ];
$type = $r [ 0 ][ 'type' ];
// If a custom width and height were specified, apply before embedding
if ( preg_match ( " / \ [img \ =([0-9]*)x([0-9]*) \ ]/is " , substr ( $orig_body , $img_start , $img_st_close ), $match )) {
logger ( 'fix_private_photos: scaling photo' , LOGGER_DEBUG );
$width = intval ( $match [ 1 ]);
$height = intval ( $match [ 2 ]);
$ph = new Photo ( $data , $type );
if ( $ph -> is_valid ()) {
$ph -> scaleImage ( max ( $width , $height ));
$data = $ph -> imageString ();
$type = $ph -> getType ();
}
}
2012-05-29 01:51:52 +02:00
logger ( 'fix_private_photos: replacing photo' , LOGGER_DEBUG );
2012-07-08 00:20:24 +02:00
$image = 'data:' . $type . ';base64,' . base64_encode ( $data );
logger ( 'fix_private_photos: replaced: ' . $image , LOGGER_DATA );
2012-05-28 06:01:58 +02:00
}
2011-05-01 02:24:37 +02:00
}
}
}
2012-07-08 00:20:24 +02:00
$new_body = $new_body . substr ( $orig_body , 0 , $img_start + $img_st_close ) . $image . '[/img]' ;
$orig_body = substr ( $orig_body , $img_start + $img_st_close + $img_len + strlen ( '[/img]' ));
if ( $orig_body === false )
$orig_body = '' ;
$img_start = strpos ( $orig_body , '[img' );
$img_st_close = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), ']' ) : false );
2012-07-08 02:47:13 +02:00
$img_len = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start + $img_st_close + 1 ), '[/img]' ) : false );
2011-05-01 02:24:37 +02:00
}
2012-07-08 00:20:24 +02:00
2012-07-08 02:47:13 +02:00
$new_body = $new_body . $orig_body ;
2012-07-08 00:20:24 +02:00
return ( $new_body );
2011-05-01 02:24:37 +02:00
}
2012-05-28 06:01:58 +02:00
function has_permissions ( $obj ) {
if (( $obj [ 'allow_cid' ] != '' ) || ( $obj [ 'allow_gid' ] != '' ) || ( $obj [ 'deny_cid' ] != '' ) || ( $obj [ 'deny_gid' ] != '' ))
return true ;
return false ;
}
function compare_permissions ( $obj1 , $obj2 ) {
// first part is easy. Check that these are exactly the same.
if (( $obj1 [ 'allow_cid' ] == $obj2 [ 'allow_cid' ])
&& ( $obj1 [ 'allow_gid' ] == $obj2 [ 'allow_gid' ])
&& ( $obj1 [ 'deny_cid' ] == $obj2 [ 'deny_cid' ])
&& ( $obj1 [ 'deny_gid' ] == $obj2 [ 'deny_gid' ]))
return true ;
// This is harder. Parse all the permissions and compare the resulting set.
$recipients1 = enumerate_permissions ( $obj1 );
$recipients2 = enumerate_permissions ( $obj2 );
sort ( $recipients1 );
sort ( $recipients2 );
if ( $recipients1 == $recipients2 )
return true ;
return false ;
}
// returns an array of contact-ids that are allowed to see this object
function enumerate_permissions ( $obj ) {
require_once ( 'include/group.php' );
$allow_people = expand_acl ( $obj [ 'allow_cid' ]);
$allow_groups = expand_groups ( expand_acl ( $obj [ 'allow_gid' ]));
$deny_people = expand_acl ( $obj [ 'deny_cid' ]);
$deny_groups = expand_groups ( expand_acl ( $obj [ 'deny_gid' ]));
$recipients = array_unique ( array_merge ( $allow_people , $allow_groups ));
$deny = array_unique ( array_merge ( $deny_people , $deny_groups ));
$recipients = array_diff ( $recipients , $deny );
return $recipients ;
}
2011-05-01 02:24:37 +02:00
2011-04-06 02:41:02 +02:00
function item_getfeedtags ( $item ) {
$ret = array ();
$matches = false ;
2011-06-08 07:13:07 +02:00
$cnt = preg_match_all ( '|\#\[url\=(.*?)\](.*?)\[\/url\]|' , $item [ 'tag' ], $matches );
2011-04-06 02:41:02 +02:00
if ( $cnt ) {
2011-11-12 11:53:53 +01:00
for ( $x = 0 ; $x < $cnt ; $x ++ ) {
2011-04-06 02:41:02 +02:00
if ( $matches [ 1 ][ $x ])
$ret [] = array ( '#' , $matches [ 1 ][ $x ], $matches [ 2 ][ $x ]);
}
}
$matches = false ;
2011-06-08 07:13:07 +02:00
$cnt = preg_match_all ( '|\@\[url\=(.*?)\](.*?)\[\/url\]|' , $item [ 'tag' ], $matches );
2011-04-06 02:41:02 +02:00
if ( $cnt ) {
2011-11-12 11:53:53 +01:00
for ( $x = 0 ; $x < $cnt ; $x ++ ) {
2011-04-06 02:41:02 +02:00
if ( $matches [ 1 ][ $x ])
2011-10-25 05:33:54 +02:00
$ret [] = array ( '@' , $matches [ 1 ][ $x ], $matches [ 2 ][ $x ]);
2011-04-06 02:41:02 +02:00
}
}
return $ret ;
}
2011-04-07 04:41:16 +02:00
function item_getfeedattach ( $item ) {
2011-04-07 05:03:06 +02:00
$ret = '' ;
2011-04-07 04:41:16 +02:00
$arr = explode ( ',' , $item [ 'attach' ]);
if ( count ( $arr )) {
foreach ( $arr as $r ) {
$matches = false ;
2011-08-04 04:18:58 +02:00
$cnt = preg_match ( '|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|' , $r , $matches );
2011-04-07 04:41:16 +02:00
if ( $cnt ) {
2011-04-07 05:36:24 +02:00
$ret .= '<link rel="enclosure" href="' . xmlify ( $matches [ 1 ]) . '" type="' . xmlify ( $matches [ 3 ]) . '" ' ;
2011-04-07 04:41:16 +02:00
if ( intval ( $matches [ 2 ]))
2011-08-04 04:18:58 +02:00
$ret .= 'length="' . intval ( $matches [ 2 ]) . '" ' ;
2011-04-07 04:41:16 +02:00
if ( $matches [ 4 ] !== ' ' )
2011-04-13 10:53:40 +02:00
$ret .= 'title="' . xmlify ( trim ( $matches [ 4 ])) . '" ' ;
2011-04-07 04:41:16 +02:00
$ret .= ' />' . " \r \n " ;
}
}
}
return $ret ;
}
2011-04-06 02:41:02 +02:00
2011-01-03 10:04:54 +01:00
2011-03-16 01:31:49 +01:00
function item_expire ( $uid , $days ) {
2012-05-29 08:24:10 +02:00
if (( ! $uid ) || ( $days < 1 ))
2011-03-16 01:31:49 +01:00
return ;
2012-05-29 08:24:10 +02:00
// $expire_network_only = save your own wall posts
// and just expire conversations started by others
2012-05-29 10:14:53 +02:00
$expire_network_only = get_pconfig ( $uid , 'expire' , 'network_only' );
2012-05-29 08:24:10 +02:00
$sql_extra = (( intval ( $expire_network_only )) ? " AND wall = 0 " : " " );
2011-03-16 01:31:49 +01:00
$r = q ( " SELECT * FROM `item`
WHERE `uid` = % d
AND `created` < UTC_TIMESTAMP () - INTERVAL % d DAY
AND `id` = `parent`
2012-05-29 08:24:10 +02:00
$sql_extra
2011-03-16 01:31:49 +01:00
AND `deleted` = 0 " ,
intval ( $uid ),
intval ( $days )
);
if ( ! count ( $r ))
return ;
2011-11-17 15:53:59 +01:00
$expire_items = get_pconfig ( $uid , 'expire' , 'items' );
$expire_items = (( $expire_items === false ) ? 1 : intval ( $expire_items )); // default if not set: 1
$expire_notes = get_pconfig ( $uid , 'expire' , 'notes' );
$expire_notes = (( $expire_notes === false ) ? 1 : intval ( $expire_notes )); // default if not set: 1
2011-11-22 04:01:05 +01:00
$expire_starred = get_pconfig ( $uid , 'expire' , 'starred' );
$expire_starred = (( $expire_starred === false ) ? 1 : intval ( $expire_starred )); // default if not set: 1
2011-11-17 15:53:59 +01:00
$expire_photos = get_pconfig ( $uid , 'expire' , 'photos' );
$expire_photos = (( $expire_photos === false ) ? 0 : intval ( $expire_photos )); // default if not set: 0
2011-03-16 01:31:49 +01:00
2011-11-22 04:01:05 +01:00
logger ( 'expire: # items=' . count ( $r ) . " ; expire items: $expire_items , expire notes: $expire_notes , expire starred: $expire_starred , expire photos: $expire_photos " );
2011-03-16 01:31:49 +01:00
foreach ( $r as $item ) {
2012-03-27 09:54:34 +02:00
// don't expire filed items
if ( strpos ( $item [ 'file' ], '[' ) !== false )
continue ;
2011-03-16 01:31:49 +01:00
// Only expire posts, not photos and photo comments
2011-11-17 15:53:59 +01:00
if ( $expire_photos == 0 && strlen ( $item [ 'resource-id' ]))
continue ;
2011-11-22 04:01:05 +01:00
if ( $expire_starred == 0 && intval ( $item [ 'starred' ]))
continue ;
2011-11-17 15:53:59 +01:00
if ( $expire_notes == 0 && $item [ 'type' ] == 'note' )
2011-03-16 01:31:49 +01:00
continue ;
2011-11-17 15:53:59 +01:00
if ( $expire_items == 0 && $item [ 'type' ] != 'note' )
continue ;
2012-05-05 16:05:32 +02:00
drop_item ( $item [ 'id' ], false );
2011-03-16 01:31:49 +01:00
}
proc_run ( 'php' , " include/notifier.php " , " expire " , " $uid " );
2011-11-17 15:53:59 +01:00
2011-06-11 05:39:46 +02:00
}
2011-06-16 05:43:39 +02:00
function drop_items ( $items ) {
$uid = 0 ;
2012-04-17 13:33:50 +02:00
if ( ! local_user () && ! remote_user ())
2012-01-25 03:59:55 +01:00
return ;
2011-06-16 05:43:39 +02:00
if ( count ( $items )) {
foreach ( $items as $item ) {
$owner = drop_item ( $item , false );
if ( $owner && ! $uid )
$uid = $owner ;
}
}
// multiple threads may have been deleted, send an expire notification
if ( $uid )
proc_run ( 'php' , " include/notifier.php " , " expire " , " $uid " );
}
function drop_item ( $id , $interactive = true ) {
$a = get_app ();
// locate item to be deleted
$r = q ( " SELECT * FROM `item` WHERE `id` = %d LIMIT 1 " ,
intval ( $id )
);
if ( ! count ( $r )) {
if ( ! $interactive )
return 0 ;
notice ( t ( 'Item not found.' ) . EOL );
goaway ( $a -> get_baseurl () . '/' . $_SESSION [ 'return_url' ]);
}
$item = $r [ 0 ];
$owner = $item [ 'uid' ];
2012-09-05 07:50:28 +02:00
$cid = 0 ;
2011-06-16 05:43:39 +02:00
// check if logged in user is either the author or owner of this item
2012-09-05 07:50:28 +02:00
if ( is_array ( $_SESSION [ 'remote' ])) {
foreach ( $_SESSION [ 'remote' ] as $visitor ) {
if ( $visitor [ 'uid' ] == $item [ 'uid' ] && $visitor [ 'cid' ] == $item [ 'contact-id' ]) {
$cid = $visitor [ 'cid' ];
break ;
}
}
}
if (( local_user () == $item [ 'uid' ]) || ( $cid ) || ( ! $interactive )) {
2011-06-16 05:43:39 +02:00
2012-08-06 06:43:20 +02:00
logger ( 'delete item: ' . $item [ 'id' ], LOGGER_DEBUG );
2011-06-16 05:43:39 +02:00
// delete the item
2012-02-10 00:58:26 +01:00
$r = q ( " UPDATE `item` SET `deleted` = 1, `title` = '', `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1 " ,
2011-06-16 05:43:39 +02:00
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ()),
intval ( $item [ 'id' ])
);
2012-05-05 16:05:32 +02:00
// clean up categories and tags so they don't end up as orphans
$matches = false ;
$cnt = preg_match_all ( '/<(.*?)>/' , $item [ 'file' ], $matches , PREG_SET_ORDER );
if ( $cnt ) {
foreach ( $matches as $mtch ) {
file_tag_unsave_file ( $item [ 'uid' ], $item [ 'id' ], $mtch [ 1 ], true );
}
}
$matches = false ;
$cnt = preg_match_all ( '/\[(.*?)\]/' , $item [ 'file' ], $matches , PREG_SET_ORDER );
if ( $cnt ) {
foreach ( $matches as $mtch ) {
file_tag_unsave_file ( $item [ 'uid' ], $item [ 'id' ], $mtch [ 1 ], false );
}
}
2011-06-16 05:43:39 +02:00
// If item is a link to a photo resource, nuke all the associated photos
// (visitors will not have photo resources)
// This only applies to photos uploaded from the photos page. Photos inserted into a post do not
// generate a resource-id and therefore aren't intimately linked to the item.
if ( strlen ( $item [ 'resource-id' ])) {
q ( " DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d " ,
dbesc ( $item [ 'resource-id' ]),
intval ( $item [ 'uid' ])
);
// ignore the result
}
// If item is a link to an event, nuke the event record.
if ( intval ( $item [ 'event-id' ])) {
q ( " DELETE FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $item [ 'event-id' ]),
intval ( $item [ 'uid' ])
);
// ignore the result
}
2012-05-05 16:05:32 +02:00
// clean up item_id and sign meta-data tables
$r = q ( " DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d) " ,
intval ( $item [ 'id' ]),
intval ( $item [ 'uid' ])
);
$r = q ( " DELETE FROM sign where iid in (select id from item where parent = %d and uid = %d) " ,
intval ( $item [ 'id' ]),
intval ( $item [ 'uid' ])
);
2011-06-16 05:43:39 +02:00
// If it's the parent of a comment thread, kill all the kids
if ( $item [ 'uri' ] == $item [ 'parent-uri' ]) {
2012-02-10 00:58:26 +01:00
$r = q ( " UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = ''
2011-06-16 05:43:39 +02:00
WHERE `parent-uri` = '%s' AND `uid` = % d " ,
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ()),
dbesc ( $item [ 'parent-uri' ]),
intval ( $item [ 'uid' ])
);
// ignore the result
}
else {
// ensure that last-child is set in case the comment that had it just got wiped.
q ( " UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d " ,
dbesc ( datetime_convert ()),
dbesc ( $item [ 'parent-uri' ]),
intval ( $item [ 'uid' ])
);
// 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 `edited` DESC LIMIT 1 " ,
dbesc ( $item [ 'parent-uri' ]),
intval ( $item [ 'uid' ])
);
if ( count ( $r )) {
q ( " UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1 " ,
intval ( $r [ 0 ][ 'id' ])
);
2012-06-01 03:40:12 +02:00
}
2012-06-10 02:39:21 +02:00
// Add a relayable_retraction signature for Diaspora.
store_diaspora_retract_sig ( $item , $a -> user , $a -> get_baseurl ());
2011-06-16 05:43:39 +02:00
}
$drop_id = intval ( $item [ 'id' ]);
2012-05-05 16:05:32 +02:00
2011-06-16 05:43:39 +02:00
// send the notification upstream/downstream as the case may be
2012-11-02 00:42:40 +01:00
proc_run ( 'php' , " include/notifier.php " , " drop " , " $drop_id " );
2011-06-16 05:43:39 +02:00
if ( ! $interactive )
return $owner ;
goaway ( $a -> get_baseurl () . '/' . $_SESSION [ 'return_url' ]);
//NOTREACHED
}
else {
if ( ! $interactive )
return 0 ;
notice ( t ( 'Permission denied.' ) . EOL );
goaway ( $a -> get_baseurl () . '/' . $_SESSION [ 'return_url' ]);
//NOTREACHED
}
2011-10-23 09:24:37 +02:00
}
2012-06-13 05:46:30 +02:00
function first_post_date ( $uid , $wall = false ) {
2012-06-13 06:34:28 +02:00
$r = q ( " select id, created from item
2012-06-13 05:46:30 +02:00
where uid = % d and wall = % d and deleted = 0 and visible = 1 AND moderated = 0
2012-06-13 06:38:10 +02:00
and id = parent
2012-06-13 05:46:30 +02:00
order by created asc limit 1 " ,
intval ( $uid ),
intval ( $wall ? 1 : 0 )
);
2012-06-13 06:34:28 +02:00
if ( count ( $r )) {
2012-06-13 06:39:39 +02:00
// logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA);
2012-06-13 07:52:34 +02:00
return substr ( datetime_convert ( '' , date_default_timezone_get (), $r [ 0 ][ 'created' ]), 0 , 10 );
2012-06-13 06:34:28 +02:00
}
2012-06-13 05:46:30 +02:00
return false ;
}
function posted_dates ( $uid , $wall ) {
2012-06-13 07:52:34 +02:00
$dnow = datetime_convert ( '' , date_default_timezone_get (), 'now' , 'Y-m-d' );
2012-06-13 05:46:30 +02:00
$dthen = first_post_date ( $uid , $wall );
if ( ! $dthen )
return array ();
2012-06-13 07:52:34 +02:00
// If it's near the end of a long month, backup to the 28th so that in
// consecutive loops we'll always get a whole month difference.
if ( intval ( substr ( $dnow , 8 )) > 28 )
$dnow = substr ( $dnow , 0 , 8 ) . '28' ;
if ( intval ( substr ( $dthen , 8 )) > 28 )
$dnow = substr ( $dthen , 0 , 8 ) . '28' ;
2012-06-13 05:46:30 +02:00
$ret = array ();
2012-07-08 16:46:46 +02:00
// Starting with the current month, get the first and last days of every
// month down to and including the month of the first post
while ( substr ( $dnow , 0 , 7 ) >= substr ( $dthen , 0 , 7 )) {
2012-06-14 05:59:19 +02:00
$dstart = substr ( $dnow , 0 , 8 ) . '01' ;
$dend = substr ( $dnow , 0 , 8 ) . get_dim ( intval ( $dnow ), intval ( substr ( $dnow , 5 )));
$start_month = datetime_convert ( '' , '' , $dstart , 'Y-m-d' );
$end_month = datetime_convert ( '' , '' , $dend , 'Y-m-d' );
2012-06-13 05:46:30 +02:00
$str = day_translate ( datetime_convert ( '' , '' , $dnow , 'F Y' ));
$ret [] = array ( $str , $end_month , $start_month );
$dnow = datetime_convert ( '' , '' , $dnow . ' -1 month' , 'Y-m-d' );
}
return $ret ;
}
function posted_date_widget ( $url , $uid , $wall ) {
$o = '' ;
2012-06-14 01:17:45 +02:00
// For former Facebook folks that left because of "timeline"
if ( $wall && intval ( get_pconfig ( $uid , 'system' , 'no_wall_archive_widget' )))
return $o ;
2012-06-13 05:46:30 +02:00
$ret = posted_dates ( $uid , $wall );
if ( ! count ( $ret ))
return $o ;
$o = replace_macros ( get_markup_template ( 'posted_date_widget.tpl' ), array (
'$title' => t ( 'Archives' ),
'$size' => (( count ( $ret ) > 6 ) ? 6 : count ( $ret )),
'$url' => $url ,
'$dates' => $ret
));
return $o ;
2012-06-29 21:40:54 +02:00
}
2012-06-10 02:39:21 +02:00
function store_diaspora_retract_sig ( $item , $user , $baseurl ) {
// Note that we can't add a target_author_signature
// if the comment was deleted by a remote user. That should be ok, because if a remote user is deleting
// the comment, that means we're the home of the post, and Diaspora will only
// check the parent_author_signature of retractions that it doesn't have to relay further
//
// I don't think this function gets called for an "unlike," but I'll check anyway
$enabled = intval ( get_config ( 'system' , 'diaspora_enabled' ));
if ( ! $enabled ) {
2012-06-13 03:05:01 +02:00
logger ( 'drop_item: diaspora support disabled, not storing retraction signature' , LOGGER_DEBUG );
2012-06-10 02:39:21 +02:00
return ;
}
logger ( 'drop_item: storing diaspora retraction signature' );
$signed_text = $item [ 'guid' ] . ';' . ( ( $item [ 'verb' ] === ACTIVITY_LIKE ) ? 'Like' : 'Comment' );
if ( local_user () == $item [ 'uid' ]) {
$handle = $user [ 'nickname' ] . '@' . substr ( $baseurl , strpos ( $baseurl , '://' ) + 3 );
$authorsig = base64_encode ( rsa_sign ( $signed_text , $user [ 'prvkey' ], 'sha256' ));
}
else {
$r = q ( " SELECT `nick`, `url` FROM `contact` WHERE `id` = '%d' LIMIT 1 " ,
2012-07-11 03:28:38 +02:00
$item [ 'contact-id' ] // If this function gets called, drop_item() has already checked remote_user() == $item['contact-id']
2012-06-10 02:39:21 +02:00
);
if ( count ( $r )) {
// The below handle only works for NETWORK_DFRN. I think that's ok, because this function
// only handles DFRN deletes
$handle_baseurl_start = strpos ( $r [ 'url' ], '://' ) + 3 ;
$handle_baseurl_length = strpos ( $r [ 'url' ], '/profile' ) - $handle_baseurl_start ;
$handle = $r [ 'nick' ] . '@' . substr ( $r [ 'url' ], $handle_baseurl_start , $handle_baseurl_length );
$authorsig = '' ;
}
}
if ( isset ( $handle ))
q ( " insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') " ,
intval ( $item [ 'id' ]),
dbesc ( $signed_text ),
dbesc ( $authorsig ),
dbesc ( $handle )
);
return ;
}