2010-07-01 23:48:07 +00:00
< ? php
2017-03-30 19:32:12 +00:00
/*
2011-02-04 21:37:04 +00:00
* This is the POST destination for most all locally posted
2013-12-27 00:58:21 +00:00
* text stuff . This function handles status , wall - to - wall status ,
* local comments , and remote coments that are posted on this site
2011-02-04 21:37:04 +00:00
* ( as opposed to being delivered in a feed ) .
2013-12-27 00:58:21 +00:00
* Also processed here are posts and comments coming through the
* statusnet / twitter API .
2017-03-30 19:32:12 +00:00
*
2013-12-27 00:58:21 +00:00
* All of these become an " item " which is our basic unit of
2011-02-04 21:37:04 +00:00
* information .
2017-03-30 19:32:12 +00:00
*
2013-12-27 00:58:21 +00:00
* Posts that originate externally or do not fall into the above
* posting categories go through item_store () instead of this function .
*/
2010-10-06 07:33:11 +00:00
2017-04-30 04:07:00 +00:00
use Friendica\App ;
2017-11-07 02:22:52 +00:00
use Friendica\Core\Config ;
2017-08-26 06:04:21 +00:00
use Friendica\Core\System ;
2017-11-05 12:15:53 +00:00
use Friendica\Core\Worker ;
2017-11-08 03:57:46 +00:00
use Friendica\Database\DBM ;
2017-11-15 14:47:28 +00:00
use Friendica\Model\GlobalContact ;
2017-11-07 02:22:52 +00:00
use Friendica\Network\Probe ;
2017-11-19 21:55:28 +00:00
use Friendica\Object\Contact ;
2017-11-08 00:37:53 +00:00
use Friendica\Protocol\Diaspora ;
2017-04-30 04:07:00 +00:00
2017-03-30 19:32:12 +00:00
require_once 'include/crypto.php' ;
require_once 'include/enotify.php' ;
require_once 'include/email.php' ;
require_once 'include/tags.php' ;
require_once 'include/files.php' ;
require_once 'include/threads.php' ;
require_once 'include/text.php' ;
require_once 'include/items.php' ;
require_once 'include/Contact.php' ;
2011-08-29 02:22:27 +00:00
2017-01-09 12:14:25 +00:00
function item_post ( App $a ) {
2010-07-19 13:58:03 +00:00
2017-03-31 18:47:23 +00:00
if (( ! local_user ()) && ( ! remote_user ()) && ( ! x ( $_REQUEST , 'commenter' ))) {
2010-07-01 23:48:07 +00:00
return ;
2017-03-30 19:32:12 +00:00
}
2010-07-01 23:48:07 +00:00
2017-03-31 18:30:21 +00:00
require_once 'include/security.php' ;
2010-07-01 23:48:07 +00:00
2010-11-01 03:36:59 +00:00
$uid = local_user ();
2010-07-26 11:22:19 +00:00
2017-03-30 19:32:12 +00:00
if ( x ( $_REQUEST , 'dropitems' )) {
$arr_drop = explode ( ',' , $_REQUEST [ 'dropitems' ]);
2011-06-16 03:43:39 +00:00
drop_items ( $arr_drop );
2011-06-16 07:38:41 +00:00
$json = array ( 'success' => 1 );
echo json_encode ( $json );
2011-06-16 03:43:39 +00:00
killme ();
}
2012-01-12 22:20:21 +00:00
call_hooks ( 'post_local_start' , $_REQUEST );
2017-03-30 19:32:12 +00:00
// logger('postinput ' . file_get_contents('php://input'));
2012-01-15 21:57:00 +00:00
logger ( 'postvars ' . print_r ( $_REQUEST , true ), LOGGER_DATA );
2012-01-10 02:52:49 +00:00
2017-03-30 19:32:12 +00:00
$api_source = (( x ( $_REQUEST , 'api_source' ) && $_REQUEST [ 'api_source' ]) ? true : false );
2013-05-09 08:15:22 +00:00
2017-03-30 19:32:12 +00:00
$message_id = (( x ( $_REQUEST , 'message_id' ) && $api_source ) ? strip_tags ( $_REQUEST [ 'message_id' ]) : '' );
2013-05-09 08:15:22 +00:00
2017-03-30 19:32:12 +00:00
$return_path = (( x ( $_REQUEST , 'return' )) ? $_REQUEST [ 'return' ] : '' );
$preview = (( x ( $_REQUEST , 'preview' )) ? intval ( $_REQUEST [ 'preview' ]) : 0 );
2011-08-01 03:01:00 +00:00
2017-03-30 19:32:12 +00:00
/*
* Check for doubly - submitted posts , and reject duplicates
* Note that we have to ignore previews , otherwise nothing will post
* after it ' s been previewed
*/
if ( ! $preview && x ( $_REQUEST , 'post_id_random' )) {
if ( x ( $_SESSION , 'post-random' ) && $_SESSION [ 'post-random' ] == $_REQUEST [ 'post_id_random' ]) {
2012-11-01 23:14:42 +00:00
logger ( " item post: duplicate post " , LOGGER_DEBUG );
2017-08-26 07:32:10 +00:00
item_post_return ( System :: baseUrl (), $api_source , $return_path );
2017-03-30 19:32:12 +00:00
} else {
2012-11-01 23:14:42 +00:00
$_SESSION [ 'post-random' ] = $_REQUEST [ 'post_id_random' ];
2016-12-20 20:15:53 +00:00
}
2012-11-01 23:14:42 +00:00
}
2017-03-30 19:32:12 +00:00
// Is this a reply to something?
2017-03-31 18:47:23 +00:00
$parent = (( x ( $_REQUEST , 'parent' )) ? intval ( $_REQUEST [ 'parent' ]) : 0 );
$parent_uri = (( x ( $_REQUEST , 'parent_uri' )) ? trim ( $_REQUEST [ 'parent_uri' ]) : '' );
2010-07-13 23:09:53 +00:00
$parent_item = null ;
2011-02-08 23:08:07 +00:00
$parent_contact = null ;
2011-08-01 03:01:00 +00:00
$thr_parent = '' ;
$parid = 0 ;
2011-08-01 00:52:36 +00:00
$r = false ;
2014-08-07 06:02:24 +00:00
$objecttype = null ;
2010-07-13 23:09:53 +00:00
2016-12-20 20:15:53 +00:00
if ( $parent || $parent_uri ) {
2011-08-03 23:29:25 +00:00
2014-08-07 06:02:24 +00:00
$objecttype = ACTIVITY_OBJ_COMMENT ;
2017-03-31 18:47:23 +00:00
if ( ! x ( $_REQUEST , 'type' )) {
2012-01-12 22:20:21 +00:00
$_REQUEST [ 'type' ] = 'net-comment' ;
2016-12-20 20:15:53 +00:00
}
2011-08-03 23:29:25 +00:00
2016-12-20 20:15:53 +00:00
if ( $parent ) {
2011-08-01 00:52:36 +00:00
$r = q ( " SELECT * FROM `item` WHERE `id` = %d LIMIT 1 " ,
intval ( $parent )
);
2017-01-01 23:18:42 +00:00
} elseif ( $parent_uri && local_user ()) {
2011-08-03 23:29:25 +00:00
// This is coming from an API source, and we are logged in
2011-08-01 00:52:36 +00:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $parent_uri ),
intval ( local_user ())
);
2011-08-03 23:29:25 +00:00
}
2015-01-11 23:14:51 +00:00
2011-08-03 23:29:25 +00:00
// if this isn't the real parent of the conversation, find it
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2011-08-03 23:29:25 +00:00
$parid = $r [ 0 ][ 'parent' ];
2012-07-27 20:08:57 +00:00
$parent_uri = $r [ 0 ][ 'uri' ];
2016-12-20 20:15:53 +00:00
if ( $r [ 0 ][ 'id' ] != $r [ 0 ][ 'parent' ]) {
2011-08-01 03:01:00 +00:00
$r = q ( " SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1 " ,
intval ( $parid )
);
}
2012-07-23 11:58:47 +00:00
}
2011-08-01 00:52:36 +00:00
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2010-08-05 03:03:38 +00:00
notice ( t ( 'Unable to locate original post.' ) . EOL );
2017-03-31 18:47:23 +00:00
if ( x ( $_REQUEST , 'return' )) {
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2016-12-20 20:15:53 +00:00
}
2011-02-17 04:25:10 +00:00
killme ();
2010-07-13 23:09:53 +00:00
}
$parent_item = $r [ 0 ];
2011-08-01 00:52:36 +00:00
$parent = $r [ 0 ][ 'id' ];
2011-08-01 03:01:00 +00:00
// multi-level threading - preserve the info but re-parent to our single level threading
2017-03-21 16:02:59 +00:00
//if(($parid) && ($parid != $parent))
2012-11-01 23:14:42 +00:00
$thr_parent = $parent_uri ;
2011-08-01 03:01:00 +00:00
2016-12-20 20:15:53 +00:00
if ( $parent_item [ 'contact-id' ] && $uid ) {
2011-02-08 23:08:07 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $parent_item [ 'contact-id' ]),
intval ( $uid )
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2011-02-08 23:08:07 +00:00
$parent_contact = $r [ 0 ];
2017-03-30 19:32:12 +00:00
}
2015-01-11 23:14:51 +00:00
2015-06-07 23:19:40 +00:00
// If the contact id doesn't fit with the contact, then set the contact to null
$thrparent = q ( " SELECT `author-link`, `network` FROM `item` WHERE `uri` = '%s' LIMIT 1 " , dbesc ( $thr_parent ));
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $thrparent ) && ( $thrparent [ 0 ][ " network " ] === NETWORK_OSTATUS )
2017-06-08 02:00:59 +00:00
&& ( normalise_link ( $parent_contact [ " url " ]) != normalise_link ( $thrparent [ 0 ][ " author-link " ]))) {
2017-11-19 22:03:39 +00:00
$parent_contact = Contact :: getDetailsByURL ( $thrparent [ 0 ][ " author-link " ]);
2016-01-07 22:43:16 +00:00
if ( ! isset ( $parent_contact [ " nick " ])) {
2017-11-07 02:22:52 +00:00
$probed_contact = Probe :: uri ( $thrparent [ 0 ][ " author-link " ]);
2016-01-07 22:43:16 +00:00
if ( $probed_contact [ " network " ] != NETWORK_FEED ) {
$parent_contact = $probed_contact ;
$parent_contact [ " nurl " ] = normalise_link ( $probed_contact [ " url " ]);
$parent_contact [ " thumb " ] = $probed_contact [ " photo " ];
$parent_contact [ " micro " ] = $probed_contact [ " photo " ];
$parent_contact [ " addr " ] = $probed_contact [ " addr " ];
}
2015-06-07 23:19:40 +00:00
}
2017-03-30 19:32:12 +00:00
logger ( 'no contact found: ' . print_r ( $thrparent , true ), LOGGER_DEBUG );
} else {
logger ( 'parent contact: ' . print_r ( $parent_contact , true ), LOGGER_DEBUG );
}
2016-02-14 14:08:49 +00:00
2017-03-30 19:32:12 +00:00
if ( $parent_contact [ " nick " ] == " " ) {
2016-02-14 14:08:49 +00:00
$parent_contact [ " nick " ] = $parent_contact [ " name " ];
2017-03-30 19:32:12 +00:00
}
2011-02-08 23:08:07 +00:00
}
2010-07-13 23:09:53 +00:00
}
2017-03-30 19:32:12 +00:00
if ( $parent ) {
logger ( 'mod_item: item_post parent=' . $parent );
}
2011-08-01 00:52:36 +00:00
2017-03-31 18:47:23 +00:00
$profile_uid = (( x ( $_REQUEST , 'profile_uid' )) ? intval ( $_REQUEST [ 'profile_uid' ]) : 0 );
$post_id = (( x ( $_REQUEST , 'post_id' )) ? intval ( $_REQUEST [ 'post_id' ]) : 0 );
$app = (( x ( $_REQUEST , 'source' )) ? strip_tags ( $_REQUEST [ 'source' ]) : '' );
$extid = (( x ( $_REQUEST , 'extid' )) ? strip_tags ( $_REQUEST [ 'extid' ]) : '' );
$object = (( x ( $_REQUEST , 'object' )) ? $_REQUEST [ 'object' ] : '' );
2010-08-14 14:55:18 +00:00
2016-10-17 19:17:11 +00:00
// Check for multiple posts with the same message id (when the post was created via API)
2017-06-08 02:00:59 +00:00
if (( $message_id != '' ) && ( $profile_uid != 0 )) {
2016-10-17 19:17:11 +00:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $message_id ),
intval ( $profile_uid )
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2016-10-17 19:17:11 +00:00
logger ( " Message with URI " . $message_id . " already exists for user " . $profile_uid , LOGGER_DEBUG );
return ;
}
}
2012-01-25 02:59:55 +00:00
$allow_moderated = false ;
// here is where we are going to check for permission to post a moderated comment.
// First check that the parent exists and it is a wall item.
2017-03-30 19:32:12 +00:00
if (( x ( $_REQUEST , 'commenter' )) && (( ! $parent ) || ( ! $parent_item [ 'wall' ]))) {
notice ( t ( 'Permission denied.' ) . EOL ) ;
if ( x ( $_REQUEST , 'return' )) {
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2017-03-30 19:32:12 +00:00
}
2012-01-25 02:59:55 +00:00
killme ();
}
2017-03-30 19:32:12 +00:00
/*
* Now check that it is a page_type of PAGE_BLOG , and that valid personal details
* have been provided , and run any anti - spam plugins
*/
if (( ! can_write_wall ( $a , $profile_uid )) && ( ! $allow_moderated )) {
notice ( t ( 'Permission denied.' ) . EOL ) ;
if ( x ( $_REQUEST , 'return' )) {
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2017-03-30 19:32:12 +00:00
}
2011-02-17 04:25:10 +00:00
killme ();
2010-07-01 23:48:07 +00:00
}
2010-08-14 14:55:18 +00:00
2011-03-18 12:06:16 +00:00
// is this an edited post?
$orig_post = null ;
2017-03-30 19:32:12 +00:00
if ( $post_id ) {
2011-03-18 12:06:16 +00:00
$i = q ( " SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
intval ( $profile_uid ),
intval ( $post_id )
);
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $i )) {
2011-03-18 12:06:16 +00:00
killme ();
2016-12-20 14:37:27 +00:00
}
2011-03-18 12:06:16 +00:00
$orig_post = $i [ 0 ];
}
2010-08-14 14:55:18 +00:00
$user = null ;
$r = q ( " SELECT * FROM `user` WHERE `uid` = %d LIMIT 1 " ,
intval ( $profile_uid )
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2010-08-14 14:55:18 +00:00
$user = $r [ 0 ];
2017-03-30 19:32:12 +00:00
}
2011-11-29 04:09:10 +00:00
2017-03-30 19:32:12 +00:00
if ( $orig_post ) {
2011-03-18 12:06:16 +00:00
$str_group_allow = $orig_post [ 'allow_gid' ];
$str_contact_allow = $orig_post [ 'allow_cid' ];
$str_group_deny = $orig_post [ 'deny_gid' ];
$str_contact_deny = $orig_post [ 'deny_cid' ];
$location = $orig_post [ 'location' ];
$coord = $orig_post [ 'coord' ];
$verb = $orig_post [ 'verb' ];
2014-08-07 06:02:24 +00:00
$objecttype = $orig_post [ 'object-type' ];
2011-03-18 12:06:16 +00:00
$emailcc = $orig_post [ 'emailcc' ];
2014-10-20 06:21:23 +00:00
$app = $orig_post [ 'app' ];
2012-03-22 23:17:10 +00:00
$categories = $orig_post [ 'file' ];
2012-03-28 10:18:26 +00:00
$title = notags ( trim ( $_REQUEST [ 'title' ]));
2012-01-12 22:20:21 +00:00
$body = escape_tags ( trim ( $_REQUEST [ 'body' ]));
2011-03-18 12:06:16 +00:00
$private = $orig_post [ 'private' ];
2011-04-18 06:27:11 +00:00
$pubmail_enable = $orig_post [ 'pubmail' ];
2013-12-27 00:58:21 +00:00
$network = $orig_post [ 'network' ];
2014-07-21 22:36:20 +00:00
$guid = $orig_post [ 'guid' ];
2014-10-20 06:21:23 +00:00
$extid = $orig_post [ 'extid' ];
2012-03-22 23:17:10 +00:00
2014-07-21 22:36:20 +00:00
} else {
2012-01-12 22:20:21 +00:00
2017-03-30 19:32:12 +00:00
/*
* if coming from the API and no privacy settings are set ,
* use the user default permissions - as they won ' t have
* been supplied via a form .
*/
2017-03-31 18:32:52 +00:00
/// @TODO use x($_REQUEST, 'foo') here
2017-03-30 19:32:12 +00:00
if (( $api_source )
2017-03-31 18:32:52 +00:00
&& ( ! array_key_exists ( 'contact_allow' , $_REQUEST ))
&& ( ! array_key_exists ( 'group_allow' , $_REQUEST ))
&& ( ! array_key_exists ( 'contact_deny' , $_REQUEST ))
&& ( ! array_key_exists ( 'group_deny' , $_REQUEST ))) {
2012-01-12 22:20:21 +00:00
$str_group_allow = $user [ 'allow_gid' ];
$str_contact_allow = $user [ 'allow_cid' ];
$str_group_deny = $user [ 'deny_gid' ];
$str_contact_deny = $user [ 'deny_cid' ];
2017-03-30 19:32:12 +00:00
} else {
2012-01-12 22:20:21 +00:00
// use the posted permissions
$str_group_allow = perms2str ( $_REQUEST [ 'group_allow' ]);
$str_contact_allow = perms2str ( $_REQUEST [ 'contact_allow' ]);
$str_group_deny = perms2str ( $_REQUEST [ 'group_deny' ]);
$str_contact_deny = perms2str ( $_REQUEST [ 'contact_deny' ]);
}
$title = notags ( trim ( $_REQUEST [ 'title' ]));
$location = notags ( trim ( $_REQUEST [ 'location' ]));
$coord = notags ( trim ( $_REQUEST [ 'coord' ]));
$verb = notags ( trim ( $_REQUEST [ 'verb' ]));
$emailcc = notags ( trim ( $_REQUEST [ 'emailcc' ]));
$body = escape_tags ( trim ( $_REQUEST [ 'body' ]));
2013-12-27 00:58:21 +00:00
$network = notags ( trim ( $_REQUEST [ 'network' ]));
2014-07-21 22:36:20 +00:00
$guid = get_guid ( 32 );
2012-03-22 23:17:10 +00:00
2015-09-23 08:47:34 +00:00
item_add_language_opt ( $_REQUEST );
$postopts = $_REQUEST [ 'postopts' ] ? $_REQUEST [ 'postopts' ] : " " ;
2012-07-12 05:45:14 +00:00
2011-03-18 12:06:16 +00:00
$private = (( strlen ( $str_group_allow ) || strlen ( $str_contact_allow ) || strlen ( $str_group_deny ) || strlen ( $str_contact_deny )) ? 1 : 0 );
2017-03-30 19:32:12 +00:00
if ( $user [ 'hidewall' ]) {
2013-01-27 21:14:13 +00:00
$private = 2 ;
2017-03-30 19:32:12 +00:00
}
2013-01-27 21:14:13 +00:00
2012-05-19 23:42:24 +00:00
// If this is a comment, set the permissions from the parent.
2017-03-30 19:32:12 +00:00
if ( $parent_item ) {
2012-05-19 23:42:24 +00:00
2013-12-27 00:58:21 +00:00
// for non native networks use the network of the original post as network of the item
if (( $parent_item [ 'network' ] != NETWORK_DIASPORA )
2017-06-08 02:00:59 +00:00
&& ( $parent_item [ 'network' ] != NETWORK_OSTATUS )
&& ( $network == " " )) {
2013-12-27 00:58:21 +00:00
$network = $parent_item [ 'network' ];
2017-03-30 19:32:12 +00:00
}
2013-12-27 00:58:21 +00:00
2012-05-19 23:42:24 +00:00
$str_contact_allow = $parent_item [ 'allow_cid' ];
$str_group_allow = $parent_item [ 'allow_gid' ];
$str_contact_deny = $parent_item [ 'deny_cid' ];
$str_group_deny = $parent_item [ 'deny_gid' ];
2016-10-06 21:24:29 +00:00
$private = $parent_item [ 'private' ];
2011-03-18 12:06:16 +00:00
}
2016-10-06 21:24:29 +00:00
2017-03-30 19:32:12 +00:00
$pubmail_enable = (( x ( $_REQUEST , 'pubmail_enable' ) && intval ( $_REQUEST [ 'pubmail_enable' ]) && ( ! $private )) ? 1 : 0 );
2010-12-19 21:41:55 +00:00
2011-08-14 11:26:41 +00:00
// if using the API, we won't see pubmail_enable - figure out if it should be set
2017-03-30 19:32:12 +00:00
if ( $api_source && $profile_uid && $profile_uid == local_user () && ( ! $private )) {
2017-11-07 02:22:52 +00:00
$mail_disabled = (( function_exists ( 'imap_open' ) && ( ! Config :: get ( 'system' , 'imap_disabled' ))) ? 0 : 1 );
2017-03-30 19:32:12 +00:00
if ( ! $mail_disabled ) {
2017-04-01 19:46:57 +00:00
/// @TODO Check if only pubmail is loaded, * loads all columns
2011-08-14 11:26:41 +00:00
$r = q ( " SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1 " ,
intval ( local_user ())
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r ) && intval ( $r [ 0 ][ 'pubmail' ])) {
2011-08-14 11:26:41 +00:00
$pubmail_enabled = true ;
2017-03-30 19:32:12 +00:00
}
2011-08-14 11:26:41 +00:00
}
}
2017-03-30 19:32:12 +00:00
if ( ! strlen ( $body )) {
if ( $preview ) {
2012-01-10 04:03:00 +00:00
killme ();
2017-03-30 19:32:12 +00:00
}
info ( t ( 'Empty post discarded.' ) . EOL );
if ( x ( $_REQUEST , 'return' )) {
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2017-03-30 19:32:12 +00:00
}
2011-03-18 12:06:16 +00:00
killme ();
}
2010-07-12 23:43:59 +00:00
}
2017-03-30 19:32:12 +00:00
if ( strlen ( $categories )) {
2012-05-30 05:57:15 +00:00
// get the "fileas" tags for this post
$filedas = file_tag_file_to_list ( $categories , 'file' );
2012-04-02 01:28:31 +00:00
}
2012-05-30 05:57:15 +00:00
// save old and new categories, so we can determine what needs to be deleted from pconfig
$categories_old = $categories ;
$categories = file_tag_list_to_file ( trim ( $_REQUEST [ 'category' ]), 'category' );
$categories_new = $categories ;
2017-03-30 19:32:12 +00:00
if ( strlen ( $filedas )) {
2012-05-30 05:57:15 +00:00
// append the fileas stuff to the new categories list
$categories .= file_tag_list_to_file ( $filedas , 'file' );
2012-04-02 01:28:31 +00:00
}
2010-07-17 06:14:37 +00:00
// get contact info for poster
2010-07-18 02:26:00 +00:00
2010-08-14 14:55:18 +00:00
$author = null ;
2010-12-22 22:16:22 +00:00
$self = false ;
2012-09-05 05:50:28 +00:00
$contact_id = 0 ;
2010-08-14 14:55:18 +00:00
2017-03-30 19:32:12 +00:00
if (( local_user ()) && ( local_user () == $profile_uid )) {
2010-12-22 22:16:22 +00:00
$self = true ;
2010-08-14 14:55:18 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1 " ,
2015-11-28 17:11:34 +00:00
intval ( $_SESSION [ 'uid' ]));
2017-03-30 19:32:12 +00:00
} elseif ( remote_user ()) {
2017-04-01 19:46:57 +00:00
if ( x ( $_SESSION , 'remote' ) && is_array ( $_SESSION [ 'remote' ])) {
2017-03-30 19:32:12 +00:00
foreach ( $_SESSION [ 'remote' ] as $v ) {
if ( $v [ 'uid' ] == $profile_uid ) {
2012-09-05 05:50:28 +00:00
$contact_id = $v [ 'cid' ];
break ;
}
}
2013-11-03 01:07:44 +00:00
}
2017-03-30 19:32:12 +00:00
if ( $contact_id ) {
2012-09-05 05:50:28 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `id` = %d LIMIT 1 " ,
intval ( $contact_id )
);
}
2010-08-14 14:55:18 +00:00
}
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2010-08-14 14:55:18 +00:00
$author = $r [ 0 ];
$contact_id = $author [ 'id' ];
2010-07-17 06:14:37 +00:00
}
// get contact info for owner
2013-11-03 01:07:44 +00:00
2017-03-30 19:32:12 +00:00
if ( $profile_uid == local_user ()) {
2010-08-14 14:55:18 +00:00
$contact_record = $author ;
2017-03-30 19:32:12 +00:00
} else {
2010-08-14 14:55:18 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1 " ,
intval ( $profile_uid )
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2010-08-14 14:55:18 +00:00
$contact_record = $r [ 0 ];
2017-03-30 19:32:12 +00:00
}
2010-08-14 14:55:18 +00:00
}
2010-07-17 06:14:37 +00:00
2012-01-12 22:20:21 +00:00
$post_type = notags ( trim ( $_REQUEST [ 'type' ]));
2010-07-26 05:51:45 +00:00
2017-03-30 19:32:12 +00:00
if ( $post_type === 'net-comment' && $parent_item !== null ) {
if ( $parent_item [ 'wall' ] == 1 ) {
$post_type = 'wall-comment' ;
} else {
$post_type = 'remote-comment' ;
2010-07-28 05:32:21 +00:00
}
2010-07-26 05:51:45 +00:00
}
2010-07-09 00:49:41 +00:00
2017-03-30 19:32:12 +00:00
/*
2013-11-03 01:07:44 +00:00
* When a photo was uploaded into the message using the ( profile wall ) ajax
2011-01-04 10:01:07 +00:00
* uploader , The permissions are initially set to disallow anybody but the
* owner from seeing it . This is because the permissions may not yet have been
* set for the post . If it ' s private , the photo permissions should be set
* appropriately . But we didn ' t know the final permissions on the post until
* now . So now we ' ll look for links of uploaded messages that are in the
* post and set them to the same permissions as the post itself .
2011-01-04 07:05:20 +00:00
*/
$match = null ;
2017-03-30 19:32:12 +00:00
if (( ! $preview ) && preg_match_all ( " / \ [img([ \ =0-9x]*?) \ ](.*?) \ [ \ /img \ ]/ " , $body , $match )) {
2012-09-15 00:22:56 +00:00
$images = $match [ 2 ];
2017-03-30 19:32:12 +00:00
if ( count ( $images )) {
2014-08-07 06:02:24 +00:00
$objecttype = ACTIVITY_OBJ_IMAGE ;
2016-12-20 20:15:53 +00:00
foreach ( $images as $image ) {
2017-08-26 07:32:10 +00:00
if ( ! stristr ( $image , System :: baseUrl () . '/photo/' )) {
2011-01-04 10:01:07 +00:00
continue ;
2016-12-20 20:15:53 +00:00
}
2011-01-04 10:01:07 +00:00
$image_uri = substr ( $image , strrpos ( $image , '/' ) + 1 );
$image_uri = substr ( $image_uri , 0 , strpos ( $image_uri , '-' ));
2016-12-20 20:15:53 +00:00
if ( ! strlen ( $image_uri )) {
2011-05-29 22:47:26 +00:00
continue ;
2016-12-20 20:15:53 +00:00
}
2012-05-26 00:42:35 +00:00
$srch = '<' . intval ( $contact_id ) . '>' ;
2011-05-27 09:37:12 +00:00
$r = q ( " SELECT `id` FROM `photo` WHERE `allow_cid` = '%s' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = ''
AND `resource-id` = '%s' AND `uid` = % d LIMIT 1 " ,
dbesc ( $srch ),
dbesc ( $image_uri ),
intval ( $profile_uid )
);
2012-05-26 00:42:35 +00:00
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2011-05-27 09:37:12 +00:00
continue ;
2016-12-20 09:10:33 +00:00
}
2013-11-03 01:07:44 +00:00
2011-01-04 10:01:07 +00:00
$r = q ( " UPDATE `photo` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s'
2011-05-27 09:37:12 +00:00
WHERE `resource-id` = '%s' AND `uid` = % d AND `album` = '%s' " ,
2011-01-04 10:01:07 +00:00
dbesc ( $str_contact_allow ),
dbesc ( $str_group_allow ),
dbesc ( $str_contact_deny ),
dbesc ( $str_group_deny ),
dbesc ( $image_uri ),
2011-05-27 09:37:12 +00:00
intval ( $profile_uid ),
2011-01-04 10:01:07 +00:00
dbesc ( t ( 'Wall Photos' ))
);
2011-01-04 07:05:20 +00:00
}
}
}
2011-05-25 09:08:15 +00:00
2017-03-30 19:32:12 +00:00
/*
2011-06-30 01:59:05 +00:00
* Next link in any attachment references we find in the post .
*/
2011-05-29 22:47:26 +00:00
$match = false ;
2011-05-25 09:08:15 +00:00
2017-03-30 19:32:12 +00:00
if (( ! $preview ) && preg_match_all ( " / \ [attachment \ ](.*?) \ [ \ /attachment \ ]/ " , $body , $match )) {
2011-05-25 09:08:15 +00:00
$attaches = $match [ 1 ];
2017-03-30 19:32:12 +00:00
if ( count ( $attaches )) {
foreach ( $attaches as $attach ) {
2011-05-25 09:08:15 +00:00
$r = q ( " SELECT * FROM `attach` WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
intval ( $profile_uid ),
2011-05-29 22:47:26 +00:00
intval ( $attach )
2013-11-03 01:07:44 +00:00
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2011-05-25 09:08:15 +00:00
$r = q ( " UPDATE `attach` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s'
2013-11-03 01:07:44 +00:00
WHERE `uid` = % d AND `id` = % d " ,
2011-08-04 02:18:58 +00:00
dbesc ( $str_contact_allow ),
dbesc ( $str_group_allow ),
dbesc ( $str_contact_deny ),
dbesc ( $str_group_deny ),
2011-05-25 09:08:15 +00:00
intval ( $profile_uid ),
2011-05-29 22:47:26 +00:00
intval ( $attach )
2011-05-25 09:08:15 +00:00
);
}
}
}
}
2016-04-24 15:00:19 +00:00
// embedded bookmark or attachment in post? set bookmark flag
2011-09-05 02:58:03 +00:00
$bookmark = 0 ;
2016-04-24 15:00:19 +00:00
$data = get_attachment_data ( $body );
2017-06-08 02:00:59 +00:00
if ( preg_match_all ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , $body , $match , PREG_SET_ORDER ) || isset ( $data [ " type " ])) {
2014-08-07 06:02:24 +00:00
$objecttype = ACTIVITY_OBJ_BOOKMARK ;
2011-09-05 02:58:03 +00:00
$bookmark = 1 ;
}
2011-10-12 01:24:37 +00:00
$body = bb_translate_video ( $body );
2012-08-04 01:33:11 +00:00
2017-03-30 19:32:12 +00:00
// Fold multi-line [code] sequences
$body = preg_replace ( '/\[\/code\]\s*\[code\]/ism' , " \n " , $body );
2011-01-04 10:01:07 +00:00
2017-03-31 18:36:01 +00:00
$body = scale_external_images ( $body , false );
2012-02-25 22:22:51 +00:00
2014-08-07 06:02:24 +00:00
// Setting the object type if not defined before
if ( ! $objecttype ) {
$objecttype = ACTIVITY_OBJ_NOTE ; // Default value
2017-03-31 18:30:21 +00:00
require_once 'include/plaintext.php' ;
2014-08-07 06:02:24 +00:00
$objectdata = get_attached_data ( $body );
2017-03-30 19:32:12 +00:00
if ( $post [ " type " ] == " link " ) {
2014-08-07 06:02:24 +00:00
$objecttype = ACTIVITY_OBJ_BOOKMARK ;
2017-03-30 19:32:12 +00:00
} elseif ( $post [ " type " ] == " video " ) {
2014-08-07 06:02:24 +00:00
$objecttype = ACTIVITY_OBJ_VIDEO ;
2017-03-30 19:32:12 +00:00
} elseif ( $post [ " type " ] == " photo " ) {
2014-08-07 06:02:24 +00:00
$objecttype = ACTIVITY_OBJ_IMAGE ;
2017-03-30 19:32:12 +00:00
}
2014-08-07 06:02:24 +00:00
}
2012-08-04 01:33:11 +00:00
2017-03-30 19:32:12 +00:00
// Look for any tags and linkify them
2010-10-29 01:18:20 +00:00
$str_tags = '' ;
2010-11-01 03:36:59 +00:00
$inform = '' ;
2010-10-29 01:18:20 +00:00
$tags = get_tags ( $body );
2017-03-30 19:32:12 +00:00
/*
2015-06-02 23:26:46 +00:00
* add a statusnet style reply tag if the original post was from there
* and we are replying , and there isn ' t one already
*/
2017-06-08 02:00:59 +00:00
if ( $parent && ( $parent_contact [ 'network' ] == NETWORK_OSTATUS )) {
2017-03-30 19:32:12 +00:00
$contact = '@[url=' . $parent_contact [ 'url' ] . ']' . $parent_contact [ 'nick' ] . '[/url]' ;
2011-06-30 01:59:05 +00:00
2017-04-01 19:46:57 +00:00
if ( ! in_array ( $contact , $tags )) {
2017-03-31 18:36:01 +00:00
$body = $contact . ' ' . $body ;
2015-05-30 22:26:11 +00:00
$tags [] = $contact ;
}
$toplevel_contact = " " ;
2015-06-03 09:27:56 +00:00
$toplevel_parent = q ( " SELECT `contact`.* FROM `contact`
INNER JOIN `item` ON `item` . `contact-id` = `contact` . `id` AND `contact` . `url` = `item` . `author-link`
WHERE `item` . `id` = `item` . `parent` AND `item` . `parent` = % d " , intval( $parent ));
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $toplevel_parent )) {
2017-10-31 19:33:23 +00:00
if ( ! empty ( $toplevel_parent [ 0 ][ 'addr' ])) {
$toplevel_contact = '@' . $toplevel_parent [ 0 ][ 'addr' ];
} else {
$toplevel_contact = '@' . $toplevel_parent [ 0 ][ 'nick' ] . '+' . $toplevel_parent [ 0 ][ 'id' ];
}
2017-03-30 19:32:12 +00:00
} else {
2015-05-30 22:26:11 +00:00
$toplevel_parent = q ( " SELECT `author-link`, `author-name` FROM `item` WHERE `id` = `parent` AND `parent` = %d " , intval ( $parent ));
2017-03-31 18:36:01 +00:00
$toplevel_contact = '@[url=' . $toplevel_parent [ 0 ][ 'author-link' ] . ']' . $toplevel_parent [ 0 ][ 'author-name' ] . '[/url]' ;
2015-05-30 22:26:11 +00:00
}
2017-03-30 19:51:31 +00:00
if ( ! in_array ( $toplevel_contact , $tags )) {
2015-06-02 18:36:10 +00:00
$tags [] = $toplevel_contact ;
2017-03-30 19:32:12 +00:00
}
2013-12-27 00:58:21 +00:00
}
2010-10-29 01:18:20 +00:00
2012-05-03 05:33:51 +00:00
$tagged = array ();
2012-05-30 05:57:15 +00:00
$private_forum = false ;
2017-11-01 23:20:43 +00:00
$only_to_forum = false ;
2017-11-02 20:15:14 +00:00
$forum_contact = array ();
2012-05-03 05:33:51 +00:00
2017-03-30 19:32:12 +00:00
if ( count ( $tags )) {
foreach ( $tags as $tag ) {
2012-05-03 05:33:51 +00:00
2017-10-31 19:33:23 +00:00
$tag_type = substr ( $tag , 0 , 1 );
if ( $tag_type == '#' ) {
2015-03-01 19:40:38 +00:00
continue ;
2017-03-30 19:32:12 +00:00
}
2015-03-01 19:40:38 +00:00
2017-03-30 19:32:12 +00:00
/*
* If we already tagged 'Robert Johnson' , don 't try and tag ' Robert ' .
* Robert Johnson should be first in the $tags array
*/
2012-05-03 05:33:51 +00:00
$fullnametagged = false ;
2017-03-31 18:44:38 +00:00
/// @TODO $tagged is initialized above if() block and is not filled, maybe old-lost code?
2017-03-31 18:36:01 +00:00
foreach ( $tagged as $nextTag ) {
if ( stristr ( $nextTag , $tag . ' ' )) {
2012-05-03 05:33:51 +00:00
$fullnametagged = true ;
break ;
}
}
2017-03-30 19:32:12 +00:00
if ( $fullnametagged ) {
2012-05-03 05:33:51 +00:00
continue ;
2017-03-30 19:32:12 +00:00
}
2012-05-03 05:33:51 +00:00
2014-08-25 12:09:56 +00:00
$success = handle_tag ( $a , $body , $inform , $str_tags , ( local_user ()) ? local_user () : $profile_uid , $tag , $network );
2016-12-19 13:26:13 +00:00
if ( $success [ 'replaced' ]) {
2012-05-03 05:33:51 +00:00
$tagged [] = $tag ;
2016-12-19 13:26:13 +00:00
}
2017-10-31 19:33:23 +00:00
// When the forum is private or the forum is addressed with a "!" make the post private
if ( is_array ( $success [ 'contact' ]) && ( $success [ 'contact' ][ 'prv' ] || ( $tag_type == '!' ))) {
2017-11-02 20:15:14 +00:00
$private_forum = $success [ 'contact' ][ 'prv' ];
2017-11-01 23:20:43 +00:00
$only_to_forum = ( $tag_type == '!' );
2012-05-30 05:57:15 +00:00
$private_id = $success [ 'contact' ][ 'id' ];
2017-11-02 20:15:14 +00:00
$forum_contact = $success [ 'contact' ];
2017-11-02 21:25:20 +00:00
} elseif ( is_array ( $success [ 'contact' ]) && $success [ 'contact' ][ 'forum' ] &&
( $str_contact_allow == '<' . $success [ 'contact' ][ 'id' ] . '>' )) {
$private_forum = false ;
$only_to_forum = true ;
$private_id = $success [ 'contact' ][ 'id' ];
$forum_contact = $success [ 'contact' ];
2012-05-30 05:57:15 +00:00
}
2010-10-29 01:18:20 +00:00
}
}
2017-11-02 20:15:14 +00:00
if ( ! $parent && count ( $forum_contact ) && ( $private_forum || $only_to_forum )) {
// we tagged a forum in a top level post. Now we change the post
$private = $private_forum ;
$str_group_allow = '' ;
$str_contact_deny = '' ;
$str_group_deny = '' ;
if ( $private_forum ) {
$str_contact_allow = '<' . $private_id . '>' ;
} else {
$str_contact_allow = '' ;
}
$contact_id = $private_id ;
$contact_record = $forum_contact ;
$_REQUEST [ 'origin' ] = false ;
2012-05-30 05:57:15 +00:00
}
2011-05-25 09:08:15 +00:00
$attachments = '' ;
2011-05-29 22:47:26 +00:00
$match = false ;
2011-05-25 09:08:15 +00:00
2016-12-19 13:26:13 +00:00
if ( preg_match_all ( '/(\[attachment\]([0-9]+)\[\/attachment\])/' , $body , $match )) {
foreach ( $match [ 2 ] as $mtch ) {
2011-05-25 09:08:15 +00:00
$r = q ( " SELECT `id`,`filename`,`filesize`,`filetype` FROM `attach` WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
intval ( $profile_uid ),
intval ( $mtch )
);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2016-12-20 20:31:05 +00:00
if ( strlen ( $attachments )) {
2011-05-25 09:08:15 +00:00
$attachments .= ',' ;
2016-12-20 20:31:05 +00:00
}
2017-08-26 07:32:10 +00:00
$attachments .= '[attach]href="' . System :: baseUrl () . '/attach/' . $r [ 0 ][ 'id' ] . '" length="' . $r [ 0 ][ 'filesize' ] . '" type="' . $r [ 0 ][ 'filetype' ] . '" title="' . (( $r [ 0 ][ 'filename' ]) ? $r [ 0 ][ 'filename' ] : '' ) . '"[/attach]' ;
2011-05-25 09:08:15 +00:00
}
$body = str_replace ( $match [ 1 ], '' , $body );
}
}
2010-09-10 02:14:42 +00:00
$wall = 0 ;
2011-03-18 07:30:34 +00:00
2017-11-02 20:15:14 +00:00
if (( $post_type === 'wall' || $post_type === 'wall-comment' ) && ! count ( $forum_contact )) {
2010-09-10 02:14:42 +00:00
$wall = 1 ;
2016-12-20 20:31:05 +00:00
}
2010-09-10 04:16:40 +00:00
2016-12-20 20:31:05 +00:00
if ( ! strlen ( $verb )) {
2010-09-10 04:16:40 +00:00
$verb = ACTIVITY_POST ;
2016-12-20 20:31:05 +00:00
}
2010-09-10 05:02:28 +00:00
2016-12-20 20:31:05 +00:00
if ( $network == " " ) {
2013-12-27 00:58:21 +00:00
$network = NETWORK_DFRN ;
2016-12-20 20:31:05 +00:00
}
2013-12-27 00:58:21 +00:00
2010-09-10 05:02:28 +00:00
$gravity = (( $parent ) ? 6 : 0 );
2011-10-17 21:52:03 +00:00
2015-03-22 09:12:16 +00:00
// even if the post arrived via API we are considering that it
2011-10-17 21:52:03 +00:00
// originated on this site by default for determining relayability.
2017-03-31 18:47:23 +00:00
$origin = (( x ( $_REQUEST , 'origin' )) ? intval ( $_REQUEST [ 'origin' ]) : 1 );
2013-12-27 00:58:21 +00:00
2010-07-09 00:49:41 +00:00
$notify_type = (( $parent ) ? 'comment-new' : 'wall-new' );
2015-08-13 22:40:36 +00:00
$uri = (( $message_id ) ? $message_id : item_new_uri ( $a -> get_hostname (), $profile_uid , $guid ));
2010-08-10 08:21:38 +00:00
2012-08-07 08:04:47 +00:00
// Fallback so that we alway have a thr-parent
2016-12-20 20:31:05 +00:00
if ( ! $thr_parent ) {
2012-08-07 08:04:47 +00:00
$thr_parent = $uri ;
2016-12-20 20:31:05 +00:00
}
2012-08-07 08:04:47 +00:00
2010-12-22 22:16:22 +00:00
$datarray = array ();
$datarray [ 'uid' ] = $profile_uid ;
$datarray [ 'type' ] = $post_type ;
$datarray [ 'wall' ] = $wall ;
$datarray [ 'gravity' ] = $gravity ;
2013-12-27 00:58:21 +00:00
$datarray [ 'network' ] = $network ;
2010-12-22 22:16:22 +00:00
$datarray [ 'contact-id' ] = $contact_id ;
$datarray [ 'owner-name' ] = $contact_record [ 'name' ];
$datarray [ 'owner-link' ] = $contact_record [ 'url' ];
$datarray [ 'owner-avatar' ] = $contact_record [ 'thumb' ];
2017-11-19 22:03:39 +00:00
$datarray [ 'owner-id' ] = Contact :: getIdForURL ( $datarray [ 'owner-link' ], 0 );
2010-12-22 22:16:22 +00:00
$datarray [ 'author-name' ] = $author [ 'name' ];
$datarray [ 'author-link' ] = $author [ 'url' ];
$datarray [ 'author-avatar' ] = $author [ 'thumb' ];
2017-11-19 22:03:39 +00:00
$datarray [ 'author-id' ] = Contact :: getIdForURL ( $datarray [ 'author-link' ], 0 );
2010-12-22 22:16:22 +00:00
$datarray [ 'created' ] = datetime_convert ();
$datarray [ 'edited' ] = datetime_convert ();
2011-09-19 02:04:11 +00:00
$datarray [ 'commented' ] = datetime_convert ();
2011-06-24 00:56:59 +00:00
$datarray [ 'received' ] = datetime_convert ();
2010-12-22 22:16:22 +00:00
$datarray [ 'changed' ] = datetime_convert ();
2014-10-20 06:21:23 +00:00
$datarray [ 'extid' ] = $extid ;
2014-07-21 22:36:20 +00:00
$datarray [ 'guid' ] = $guid ;
2010-12-22 22:16:22 +00:00
$datarray [ 'uri' ] = $uri ;
$datarray [ 'title' ] = $title ;
$datarray [ 'body' ] = $body ;
2011-06-21 02:08:40 +00:00
$datarray [ 'app' ] = $app ;
2010-12-22 22:16:22 +00:00
$datarray [ 'location' ] = $location ;
$datarray [ 'coord' ] = $coord ;
$datarray [ 'tag' ] = $str_tags ;
2012-03-22 23:17:10 +00:00
$datarray [ 'file' ] = $categories ;
2010-12-22 22:16:22 +00:00
$datarray [ 'inform' ] = $inform ;
$datarray [ 'verb' ] = $verb ;
2014-08-07 06:02:24 +00:00
$datarray [ 'object-type' ] = $objecttype ;
2010-12-22 22:16:22 +00:00
$datarray [ 'allow_cid' ] = $str_contact_allow ;
$datarray [ 'allow_gid' ] = $str_group_allow ;
$datarray [ 'deny_cid' ] = $str_contact_deny ;
$datarray [ 'deny_gid' ] = $str_group_deny ;
$datarray [ 'private' ] = $private ;
2011-04-18 06:27:11 +00:00
$datarray [ 'pubmail' ] = $pubmail_enable ;
2011-05-25 09:08:15 +00:00
$datarray [ 'attach' ] = $attachments ;
2011-09-05 02:58:03 +00:00
$datarray [ 'bookmark' ] = intval ( $bookmark );
2011-08-01 03:01:00 +00:00
$datarray [ 'thr-parent' ] = $thr_parent ;
2012-07-12 05:45:14 +00:00
$datarray [ 'postopts' ] = $postopts ;
2011-10-17 21:52:03 +00:00
$datarray [ 'origin' ] = $origin ;
2012-01-29 10:09:39 +00:00
$datarray [ 'moderated' ] = $allow_moderated ;
2017-11-15 14:47:28 +00:00
$datarray [ 'gcontact-id' ] = GlobalContact :: getId ( array ( " url " => $datarray [ 'author-link' ], " network " => $datarray [ 'network' ],
2016-01-06 13:13:59 +00:00
" photo " => $datarray [ 'author-avatar' ], " name " => $datarray [ 'author-name' ]));
2016-12-09 09:57:02 +00:00
$datarray [ 'object' ] = $object ;
2016-06-21 05:54:45 +00:00
2017-03-30 19:32:12 +00:00
/*
2010-12-22 22:16:22 +00:00
* These fields are for the convenience of plugins ...
* 'self' if true indicates the owner is posting on their own wall
* If parent is 0 it is a top - level post .
*/
$datarray [ 'parent' ] = $parent ;
$datarray [ 'self' ] = $self ;
2011-10-12 01:24:37 +00:00
// $datarray['prvnets'] = $user['prvnets'];
2010-12-22 22:16:22 +00:00
2017-09-06 16:20:14 +00:00
// This triggers posts via API and the mirror functions
$datarray [ 'api_source' ] = $api_source ;
2016-10-06 21:24:29 +00:00
$datarray [ 'parent-uri' ] = ( $parent == 0 ) ? $uri : $parent_item [ 'uri' ];
2017-08-26 07:32:10 +00:00
$datarray [ 'plink' ] = System :: baseUrl () . '/display/' . urlencode ( $datarray [ 'guid' ]);
2016-10-06 21:24:29 +00:00
$datarray [ 'last-child' ] = 1 ;
$datarray [ 'visible' ] = 1 ;
2017-04-29 05:44:13 +00:00
$datarray [ 'protocol' ] = PROTOCOL_DFRN ;
$r = dba :: fetch_first ( " SELECT `conversation-uri`, `conversation-href` FROM `conversation` WHERE `item-uri` = ? " , $datarray [ 'parent-uri' ]);
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2017-04-29 05:44:13 +00:00
if ( $r [ 'conversation-uri' ] != '' ) {
$datarray [ 'conversation-uri' ] = $r [ 'conversation-uri' ];
}
if ( $r [ 'conversation-href' ] != '' ) {
$datarray [ 'conversation-href' ] = $r [ 'conversation-href' ];
}
}
2017-03-30 19:32:12 +00:00
if ( $orig_post ) {
$datarray [ 'edit' ] = true ;
}
2011-08-08 00:29:26 +00:00
2015-03-01 19:40:38 +00:00
// Search for hashtags
item_body_set_hashtags ( $datarray );
2012-01-05 23:02:44 +00:00
// preview mode - prepare the body for display and send it via json
2017-03-30 19:32:12 +00:00
if ( $preview ) {
2017-03-31 18:30:21 +00:00
require_once 'include/conversation.php' ;
2016-11-20 15:19:55 +00:00
// We set the datarray ID to -1 because in preview mode the dataray
// doesn't have an ID.
$datarray [ " id " ] = - 1 ;
2012-09-05 00:47:49 +00:00
$o = conversation ( $a , array ( array_merge ( $contact_record , $datarray )), 'search' , false , true );
2012-01-10 04:03:00 +00:00
logger ( 'preview: ' . $o );
2012-01-06 02:11:53 +00:00
echo json_encode ( array ( 'preview' => $o ));
2012-01-05 23:02:44 +00:00
killme ();
}
2010-12-22 22:16:22 +00:00
call_hooks ( 'post_local' , $datarray );
2017-03-30 19:32:12 +00:00
if ( x ( $datarray , 'cancel' )) {
2012-01-31 04:49:54 +00:00
logger ( 'mod_item: post cancelled by plugin.' );
2017-03-30 19:32:12 +00:00
if ( $return_path ) {
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2012-01-31 04:49:54 +00:00
}
$json = array ( 'cancel' => 1 );
2017-03-31 18:47:23 +00:00
if ( x ( $_REQUEST , 'jsreload' ) && strlen ( $_REQUEST [ 'jsreload' ])) {
2017-08-26 07:32:10 +00:00
$json [ 'reload' ] = System :: baseUrl () . '/' . $_REQUEST [ 'jsreload' ];
2016-12-20 10:18:54 +00:00
}
2012-01-31 04:49:54 +00:00
echo json_encode ( $json );
killme ();
}
2015-03-07 20:24:39 +00:00
// Fill the cache field
put_item_in_cache ( $datarray );
2011-03-18 12:06:16 +00:00
2017-04-29 05:44:13 +00:00
$datarray = store_conversation ( $datarray );
2017-03-30 19:32:12 +00:00
if ( $orig_post ) {
2015-03-07 20:24:39 +00:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `attach` = '%s', `file` = '%s', `rendered-html` = '%s', `rendered-hash` = '%s', `edited` = '%s', `changed` = '%s' WHERE `id` = %d AND `uid` = %d " ,
2012-03-22 23:17:10 +00:00
dbesc ( $datarray [ 'title' ]),
dbesc ( $datarray [ 'body' ]),
dbesc ( $datarray [ 'tag' ]),
dbesc ( $datarray [ 'attach' ]),
dbesc ( $datarray [ 'file' ]),
2015-03-07 20:24:39 +00:00
dbesc ( $datarray [ 'rendered-html' ]),
dbesc ( $datarray [ 'rendered-hash' ]),
2011-03-18 12:06:16 +00:00
dbesc ( datetime_convert ()),
2014-03-16 16:12:56 +00:00
dbesc ( datetime_convert ()),
2011-03-18 12:06:16 +00:00
intval ( $post_id ),
intval ( $profile_uid )
);
2014-03-20 17:48:08 +00:00
create_tags_from_item ( $post_id );
create_files_from_item ( $post_id );
update_thread ( $post_id );
2012-04-02 01:28:31 +00:00
// update filetags in pconfig
2014-08-27 23:06:41 +00:00
file_tag_update_pconfig ( $uid , $categories_old , $categories_new , 'category' );
2012-04-02 01:28:31 +00:00
2017-11-19 18:59:55 +00:00
Worker :: add ( PRIORITY_HIGH , " Notifier " , 'edit_post' , $post_id );
2017-03-31 18:47:23 +00:00
if (( x ( $_REQUEST , 'return' )) && strlen ( $return_path )) {
2011-09-13 02:42:10 +00:00
logger ( 'return: ' . $return_path );
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2011-03-18 12:06:16 +00:00
}
killme ();
2017-03-30 19:32:12 +00:00
} else {
2011-03-18 12:06:16 +00:00
$post_id = 0 ;
2017-03-30 19:32:12 +00:00
}
2011-03-18 12:06:16 +00:00
2017-05-11 20:13:45 +00:00
dba :: transaction ();
2016-10-21 18:25:21 +00:00
2016-06-21 05:54:45 +00:00
$r = q ( " INSERT INTO `item` (`guid`, `extid`, `uid`,`type`,`wall`,`gravity`, `network`, `contact-id`,
`owner-name` , `owner-link` , `owner-avatar` , `owner-id` ,
`author-name` , `author-link` , `author-avatar` , `author-id` ,
`created` , `edited` , `commented` , `received` , `changed` ,
`uri` , `thr-parent` , `title` , `body` , `app` , `location` , `coord` ,
`tag` , `inform` , `verb` , `object-type` , `postopts` ,
`allow_cid` , `allow_gid` , `deny_cid` , `deny_gid` , `private` ,
`pubmail` , `attach` , `bookmark` , `origin` , `moderated` , `file` ,
2016-12-09 09:57:02 +00:00
`rendered-html` , `rendered-hash` , `gcontact-id` , `object` ,
2016-10-06 21:24:29 +00:00
`parent` , `parent-uri` , `plink` , `last-child` , `visible` )
2016-06-21 05:54:45 +00:00
VALUES ( '%s' , '%s' , % d , '%s' , % d , % d , '%s' , % d ,
'%s' , '%s' , '%s' , % d ,
'%s' , '%s' , '%s' , % d ,
'%s' , '%s' , '%s' , '%s' , '%s' ,
'%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' ,
'%s' , '%s' , '%s' , '%s' , '%s' ,
'%s' , '%s' , '%s' , '%s' , % d ,
% d , '%s' , % d , % d , % d , '%s' ,
2016-12-09 09:57:02 +00:00
'%s' , '%s' , % d , '%s' ,
2016-10-06 21:24:29 +00:00
% d , '%s' , '%s' , % d , % d ) " ,
2011-08-08 00:29:26 +00:00
dbesc ( $datarray [ 'guid' ]),
2014-10-20 06:21:23 +00:00
dbesc ( $datarray [ 'extid' ]),
2011-08-08 00:33:13 +00:00
intval ( $datarray [ 'uid' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'type' ]),
intval ( $datarray [ 'wall' ]),
intval ( $datarray [ 'gravity' ]),
2013-12-27 00:58:21 +00:00
dbesc ( $datarray [ 'network' ]),
2010-12-22 22:16:22 +00:00
intval ( $datarray [ 'contact-id' ]),
dbesc ( $datarray [ 'owner-name' ]),
dbesc ( $datarray [ 'owner-link' ]),
dbesc ( $datarray [ 'owner-avatar' ]),
2016-06-21 05:54:45 +00:00
intval ( $datarray [ 'owner-id' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'author-name' ]),
dbesc ( $datarray [ 'author-link' ]),
dbesc ( $datarray [ 'author-avatar' ]),
2016-06-21 05:54:45 +00:00
intval ( $datarray [ 'author-id' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'created' ]),
dbesc ( $datarray [ 'edited' ]),
2011-09-19 02:04:11 +00:00
dbesc ( $datarray [ 'commented' ]),
2011-06-24 00:56:59 +00:00
dbesc ( $datarray [ 'received' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'changed' ]),
dbesc ( $datarray [ 'uri' ]),
2011-08-01 03:01:00 +00:00
dbesc ( $datarray [ 'thr-parent' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'title' ]),
dbesc ( $datarray [ 'body' ]),
2011-06-21 02:08:40 +00:00
dbesc ( $datarray [ 'app' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'location' ]),
dbesc ( $datarray [ 'coord' ]),
dbesc ( $datarray [ 'tag' ]),
dbesc ( $datarray [ 'inform' ]),
dbesc ( $datarray [ 'verb' ]),
2014-08-07 06:02:24 +00:00
dbesc ( $datarray [ 'object-type' ]),
2011-10-12 01:24:37 +00:00
dbesc ( $datarray [ 'postopts' ]),
2010-12-22 22:16:22 +00:00
dbesc ( $datarray [ 'allow_cid' ]),
dbesc ( $datarray [ 'allow_gid' ]),
dbesc ( $datarray [ 'deny_cid' ]),
dbesc ( $datarray [ 'deny_gid' ]),
2011-04-18 06:27:11 +00:00
intval ( $datarray [ 'private' ]),
2011-05-25 09:08:15 +00:00
intval ( $datarray [ 'pubmail' ]),
2011-09-05 02:58:03 +00:00
dbesc ( $datarray [ 'attach' ]),
2011-10-17 21:52:03 +00:00
intval ( $datarray [ 'bookmark' ]),
2012-01-29 10:09:39 +00:00
intval ( $datarray [ 'origin' ]),
2014-08-27 23:06:41 +00:00
intval ( $datarray [ 'moderated' ]),
2015-03-07 20:24:39 +00:00
dbesc ( $datarray [ 'file' ]),
dbesc ( $datarray [ 'rendered-html' ]),
2016-10-06 21:24:29 +00:00
dbesc ( $datarray [ 'rendered-hash' ]),
2016-12-09 09:57:02 +00:00
intval ( $datarray [ 'gcontact-id' ]),
dbesc ( $datarray [ 'object' ]),
2016-10-06 21:24:29 +00:00
intval ( $datarray [ 'parent' ]),
dbesc ( $datarray [ 'parent-uri' ]),
dbesc ( $datarray [ 'plink' ]),
intval ( $datarray [ 'last-child' ]),
intval ( $datarray [ 'visible' ])
2017-03-30 19:32:12 +00:00
);
2010-12-22 22:16:22 +00:00
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2017-08-12 13:54:29 +00:00
$post_id = dba :: lastInsertId ();
2016-10-29 20:17:33 +00:00
} else {
logger ( 'mod_item: unable to create post.' );
$post_id = 0 ;
}
if ( $post_id == 0 ) {
2017-05-11 20:13:45 +00:00
dba :: commit ();
2015-03-07 20:24:39 +00:00
logger ( 'mod_item: unable to retrieve post that was just stored.' );
2016-10-29 20:17:33 +00:00
notice ( t ( 'System error. Post not saved.' ) . EOL );
goaway ( $return_path );
2015-03-07 20:24:39 +00:00
// NOTREACHED
}
2010-08-14 14:55:18 +00:00
2015-03-07 20:24:39 +00:00
logger ( 'mod_item: saved item ' . $post_id );
2014-03-09 08:19:14 +00:00
2015-03-07 20:24:39 +00:00
$datarray [ " id " ] = $post_id ;
2011-08-29 02:22:27 +00:00
2016-10-14 05:45:32 +00:00
item_set_last_item ( $datarray );
2015-03-07 20:24:39 +00:00
// update filetags in pconfig
file_tag_update_pconfig ( $uid , $categories_old , $categories_new , 'category' );
2011-08-29 02:22:27 +00:00
2017-03-30 19:32:12 +00:00
if ( $parent ) {
2010-07-07 06:08:38 +00:00
2015-03-07 20:24:39 +00:00
// This item is the last leaf and gets the comment box, clear any ancestors
2016-10-06 21:24:29 +00:00
$r = q ( " UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent` = %d AND `last-child` AND `id` != %d " ,
2015-03-07 20:24:39 +00:00
dbesc ( datetime_convert ()),
2016-10-06 21:24:29 +00:00
intval ( $parent ),
2010-08-10 08:21:38 +00:00
intval ( $post_id )
);
2016-10-06 21:24:29 +00:00
// update the commented timestamp on the parent
q ( " UPDATE `item` SET `visible` = 1, `commented` = '%s', `changed` = '%s' WHERE `id` = %d " ,
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ()),
intval ( $parent )
);
2017-03-30 19:32:12 +00:00
if ( $contact_record != $author ) {
2015-03-07 20:24:39 +00:00
notification ( array (
'type' => NOTIFY_COMMENT ,
'notify_flags' => $user [ 'notify-flags' ],
'language' => $user [ 'language' ],
'to_name' => $user [ 'username' ],
'to_email' => $user [ 'email' ],
'uid' => $user [ 'uid' ],
'item' => $datarray ,
2017-08-26 07:32:10 +00:00
'link' => System :: baseUrl () . '/display/' . urlencode ( $datarray [ 'guid' ]),
2015-03-07 20:24:39 +00:00
'source_name' => $datarray [ 'author-name' ],
'source_link' => $datarray [ 'author-link' ],
'source_photo' => $datarray [ 'author-avatar' ],
'verb' => ACTIVITY_POST ,
'otype' => 'item' ,
'parent' => $parent ,
'parent_uri' => $parent_item [ 'uri' ]
));
2010-10-06 07:33:11 +00:00
2015-03-07 20:24:39 +00:00
}
// Store the comment signature information in case we need to relay to Diaspora
2016-12-20 17:44:15 +00:00
Diaspora :: store_comment_signature ( $datarray , $author , ( $self ? $user [ 'prvkey' ] : false ), $post_id );
2015-03-07 20:24:39 +00:00
} else {
$parent = $post_id ;
2016-10-06 21:24:29 +00:00
$r = q ( " UPDATE `item` SET `parent` = %d WHERE `id` = %d " ,
intval ( $parent ),
intval ( $post_id ));
2017-11-02 20:15:14 +00:00
if (( $contact_record != $author ) && ! count ( $forum_contact )) {
2015-03-07 20:24:39 +00:00
notification ( array (
'type' => NOTIFY_WALL ,
'notify_flags' => $user [ 'notify-flags' ],
'language' => $user [ 'language' ],
'to_name' => $user [ 'username' ],
'to_email' => $user [ 'email' ],
'uid' => $user [ 'uid' ],
'item' => $datarray ,
2017-08-26 07:32:10 +00:00
'link' => System :: baseUrl () . '/display/' . urlencode ( $datarray [ 'guid' ]),
2015-03-07 20:24:39 +00:00
'source_name' => $datarray [ 'author-name' ],
'source_link' => $datarray [ 'author-link' ],
'source_photo' => $datarray [ 'author-avatar' ],
'verb' => ACTIVITY_POST ,
'otype' => 'item'
));
2010-08-10 08:21:38 +00:00
}
}
2015-03-07 20:24:39 +00:00
2010-12-28 07:28:34 +00:00
call_hooks ( 'post_local_end' , $datarray );
2011-02-01 02:18:28 +00:00
2017-03-30 19:32:12 +00:00
if ( strlen ( $emailcc ) && $profile_uid == local_user ()) {
2011-02-01 02:18:28 +00:00
$erecips = explode ( ',' , $emailcc );
2017-03-30 19:32:12 +00:00
if ( count ( $erecips )) {
foreach ( $erecips as $recip ) {
2011-02-01 02:18:28 +00:00
$addr = trim ( $recip );
2017-03-30 19:32:12 +00:00
if ( ! strlen ( $addr )) {
2011-02-01 02:18:28 +00:00
continue ;
2017-03-30 19:32:12 +00:00
}
2017-03-31 18:49:43 +00:00
$disclaimer = '<hr />' . sprintf ( t ( 'This message was sent to you by %s, a member of the Friendica social network.' ), $a -> user [ 'username' ])
2011-03-10 23:22:21 +00:00
. '<br />' ;
2017-08-26 07:32:10 +00:00
$disclaimer .= sprintf ( t ( 'You may visit them online at %s' ), System :: baseUrl () . '/profile/' . $a -> user [ 'nickname' ]) . EOL ;
2015-03-22 09:12:16 +00:00
$disclaimer .= t ( 'Please contact the sender by replying to this post if you do not wish to receive these messages.' ) . EOL ;
2014-08-27 23:06:41 +00:00
if ( ! $datarray [ 'title' ] == '' ) {
2017-03-30 19:32:12 +00:00
$subject = email_header_encode ( $datarray [ 'title' ], 'UTF-8' );
2014-08-27 23:06:41 +00:00
} else {
2017-03-30 19:32:12 +00:00
$subject = email_header_encode ( '[Friendica]' . ' ' . sprintf ( t ( '%s posted an update.' ), $a -> user [ 'username' ]), 'UTF-8' );
2014-08-27 23:06:41 +00:00
}
2017-08-26 07:32:10 +00:00
$link = '<a href="' . System :: baseUrl () . '/profile/' . $a -> user [ 'nickname' ] . '"><img src="' . $author [ 'thumb' ] . '" alt="' . $a -> user [ 'username' ] . '" /></a><br /><br />' ;
2011-02-01 02:18:28 +00:00
$html = prepare_body ( $datarray );
$message = '<html><body>' . $link . $html . $disclaimer . '</body></html>' ;
2017-03-31 18:30:21 +00:00
include_once 'include/html2plain.php' ;
2014-08-27 23:06:41 +00:00
$params = array (
'fromName' => $a -> user [ 'username' ],
'fromEmail' => $a -> user [ 'email' ],
'toEmail' => $addr ,
'replyTo' => $a -> user [ 'email' ],
'messageSubject' => $subject ,
'htmlVersion' => $message ,
'textVersion' => html2plain ( $html . $disclaimer ),
);
2015-03-22 09:12:16 +00:00
Emailer :: send ( $params );
2011-02-01 02:18:28 +00:00
}
}
}
2016-10-23 21:59:40 +00:00
if ( $post_id == $parent ) {
2015-02-10 07:22:21 +00:00
add_thread ( $post_id );
2016-10-23 21:59:40 +00:00
} else {
2016-10-06 21:24:29 +00:00
update_thread ( $parent , true );
2016-10-29 21:27:56 +00:00
}
2016-10-07 06:05:43 +00:00
2017-05-11 20:13:45 +00:00
dba :: commit ();
2016-10-29 21:27:56 +00:00
create_tags_from_item ( $post_id );
create_files_from_item ( $post_id );
2016-11-12 13:17:28 +00:00
// Insert an item entry for UID=0 for global entries.
// We now do it in the background to save some time.
// This is important in interactive environments like the frontend or the API.
// We don't fork a new process since this is done anyway with the following command
2017-11-19 19:47:04 +00:00
Worker :: add ( array ( 'priority' => PRIORITY_HIGH , 'dont_fork' => true ), " CreateShadowEntry " , $post_id );
2011-09-13 02:42:10 +00:00
2016-11-12 13:17:28 +00:00
// Call the background process that is delivering the item to the receivers
2017-11-19 18:59:55 +00:00
Worker :: add ( PRIORITY_HIGH , " Notifier " , $notify_type , $post_id );
2011-09-13 02:42:10 +00:00
2011-02-17 05:17:49 +00:00
logger ( 'post_complete' );
2011-08-03 23:29:25 +00:00
2017-08-26 07:32:10 +00:00
item_post_return ( System :: baseUrl (), $api_source , $return_path );
2012-11-01 23:14:42 +00:00
// NOTREACHED
}
function item_post_return ( $baseurl , $api_source , $return_path ) {
2011-08-03 23:29:25 +00:00
// figure out how to return, depending on from whence we came
2017-03-30 19:32:12 +00:00
if ( $api_source ) {
2011-08-03 23:29:25 +00:00
return ;
2017-03-30 19:32:12 +00:00
}
2011-08-03 23:29:25 +00:00
2016-12-20 10:18:54 +00:00
if ( $return_path ) {
2016-10-29 20:17:33 +00:00
goaway ( $return_path );
2011-02-17 05:17:49 +00:00
}
2011-09-12 04:52:50 +00:00
2011-02-14 12:43:49 +00:00
$json = array ( 'success' => 1 );
2017-03-31 18:30:21 +00:00
if ( x ( $_REQUEST , 'jsreload' ) && strlen ( $_REQUEST [ 'jsreload' ])) {
2012-11-01 23:14:42 +00:00
$json [ 'reload' ] = $baseurl . '/' . $_REQUEST [ 'jsreload' ];
2016-12-20 10:18:54 +00:00
}
2011-02-17 05:17:49 +00:00
logger ( 'post_json: ' . print_r ( $json , true ), LOGGER_DEBUG );
2011-02-14 12:43:49 +00:00
echo json_encode ( $json );
2011-02-12 11:14:59 +00:00
killme ();
2010-07-27 00:01:37 +00:00
}
2016-02-07 14:11:34 +00:00
2017-01-09 12:14:25 +00:00
function item_content ( App $a ) {
2010-07-27 00:01:37 +00:00
2016-12-20 10:18:54 +00:00
if (( ! local_user ()) && ( ! remote_user ())) {
2010-07-27 00:01:37 +00:00
return ;
2016-12-20 10:18:54 +00:00
}
2010-07-27 00:01:37 +00:00
2017-03-31 18:30:21 +00:00
require_once 'include/security.php' ;
2010-07-27 00:01:37 +00:00
2013-01-26 19:52:21 +00:00
$o = '' ;
2016-12-20 10:18:54 +00:00
if (( $a -> argc == 3 ) && ( $a -> argv [ 1 ] === 'drop' ) && intval ( $a -> argv [ 2 ])) {
2013-02-15 11:34:32 +00:00
$o = drop_item ( $a -> argv [ 2 ], ! is_ajax ());
2016-12-20 10:18:54 +00:00
if ( is_ajax ()) {
2015-03-01 19:40:38 +00:00
// ajax return: [<item id>, 0 (no perm) | <owner id>]
2013-02-15 11:34:32 +00:00
echo json_encode ( array ( intval ( $a -> argv [ 2 ]), intval ( $o )));
2013-03-24 08:37:11 +00:00
killme ();
2013-02-15 11:34:32 +00:00
}
2010-07-27 00:01:37 +00:00
}
2013-01-26 19:52:21 +00:00
return $o ;
2011-05-22 04:40:16 +00:00
}
2012-03-09 11:57:11 +00:00
2012-03-12 12:59:00 +00:00
/**
2015-03-01 19:40:38 +00:00
* This function removes the tag $tag from the text $body and replaces it with
* the appropiate link .
*
2016-12-20 10:18:54 +00:00
* @ param App $a Application instance @ TODO is unused in this function ' s scope ( excluding included files )
2012-03-12 12:59:00 +00:00
* @ param unknown_type $body the text to replace the tag in
2016-04-13 05:00:36 +00:00
* @ param string $inform a comma - seperated string containing everybody to inform
* @ param string $str_tags string to add the tag to
* @ param integer $profile_uid
* @ param string $tag the tag to replace
* @ param string $network The network of the post
2012-05-03 05:33:51 +00:00
*
* @ return boolean true if replaced , false if not replaced
2012-03-12 12:59:00 +00:00
*/
2017-11-15 15:53:16 +00:00
function handle_tag ( App $a , & $body , & $inform , & $str_tags , $profile_uid , $tag , $network = " " )
{
2012-05-03 05:33:51 +00:00
$replaced = false ;
2012-05-30 05:57:15 +00:00
$r = null ;
2017-10-31 19:33:23 +00:00
$tag_type = '@' ;
2012-05-03 05:33:51 +00:00
2014-08-25 12:09:56 +00:00
//is it a person tag?
2017-10-31 19:33:23 +00:00
if (( strpos ( $tag , '@' ) === 0 ) || ( strpos ( $tag , '!' ) === 0 )) {
$tag_type = substr ( $tag , 0 , 1 );
2014-08-25 12:09:56 +00:00
//is it already replaced?
2017-03-30 19:32:12 +00:00
if ( strpos ( $tag , '[url=' )) {
2015-06-07 21:18:02 +00:00
//append tag to str_tags
2017-03-31 18:30:21 +00:00
if ( ! stristr ( $str_tags , $tag )) {
2016-12-20 10:18:54 +00:00
if ( strlen ( $str_tags )) {
2015-06-07 21:18:02 +00:00
$str_tags .= ',' ;
2016-12-20 10:18:54 +00:00
}
2015-06-07 21:18:02 +00:00
$str_tags .= $tag ;
}
// Checking for the alias that is used for OStatus
2017-10-31 19:33:23 +00:00
$pattern = " /[@!] \ [url \ =(.*?) \ ](.*?) \ [ \ /url \ ]/ism " ;
2015-06-07 21:18:02 +00:00
if ( preg_match ( $pattern , $tag , $matches )) {
2016-04-25 19:35:42 +00:00
$r = q ( " SELECT `alias`, `name` FROM `contact` WHERE `nurl` = '%s' AND `alias` != '' AND `uid` = 0 " ,
normalise_link ( $matches [ 1 ]));
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2016-04-25 19:35:42 +00:00
$r = q ( " SELECT `alias`, `name` FROM `gcontact` WHERE `nurl` = '%s' AND `alias` != '' " ,
normalise_link ( $matches [ 1 ]));
2017-03-30 19:32:12 +00:00
}
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2016-04-25 19:35:42 +00:00
$data = $r [ 0 ];
2017-03-30 19:32:12 +00:00
} else {
2017-11-07 02:22:52 +00:00
$data = Probe :: uri ( $matches [ 1 ]);
2017-03-30 19:32:12 +00:00
}
2016-04-25 19:35:42 +00:00
2015-06-07 21:18:02 +00:00
if ( $data [ " alias " ] != " " ) {
2017-03-30 19:32:12 +00:00
$newtag = '@[url=' . $data [ " alias " ] . ']' . $data [ " name " ] . '[/url]' ;
if ( ! stristr ( $str_tags , $newtag )) {
if ( strlen ( $str_tags )) {
2015-06-07 21:18:02 +00:00
$str_tags .= ',' ;
2017-03-30 19:32:12 +00:00
}
2015-06-07 21:18:02 +00:00
$str_tags .= $newtag ;
}
}
}
2012-05-03 05:33:51 +00:00
return $replaced ;
2015-06-07 21:18:02 +00:00
}
2012-03-16 13:02:26 +00:00
$stat = false ;
2012-03-12 12:59:00 +00:00
//get the person's name
2017-03-30 19:32:12 +00:00
$name = substr ( $tag , 1 );
2016-01-07 22:43:16 +00:00
2016-01-07 23:35:46 +00:00
// Sometimes the tag detection doesn't seem to work right
// This is some workaround
$nameparts = explode ( " " , $name );
$name = $nameparts [ 0 ];
2016-01-07 22:43:16 +00:00
// Try to detect the contact in various ways
2017-03-30 19:32:12 +00:00
if (( strpos ( $name , '@' )) || ( strpos ( $name , 'http://' ))) {
2016-01-07 22:43:16 +00:00
// Is it in format @user@domain.tld or @http://domain.tld/...?
// First check the contact table for the address
2017-11-02 21:25:20 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network`, `notify`, `forum`, `prv` FROM `contact`
2016-04-23 08:46:16 +00:00
WHERE `addr` = '%s' AND `uid` = % d AND
( `network` != '%s' OR ( `notify` != '' AND `alias` != '' ))
LIMIT 1 " ,
2016-01-07 22:43:16 +00:00
dbesc ( $name ),
2016-04-23 08:46:16 +00:00
intval ( $profile_uid ),
dbesc ( NETWORK_OSTATUS )
2016-01-07 22:43:16 +00:00
);
// Then check in the contact table for the url
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2017-11-02 21:25:20 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network`, `notify`, `forum`, `prv` FROM `contact`
2016-04-23 08:46:16 +00:00
WHERE `nurl` = '%s' AND `uid` = % d AND
( `network` != '%s' OR ( `notify` != '' AND `alias` != '' ))
LIMIT 1 " ,
2016-01-07 22:43:16 +00:00
dbesc ( normalise_link ( $name )),
2016-04-23 08:46:16 +00:00
intval ( $profile_uid ),
dbesc ( NETWORK_OSTATUS )
2016-01-07 22:43:16 +00:00
);
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
// Then check in the global contacts for the address
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2016-04-23 08:46:16 +00:00
$r = q ( " SELECT `url`, `nick`, `name`, `alias`, `network`, `notify` FROM `gcontact`
WHERE `addr` = '%s' AND ( `network` != '%s' OR ( `notify` != '' AND `alias` != '' ))
LIMIT 1 " ,
dbesc ( $name ),
dbesc ( NETWORK_OSTATUS )
);
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
// Then check in the global contacts for the url
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2016-04-23 08:46:16 +00:00
$r = q ( " SELECT `url`, `nick`, `name`, `alias`, `network`, `notify` FROM `gcontact`
WHERE `nurl` = '%s' AND ( `network` != '%s' OR ( `notify` != '' AND `alias` != '' ))
LIMIT 1 " ,
dbesc ( normalise_link ( $name )),
dbesc ( NETWORK_OSTATUS )
);
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2017-11-07 02:22:52 +00:00
$probed = Probe :: uri ( $name );
2016-04-20 05:00:55 +00:00
if ( $result [ 'network' ] != NETWORK_PHANTOM ) {
2017-11-15 14:47:28 +00:00
GlobalContact :: update ( $probed );
2016-01-07 22:43:16 +00:00
$r = q ( " SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1 " ,
dbesc ( normalise_link ( $probed [ " url " ])));
}
}
2016-01-07 23:35:46 +00:00
} else {
2016-01-07 22:43:16 +00:00
$r = false ;
2017-03-31 18:51:18 +00:00
if ( strrpos ( $name , '+' )) {
2016-01-07 22:43:16 +00:00
// Is it in format @nick+number?
2017-03-31 18:51:18 +00:00
$tagcid = intval ( substr ( $name , strrpos ( $name , '+' ) + 1 ));
2016-01-07 22:43:16 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $tagcid ),
intval ( $profile_uid )
);
}
2017-03-30 19:32:12 +00:00
// select someone by attag or nick and the name passed in the current network
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r ) && ( $network != " " ))
2016-01-07 22:43:16 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1 " ,
dbesc ( $name ),
dbesc ( $name ),
dbesc ( $network ),
intval ( $profile_uid )
);
//select someone from this user's contacts by name in the current network
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r ) && ( $network != " " )) {
2016-01-07 22:43:16 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1 " ,
2016-04-13 05:00:36 +00:00
dbesc ( $name ),
2016-01-07 22:43:16 +00:00
dbesc ( $network ),
intval ( $profile_uid )
);
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
2017-03-30 19:32:12 +00:00
// select someone by attag or nick and the name passed in
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2016-01-07 22:43:16 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1 " ,
dbesc ( $name ),
dbesc ( $name ),
intval ( $profile_uid )
);
2017-03-30 19:32:12 +00:00
}
2017-03-21 16:02:59 +00:00
2017-03-30 19:32:12 +00:00
// select someone from this user's contacts by name
2017-11-08 03:57:46 +00:00
if ( ! DBM :: is_result ( $r )) {
2016-01-07 22:43:16 +00:00
$r = q ( " SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1 " ,
2016-04-13 05:00:36 +00:00
dbesc ( $name ),
2016-01-07 22:43:16 +00:00
intval ( $profile_uid )
);
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
}
2017-11-08 03:57:46 +00:00
if ( DBM :: is_result ( $r )) {
2017-06-08 02:00:59 +00:00
if ( strlen ( $inform ) && ( isset ( $r [ 0 ][ " notify " ]) || isset ( $r [ 0 ][ " id " ]))) {
2016-01-07 22:43:16 +00:00
$inform .= ',' ;
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
2017-03-30 19:32:12 +00:00
if ( isset ( $r [ 0 ][ " id " ])) {
2016-01-07 22:43:16 +00:00
$inform .= 'cid:' . $r [ 0 ][ " id " ];
2017-03-30 19:32:12 +00:00
} elseif ( isset ( $r [ 0 ][ " notify " ])) {
2016-01-07 22:43:16 +00:00
$inform .= $r [ 0 ][ " notify " ];
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
$profile = $r [ 0 ][ " url " ];
$alias = $r [ 0 ][ " alias " ];
$newname = $r [ 0 ][ " nick " ];
2017-06-08 02:00:59 +00:00
if (( $newname == " " ) || (( $r [ 0 ][ " network " ] != NETWORK_OSTATUS ) && ( $r [ 0 ][ " network " ] != NETWORK_TWITTER )
&& ( $r [ 0 ][ " network " ] != NETWORK_STATUSNET ) && ( $r [ 0 ][ " network " ] != NETWORK_APPNET ))) {
2016-01-07 22:43:16 +00:00
$newname = $r [ 0 ][ " name " ];
2017-03-30 19:32:12 +00:00
}
2016-01-07 22:43:16 +00:00
}
2012-03-16 13:02:26 +00:00
//if there is an url for this persons profile
2017-06-08 02:00:59 +00:00
if ( isset ( $profile ) && ( $newname != " " )) {
2012-05-03 05:33:51 +00:00
$replaced = true ;
2017-03-30 19:32:12 +00:00
// create profile link
2017-03-31 18:52:32 +00:00
$profile = str_replace ( ',' , '%2c' , $profile );
2017-10-31 19:33:23 +00:00
$newtag = $tag_type . '[url=' . $profile . ']' . $newname . '[/url]' ;
$body = str_replace ( $tag_type . $name , $newtag , $body );
2017-03-30 19:32:12 +00:00
// append tag to str_tags
2017-03-31 18:51:18 +00:00
if ( ! stristr ( $str_tags , $newtag )) {
2017-03-30 19:32:12 +00:00
if ( strlen ( $str_tags )) {
2012-03-16 13:02:26 +00:00
$str_tags .= ',' ;
2017-03-30 19:32:12 +00:00
}
2012-03-16 13:02:26 +00:00
$str_tags .= $newtag ;
}
2014-08-25 12:09:56 +00:00
2017-03-31 18:51:18 +00:00
/*
* Status . Net seems to require the numeric ID URL in a mention if the person isn ' t
* subscribed to you . But the nickname URL is OK if they are . Grrr . We ' ll tag both .
*/
2017-03-30 19:32:12 +00:00
if ( strlen ( $alias )) {
2017-03-31 18:51:18 +00:00
$newtag = '@[url=' . $alias . ']' . $newname . '[/url]' ;
if ( ! stristr ( $str_tags , $newtag )) {
2017-03-30 19:32:12 +00:00
if ( strlen ( $str_tags )) {
2012-03-16 13:02:26 +00:00
$str_tags .= ',' ;
2017-03-30 19:32:12 +00:00
}
2012-03-16 13:02:26 +00:00
$str_tags .= $newtag ;
}
}
}
2012-03-09 11:57:11 +00:00
}
2012-05-03 05:33:51 +00:00
2014-08-25 12:09:56 +00:00
return array ( 'replaced' => $replaced , 'contact' => $r [ 0 ]);
2012-03-09 11:57:11 +00:00
}