more expanding item flags

This commit is contained in:
friendica 2015-01-22 18:41:10 -08:00
parent e46eba1258
commit 6e0e3b2433
12 changed files with 37 additions and 73 deletions

View File

@ -531,27 +531,6 @@ define ( 'ITEM_BUILDBLOCK', 0x0100); // Named thusly to make sure nobody co
define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche
define ( 'ITEM_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker define ( 'ITEM_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker
define ( 'ITEM_PENDING_REMOVE', 0x0800); // deleted, notification period has lapsed define ( 'ITEM_PENDING_REMOVE', 0x0800); // deleted, notification period has lapsed
/**
* Item Flags
*/
//define ( 'ITEM_ORIGIN', 0x0001);
//define ( 'ITEM_UNSEEN', 0x0002);
//define ( 'ITEM_STARRED', 0x0004);
//define ( 'ITEM_UPLINK', 0x0008);
//define ( 'ITEM_CONSENSUS', 0x0010); // an item which may present agree/disagree/abstain options
//define ( 'ITEM_WALL', 0x0020);
//define ( 'ITEM_THREAD_TOP', 0x0040);
//define ( 'ITEM_NOTSHOWN', 0x0080); // technically visible but not normally shown (e.g. like/dislike)
//define ( 'ITEM_NSFW', 0x0100);
//define ( 'ITEM_RELAY', 0x0200); // used only in the communication layers, not stored
//define ( 'ITEM_MENTIONSME', 0x0400);
//define ( 'ITEM_NOCOMMENT', 0x0800); // commenting/followups are disabled
define ( 'ITEM_OBSCURED', 0x1000); // bit-mangled to protect from casual browsing by site admin
define ( 'ITEM_VERIFIED', 0x2000); // Signature verification was successful
define ( 'ITEM_RETAINED', 0x4000); // We looked at this item once to decide whether or not to expire it, and decided not to.
define ( 'ITEM_RSS', 0x8000); // Item comes from a feed. Use this to decide whether to link the title
// Don't make us evaluate this same item again. // Don't make us evaluate this same item again.
define ( 'DBTYPE_MYSQL', 0 ); define ( 'DBTYPE_MYSQL', 0 );

View File

@ -304,7 +304,7 @@ function bb2diaspora_itembody($item,$force_update = false) {
$newitem = $item; $newitem = $item;
if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) { if(array_key_exists('item_obscured',$item) && intval($item['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
$b = json_decode($item['body'],true); $b = json_decode($item['body'],true);
// if called from diaspora_process_outbound, this decoding has already been done. // if called from diaspora_process_outbound, this decoding has already been done.

View File

@ -357,21 +357,12 @@ function localize_item(&$item){
} }
} }
*/ */
// add sparkle links to appropriate permalinks
// $x = stristr($item['plink'],'/display/');
// if($x) {
// $sparkle = false;
// $y = best_link_url($item,$sparkle,true);
// if($sparkle)
// $item['plink'] = $y . '?f=&url=' . $item['plink'];
// }
// if item body was obscured and we changed it, re-obscure it // if item body was obscured and we changed it, re-obscure it
// FIXME - we need a better filter than just the string 'data'; try and // FIXME - we need a better filter than just the string 'data'; try and
// match the fact that it's json encoded // match the fact that it's json encoded
if(($item['item_flags'] & ITEM_OBSCURED) if(intval($item['item_obscured'])
&& strlen($item['body']) && (! strpos($item['body'],'data'))) { && strlen($item['body']) && (! strpos($item['body'],'data'))) {
$item['body'] = json_encode(crypto_encapsulate($item['body'],get_config('system','pubkey'))); $item['body'] = json_encode(crypto_encapsulate($item['body'],get_config('system','pubkey')));
} }
@ -655,8 +646,8 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$likebuttons = false; $likebuttons = false;
$shareable = false; $shareable = false;
$verified = (($item['item_flags'] & ITEM_VERIFIED) ? t('Message signature validated') : ''); $verified = (intval($item['item_verified']) ? t('Message signature validated') : '');
$forged = ((($item['sig']) && (! ($item['item_flags'] & ITEM_VERIFIED))) ? t('Message signature incorrect') : ''); $forged = ((($item['sig']) && (! intval($item['item_verified']))) ? t('Message signature incorrect') : '');
$unverified = ''; $unverified = '';

View File

@ -157,7 +157,7 @@ function diaspora_process_outbound($arr) {
$target_item = $arr['target_item']; $target_item = $arr['target_item'];
if($target_item && array_key_exists('item_flags',$target_item) && ($target_item['item_flags'] & ITEM_OBSCURED)) { if($target_item && array_key_exists('item_obscured',$target_item) && intval($target_item['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
if($target_item['title']) if($target_item['title'])
$target_item['title'] = crypto_unencapsulate(json_decode($target_item['title'],true),$key); $target_item['title'] = crypto_unencapsulate(json_decode($target_item['title'],true),$key);

View File

@ -65,7 +65,7 @@ function notification($params) {
localize_item($i); localize_item($i);
$title = $i['title']; $title = $i['title'];
$body = $i['body']; $body = $i['body'];
$private = (($i['item_private']) || ($i['item_flags'] & ITEM_OBSCURED)); $private = (($i['item_private']) || intval($i['item_obscured']));
} }
else { else {
$title = $params['item']['title']; $title = $params['item']['title'];

View File

@ -396,13 +396,13 @@ function post_activity_item($arr) {
if($channel) { if($channel) {
if($channel['channel_hash'] === $arr['author_xchan']) { if($channel['channel_hash'] === $arr['author_xchan']) {
$arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey'])); $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
$arr['item_flags'] = $arr['item_flags'] | ITEM_VERIFIED; $arr['item_verified'] = 1;
} }
} }
logger('Encrypting local storage'); logger('Encrypting local storage');
$key = get_config('system','pubkey'); $key = get_config('system','pubkey');
$arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED; $arr['item_obscured'] = 1;
if($arr['title']) if($arr['title'])
$arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key)); $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
if($arr['body']) if($arr['body'])
@ -870,7 +870,7 @@ function get_item_elements($x) {
dbesc($arr['author_xchan']) dbesc($arr['author_xchan'])
); );
if($r && rsa_verify($x['body'],base64url_decode($arr['sig']),$r[0]['xchan_pubkey'])) if($r && rsa_verify($x['body'],base64url_decode($arr['sig']),$r[0]['xchan_pubkey']))
$arr['item_flags'] |= ITEM_VERIFIED; $arr['item_verified'] = 1;
else else
logger('get_item_elements: message verification failed.'); logger('get_item_elements: message verification failed.');
} }
@ -883,7 +883,7 @@ function get_item_elements($x) {
if(intval($arr['item_private'])) { if(intval($arr['item_private'])) {
$arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED; $arr['item_obscured'] = 1;
if($arr['title']) if($arr['title'])
$arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key)); $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
if($arr['body']) if($arr['body'])
@ -1066,7 +1066,7 @@ function encode_item($item,$mirror = false) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) { if(array_key_exists('item_obscured',$item) && intval($item['item_obscured'])) {
if($item['title']) if($item['title'])
$item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key); $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
if($item['body']) if($item['body'])
@ -1475,7 +1475,7 @@ function get_atom_elements($feed,$item,&$author) {
$res['title'] = unxmlify($item->get_title()); $res['title'] = unxmlify($item->get_title());
$res['body'] = unxmlify($item->get_content()); $res['body'] = unxmlify($item->get_content());
$res['plink'] = unxmlify($item->get_link(0)); $res['plink'] = unxmlify($item->get_link(0));
$res['item_flags'] = ITEM_RSS; $res['item_rss'] = 1;
// removing the content of the title if its identically to the body // removing the content of the title if its identically to the body
@ -1956,7 +1956,7 @@ function item_store($arr,$allow_exec = false) {
// only detect language if we have text content, and if the post is private but not yet // only detect language if we have text content, and if the post is private but not yet
// obscured, make it so. // obscured, make it so.
if(! ($arr['item_flags'] & ITEM_OBSCURED)) { if((! array_key_exists('item_obscured',$arr)) || $arr['item_obscured'] == 0) {
$arr['lang'] = detect_language($arr['body']); $arr['lang'] = detect_language($arr['body']);
// apply the input filter here - if it is obscured it has been filtered already // apply the input filter here - if it is obscured it has been filtered already
@ -1967,7 +1967,7 @@ function item_store($arr,$allow_exec = false) {
$channel = get_app()->get_channel(); $channel = get_app()->get_channel();
if($channel['channel_hash'] === $arr['author_xchan']) { if($channel['channel_hash'] === $arr['author_xchan']) {
$arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey'])); $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
$arr['item_flags'] |= ITEM_VERIFIED; $arr['item_verified'] = 1;
} }
} }
@ -1985,7 +1985,7 @@ function item_store($arr,$allow_exec = false) {
} }
if($arr['item_private']) { if($arr['item_private']) {
$key = get_config('system','pubkey'); $key = get_config('system','pubkey');
$arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED; $arr['item_obscured'] = 1;
if($arr['title']) if($arr['title'])
$arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key)); $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
if($arr['body']) if($arr['body'])
@ -2349,7 +2349,7 @@ function item_store_update($arr,$allow_exec = false) {
return $ret; return $ret;
} }
if(! ($arr['item_flags'] & ITEM_OBSCURED)) { if((! array_key_exists('item_obscured', $arr)) || $arr['item_obscured'] == 0) {
$arr['lang'] = detect_language($arr['body']); $arr['lang'] = detect_language($arr['body']);
// apply the input filter here - if it is obscured it has been filtered already // apply the input filter here - if it is obscured it has been filtered already
@ -2377,7 +2377,7 @@ function item_store_update($arr,$allow_exec = false) {
} }
if($arr['item_private']) { if($arr['item_private']) {
$key = get_config('system','pubkey'); $key = get_config('system','pubkey');
$arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED; $arr['item_obscured'] = 1;
if($arr['title']) if($arr['title'])
$arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key)); $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
if($arr['body']) if($arr['body'])
@ -2834,7 +2834,7 @@ function tag_deliver($uid,$item_id) {
$body = ''; $body = '';
if($item['item_flags'] & ITEM_OBSCURED) { if(intval($item['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
if($item['body']) if($item['body'])
$body = crypto_unencapsulate(json_decode_plus($item['body']),$key); $body = crypto_unencapsulate(json_decode_plus($item['body']),$key);
@ -2981,7 +2981,7 @@ function tgroup_check($uid,$item) {
$body = $item['body']; $body = $item['body'];
if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED) && $body) { if(array_key_exists('item_obscured',$item) && intval($item['item_obscured']) && $body) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
$body = crypto_unencapsulate(json_decode($body,true),$key); $body = crypto_unencapsulate(json_decode($body,true),$key);
} }
@ -3025,6 +3025,7 @@ function start_delivery_chain($channel,$item,$item_id,$parent) {
$item_origin = 1; $item_origin = 1;
$item_uplink = 0; $item_uplink = 0;
$item_nocomment = 0; $item_nocomment = 0;
$item_obscured = 0;
$flag_bits = $item['item_flags']; $flag_bits = $item['item_flags'];
@ -3048,30 +3049,31 @@ function start_delivery_chain($channel,$item,$item_id,$parent) {
$body = $item['body']; $body = $item['body'];
if($private) { if($private) {
if(!($flag_bits & ITEM_OBSCURED)) { if(! intval($item['item_obscured'])) {
$key = get_config('system','pubkey'); $key = get_config('system','pubkey');
$flag_bits = $flag_bits|ITEM_OBSCURED;
if($title) if($title)
$title = json_encode(crypto_encapsulate($title,$key)); $title = json_encode(crypto_encapsulate($title,$key));
if($body) if($body)
$body = json_encode(crypto_encapsulate($body,$key)); $body = json_encode(crypto_encapsulate($body,$key));
$item_obscured = 1;
} }
} }
else { else {
if($flag_bits & ITEM_OBSCURED) { if(intval($item['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
$flag_bits = $flag_bits ^ ITEM_OBSCURED;
if($title) if($title)
$title = crypto_unencapsulate(json_decode($title,true),$key); $title = crypto_unencapsulate(json_decode($title,true),$key);
if($body) if($body)
$body = crypto_unencapsulate(json_decode($body,true),$key); $body = crypto_unencapsulate(json_decode($body,true),$key);
$item_obscured = 0;
} }
} }
$r = q("update item set item_uplink = %d, item_nocomment = %d, item_flags = %d, owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s', $r = q("update item set item_uplink = %d, item_nocomment = %d, item_obscured = %d, item_flags = %d, owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
deny_cid = '%s', deny_gid = '%s', item_private = %d, public_policy = '%s', comment_policy = '%s', title = '%s', body = '%s', item_wall = %d, item_origin = %d where id = %d", deny_cid = '%s', deny_gid = '%s', item_private = %d, public_policy = '%s', comment_policy = '%s', title = '%s', body = '%s', item_wall = %d, item_origin = %d where id = %d",
intval($item_uplink), intval($item_uplink),
intval($item_nocomment), intval($item_nocomment),
intval($item_obscured),
intval($flag_bits), intval($flag_bits),
dbesc($channel['channel_hash']), dbesc($channel['channel_hash']),
dbesc($channel['channel_allow_cid']), dbesc($channel['channel_allow_cid']),
@ -3860,11 +3862,10 @@ function item_expire($uid,$days) {
AND `created` < %s - INTERVAL %s AND `created` < %s - INTERVAL %s
AND `id` = `parent` AND `id` = `parent`
$sql_extra $sql_extra
AND NOT ( item_flags & %d )>0 AND item_retained = 0
AND (item_restrict = 0 ) ", AND (item_restrict = 0 ) ",
intval($uid), intval($uid),
db_utcnow(), db_quoteinterval(intval($days).' DAY'), db_utcnow(), db_quoteinterval(intval($days).' DAY')
intval(ITEM_RETAINED)
); );
if(! $r) if(! $r)
@ -3901,8 +3902,7 @@ function item_expire($uid,$days) {
} }
function retain_item($id) { function retain_item($id) {
$r = q("update item set item_flags = (item_flags | %d ) where id = %d", $r = q("update item set item_retained = 1 where id = %d",
intval(ITEM_RETAINED),
intval($id) intval($id)
); );
} }

View File

@ -1152,7 +1152,7 @@ function link_compare($a,$b) {
function unobscure(&$item) { function unobscure(&$item) {
if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) { if(array_key_exists('item_obscured',$item) && intval($item['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
if($item['title']) if($item['title'])
$item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key); $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);

View File

@ -55,7 +55,7 @@ function editpost_content(&$a) {
if($itm[0]['item_flags'] & ITEM_OBSCURED) { if(intval($itm[0]['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
if($itm[0]['title']) if($itm[0]['title'])
$itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key); $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);

View File

@ -95,7 +95,7 @@ function editwebpage_content(&$a) {
intval($owner) intval($owner)
); );
if($itm[0]['item_flags'] & ITEM_OBSCURED) { if(intval($itm[0]['item_obscured'])) {
$key = get_config('system','prvkey'); $key = get_config('system','prvkey');
if($itm[0]['title']) if($itm[0]['title'])
$itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key); $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);

View File

@ -27,8 +27,7 @@ function filer_content(&$a) {
intval(local_user()) intval(local_user())
); );
if($r) { if($r) {
$x = q("update item set item_flags = ( item_flags | %d ) where id = %d and uid = %d", $x = q("update item set item_retained = 1 where id = %d and uid = %d",
intval(ITEM_RETAINED),
intval($r[0]['parent']), intval($r[0]['parent']),
intval(local_user()) intval(local_user())
); );

View File

@ -330,11 +330,6 @@ function item_post(&$a) {
$body = $_REQUEST['body']; $body = $_REQUEST['body'];
$item_flags = $orig_post['item_flags']; $item_flags = $orig_post['item_flags'];
// force us to recalculate if we need to obscure this post
if($item_flags & ITEM_OBSCURED)
$item_flags = ($item_flags ^ ITEM_OBSCURED);
$item_restrict = $orig_post['item_restrict']; $item_restrict = $orig_post['item_restrict'];
$postopts = $orig_post['postopts']; $postopts = $orig_post['postopts'];
$created = $orig_post['created']; $created = $orig_post['created'];
@ -765,13 +760,13 @@ function item_post(&$a) {
if($uid) { if($uid) {
if($channel['channel_hash'] === $datarray['author_xchan']) { if($channel['channel_hash'] === $datarray['author_xchan']) {
$datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey'])); $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
$datarray['item_flags'] = $datarray['item_flags'] | ITEM_VERIFIED; $datarray['item_verified'] = 1;
} }
} }
logger('Encrypting local storage'); logger('Encrypting local storage');
$key = get_config('system','pubkey'); $key = get_config('system','pubkey');
$datarray['item_flags'] = $datarray['item_flags'] | ITEM_OBSCURED; $datarray['item_obscured'] = 1;
if($datarray['title']) if($datarray['title'])
$datarray['title'] = json_encode(crypto_encapsulate($datarray['title'],$key)); $datarray['title'] = json_encode(crypto_encapsulate($datarray['title'],$key));
if($datarray['body']) if($datarray['body'])

View File

@ -21,14 +21,14 @@ function viewsrc_content(&$a) {
} }
if(local_user() && $item_id) { if(local_user() && $item_id) {
$r = q("select item_flags, body from item where item_restrict = 0 and uid in (%d , %d) and id = %d limit 1", $r = q("select id, item_flags, item_obscured, body from item where item_restrict = 0 and uid in (%d , %d) and id = %d limit 1",
intval(local_user()), intval(local_user()),
intval($sys['channel_id']), intval($sys['channel_id']),
intval($item_id) intval($item_id)
); );
if($r) { if($r) {
if($r[0]['item_flags'] & ITEM_OBSCURED) if(intval($r[0]['item_obscured']))
$r[0]['body'] = crypto_unencapsulate(json_decode($r[0]['body'],true),get_config('system','prvkey')); $r[0]['body'] = crypto_unencapsulate(json_decode($r[0]['body'],true),get_config('system','prvkey'));
$o = (($json) ? json_encode($r[0]['body']) : str_replace("\n",'<br />',$r[0]['body'])); $o = (($json) ? json_encode($r[0]['body']) : str_replace("\n",'<br />',$r[0]['body']));
} }