From 6e7d7c50174ffe3db78c5318dde0d9b0b1f416b8 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 16:48:10 -0700 Subject: [PATCH 01/39] minor --- include/environment.php | 2 ++ include/gprobe.php | 3 +++ 2 files changed, 5 insertions(+) diff --git a/include/environment.php b/include/environment.php index 47ad241a7..11d465b84 100644 --- a/include/environment.php +++ b/include/environment.php @@ -60,6 +60,8 @@ function phpiniSizeToBytes($val) { $val *= 1024; case 'k': $val *= 1024; + default: + break; } return (int)$val; diff --git a/include/gprobe.php b/include/gprobe.php index bd02ac31b..f3daae9d6 100644 --- a/include/gprobe.php +++ b/include/gprobe.php @@ -3,6 +3,9 @@ require_once('include/cli_startup.php'); require_once('include/zot.php'); +// CLI utility +// performs zot_finger on $argv[1], which is a hex_encoded webbie/reddress + function gprobe_run($argc,$argv){ cli_startup(); From 5b2474238eb0d257db14b0668ef25eab92e53fea Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 19:42:45 -0700 Subject: [PATCH 02/39] first phase of daemon refactoring --- Zotlabs/Daemon/Checksites.php | 55 +++ Zotlabs/Daemon/Cli_suggest.php | 14 + Zotlabs/Daemon/Cronhooks.php | 17 + Zotlabs/Daemon/Deliver.php | 82 ++++ Zotlabs/Daemon/Deliver_hooks.php | 24 ++ Zotlabs/Daemon/Directory.php | 100 +++++ Zotlabs/Daemon/Expire.php | 93 +++++ Zotlabs/Daemon/Externals.php | 98 +++++ Zotlabs/Daemon/Gprobe.php | 34 ++ Zotlabs/Daemon/Importdoc.php | 35 ++ Zotlabs/Daemon/Master.php | 30 ++ Zotlabs/Daemon/Notifier.php | 659 +++++++++++++++++++++++++++++++ Zotlabs/Daemon/Onedirsync.php | 76 ++++ Zotlabs/Daemon/Onepoll.php | 152 +++++++ Zotlabs/Daemon/Poller.php | 437 ++++++++++++++++++++ Zotlabs/Daemon/Queue.php | 89 +++++ Zotlabs/Daemon/Ratenotif.php | 114 ++++++ Zotlabs/Daemon/Rcho.php | 13 + 18 files changed, 2122 insertions(+) create mode 100644 Zotlabs/Daemon/Checksites.php create mode 100644 Zotlabs/Daemon/Cli_suggest.php create mode 100644 Zotlabs/Daemon/Cronhooks.php create mode 100644 Zotlabs/Daemon/Deliver.php create mode 100644 Zotlabs/Daemon/Deliver_hooks.php create mode 100644 Zotlabs/Daemon/Directory.php create mode 100644 Zotlabs/Daemon/Expire.php create mode 100644 Zotlabs/Daemon/Externals.php create mode 100644 Zotlabs/Daemon/Gprobe.php create mode 100755 Zotlabs/Daemon/Importdoc.php create mode 100644 Zotlabs/Daemon/Master.php create mode 100644 Zotlabs/Daemon/Notifier.php create mode 100644 Zotlabs/Daemon/Onedirsync.php create mode 100644 Zotlabs/Daemon/Onepoll.php create mode 100644 Zotlabs/Daemon/Poller.php create mode 100644 Zotlabs/Daemon/Queue.php create mode 100644 Zotlabs/Daemon/Ratenotif.php create mode 100644 Zotlabs/Daemon/Rcho.php diff --git a/Zotlabs/Daemon/Checksites.php b/Zotlabs/Daemon/Checksites.php new file mode 100644 index 000000000..991456319 --- /dev/null +++ b/Zotlabs/Daemon/Checksites.php @@ -0,0 +1,55 @@ + 1) && ($argv[1])) + $site_id = $argv[1]; + + if($site_id) + $sql_options = " and site_url = '" . dbesc($argv[1]) . "' "; + + $days = intval(get_config('system','sitecheckdays')); + if($days < 1) + $days = 30; + + $r = q("select * from site where site_dead = 0 and site_update < %s - INTERVAL %s and site_type = %d $sql_options ", + db_utcnow(), db_quoteinterval($days . ' DAY'), + intval(SITE_TYPE_ZOT) + ); + + if(! $r) + return; + + foreach($r as $rr) { + if(! strcasecmp($rr['site_url'],z_root())) + continue; + + $x = ping_site($rr['site_url']); + if($x['success']) { + logger('checksites: ' . $rr['site_url']); + q("update site set site_update = '%s' where site_url = '%s' ", + dbesc(datetime_convert()), + dbesc($rr['site_url']) + ); + } + else { + logger('marking dead site: ' . $x['message']); + q("update site set site_dead = 1 where site_url = '%s' ", + dbesc($rr['site_url']) + ); + } + } + + return; + } +} diff --git a/Zotlabs/Daemon/Cli_suggest.php b/Zotlabs/Daemon/Cli_suggest.php new file mode 100644 index 000000000..5dced462d --- /dev/null +++ b/Zotlabs/Daemon/Cli_suggest.php @@ -0,0 +1,14 @@ + json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $mm))))); + zot_import($msg,z_root()); + } + } + else { + $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $m))))); + $dresult = zot_import($msg,z_root()); + } + + remove_queue_item($r[0]['outq_hash']); + + if($dresult && is_array($dresult)) { + foreach($dresult as $xx) { + if(is_array($xx) && array_key_exists('message_id',$xx)) { + if(delivery_report_is_storable($xx)) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", + dbesc($xx['message_id']), + dbesc($xx['location']), + dbesc($xx['recipient']), + dbesc($xx['status']), + dbesc(datetime_convert($xx['date'])), + dbesc($xx['sender']) + ); + } + } + } + } + + q("delete from dreport where dreport_queue = '%s'", + dbesc($argv[$x]) + ); + } + } + + // otherwise it's a remote delivery - call queue_deliver() with the $immediate flag + + queue_deliver($r[0],true); + + } + } + } +} diff --git a/Zotlabs/Daemon/Deliver_hooks.php b/Zotlabs/Daemon/Deliver_hooks.php new file mode 100644 index 000000000..e8b5acef0 --- /dev/null +++ b/Zotlabs/Daemon/Deliver_hooks.php @@ -0,0 +1,24 @@ + 2) { + if($argv[2] === 'force') + $force = true; + if($argv[2] === 'nopush') + $pushall = false; + } + + logger('directory update', LOGGER_DEBUG); + + $dirmode = get_config('system','directory_mode'); + if($dirmode === false) + $dirmode = DIRECTORY_MODE_NORMAL; + + $x = q("select * from channel where channel_id = %d limit 1", + intval($argv[1]) + ); + if(! $x) + return; + + $channel = $x[0]; + + if($dirmode != DIRECTORY_MODE_NORMAL) { + + // this is an in-memory update and we don't need to send a network packet. + + local_dir_update($argv[1],$force); + + q("update channel set channel_dirdate = '%s' where channel_id = %d", + dbesc(datetime_convert()), + intval($channel['channel_id']) + ); + + // Now update all the connections + if($pushall) + proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']); + + return; + } + + // otherwise send the changes upstream + + $directory = find_upstream_directory($dirmode); + $url = $directory['url'] . '/post'; + + // ensure the upstream directory is updated + + $packet = zot_build_packet($channel,(($force) ? 'force_refresh' : 'refresh')); + $z = zot_zot($url,$packet); + + // re-queue if unsuccessful + + if(! $z['success']) { + + /** @FIXME we aren't updating channel_dirdate if we have to queue + * the directory packet. That means we'll try again on the next poll run. + */ + + $hash = random_string(); + + queue_insert(array( + 'hash' => $hash, + 'account_id' => $channel['channel_account_id'], + 'channel_id' => $channel['channel_id'], + 'posturl' => $url, + 'notify' => $packet, + )); + + } + else { + q("update channel set channel_dirdate = '%s' where channel_id = %d", + dbesc(datetime_convert()), + intval($channel['channel_id']) + ); + } + + // Now update all the connections + if($pushall) + proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']); + + } +} diff --git a/Zotlabs/Daemon/Expire.php b/Zotlabs/Daemon/Expire.php new file mode 100644 index 000000000..0ba83b240 --- /dev/null +++ b/Zotlabs/Daemon/Expire.php @@ -0,0 +1,93 @@ + ''); + call_hooks('externals_url_select',$arr); + + if($arr['url']) { + $url = $arr['url']; + } + else { + $randfunc = db_getfunc('RAND'); + + // fixme this query does not deal with directory realms. + + $r = q("select site_url, site_pull from site where site_url != '%s' and site_flags != %d and site_type = %d and site_dead = 0 order by $randfunc limit 1", + dbesc(z_root()), + intval(DIRECTORY_MODE_STANDALONE), + intval(SITE_TYPE_ZOT) + ); + if($r) + $url = $r[0]['site_url']; + } + + $blacklisted = false; + + if(! check_siteallowed($url)) { + logger('blacklisted site: ' . $url); + $blacklisted = true; + } + + $attempts ++; + + // make sure we can eventually break out if somebody blacklists all known sites + + if($blacklisted) { + if($attempts > 20) + break; + $attempts --; + continue; + } + + if($url) { + if($r[0]['site_pull'] !== NULL_DATE) + $mindate = urlencode(datetime_convert('','',$r[0]['site_pull'] . ' - 1 day')); + else { + $days = get_config('externals','since_days'); + if($days === false) + $days = 15; + $mindate = urlencode(datetime_convert('','','now - ' . intval($days) . ' days')); + } + + $feedurl = $url . '/zotfeed?f=&mindate=' . $mindate; + + logger('externals: pulling public content from ' . $feedurl, LOGGER_DEBUG); + + $x = z_fetch_url($feedurl); + if(($x) && ($x['success'])) { + + q("update site set site_pull = '%s' where site_url = '%s'", + dbesc(datetime_convert()), + dbesc($url) + ); + + $j = json_decode($x['body'],true); + if($j['success'] && $j['messages']) { + $sys = get_sys_channel(); + foreach($j['messages'] as $message) { + // on these posts, clear any route info. + $message['route'] = ''; + $results = process_delivery(array('hash' => 'undefined'), get_item_elements($message), + array(array('hash' => $sys['xchan_hash'])), false, true); + $total ++; + } + logger('externals: import_public_posts: ' . $total . ' messages imported', LOGGER_DEBUG); + } + } + } + } + } +} diff --git a/Zotlabs/Daemon/Gprobe.php b/Zotlabs/Daemon/Gprobe.php new file mode 100644 index 000000000..8141739be --- /dev/null +++ b/Zotlabs/Daemon/Gprobe.php @@ -0,0 +1,34 @@ + 3) ? $argv[3] : null); + + if(! $item_id) + return; + + $sys = get_sys_channel(); + + $deliveries = array(); + + $dead_hubs = array(); + + $dh = q("select site_url from site where site_dead = 1"); + if($dh) { + foreach($dh as $dead) { + $dead_hubs[] = $dead['site_url']; + } + } + + + $request = false; + $mail = false; + $top_level = false; + $location = false; + $recipients = array(); + $url_recipients = array(); + $normal_mode = true; + $packet_type = 'undefined'; + + if($cmd === 'mail' || $cmd === 'single_mail') { + $normal_mode = false; + $mail = true; + $private = true; + $message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1", + intval($item_id) + ); + if(! $message) { + return; + } + xchan_mail_query($message[0]); + $uid = $message[0]['channel_id']; + $recipients[] = $message[0]['from_xchan']; // include clones + $recipients[] = $message[0]['to_xchan']; + $item = $message[0]; + + $encoded_item = encode_mail($item); + + $s = q("select * from channel where channel_id = %d limit 1", + intval($item['channel_id']) + ); + if($s) + $channel = $s[0]; + + } + elseif($cmd === 'request') { + $channel_id = $item_id; + $xchan = $argv[3]; + $request_message_id = $argv[4]; + + $s = q("select * from channel where channel_id = %d limit 1", + intval($channel_id) + ); + if($s) + $channel = $s[0]; + + $private = true; + $recipients[] = $xchan; + $packet_type = 'request'; + $normal_mode = false; + } + elseif($cmd == 'permission_update' || $cmd == 'permission_create') { + // Get the (single) recipient + $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_self = 0", + intval($item_id) + ); + if($r) { + $uid = $r[0]['abook_channel']; + // Get the sender + $channel = channelx_by_n($uid); + if($channel) { + $perm_update = array('sender' => $channel, 'recipient' => $r[0], 'success' => false, 'deliveries' => ''); + + if($cmd == 'permission_create') + call_hooks('permissions_create',$perm_update); + else + call_hooks('permissions_update',$perm_update); + + if($perm_update['success']) { + if($perm_update['deliveries']) { + $deliveries[] = $perm_update['deliveries']; + do_delivery($deliveries); + } + return; + } + else { + $recipients[] = $r[0]['abook_xchan']; + $private = false; + $packet_type = 'refresh'; + $packet_recips = array(array('guid' => $r[0]['xchan_guid'],'guid_sig' => $r[0]['xchan_guid_sig'],'hash' => $r[0]['xchan_hash'])); + } + } + } + } + elseif($cmd === 'refresh_all') { + logger('notifier: refresh_all: ' . $item_id); + $uid = $item_id; + $channel = channelx_by_n($item_id); + $r = q("select abook_xchan from abook where abook_channel = %d", + intval($item_id) + ); + if($r) { + foreach($r as $rr) { + $recipients[] = $rr['abook_xchan']; + } + } + $private = false; + $packet_type = 'refresh'; + } + elseif($cmd === 'location') { + logger('notifier: location: ' . $item_id); + $s = q("select * from channel where channel_id = %d limit 1", + intval($item_id) + ); + if($s) + $channel = $s[0]; + $uid = $item_id; + $recipients = array(); + $r = q("select abook_xchan from abook where abook_channel = %d", + intval($item_id) + ); + if($r) { + foreach($r as $rr) { + $recipients[] = $rr['abook_xchan']; + } + } + + $encoded_item = array('locations' => zot_encode_locations($channel),'type' => 'location', 'encoding' => 'zot'); + $target_item = array('aid' => $channel['channel_account_id'],'uid' => $channel['channel_id']); + $private = false; + $packet_type = 'location'; + $location = true; + } + elseif($cmd === 'purge_all') { + logger('notifier: purge_all: ' . $item_id); + $s = q("select * from channel where channel_id = %d limit 1", + intval($item_id) + ); + if($s) + $channel = $s[0]; + $uid = $item_id; + $recipients = array(); + $r = q("select abook_xchan from abook where abook_channel = %d", + intval($item_id) + ); + if($r) { + foreach($r as $rr) { + $recipients[] = $rr['abook_xchan']; + } + } + $private = false; + $packet_type = 'purge'; + } + else { + + // Normal items + + // Fetch the target item + + $r = q("SELECT * FROM item WHERE id = %d and parent != 0 LIMIT 1", + intval($item_id) + ); + + if(! $r) + return; + + xchan_query($r); + + $r = fetch_post_tags($r); + + $target_item = $r[0]; + $deleted_item = false; + + if(intval($target_item['item_deleted'])) { + logger('notifier: target item ITEM_DELETED', LOGGER_DEBUG); + $deleted_item = true; + } + + if(intval($target_item['item_type']) != ITEM_TYPE_POST) { + logger('notifier: target item not forwardable: type ' . $target_item['item_type'], LOGGER_DEBUG); + return; + } + if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) || intval($target_item['item_hidden'])) { + logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG); + return; + } + + if(strpos($target_item['postopts'],'nodeliver') !== false) { + logger('notifier: target item is undeliverable', LOGGER_DEBUG); + return; + } + + $s = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1", + intval($target_item['uid']) + ); + if($s) + $channel = $s[0]; + + if($channel['channel_hash'] !== $target_item['author_xchan'] && $channel['channel_hash'] !== $target_item['owner_xchan']) { + logger("notifier: Sending channel {$channel['channel_hash']} is not owner {$target_item['owner_xchan']} or author {$target_item['author_xchan']}", LOGGER_NORMAL, LOG_WARNING); + return; + } + + + if($target_item['id'] == $target_item['parent']) { + $parent_item = $target_item; + $top_level_post = true; + } + else { + // fetch the parent item + $r = q("SELECT * from item where id = %d order by id asc", + intval($target_item['parent']) + ); + + if(! $r) + return; + + if(strpos($r[0]['postopts'],'nodeliver') !== false) { + logger('notifier: target item is undeliverable', LOGGER_DEBUG, LOG_NOTICE); + return; + } + + xchan_query($r); + $r = fetch_post_tags($r); + + $parent_item = $r[0]; + $top_level_post = false; + } + + // avoid looping of discover items 12/4/2014 + + if($sys && $parent_item['uid'] == $sys['channel_id']) + return; + + $encoded_item = encode_item($target_item); + + // Send comments to the owner to re-deliver to everybody in the conversation + // We only do this if the item in question originated on this site. This prevents looping. + // To clarify, a site accepting a new comment is responsible for sending it to the owner for relay. + // Relaying should never be initiated on a post that arrived from elsewhere. + + // We should normally be able to rely on ITEM_ORIGIN, but start_delivery_chain() incorrectly set this + // flag on comments for an extended period. So we'll also call comment_local_origin() which looks at + // the hostname in the message_id and provides a second (fallback) opinion. + + $relay_to_owner = (((! $top_level_post) && (intval($target_item['item_origin'])) && comment_local_origin($target_item)) ? true : false); + + + + $uplink = false; + + // $cmd === 'relay' indicates the owner is sending it to the original recipients + // don't allow the item in the relay command to relay to owner under any circumstances, it will loop + + logger('notifier: relay_to_owner: ' . (($relay_to_owner) ? 'true' : 'false'), LOGGER_DATA, LOG_DEBUG); + logger('notifier: top_level_post: ' . (($top_level_post) ? 'true' : 'false'), LOGGER_DATA, LOG_DEBUG); + + // tag_deliver'd post which needs to be sent back to the original author + + if(($cmd === 'uplink') && intval($parent_item['item_uplink']) && (! $top_level_post)) { + logger('notifier: uplink'); + $uplink = true; + } + + if(($relay_to_owner || $uplink) && ($cmd !== 'relay')) { + logger('notifier: followup relay', LOGGER_DEBUG); + $recipients = array(($uplink) ? $parent_item['source_xchan'] : $parent_item['owner_xchan']); + $private = true; + if(! $encoded_item['flags']) + $encoded_item['flags'] = array(); + $encoded_item['flags'][] = 'relay'; + } + else { + logger('notifier: normal distribution', LOGGER_DEBUG); + if($cmd === 'relay') + logger('notifier: owner relay'); + + // if our parent is a tag_delivery recipient, uplink to the original author causing + // a delivery fork. + + if(($parent_item) && intval($parent_item['item_uplink']) && (! $top_level_post) && ($cmd !== 'uplink')) { + // don't uplink a relayed post to the relay owner + if($parent_item['source_xchan'] !== $parent_item['owner_xchan']) { + logger('notifier: uplinking this item'); + proc_run('php','include/notifier.php','uplink',$item_id); + } + } + + $private = false; + $recipients = collect_recipients($parent_item,$private); + + // FIXME add any additional recipients such as mentions, etc. + + // don't send deletions onward for other people's stuff + // TODO verify this is needed - copied logic from same place in old code + + if(intval($target_item['item_deleted']) && (! intval($target_item['item_wall']))) { + logger('notifier: ignoring delete notification for non-wall item', LOGGER_NORMAL, LOG_NOTICE); + return; + } + } + + } + + $walltowall = (($top_level_post && $channel['xchan_hash'] === $target_item['author_xchan']) ? true : false); + + // Generic delivery section, we have an encoded item and recipients + // Now start the delivery process + + $x = $encoded_item; + $x['title'] = 'private'; + $x['body'] = 'private'; + logger('notifier: encoded item: ' . print_r($x,true), LOGGER_DATA, LOG_DEBUG); + + stringify_array_elms($recipients); + if(! $recipients) + return; + +// logger('notifier: recipients: ' . print_r($recipients,true), LOGGER_NORMAL, LOG_DEBUG); + + $env_recips = (($private) ? array() : null); + + $details = q("select xchan_hash, xchan_instance_url, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")"); + + + $recip_list = array(); + + if($details) { + foreach($details as $d) { + + $recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')'; + if($private) + $env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig'],'hash' => $d['xchan_hash']); + + if($d['xchan_network'] === 'mail' && $normal_mode) { + $delivery_options = get_xconfig($d['xchan_hash'],'system','delivery_mode'); + if(! $delivery_options) + format_and_send_email($channel,$d,$target_item); + } + } + } + + + $narr = array( + 'channel' => $channel, + 'env_recips' => $env_recips, + 'packet_recips' => $packet_recips, + 'recipients' => $recipients, + 'item' => $item, + 'target_item' => $target_item, + 'top_level_post' => $top_level_post, + 'private' => $private, + 'relay_to_owner' => $relay_to_owner, + 'uplink' => $uplink, + 'cmd' => $cmd, + 'mail' => $mail, + 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false), + 'location' => $location, + 'request' => $request, + 'normal_mode' => $normal_mode, + 'packet_type' => $packet_type, + 'walltowall' => $walltowall, + 'queued' => array() + ); + + call_hooks('notifier_process', $narr); + if($narr['queued']) { + foreach($narr['queued'] as $pq) + $deliveries[] = $pq; + } + + // notifier_process can alter the recipient list + + $recipients = $narr['recipients']; + $env_recips = $narr['env_recips']; + $packet_recips = $narr['packet_recips']; + + if(($private) && (! $env_recips)) { + // shouldn't happen + logger('notifier: private message with no envelope recipients.' . print_r($argv,true), LOGGER_NORMAL, LOG_NOTICE); + } + + logger('notifier: recipients (may be delivered to more if public): ' . print_r($recip_list,true), LOGGER_DEBUG); + + + // Now we have collected recipients (except for external mentions, FIXME) + // Let's reduce this to a set of hubs. + + $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") + and hubloc_error = 0 and hubloc_deleted = 0" + ); + + + if(! $r) { + logger('notifier: no hubs', LOGGER_NORMAL, LOG_NOTICE); + return; + } + + $hubs = $r; + + + + /** + * Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey, since it may have been + * a re-install which has not yet been detected and pruned. + * For other networks which don't have or require sitekeys, we'll have to use the URL + */ + + + $hublist = array(); // this provides an easily printable list for the logs + $dhubs = array(); // delivery hubs where we store our resulting unique array + $keys = array(); // array of keys to check uniquness for zot hubs + $urls = array(); // array of urls to check uniqueness of hubs from other networks + + + foreach($hubs as $hub) { + if(in_array($hub['hubloc_url'],$dead_hubs)) { + logger('skipping dead hub: ' . $hub['hubloc_url'], LOGGER_DEBUG, LOG_INFO); + continue; + } + + if($hub['hubloc_network'] == 'zot') { + if(! in_array($hub['hubloc_sitekey'],$keys)) { + $hublist[] = $hub['hubloc_host']; + $dhubs[] = $hub; + $keys[] = $hub['hubloc_sitekey']; + } + } + else { + if(! in_array($hub['hubloc_url'],$urls)) { + $hublist[] = $hub['hubloc_host']; + $dhubs[] = $hub; + $urls[] = $hub['hubloc_url']; + } + } + } + + logger('notifier: will notify/deliver to these hubs: ' . print_r($hublist,true), LOGGER_DEBUG, LOG_DEBUG); + + + foreach($dhubs as $hub) { + + if($hub['hubloc_network'] !== 'zot') { + + $narr = array( + 'channel' => $channel, + 'env_recips' => $env_recips, + 'packet_recips' => $packet_recips, + 'recipients' => $recipients, + 'item' => $item, + 'target_item' => $target_item, + 'hub' => $hub, + 'top_level_post' => $top_level_post, + 'private' => $private, + 'relay_to_owner' => $relay_to_owner, + 'uplink' => $uplink, + 'cmd' => $cmd, + 'mail' => $mail, + 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false), + 'location' => $location, + 'request' => $request, + 'normal_mode' => $normal_mode, + 'packet_type' => $packet_type, + 'walltowall' => $walltowall, + 'queued' => array() + ); + + + call_hooks('notifier_hub',$narr); + if($narr['queued']) { + foreach($narr['queued'] as $pq) + $deliveries[] = $pq; + } + continue; + + } + + // singleton deliveries by definition 'not got zot'. + // Single deliveries are other federated networks (plugins) and we're essentially + // delivering only to those that have this site url in their abook_instance + // and only from within a sync operation. This means if you post from a clone, + // and a connection is connected to one of your other clones; assuming that hub + // is running it will receive a sync packet. On receipt of this sync packet it + // will invoke a delivery to those connections which are connected to just that + // hub instance. + + if($cmd === 'single_mail' || $cmd === 'single_activity') { + continue; + } + + // default: zot protocol + + $hash = random_string(); + $packet = null; + + if($packet_type === 'refresh' || $packet_type === 'purge') { + $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); + } + elseif($packet_type === 'request') { + $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hash, + array('message_id' => $request_message_id) + ); + } + + if($packet) { + queue_insert(array( + 'hash' => $hash, + 'account_id' => $channel['channel_account_id'], + 'channel_id' => $channel['channel_id'], + 'posturl' => $hub['hubloc_callback'], + 'notify' => $packet + )); + } + else { + $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash); + queue_insert(array( + 'hash' => $hash, + 'account_id' => $target_item['aid'], + 'channel_id' => $target_item['uid'], + 'posturl' => $hub['hubloc_callback'], + 'notify' => $packet, + 'msg' => json_encode($encoded_item) + )); + + // only create delivery reports for normal undeleted items + if(is_array($target_item) && array_key_exists('postopts',$target_item) && (! $target_item['item_deleted']) && (! get_config('system','disable_dreport'))) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan, dreport_queue ) values ( '%s','%s','%s','%s','%s','%s','%s' ) ", + dbesc($target_item['mid']), + dbesc($hub['hubloc_host']), + dbesc($hub['hubloc_host']), + dbesc('queued'), + dbesc(datetime_convert()), + dbesc($channel['channel_hash']), + dbesc($hash) + ); + } + } + + $deliveries[] = $hash; + } + + if($normal_mode) { + $x = q("select * from hook where hook = 'notifier_normal'"); + if($x) + proc_run('php','include/deliver_hooks.php', $target_item['id']); + } + + if($deliveries) + do_delivery($deliveries); + + logger('notifier: basic loop complete.', LOGGER_DEBUG); + + call_hooks('notifier_end',$target_item); + + logger('notifer: complete.'); + return; + + } +} + diff --git a/Zotlabs/Daemon/Onedirsync.php b/Zotlabs/Daemon/Onedirsync.php new file mode 100644 index 000000000..cc16c0b58 --- /dev/null +++ b/Zotlabs/Daemon/Onedirsync.php @@ -0,0 +1,76 @@ + 1) && (intval($argv[1]))) + $update_id = intval($argv[1]); + + if(! $update_id) { + logger('onedirsync: no update'); + return; + } + + $r = q("select * from updates where ud_id = %d limit 1", + intval($update_id) + ); + + if(! $r) + return; + if(($r[0]['ud_flags'] & UPDATE_FLAGS_UPDATED) || (! $r[0]['ud_addr'])) + return; + + // Have we probed this channel more recently than the other directory server + // (where we received this update from) ? + // If we have, we don't need to do anything except mark any older entries updated + + $x = q("select * from updates where ud_addr = '%s' and ud_date > '%s' and ( ud_flags & %d )>0 order by ud_date desc limit 1", + dbesc($r[0]['ud_addr']), + dbesc($r[0]['ud_date']), + intval(UPDATE_FLAGS_UPDATED) + ); + if($x) { + $y = q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and ( ud_flags & %d ) = 0 and ud_date != '%s'", + intval(UPDATE_FLAGS_UPDATED), + dbesc($r[0]['ud_addr']), + intval(UPDATE_FLAGS_UPDATED), + dbesc($x[0]['ud_date']) + ); + return; + } + + // ignore doing an update if this ud_addr refers to a known dead hubloc + + $h = q("select * from hubloc where hubloc_addr = '%s' limit 1", + dbesc($r[0]['ud_addr']) + ); + if(($h) && ($h[0]['hubloc_status'] & HUBLOC_OFFLINE)) { + $y = q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and ( ud_flags & %d ) = 0 ", + intval(UPDATE_FLAGS_UPDATED), + dbesc($r[0]['ud_addr']), + intval(UPDATE_FLAGS_UPDATED) + ); + + return; + } + + // we might have to pull this out some day, but for now update_directory_entry() + // runs zot_finger() and is kind of zot specific + + if($h && $h[0]['hubloc_network'] !== 'zot') + return; + + update_directory_entry($r[0]); + + return; + } +} diff --git a/Zotlabs/Daemon/Onepoll.php b/Zotlabs/Daemon/Onepoll.php new file mode 100644 index 000000000..2610ad151 --- /dev/null +++ b/Zotlabs/Daemon/Onepoll.php @@ -0,0 +1,152 @@ + 1) && (intval($argv[1]))) + $contact_id = intval($argv[1]); + + if(! $contact_id) { + logger('onepoll: no contact'); + return; + } + + $d = datetime_convert(); + + $contacts = q("SELECT abook.*, xchan.*, account.* + FROM abook LEFT JOIN account on abook_account = account_id left join xchan on xchan_hash = abook_xchan + where abook_id = %d + and abook_pending = 0 and abook_archived = 0 and abook_blocked = 0 and abook_ignored = 0 + AND (( account_flags = %d ) OR ( account_flags = %d )) limit 1", + intval($contact_id), + intval(ACCOUNT_OK), + intval(ACCOUNT_UNVERIFIED) + ); + + if(! $contacts) { + logger('onepoll: abook_id not found: ' . $contact_id); + return; + } + + $contact = $contacts[0]; + + $t = $contact['abook_updated']; + + $importer_uid = $contact['abook_channel']; + + $r = q("SELECT * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1", + intval($importer_uid) + ); + + if(! $r) + return; + + $importer = $r[0]; + + logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['xchan_name']}, CONTACT: {$contact['xchan_name']}"); + + $last_update = ((($contact['abook_updated'] === $contact['abook_created']) || ($contact['abook_updated'] === NULL_DATE)) + ? datetime_convert('UTC','UTC','now - 7 days') + : datetime_convert('UTC','UTC',$contact['abook_updated'] . ' - 2 days') + ); + + if($contact['xchan_network'] === 'rss') { + logger('onepoll: processing feed ' . $contact['xchan_name'], LOGGER_DEBUG); + handle_feed($importer['channel_id'],$contact_id,$contact['xchan_hash']); + q("update abook set abook_connected = '%s' where abook_id = %d", + dbesc(datetime_convert()), + intval($contact['abook_id']) + ); + return; + } + + if($contact['xchan_network'] !== 'zot') + return; + + // update permissions + + $x = zot_refresh($contact,$importer); + + $responded = false; + $updated = datetime_convert(); + $connected = datetime_convert(); + if(! $x) { + // mark for death by not updating abook_connected, this is caught in include/poller.php + q("update abook set abook_updated = '%s' where abook_id = %d", + dbesc($updated), + intval($contact['abook_id']) + ); + } + else { + q("update abook set abook_updated = '%s', abook_connected = '%s' where abook_id = %d", + dbesc($updated), + dbesc($connected), + intval($contact['abook_id']) + ); + $responded = true; + } + + if(! $responded) + return; + + if($contact['xchan_connurl']) { + $fetch_feed = true; + $x = null; + + if(! ($contact['abook_their_perms'] & PERMS_R_STREAM )) + $fetch_feed = false; + + if($fetch_feed) { + + $feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']); + $feedurl .= '?f=&mindate=' . urlencode($last_update); + + $x = z_fetch_url($feedurl); + + logger('feed_update: ' . print_r($x,true), LOGGER_DATA); + + } + + if(($x) && ($x['success'])) { + $total = 0; + logger('onepoll: feed update ' . $contact['xchan_name'] . ' ' . $feedurl); + + $j = json_decode($x['body'],true); + if($j['success'] && $j['messages']) { + foreach($j['messages'] as $message) { + $results = process_delivery(array('hash' => $contact['xchan_hash']), get_item_elements($message), + array(array('hash' => $importer['xchan_hash'])), false); + logger('onepoll: feed_update: process_delivery: ' . print_r($results,true), LOGGER_DATA); + $total ++; + } + logger("onepoll: $total messages processed"); + } + } + } + + + // update the poco details for this connection + + if($contact['xchan_connurl']) { + $r = q("SELECT xlink_id from xlink + where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s and xlink_static = 0 limit 1", + intval($contact['xchan_hash']), + db_utcnow(), db_quoteinterval('1 DAY') + ); + if(! $r) { + poco_load($contact['xchan_hash'],$contact['xchan_connurl']); + } + } + + return; + } +} diff --git a/Zotlabs/Daemon/Poller.php b/Zotlabs/Daemon/Poller.php new file mode 100644 index 000000000..ab96de7c8 --- /dev/null +++ b/Zotlabs/Daemon/Poller.php @@ -0,0 +1,437 @@ + $maxsysload) { + logger('system: load ' . $load . ' too high. Poller deferred to next scheduled run.'); + return; + } + } + + $interval = intval(get_config('system','poll_interval')); + if(! $interval) + $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval'))); + + // Check for a lockfile. If it exists, but is over an hour old, it's stale. Ignore it. + $lockfile = 'store/[data]/poller'; + if((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 3600)) + && (! get_config('system','override_poll_lockfile'))) { + logger("poller: Already running"); + return; + } + + // Create a lockfile. Needs two vars, but $x doesn't need to contain anything. + file_put_contents($lockfile, $x); + + logger('poller: start'); + + // run queue delivery process in the background + + proc_run('php',"include/queue.php"); + + + // maintenance for mod sharedwithme - check for updated items and remove them + + require_once('include/sharedwithme.php'); + apply_updates(); + + + // expire any expired mail + + q("delete from mail where expires != '%s' and expires < %s ", + dbesc(NULL_DATE), + db_utcnow() + ); + + // expire any expired items + + $r = q("select id from item where expires != '%s' and expires < %s + and item_deleted = 0 ", + dbesc(NULL_DATE), + db_utcnow() + ); + if($r) { + require_once('include/items.php'); + foreach($r as $rr) + drop_item($rr['id'],false); + } + + + // Ensure that every channel pings a directory server once a month. This way we can discover + // channels and sites that quietly vanished and prevent the directory from accumulating stale + // or dead entries. + + $r = q("select channel_id from channel where channel_dirdate < %s - INTERVAL %s", + db_utcnow(), + db_quoteinterval('30 DAY') + ); + if($r) { + foreach($r as $rr) { + proc_run('php','include/directory.php',$rr['channel_id'],'force'); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } + } + + // publish any applicable items that were set to be published in the future + // (time travel posts). Restrict to items that have come of age in the last + // couple of days to limit the query to something reasonable. + + $r = q("select id from item where item_delayed = 1 and created <= %s and created > '%s' ", + db_utcnow(), + dbesc(datetime_convert('UTC','UTC','now - 2 days')) + ); + if($r) { + foreach($r as $rr) { + $x = q("update item set item_delayed = 0 where id = %d", + intval($rr['id']) + ); + if($x) { + proc_run('php','include/notifier.php','wall-new',$rr['id']); + } + } + } + + $abandon_days = intval(get_config('system','account_abandon_days')); + if($abandon_days < 1) + $abandon_days = 0; + + + // once daily run birthday_updates and then expire in background + + // FIXME: add birthday updates, both locally and for xprof for use + // by directory servers + + $d1 = intval(get_config('system','last_expire_day')); + $d2 = intval(datetime_convert('UTC','UTC','now','d')); + + // Allow somebody to staggger daily activities if they have more than one site on their server, + // or if it happens at an inconvenient (busy) hour. + + $h1 = intval(get_config('system','cron_hour')); + $h2 = intval(datetime_convert('UTC','UTC','now','G')); + + $dirmode = get_config('system','directory_mode'); + + /** + * Cron Daily + * + * Actions in the following block are executed once per day, not on every poller run + * + */ + + if(($d2 != $d1) && ($h1 == $h2)) { + + require_once('include/dir_fns.php'); + check_upstream_directory(); + + call_hooks('cron_daily',datetime_convert()); + + + $d3 = intval(datetime_convert('UTC','UTC','now','N')); + if($d3 == 7) { + + /** + * Cron Weekly + * + * Actions in the following block are executed once per day only on Sunday (once per week). + * + */ + + + call_hooks('cron_weekly',datetime_convert()); + + + z_check_cert(); + + require_once('include/hubloc.php'); + prune_hub_reinstalls(); + + require_once('include/Contact.php'); + mark_orphan_hubsxchans(); + + + // get rid of really old poco records + + q("delete from xlink where xlink_updated < %s - INTERVAL %s and xlink_static = 0 ", + db_utcnow(), db_quoteinterval('14 DAY') + ); + + $dirmode = intval(get_config('system','directory_mode')); + if($dirmode === DIRECTORY_MODE_SECONDARY || $dirmode === DIRECTORY_MODE_PRIMARY) { + logger('regdir: ' . print_r(z_fetch_url(get_directory_primary() . '/regdir?f=&url=' . urlencode(z_root()) . '&realm=' . urlencode(get_directory_realm())),true)); + } + + // Check for dead sites + proc_run('php', 'include/checksites.php'); + + // update searchable doc indexes + proc_run('php', 'include/importdoc.php'); + + /** + * End Cron Weekly + */ + } + + update_birthdays(); + + //update statistics in config + require_once('include/statistics_fns.php'); + update_channels_total_stat(); + update_channels_active_halfyear_stat(); + update_channels_active_monthly_stat(); + update_local_posts_stat(); + + // expire any read notifications over a month old + + q("delete from notify where seen = 1 and date < %s - INTERVAL %s", + db_utcnow(), db_quoteinterval('30 DAY') + ); + + // expire old delivery reports + + $keep_reports = intval(get_config('system','expire_delivery_reports')); + if($keep_reports === 0) + $keep_reports = 10; + + q("delete from dreport where dreport_time < %s - INTERVAL %s", + db_utcnow(), + db_quoteinterval($keep_reports . ' DAY') + ); + + // expire any expired accounts + downgrade_accounts(); + + // If this is a directory server, request a sync with an upstream + // directory at least once a day, up to once every poll interval. + // Pull remote changes and push local changes. + // potential issue: how do we keep from creating an endless update loop? + + if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) { + require_once('include/dir_fns.php'); + sync_directories($dirmode); + } + + set_config('system','last_expire_day',$d2); + + proc_run('php','include/expire.php'); + proc_run('php','include/cli_suggest.php'); + + require_once('include/hubloc.php'); + remove_obsolete_hublocs(); + + /** + * End Cron Daily + */ + } + + // update any photos which didn't get imported properly + // This should be rare + + $r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = '' + and xchan_photo_date < %s - INTERVAL %s", + db_utcnow(), + db_quoteinterval('1 DAY') + ); + if($r) { + require_once('include/photo/photo_driver.php'); + foreach($r as $rr) { + $photos = import_xchan_photo($rr['xchan_photo_l'],$rr['xchan_hash']); + $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' + where xchan_hash = '%s'", + dbesc($photos[0]), + dbesc($photos[1]), + dbesc($photos[2]), + dbesc($photos[3]), + dbesc($rr['xchan_hash']) + ); + } + } + + + // pull in some public posts + + if(! get_config('system','disable_discover_tab')) + proc_run('php','include/externals.php'); + + + $manual_id = 0; + $generation = 0; + + $force = false; + $restart = false; + + if(($argc > 1) && ($argv[1] == 'force')) + $force = true; + + if(($argc > 1) && ($argv[1] == 'restart')) { + $restart = true; + $generation = intval($argv[2]); + if(! $generation) + killme(); + } + + if(($argc > 1) && intval($argv[1])) { + $manual_id = intval($argv[1]); + $force = true; + } + + + $sql_extra = (($manual_id) ? " AND abook_id = " . intval($manual_id) . " " : ""); + + reload_plugins(); + + $d = datetime_convert(); + + // TODO check to see if there are any cronhooks before wasting a process + + if(! $restart) + proc_run('php','include/cronhooks.php'); + + // Only poll from those with suitable relationships + + $abandon_sql = (($abandon_days) + ? sprintf(" AND account_lastlog > %s - INTERVAL %s ", db_utcnow(), db_quoteinterval(intval($abandon_days).' DAY')) + : '' + ); + + $randfunc = db_getfunc('RAND'); + + $contacts = q("SELECT * FROM abook LEFT JOIN xchan on abook_xchan = xchan_hash + LEFT JOIN account on abook_account = account_id + where abook_self = 0 + $sql_extra + AND (( account_flags = %d ) OR ( account_flags = %d )) $abandon_sql ORDER BY $randfunc", + intval(ACCOUNT_OK), + intval(ACCOUNT_UNVERIFIED) // FIXME + + ); + + if($contacts) { + + foreach($contacts as $contact) { + + $update = false; + + $t = $contact['abook_updated']; + $c = $contact['abook_connected']; + + if(intval($contact['abook_feed'])) { + $min = service_class_fetch($contact['abook_channel'],'minimum_feedcheck_minutes'); + if(! $min) + $min = intval(get_config('system','minimum_feedcheck_minutes')); + if(! $min) + $min = 60; + $x = datetime_convert('UTC','UTC',"now - $min minutes"); + if($c < $x) { + proc_run('php','include/onepoll.php',$contact['abook_id']); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } + continue; + } + + + if($contact['xchan_network'] !== 'zot') + continue; + + if($c == $t) { + if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) + $update = true; + } + else { + + // if we've never connected with them, start the mark for death countdown from now + + if($c == NULL_DATE) { + $r = q("update abook set abook_connected = '%s' where abook_id = %d", + dbesc(datetime_convert()), + intval($contact['abook_id']) + ); + $c = datetime_convert(); + $update = true; + } + + // He's dead, Jim + + if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 30 day")) > 0) { + $r = q("update abook set abook_archived = 1 where abook_id = %d", + intval($contact['abook_id']) + ); + $update = false; + continue; + } + + if(intval($contact['abook_archived'])) { + $update = false; + continue; + } + + // might be dead, so maybe don't poll quite so often + + // recently deceased, so keep up the regular schedule for 3 days + + if((strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 3 day")) > 0) + && (strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 1 day")) > 0)) + $update = true; + + // After that back off and put them on a morphine drip + + if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 2 day")) > 0) { + $update = true; + } + + } + + if(intval($contact['abook_pending']) || intval($contact['abook_archived']) || intval($contact['abook_ignored']) || intval($contact['abook_blocked'])) + continue; + + if((! $update) && (! $force)) + continue; + + proc_run('php','include/onepoll.php',$contact['abook_id']); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + + } + } + + if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) { + $r = q("SELECT u.ud_addr, u.ud_id, u.ud_last FROM updates AS u INNER JOIN (SELECT ud_addr, max(ud_id) AS ud_id FROM updates WHERE ( ud_flags & %d ) = 0 AND ud_addr != '' AND ( ud_last = '%s' OR ud_last > %s - INTERVAL %s ) GROUP BY ud_addr) AS s ON s.ud_id = u.ud_id ", + intval(UPDATE_FLAGS_UPDATED), + dbesc(NULL_DATE), + db_utcnow(), db_quoteinterval('7 DAY') + ); + if($r) { + foreach($r as $rr) { + + // If they didn't respond when we attempted before, back off to once a day + // After 7 days we won't bother anymore + + if($rr['ud_last'] != NULL_DATE) + if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day')) + continue; + proc_run('php','include/onedirsync.php',$rr['ud_id']); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } + } + } + + set_config('system','lastpoll',datetime_convert()); + + //All done - clear the lockfile + @unlink($lockfile); + + return; + } +} diff --git a/Zotlabs/Daemon/Queue.php b/Zotlabs/Daemon/Queue.php new file mode 100644 index 000000000..c247be8e4 --- /dev/null +++ b/Zotlabs/Daemon/Queue.php @@ -0,0 +1,89 @@ + 1) + $queue_id = argv(1); + else + $queue_id = 0; + + logger('queue: start'); + + // delete all queue items more than 3 days old + // but first mark these sites dead if we haven't heard from them in a month + + $r = q("select outq_posturl from outq where outq_created < %s - INTERVAL %s", + db_utcnow(), db_quoteinterval('3 DAY') + ); + if($r) { + foreach($r as $rr) { + $site_url = ''; + $h = parse_url($rr['outq_posturl']); + $desturl = $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : ''); + q("update site set site_dead = 1 where site_dead = 0 and site_url = '%s' and site_update < %s - INTERVAL %s", + dbesc($desturl), + db_utcnow(), db_quoteinterval('1 MONTH') + ); + } + } + + $r = q("DELETE FROM outq WHERE outq_created < %s - INTERVAL %s", + db_utcnow(), db_quoteinterval('3 DAY') + ); + + if($queue_id) { + $r = q("SELECT * FROM outq WHERE outq_hash = '%s' LIMIT 1", + dbesc($queue_id) + ); + } + else { + + // For the first 12 hours we'll try to deliver every 15 minutes + // After that, we'll only attempt delivery once per hour. + // This currently only handles the default queue drivers ('zot' or '') which we will group by posturl + // so that we don't start off a thousand deliveries for a couple of dead hubs. + // The zot driver will deliver everything destined for a single hub once contact is made (*if* contact is made). + // Other drivers will have to do something different here and may need their own query. + + // Note: this requires some tweaking as new posts to long dead hubs once a day will keep them in the + // "every 15 minutes" category. We probably need to prioritise them when inserted into the queue + // or just prior to this query based on recent and long-term delivery history. If we have good reason to believe + // the site is permanently down, there's no reason to attempt delivery at all, or at most not more than once + // or twice a day. + + // FIXME: can we sort postgres on outq_priority and maintain the 'distinct' ? + // The order by max(outq_priority) might be a dodgy query because of the group by. + // The desired result is to return a sequence in the order most likely to be delivered in this run. + // If a hub has already been sitting in the queue for a few days, they should be delivered last; + // hence every failure should drop them further down the priority list. + + if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { + $prefix = 'DISTINCT ON (outq_posturl)'; + $suffix = 'ORDER BY outq_posturl'; + } else { + $prefix = ''; + $suffix = 'GROUP BY outq_posturl ORDER BY max(outq_priority)'; + } + $r = q("SELECT $prefix * FROM outq WHERE outq_delivered = 0 and (( outq_created > %s - INTERVAL %s and outq_updated < %s - INTERVAL %s ) OR ( outq_updated < %s - INTERVAL %s )) $suffix", + db_utcnow(), db_quoteinterval('12 HOUR'), + db_utcnow(), db_quoteinterval('15 MINUTE'), + db_utcnow(), db_quoteinterval('1 HOUR') + ); + } + if(! $r) + return; + + foreach($r as $rr) { + queue_deliver($rr); + } + } +} diff --git a/Zotlabs/Daemon/Ratenotif.php b/Zotlabs/Daemon/Ratenotif.php new file mode 100644 index 000000000..fd2200dc9 --- /dev/null +++ b/Zotlabs/Daemon/Ratenotif.php @@ -0,0 +1,114 @@ + 'rating', + 'encoding' => 'zot', + 'target' => $r[0]['xlink_link'], + 'rating' => intval($r[0]['xlink_rating']), + 'rating_text' => $r[0]['xlink_rating_text'], + 'signature' => $r[0]['xlink_sig'], + 'edited' => $r[0]['xlink_updated'] + ); + } + + $channel = channelx_by_hash($r[0]['xlink_xchan']); + if(! $channel) { + logger('no channel'); + return; + } + + + $primary = get_directory_primary(); + + if(! $primary) + return; + + + $interval = ((get_config('system','delivery_interval') !== false) + ? intval(get_config('system','delivery_interval')) : 2 ); + + $deliveries_per_process = intval(get_config('system','delivery_batch_count')); + + if($deliveries_per_process <= 0) + $deliveries_per_process = 1; + + $deliver = array(); + + $x = z_fetch_url($primary . '/regdir'); + if($x['success']) { + $j = json_decode($x['body'],true); + if($j && $j['success'] && is_array($j['directories'])) { + + foreach($j['directories'] as $h) { + if($h == z_root()) + continue; + + $hash = random_string(); + $n = zot_build_packet($channel,'notify',null,null,$hash); + + queue_insert(array( + 'hash' => $hash, + 'account_id' => $channel['channel_account_id'], + 'channel_id' => $channel['channel_id'], + 'posturl' => $h . '/post', + 'notify' => $n, + 'msg' => json_encode($encoded_item) + )); + + $deliver[] = $hash; + + if(count($deliver) >= $deliveries_per_process) { + proc_run('php','include/deliver.php',$deliver); + $deliver = array(); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } + } + + // catch any stragglers + + if(count($deliver)) { + proc_run('php','include/deliver.php',$deliver); + } + } + } + + logger('ratenotif: complete.'); + return; + + } +} diff --git a/Zotlabs/Daemon/Rcho.php b/Zotlabs/Daemon/Rcho.php new file mode 100644 index 000000000..873f0a743 --- /dev/null +++ b/Zotlabs/Daemon/Rcho.php @@ -0,0 +1,13 @@ + Date: Thu, 19 May 2016 20:36:32 -0700 Subject: [PATCH 03/39] daemon master: create some compatibility code --- Zotlabs/Daemon/Deliver.php | 2 +- Zotlabs/Daemon/Directory.php | 4 +- Zotlabs/Daemon/Master.php | 1 + Zotlabs/Daemon/Notifier.php | 5 +- Zotlabs/Daemon/Poller.php | 24 +- Zotlabs/Daemon/Ratenotif.php | 4 +- boot.php | 12 + include/poller.php | 431 +---------------------------------- 8 files changed, 34 insertions(+), 449 deletions(-) diff --git a/Zotlabs/Daemon/Deliver.php b/Zotlabs/Daemon/Deliver.php index 56f0fed78..7a321a1f8 100644 --- a/Zotlabs/Daemon/Deliver.php +++ b/Zotlabs/Daemon/Deliver.php @@ -8,7 +8,7 @@ require_once('include/queue_fn.php'); class Deliver { - static public function function run($argc,$argv) { + static public function run($argc,$argv) { if($argc < 2) return; diff --git a/Zotlabs/Daemon/Directory.php b/Zotlabs/Daemon/Directory.php index 1312f0638..c8cdafdf5 100644 --- a/Zotlabs/Daemon/Directory.php +++ b/Zotlabs/Daemon/Directory.php @@ -51,7 +51,7 @@ class Directory { // Now update all the connections if($pushall) - proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']); + Master::Summon(array('Notifier','refresh_all',$channel['channel_id'])); return; } @@ -94,7 +94,7 @@ class Directory { // Now update all the connections if($pushall) - proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']); + Master::Summon(array('Notifier','refresh_all',$channel['channel_id'])); } } diff --git a/Zotlabs/Daemon/Master.php b/Zotlabs/Daemon/Master.php index 3d21a68e0..a78e7c590 100644 --- a/Zotlabs/Daemon/Master.php +++ b/Zotlabs/Daemon/Master.php @@ -23,6 +23,7 @@ class Master { static public function Release($argc,$argv) { cli_startup(); + logger('Master: release: ' . print_r($argv,true)); require_once('Zotlabs/Daemon/' . $argv[0] . '.php'); $cls = '\\Zotlabs\\Daemon\\' . $argv[0]; $cls::run($argc,$argv); diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index 919f98823..d37182a4d 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -381,7 +381,7 @@ class Notifier { // don't uplink a relayed post to the relay owner if($parent_item['source_xchan'] !== $parent_item['owner_xchan']) { logger('notifier: uplinking this item'); - proc_run('php','include/notifier.php','uplink',$item_id); + Master::Summon(array('Notifier','uplink',$item_id)); } } @@ -641,7 +641,8 @@ class Notifier { if($normal_mode) { $x = q("select * from hook where hook = 'notifier_normal'"); if($x) - proc_run('php','include/deliver_hooks.php', $target_item['id']); + Master::Summon(array('Deliver_hooks',$target_item['id'])); + } if($deliveries) diff --git a/Zotlabs/Daemon/Poller.php b/Zotlabs/Daemon/Poller.php index ab96de7c8..1473b5ec6 100644 --- a/Zotlabs/Daemon/Poller.php +++ b/Zotlabs/Daemon/Poller.php @@ -36,7 +36,7 @@ class Poller { // run queue delivery process in the background - proc_run('php',"include/queue.php"); + Master::Summon(array('Queue')); // maintenance for mod sharedwithme - check for updated items and remove them @@ -76,7 +76,7 @@ class Poller { ); if($r) { foreach($r as $rr) { - proc_run('php','include/directory.php',$rr['channel_id'],'force'); + Master::Summon(array('Directory',$rr['channel_id'],'force')); if($interval) @time_sleep_until(microtime(true) + (float) $interval); } @@ -96,7 +96,7 @@ class Poller { intval($rr['id']) ); if($x) { - proc_run('php','include/notifier.php','wall-new',$rr['id']); + Master::Summon(array('Notifier','wall-new',$rr['id'])); } } } @@ -172,10 +172,10 @@ class Poller { } // Check for dead sites - proc_run('php', 'include/checksites.php'); + Master::Summon(array('Checksites')); // update searchable doc indexes - proc_run('php', 'include/importdoc.php'); + Master::Summon(array('Importdoc')); /** * End Cron Weekly @@ -223,8 +223,8 @@ class Poller { set_config('system','last_expire_day',$d2); - proc_run('php','include/expire.php'); - proc_run('php','include/cli_suggest.php'); + Master::Summon(array('Expire')); + Master::Summon(array('Cli_suggest')); require_once('include/hubloc.php'); remove_obsolete_hublocs(); @@ -261,7 +261,7 @@ class Poller { // pull in some public posts if(! get_config('system','disable_discover_tab')) - proc_run('php','include/externals.php'); + Master::Summon(array('Externals')); $manual_id = 0; @@ -295,7 +295,7 @@ class Poller { // TODO check to see if there are any cronhooks before wasting a process if(! $restart) - proc_run('php','include/cronhooks.php'); + Master::Summon(array('Cronhooks')); // Only poll from those with suitable relationships @@ -333,7 +333,7 @@ class Poller { $min = 60; $x = datetime_convert('UTC','UTC',"now - $min minutes"); if($c < $x) { - proc_run('php','include/onepoll.php',$contact['abook_id']); + Master::Summon(array('Onepoll',$contact['abook_id'])); if($interval) @time_sleep_until(microtime(true) + (float) $interval); } @@ -398,7 +398,7 @@ class Poller { if((! $update) && (! $force)) continue; - proc_run('php','include/onepoll.php',$contact['abook_id']); + Master::Summon(array('Onepoll',$contact['abook_id'])); if($interval) @time_sleep_until(microtime(true) + (float) $interval); @@ -420,7 +420,7 @@ class Poller { if($rr['ud_last'] != NULL_DATE) if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day')) continue; - proc_run('php','include/onedirsync.php',$rr['ud_id']); + Master::Summon(array('Onedirsync',$rr['ud_id'])); if($interval) @time_sleep_until(microtime(true) + (float) $interval); } diff --git a/Zotlabs/Daemon/Ratenotif.php b/Zotlabs/Daemon/Ratenotif.php index fd2200dc9..a404273e2 100644 --- a/Zotlabs/Daemon/Ratenotif.php +++ b/Zotlabs/Daemon/Ratenotif.php @@ -92,7 +92,7 @@ class Ratenotif { $deliver[] = $hash; if(count($deliver) >= $deliveries_per_process) { - proc_run('php','include/deliver.php',$deliver); + Master::Summon(array('Deliver',$deliver)); $deliver = array(); if($interval) @time_sleep_until(microtime(true) + (float) $interval); @@ -102,7 +102,7 @@ class Ratenotif { // catch any stragglers if(count($deliver)) { - proc_run('php','include/deliver.php',$deliver); + Master::Summon(array('Deliver',$deliver)); } } } diff --git a/boot.php b/boot.php index 7fc096fa3..bdce2a03f 100755 --- a/boot.php +++ b/boot.php @@ -1847,6 +1847,18 @@ function proc_run($cmd){ if(count($args) && $args[0] === 'php') $args[0] = ((x(App::$config,'system')) && (x(App::$config['system'],'php_path')) && (strlen(App::$config['system']['php_path'])) ? App::$config['system']['php_path'] : 'php'); + if(strstr($args[1],'include/')) { + $orig = substr(ucfirst(substr($args[1],8)),0,-4); + logger('proc_run_redirect: ' . $orig); + if(file_exists('Zotlabs/Daemon/' . $orig . '.php')) { + array_shift($args); + $args[0] = $orig; + logger('Redirecting old proc_run interface: ' . print_r($args,true)); + \Zotlabs\Daemon\Master::Summon($args); + return; + } + } + for($x = 0; $x < count($args); $x++) $args[$x] = escapeshellarg($args[$x]); diff --git a/include/poller.php b/include/poller.php index 1a5b8508c..0946d0ece 100644 --- a/include/poller.php +++ b/include/poller.php @@ -1,442 +1,13 @@ $maxsysload) { - logger('system: load ' . $load . ' too high. Poller deferred to next scheduled run.'); - return; - } - } - - $interval = intval(get_config('system','poll_interval')); - if(! $interval) - $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval'))); - - // Check for a lockfile. If it exists, but is over an hour old, it's stale. Ignore it. - $lockfile = 'store/[data]/poller'; - if((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 3600)) - && (! get_config('system','override_poll_lockfile'))) { - logger("poller: Already running"); - return; - } - - // Create a lockfile. Needs two vars, but $x doesn't need to contain anything. - file_put_contents($lockfile, $x); - - logger('poller: start'); - - // run queue delivery process in the background - - proc_run('php',"include/queue.php"); - - - // maintenance for mod sharedwithme - check for updated items and remove them - - require_once('include/sharedwithme.php'); - apply_updates(); - - - // expire any expired mail - - q("delete from mail where expires != '%s' and expires < %s ", - dbesc(NULL_DATE), - db_utcnow() - ); - - // expire any expired items - - $r = q("select id from item where expires != '%s' and expires < %s - and item_deleted = 0 ", - dbesc(NULL_DATE), - db_utcnow() - ); - if($r) { - require_once('include/items.php'); - foreach($r as $rr) - drop_item($rr['id'],false); - } - - - // Ensure that every channel pings a directory server once a month. This way we can discover - // channels and sites that quietly vanished and prevent the directory from accumulating stale - // or dead entries. - - $r = q("select channel_id from channel where channel_dirdate < %s - INTERVAL %s", - db_utcnow(), - db_quoteinterval('30 DAY') - ); - if($r) { - foreach($r as $rr) { - proc_run('php','include/directory.php',$rr['channel_id'],'force'); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - } - } - - // publish any applicable items that were set to be published in the future - // (time travel posts). Restrict to items that have come of age in the last - // couple of days to limit the query to something reasonable. - - $r = q("select id from item where item_delayed = 1 and created <= %s and created > '%s' ", - db_utcnow(), - dbesc(datetime_convert('UTC','UTC','now - 2 days')) - ); - if($r) { - foreach($r as $rr) { - $x = q("update item set item_delayed = 0 where id = %d", - intval($rr['id']) - ); - if($x) { - proc_run('php','include/notifier.php','wall-new',$rr['id']); - } - } - } - - $abandon_days = intval(get_config('system','account_abandon_days')); - if($abandon_days < 1) - $abandon_days = 0; - - - // once daily run birthday_updates and then expire in background - - // FIXME: add birthday updates, both locally and for xprof for use - // by directory servers - - $d1 = intval(get_config('system','last_expire_day')); - $d2 = intval(datetime_convert('UTC','UTC','now','d')); - - // Allow somebody to staggger daily activities if they have more than one site on their server, - // or if it happens at an inconvenient (busy) hour. - - $h1 = intval(get_config('system','cron_hour')); - $h2 = intval(datetime_convert('UTC','UTC','now','G')); - - $dirmode = get_config('system','directory_mode'); - - /** - * Cron Daily - * - * Actions in the following block are executed once per day, not on every poller run - * - */ - - if(($d2 != $d1) && ($h1 == $h2)) { - - require_once('include/dir_fns.php'); - check_upstream_directory(); - - call_hooks('cron_daily',datetime_convert()); - - - $d3 = intval(datetime_convert('UTC','UTC','now','N')); - if($d3 == 7) { - - /** - * Cron Weekly - * - * Actions in the following block are executed once per day only on Sunday (once per week). - * - */ - - - call_hooks('cron_weekly',datetime_convert()); - - - z_check_cert(); - - require_once('include/hubloc.php'); - prune_hub_reinstalls(); - - require_once('include/Contact.php'); - mark_orphan_hubsxchans(); - - - // get rid of really old poco records - - q("delete from xlink where xlink_updated < %s - INTERVAL %s and xlink_static = 0 ", - db_utcnow(), db_quoteinterval('14 DAY') - ); - - $dirmode = intval(get_config('system','directory_mode')); - if($dirmode === DIRECTORY_MODE_SECONDARY || $dirmode === DIRECTORY_MODE_PRIMARY) { - logger('regdir: ' . print_r(z_fetch_url(get_directory_primary() . '/regdir?f=&url=' . urlencode(z_root()) . '&realm=' . urlencode(get_directory_realm())),true)); - } - - // Check for dead sites - proc_run('php', 'include/checksites.php'); - - // update searchable doc indexes - proc_run('php', 'include/importdoc.php'); - - /** - * End Cron Weekly - */ - } - - update_birthdays(); - - //update statistics in config - require_once('include/statistics_fns.php'); - update_channels_total_stat(); - update_channels_active_halfyear_stat(); - update_channels_active_monthly_stat(); - update_local_posts_stat(); - - // expire any read notifications over a month old - - q("delete from notify where seen = 1 and date < %s - INTERVAL %s", - db_utcnow(), db_quoteinterval('30 DAY') - ); - - // expire old delivery reports - - $keep_reports = intval(get_config('system','expire_delivery_reports')); - if($keep_reports === 0) - $keep_reports = 10; - - q("delete from dreport where dreport_time < %s - INTERVAL %s", - db_utcnow(), - db_quoteinterval($keep_reports . ' DAY') - ); - - // expire any expired accounts - downgrade_accounts(); - - // If this is a directory server, request a sync with an upstream - // directory at least once a day, up to once every poll interval. - // Pull remote changes and push local changes. - // potential issue: how do we keep from creating an endless update loop? - - if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) { - require_once('include/dir_fns.php'); - sync_directories($dirmode); - } - - set_config('system','last_expire_day',$d2); - - proc_run('php','include/expire.php'); - proc_run('php','include/cli_suggest.php'); - - require_once('include/hubloc.php'); - remove_obsolete_hublocs(); - - /** - * End Cron Daily - */ - } - - // update any photos which didn't get imported properly - // This should be rare - - $r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = '' - and xchan_photo_date < %s - INTERVAL %s", - db_utcnow(), - db_quoteinterval('1 DAY') - ); - if($r) { - require_once('include/photo/photo_driver.php'); - foreach($r as $rr) { - $photos = import_xchan_photo($rr['xchan_photo_l'],$rr['xchan_hash']); - $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' - where xchan_hash = '%s'", - dbesc($photos[0]), - dbesc($photos[1]), - dbesc($photos[2]), - dbesc($photos[3]), - dbesc($rr['xchan_hash']) - ); - } - } - - - // pull in some public posts - - if(! get_config('system','disable_discover_tab')) - proc_run('php','include/externals.php'); - - - $manual_id = 0; - $generation = 0; - - $force = false; - $restart = false; - - if(($argc > 1) && ($argv[1] == 'force')) - $force = true; - - if(($argc > 1) && ($argv[1] == 'restart')) { - $restart = true; - $generation = intval($argv[2]); - if(! $generation) - killme(); - } - - if(($argc > 1) && intval($argv[1])) { - $manual_id = intval($argv[1]); - $force = true; - } - - - $sql_extra = (($manual_id) ? " AND abook_id = " . intval($manual_id) . " " : ""); - - reload_plugins(); - - $d = datetime_convert(); - - // TODO check to see if there are any cronhooks before wasting a process - - if(! $restart) - proc_run('php','include/cronhooks.php'); - - // Only poll from those with suitable relationships - - $abandon_sql = (($abandon_days) - ? sprintf(" AND account_lastlog > %s - INTERVAL %s ", db_utcnow(), db_quoteinterval(intval($abandon_days).' DAY')) - : '' - ); - - $randfunc = db_getfunc('RAND'); - - $contacts = q("SELECT * FROM abook LEFT JOIN xchan on abook_xchan = xchan_hash - LEFT JOIN account on abook_account = account_id - where abook_self = 0 - $sql_extra - AND (( account_flags = %d ) OR ( account_flags = %d )) $abandon_sql ORDER BY $randfunc", - intval(ACCOUNT_OK), - intval(ACCOUNT_UNVERIFIED) // FIXME - - ); - - if($contacts) { - - foreach($contacts as $contact) { - - $update = false; - - $t = $contact['abook_updated']; - $c = $contact['abook_connected']; - - if(intval($contact['abook_feed'])) { - $min = service_class_fetch($contact['abook_channel'],'minimum_feedcheck_minutes'); - if(! $min) - $min = intval(get_config('system','minimum_feedcheck_minutes')); - if(! $min) - $min = 60; - $x = datetime_convert('UTC','UTC',"now - $min minutes"); - if($c < $x) { - proc_run('php','include/onepoll.php',$contact['abook_id']); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - } - continue; - } - - - if($contact['xchan_network'] !== 'zot') - continue; - - if($c == $t) { - if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) - $update = true; - } - else { - - // if we've never connected with them, start the mark for death countdown from now - - if($c == NULL_DATE) { - $r = q("update abook set abook_connected = '%s' where abook_id = %d", - dbesc(datetime_convert()), - intval($contact['abook_id']) - ); - $c = datetime_convert(); - $update = true; - } - - // He's dead, Jim - - if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 30 day")) > 0) { - $r = q("update abook set abook_archived = 1 where abook_id = %d", - intval($contact['abook_id']) - ); - $update = false; - continue; - } - - if(intval($contact['abook_archived'])) { - $update = false; - continue; - } - - // might be dead, so maybe don't poll quite so often - - // recently deceased, so keep up the regular schedule for 3 days - - if((strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 3 day")) > 0) - && (strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 1 day")) > 0)) - $update = true; - - // After that back off and put them on a morphine drip - - if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 2 day")) > 0) { - $update = true; - } - - } - - if(intval($contact['abook_pending']) || intval($contact['abook_archived']) || intval($contact['abook_ignored']) || intval($contact['abook_blocked'])) - continue; - - if((! $update) && (! $force)) - continue; - - proc_run('php','include/onepoll.php',$contact['abook_id']); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - - } - } - - if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) { - $r = q("SELECT u.ud_addr, u.ud_id, u.ud_last FROM updates AS u INNER JOIN (SELECT ud_addr, max(ud_id) AS ud_id FROM updates WHERE ( ud_flags & %d ) = 0 AND ud_addr != '' AND ( ud_last = '%s' OR ud_last > %s - INTERVAL %s ) GROUP BY ud_addr) AS s ON s.ud_id = u.ud_id ", - intval(UPDATE_FLAGS_UPDATED), - dbesc(NULL_DATE), - db_utcnow(), db_quoteinterval('7 DAY') - ); - if($r) { - foreach($r as $rr) { - - // If they didn't respond when we attempted before, back off to once a day - // After 7 days we won't bother anymore - - if($rr['ud_last'] != NULL_DATE) - if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day')) - continue; - proc_run('php','include/onedirsync.php',$rr['ud_id']); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - } - } - } - - set_config('system','lastpoll',datetime_convert()); - - //All done - clear the lockfile - @unlink($lockfile); - - return; } if (array_search(__file__,get_included_files())===0){ From 853322e7d2734ad459a4e5740f3f1806ed55532e Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 20:48:40 -0700 Subject: [PATCH 04/39] don't try to deliver empty hashes --- Zotlabs/Daemon/Deliver.php | 3 +++ include/network.php | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Zotlabs/Daemon/Deliver.php b/Zotlabs/Daemon/Deliver.php index 7a321a1f8..dbc311cf5 100644 --- a/Zotlabs/Daemon/Deliver.php +++ b/Zotlabs/Daemon/Deliver.php @@ -17,6 +17,9 @@ class Deliver { for($x = 1; $x < $argc; $x ++) { + if(! $argv[$x]) + continue; + $dresult = null; $r = q("select * from outq where outq_hash = '%s' limit 1", dbesc($argv[$x]) diff --git a/include/network.php b/include/network.php index f80244f8f..a2e655d92 100644 --- a/include/network.php +++ b/include/network.php @@ -1916,6 +1916,9 @@ function do_delivery($deliveries) { $deliver = array(); foreach($deliveries as $d) { + if(! $d) + continue; + $deliver[] = $d; if(count($deliver) >= $deliveries_per_process) { From 39bc0664a773a97ccce276161739f217e3ba7449 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 21:22:04 -0700 Subject: [PATCH 05/39] Separate cron into periodic components and use that as the main interface for scheduled tasks instead of the quaint 'poller'. --- Zotlabs/Daemon/Cron.php | 181 ++++++++++++++++++++++++++ Zotlabs/Daemon/Cron_daily.php | 90 +++++++++++++ Zotlabs/Daemon/Cron_weekly.php | 50 +++++++ Zotlabs/Daemon/Poller.php | 230 --------------------------------- include/poller.php | 3 +- 5 files changed, 322 insertions(+), 232 deletions(-) create mode 100644 Zotlabs/Daemon/Cron.php create mode 100644 Zotlabs/Daemon/Cron_daily.php create mode 100644 Zotlabs/Daemon/Cron_weekly.php diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php new file mode 100644 index 000000000..63078edd7 --- /dev/null +++ b/Zotlabs/Daemon/Cron.php @@ -0,0 +1,181 @@ + $maxsysload) { + logger('system: load ' . $load . ' too high. Cron deferred to next scheduled run.'); + return; + } + } + + // Check for a lockfile. If it exists, but is over an hour old, it's stale. Ignore it. + $lockfile = 'store/[data]/cron'; + if((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 3600)) + && (! get_config('system','override_cron_lockfile'))) { + logger("cron: Already running"); + return; + } + + // Create a lockfile. Needs two vars, but $x doesn't need to contain anything. + file_put_contents($lockfile, $x); + + logger('cron: start'); + + // run queue delivery process in the background + + Master::Summon(array('Queue')); + + Master::Summon(array('Poller')); + + // maintenance for mod sharedwithme - check for updated items and remove them + + require_once('include/sharedwithme.php'); + apply_updates(); + + + // expire any expired mail + + q("delete from mail where expires != '%s' and expires < %s ", + dbesc(NULL_DATE), + db_utcnow() + ); + + // expire any expired items + + $r = q("select id from item where expires != '%s' and expires < %s + and item_deleted = 0 ", + dbesc(NULL_DATE), + db_utcnow() + ); + if($r) { + require_once('include/items.php'); + foreach($r as $rr) + drop_item($rr['id'],false); + } + + + // Ensure that every channel pings a directory server once a month. This way we can discover + // channels and sites that quietly vanished and prevent the directory from accumulating stale + // or dead entries. + + $r = q("select channel_id from channel where channel_dirdate < %s - INTERVAL %s", + db_utcnow(), + db_quoteinterval('30 DAY') + ); + if($r) { + foreach($r as $rr) { + Master::Summon(array('Directory',$rr['channel_id'],'force')); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } + } + + // publish any applicable items that were set to be published in the future + // (time travel posts). Restrict to items that have come of age in the last + // couple of days to limit the query to something reasonable. + + $r = q("select id from item where item_delayed = 1 and created <= %s and created > '%s' ", + db_utcnow(), + dbesc(datetime_convert('UTC','UTC','now - 2 days')) + ); + if($r) { + foreach($r as $rr) { + $x = q("update item set item_delayed = 0 where id = %d", + intval($rr['id']) + ); + if($x) { + Master::Summon(array('Notifier','wall-new',$rr['id'])); + } + } + } + + $abandon_days = intval(get_config('system','account_abandon_days')); + if($abandon_days < 1) + $abandon_days = 0; + + + // once daily run birthday_updates and then expire in background + + // FIXME: add birthday updates, both locally and for xprof for use + // by directory servers + + $d1 = intval(get_config('system','last_expire_day')); + $d2 = intval(datetime_convert('UTC','UTC','now','d')); + + // Allow somebody to staggger daily activities if they have more than one site on their server, + // or if it happens at an inconvenient (busy) hour. + + $h1 = intval(get_config('system','cron_hour')); + $h2 = intval(datetime_convert('UTC','UTC','now','G')); + + + if(($d2 != $d1) && ($h1 == $h2)) { + Master::Summon('Cron_daily'); + } + + // update any photos which didn't get imported properly + // This should be rare + + $r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = '' + and xchan_photo_date < %s - INTERVAL %s", + db_utcnow(), + db_quoteinterval('1 DAY') + ); + if($r) { + require_once('include/photo/photo_driver.php'); + foreach($r as $rr) { + $photos = import_xchan_photo($rr['xchan_photo_l'],$rr['xchan_hash']); + $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' + where xchan_hash = '%s'", + dbesc($photos[0]), + dbesc($photos[1]), + dbesc($photos[2]), + dbesc($photos[3]), + dbesc($rr['xchan_hash']) + ); + } + } + + + // pull in some public posts + + if(! get_config('system','disable_discover_tab')) + Master::Summon(array('Externals')); + + $generation = 0; + + $restart = false; + + if(($argc > 1) && ($argv[1] == 'restart')) { + $restart = true; + $generation = intval($argv[2]); + if(! $generation) + killme(); + } + + reload_plugins(); + + $d = datetime_convert(); + + // TODO check to see if there are any cronhooks before wasting a process + + if(! $restart) + Master::Summon(array('Cronhooks')); + + set_config('system','lastcron',datetime_convert()); + + //All done - clear the lockfile + @unlink($lockfile); + + return; + } +} diff --git a/Zotlabs/Daemon/Cron_daily.php b/Zotlabs/Daemon/Cron_daily.php new file mode 100644 index 000000000..fe667a139 --- /dev/null +++ b/Zotlabs/Daemon/Cron_daily.php @@ -0,0 +1,90 @@ + '%s' ", - db_utcnow(), - dbesc(datetime_convert('UTC','UTC','now - 2 days')) - ); - if($r) { - foreach($r as $rr) { - $x = q("update item set item_delayed = 0 where id = %d", - intval($rr['id']) - ); - if($x) { - Master::Summon(array('Notifier','wall-new',$rr['id'])); - } - } - } - - $abandon_days = intval(get_config('system','account_abandon_days')); - if($abandon_days < 1) - $abandon_days = 0; - - - // once daily run birthday_updates and then expire in background - - // FIXME: add birthday updates, both locally and for xprof for use - // by directory servers - - $d1 = intval(get_config('system','last_expire_day')); - $d2 = intval(datetime_convert('UTC','UTC','now','d')); - - // Allow somebody to staggger daily activities if they have more than one site on their server, - // or if it happens at an inconvenient (busy) hour. - - $h1 = intval(get_config('system','cron_hour')); - $h2 = intval(datetime_convert('UTC','UTC','now','G')); - - $dirmode = get_config('system','directory_mode'); - - /** - * Cron Daily - * - * Actions in the following block are executed once per day, not on every poller run - * - */ - - if(($d2 != $d1) && ($h1 == $h2)) { - - require_once('include/dir_fns.php'); - check_upstream_directory(); - - call_hooks('cron_daily',datetime_convert()); - - - $d3 = intval(datetime_convert('UTC','UTC','now','N')); - if($d3 == 7) { - - /** - * Cron Weekly - * - * Actions in the following block are executed once per day only on Sunday (once per week). - * - */ - - - call_hooks('cron_weekly',datetime_convert()); - - - z_check_cert(); - - require_once('include/hubloc.php'); - prune_hub_reinstalls(); - - require_once('include/Contact.php'); - mark_orphan_hubsxchans(); - - - // get rid of really old poco records - - q("delete from xlink where xlink_updated < %s - INTERVAL %s and xlink_static = 0 ", - db_utcnow(), db_quoteinterval('14 DAY') - ); - - $dirmode = intval(get_config('system','directory_mode')); - if($dirmode === DIRECTORY_MODE_SECONDARY || $dirmode === DIRECTORY_MODE_PRIMARY) { - logger('regdir: ' . print_r(z_fetch_url(get_directory_primary() . '/regdir?f=&url=' . urlencode(z_root()) . '&realm=' . urlencode(get_directory_realm())),true)); - } - - // Check for dead sites - Master::Summon(array('Checksites')); - - // update searchable doc indexes - Master::Summon(array('Importdoc')); - - /** - * End Cron Weekly - */ - } - - update_birthdays(); - - //update statistics in config - require_once('include/statistics_fns.php'); - update_channels_total_stat(); - update_channels_active_halfyear_stat(); - update_channels_active_monthly_stat(); - update_local_posts_stat(); - - // expire any read notifications over a month old - - q("delete from notify where seen = 1 and date < %s - INTERVAL %s", - db_utcnow(), db_quoteinterval('30 DAY') - ); - - // expire old delivery reports - - $keep_reports = intval(get_config('system','expire_delivery_reports')); - if($keep_reports === 0) - $keep_reports = 10; - - q("delete from dreport where dreport_time < %s - INTERVAL %s", - db_utcnow(), - db_quoteinterval($keep_reports . ' DAY') - ); - - // expire any expired accounts - downgrade_accounts(); - - // If this is a directory server, request a sync with an upstream - // directory at least once a day, up to once every poll interval. - // Pull remote changes and push local changes. - // potential issue: how do we keep from creating an endless update loop? - - if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) { - require_once('include/dir_fns.php'); - sync_directories($dirmode); - } - - set_config('system','last_expire_day',$d2); - - Master::Summon(array('Expire')); - Master::Summon(array('Cli_suggest')); - - require_once('include/hubloc.php'); - remove_obsolete_hublocs(); - - /** - * End Cron Daily - */ - } - - // update any photos which didn't get imported properly - // This should be rare - - $r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = '' - and xchan_photo_date < %s - INTERVAL %s", - db_utcnow(), - db_quoteinterval('1 DAY') - ); - if($r) { - require_once('include/photo/photo_driver.php'); - foreach($r as $rr) { - $photos = import_xchan_photo($rr['xchan_photo_l'],$rr['xchan_hash']); - $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' - where xchan_hash = '%s'", - dbesc($photos[0]), - dbesc($photos[1]), - dbesc($photos[2]), - dbesc($photos[3]), - dbesc($rr['xchan_hash']) - ); - } - } - - - // pull in some public posts - - if(! get_config('system','disable_discover_tab')) - Master::Summon(array('Externals')); - - $manual_id = 0; $generation = 0; diff --git a/include/poller.php b/include/poller.php index 0946d0ece..67a67de12 100644 --- a/include/poller.php +++ b/include/poller.php @@ -5,8 +5,7 @@ require_once('include/cli_startup.php'); function poller_run($argc,$argv){ cli_startup(); - - \Zotlabs\Daemon\Master::Summon('Poller'); + \Zotlabs\Daemon\Master::Summon('Cron'); } From 014168a29bfbba69c2ba887af97e5fb290fa21c5 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 21:32:19 -0700 Subject: [PATCH 06/39] cleanup of daemon infrastructure --- Zotlabs/Daemon/Master.php | 2 +- boot.php | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Zotlabs/Daemon/Master.php b/Zotlabs/Daemon/Master.php index a78e7c590..56076f612 100644 --- a/Zotlabs/Daemon/Master.php +++ b/Zotlabs/Daemon/Master.php @@ -23,7 +23,7 @@ class Master { static public function Release($argc,$argv) { cli_startup(); - logger('Master: release: ' . print_r($argv,true)); + logger('Master: release: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG); require_once('Zotlabs/Daemon/' . $argv[0] . '.php'); $cls = '\\Zotlabs\\Daemon\\' . $argv[0]; $cls::run($argc,$argv); diff --git a/boot.php b/boot.php index bdce2a03f..ca3673361 100755 --- a/boot.php +++ b/boot.php @@ -1847,14 +1847,19 @@ function proc_run($cmd){ if(count($args) && $args[0] === 'php') $args[0] = ((x(App::$config,'system')) && (x(App::$config['system'],'php_path')) && (strlen(App::$config['system']['php_path'])) ? App::$config['system']['php_path'] : 'php'); + + // redirect proc_run statements of legacy daemon processes to the new Daemon Master object class + // We will keep this interface until everybody has transitioned. + if(strstr($args[1],'include/')) { + // convert 'include/foo.php' to 'Foo' $orig = substr(ucfirst(substr($args[1],8)),0,-4); logger('proc_run_redirect: ' . $orig); if(file_exists('Zotlabs/Daemon/' . $orig . '.php')) { - array_shift($args); - $args[0] = $orig; - logger('Redirecting old proc_run interface: ' . print_r($args,true)); - \Zotlabs\Daemon\Master::Summon($args); + array_shift($args); // daemons are all run by php, pop it off the top of the array + $args[0] = $orig; // replace with the new daemon name + logger('Redirecting old proc_run interface: ' . print_r($args,true), LOGGER_DEBUG, LOG_DEBUG); + \Zotlabs\Daemon\Master::Summon($args); // summon the daemon return; } } From a2cec8899ad191b47d116f4ea124be6bd5b05472 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 22:26:37 -0700 Subject: [PATCH 07/39] daemon conversion continued... --- Zotlabs/Daemon/Cron.php | 2 +- Zotlabs/Daemon/Cron_daily.php | 2 +- Zotlabs/Module/Admin.php | 4 +- Zotlabs/Module/Connect.php | 3 +- Zotlabs/Module/Connedit.php | 10 +- Zotlabs/Module/Events.php | 2 +- Zotlabs/Module/Follow.php | 5 +- Zotlabs/Module/Fsuggest.php | 2 +- Zotlabs/Module/Import.php | 4 +- Zotlabs/Module/Item.php | 4 +- Zotlabs/Module/Like.php | 4 +- Zotlabs/Module/Locs.php | 6 +- Zotlabs/Module/Mail.php | 2 +- Zotlabs/Module/Mood.php | 2 +- Zotlabs/Module/Prate.php | 2 +- Zotlabs/Module/Profile_photo.php | 4 +- Zotlabs/Module/Profiles.php | 2 +- Zotlabs/Module/Rate.php | 6 +- Zotlabs/Module/Settings.php | 2 +- Zotlabs/Module/Tagger.php | 2 +- boot.php | 2 +- include/Contact.php | 5 +- include/activities.php | 2 +- include/attach.php | 4 +- include/checksites.php | 62 --- include/cli_suggest.php | 19 - include/cronhooks.php | 23 -- include/deliver.php | 87 ---- include/deliver_hooks.php | 29 -- include/directory.php | 113 ------ include/expire.php | 98 ----- include/externals.php | 103 ----- include/follow.php | 2 +- include/gprobe.php | 41 -- include/hubloc.php | 2 +- include/identity.php | 4 +- include/import.php | 6 +- include/importdoc.php | 41 -- include/items.php | 12 +- include/message.php | 2 +- include/network.php | 4 +- include/notifier.php | 664 ------------------------------- include/onedirsync.php | 82 ---- include/onepoll.php | 159 -------- include/photos.php | 2 +- include/poller.php | 2 +- include/queue.php | 95 ----- include/ratenotif.php | 119 ------ include/zot.php | 16 +- 49 files changed, 66 insertions(+), 1804 deletions(-) delete mode 100644 include/checksites.php delete mode 100644 include/cli_suggest.php delete mode 100644 include/cronhooks.php delete mode 100644 include/deliver.php delete mode 100644 include/deliver_hooks.php delete mode 100644 include/directory.php delete mode 100644 include/expire.php delete mode 100644 include/externals.php delete mode 100644 include/gprobe.php delete mode 100755 include/importdoc.php delete mode 100644 include/notifier.php delete mode 100644 include/onedirsync.php delete mode 100644 include/onepoll.php delete mode 100644 include/queue.php delete mode 100644 include/ratenotif.php diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php index 63078edd7..f23cb14dc 100644 --- a/Zotlabs/Daemon/Cron.php +++ b/Zotlabs/Daemon/Cron.php @@ -119,7 +119,7 @@ class Cron { if(($d2 != $d1) && ($h1 == $h2)) { - Master::Summon('Cron_daily'); + Master::Summon(array('Cron_daily')); } // update any photos which didn't get imported properly diff --git a/Zotlabs/Daemon/Cron_daily.php b/Zotlabs/Daemon/Cron_daily.php index fe667a139..fbc255d2f 100644 --- a/Zotlabs/Daemon/Cron_daily.php +++ b/Zotlabs/Daemon/Cron_daily.php @@ -22,7 +22,7 @@ class Cron_daily { $d3 = intval(datetime_convert('UTC','UTC','now','N')); if($d3 == 7) { - Master::Summon('Cron_weekly'); + Master::Summon(array('Cron_weekly')); } // once daily run birthday_updates and then expire in background diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php index 4d052cdf8..0a167b273 100644 --- a/Zotlabs/Module/Admin.php +++ b/Zotlabs/Module/Admin.php @@ -1082,7 +1082,7 @@ class Admin extends \Zotlabs\Web\Controller { intval(PAGE_CENSORED), intval( $uid ) ); - proc_run('php','include/directory.php',$uid,'nopush'); + \Zotlabs\Daemon\Master::Summon(array('Directory',$uid,'nopush')); } notice( sprintf( tt("%s channel censored/uncensored", "%s channels censored/uncensored", count($channels)), count($channels)) ); } @@ -1141,7 +1141,7 @@ class Admin extends \Zotlabs\Web\Controller { intval($pflags), intval( $uid ) ); - proc_run('php','include/directory.php',$uid,'nopush'); + \Zotlabs\Daemon\Master::Summon(array('Directory',$uid,'nopush')); notice( sprintf( (($pflags & PAGE_CENSORED) ? t("Channel '%s' censored"): t("Channel '%s' uncensored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL); }; break; diff --git a/Zotlabs/Module/Connect.php b/Zotlabs/Module/Connect.php index 6ef3577d7..382abf370 100644 --- a/Zotlabs/Module/Connect.php +++ b/Zotlabs/Module/Connect.php @@ -47,7 +47,8 @@ class Connect extends \Zotlabs\Web\Controller { intval(PAGE_PREMIUM), intval(local_channel()) ); - proc_run('php','include/notifier.php','refresh_all',\App::$data['channel']['channel_id']); + + \Zotlabs\Daemon\Master::Summon(array('Notifier','refresh_all',\App::$data['channel']['channel_id'])); } set_pconfig(\App::$data['channel']['channel_id'],'system','selltext',$text); // reload the page completely to get fresh data diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php index a1268510d..0820c76bf 100644 --- a/Zotlabs/Module/Connedit.php +++ b/Zotlabs/Module/Connedit.php @@ -176,7 +176,7 @@ class Connedit extends \Zotlabs\Web\Controller { $record = $z[0]['xlink_id']; } if($record) { - proc_run('php','include/ratenotif.php','rating',$record); + \Zotlabs\Daemon\Master::Summon(array('Ratenotif','rating',$record)); } } @@ -230,7 +230,7 @@ class Connedit extends \Zotlabs\Web\Controller { if(\App::$poi && \App::$poi['abook_my_perms'] != $abook_my_perms && (! intval(\App::$poi['abook_self']))) { - proc_run('php', 'include/notifier.php', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id); + \Zotlabs\Daemon\Master(array('Notifier', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id)); } if($new_friend) { @@ -283,7 +283,7 @@ class Connedit extends \Zotlabs\Web\Controller { // pull in a bit of content if there is any to pull in - proc_run('php','include/onepoll.php',$contact_id); + \Zotlabs\Daemon\Master::Summon(array('Onepoll',$contact_id)); } @@ -414,7 +414,7 @@ class Connedit extends \Zotlabs\Web\Controller { if($cmd === 'update') { // pull feed and consume it, which should subscribe to the hub. - proc_run('php',"include/poller.php","$contact_id"); + \Zotlabs\Daemon\Master::Summon(array('Poller',$contact_id)); goaway(z_root() . '/connedit/' . $contact_id); } @@ -427,7 +427,7 @@ class Connedit extends \Zotlabs\Web\Controller { else { // if you are on a different network we'll force a refresh of the connection basic info - proc_run('php','include/notifier.php','permission_update',$contact_id); + Zotlabs\Daemon\Master::Summon(array('Notifier','permission_update',$contact_id)); } goaway(z_root() . '/connedit/' . $contact_id); } diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php index 9519ca11b..3440e0727 100644 --- a/Zotlabs/Module/Events.php +++ b/Zotlabs/Module/Events.php @@ -232,7 +232,7 @@ class Events extends \Zotlabs\Web\Controller { } if($share) - proc_run('php',"include/notifier.php","event","$item_id"); + \Zotlabs\Daemon\Master(array('Notifier','event',$item_id)); } diff --git a/Zotlabs/Module/Follow.php b/Zotlabs/Module/Follow.php index 1701328bf..1df382a89 100644 --- a/Zotlabs/Module/Follow.php +++ b/Zotlabs/Module/Follow.php @@ -53,14 +53,13 @@ class Follow extends \Zotlabs\Web\Controller { // If we can view their stream, pull in some posts if(($result['abook']['abook_their_perms'] & PERMS_R_STREAM) || ($result['abook']['xchan_network'] === 'rss')) - proc_run('php','include/onepoll.php',$result['abook']['abook_id']); + \Zotlabs\Daemon\Master::Summon(array('Onepoll',$result['abook']['abook_id'])); goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?f=&follow=1'); } - function get() { - + function get() { if(! local_channel()) { return login(); } diff --git a/Zotlabs/Module/Fsuggest.php b/Zotlabs/Module/Fsuggest.php index 143fd34e1..a371f9d21 100644 --- a/Zotlabs/Module/Fsuggest.php +++ b/Zotlabs/Module/Fsuggest.php @@ -61,7 +61,7 @@ class Fsuggest extends \Zotlabs\Web\Controller { intval($fsuggest_id), intval(local_channel()) ); - proc_run('php', 'include/notifier.php', 'suggest' , $fsuggest_id); + \Zotlabs\Daemon\Master::Summon(array('Notifier', 'suggest' , $fsuggest_id)); } info( t('Friend suggestion sent.') . EOL); diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php index dadbf8ff1..4e99155fb 100644 --- a/Zotlabs/Module/Import.php +++ b/Zotlabs/Module/Import.php @@ -496,11 +496,11 @@ class Import extends \Zotlabs\Web\Controller { // send out refresh requests // notify old server that it may no longer be primary. - proc_run('php','include/notifier.php','location',$channel['channel_id']); + \Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id'])); // This will indirectly perform a refresh_all *and* update the directory - proc_run('php', 'include/directory.php', $channel['channel_id']); + \Zotlabs\Daemon\Master::Summon(array('Directory', $channel['channel_id'])); notice( t('Import completed.') . EOL); diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php index 93570fdec..ff8510ade 100644 --- a/Zotlabs/Module/Item.php +++ b/Zotlabs/Module/Item.php @@ -901,7 +901,7 @@ class Item extends \Zotlabs\Web\Controller { } } if(! $nopush) - proc_run('php', "include/notifier.php", 'edit_post', $post_id); + \Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_post', $post_id)); if((x($_REQUEST,'return')) && strlen($return_path)) { logger('return: ' . $return_path); @@ -1008,7 +1008,7 @@ class Item extends \Zotlabs\Web\Controller { call_hooks('post_local_end', $datarray); if(! $nopush) - proc_run('php', 'include/notifier.php', $notify_type, $post_id); + \Zotlabs\Daemon\Master::Summon(array('Notifier', $notify_type, $post_id)); logger('post_complete'); diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php index ac8791950..3ef67ddcc 100644 --- a/Zotlabs/Module/Like.php +++ b/Zotlabs/Module/Like.php @@ -346,7 +346,7 @@ class Like extends \Zotlabs\Web\Controller { // drop_item was not done interactively, so we need to invoke the notifier // in order to push the changes to connections - proc_run('php','include/notifier.php','drop',$rr['id']); + \Zotlabs\Daemon\Master::Summon(array('Notifier','drop',$rr['id'])); } @@ -531,7 +531,7 @@ class Like extends \Zotlabs\Web\Controller { } - proc_run('php',"include/notifier.php","like","$post_id"); + \Zotlabs\Daemon\Master::Summon(array('Notifier','like',$post_id)); if($interactive) { notice( t('Action completed.') . EOL); diff --git a/Zotlabs/Module/Locs.php b/Zotlabs/Module/Locs.php index 4b5d58df5..4b1e3ffe2 100644 --- a/Zotlabs/Module/Locs.php +++ b/Zotlabs/Module/Locs.php @@ -34,7 +34,7 @@ class Locs extends \Zotlabs\Web\Controller { dbesc($channel['channel_hash']) ); - proc_run('php','include/notifier.php','location',$channel['channel_id']); + \Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id'])); return; } } @@ -72,7 +72,7 @@ class Locs extends \Zotlabs\Web\Controller { intval($hubloc_id), dbesc($channel['channel_hash']) ); - proc_run('php','include/notifier.php','location',$channel['channel_id']); + \Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id'])); return; } } @@ -91,7 +91,7 @@ class Locs extends \Zotlabs\Web\Controller { $channel = \App::get_channel(); if($_REQUEST['sync']) { - proc_run('php','include/notifier.php','location',$channel['channel_id']); + \Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id'])); info( t('Syncing locations') . EOL); goaway(z_root() . '/locs'); } diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php index 35cb3b9bf..e6487d681 100644 --- a/Zotlabs/Module/Mail.php +++ b/Zotlabs/Module/Mail.php @@ -173,7 +173,7 @@ class Mail extends \Zotlabs\Web\Controller { build_sync_packet(local_channel(),array('mail' => encode_mail($x[0],true))); } - proc_run('php','include/notifier.php','mail',intval(argv(3))); + \Zotlabs\Daemon\Master::Summon(array('Notifier','mail',intval(argv(3)))); if($r) { info( t('Message recalled.') . EOL ); diff --git a/Zotlabs/Module/Mood.php b/Zotlabs/Module/Mood.php index b1007fd06..d1bd44526 100644 --- a/Zotlabs/Module/Mood.php +++ b/Zotlabs/Module/Mood.php @@ -97,7 +97,7 @@ class Mood extends \Zotlabs\Web\Controller { $item_id = $post['item_id']; if($item_id) { - proc_run('php',"include/notifier.php","activity", $item_id); + \Zotlabs\Daemon\Master::Summon(array('Notifier','activity', $item_id)); } call_hooks('post_local_end', $arr); diff --git a/Zotlabs/Module/Prate.php b/Zotlabs/Module/Prate.php index 65bbcca9a..2a8539ed0 100644 --- a/Zotlabs/Module/Prate.php +++ b/Zotlabs/Module/Prate.php @@ -85,7 +85,7 @@ class Prate extends \Zotlabs\Web\Controller { $record = $z[0]['xlink_id']; } if($record) { - proc_run('php','include/ratenotif.php','rating',$record); + \Zotlabs\Daemon\Master::Summon(array('Ratenotif','rating',$record)); } json_return_and_die(array('result' => true));; diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php index 8f879503c..efcc7bece 100644 --- a/Zotlabs/Module/Profile_photo.php +++ b/Zotlabs/Module/Profile_photo.php @@ -179,7 +179,7 @@ class Profile_photo extends \Zotlabs\Web\Controller { info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL); // Update directory in background - proc_run('php',"include/directory.php",$channel['channel_id']); + \Zotlabs\Daemon\Master::Summon(array('Directory',$channel['channel_id'])); // Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures' @@ -311,7 +311,7 @@ class Profile_photo extends \Zotlabs\Web\Controller { ); profile_photo_set_profile_perms(); //Reset default photo permissions to public - proc_run('php','include/directory.php',local_channel()); + \Zotlabs\Daemon\Master::Summon(array('Directory',local_channel())); goaway(z_root() . '/profiles'); } diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php index 72edf396f..3db089e53 100644 --- a/Zotlabs/Module/Profiles.php +++ b/Zotlabs/Module/Profiles.php @@ -584,7 +584,7 @@ class Profiles extends \Zotlabs\Web\Controller { if($is_default) { // reload the info for the sidebar widget - why does this not work? profile_load($a,$channel['channel_address']); - proc_run('php','include/directory.php',local_channel()); + \Zotlabs\Daemon\Master::Summon(array('Directory',local_channel())); } } } diff --git a/Zotlabs/Module/Rate.php b/Zotlabs/Module/Rate.php index e2c05b6d4..da23b840e 100644 --- a/Zotlabs/Module/Rate.php +++ b/Zotlabs/Module/Rate.php @@ -102,14 +102,12 @@ class Rate extends \Zotlabs\Web\Controller { } if($record) { - proc_run('php','include/ratenotif.php','rating',$record); + \Zotlabs\Daemon\Master::Summon(array('Ratenotif','rating',$record)); } } - - - function get() { + function get() { if(! local_channel()) { notice( t('Permission denied.') . EOL); diff --git a/Zotlabs/Module/Settings.php b/Zotlabs/Module/Settings.php index f588e2824..3d37faab6 100644 --- a/Zotlabs/Module/Settings.php +++ b/Zotlabs/Module/Settings.php @@ -543,7 +543,7 @@ class Settings extends \Zotlabs\Web\Controller { ); } - proc_run('php','include/directory.php',local_channel()); + \Zotlabs\Daemon\Master::Summon(array('Directory',local_channel())); build_sync_packet(); diff --git a/Zotlabs/Module/Tagger.php b/Zotlabs/Module/Tagger.php index 879cf3dbb..26d1c58ea 100644 --- a/Zotlabs/Module/Tagger.php +++ b/Zotlabs/Module/Tagger.php @@ -131,7 +131,7 @@ class Tagger extends \Zotlabs\Web\Controller { $ret = post_activity_item($arr); if($ret['success']) - proc_run('php','include/notifier.php','tag',$ret['activity']['id']); + \Zotlabs\Daemon\Master::Summon(array('Notifier','tag',$ret['activity']['id'])); killme(); diff --git a/boot.php b/boot.php index ca3673361..9b4a7df13 100755 --- a/boot.php +++ b/boot.php @@ -1570,7 +1570,7 @@ function fix_system_urls($oldurl, $newurl) { } } - proc_run('php', 'include/notifier.php', 'refresh_all', $c[0]['channel_id']); + Zotlabs\Daemon\Master::Summon(array('Notifier', 'refresh_all', $c[0]['channel_id'])); } } diff --git a/include/Contact.php b/include/Contact.php index 8ad67c28e..e50670a89 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -303,8 +303,7 @@ function channel_remove($channel_id, $local = true, $unset_session=false) { dbesc($channel['channel_hash']) ); - proc_run('php','include/notifier.php','purge_all',$channel_id); - + Zotlabs\Daemon\Master::Summon(array('Notifier','purge_all',$channel_id)); } q("DELETE FROM `groups` WHERE `uid` = %d", intval($channel_id)); @@ -386,7 +385,7 @@ function channel_remove($channel_id, $local = true, $unset_session=false) { @rrmdir($f); } - proc_run('php','include/directory.php',$channel_id); + Zotlabs\Daemon\Master::Summon(array('Directory',$channel_id)); if($channel_id == local_channel() && $unset_session) { App::$session->nuke(); diff --git a/include/activities.php b/include/activities.php index 9ba191391..5c1e68720 100644 --- a/include/activities.php +++ b/include/activities.php @@ -89,7 +89,7 @@ function profile_activity($changed, $value) { if($i) { // FIXME - limit delivery in notifier.php to those specificed in the perms argument - proc_run('php',"include/notifier.php","activity","$i", 'PERMS_R_PROFILE'); + Zotlabs\Daemon\Master::Summon(array('Notifier','activity', $i, 'PERMS_R_PROFILE'); } } diff --git a/include/attach.php b/include/attach.php index ae4681994..d9cd30f6d 100644 --- a/include/attach.php +++ b/include/attach.php @@ -1591,7 +1591,7 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid, $post = item_store($arr); $item_id = $post['item_id']; if($item_id) { - proc_run('php',"include/notifier.php","activity",$item_id); + Zotlabs\Daemon\Master::Summon(array('Notifier','activity',$item_id)); } call_hooks('post_local_end', $arr); @@ -1627,7 +1627,7 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid, $item_id = $post['item_id']; if($item_id) { - proc_run('php',"include/notifier.php","activity",$item_id); + Zotlabs\Daemon\Master::Summon(array('Notifier','activity',$item_id)); } call_hooks('post_local_end', $arr); diff --git a/include/checksites.php b/include/checksites.php deleted file mode 100644 index 9d3ca1797..000000000 --- a/include/checksites.php +++ /dev/null @@ -1,62 +0,0 @@ - 1) && ($argv[1])) - $site_id = $argv[1]; - - if($site_id) - $sql_options = " and site_url = '" . dbesc($argv[1]) . "' "; - - $days = intval(get_config('system','sitecheckdays')); - if($days < 1) - $days = 30; - - $r = q("select * from site where site_dead = 0 and site_update < %s - INTERVAL %s and site_type = %d $sql_options ", - db_utcnow(), db_quoteinterval($days . ' DAY'), - intval(SITE_TYPE_ZOT) - ); - - if(! $r) - return; - - foreach($r as $rr) { - if(! strcasecmp($rr['site_url'],z_root())) - continue; - - $x = ping_site($rr['site_url']); - if($x['success']) { - logger('checksites: ' . $rr['site_url']); - q("update site set site_update = '%s' where site_url = '%s' ", - dbesc(datetime_convert()), - dbesc($rr['site_url']) - ); - } - else { - logger('marking dead site: ' . $x['message']); - q("update site set site_dead = 1 where site_url = '%s' ", - dbesc($rr['site_url']) - ); - } - } - - return; -} - -if (array_search(__file__,get_included_files())===0){ - checksites_run($argc,$argv); - killme(); -} diff --git a/include/cli_suggest.php b/include/cli_suggest.php deleted file mode 100644 index 94b65f8ee..000000000 --- a/include/cli_suggest.php +++ /dev/null @@ -1,19 +0,0 @@ - json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $mm))))); - zot_import($msg,z_root()); - } - } - else { - $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $m))))); - $dresult = zot_import($msg,z_root()); - } - - remove_queue_item($r[0]['outq_hash']); - - if($dresult && is_array($dresult)) { - foreach($dresult as $xx) { - if(is_array($xx) && array_key_exists('message_id',$xx)) { - if(delivery_report_is_storable($xx)) { - q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", - dbesc($xx['message_id']), - dbesc($xx['location']), - dbesc($xx['recipient']), - dbesc($xx['status']), - dbesc(datetime_convert($xx['date'])), - dbesc($xx['sender']) - ); - } - } - } - } - - q("delete from dreport where dreport_queue = '%s'", - dbesc($argv[$x]) - ); - } - } - - // otherwise it's a remote delivery - call queue_deliver() with the $immediate flag - - queue_deliver($r[0],true); - - } - } -} - -if (array_search(__file__,get_included_files())===0){ - deliver_run($argc,$argv); - killme(); -} diff --git a/include/deliver_hooks.php b/include/deliver_hooks.php deleted file mode 100644 index f8f3bb19b..000000000 --- a/include/deliver_hooks.php +++ /dev/null @@ -1,29 +0,0 @@ - 2) { - if($argv[2] === 'force') - $force = true; - if($argv[2] === 'nopush') - $pushall = false; - } - - logger('directory update', LOGGER_DEBUG); - - $dirmode = get_config('system','directory_mode'); - if($dirmode === false) - $dirmode = DIRECTORY_MODE_NORMAL; - - $x = q("select * from channel where channel_id = %d limit 1", - intval($argv[1]) - ); - if(! $x) - return; - - $channel = $x[0]; - - if($dirmode != DIRECTORY_MODE_NORMAL) { - - // this is an in-memory update and we don't need to send a network packet. - - local_dir_update($argv[1],$force); - - q("update channel set channel_dirdate = '%s' where channel_id = %d", - dbesc(datetime_convert()), - intval($channel['channel_id']) - ); - - // Now update all the connections - if($pushall) - proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']); - - return; - } - - // otherwise send the changes upstream - - $directory = find_upstream_directory($dirmode); - $url = $directory['url'] . '/post'; - - // ensure the upstream directory is updated - - $packet = zot_build_packet($channel,(($force) ? 'force_refresh' : 'refresh')); - $z = zot_zot($url,$packet); - - // re-queue if unsuccessful - - if(! $z['success']) { - - /** @FIXME we aren't updating channel_dirdate if we have to queue - * the directory packet. That means we'll try again on the next poll run. - */ - - $hash = random_string(); - - queue_insert(array( - 'hash' => $hash, - 'account_id' => $channel['channel_account_id'], - 'channel_id' => $channel['channel_id'], - 'posturl' => $url, - 'notify' => $packet, - )); - - } - else { - q("update channel set channel_dirdate = '%s' where channel_id = %d", - dbesc(datetime_convert()), - intval($channel['channel_id']) - ); - } - - // Now update all the connections - if($pushall) - proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']); - -} - -if (array_search(__file__, get_included_files()) === 0) { - directory_run($argc,$argv); - killme(); -} diff --git a/include/expire.php b/include/expire.php deleted file mode 100644 index a2468e0f2..000000000 --- a/include/expire.php +++ /dev/null @@ -1,98 +0,0 @@ - ''); - call_hooks('externals_url_select',$arr); - - if($arr['url']) { - $url = $arr['url']; - } - else { - $randfunc = db_getfunc('RAND'); - - // fixme this query does not deal with directory realms. - - $r = q("select site_url, site_pull from site where site_url != '%s' and site_flags != %d and site_type = %d and site_dead = 0 order by $randfunc limit 1", - dbesc(z_root()), - intval(DIRECTORY_MODE_STANDALONE), - intval(SITE_TYPE_ZOT) - ); - if($r) - $url = $r[0]['site_url']; - } - - $blacklisted = false; - - if(! check_siteallowed($url)) { - logger('blacklisted site: ' . $url); - $blacklisted = true; - } - - $attempts ++; - - // make sure we can eventually break out if somebody blacklists all known sites - - if($blacklisted) { - if($attempts > 20) - break; - $attempts --; - continue; - } - - if($url) { - if($r[0]['site_pull'] !== NULL_DATE) - $mindate = urlencode(datetime_convert('','',$r[0]['site_pull'] . ' - 1 day')); - else { - $days = get_config('externals','since_days'); - if($days === false) - $days = 15; - $mindate = urlencode(datetime_convert('','','now - ' . intval($days) . ' days')); - } - - $feedurl = $url . '/zotfeed?f=&mindate=' . $mindate; - - logger('externals: pulling public content from ' . $feedurl, LOGGER_DEBUG); - - $x = z_fetch_url($feedurl); - if(($x) && ($x['success'])) { - - q("update site set site_pull = '%s' where site_url = '%s'", - dbesc(datetime_convert()), - dbesc($url) - ); - - $j = json_decode($x['body'],true); - if($j['success'] && $j['messages']) { - $sys = get_sys_channel(); - foreach($j['messages'] as $message) { - // on these posts, clear any route info. - $message['route'] = ''; - $results = process_delivery(array('hash' => 'undefined'), get_item_elements($message), - array(array('hash' => $sys['xchan_hash'])), false, true); - $total ++; - } - logger('externals: import_public_posts: ' . $total . ' messages imported', LOGGER_DEBUG); - } - } - } - } -} - -if (array_search(__file__,get_included_files())===0){ - externals_run($argc,$argv); - killme(); -} diff --git a/include/follow.php b/include/follow.php index 70e717cfc..e4f7e8557 100644 --- a/include/follow.php +++ b/include/follow.php @@ -269,7 +269,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) if($r) { $result['abook'] = $r[0]; - proc_run('php', 'include/notifier.php', 'permission_create', $result['abook']['abook_id']); + Zotlabs\Daemon\Master::Summon(array('Notifier', 'permission_create', $result['abook']['abook_id'])); } $arr = array('channel_id' => $uid, 'channel' => $channel, 'abook' => $result['abook']); diff --git a/include/gprobe.php b/include/gprobe.php deleted file mode 100644 index f3daae9d6..000000000 --- a/include/gprobe.php +++ /dev/null @@ -1,41 +0,0 @@ - $tmp_str, 'url' => App::$cmd); call_hooks('zid_init',$arr); if(! local_channel()) { diff --git a/include/import.php b/include/import.php index a62ec4ed5..a94c6c1ac 100644 --- a/include/import.php +++ b/include/import.php @@ -574,7 +574,7 @@ function import_items($channel,$items,$sync = false) { if($sync && $item['item_wall']) { // deliver singletons if we have any if($item_result && $item_result['success']) { - proc_run('php','include/notifier.php','single_activity',$item_result['item_id']); + Zotlabs\Daemon\Master::Summon(array('Notifier','single_activity',$item_result['item_id'])); } } continue; @@ -588,7 +588,7 @@ function import_items($channel,$items,$sync = false) { if($sync && $item['item_wall']) { // deliver singletons if we have any if($item_result && $item_result['success']) { - proc_run('php','include/notifier.php','single_activity',$item_result['item_id']); + Zotlabs\Daemon\Master::Summon(array('Notifier','single_activity',$item_result['item_id'])); } } } @@ -936,7 +936,7 @@ function import_mail($channel,$mails,$sync = false) { $m['uid'] = $channel['channel_id']; $mail_id = mail_store($m); if($sync && $mail_id) { - proc_run('php','include/notifier.php','single_mail',$mail_id); + Zotlabs\Daemon\Master::Summon(array('Notifier','single_mail',$mail_id)); } } } diff --git a/include/importdoc.php b/include/importdoc.php deleted file mode 100755 index 7c65037d3..000000000 --- a/include/importdoc.php +++ /dev/null @@ -1,41 +0,0 @@ -= $deliveries_per_process) { - proc_run('php','include/deliver.php',$deliver); + Zotlabs\Daemon\Master::summon(array('Deliver',$deliver)); $deliver = array(); if($interval) @time_sleep_until(microtime(true) + (float) $interval); @@ -1932,7 +1932,7 @@ function do_delivery($deliveries) { // catch any stragglers if($deliver) - proc_run('php','include/deliver.php',$deliver); + Zotlabs\Daemon\Master::summon(array('Deliver',$deliver)); } diff --git a/include/notifier.php b/include/notifier.php deleted file mode 100644 index 780a8798c..000000000 --- a/include/notifier.php +++ /dev/null @@ -1,664 +0,0 @@ - 3) ? $argv[3] : null); - - if(! $item_id) - return; - - $sys = get_sys_channel(); - - $deliveries = array(); - - $dead_hubs = array(); - - $dh = q("select site_url from site where site_dead = 1"); - if($dh) { - foreach($dh as $dead) { - $dead_hubs[] = $dead['site_url']; - } - } - - - $request = false; - $mail = false; - $top_level = false; - $location = false; - $recipients = array(); - $url_recipients = array(); - $normal_mode = true; - $packet_type = 'undefined'; - - if($cmd === 'mail' || $cmd === 'single_mail') { - $normal_mode = false; - $mail = true; - $private = true; - $message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1", - intval($item_id) - ); - if(! $message) { - return; - } - xchan_mail_query($message[0]); - $uid = $message[0]['channel_id']; - $recipients[] = $message[0]['from_xchan']; // include clones - $recipients[] = $message[0]['to_xchan']; - $item = $message[0]; - - $encoded_item = encode_mail($item); - - $s = q("select * from channel where channel_id = %d limit 1", - intval($item['channel_id']) - ); - if($s) - $channel = $s[0]; - - } - elseif($cmd === 'request') { - $channel_id = $item_id; - $xchan = $argv[3]; - $request_message_id = $argv[4]; - - $s = q("select * from channel where channel_id = %d limit 1", - intval($channel_id) - ); - if($s) - $channel = $s[0]; - - $private = true; - $recipients[] = $xchan; - $packet_type = 'request'; - $normal_mode = false; - } - elseif($cmd == 'permission_update' || $cmd == 'permission_create') { - // Get the (single) recipient - $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_self = 0", - intval($item_id) - ); - if($r) { - $uid = $r[0]['abook_channel']; - // Get the sender - $channel = channelx_by_n($uid); - if($channel) { - $perm_update = array('sender' => $channel, 'recipient' => $r[0], 'success' => false, 'deliveries' => ''); - - if($cmd == 'permission_create') - call_hooks('permissions_create',$perm_update); - else - call_hooks('permissions_update',$perm_update); - - if($perm_update['success']) { - if($perm_update['deliveries']) { - $deliveries[] = $perm_update['deliveries']; - do_delivery($deliveries); - } - return; - } - else { - $recipients[] = $r[0]['abook_xchan']; - $private = false; - $packet_type = 'refresh'; - $packet_recips = array(array('guid' => $r[0]['xchan_guid'],'guid_sig' => $r[0]['xchan_guid_sig'],'hash' => $r[0]['xchan_hash'])); - } - } - } - } - elseif($cmd === 'refresh_all') { - logger('notifier: refresh_all: ' . $item_id); - $uid = $item_id; - $channel = channelx_by_n($item_id); - $r = q("select abook_xchan from abook where abook_channel = %d", - intval($item_id) - ); - if($r) { - foreach($r as $rr) { - $recipients[] = $rr['abook_xchan']; - } - } - $private = false; - $packet_type = 'refresh'; - } - elseif($cmd === 'location') { - logger('notifier: location: ' . $item_id); - $s = q("select * from channel where channel_id = %d limit 1", - intval($item_id) - ); - if($s) - $channel = $s[0]; - $uid = $item_id; - $recipients = array(); - $r = q("select abook_xchan from abook where abook_channel = %d", - intval($item_id) - ); - if($r) { - foreach($r as $rr) { - $recipients[] = $rr['abook_xchan']; - } - } - - $encoded_item = array('locations' => zot_encode_locations($channel),'type' => 'location', 'encoding' => 'zot'); - $target_item = array('aid' => $channel['channel_account_id'],'uid' => $channel['channel_id']); - $private = false; - $packet_type = 'location'; - $location = true; - } - elseif($cmd === 'purge_all') { - logger('notifier: purge_all: ' . $item_id); - $s = q("select * from channel where channel_id = %d limit 1", - intval($item_id) - ); - if($s) - $channel = $s[0]; - $uid = $item_id; - $recipients = array(); - $r = q("select abook_xchan from abook where abook_channel = %d", - intval($item_id) - ); - if($r) { - foreach($r as $rr) { - $recipients[] = $rr['abook_xchan']; - } - } - $private = false; - $packet_type = 'purge'; - } - else { - - // Normal items - - // Fetch the target item - - $r = q("SELECT * FROM item WHERE id = %d and parent != 0 LIMIT 1", - intval($item_id) - ); - - if(! $r) - return; - - xchan_query($r); - - $r = fetch_post_tags($r); - - $target_item = $r[0]; - $deleted_item = false; - - if(intval($target_item['item_deleted'])) { - logger('notifier: target item ITEM_DELETED', LOGGER_DEBUG); - $deleted_item = true; - } - - if(intval($target_item['item_type']) != ITEM_TYPE_POST) { - logger('notifier: target item not forwardable: type ' . $target_item['item_type'], LOGGER_DEBUG); - return; - } - if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) || intval($target_item['item_hidden'])) { - logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG); - return; - } - - if(strpos($target_item['postopts'],'nodeliver') !== false) { - logger('notifier: target item is undeliverable', LOGGER_DEBUG); - return; - } - - $s = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1", - intval($target_item['uid']) - ); - if($s) - $channel = $s[0]; - - if($channel['channel_hash'] !== $target_item['author_xchan'] && $channel['channel_hash'] !== $target_item['owner_xchan']) { - logger("notifier: Sending channel {$channel['channel_hash']} is not owner {$target_item['owner_xchan']} or author {$target_item['author_xchan']}", LOGGER_NORMAL, LOG_WARNING); - return; - } - - - if($target_item['id'] == $target_item['parent']) { - $parent_item = $target_item; - $top_level_post = true; - } - else { - // fetch the parent item - $r = q("SELECT * from item where id = %d order by id asc", - intval($target_item['parent']) - ); - - if(! $r) - return; - - if(strpos($r[0]['postopts'],'nodeliver') !== false) { - logger('notifier: target item is undeliverable', LOGGER_DEBUG, LOG_NOTICE); - return; - } - - xchan_query($r); - $r = fetch_post_tags($r); - - $parent_item = $r[0]; - $top_level_post = false; - } - - // avoid looping of discover items 12/4/2014 - - if($sys && $parent_item['uid'] == $sys['channel_id']) - return; - - $encoded_item = encode_item($target_item); - - // Send comments to the owner to re-deliver to everybody in the conversation - // We only do this if the item in question originated on this site. This prevents looping. - // To clarify, a site accepting a new comment is responsible for sending it to the owner for relay. - // Relaying should never be initiated on a post that arrived from elsewhere. - - // We should normally be able to rely on ITEM_ORIGIN, but start_delivery_chain() incorrectly set this - // flag on comments for an extended period. So we'll also call comment_local_origin() which looks at - // the hostname in the message_id and provides a second (fallback) opinion. - - $relay_to_owner = (((! $top_level_post) && (intval($target_item['item_origin'])) && comment_local_origin($target_item)) ? true : false); - - - - $uplink = false; - - // $cmd === 'relay' indicates the owner is sending it to the original recipients - // don't allow the item in the relay command to relay to owner under any circumstances, it will loop - - logger('notifier: relay_to_owner: ' . (($relay_to_owner) ? 'true' : 'false'), LOGGER_DATA, LOG_DEBUG); - logger('notifier: top_level_post: ' . (($top_level_post) ? 'true' : 'false'), LOGGER_DATA, LOG_DEBUG); - - // tag_deliver'd post which needs to be sent back to the original author - - if(($cmd === 'uplink') && intval($parent_item['item_uplink']) && (! $top_level_post)) { - logger('notifier: uplink'); - $uplink = true; - } - - if(($relay_to_owner || $uplink) && ($cmd !== 'relay')) { - logger('notifier: followup relay', LOGGER_DEBUG); - $recipients = array(($uplink) ? $parent_item['source_xchan'] : $parent_item['owner_xchan']); - $private = true; - if(! $encoded_item['flags']) - $encoded_item['flags'] = array(); - $encoded_item['flags'][] = 'relay'; - } - else { - logger('notifier: normal distribution', LOGGER_DEBUG); - if($cmd === 'relay') - logger('notifier: owner relay'); - - // if our parent is a tag_delivery recipient, uplink to the original author causing - // a delivery fork. - - if(($parent_item) && intval($parent_item['item_uplink']) && (! $top_level_post) && ($cmd !== 'uplink')) { - // don't uplink a relayed post to the relay owner - if($parent_item['source_xchan'] !== $parent_item['owner_xchan']) { - logger('notifier: uplinking this item'); - proc_run('php','include/notifier.php','uplink',$item_id); - } - } - - $private = false; - $recipients = collect_recipients($parent_item,$private); - - // FIXME add any additional recipients such as mentions, etc. - - // don't send deletions onward for other people's stuff - // TODO verify this is needed - copied logic from same place in old code - - if(intval($target_item['item_deleted']) && (! intval($target_item['item_wall']))) { - logger('notifier: ignoring delete notification for non-wall item', LOGGER_NORMAL, LOG_NOTICE); - return; - } - } - - } - - $walltowall = (($top_level_post && $channel['xchan_hash'] === $target_item['author_xchan']) ? true : false); - - // Generic delivery section, we have an encoded item and recipients - // Now start the delivery process - - $x = $encoded_item; - $x['title'] = 'private'; - $x['body'] = 'private'; - logger('notifier: encoded item: ' . print_r($x,true), LOGGER_DATA, LOG_DEBUG); - - stringify_array_elms($recipients); - if(! $recipients) - return; - -// logger('notifier: recipients: ' . print_r($recipients,true), LOGGER_NORMAL, LOG_DEBUG); - - $env_recips = (($private) ? array() : null); - - $details = q("select xchan_hash, xchan_instance_url, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")"); - - - $recip_list = array(); - - if($details) { - foreach($details as $d) { - - $recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')'; - if($private) - $env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig'],'hash' => $d['xchan_hash']); - - if($d['xchan_network'] === 'mail' && $normal_mode) { - $delivery_options = get_xconfig($d['xchan_hash'],'system','delivery_mode'); - if(! $delivery_options) - format_and_send_email($channel,$d,$target_item); - } - } - } - - - $narr = array( - 'channel' => $channel, - 'env_recips' => $env_recips, - 'packet_recips' => $packet_recips, - 'recipients' => $recipients, - 'item' => $item, - 'target_item' => $target_item, - 'top_level_post' => $top_level_post, - 'private' => $private, - 'relay_to_owner' => $relay_to_owner, - 'uplink' => $uplink, - 'cmd' => $cmd, - 'mail' => $mail, - 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false), - 'location' => $location, - 'request' => $request, - 'normal_mode' => $normal_mode, - 'packet_type' => $packet_type, - 'walltowall' => $walltowall, - 'queued' => array() - ); - - call_hooks('notifier_process', $narr); - if($narr['queued']) { - foreach($narr['queued'] as $pq) - $deliveries[] = $pq; - } - - // notifier_process can alter the recipient list - - $recipients = $narr['recipients']; - $env_recips = $narr['env_recips']; - $packet_recips = $narr['packet_recips']; - - if(($private) && (! $env_recips)) { - // shouldn't happen - logger('notifier: private message with no envelope recipients.' . print_r($argv,true), LOGGER_NORMAL, LOG_NOTICE); - } - - logger('notifier: recipients (may be delivered to more if public): ' . print_r($recip_list,true), LOGGER_DEBUG); - - - // Now we have collected recipients (except for external mentions, FIXME) - // Let's reduce this to a set of hubs. - - $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") - and hubloc_error = 0 and hubloc_deleted = 0" - ); - - - if(! $r) { - logger('notifier: no hubs', LOGGER_NORMAL, LOG_NOTICE); - return; - } - - $hubs = $r; - - - - /** - * Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey, since it may have been - * a re-install which has not yet been detected and pruned. - * For other networks which don't have or require sitekeys, we'll have to use the URL - */ - - - $hublist = array(); // this provides an easily printable list for the logs - $dhubs = array(); // delivery hubs where we store our resulting unique array - $keys = array(); // array of keys to check uniquness for zot hubs - $urls = array(); // array of urls to check uniqueness of hubs from other networks - - - foreach($hubs as $hub) { - if(in_array($hub['hubloc_url'],$dead_hubs)) { - logger('skipping dead hub: ' . $hub['hubloc_url'], LOGGER_DEBUG, LOG_INFO); - continue; - } - - if($hub['hubloc_network'] == 'zot') { - if(! in_array($hub['hubloc_sitekey'],$keys)) { - $hublist[] = $hub['hubloc_host']; - $dhubs[] = $hub; - $keys[] = $hub['hubloc_sitekey']; - } - } - else { - if(! in_array($hub['hubloc_url'],$urls)) { - $hublist[] = $hub['hubloc_host']; - $dhubs[] = $hub; - $urls[] = $hub['hubloc_url']; - } - } - } - - logger('notifier: will notify/deliver to these hubs: ' . print_r($hublist,true), LOGGER_DEBUG, LOG_DEBUG); - - - foreach($dhubs as $hub) { - - if($hub['hubloc_network'] !== 'zot') { - - $narr = array( - 'channel' => $channel, - 'env_recips' => $env_recips, - 'packet_recips' => $packet_recips, - 'recipients' => $recipients, - 'item' => $item, - 'target_item' => $target_item, - 'hub' => $hub, - 'top_level_post' => $top_level_post, - 'private' => $private, - 'relay_to_owner' => $relay_to_owner, - 'uplink' => $uplink, - 'cmd' => $cmd, - 'mail' => $mail, - 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false), - 'location' => $location, - 'request' => $request, - 'normal_mode' => $normal_mode, - 'packet_type' => $packet_type, - 'walltowall' => $walltowall, - 'queued' => array() - ); - - - call_hooks('notifier_hub',$narr); - if($narr['queued']) { - foreach($narr['queued'] as $pq) - $deliveries[] = $pq; - } - continue; - - } - - // singleton deliveries by definition 'not got zot'. - // Single deliveries are other federated networks (plugins) and we're essentially - // delivering only to those that have this site url in their abook_instance - // and only from within a sync operation. This means if you post from a clone, - // and a connection is connected to one of your other clones; assuming that hub - // is running it will receive a sync packet. On receipt of this sync packet it - // will invoke a delivery to those connections which are connected to just that - // hub instance. - - if($cmd === 'single_mail' || $cmd === 'single_activity') { - continue; - } - - // default: zot protocol - - $hash = random_string(); - $packet = null; - - if($packet_type === 'refresh' || $packet_type === 'purge') { - $packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null)); - } - elseif($packet_type === 'request') { - $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hash, - array('message_id' => $request_message_id) - ); - } - - if($packet) { - queue_insert(array( - 'hash' => $hash, - 'account_id' => $channel['channel_account_id'], - 'channel_id' => $channel['channel_id'], - 'posturl' => $hub['hubloc_callback'], - 'notify' => $packet - )); - } - else { - $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash); - queue_insert(array( - 'hash' => $hash, - 'account_id' => $target_item['aid'], - 'channel_id' => $target_item['uid'], - 'posturl' => $hub['hubloc_callback'], - 'notify' => $packet, - 'msg' => json_encode($encoded_item) - )); - - // only create delivery reports for normal undeleted items - if(is_array($target_item) && array_key_exists('postopts',$target_item) && (! $target_item['item_deleted']) && (! get_config('system','disable_dreport'))) { - q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan, dreport_queue ) values ( '%s','%s','%s','%s','%s','%s','%s' ) ", - dbesc($target_item['mid']), - dbesc($hub['hubloc_host']), - dbesc($hub['hubloc_host']), - dbesc('queued'), - dbesc(datetime_convert()), - dbesc($channel['channel_hash']), - dbesc($hash) - ); - } - } - - $deliveries[] = $hash; - } - - if($normal_mode) { - $x = q("select * from hook where hook = 'notifier_normal'"); - if($x) - proc_run('php','include/deliver_hooks.php', $target_item['id']); - } - - if($deliveries) - do_delivery($deliveries); - - logger('notifier: basic loop complete.', LOGGER_DEBUG); - - call_hooks('notifier_end',$target_item); - - logger('notifer: complete.'); - return; - -} - - -if (array_search(__file__,get_included_files())===0){ - notifier_run($argc,$argv); - killme(); -} diff --git a/include/onedirsync.php b/include/onedirsync.php deleted file mode 100644 index d794fe35e..000000000 --- a/include/onedirsync.php +++ /dev/null @@ -1,82 +0,0 @@ - 1) && (intval($argv[1]))) - $update_id = intval($argv[1]); - - if(! $update_id) { - logger('onedirsync: no update'); - return; - } - - $r = q("select * from updates where ud_id = %d limit 1", - intval($update_id) - ); - - if(! $r) - return; - if(($r[0]['ud_flags'] & UPDATE_FLAGS_UPDATED) || (! $r[0]['ud_addr'])) - return; - - // Have we probed this channel more recently than the other directory server - // (where we received this update from) ? - // If we have, we don't need to do anything except mark any older entries updated - - $x = q("select * from updates where ud_addr = '%s' and ud_date > '%s' and ( ud_flags & %d )>0 order by ud_date desc limit 1", - dbesc($r[0]['ud_addr']), - dbesc($r[0]['ud_date']), - intval(UPDATE_FLAGS_UPDATED) - ); - if($x) { - $y = q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and ( ud_flags & %d ) = 0 and ud_date != '%s'", - intval(UPDATE_FLAGS_UPDATED), - dbesc($r[0]['ud_addr']), - intval(UPDATE_FLAGS_UPDATED), - dbesc($x[0]['ud_date']) - ); - return; - } - - // ignore doing an update if this ud_addr refers to a known dead hubloc - - $h = q("select * from hubloc where hubloc_addr = '%s' limit 1", - dbesc($r[0]['ud_addr']) - ); - if(($h) && ($h[0]['hubloc_status'] & HUBLOC_OFFLINE)) { - $y = q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and ( ud_flags & %d ) = 0 ", - intval(UPDATE_FLAGS_UPDATED), - dbesc($r[0]['ud_addr']), - intval(UPDATE_FLAGS_UPDATED) - ); - - return; - } - - // we might have to pull this out some day, but for now update_directory_entry() - // runs zot_finger() and is kind of zot specific - - if($h && $h[0]['hubloc_network'] !== 'zot') - return; - - update_directory_entry($r[0]); - - return; -} - -if (array_search(__file__,get_included_files())===0){ - onedirsync_run($argc,$argv); - killme(); -} diff --git a/include/onepoll.php b/include/onepoll.php deleted file mode 100644 index bfd79feea..000000000 --- a/include/onepoll.php +++ /dev/null @@ -1,159 +0,0 @@ - 1) && (intval($argv[1]))) - $contact_id = intval($argv[1]); - - if(! $contact_id) { - logger('onepoll: no contact'); - return; - } - - $d = datetime_convert(); - - $contacts = q("SELECT abook.*, xchan.*, account.* - FROM abook LEFT JOIN account on abook_account = account_id left join xchan on xchan_hash = abook_xchan - where abook_id = %d - and abook_pending = 0 and abook_archived = 0 and abook_blocked = 0 and abook_ignored = 0 - AND (( account_flags = %d ) OR ( account_flags = %d )) limit 1", - intval($contact_id), - intval(ACCOUNT_OK), - intval(ACCOUNT_UNVERIFIED) - ); - - if(! $contacts) { - logger('onepoll: abook_id not found: ' . $contact_id); - return; - } - - $contact = $contacts[0]; - - $t = $contact['abook_updated']; - - $importer_uid = $contact['abook_channel']; - - $r = q("SELECT * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1", - intval($importer_uid) - ); - - if(! $r) - return; - - $importer = $r[0]; - - logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['xchan_name']}, CONTACT: {$contact['xchan_name']}"); - - $last_update = ((($contact['abook_updated'] === $contact['abook_created']) || ($contact['abook_updated'] === NULL_DATE)) - ? datetime_convert('UTC','UTC','now - 7 days') - : datetime_convert('UTC','UTC',$contact['abook_updated'] . ' - 2 days') - ); - - if($contact['xchan_network'] === 'rss') { - logger('onepoll: processing feed ' . $contact['xchan_name'], LOGGER_DEBUG); - handle_feed($importer['channel_id'],$contact_id,$contact['xchan_hash']); - q("update abook set abook_connected = '%s' where abook_id = %d", - dbesc(datetime_convert()), - intval($contact['abook_id']) - ); - return; - } - - if($contact['xchan_network'] !== 'zot') - return; - - // update permissions - - $x = zot_refresh($contact,$importer); - - $responded = false; - $updated = datetime_convert(); - $connected = datetime_convert(); - if(! $x) { - // mark for death by not updating abook_connected, this is caught in include/poller.php - q("update abook set abook_updated = '%s' where abook_id = %d", - dbesc($updated), - intval($contact['abook_id']) - ); - } - else { - q("update abook set abook_updated = '%s', abook_connected = '%s' where abook_id = %d", - dbesc($updated), - dbesc($connected), - intval($contact['abook_id']) - ); - $responded = true; - } - - if(! $responded) - return; - - if($contact['xchan_connurl']) { - $fetch_feed = true; - $x = null; - - if(! ($contact['abook_their_perms'] & PERMS_R_STREAM )) - $fetch_feed = false; - - if($fetch_feed) { - - $feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']); - $feedurl .= '?f=&mindate=' . urlencode($last_update); - - $x = z_fetch_url($feedurl); - - logger('feed_update: ' . print_r($x,true), LOGGER_DATA); - - } - - if(($x) && ($x['success'])) { - $total = 0; - logger('onepoll: feed update ' . $contact['xchan_name'] . ' ' . $feedurl); - - $j = json_decode($x['body'],true); - if($j['success'] && $j['messages']) { - foreach($j['messages'] as $message) { - $results = process_delivery(array('hash' => $contact['xchan_hash']), get_item_elements($message), - array(array('hash' => $importer['xchan_hash'])), false); - logger('onepoll: feed_update: process_delivery: ' . print_r($results,true), LOGGER_DATA); - $total ++; - } - logger("onepoll: $total messages processed"); - } - } - } - - - // update the poco details for this connection - - if($contact['xchan_connurl']) { - $r = q("SELECT xlink_id from xlink - where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s and xlink_static = 0 limit 1", - intval($contact['xchan_hash']), - db_utcnow(), db_quoteinterval('1 DAY') - ); - if(! $r) { - poco_load($contact['xchan_hash'],$contact['xchan_connurl']); - } - } - - return; -} - -if (array_search(__file__,get_included_files())===0){ - onepoll_run($argc,$argv); - killme(); -} diff --git a/include/photos.php b/include/photos.php index 73a29d8eb..d8d3d102c 100644 --- a/include/photos.php +++ b/include/photos.php @@ -420,7 +420,7 @@ function photo_upload($channel, $observer, $args) { $item_id = $result['item_id']; if($visible) - proc_run('php', "include/notifier.php", 'wall-new', $item_id); + Zotlabs\Daemon\Master::Summon(array('Notifier', 'wall-new', $item_id)); } $ret['success'] = true; diff --git a/include/poller.php b/include/poller.php index 67a67de12..e72121a8a 100644 --- a/include/poller.php +++ b/include/poller.php @@ -5,7 +5,7 @@ require_once('include/cli_startup.php'); function poller_run($argc,$argv){ cli_startup(); - \Zotlabs\Daemon\Master::Summon('Cron'); + \Zotlabs\Daemon\Master::Summon(array('Cron')); } diff --git a/include/queue.php b/include/queue.php deleted file mode 100644 index 1159e01a0..000000000 --- a/include/queue.php +++ /dev/null @@ -1,95 +0,0 @@ - 1) - $queue_id = argv(1); - else - $queue_id = 0; - - logger('queue: start'); - - // delete all queue items more than 3 days old - // but first mark these sites dead if we haven't heard from them in a month - - $r = q("select outq_posturl from outq where outq_created < %s - INTERVAL %s", - db_utcnow(), db_quoteinterval('3 DAY') - ); - if($r) { - foreach($r as $rr) { - $site_url = ''; - $h = parse_url($rr['outq_posturl']); - $desturl = $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : ''); - q("update site set site_dead = 1 where site_dead = 0 and site_url = '%s' and site_update < %s - INTERVAL %s", - dbesc($desturl), - db_utcnow(), db_quoteinterval('1 MONTH') - ); - } - } - - $r = q("DELETE FROM outq WHERE outq_created < %s - INTERVAL %s", - db_utcnow(), db_quoteinterval('3 DAY') - ); - - if($queue_id) { - $r = q("SELECT * FROM outq WHERE outq_hash = '%s' LIMIT 1", - dbesc($queue_id) - ); - } - else { - - // For the first 12 hours we'll try to deliver every 15 minutes - // After that, we'll only attempt delivery once per hour. - // This currently only handles the default queue drivers ('zot' or '') which we will group by posturl - // so that we don't start off a thousand deliveries for a couple of dead hubs. - // The zot driver will deliver everything destined for a single hub once contact is made (*if* contact is made). - // Other drivers will have to do something different here and may need their own query. - - // Note: this requires some tweaking as new posts to long dead hubs once a day will keep them in the - // "every 15 minutes" category. We probably need to prioritise them when inserted into the queue - // or just prior to this query based on recent and long-term delivery history. If we have good reason to believe - // the site is permanently down, there's no reason to attempt delivery at all, or at most not more than once - // or twice a day. - - // FIXME: can we sort postgres on outq_priority and maintain the 'distinct' ? - // The order by max(outq_priority) might be a dodgy query because of the group by. - // The desired result is to return a sequence in the order most likely to be delivered in this run. - // If a hub has already been sitting in the queue for a few days, they should be delivered last; - // hence every failure should drop them further down the priority list. - - if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { - $prefix = 'DISTINCT ON (outq_posturl)'; - $suffix = 'ORDER BY outq_posturl'; - } else { - $prefix = ''; - $suffix = 'GROUP BY outq_posturl ORDER BY max(outq_priority)'; - } - $r = q("SELECT $prefix * FROM outq WHERE outq_delivered = 0 and (( outq_created > %s - INTERVAL %s and outq_updated < %s - INTERVAL %s ) OR ( outq_updated < %s - INTERVAL %s )) $suffix", - db_utcnow(), db_quoteinterval('12 HOUR'), - db_utcnow(), db_quoteinterval('15 MINUTE'), - db_utcnow(), db_quoteinterval('1 HOUR') - ); - } - if(! $r) - return; - - foreach($r as $rr) { - queue_deliver($rr); - } -} - -if (array_search(__file__,get_included_files())===0){ - queue_run($argc,$argv); - killme(); -} diff --git a/include/ratenotif.php b/include/ratenotif.php deleted file mode 100644 index 3a5e515ae..000000000 --- a/include/ratenotif.php +++ /dev/null @@ -1,119 +0,0 @@ - 'rating', - 'encoding' => 'zot', - 'target' => $r[0]['xlink_link'], - 'rating' => intval($r[0]['xlink_rating']), - 'rating_text' => $r[0]['xlink_rating_text'], - 'signature' => $r[0]['xlink_sig'], - 'edited' => $r[0]['xlink_updated'] - ); - } - - $channel = channelx_by_hash($r[0]['xlink_xchan']); - if(! $channel) { - logger('no channel'); - return; - } - - - $primary = get_directory_primary(); - - if(! $primary) - return; - - - $interval = ((get_config('system','delivery_interval') !== false) - ? intval(get_config('system','delivery_interval')) : 2 ); - - $deliveries_per_process = intval(get_config('system','delivery_batch_count')); - - if($deliveries_per_process <= 0) - $deliveries_per_process = 1; - - $deliver = array(); - - $x = z_fetch_url($primary . '/regdir'); - if($x['success']) { - $j = json_decode($x['body'],true); - if($j && $j['success'] && is_array($j['directories'])) { - - foreach($j['directories'] as $h) { - if($h == z_root()) - continue; - - $hash = random_string(); - $n = zot_build_packet($channel,'notify',null,null,$hash); - - queue_insert(array( - 'hash' => $hash, - 'account_id' => $channel['channel_account_id'], - 'channel_id' => $channel['channel_id'], - 'posturl' => $h . '/post', - 'notify' => $n, - 'msg' => json_encode($encoded_item) - )); - - $deliver[] = $hash; - - if(count($deliver) >= $deliveries_per_process) { - proc_run('php','include/deliver.php',$deliver); - $deliver = array(); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - } - } - - // catch any stragglers - - if(count($deliver)) { - proc_run('php','include/deliver.php',$deliver); - } - } - } - - logger('ratenotif: complete.'); - return; - -} - -if (array_search(__file__,get_included_files())===0){ - ratenotif_run($argc,$argv); - killme(); -} diff --git a/include/zot.php b/include/zot.php index 5400bd96e..5884245e9 100644 --- a/include/zot.php +++ b/include/zot.php @@ -453,7 +453,7 @@ function zot_refresh($them, $channel = null, $force = false) { else { // if we were just granted read stream permission and didn't have it before, try to pull in some posts if((! ($r[0]['abook_their_perms'] & PERMS_R_STREAM)) && ($their_perms & PERMS_R_STREAM)) - proc_run('php','include/onepoll.php',$r[0]['abook_id']); + Zotlabs\Daemon\Master::Summon(array('Onepoll',$r[0]['abook_id'])); } } else { @@ -504,7 +504,7 @@ function zot_refresh($them, $channel = null, $force = false) { if($new_connection) { if($new_perms != $previous_perms) - proc_run('php','include/notifier.php','permission_create',$new_connection[0]['abook_id']); + Zotlabs\Daemon\Master::Summon(array('Notifier','permission_create',$new_connection[0]['abook_id'])); require_once('include/enotify.php'); notification(array( 'type' => NOTIFY_INTRO, @@ -516,7 +516,7 @@ function zot_refresh($them, $channel = null, $force = false) { if($their_perms & PERMS_R_STREAM) { if(($channel['channel_w_stream'] & PERMS_PENDING) || (! intval($new_connection[0]['abook_pending'])) ) - proc_run('php','include/onepoll.php',$new_connection[0]['abook_id']); + Zotlabs\Daemon\Master::Summon(array('Onepoll',$new_connection[0]['abook_id'])); } unset($new_connection[0]['abook_id']); @@ -1703,7 +1703,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if((! $relay) && (! $request) && (! $local_public) && perm_is_allowed($channel['channel_id'],$sender['hash'],'send_stream')) { - proc_run('php', 'include/notifier.php', 'request', $channel['channel_id'], $sender['hash'], $arr['parent_mid']); + Zotlabs\Daemon\Master::Summon(array('Notifier', 'request', $channel['channel_id'], $sender['hash'], $arr['parent_mid'])); } continue; } @@ -1775,7 +1775,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if($relay && $item_id) { logger('process_delivery: invoking relay'); - proc_run('php','include/notifier.php','relay',intval($item_id)); + Zotlabs\Daemon\Master::Summon(array('Notifier','relay',intval($item_id))); $DR->update('relayed'); $result[] = $DR->get(); } @@ -1858,7 +1858,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if($relay && $item_id) { logger('process_delivery: invoking relay'); - proc_run('php','include/notifier.php','relay',intval($item_id)); + Zotlabs\Daemon\Master::Summon(array('Notifier','relay',intval($item_id))); $DR->addto_update('relayed'); $result[] = $DR->get(); } @@ -3060,7 +3060,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { 'msg' => json_encode($info) )); - proc_run('php', 'include/deliver.php', $hash); + Zotlabs\Daemon\Master::Summon(array('Deliver', $hash)); $total = $total - 1; if($interval && $total) @@ -3652,7 +3652,7 @@ function zot_reply_message_request($data) { * invoke delivery to send out the notify packet */ - proc_run('php', 'include/deliver.php', $hash); + Zotlabs\Daemon\Master::Summon(array('Deliver', $hash)); } } $ret['success'] = true; From f228bf4555ad8a8bfa87a0905858738dcc172687 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 22:33:01 -0700 Subject: [PATCH 08/39] typo uncovered during tests --- include/activities.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/activities.php b/include/activities.php index 5c1e68720..7b9aa9963 100644 --- a/include/activities.php +++ b/include/activities.php @@ -89,7 +89,7 @@ function profile_activity($changed, $value) { if($i) { // FIXME - limit delivery in notifier.php to those specificed in the perms argument - Zotlabs\Daemon\Master::Summon(array('Notifier','activity', $i, 'PERMS_R_PROFILE'); + Zotlabs\Daemon\Master::Summon(array('Notifier','activity', $i, 'PERMS_R_PROFILE')); } } From 2e83c17e2d4969263dbe87cf1b95faa8e71a7209 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 22:47:20 -0700 Subject: [PATCH 09/39] roll minor version, change example text --- Zotlabs/Daemon/Notifier.php | 2 +- boot.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index d37182a4d..65690f8ce 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -32,7 +32,7 @@ require_once('include/html2plain.php'); /* * The notifier is typically called with: * - * proc_run('php', "include/notifier.php", COMMAND, ITEM_ID); + * Zotlabs\Daemon\Master::Summon(array('Notifier', COMMAND, ITEM_ID)); * * where COMMAND is one of the following: * diff --git a/boot.php b/boot.php index 9b4a7df13..e8a3e1e11 100755 --- a/boot.php +++ b/boot.php @@ -46,7 +46,7 @@ require_once('include/account.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '1.7' ); +define ( 'STD_VERSION', '1.7.1' ); define ( 'ZOT_REVISION', 1 ); define ( 'DB_UPDATE_VERSION', 1168 ); From 2cda18f354b39be138fa8f8f5b0ea0d041ffde61 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 19 May 2016 22:48:32 -0700 Subject: [PATCH 10/39] remove test file --- Zotlabs/Daemon/Rcho.php | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 Zotlabs/Daemon/Rcho.php diff --git a/Zotlabs/Daemon/Rcho.php b/Zotlabs/Daemon/Rcho.php deleted file mode 100644 index 873f0a743..000000000 --- a/Zotlabs/Daemon/Rcho.php +++ /dev/null @@ -1,13 +0,0 @@ - Date: Thu, 19 May 2016 22:59:25 -0700 Subject: [PATCH 11/39] update the installation text for the cron setup --- install/INSTALL.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/install/INSTALL.txt b/install/INSTALL.txt index 18cf4a1db..efcf8c9af 100644 --- a/install/INSTALL.txt +++ b/install/INSTALL.txt @@ -204,17 +204,17 @@ using web forms. **************************************************************************** **************************************************************************** -8. Set up a cron job or scheduled task to run the poller once every 10-15 -minutes to pick up the recent "public" postings of your friends. Example: +8. Set up a cron job or scheduled task to run the Cron manager once every 10-15 +minutes to perform background processing and maintenance. Example: - cd /base/directory; /path/to/php include/poller.php + cd /base/directory; /path/to/php Zotlabs/Daemon/Master.php Cron Change "/base/directory", and "/path/to/php" as appropriate for your situation. If you are using a Linux server, run "crontab -e" and add a line like the one shown, substituting for your unique paths and settings: -*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php +*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php Zotlabs/Daemon/Master.php Cron You can generally find the location of PHP by executing "which php". If you have troubles with this section please contact your hosting provider for From cae380f068ce3c06360b430c84b267414dc02fcf Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 01:21:19 -0700 Subject: [PATCH 12/39] case issue --- boot.php | 2 +- include/network.php | 4 +- util/hmessages.po | 1055 ++++++++++++++++++++++--------------------- 3 files changed, 547 insertions(+), 514 deletions(-) diff --git a/boot.php b/boot.php index e8a3e1e11..79524850e 100755 --- a/boot.php +++ b/boot.php @@ -1814,7 +1814,7 @@ function get_max_import_size() { * * $cmd and string args are surrounded with "" */ -function proc_run($cmd){ +function proc_run(){ $a = get_app(); diff --git a/include/network.php b/include/network.php index 47b04f007..25307f857 100644 --- a/include/network.php +++ b/include/network.php @@ -1922,7 +1922,7 @@ function do_delivery($deliveries) { $deliver[] = $d; if(count($deliver) >= $deliveries_per_process) { - Zotlabs\Daemon\Master::summon(array('Deliver',$deliver)); + Zotlabs\Daemon\Master::Summon(array('Deliver',$deliver)); $deliver = array(); if($interval) @time_sleep_until(microtime(true) + (float) $interval); @@ -1932,7 +1932,7 @@ function do_delivery($deliveries) { // catch any stragglers if($deliver) - Zotlabs\Daemon\Master::summon(array('Deliver',$deliver)); + Zotlabs\Daemon\Master::Summon(array('Deliver',$deliver)); } diff --git a/util/hmessages.po b/util/hmessages.po index 3dd812ae3..abc4d1a9f 100644 --- a/util/hmessages.po +++ b/util/hmessages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-13 00:02-0700\n" +"POT-Creation-Date: 2016-05-20 00:02-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -66,14 +66,14 @@ msgstr "" msgid "Shared" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:303 +#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:305 #: ../../Zotlabs/Module/Blocks.php:156 ../../Zotlabs/Module/Layouts.php:182 #: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:142 #: ../../Zotlabs/Module/Webpages.php:186 msgid "Create" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:305 +#: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:307 #: ../../Zotlabs/Module/Cover_photo.php:357 #: ../../Zotlabs/Module/Photos.php:825 ../../Zotlabs/Module/Photos.php:1367 #: ../../Zotlabs/Module/Profile_photo.php:368 ../../include/widgets.php:1519 @@ -101,7 +101,7 @@ msgstr "" msgid "Last Modified" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Admin.php:2075 +#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Admin.php:2089 #: ../../Zotlabs/Module/Blocks.php:157 #: ../../Zotlabs/Module/Connections.php:290 #: ../../Zotlabs/Module/Connections.php:310 @@ -119,7 +119,7 @@ msgid "Edit" msgstr "" #: ../../Zotlabs/Storage/Browser.php:241 ../../Zotlabs/Module/Admin.php:1043 -#: ../../Zotlabs/Module/Admin.php:1202 ../../Zotlabs/Module/Admin.php:2076 +#: ../../Zotlabs/Module/Admin.php:1202 ../../Zotlabs/Module/Admin.php:2090 #: ../../Zotlabs/Module/Blocks.php:159 #: ../../Zotlabs/Module/Connections.php:263 #: ../../Zotlabs/Module/Connedit.php:573 @@ -133,25 +133,25 @@ msgstr "" msgid "Delete" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:282 +#: ../../Zotlabs/Storage/Browser.php:284 #, php-format msgid "You are using %1$s of your available file storage." msgstr "" -#: ../../Zotlabs/Storage/Browser.php:287 +#: ../../Zotlabs/Storage/Browser.php:289 #, php-format msgid "You are using %1$s of %2$s available file storage. (%3$s%)" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:299 +#: ../../Zotlabs/Storage/Browser.php:301 msgid "WARNING:" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:302 +#: ../../Zotlabs/Storage/Browser.php:304 msgid "Create new folder" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:304 +#: ../../Zotlabs/Storage/Browser.php:306 msgid "Upload file" msgstr "" @@ -197,7 +197,7 @@ msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:256 #: ../../Zotlabs/Module/Profile_photo.php:269 #: ../../Zotlabs/Module/Profiles.php:202 ../../Zotlabs/Module/Profiles.php:600 -#: ../../Zotlabs/Module/Rate.php:115 ../../Zotlabs/Module/Register.php:77 +#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Register.php:77 #: ../../Zotlabs/Module/Regmod.php:21 #: ../../Zotlabs/Module/Service_limits.php:11 #: ../../Zotlabs/Module/Settings.php:572 ../../Zotlabs/Module/Setup.php:238 @@ -208,14 +208,14 @@ msgstr "" #: ../../Zotlabs/Module/Viewconnections.php:26 #: ../../Zotlabs/Module/Viewconnections.php:31 #: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Webpages.php:74 -#: ../../include/photos.php:29 ../../include/chat.php:133 -#: ../../include/items.php:3439 ../../include/attach.php:141 -#: ../../include/attach.php:189 ../../include/attach.php:252 -#: ../../include/attach.php:266 ../../include/attach.php:273 -#: ../../include/attach.php:338 ../../include/attach.php:352 -#: ../../include/attach.php:359 ../../include/attach.php:437 -#: ../../include/attach.php:895 ../../include/attach.php:966 -#: ../../include/attach.php:1118 ../../index.php:174 +#: ../../include/chat.php:133 ../../include/photos.php:29 +#: ../../include/attach.php:141 ../../include/attach.php:189 +#: ../../include/attach.php:252 ../../include/attach.php:266 +#: ../../include/attach.php:273 ../../include/attach.php:338 +#: ../../include/attach.php:352 ../../include/attach.php:359 +#: ../../include/attach.php:437 ../../include/attach.php:895 +#: ../../include/attach.php:966 ../../include/attach.php:1118 +#: ../../include/items.php:3439 ../../index.php:175 msgid "Permission denied." msgstr "" @@ -268,7 +268,7 @@ msgid "Theme settings updated." msgstr "" #: ../../Zotlabs/Module/Admin.php:164 ../../Zotlabs/Module/Admin.php:1239 -#: ../../Zotlabs/Module/Admin.php:1541 ../../Zotlabs/Module/Display.php:44 +#: ../../Zotlabs/Module/Admin.php:1543 ../../Zotlabs/Module/Display.php:44 #: ../../Zotlabs/Module/Filestorage.php:33 ../../Zotlabs/Module/Thing.php:89 #: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3360 msgid "Item not found." @@ -314,8 +314,8 @@ msgstr "" #: ../../Zotlabs/Module/Admin.php:711 ../../Zotlabs/Module/Admin.php:755 #: ../../Zotlabs/Module/Admin.php:1034 ../../Zotlabs/Module/Admin.php:1198 #: ../../Zotlabs/Module/Admin.php:1313 ../../Zotlabs/Module/Admin.php:1403 -#: ../../Zotlabs/Module/Admin.php:1592 ../../Zotlabs/Module/Admin.php:1626 -#: ../../Zotlabs/Module/Admin.php:1711 +#: ../../Zotlabs/Module/Admin.php:1594 ../../Zotlabs/Module/Admin.php:1628 +#: ../../Zotlabs/Module/Admin.php:1713 msgid "Administration" msgstr "" @@ -384,7 +384,7 @@ msgstr "" #: ../../Zotlabs/Module/Settings.php:581 ../../include/dir_fns.php:141 #: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143 #: ../../view/theme/redbasic/php/config.php:105 -#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1619 +#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1633 msgid "No" msgstr "" @@ -404,7 +404,7 @@ msgstr "" #: ../../Zotlabs/Module/Settings.php:581 ../../include/dir_fns.php:141 #: ../../include/dir_fns.php:142 ../../include/dir_fns.php:143 #: ../../view/theme/redbasic/php/config.php:105 -#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1619 +#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1633 msgid "Yes" msgstr "" @@ -431,10 +431,10 @@ msgstr "" #: ../../Zotlabs/Module/Admin.php:492 ../../Zotlabs/Module/Admin.php:688 #: ../../Zotlabs/Module/Admin.php:771 ../../Zotlabs/Module/Admin.php:1036 #: ../../Zotlabs/Module/Admin.php:1200 ../../Zotlabs/Module/Admin.php:1405 -#: ../../Zotlabs/Module/Admin.php:1628 ../../Zotlabs/Module/Admin.php:1713 -#: ../../Zotlabs/Module/Admin.php:2078 ../../Zotlabs/Module/Appman.php:125 +#: ../../Zotlabs/Module/Admin.php:1630 ../../Zotlabs/Module/Admin.php:1715 +#: ../../Zotlabs/Module/Admin.php:2092 ../../Zotlabs/Module/Appman.php:125 #: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Chat.php:194 -#: ../../Zotlabs/Module/Chat.php:236 ../../Zotlabs/Module/Connect.php:97 +#: ../../Zotlabs/Module/Chat.php:236 ../../Zotlabs/Module/Connect.php:98 #: ../../Zotlabs/Module/Connedit.php:734 ../../Zotlabs/Module/Events.php:475 #: ../../Zotlabs/Module/Events.php:672 #: ../../Zotlabs/Module/Filestorage.php:162 @@ -447,7 +447,7 @@ msgstr "" #: ../../Zotlabs/Module/Pdledit.php:66 ../../Zotlabs/Module/Photos.php:677 #: ../../Zotlabs/Module/Photos.php:1052 ../../Zotlabs/Module/Photos.php:1092 #: ../../Zotlabs/Module/Photos.php:1210 ../../Zotlabs/Module/Poke.php:186 -#: ../../Zotlabs/Module/Profiles.php:691 ../../Zotlabs/Module/Rate.php:172 +#: ../../Zotlabs/Module/Profiles.php:691 ../../Zotlabs/Module/Rate.php:170 #: ../../Zotlabs/Module/Settings.php:590 ../../Zotlabs/Module/Settings.php:703 #: ../../Zotlabs/Module/Settings.php:731 ../../Zotlabs/Module/Settings.php:754 #: ../../Zotlabs/Module/Settings.php:842 @@ -994,7 +994,7 @@ msgstr "" #: ../../Zotlabs/Module/Admin.php:1039 ../../Zotlabs/Module/Admin.php:1048 #: ../../Zotlabs/Module/Id.php:17 ../../Zotlabs/Module/Id.php:18 -#: ../../include/contact_selectors.php:81 ../../boot.php:1617 +#: ../../include/contact_selectors.php:81 ../../boot.php:1631 msgid "Email" msgstr "" @@ -1156,11 +1156,11 @@ msgstr "" msgid "Plugin %s enabled." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1282 ../../Zotlabs/Module/Admin.php:1565 +#: ../../Zotlabs/Module/Admin.php:1282 ../../Zotlabs/Module/Admin.php:1567 msgid "Disable" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1285 ../../Zotlabs/Module/Admin.php:1567 +#: ../../Zotlabs/Module/Admin.php:1285 ../../Zotlabs/Module/Admin.php:1569 msgid "Enable" msgstr "" @@ -1169,21 +1169,21 @@ msgstr "" msgid "Plugins" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1315 ../../Zotlabs/Module/Admin.php:1594 +#: ../../Zotlabs/Module/Admin.php:1315 ../../Zotlabs/Module/Admin.php:1596 msgid "Toggle" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1316 ../../Zotlabs/Module/Admin.php:1595 +#: ../../Zotlabs/Module/Admin.php:1316 ../../Zotlabs/Module/Admin.php:1597 #: ../../include/widgets.php:638 ../../include/nav.php:208 #: ../../include/apps.php:166 msgid "Settings" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1323 ../../Zotlabs/Module/Admin.php:1604 +#: ../../Zotlabs/Module/Admin.php:1323 ../../Zotlabs/Module/Admin.php:1606 msgid "Author: " msgstr "" -#: ../../Zotlabs/Module/Admin.php:1324 ../../Zotlabs/Module/Admin.php:1605 +#: ../../Zotlabs/Module/Admin.php:1324 ../../Zotlabs/Module/Admin.php:1607 msgid "Maintainer: " msgstr "" @@ -1243,146 +1243,154 @@ msgid "Cancel" msgstr "" #: ../../Zotlabs/Module/Admin.php:1411 -msgid "Add Plugin Repo" +msgid "Manage Repos" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1417 ../../Zotlabs/Module/Settings.php:77 +#: ../../Zotlabs/Module/Admin.php:1412 +msgid "Installed Plugin Repositories" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1413 +msgid "Install a New Plugin Repository" +msgstr "" + +#: ../../Zotlabs/Module/Admin.php:1419 ../../Zotlabs/Module/Settings.php:77 #: ../../Zotlabs/Module/Settings.php:616 ../../include/apps.php:284 msgid "Update" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1418 +#: ../../Zotlabs/Module/Admin.php:1420 msgid "Switch branch" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1419 ../../Zotlabs/Module/Photos.php:998 +#: ../../Zotlabs/Module/Admin.php:1421 ../../Zotlabs/Module/Photos.php:998 #: ../../Zotlabs/Module/Tagrm.php:137 msgid "Remove" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1530 +#: ../../Zotlabs/Module/Admin.php:1532 msgid "No themes found." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1586 +#: ../../Zotlabs/Module/Admin.php:1588 msgid "Screenshot" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1593 ../../Zotlabs/Module/Admin.php:1627 +#: ../../Zotlabs/Module/Admin.php:1595 ../../Zotlabs/Module/Admin.php:1629 #: ../../include/widgets.php:1389 msgid "Themes" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1632 +#: ../../Zotlabs/Module/Admin.php:1634 msgid "[Experimental]" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1633 +#: ../../Zotlabs/Module/Admin.php:1635 msgid "[Unsupported]" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1657 +#: ../../Zotlabs/Module/Admin.php:1659 msgid "Log settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1712 ../../include/widgets.php:1410 +#: ../../Zotlabs/Module/Admin.php:1714 ../../include/widgets.php:1410 #: ../../include/widgets.php:1420 msgid "Logs" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1714 +#: ../../Zotlabs/Module/Admin.php:1716 msgid "Clear" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1720 +#: ../../Zotlabs/Module/Admin.php:1722 msgid "Debugging" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1721 +#: ../../Zotlabs/Module/Admin.php:1723 msgid "Log file" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1721 +#: ../../Zotlabs/Module/Admin.php:1723 msgid "" "Must be writable by web server. Relative to your Red top-level directory." msgstr "" -#: ../../Zotlabs/Module/Admin.php:1722 +#: ../../Zotlabs/Module/Admin.php:1724 msgid "Log level" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1990 +#: ../../Zotlabs/Module/Admin.php:2004 msgid "New Profile Field" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1991 ../../Zotlabs/Module/Admin.php:2011 +#: ../../Zotlabs/Module/Admin.php:2005 ../../Zotlabs/Module/Admin.php:2025 msgid "Field nickname" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1991 ../../Zotlabs/Module/Admin.php:2011 +#: ../../Zotlabs/Module/Admin.php:2005 ../../Zotlabs/Module/Admin.php:2025 msgid "System name of field" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1992 ../../Zotlabs/Module/Admin.php:2012 +#: ../../Zotlabs/Module/Admin.php:2006 ../../Zotlabs/Module/Admin.php:2026 msgid "Input type" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1993 ../../Zotlabs/Module/Admin.php:2013 +#: ../../Zotlabs/Module/Admin.php:2007 ../../Zotlabs/Module/Admin.php:2027 msgid "Field Name" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1993 ../../Zotlabs/Module/Admin.php:2013 +#: ../../Zotlabs/Module/Admin.php:2007 ../../Zotlabs/Module/Admin.php:2027 msgid "Label on profile pages" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1994 ../../Zotlabs/Module/Admin.php:2014 +#: ../../Zotlabs/Module/Admin.php:2008 ../../Zotlabs/Module/Admin.php:2028 msgid "Help text" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1994 ../../Zotlabs/Module/Admin.php:2014 +#: ../../Zotlabs/Module/Admin.php:2008 ../../Zotlabs/Module/Admin.php:2028 msgid "Additional info (optional)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:1995 ../../Zotlabs/Module/Admin.php:2015 +#: ../../Zotlabs/Module/Admin.php:2009 ../../Zotlabs/Module/Admin.php:2029 #: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:201 #: ../../include/text.php:934 ../../include/text.php:946 msgid "Save" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2004 +#: ../../Zotlabs/Module/Admin.php:2018 msgid "Field definition not found" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2010 +#: ../../Zotlabs/Module/Admin.php:2024 msgid "Edit Profile Field" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2068 ../../include/widgets.php:1391 +#: ../../Zotlabs/Module/Admin.php:2082 ../../include/widgets.php:1391 msgid "Profile Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2069 +#: ../../Zotlabs/Module/Admin.php:2083 msgid "Basic Profile Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2070 +#: ../../Zotlabs/Module/Admin.php:2084 msgid "Advanced Profile Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2070 +#: ../../Zotlabs/Module/Admin.php:2084 msgid "(In addition to basic fields)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2072 +#: ../../Zotlabs/Module/Admin.php:2086 msgid "All available fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2073 +#: ../../Zotlabs/Module/Admin.php:2087 msgid "Custom Fields" msgstr "" -#: ../../Zotlabs/Module/Admin.php:2077 +#: ../../Zotlabs/Module/Admin.php:2091 msgid "Create Custom Field" msgstr "" @@ -1658,7 +1666,7 @@ msgstr "" #: ../../Zotlabs/Module/Chat.php:233 ../../Zotlabs/Module/Filestorage.php:153 #: ../../Zotlabs/Module/Photos.php:671 ../../Zotlabs/Module/Photos.php:1045 #: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:359 -#: ../../include/acl_selectors.php:285 +#: ../../include/acl_selectors.php:288 msgid "Permissions" msgstr "" @@ -1704,46 +1712,46 @@ msgstr "" msgid "No connections in common." msgstr "" -#: ../../Zotlabs/Module/Connect.php:60 ../../Zotlabs/Module/Connect.php:108 +#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109 msgid "Continue" msgstr "" -#: ../../Zotlabs/Module/Connect.php:89 +#: ../../Zotlabs/Module/Connect.php:90 msgid "Premium Channel Setup" msgstr "" -#: ../../Zotlabs/Module/Connect.php:91 +#: ../../Zotlabs/Module/Connect.php:92 msgid "Enable premium channel connection restrictions" msgstr "" -#: ../../Zotlabs/Module/Connect.php:92 +#: ../../Zotlabs/Module/Connect.php:93 msgid "" "Please enter your restrictions or conditions, such as paypal receipt, usage " "guidelines, etc." msgstr "" -#: ../../Zotlabs/Module/Connect.php:94 ../../Zotlabs/Module/Connect.php:114 +#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115 msgid "" "This channel may require additional steps or acknowledgement of the " "following conditions prior to connecting:" msgstr "" -#: ../../Zotlabs/Module/Connect.php:95 +#: ../../Zotlabs/Module/Connect.php:96 msgid "" "Potential connections will then see the following text before proceeding:" msgstr "" -#: ../../Zotlabs/Module/Connect.php:96 ../../Zotlabs/Module/Connect.php:117 +#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118 msgid "" "By continuing, I certify that I have complied with any instructions provided " "on this page." msgstr "" -#: ../../Zotlabs/Module/Connect.php:105 +#: ../../Zotlabs/Module/Connect.php:106 msgid "(No specific instructions have been provided by the channel owner.)" msgstr "" -#: ../../Zotlabs/Module/Connect.php:113 +#: ../../Zotlabs/Module/Connect.php:114 msgid "Restricted or Premium Channel" msgstr "" @@ -1869,9 +1877,9 @@ msgid "Connections" msgstr "" #: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44 -#: ../../include/acl_selectors.php:278 ../../include/nav.php:165 -#: ../../include/text.php:933 ../../include/text.php:945 -#: ../../include/apps.php:179 +#: ../../include/nav.php:165 ../../include/text.php:933 +#: ../../include/text.php:945 ../../include/apps.php:179 +#: ../../include/acl_selectors.php:281 msgid "Search" msgstr "" @@ -2021,9 +2029,9 @@ msgstr "" #: ../../Zotlabs/Module/Connedit.php:595 ../../Zotlabs/Module/Settings.php:342 #: ../../Zotlabs/Module/Settings.php:346 ../../Zotlabs/Module/Settings.php:347 #: ../../Zotlabs/Module/Settings.php:350 ../../Zotlabs/Module/Settings.php:361 +#: ../../include/profile_selectors.php:80 ../../include/widgets.php:495 #: ../../include/identity.php:389 ../../include/identity.php:390 -#: ../../include/identity.php:397 ../../include/profile_selectors.php:80 -#: ../../include/widgets.php:495 +#: ../../include/identity.php:397 msgid "Friends" msgstr "" @@ -2094,7 +2102,7 @@ msgstr "" msgid "Slide to adjust your degree of friendship" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Module/Rate.php:161 +#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Module/Rate.php:159 #: ../../include/js_strings.php:20 msgid "Rating" msgstr "" @@ -2314,8 +2322,8 @@ msgstr "" msgid "Age:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:311 ../../include/identity.php:1029 -#: ../../include/event.php:52 ../../include/text.php:1481 +#: ../../Zotlabs/Module/Directory.php:311 ../../include/event.php:52 +#: ../../include/identity.php:1029 ../../include/text.php:1481 #: ../../include/bb2diaspora.php:509 msgid "Location:" msgstr "" @@ -2333,9 +2341,9 @@ msgid "About:" msgstr "" #: ../../Zotlabs/Module/Directory.php:325 ../../Zotlabs/Module/Match.php:68 -#: ../../Zotlabs/Module/Suggest.php:56 ../../include/identity.php:1014 +#: ../../Zotlabs/Module/Suggest.php:56 ../../include/Contact.php:101 #: ../../include/widgets.php:147 ../../include/widgets.php:184 -#: ../../include/Contact.php:101 ../../include/conversation.php:961 +#: ../../include/identity.php:1014 ../../include/conversation.php:961 msgid "Connect" msgstr "" @@ -2416,7 +2424,7 @@ msgstr "" #: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Import_items.php:112 #: ../../Zotlabs/Module/Like.php:284 ../../Zotlabs/Module/Profperm.php:28 #: ../../Zotlabs/Module/Subthread.php:62 ../../include/items.php:383 -#: ../../index.php:173 +#: ../../index.php:174 msgid "Permission denied" msgstr "" @@ -3340,7 +3348,7 @@ msgid "" "Password reset failed." msgstr "" -#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1623 +#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1637 msgid "Password Reset" msgstr "" @@ -4213,8 +4221,8 @@ msgctxt "noun" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1263 ../../include/acl_selectors.php:287 -#: ../../include/ItemObject.php:384 +#: ../../Zotlabs/Module/Photos.php:1263 ../../include/ItemObject.php:384 +#: ../../include/acl_selectors.php:290 msgid "Close" msgstr "" @@ -4606,6 +4614,10 @@ msgstr "" msgid "Registration Policy" msgstr "" +#: ../../Zotlabs/Module/Pubsites.php:31 +msgid "Software" +msgstr "" + #: ../../Zotlabs/Module/Pubsites.php:31 ../../Zotlabs/Module/Ratings.php:103 #: ../../include/conversation.php:964 msgid "Ratings" @@ -4615,20 +4627,20 @@ msgstr "" msgid "Rate" msgstr "" -#: ../../Zotlabs/Module/Rate.php:162 +#: ../../Zotlabs/Module/Rate.php:160 msgid "Website:" msgstr "" -#: ../../Zotlabs/Module/Rate.php:165 +#: ../../Zotlabs/Module/Rate.php:163 #, php-format msgid "Remote Channel [%s] (not yet known on this site)" msgstr "" -#: ../../Zotlabs/Module/Rate.php:166 +#: ../../Zotlabs/Module/Rate.php:164 msgid "Rating (this information is public)" msgstr "" -#: ../../Zotlabs/Module/Rate.php:167 +#: ../../Zotlabs/Module/Rate.php:165 msgid "Optionally explain your rating (this information is public)" msgstr "" @@ -4751,7 +4763,7 @@ msgid "Membership on this site is by invitation only." msgstr "" #: ../../Zotlabs/Module/Register.php:262 ../../include/nav.php:147 -#: ../../boot.php:1597 +#: ../../boot.php:1611 msgid "Register" msgstr "" @@ -5264,9 +5276,21 @@ msgstr "" msgid "Expire other channel content after this many days" msgstr "" +#: ../../Zotlabs/Module/Settings.php:1065 +msgid "0 or blank to use the website limit." +msgstr "" + #: ../../Zotlabs/Module/Settings.php:1065 #, php-format -msgid "0 or blank to use the website limit. The website expires after %d days." +msgid "This website expires after %d days." +msgstr "" + +#: ../../Zotlabs/Module/Settings.php:1065 +msgid "This website does not expire imported content." +msgstr "" + +#: ../../Zotlabs/Module/Settings.php:1065 +msgid "The website limit takes precedence if lower than your limit." msgstr "" #: ../../Zotlabs/Module/Settings.php:1066 @@ -5278,11 +5302,11 @@ msgid "May reduce spam activity" msgstr "" #: ../../Zotlabs/Module/Settings.php:1067 -msgid "Default Post Permissions" +msgid "Default Post and Publish Permissions" msgstr "" #: ../../Zotlabs/Module/Settings.php:1069 -msgid "Use my default audience setting for the type of post" +msgid "Use my default audience setting for the type of object published" msgstr "" #: ../../Zotlabs/Module/Settings.php:1072 @@ -6255,191 +6279,13 @@ msgstr "" msgid "Unable to create a unique channel address. Import failed." msgstr "" -#: ../../include/dba/dba_driver.php:142 +#: ../../include/dba/dba_driver.php:159 #, php-format msgid "Cannot locate DNS info for database server '%s'" msgstr "" -#: ../../include/identity.php:32 -msgid "Unable to obtain identity information from database" -msgstr "" - -#: ../../include/identity.php:66 -msgid "Empty name" -msgstr "" - -#: ../../include/identity.php:69 -msgid "Name too long" -msgstr "" - -#: ../../include/identity.php:180 -msgid "No account identifier" -msgstr "" - -#: ../../include/identity.php:192 -msgid "Nickname is required." -msgstr "" - -#: ../../include/identity.php:206 -msgid "Reserved nickname. Please choose another." -msgstr "" - -#: ../../include/identity.php:211 -msgid "" -"Nickname has unsupported characters or is already being used on this site." -msgstr "" - -#: ../../include/identity.php:287 -msgid "Unable to retrieve created identity" -msgstr "" - -#: ../../include/identity.php:345 -msgid "Default Profile" -msgstr "" - -#: ../../include/identity.php:791 -msgid "Requested channel is not available." -msgstr "" - -#: ../../include/identity.php:938 -msgid "Create New Profile" -msgstr "" - -#: ../../include/identity.php:941 ../../include/nav.php:90 -msgid "Edit Profile" -msgstr "" - -#: ../../include/identity.php:958 -msgid "Visible to everybody" -msgstr "" - -#: ../../include/identity.php:1033 ../../include/identity.php:1288 -msgid "Gender:" -msgstr "" - -#: ../../include/identity.php:1034 ../../include/identity.php:1332 -msgid "Status:" -msgstr "" - -#: ../../include/identity.php:1035 ../../include/identity.php:1343 -msgid "Homepage:" -msgstr "" - -#: ../../include/identity.php:1036 -msgid "Online Now" -msgstr "" - -#: ../../include/identity.php:1124 ../../include/identity.php:1200 -msgid "F d" -msgstr "" - -#: ../../include/identity.php:1180 -msgid "Birthday Reminders" -msgstr "" - -#: ../../include/identity.php:1181 -msgid "Birthdays this week:" -msgstr "" - -#: ../../include/identity.php:1232 -msgid "[No description]" -msgstr "" - -#: ../../include/identity.php:1250 -msgid "Event Reminders" -msgstr "" - -#: ../../include/identity.php:1251 -msgid "Events this week:" -msgstr "" - -#: ../../include/identity.php:1293 -msgid "Like this channel" -msgstr "" - -#: ../../include/identity.php:1317 -msgid "j F, Y" -msgstr "" - -#: ../../include/identity.php:1318 -msgid "j F" -msgstr "" - -#: ../../include/identity.php:1325 -msgid "Birthday:" -msgstr "" - -#: ../../include/identity.php:1338 -#, php-format -msgid "for %1$d %2$s" -msgstr "" - -#: ../../include/identity.php:1341 -msgid "Sexual Preference:" -msgstr "" - -#: ../../include/identity.php:1347 -msgid "Tags:" -msgstr "" - -#: ../../include/identity.php:1349 -msgid "Political Views:" -msgstr "" - -#: ../../include/identity.php:1351 -msgid "Religion:" -msgstr "" - -#: ../../include/identity.php:1355 -msgid "Hobbies/Interests:" -msgstr "" - -#: ../../include/identity.php:1357 -msgid "Likes:" -msgstr "" - -#: ../../include/identity.php:1359 -msgid "Dislikes:" -msgstr "" - -#: ../../include/identity.php:1361 -msgid "Contact information and Social Networks:" -msgstr "" - -#: ../../include/identity.php:1363 -msgid "My other channels:" -msgstr "" - -#: ../../include/identity.php:1365 -msgid "Musical interests:" -msgstr "" - -#: ../../include/identity.php:1367 -msgid "Books, literature:" -msgstr "" - -#: ../../include/identity.php:1369 -msgid "Television:" -msgstr "" - -#: ../../include/identity.php:1371 -msgid "Film/dance/culture/entertainment:" -msgstr "" - -#: ../../include/identity.php:1373 -msgid "Love/Romance:" -msgstr "" - -#: ../../include/identity.php:1375 -msgid "Work/employment:" -msgstr "" - -#: ../../include/identity.php:1377 -msgid "School/education:" -msgstr "" - -#: ../../include/identity.php:1397 -msgid "Like this thing" +#: ../../include/api.php:1338 +msgid "Public Timeline" msgstr "" #: ../../include/notify.php:20 @@ -6459,40 +6305,6 @@ msgstr "" msgid "Embedding disabled" msgstr "" -#: ../../include/acl_selectors.php:236 -#: ../../include/PermissionDescription.php:31 -msgid "Visible to your default audience" -msgstr "" - -#: ../../include/acl_selectors.php:274 -msgid "Limit access:" -msgstr "" - -#: ../../include/acl_selectors.php:275 -msgid "" -"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit " -"the scope of \"Show\"." -msgstr "" - -#: ../../include/acl_selectors.php:276 -msgid "Show" -msgstr "" - -#: ../../include/acl_selectors.php:277 -msgid "Don't show" -msgstr "" - -#: ../../include/acl_selectors.php:283 -msgid "Other networks and post services" -msgstr "" - -#: ../../include/acl_selectors.php:313 -#, php-format -msgid "" -"Post permissions %s cannot be changed %s after a post is shared.
These " -"permissions set who is allowed to view the post." -msgstr "" - #: ../../include/profile_selectors.php:6 msgid "Currently Male" msgstr "" @@ -6726,27 +6538,34 @@ msgstr "" msgid "Ask me" msgstr "" -#: ../../include/activities.php:42 -msgid " and " +#: ../../include/Contact.php:118 +msgid "New window" msgstr "" -#: ../../include/activities.php:50 -msgid "public profile" +#: ../../include/Contact.php:119 +msgid "Open the selected location in a different window or browser tab" msgstr "" -#: ../../include/activities.php:59 +#: ../../include/Contact.php:237 #, php-format -msgid "%1$s changed %2$s to “%3$s”" +msgid "User '%s' deleted" msgstr "" -#: ../../include/activities.php:60 -#, php-format -msgid "Visit %1$s's %2$s" +#: ../../include/zot.php:680 +msgid "Invalid data packet" msgstr "" -#: ../../include/activities.php:63 +#: ../../include/zot.php:696 +msgid "Unable to verify channel signature" +msgstr "" + +#: ../../include/zot.php:2342 #, php-format -msgid "%1$s has an updated %2$s, changing %3$s." +msgid "Unable to verify site signature for %s" +msgstr "" + +#: ../../include/zot.php:3680 +msgid "invalid target signature" msgstr "" #: ../../include/contact_widgets.php:14 @@ -6850,63 +6669,6 @@ msgstr "" msgid "Cancelled" msgstr "" -#: ../../include/photos.php:112 -#, php-format -msgid "Image exceeds website size limit of %lu bytes" -msgstr "" - -#: ../../include/photos.php:119 -msgid "Image file is empty." -msgstr "" - -#: ../../include/photos.php:257 -msgid "Photo storage failed." -msgstr "" - -#: ../../include/photos.php:297 -msgid "a new photo" -msgstr "" - -#: ../../include/photos.php:301 -#, php-format -msgctxt "photo_upload" -msgid "%1$s posted %2$s to %3$s" -msgstr "" - -#: ../../include/photos.php:506 ../../include/conversation.php:1641 -msgid "Photo Albums" -msgstr "" - -#: ../../include/photos.php:510 -msgid "Upload New Photos" -msgstr "" - -#: ../../include/import.php:27 -msgid "" -"Cannot create a duplicate channel identifier on this system. Import failed." -msgstr "" - -#: ../../include/import.php:74 -msgid "Channel clone failed. Import failed." -msgstr "" - -#: ../../include/zot.php:680 -msgid "Invalid data packet" -msgstr "" - -#: ../../include/zot.php:696 -msgid "Unable to verify channel signature" -msgstr "" - -#: ../../include/zot.php:2342 -#, php-format -msgid "Unable to verify site signature for %s" -msgstr "" - -#: ../../include/zot.php:3680 -msgid "invalid target signature" -msgstr "" - #: ../../include/widgets.php:103 msgid "System" msgstr "" @@ -7190,25 +6952,186 @@ msgstr "" msgid "Room is full" msgstr "" -#: ../../include/Contact.php:118 -msgid "New window" +#: ../../include/identity.php:32 +msgid "Unable to obtain identity information from database" msgstr "" -#: ../../include/Contact.php:119 -msgid "Open the selected location in a different window or browser tab" +#: ../../include/identity.php:66 +msgid "Empty name" msgstr "" -#: ../../include/Contact.php:237 +#: ../../include/identity.php:69 +msgid "Name too long" +msgstr "" + +#: ../../include/identity.php:180 +msgid "No account identifier" +msgstr "" + +#: ../../include/identity.php:192 +msgid "Nickname is required." +msgstr "" + +#: ../../include/identity.php:206 +msgid "Reserved nickname. Please choose another." +msgstr "" + +#: ../../include/identity.php:211 +msgid "" +"Nickname has unsupported characters or is already being used on this site." +msgstr "" + +#: ../../include/identity.php:287 +msgid "Unable to retrieve created identity" +msgstr "" + +#: ../../include/identity.php:345 +msgid "Default Profile" +msgstr "" + +#: ../../include/identity.php:791 +msgid "Requested channel is not available." +msgstr "" + +#: ../../include/identity.php:938 +msgid "Create New Profile" +msgstr "" + +#: ../../include/identity.php:941 ../../include/nav.php:90 +msgid "Edit Profile" +msgstr "" + +#: ../../include/identity.php:958 +msgid "Visible to everybody" +msgstr "" + +#: ../../include/identity.php:1033 ../../include/identity.php:1288 +msgid "Gender:" +msgstr "" + +#: ../../include/identity.php:1034 ../../include/identity.php:1332 +msgid "Status:" +msgstr "" + +#: ../../include/identity.php:1035 ../../include/identity.php:1343 +msgid "Homepage:" +msgstr "" + +#: ../../include/identity.php:1036 +msgid "Online Now" +msgstr "" + +#: ../../include/identity.php:1124 ../../include/identity.php:1200 +msgid "F d" +msgstr "" + +#: ../../include/identity.php:1180 +msgid "Birthday Reminders" +msgstr "" + +#: ../../include/identity.php:1181 +msgid "Birthdays this week:" +msgstr "" + +#: ../../include/identity.php:1232 +msgid "[No description]" +msgstr "" + +#: ../../include/identity.php:1250 +msgid "Event Reminders" +msgstr "" + +#: ../../include/identity.php:1251 +msgid "Events this week:" +msgstr "" + +#: ../../include/identity.php:1293 +msgid "Like this channel" +msgstr "" + +#: ../../include/identity.php:1317 +msgid "j F, Y" +msgstr "" + +#: ../../include/identity.php:1318 +msgid "j F" +msgstr "" + +#: ../../include/identity.php:1325 +msgid "Birthday:" +msgstr "" + +#: ../../include/identity.php:1338 #, php-format -msgid "User '%s' deleted" +msgid "for %1$d %2$s" msgstr "" -#: ../../include/auth.php:105 -msgid "Logged out." +#: ../../include/identity.php:1341 +msgid "Sexual Preference:" msgstr "" -#: ../../include/auth.php:212 -msgid "Failed authentication" +#: ../../include/identity.php:1347 +msgid "Tags:" +msgstr "" + +#: ../../include/identity.php:1349 +msgid "Political Views:" +msgstr "" + +#: ../../include/identity.php:1351 +msgid "Religion:" +msgstr "" + +#: ../../include/identity.php:1355 +msgid "Hobbies/Interests:" +msgstr "" + +#: ../../include/identity.php:1357 +msgid "Likes:" +msgstr "" + +#: ../../include/identity.php:1359 +msgid "Dislikes:" +msgstr "" + +#: ../../include/identity.php:1361 +msgid "Contact information and Social Networks:" +msgstr "" + +#: ../../include/identity.php:1363 +msgid "My other channels:" +msgstr "" + +#: ../../include/identity.php:1365 +msgid "Musical interests:" +msgstr "" + +#: ../../include/identity.php:1367 +msgid "Books, literature:" +msgstr "" + +#: ../../include/identity.php:1369 +msgid "Television:" +msgstr "" + +#: ../../include/identity.php:1371 +msgid "Film/dance/culture/entertainment:" +msgstr "" + +#: ../../include/identity.php:1373 +msgid "Love/Romance:" +msgstr "" + +#: ../../include/identity.php:1375 +msgid "Work/employment:" +msgstr "" + +#: ../../include/identity.php:1377 +msgid "School/education:" +msgstr "" + +#: ../../include/identity.php:1397 +msgid "Like this thing" msgstr "" #: ../../include/security.php:383 @@ -7217,61 +7140,38 @@ msgid "" "form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: ../../include/items.php:890 ../../include/items.php:935 -msgid "(Unknown)" -msgstr "" - -#: ../../include/items.php:1134 -msgid "Visible to anybody on the internet." -msgstr "" - -#: ../../include/items.php:1136 -msgid "Visible to you only." -msgstr "" - -#: ../../include/items.php:1138 -msgid "Visible to anybody in this network." -msgstr "" - -#: ../../include/items.php:1140 -msgid "Visible to anybody authenticated." -msgstr "" - -#: ../../include/items.php:1142 +#: ../../include/photos.php:112 #, php-format -msgid "Visible to anybody on %s." +msgid "Image exceeds website size limit of %lu bytes" msgstr "" -#: ../../include/items.php:1144 -msgid "Visible to all connections." +#: ../../include/photos.php:119 +msgid "Image file is empty." msgstr "" -#: ../../include/items.php:1146 -msgid "Visible to approved connections." +#: ../../include/photos.php:257 +msgid "Photo storage failed." msgstr "" -#: ../../include/items.php:1148 -msgid "Visible to specific connections." +#: ../../include/photos.php:297 +msgid "a new photo" msgstr "" -#: ../../include/items.php:3910 -msgid "Privacy group is empty." -msgstr "" - -#: ../../include/items.php:3917 +#: ../../include/photos.php:301 #, php-format -msgid "Privacy group: %s" +msgctxt "photo_upload" +msgid "%1$s posted %2$s to %3$s" msgstr "" -#: ../../include/items.php:3929 -msgid "Connection not found." +#: ../../include/photos.php:506 ../../include/conversation.php:1641 +msgid "Photo Albums" msgstr "" -#: ../../include/items.php:4278 -msgid "profile photo" +#: ../../include/photos.php:510 +msgid "Upload New Photos" msgstr "" -#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1614 +#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1628 msgid "Logout" msgstr "" @@ -7327,7 +7227,7 @@ msgstr "" msgid "Your webpages" msgstr "" -#: ../../include/nav.php:110 ../../include/apps.php:163 ../../boot.php:1615 +#: ../../include/nav.php:110 ../../include/apps.php:163 ../../boot.php:1629 msgid "Login" msgstr "" @@ -7469,36 +7369,6 @@ msgstr "" msgid "Please wait..." msgstr "" -#: ../../include/network.php:659 -msgid "view full size" -msgstr "" - -#: ../../include/network.php:1827 ../../include/enotify.php:57 -msgid "$Projectname Notification" -msgstr "" - -#: ../../include/network.php:1828 ../../include/enotify.php:58 -msgid "$projectname" -msgstr "" - -#: ../../include/network.php:1830 ../../include/enotify.php:60 -msgid "Thank You," -msgstr "" - -#: ../../include/network.php:1832 ../../include/enotify.php:62 -#, php-format -msgid "%s Administrator" -msgstr "" - -#: ../../include/network.php:1875 ../../include/account.php:317 -#: ../../include/account.php:344 ../../include/account.php:404 -msgid "Administrator" -msgstr "" - -#: ../../include/network.php:1889 -msgid "No Subject" -msgstr "" - #: ../../include/contact_selectors.php:56 msgid "Frequently" msgstr "" @@ -7564,6 +7434,14 @@ msgstr "" msgid "MySpace" msgstr "" +#: ../../include/auth.php:105 +msgid "Logged out." +msgstr "" + +#: ../../include/auth.php:212 +msgid "Failed authentication" +msgstr "" + #: ../../include/attach.php:247 ../../include/attach.php:333 msgid "Item was not found." msgstr "" @@ -7638,7 +7516,7 @@ msgstr "" msgid "YYYY-MM-DD or MM-DD" msgstr "" -#: ../../include/datetime.php:273 ../../boot.php:2463 +#: ../../include/datetime.php:273 ../../boot.php:2399 msgid "never" msgstr "" @@ -7727,6 +7605,23 @@ msgstr "" msgid "This Website Only" msgstr "" +#: ../../include/enotify.php:57 ../../include/network.php:1831 +msgid "$Projectname Notification" +msgstr "" + +#: ../../include/enotify.php:58 ../../include/network.php:1832 +msgid "$projectname" +msgstr "" + +#: ../../include/enotify.php:60 ../../include/network.php:1834 +msgid "Thank You," +msgstr "" + +#: ../../include/enotify.php:62 ../../include/network.php:1836 +#, php-format +msgid "%s Administrator" +msgstr "" + #: ../../include/enotify.php:96 #, php-format msgid "%s " @@ -8080,6 +7975,57 @@ msgstr "" msgid "Video" msgstr "" +#: ../../include/activities.php:42 +msgid " and " +msgstr "" + +#: ../../include/activities.php:50 +msgid "public profile" +msgstr "" + +#: ../../include/activities.php:59 +#, php-format +msgid "%1$s changed %2$s to “%3$s”" +msgstr "" + +#: ../../include/activities.php:60 +#, php-format +msgid "Visit %1$s's %2$s" +msgstr "" + +#: ../../include/activities.php:63 +#, php-format +msgid "%1$s has an updated %2$s, changing %3$s." +msgstr "" + +#: ../../include/follow.php:28 +msgid "Channel is blocked on this site." +msgstr "" + +#: ../../include/follow.php:33 +msgid "Channel location missing." +msgstr "" + +#: ../../include/follow.php:82 +msgid "Response from remote channel was incomplete." +msgstr "" + +#: ../../include/follow.php:99 +msgid "Channel was deleted and no longer exists." +msgstr "" + +#: ../../include/follow.php:155 ../../include/follow.php:191 +msgid "Protocol disabled." +msgstr "" + +#: ../../include/follow.php:179 +msgid "Channel discovery failed." +msgstr "" + +#: ../../include/follow.php:217 +msgid "Cannot connect to yourself." +msgstr "" + #: ../../include/features.php:48 msgid "General Features" msgstr "" @@ -8359,32 +8305,33 @@ msgstr "" msgid "Provide a personal tag cloud on your channel page" msgstr "" -#: ../../include/follow.php:28 -msgid "Channel is blocked on this site." +#: ../../include/message.php:20 +msgid "No recipient provided." msgstr "" -#: ../../include/follow.php:33 -msgid "Channel location missing." +#: ../../include/message.php:25 +msgid "[no subject]" msgstr "" -#: ../../include/follow.php:82 -msgid "Response from remote channel was incomplete." +#: ../../include/message.php:45 +msgid "Unable to determine sender." msgstr "" -#: ../../include/follow.php:99 -msgid "Channel was deleted and no longer exists." +#: ../../include/message.php:222 +msgid "Stored post could not be verified." msgstr "" -#: ../../include/follow.php:155 ../../include/follow.php:191 -msgid "Protocol disabled." +#: ../../include/network.php:659 +msgid "view full size" msgstr "" -#: ../../include/follow.php:179 -msgid "Channel discovery failed." +#: ../../include/network.php:1879 ../../include/account.php:317 +#: ../../include/account.php:344 ../../include/account.php:404 +msgid "Administrator" msgstr "" -#: ../../include/follow.php:217 -msgid "Cannot connect to yourself." +#: ../../include/network.php:1893 +msgid "No Subject" msgstr "" #: ../../include/group.php:26 @@ -9113,7 +9060,13 @@ msgstr "" msgid "dislikes" msgstr "" +#: ../../include/PermissionDescription.php:31 +#: ../../include/acl_selectors.php:236 +msgid "Visible to your default audience" +msgstr "" + #: ../../include/PermissionDescription.php:115 +#: ../../include/acl_selectors.php:272 msgid "Only me" msgstr "" @@ -9134,39 +9087,39 @@ msgstr "" msgid "Any of my connections" msgstr "" -#: ../../include/PermissionDescription.php:124 -msgid "Only me (only specified contacts and me)" +#: ../../include/PermissionDescription.php:120 +msgid "Only connections I specifically allow" msgstr "" -#: ../../include/PermissionDescription.php:125 +#: ../../include/PermissionDescription.php:121 msgid "Anybody authenticated (could include visitors from other networks)" msgstr "" -#: ../../include/PermissionDescription.php:126 +#: ../../include/PermissionDescription.php:122 msgid "Any connections including those who haven't yet been approved" msgstr "" -#: ../../include/PermissionDescription.php:169 +#: ../../include/PermissionDescription.php:161 msgid "" "This is your default setting for the audience of your normal stream, and " "posts." msgstr "" -#: ../../include/PermissionDescription.php:170 +#: ../../include/PermissionDescription.php:162 msgid "" "This is your default setting for who can view your default channel profile" msgstr "" -#: ../../include/PermissionDescription.php:171 +#: ../../include/PermissionDescription.php:163 msgid "This is your default setting for who can view your connections" msgstr "" -#: ../../include/PermissionDescription.php:172 +#: ../../include/PermissionDescription.php:164 msgid "" "This is your default setting for who can view your file storage and photos" msgstr "" -#: ../../include/PermissionDescription.php:173 +#: ../../include/PermissionDescription.php:165 msgid "This is your default setting for the audience of your webpages" msgstr "" @@ -9414,24 +9367,67 @@ msgctxt "calendar" msgid "All day" msgstr "" -#: ../../include/message.php:20 -msgid "No recipient provided." +#: ../../include/import.php:27 +msgid "" +"Cannot create a duplicate channel identifier on this system. Import failed." msgstr "" -#: ../../include/message.php:25 -msgid "[no subject]" +#: ../../include/import.php:74 +msgid "Channel clone failed. Import failed." msgstr "" -#: ../../include/message.php:45 -msgid "Unable to determine sender." +#: ../../include/items.php:890 ../../include/items.php:935 +msgid "(Unknown)" msgstr "" -#: ../../include/message.php:222 -msgid "Stored post could not be verified." +#: ../../include/items.php:1134 +msgid "Visible to anybody on the internet." msgstr "" -#: ../../include/api.php:1338 -msgid "Public Timeline" +#: ../../include/items.php:1136 +msgid "Visible to you only." +msgstr "" + +#: ../../include/items.php:1138 +msgid "Visible to anybody in this network." +msgstr "" + +#: ../../include/items.php:1140 +msgid "Visible to anybody authenticated." +msgstr "" + +#: ../../include/items.php:1142 +#, php-format +msgid "Visible to anybody on %s." +msgstr "" + +#: ../../include/items.php:1144 +msgid "Visible to all connections." +msgstr "" + +#: ../../include/items.php:1146 +msgid "Visible to approved connections." +msgstr "" + +#: ../../include/items.php:1148 +msgid "Visible to specific connections." +msgstr "" + +#: ../../include/items.php:3910 +msgid "Privacy group is empty." +msgstr "" + +#: ../../include/items.php:3917 +#, php-format +msgid "Privacy group: %s" +msgstr "" + +#: ../../include/items.php:3929 +msgid "Connection not found." +msgstr "" + +#: ../../include/items.php:4278 +msgid "profile photo" msgstr "" #: ../../include/page_widgets.php:6 @@ -9638,6 +9634,43 @@ msgstr "" msgid "$Projectname event notification:" msgstr "" +#: ../../include/acl_selectors.php:273 +msgid "Add others" +msgstr "" + +#: ../../include/acl_selectors.php:276 +msgid "Who can see this?" +msgstr "" + +#: ../../include/acl_selectors.php:277 +msgid "Custom selection" +msgstr "" + +#: ../../include/acl_selectors.php:278 +msgid "" +"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit " +"the scope of \"Show\"." +msgstr "" + +#: ../../include/acl_selectors.php:279 +msgid "Show" +msgstr "" + +#: ../../include/acl_selectors.php:280 +msgid "Don't show" +msgstr "" + +#: ../../include/acl_selectors.php:286 +msgid "Other networks and post services" +msgstr "" + +#: ../../include/acl_selectors.php:316 +#, php-format +msgid "" +"Post permissions %s cannot be changed %s after a post is shared.
These " +"permissions set who is allowed to view the post." +msgstr "" + #: ../../view/theme/redbasic/php/config.php:82 msgid "Focus (Hubzilla default)" msgstr "" @@ -9774,62 +9807,62 @@ msgstr "" msgid "Set size of followup author photos" msgstr "" -#: ../../boot.php:1075 +#: ../../boot.php:1089 #, php-format msgctxt "opensearch" msgid "Search %1$s (%2$s)" msgstr "" -#: ../../boot.php:1075 +#: ../../boot.php:1089 msgctxt "opensearch" msgid "$Projectname" msgstr "" -#: ../../boot.php:1392 +#: ../../boot.php:1406 #, php-format msgid "Update %s failed. See error logs." msgstr "" -#: ../../boot.php:1395 +#: ../../boot.php:1409 #, php-format msgid "Update Error at %s" msgstr "" -#: ../../boot.php:1596 +#: ../../boot.php:1610 msgid "" "Create an account to access services and applications within the Hubzilla" msgstr "" -#: ../../boot.php:1618 +#: ../../boot.php:1632 msgid "Password" msgstr "" -#: ../../boot.php:1619 +#: ../../boot.php:1633 msgid "Remember me" msgstr "" -#: ../../boot.php:1622 +#: ../../boot.php:1636 msgid "Forgot your password?" msgstr "" -#: ../../boot.php:2269 +#: ../../boot.php:2205 msgid "toggle mobile" msgstr "" -#: ../../boot.php:2422 +#: ../../boot.php:2358 msgid "Website SSL certificate is not valid. Please correct." msgstr "" -#: ../../boot.php:2425 +#: ../../boot.php:2361 #, php-format msgid "[hubzilla] Website SSL error for %s" msgstr "" -#: ../../boot.php:2462 +#: ../../boot.php:2398 msgid "Cron/Scheduled tasks not running." msgstr "" -#: ../../boot.php:2466 +#: ../../boot.php:2402 #, php-format msgid "[hubzilla] Cron tasks not running on %s" msgstr "" From fdece3b1026ebe0a1e7512bdbd24028aef699318 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 01:33:34 -0700 Subject: [PATCH 13/39] add some backtrace to find the issue --- boot.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 79524850e..5d2f1d744 100755 --- a/boot.php +++ b/boot.php @@ -1864,8 +1864,13 @@ function proc_run(){ } } - for($x = 0; $x < count($args); $x++) + for($x = 0; $x < count($args); $x++) { + if(is_array($args[$x])) { + logger('ERROR: shell args is array . ' . print_r($args,true)); + btlogger('args:'); + } $args[$x] = escapeshellarg($args[$x]); + } $cmdline = implode($args," "); From aefeda8c416f8aed34a187a5ca2408598add864f Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 01:45:29 -0700 Subject: [PATCH 14/39] recurse one more level of array when processing args --- boot.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 5d2f1d744..3ab5905ff 100755 --- a/boot.php +++ b/boot.php @@ -1829,7 +1829,14 @@ function proc_run(){ foreach($args as $arg) { if(is_array($arg)) { foreach($arg as $n) { - $newargs[] = $n; + if(is_array($n)) { + foreach($n as $w) { + $newargs[] = $w; + } + } + else { + $newargs[] = $n; + } } } else From b2f0d2d085c355010f1475269c4beb4fba7b07dc Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 17:44:26 -0700 Subject: [PATCH 15/39] cleanup proc_run after messing it up with debugging yesterday --- boot.php | 38 ++++++-------------------------------- include/smarty.php | 5 +++-- include/text.php | 29 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/boot.php b/boot.php index 3ab5905ff..10244b0d0 100755 --- a/boot.php +++ b/boot.php @@ -1816,38 +1816,19 @@ function get_max_import_size() { */ function proc_run(){ - $a = get_app(); - $args = func_get_args(); $newargs = array(); + if(! count($args)) return; - // expand any arrays - - foreach($args as $arg) { - if(is_array($arg)) { - foreach($arg as $n) { - if(is_array($n)) { - foreach($n as $w) { - $newargs[] = $w; - } - } - else { - $newargs[] = $n; - } - } - } - else - $newargs[] = $arg; - } - - $args = $newargs; + $args = flatten_array_recursive($args); $arr = array('args' => $args, 'run_cmd' => true); call_hooks('proc_run', $arr); + if(! $arr['run_cmd']) return; @@ -1855,8 +1836,8 @@ function proc_run(){ $args[0] = ((x(App::$config,'system')) && (x(App::$config['system'],'php_path')) && (strlen(App::$config['system']['php_path'])) ? App::$config['system']['php_path'] : 'php'); - // redirect proc_run statements of legacy daemon processes to the new Daemon Master object class - // We will keep this interface until everybody has transitioned. + // redirect proc_run statements of legacy daemon processes to the newer Daemon Master object class + // We will keep this interface until everybody has transitioned. (2016-05-20) if(strstr($args[1],'include/')) { // convert 'include/foo.php' to 'Foo' @@ -1871,14 +1852,7 @@ function proc_run(){ } } - for($x = 0; $x < count($args); $x++) { - if(is_array($args[$x])) { - logger('ERROR: shell args is array . ' . print_r($args,true)); - btlogger('args:'); - } - $args[$x] = escapeshellarg($args[$x]); - } - + $args = array_map('escapeshellarg',$args); $cmdline = implode($args," "); if(is_windows()) { diff --git a/include/smarty.php b/include/smarty.php index 762efe335..9d443e269 100755 --- a/include/smarty.php +++ b/include/smarty.php @@ -1,6 +1,7 @@ foo [1] => bar [2] => baz [3] => blip [4] => zob [5] => glob [6] => grip ) + * + */ + +function flatten_array_recursive($arr) { + $ret = array(); + + if(! $arr) + return $ret; + + foreach($arr as $a) { + if(is_array($a)) { + $tmp = flatten_array_recursive($a); + if($tmp) { + $ret = array_merge($ret,$tmp); + } + } + elseif($a) { + $ret[] = $a; + } + } + return($ret); +} From f4da365abdc1ce1da2dde1bb9798f58fc6dc1a9f Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 19:11:14 -0700 Subject: [PATCH 16/39] move template stuff to zotlabs/render --- .../Render/SimpleTemplate.php | 7 +- Zotlabs/Render/SmartyInterface.php | 48 ++++++++ Zotlabs/Render/SmartyTemplate.php | 75 +++++++++++ .../Render/TemplateEngine.php | 6 +- boot.php | 20 ++- include/plugin.php | 2 - include/smarty.php | 116 ------------------ include/text.php | 6 +- 8 files changed, 148 insertions(+), 132 deletions(-) rename include/template_processor.php => Zotlabs/Render/SimpleTemplate.php (98%) create mode 100755 Zotlabs/Render/SmartyInterface.php create mode 100755 Zotlabs/Render/SmartyTemplate.php rename include/ITemplateEngine.php => Zotlabs/Render/TemplateEngine.php (73%) delete mode 100755 include/smarty.php diff --git a/include/template_processor.php b/Zotlabs/Render/SimpleTemplate.php similarity index 98% rename from include/template_processor.php rename to Zotlabs/Render/SimpleTemplate.php index d2bf283e3..ff1bb5c3c 100755 --- a/include/template_processor.php +++ b/Zotlabs/Render/SimpleTemplate.php @@ -1,9 +1,11 @@ r = $r; diff --git a/Zotlabs/Render/SmartyInterface.php b/Zotlabs/Render/SmartyInterface.php new file mode 100755 index 000000000..0e3a47c2f --- /dev/null +++ b/Zotlabs/Render/SmartyInterface.php @@ -0,0 +1,48 @@ + "view/theme/$thname/tpl/"); + if( x(\App::$theme_info,"extends") ) + $template_dirs = $template_dirs + array('extends' => "view/theme/" . \App::$theme_info["extends"] . "/tpl/"); + $template_dirs = $template_dirs + array('base' => 'view/tpl/'); + $this->setTemplateDir($template_dirs); + + $basecompiledir = \App::$config['system']['smarty3_folder']; + + $this->setCompileDir($basecompiledir.'/compiled/'); + $this->setConfigDir($basecompiledir.'/config/'); + $this->setCacheDir($basecompiledir.'/cache/'); + + $this->left_delimiter = \App::get_template_ldelim('smarty3'); + $this->right_delimiter = \App::get_template_rdelim('smarty3'); + + // Don't report errors so verbosely + $this->error_reporting = E_ALL & (~E_NOTICE); + } + + function parsed($template = '') { + if($template) { + return $this->fetch('string:' . $template); + } + return $this->fetch('file:' . $this->filename); + } +} + + + diff --git a/Zotlabs/Render/SmartyTemplate.php b/Zotlabs/Render/SmartyTemplate.php new file mode 100755 index 000000000..532d6e42f --- /dev/null +++ b/Zotlabs/Render/SmartyTemplate.php @@ -0,0 +1,75 @@ +ERROR: folder $basecompiledir does not exist."; killme(); + } + if(!is_writable($basecompiledir)){ + echo "ERROR: folder $basecompiledir must be writable by webserver."; killme(); + } + \App::$config['system']['smarty3_folder'] = $basecompiledir; + } + + // TemplateEngine interface + + public function replace_macros($s, $r) { + $template = ''; + if(gettype($s) === 'string') { + $template = $s; + $s = new SmartyInterface(); + } + foreach($r as $key=>$value) { + if($key[0] === '$') { + $key = substr($key, 1); + } + $s->assign($key, $value); + } + return $s->parsed($template); + } + + public function get_markup_template($file, $root=''){ + $template_file = theme_include($file, $root); + if($template_file) { + $template = new SmartyInterface(); + $template->filename = $template_file; + + return $template; + } + return ""; + } + + public function get_intltext_template($file, $root='') { + + $lang = \App::$language; + + if(file_exists("view/$lang/$file")) + $template_file = "view/$lang/$file"; + elseif(file_exists("view/en/$file")) + $template_file = "view/en/$file"; + else + $template_file = theme_include($file,$root); + if($template_file) { + $template = new SmartyInterface(); + $template->filename = $template_file; + + return $template; + } + return ""; + } + + + +} diff --git a/include/ITemplateEngine.php b/Zotlabs/Render/TemplateEngine.php similarity index 73% rename from include/ITemplateEngine.php rename to Zotlabs/Render/TemplateEngine.php index 7bd559a63..600ff913e 100755 --- a/include/ITemplateEngine.php +++ b/Zotlabs/Render/TemplateEngine.php @@ -1,10 +1,12 @@ "view/theme/$thname/tpl/"); - if( x(App::$theme_info,"extends") ) - $template_dirs = $template_dirs + array('extends' => "view/theme/" . App::$theme_info["extends"] . "/tpl/"); - $template_dirs = $template_dirs + array('base' => 'view/tpl/'); - $this->setTemplateDir($template_dirs); - - $basecompiledir = App::$config['system']['smarty3_folder']; - - $this->setCompileDir($basecompiledir.'/compiled/'); - $this->setConfigDir($basecompiledir.'/config/'); - $this->setCacheDir($basecompiledir.'/cache/'); - - $this->left_delimiter = App::get_template_ldelim('smarty3'); - $this->right_delimiter = App::get_template_rdelim('smarty3'); - - // Don't report errors so verbosely - $this->error_reporting = E_ALL & ~E_NOTICE; - } - - function parsed($template = '') { - if($template) { - return $this->fetch('string:' . $template); - } - return $this->fetch('file:' . $this->filename); - } -} - - - -class FriendicaSmartyEngine implements ITemplateEngine { - static $name ="smarty3"; - - public function __construct(){ - $a = get_app(); - - // Cannot use get_config() here because it is called during installation when there is no DB. - // FIXME: this may leak private information such as system pathnames. - - $basecompiledir = ((array_key_exists('smarty3_folder',App::$config['system'])) ? App::$config['system']['smarty3_folder'] : ''); - if (!$basecompiledir) $basecompiledir = dirname(__dir__) . "/" . TEMPLATE_BUILD_PATH; - if (!is_dir($basecompiledir)) { - echo "ERROR: folder $basecompiledir does not exist."; killme(); - } - if(!is_writable($basecompiledir)){ - echo "ERROR: folder $basecompiledir must be writable by webserver."; killme(); - } - App::$config['system']['smarty3_folder'] = $basecompiledir; - } - - // ITemplateEngine interface - public function replace_macros($s, $r) { - $template = ''; - if(gettype($s) === 'string') { - $template = $s; - $s = new FriendicaSmarty(); - } - foreach($r as $key=>$value) { - if($key[0] === '$') { - $key = substr($key, 1); - } - $s->assign($key, $value); - } - return $s->parsed($template); - } - - public function get_markup_template($file, $root=''){ - $template_file = theme_include($file, $root); - if($template_file) { - $template = new FriendicaSmarty(); - $template->filename = $template_file; - - return $template; - } - return ""; - } - - public function get_intltext_template($file, $root='') { - $a = get_app(); - - if(file_exists("view/{App::$language}/$file")) - $template_file = "view/{App::$language}/$file"; - elseif(file_exists("view/en/$file")) - $template_file = "view/en/$file"; - else - $template_file = theme_include($file,$root); - if($template_file) { - $template = new FriendicaSmarty(); - $template->filename = $template_file; - - return $template; - } - return ""; - } - - - -} diff --git a/include/text.php b/include/text.php index 554518e32..df6dac056 100644 --- a/include/text.php +++ b/include/text.php @@ -3,8 +3,6 @@ * @file include/text.php */ -require_once("include/template_processor.php"); -require_once("include/smarty.php"); require_once("include/bbcode.php"); // random string, there are 86 characters max in text mode, 128 for hex @@ -16,8 +14,8 @@ define('RANDOM_STRING_TEXT', 0x01 ); /** * @brief This is our template processor. * - * @param string|FriendicaSmarty $s the string requiring macro substitution, - * or an instance of FriendicaSmarty + * @param string|SmartyEngine $s the string requiring macro substitution, + * or an instance of SmartyEngine * @param array $r key value pairs (search => replace) * @return string substituted string */ From ac095c89f1ef8cf2207c3db94b10c6e4a3d8f5a7 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 19:14:49 -0700 Subject: [PATCH 17/39] code comments --- boot.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/boot.php b/boot.php index a5aa3f7a1..fdd900de8 100755 --- a/boot.php +++ b/boot.php @@ -913,14 +913,15 @@ class App { spl_autoload_register('ZotlabsAutoloader::loader'); self::$meta= new Zotlabs\Web\HttpMeta(); + + // create an instance of the smarty template engine so we can register it. + $smarty = new Zotlabs\Render\SmartyTemplate(); $dc = get_declared_classes(); -// logger('classes: ' . print_r($dc,true)); foreach ($dc as $k) { - - if (in_array('Zotlabs\\Render\\TemplateEngine', class_implements($k))){ + if(in_array('Zotlabs\\Render\\TemplateEngine', class_implements($k))) { self::register_template_engine($k); } } From 019250eff879d86577157ad6136a3613b61cacb8 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 22:13:20 -0700 Subject: [PATCH 18/39] consolidate include/*_selectors.php (not touching acl_selectors for the moment, as it will likely end up with a different disposition) --- Zotlabs/Module/Connections.php | 2 +- Zotlabs/Module/Connedit.php | 4 +- Zotlabs/Module/Profiles.php | 3 +- Zotlabs/Module/Thing.php | 2 +- Zotlabs/Module/Viewconnections.php | 3 +- include/contact_selectors.php | 97 ------------------- include/network.php | 26 +++++ .../{profile_selectors.php => selectors.php} | 44 +++++++++ 8 files changed, 77 insertions(+), 104 deletions(-) delete mode 100644 include/contact_selectors.php rename include/{profile_selectors.php => selectors.php} (79%) diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php index 564f4e527..ebf8ff8e6 100644 --- a/Zotlabs/Module/Connections.php +++ b/Zotlabs/Module/Connections.php @@ -3,7 +3,7 @@ namespace Zotlabs\Module; require_once('include/Contact.php'); require_once('include/socgraph.php'); -require_once('include/contact_selectors.php'); +require_once('include/selectors.php'); require_once('include/group.php'); require_once('include/contact_widgets.php'); require_once('include/zot.php'); diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php index 0820c76bf..8bf4ac9b4 100644 --- a/Zotlabs/Module/Connedit.php +++ b/Zotlabs/Module/Connedit.php @@ -9,7 +9,7 @@ namespace Zotlabs\Module; require_once('include/Contact.php'); require_once('include/socgraph.php'); -require_once('include/contact_selectors.php'); +require_once('include/selectors.php'); require_once('include/group.php'); require_once('include/contact_widgets.php'); require_once('include/zot.php'); @@ -583,8 +583,6 @@ class Connedit extends \Zotlabs\Web\Controller { if(intval($contact['abook_self'])) $self = true; - require_once('include/contact_selectors.php'); - $tpl = get_markup_template("abook_edit.tpl"); if(feature_enabled(local_channel(),'affinity')) { diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php index 3db089e53..e738d0c96 100644 --- a/Zotlabs/Module/Profiles.php +++ b/Zotlabs/Module/Profiles.php @@ -2,6 +2,7 @@ namespace Zotlabs\Module; require_once('include/identity.php'); +require_once('include/selectors.php'); class Profiles extends \Zotlabs\Web\Controller { @@ -625,7 +626,7 @@ class Profiles extends \Zotlabs\Web\Controller { return; } - require_once('include/profile_selectors.php'); + require_once('include/selectors.php'); $editselect = 'none'; diff --git a/Zotlabs/Module/Thing.php b/Zotlabs/Module/Thing.php index e95ec53f6..6fc5219d8 100644 --- a/Zotlabs/Module/Thing.php +++ b/Zotlabs/Module/Thing.php @@ -7,7 +7,7 @@ namespace Zotlabs\Module; require_once('include/items.php'); require_once('include/security.php'); -require_once('include/contact_selectors.php'); +require_once('include/selectors.php'); require_once('include/acl_selectors.php'); diff --git a/Zotlabs/Module/Viewconnections.php b/Zotlabs/Module/Viewconnections.php index 726ef043b..a9445cdeb 100644 --- a/Zotlabs/Module/Viewconnections.php +++ b/Zotlabs/Module/Viewconnections.php @@ -1,6 +1,7 @@ \r\n"; - - $r = q("SELECT profile_guid, profile_name FROM `profile` WHERE `uid` = %d", - intval($_SESSION['uid'])); - - if($r) { - foreach($r as $rr) { - $selected = (($rr['profile_guid'] == $current) ? " selected=\"selected\" " : ""); - $o .= "\r\n"; - } - } - $o .= "\r\n"; - return $o; -} - -/* unused currently - -function contact_reputation($current) { - - $o = ''; - $o .= "\r\n"; - return $o; -} - -*/ - -function contact_poll_interval($current, $disabled = false) { - - $dis = (($disabled) ? ' disabled="disabled" ' : ''); - $o = ''; - $o .= "\r\n"; - return $o; -} - - -function network_to_name($s) { - - $nets = array( - NETWORK_DFRN => t('Friendica'), - NETWORK_FRND => t('Friendica'), - NETWORK_OSTATUS => t('OStatus'), - NETWORK_GNUSOCIAL => t('GNU-Social'), - NETWORK_FEED => t('RSS/Atom'), - NETWORK_MAIL => t('Email'), - NETWORK_DIASPORA => t('Diaspora'), - NETWORK_FACEBOOK => t('Facebook'), - NETWORK_ZOT => t('Zot'), - NETWORK_LINKEDIN => t('LinkedIn'), - NETWORK_XMPP => t('XMPP/IM'), - NETWORK_MYSPACE => t('MySpace'), - ); - - call_hooks('network_to_name', $nets); - - $search = array_keys($nets); - $replace = array_values($nets); - - return str_replace($search,$replace,$s); - -} diff --git a/include/network.php b/include/network.php index 25307f857..f38f8d548 100644 --- a/include/network.php +++ b/include/network.php @@ -2150,3 +2150,29 @@ function get_repository_version($branch = 'master') { return '?.?'; } + +function network_to_name($s) { + + $nets = array( + NETWORK_DFRN => t('Friendica'), + NETWORK_FRND => t('Friendica'), + NETWORK_OSTATUS => t('OStatus'), + NETWORK_GNUSOCIAL => t('GNU-Social'), + NETWORK_FEED => t('RSS/Atom'), + NETWORK_MAIL => t('Email'), + NETWORK_DIASPORA => t('Diaspora'), + NETWORK_FACEBOOK => t('Facebook'), + NETWORK_ZOT => t('Zot'), + NETWORK_LINKEDIN => t('LinkedIn'), + NETWORK_XMPP => t('XMPP/IM'), + NETWORK_MYSPACE => t('MySpace'), + ); + + call_hooks('network_to_name', $nets); + + $search = array_keys($nets); + $replace = array_values($nets); + + return str_replace($search,$replace,$s); + +} diff --git a/include/profile_selectors.php b/include/selectors.php similarity index 79% rename from include/profile_selectors.php rename to include/selectors.php index 9f993f803..d7d070d31 100644 --- a/include/profile_selectors.php +++ b/include/selectors.php @@ -1,6 +1,49 @@ \r\n"; + + $r = q("SELECT profile_guid, profile_name FROM `profile` WHERE `uid` = %d", + intval($_SESSION['uid'])); + + if($r) { + foreach($r as $rr) { + $selected = (($rr['profile_guid'] == $current) ? " selected=\"selected\" " : ""); + $o .= "\r\n"; + } + } + $o .= "\r\n"; + return $o; +} + +function contact_poll_interval($current, $disabled = false) { + + $dis = (($disabled) ? ' disabled="disabled" ' : ''); + $o = ''; + $o .= "\r\n"; + return $o; +} + + function gender_selector($current="",$suffix="") { $o = ''; $select = array('', t('Male'), t('Female'), t('Currently Male'), t('Currently Female'), t('Mostly Male'), t('Mostly Female'), t('Transgender'), t('Intersex'), t('Transsexual'), t('Hermaphrodite'), t('Neuter'), t('Non-specific'), t('Other'), t('Undecided')); @@ -108,3 +151,4 @@ function marital_selector_min($current="",$suffix="") { $o .= ''; return $o; } + From bc20cf9fa3479be20417f78187f7302f13fbf0ec Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 22:16:57 -0700 Subject: [PATCH 19/39] remove redundant include --- Zotlabs/Module/Profiles.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php index e738d0c96..e899abb3f 100644 --- a/Zotlabs/Module/Profiles.php +++ b/Zotlabs/Module/Profiles.php @@ -626,9 +626,6 @@ class Profiles extends \Zotlabs\Web\Controller { return; } - require_once('include/selectors.php'); - - $editselect = 'none'; // if(feature_enabled(local_channel(),'richtext')) // $editselect = 'textareas'; From d8ace38041ad3ef161cf9c727c94b6ce2a00ce75 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 22:52:47 -0700 Subject: [PATCH 20/39] rework the conversation object stuff at a high level - still needs a bit of refactoring --- Zotlabs/{Project => Lib}/System.php | 2 +- .../Lib/ThreadItem.php | 20 ++++------ .../Lib/ThreadStream.php | 15 +++----- Zotlabs/Module/Dav.php | 2 +- Zotlabs/Module/Help.php | 2 +- Zotlabs/Module/Linkinfo.php | 2 +- Zotlabs/Module/Pubsites.php | 2 +- Zotlabs/Module/Rsd_xml.php | 2 +- Zotlabs/Module/Settings.php | 2 +- Zotlabs/Module/Siteinfo.php | 4 +- boot.php | 8 +--- include/BaseObject.php | 38 ------------------- include/api.php | 10 ++--- include/conversation.php | 7 +--- include/enotify.php | 2 +- include/event.php | 2 +- include/feedutils.php | 4 +- include/identity.php | 2 +- include/language.php | 2 +- include/network.php | 10 ++--- include/zot.php | 4 +- 21 files changed, 44 insertions(+), 98 deletions(-) rename Zotlabs/{Project => Lib}/System.php (98%) rename include/ItemObject.php => Zotlabs/Lib/ThreadItem.php (98%) rename include/ConversationObject.php => Zotlabs/Lib/ThreadStream.php (94%) delete mode 100644 include/BaseObject.php diff --git a/Zotlabs/Project/System.php b/Zotlabs/Lib/System.php similarity index 98% rename from Zotlabs/Project/System.php rename to Zotlabs/Lib/System.php index d95bd033c..c52a90338 100644 --- a/Zotlabs/Project/System.php +++ b/Zotlabs/Lib/System.php @@ -1,6 +1,6 @@ get_app(); $this->data = $data; $this->toplevel = ($this->get_id() == $this->get_data_value('parent')); @@ -49,7 +46,7 @@ class Item extends BaseObject { continue; } - $child = new Item($item); + $child = new ThreadItem($item); $this->add_child($child); } } @@ -67,7 +64,6 @@ class Item extends BaseObject { $result = array(); - $a = $this->get_app(); $item = $this->get_data(); $commentww = ''; @@ -219,7 +215,8 @@ class Item extends BaseObject { ); } - } else { + } + else { $indent = 'comment'; } @@ -675,7 +672,6 @@ class Item extends BaseObject { $template = get_markup_template($this->get_comment_box_template()); - $a = $this->get_app(); $observer = $conv->get_observer(); $qc = ((local_channel()) ? get_pconfig(local_channel(),'system','qcomment') : null); @@ -714,7 +710,7 @@ class Item extends BaseObject { '$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false), '$encrypt' => t('Encrypt text'), '$cipher' => $conv->get_cipher(), - '$sourceapp' => App::$sourcename + '$sourceapp' => \App::$sourcename )); diff --git a/include/ConversationObject.php b/Zotlabs/Lib/ThreadStream.php similarity index 94% rename from include/ConversationObject.php rename to Zotlabs/Lib/ThreadStream.php index 82f381b0c..2bcf167e9 100644 --- a/include/ConversationObject.php +++ b/Zotlabs/Lib/ThreadStream.php @@ -1,11 +1,8 @@ get_mode() == $mode) return; - $a = $this->get_app(); - - $this->observer = App::get_observer(); + $this->observer = \App::get_observer(); $ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : ''); switch($mode) { @@ -57,7 +52,7 @@ class Conversation extends BaseObject { $this->writable = true; break; case 'channel': - $this->profile_owner = App::$profile['profile_uid']; + $this->profile_owner = \App::$profile['profile_uid']; $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); break; case 'display': @@ -67,7 +62,7 @@ class Conversation extends BaseObject { $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); break; case 'page': - $this->profile_owner = App::$profile['uid']; + $this->profile_owner = \App::$profile['uid']; $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'); break; default: diff --git a/Zotlabs/Module/Dav.php b/Zotlabs/Module/Dav.php index d65ad3405..2fddabe19 100644 --- a/Zotlabs/Module/Dav.php +++ b/Zotlabs/Module/Dav.php @@ -64,7 +64,7 @@ class Dav extends \Zotlabs\Web\Controller { $auth = new \Zotlabs\Storage\BasicAuth(); - $auth->setRealm(ucfirst(\Zotlabs\Project\System::get_platform_name()) . 'WebDAV'); + $auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . 'WebDAV'); // $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function($userName,$password) { // if(account_verify_password($userName,$password)) diff --git a/Zotlabs/Module/Help.php b/Zotlabs/Module/Help.php index 4842c56c6..cc46c550b 100644 --- a/Zotlabs/Module/Help.php +++ b/Zotlabs/Module/Help.php @@ -37,7 +37,7 @@ class Help extends \Zotlabs\Web\Controller { $path = trim(substr($dirname,4),'/'); $o .= '
  • ' . ucwords(str_replace('_',' ',notags($fname))) . '
    ' . - str_replace('$Projectname',\Zotlabs\Project\System::get_platform_name(),substr($rr['text'],0,200)) . '...

  • '; + str_replace('$Projectname',\Zotlabs\Lib\System::get_platform_name(),substr($rr['text'],0,200)) . '...

    '; } $o .= ''; diff --git a/Zotlabs/Module/Linkinfo.php b/Zotlabs/Module/Linkinfo.php index ef34bb465..e1a3a6abe 100644 --- a/Zotlabs/Module/Linkinfo.php +++ b/Zotlabs/Module/Linkinfo.php @@ -115,7 +115,7 @@ class Linkinfo extends \Zotlabs\Web\Controller { // If this is a Red site, use zrl rather than url so they get zids sent to them by default - if( x($siteinfo,'generator') && (strpos($siteinfo['generator'], \Zotlabs\Project\System::get_platform_name() . ' ') === 0)) + if( x($siteinfo,'generator') && (strpos($siteinfo['generator'], \Zotlabs\Lib\System::get_platform_name() . ' ') === 0)) $template = str_replace('url','zrl',$template); if($siteinfo["title"] == "") { diff --git a/Zotlabs/Module/Pubsites.php b/Zotlabs/Module/Pubsites.php index 55f2c0ad6..31bca5f30 100644 --- a/Zotlabs/Module/Pubsites.php +++ b/Zotlabs/Module/Pubsites.php @@ -31,7 +31,7 @@ class Pubsites extends \Zotlabs\Web\Controller { $o .= ''; if($j['sites']) { foreach($j['sites'] as $jj) { - if(strpos($jj['project'],\Zotlabs\Project\System::get_platform_name()) === false) + if(strpos($jj['project'],\Zotlabs\Lib\System::get_platform_name()) === false) continue; $host = strtolower(substr($jj['url'],strpos($jj['url'],'://')+3)); $rate_links = ((local_channel()) ? '' : ''); diff --git a/Zotlabs/Module/Rsd_xml.php b/Zotlabs/Module/Rsd_xml.php index 06af39ad1..e5059834b 100644 --- a/Zotlabs/Module/Rsd_xml.php +++ b/Zotlabs/Module/Rsd_xml.php @@ -6,7 +6,7 @@ class Rsd_xml extends \Zotlabs\Web\Controller { function init() { header ("Content-Type: text/xml"); echo replace_macros(get_markup_template('rsd.tpl'),array( - '$project' => \Zotlabs\Project\System::get_platform_name(), + '$project' => \Zotlabs\Lib\System::get_platform_name(), '$baseurl' => z_root(), '$apipath' => z_root() . '/api/' )); diff --git a/Zotlabs/Module/Settings.php b/Zotlabs/Module/Settings.php index 3d37faab6..32ef89f68 100644 --- a/Zotlabs/Module/Settings.php +++ b/Zotlabs/Module/Settings.php @@ -1047,7 +1047,7 @@ class Settings extends \Zotlabs\Web\Controller { '$h_prv' => t('Security and Privacy Settings'), '$permissions_set' => $permissions_set, - '$server_role' => \Zotlabs\Project\System::get_server_role(), + '$server_role' => \Zotlabs\Lib\System::get_server_role(), '$perms_set_msg' => t('Your permissions are already configured. Click to view/adjust'), '$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents displaying in your profile that you are online'), $yes_no), diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php index c65277004..41f6e9f0b 100644 --- a/Zotlabs/Module/Siteinfo.php +++ b/Zotlabs/Module/Siteinfo.php @@ -16,10 +16,10 @@ class Siteinfo extends \Zotlabs\Web\Controller { function get() { if(! get_config('system','hidden_version_siteinfo')) { - $version = sprintf( t('Version %s'), \Zotlabs\Project\System::get_project_version()); + $version = sprintf( t('Version %s'), \Zotlabs\Lib\System::get_project_version()); if(@is_dir('.git') && function_exists('shell_exec')) { $commit = @shell_exec('git log -1 --format="%h"'); - $tag = \Zotlabs\Project\System::get_std_version(); // @shell_exec('git describe --tags --abbrev=0'); + $tag = \Zotlabs\Lib\System::get_std_version(); // @shell_exec('git describe --tags --abbrev=0'); } if(! isset($commit) || strlen($commit) > 16) $commit = ''; diff --git a/boot.php b/boot.php index fdd900de8..e7e962b8e 100755 --- a/boot.php +++ b/boot.php @@ -37,7 +37,6 @@ require_once('include/nav.php'); require_once('include/cache.php'); require_once('include/permissions.php'); require_once('library/Mobile_Detect/Mobile_Detect.php'); -require_once('include/BaseObject.php'); require_once('include/features.php'); require_once('include/taxonomy.php'); require_once('include/identity.php'); @@ -903,13 +902,10 @@ class App { self::head_set_icon('/images/hz-32.png'); - BaseObject::set_app($this); - /* * register template engines */ - spl_autoload_register('ZotlabsAutoloader::loader'); self::$meta= new Zotlabs\Web\HttpMeta(); @@ -1080,7 +1076,7 @@ class App { if(! self::$meta->get_field('og:title')) self::$meta->set('og:title',self::$page['title']); - self::$meta->set('generator', Zotlabs\Project\System::get_platform_name()); + self::$meta->set('generator', Zotlabs\Lib\System::get_platform_name()); /* put the head template at the beginning of page['htmlhead'] * since the code added by the modules frequently depends on it @@ -1095,7 +1091,7 @@ class App { '$local_channel' => local_channel(), '$metas' => self::$meta->get(), '$update_interval' => $interval, - 'osearch' => sprintf( t('Search %1$s (%2$s)','opensearch'), Zotlabs\Project\System::get_site_name(), t('$Projectname','opensearch')), + 'osearch' => sprintf( t('Search %1$s (%2$s)','opensearch'), Zotlabs\Lib\System::get_site_name(), t('$Projectname','opensearch')), '$icon' => head_get_icon(), '$head_css' => head_get_css(), '$head_js' => head_get_js(), diff --git a/include/BaseObject.php b/include/BaseObject.php deleted file mode 100644 index a88978a83..000000000 --- a/include/BaseObject.php +++ /dev/null @@ -1,38 +0,0 @@ - $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl, 'shorturllength' => '30', 'hubzilla' => array( - 'PLATFORM_NAME' => Zotlabs\Project\System::get_platform_name(), - 'STD_VERSION' => Zotlabs\Project\System::get_project_version(), + 'PLATFORM_NAME' => Zotlabs\Lib\System::get_platform_name(), + 'STD_VERSION' => Zotlabs\Lib\System::get_project_version(), 'ZOT_REVISION' => ZOT_REVISION, - 'DB_UPDATE_VERSION' => Zotlabs\Project\System::get_update_version() + 'DB_UPDATE_VERSION' => Zotlabs\Lib\System::get_update_version() ) )); @@ -2143,12 +2143,12 @@ require_once('include/api_auth.php'); if($type === 'xml') { header("Content-type: application/xml"); - echo '' . "\r\n" . '' . Zotlabs\Project\System::get_project_version() . '' . "\r\n"; + echo '' . "\r\n" . '' . Zotlabs\Lib\System::get_project_version() . '' . "\r\n"; killme(); } elseif($type === 'json') { header("Content-type: application/json"); - echo '"' . Zotlabs\Project\System::get_project_version() . '"'; + echo '"' . Zotlabs\Lib\System::get_project_version() . '"'; killme(); } } diff --git a/include/conversation.php b/include/conversation.php index 8be0557e7..fca07a91d 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -754,10 +754,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ // Normal View // logger('conv: items: ' . print_r($items,true)); - require_once('include/ConversationObject.php'); - require_once('include/ItemObject.php'); - - $conv = new Conversation($mode, $preview, $prepared_item); + $conv = new Zotlabs\Lib\ThreadStream($mode, $preview, $prepared_item); // In the display mode we don't have a profile owner. @@ -806,7 +803,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ if($item['id'] == $item['parent']) { - $item_object = new Item($item); + $item_object = new Zotlabs\Lib\ThreadItem($item); $conv->add_thread($item_object); if($page_mode === 'list') { $item_object->set_template('conv_list.tpl'); diff --git a/include/enotify.php b/include/enotify.php index d87c5af11..bd8698606 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -529,7 +529,7 @@ function notification($params) { $tpl = get_markup_template('email_notify_html.tpl'); $email_html_body = replace_macros($tpl,array( '$banner' => $datarray['banner'], - '$notify_icon' => Zotlabs\Project\System::get_notify_icon(), + '$notify_icon' => Zotlabs\Lib\System::get_notify_icon(), '$product' => $datarray['product'], '$preamble' => $datarray['preamble'], '$sitename' => $datarray['sitename'], diff --git a/include/event.php b/include/event.php index e41bf2db7..29ca5bb79 100644 --- a/include/event.php +++ b/include/event.php @@ -67,7 +67,7 @@ function ical_wrapper($ev) { $o .= "BEGIN:VCALENDAR"; $o .= "\r\nVERSION:2.0"; $o .= "\r\nMETHOD:PUBLISH"; - $o .= "\r\nPRODID:-//" . get_config('system','sitename') . "//" . Zotlabs\Project\System::get_platform_name() . "//" . strtoupper(App::$language). "\r\n"; + $o .= "\r\nPRODID:-//" . get_config('system','sitename') . "//" . Zotlabs\Lib\System::get_platform_name() . "//" . strtoupper(App::$language). "\r\n"; if(array_key_exists('start', $ev)) $o .= format_event_ical($ev); else { diff --git a/include/feedutils.php b/include/feedutils.php index 2ba5efe22..700198ff8 100644 --- a/include/feedutils.php +++ b/include/feedutils.php @@ -88,8 +88,8 @@ function get_feed_for($channel, $observer_hash, $params) { $atom = ''; $atom .= replace_macros($feed_template, array( - '$version' => xmlify(Zotlabs\Project\System::get_project_version()), - '$red' => xmlify(Zotlabs\Project\System::get_platform_name()), + '$version' => xmlify(Zotlabs\Lib\System::get_project_version()), + '$red' => xmlify(Zotlabs\Lib\System::get_platform_name()), '$feed_id' => xmlify($channel['xchan_url']), '$feed_title' => xmlify($channel['channel_name']), '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) , diff --git a/include/identity.php b/include/identity.php index 206dad084..4ef1105ea 100644 --- a/include/identity.php +++ b/include/identity.php @@ -491,7 +491,7 @@ function identity_basic_export($channel_id, $items = false) { // use constants here as otherwise we will have no idea if we can import from a site // with a non-standard platform and version. - $ret['compatibility'] = array('project' => PLATFORM_NAME, 'version' => STD_VERSION, 'database' => DB_UPDATE_VERSION, 'server_role' => Zotlabs\Project\System::get_server_role()); + $ret['compatibility'] = array('project' => PLATFORM_NAME, 'version' => STD_VERSION, 'database' => DB_UPDATE_VERSION, 'server_role' => Zotlabs\Lib\System::get_server_role()); $r = q("select * from channel where channel_id = %d limit 1", intval($channel_id) diff --git a/include/language.php b/include/language.php index d6b7606ca..14139e90c 100644 --- a/include/language.php +++ b/include/language.php @@ -189,7 +189,7 @@ function t($s, $ctx = '') { function translate_projectname($s) { - return str_replace(array('$projectname','$Projectname'),array(Zotlabs\Project\System::get_platform_name(),ucfirst(Zotlabs\Project\System::get_platform_name())),$s); + return str_replace(array('$projectname','$Projectname'),array(Zotlabs\Lib\System::get_platform_name(),ucfirst(Zotlabs\Lib\System::get_platform_name())),$s); } diff --git a/include/network.php b/include/network.php index f38f8d548..3e5263d3e 100644 --- a/include/network.php +++ b/include/network.php @@ -1839,7 +1839,7 @@ function format_and_send_email($sender,$xchan,$item) { $tpl = get_markup_template('email_notify_html.tpl'); $email_html_body = replace_macros($tpl,array( '$banner' => $banner, - '$notify_icon' => Zotlabs\Project\System::get_notify_icon(), + '$notify_icon' => Zotlabs\Lib\System::get_notify_icon(), '$product' => $product, '$preamble' => '', '$sitename' => $sitename, @@ -1990,8 +1990,8 @@ function get_site_info() { $site_info = get_config('system','info'); $site_name = get_config('system','sitename'); if(! get_config('system','hidden_version_siteinfo')) { - $version = Zotlabs\Project\System::get_project_version(); - $tag = Zotlabs\Project\System::get_std_version(); + $version = Zotlabs\Lib\System::get_project_version(); + $tag = Zotlabs\Lib\System::get_std_version(); if(@is_dir('.git') && function_exists('shell_exec')) { $commit = trim( @shell_exec('git log -1 --format="%h"')); @@ -2027,7 +2027,7 @@ function get_site_info() { $data = Array( 'version' => $version, 'version_tag' => $tag, - 'server_role' => Zotlabs\Project\System::get_server_role(), + 'server_role' => Zotlabs\Lib\System::get_server_role(), 'commit' => $commit, 'url' => z_root(), 'plugins' => $visible_plugins, @@ -2041,7 +2041,7 @@ function get_site_info() { 'locked_features' => $locked_features, 'admin' => $admin, 'site_name' => (($site_name) ? $site_name : ''), - 'platform' => Zotlabs\Project\System::get_platform_name(), + 'platform' => Zotlabs\Lib\System::get_platform_name(), 'dbdriver' => $db->getdriver(), 'lastpoll' => get_config('system','lastpoll'), 'info' => (($site_info) ? $site_info : ''), diff --git a/include/zot.php b/include/zot.php index 5884245e9..54a3fe640 100644 --- a/include/zot.php +++ b/include/zot.php @@ -3924,7 +3924,7 @@ function zotinfo($arr) { $ret['site']['channels'] = channel_total(); - $ret['site']['version'] = Zotlabs\Project\System::get_platform_name() . ' ' . STD_VERSION . '[' . DB_UPDATE_VERSION . ']'; + $ret['site']['version'] = Zotlabs\Lib\System::get_platform_name() . ' ' . STD_VERSION . '[' . DB_UPDATE_VERSION . ']'; $ret['site']['admin'] = get_config('system','admin_email'); @@ -3944,7 +3944,7 @@ function zotinfo($arr) { $ret['site']['sellpage'] = get_config('system','sellpage'); $ret['site']['location'] = get_config('system','site_location'); $ret['site']['realm'] = get_directory_realm(); - $ret['site']['project'] = Zotlabs\Project\System::get_platform_name() . Zotlabs\Project\System::get_server_role(); + $ret['site']['project'] = Zotlabs\Lib\System::get_platform_name() . Zotlabs\Lib\System::get_server_role(); } From bf050121506aa4cb487d9efd9cfdaa501ada3b1a Mon Sep 17 00:00:00 2001 From: redmatrix Date: Fri, 20 May 2016 23:12:06 -0700 Subject: [PATCH 21/39] relocate the (unused currently) protocol driver --- {include => Zotlabs/Lib}/ProtoDriver.php | 28 ++-------------------- Zotlabs/Lib/ZotDriver.php | 30 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 26 deletions(-) rename {include => Zotlabs/Lib}/ProtoDriver.php (56%) create mode 100644 Zotlabs/Lib/ZotDriver.php diff --git a/include/ProtoDriver.php b/Zotlabs/Lib/ProtoDriver.php similarity index 56% rename from include/ProtoDriver.php rename to Zotlabs/Lib/ProtoDriver.php index 7585a0135..daf887dbb 100644 --- a/include/ProtoDriver.php +++ b/Zotlabs/Lib/ProtoDriver.php @@ -1,5 +1,7 @@ Date: Sat, 21 May 2016 14:34:01 +0200 Subject: [PATCH 22/39] possible fix for #385 --- Zotlabs/Storage/Browser.php | 1 + view/theme/redbasic/css/style.css | 4 ++++ view/tpl/hdr.tpl | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php index 3556f7f06..355f9efa0 100644 --- a/Zotlabs/Storage/Browser.php +++ b/Zotlabs/Storage/Browser.php @@ -256,6 +256,7 @@ class Browser extends DAV\Browser\Plugin { $func($a); } } + ob_start(); construct_page($a); } diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index ebabd68e4..1c2e8cdb2 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -526,6 +526,10 @@ footer { clear: both; } +#nav-notifications-template { + display: none; +} + #nav-searchbar { float: right; margin-top: 2px; diff --git a/view/tpl/hdr.tpl b/view/tpl/hdr.tpl index 3770cb9a6..6a14906f6 100644 --- a/view/tpl/hdr.tpl +++ b/view/tpl/hdr.tpl @@ -1,5 +1,5 @@ -
    ' . t('Hub URL') . '' . t('Access Type') . '' . t('Registration Policy') . '' . t('Software') . '' . t('Ratings') . '
    ' . t('Rate') . '
    FunctionSource FileArg
    $a->module . _mod_aftercontentindex.php$arr
    $a->module . _mod_contentindex.php$arr
    $a->module . _mod_initindex.php$placeholder
    $a->module . _mod_postindex.php$_POST
    $a->module . _post_ . $selnameinclude/acl_selectors.php$o
    $a->module . _post_ . $selnameinclude/acl_selectors.php$o
    $a->module . _post_ . $selnameinclude/acl_selectors.php$o
    $a->module . _pre_ . $selnameinclude/acl_selectors.php$arr
    $a->module . _pre_ . $selnameinclude/acl_selectors.php$arr
    $a->module . _pre_ . $selnameinclude/acl_selectors.php$arr
    $nameinclude/plugin.php&$data = null
    about_hookmod/siteinfo.php$o
    accept_followmod/connedit.php$arr
    account_downgradeinclude/account.php$ret
    account_downgradeinclude/account.php$ret
    account_settingsmod/settings.php$account_settings
    activity_receivedinclude/zot.php$parr
    affinity_labelsinclude/widgets.php$labels
    affinity_labelsmod/connedit.php$labels
    api_perm_is_allowedinclude/permissions.php$arr
    app_menuindex.php$arr
    atom_authorinclude/items.php$o
    atom_entryinclude/items.php$o
    atom_feedinclude/items.php$atom
    atom_feed_endinclude/items.php$atom
    attach_upload_fileinclude/attach.php$f
    authenticateinclude/auth.php$addon_auth
    avatar_lookupinclude/network.php$avatar
    bb2diasporainclude/bb2diaspora.php$Text
    bbcodeinclude/bbcode.php$Text
    channel_removeinclude/Contact.php$r[0]
    chat_messageinclude/chat.php$arr
    chat_postmod/chatsvc.php$arr
    check_account_emailinclude/account.php$arr
    check_account_inviteinclude/account.php$arr
    check_account_passwordinclude/account.php$arr
    connect_premiummod/connect.php$arr
    connector_settingsmod/settings.php$settings_connectors
    construct_pageboot.php$arr
    contact_block_endinclude/text.php$arr
    contact_editmod/connedit.php$arr
    contact_edit_postmod/connedit.php$_POST
    contact_select_optionsinclude/acl_selectors.php$x
    conversation_startinclude/conversation.php$cb
    create_identityinclude/identity.php$newuid
    croninclude/cronhooks.php$d
    cron_dailyinclude/poller.phpdatetime_convert()
    cron_weeklyinclude/poller.phpdatetime_convert()
    directory_itemmod/directory.php$arr
    discover_by_webbieinclude/network.php$arr
    display_iteminclude/ItemObject.php$arr
    display_iteminclude/conversation.php$arr
    display_settingsmod/settings.php$o
    display_settings_postmod/settings.php$_POST
    donate_contributorsextend/addon/matrix/donate/donate.php$contributors
    donate_pluginextend/addon/matrix/donate/donate.php$o
    donate_sponsorsextend/addon/matrix/donate/donate.php$sponsors
    dreport_is_storableinclude/zot.php$dr
    drop_iteminclude/items.php$arr
    enotifyinclude/enotify.php$h
    enotify_mailinclude/enotify.php$datarray
    enotify_storeinclude/enotify.php$datarray
    event_createdinclude/event.php$event[id]
    event_updatedinclude/event.php$event[id]
    externals_url_selectinclude/externals.php$arr
    feature_enabledinclude/features.php$arr
    feature_settingsmod/settings.php$settings_addons
    feature_settings_postmod/settings.php$_POST
    followinclude/follow.php$arr
    followinclude/follow.php$arr
    follow_allowinclude/follow.php$x
    gender_selectorinclude/profile_selectors.php$select
    gender_selector_mininclude/profile_selectors.php$select
    generate_mapinclude/text.php$arr
    generate_named_mapinclude/text.php$arr
    get_all_api_permsinclude/permissions.php$arr
    get_all_permsinclude/permissions.php$arr
    get_featuresinclude/features.php$arr
    get_role_permsinclude/permissions.php$ret
    get_widgetsboot.php$arr
    get_widgetsboot.php$arr
    global_permissionsinclude/permissions.php$ret
    home_contentmod/home.php$o
    home_initmod/home.php$ret
    hostxrdmod/hostxrd.php$arr
    html2bbcodeinclude/html2bbcode.php$message
    identity_basic_exportinclude/identity.php$addon
    import_author_xchaninclude/items.php$arr
    import_channelmod/import.php$addon
    import_directory_profileinclude/zot.php$d
    import_xchaninclude/zot.php$arr
    item_photo_menuinclude/conversation.php$args
    item_storeinclude/items.php$d
    item_storeinclude/items.php$arr
    item_store_updateinclude/items.php$d
    item_translateinclude/items.php$translate
    item_translateinclude/items.php$translate
    jot_networksinclude/acl_selectors.php$jotnets
    jot_networksinclude/conversation.php$jotnets
    jot_networksmod/editblock.php$jotnets
    jot_networksmod/editpost.php$jotnets
    jot_networksmod/editwebpage.php$jotnets
    jot_networksmod/editlayout.php$jotnets
    jot_toolinclude/conversation.php$jotplugins
    jot_toolmod/editblock.php$jotplugins
    jot_toolmod/editpost.php$jotplugins
    jot_toolmod/editwebpage.php$jotplugins
    jot_toolmod/editlayout.php$jotplugins
    load_pdlboot.php$arr
    local_dir_updateinclude/dir_fns.php$arr
    logged_ininclude/oauth.php$a->user
    logged_ininclude/api.php$a->user
    logged_ininclude/security.php$a->account
    logged_ininclude/security.php$user_record
    logging_outinclude/auth.php$args
    login_hookboot.php$o
    magic_authmod/magic.php$arr
    magic_auth_openid_successmod/openid.php$arr
    magic_auth_openid_successmod/openid.php$arr
    magic_auth_successmod/post.php$arr
    main_sliderinclude/widgets.php$arr
    marital_selectorinclude/profile_selectors.php$select
    marital_selector_mininclude/profile_selectors.php$select
    module_loadedindex.php$x
    mood_verbsinclude/text.php$arr
    navinclude/nav.php$x
    network_content_initmod/network.php$arr
    network_pingmod/ping.php$arr
    network_tabsinclude/conversation.php$arr
    network_to_nameinclude/contact_selectors.php$nets
    notifier_endinclude/notifier.php$target_item
    notifier_hubinclude/notifier.php$narr
    notifier_normalinclude/deliver_hooks.php$r[0]
    obj_verbsinclude/taxonomy.php$arr
    oembed_probeinclude/oembed.php$x
    page_content_topindex.php$a->page[content]
    page_endindex.php$a->page[content]
    page_headerinclude/nav.php$a->page[nav]
    parse_atominclude/items.php$arr
    parse_linkmod/linkinfo.php$arr
    pdl_selectorinclude/comanche.php$arr
    perm_is_allowedinclude/permissions.php$arr
    permissions_createinclude/notifier.php$perm_update
    permissions_updateinclude/notifier.php$perm_update
    personal_xrdmod/xrd.php$arr
    photo_post_endinclude/photos.php$ret
    photo_post_endinclude/photos.php$ret
    photo_upload_begininclude/attach.php$arr
    photo_upload_begininclude/photos.php$args
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_fileinclude/attach.php$f
    photo_upload_fileinclude/photos.php$f
    photo_upload_formmod/photos.php$ret
    poke_verbsinclude/text.php$arr
    post_localinclude/zot.php$arr
    post_localinclude/items.php$arr
    post_localmod/item.php$datarray
    post_local_endinclude/items.php$arr
    post_local_endinclude/attach.php$arr
    post_local_endinclude/attach.php$arr
    post_local_endextend/addon/matrix/randpost/randpost.php$x
    post_local_endextend/addon/matrix/randpost/randpost.php$x
    post_local_endmod/mood.php$arr
    post_local_endmod/like.php$arr
    post_local_endmod/item.php$datarray
    post_local_endmod/subthread.php$arr
    post_local_startmod/item.php$_REQUEST
    post_mailinclude/items.php$arr
    post_mail_endinclude/items.php$arr
    post_remoteinclude/items.php$arr
    post_remote_endinclude/items.php$arr
    post_remote_updateinclude/items.php$arr
    post_remote_update_endinclude/items.php$arr
    prepare_bodyinclude/text.php$prep_arr
    prepare_body_finalinclude/text.php$prep_arr
    prepare_body_initinclude/text.php$item
    probe_well_knowninclude/probe.php$ret
    proc_runboot.php$arr
    process_channel_sync_deliveryinclude/zot.php$addon
    profile_advancedmod/profile.php$o
    profile_editmod/profiles.php$arr
    profile_photo_content_endmod/profile_photo.php$o
    profile_postmod/profiles.php$_POST
    profile_sidebarinclude/identity.php$arr
    profile_sidebar_enterinclude/identity.php$profile
    profile_tabsinclude/conversation.php$arr
    register_accountinclude/account.php$result
    render_locationinclude/conversation.php$locate
    replace_macrosinclude/text.php$arr
    reverse_magic_authmod/rmagic.php$arr
    settings_accountmod/settings.php$_POST
    settings_formmod/settings.php$o
    settings_postmod/settings.php$_POST
    sexpref_selectorinclude/profile_selectors.php$select
    sexpref_selector_mininclude/profile_selectors.php$select
    smilieinclude/text.php$params
    smilieextend/addon/matrix/smileybutton/smileybutton.php$params
    taggedinclude/items.php$arr
    validate_channelnameinclude/identity.php$arr
    webfingermod/wfinger.php$arr
    well_knownmod/_well_known.php$arr
    zidinclude/identity.php$arr
    zid_initinclude/identity.php$arr
    zot_fingerinclude/zot.php$ret

    Generated Tue Nov 03 21:19:02 PST 2015

    \ No newline at end of file +

    Hooks

    FunctionSource FileArg
    $a->module . _mod_aftercontentindex.php$arr
    $a->module . _mod_contentindex.php$arr
    $a->module . _mod_initindex.php$placeholder
    $a->module . _mod_postindex.php$_POST
    $a->module . _post_ . $selnameinclude/acl_selectors.php$o
    $a->module . _post_ . $selnameinclude/acl_selectors.php$o
    $a->module . _post_ . $selnameinclude/acl_selectors.php$o
    $a->module . _pre_ . $selnameinclude/acl_selectors.php$arr
    $a->module . _pre_ . $selnameinclude/acl_selectors.php$arr
    $a->module . _pre_ . $selnameinclude/acl_selectors.php$arr
    $nameinclude/plugin.php&$data = null
    about_hookmod/siteinfo.php$o
    accept_followmod/connedit.php$arr
    account_downgradeinclude/account.php$ret
    account_downgradeinclude/account.php$ret
    account_settingsmod/settings.php$account_settings
    activity_receivedinclude/zot.php$parr
    affinity_labelsinclude/widgets.php$labels
    affinity_labelsmod/connedit.php$labels
    api_perm_is_allowedinclude/permissions.php$arr
    app_menuindex.php$arr
    atom_authorinclude/items.php$o
    atom_entryinclude/items.php$o
    atom_feedinclude/items.php$atom
    atom_feed_endinclude/items.php$atom
    attach_upload_fileinclude/attach.php$f
    authenticateinclude/auth.php$addon_auth
    avatar_lookupinclude/network.php$avatar
    bb2diasporainclude/bb2diaspora.php$Text
    bbcodeinclude/bbcode.php$Text
    channel_removeinclude/Contact.php$r[0]
    chat_messageinclude/chat.php$arr
    chat_postmod/chatsvc.php$arr
    check_account_emailinclude/account.php$arr
    check_account_inviteinclude/account.php$arr
    check_account_passwordinclude/account.php$arr
    connect_premiummod/connect.php$arr
    connector_settingsmod/settings.php$settings_connectors
    construct_pageboot.php$arr
    contact_block_endinclude/text.php$arr
    contact_editmod/connedit.php$arr
    contact_edit_postmod/connedit.php$_POST
    contact_select_optionsinclude/acl_selectors.php$x
    conversation_startinclude/conversation.php$cb
    create_identityinclude/channel.php$newuid
    croninclude/cronhooks.php$d
    cron_dailyinclude/poller.phpdatetime_convert()
    cron_weeklyinclude/poller.phpdatetime_convert()
    directory_itemmod/directory.php$arr
    discover_by_webbieinclude/network.php$arr
    display_iteminclude/ItemObject.php$arr
    display_iteminclude/conversation.php$arr
    display_settingsmod/settings.php$o
    display_settings_postmod/settings.php$_POST
    donate_contributorsextend/addon/matrix/donate/donate.php$contributors
    donate_pluginextend/addon/matrix/donate/donate.php$o
    donate_sponsorsextend/addon/matrix/donate/donate.php$sponsors
    dreport_is_storableinclude/zot.php$dr
    drop_iteminclude/items.php$arr
    enotifyinclude/enotify.php$h
    enotify_mailinclude/enotify.php$datarray
    enotify_storeinclude/enotify.php$datarray
    event_createdinclude/event.php$event[id]
    event_updatedinclude/event.php$event[id]
    externals_url_selectinclude/externals.php$arr
    feature_enabledinclude/features.php$arr
    feature_settingsmod/settings.php$settings_addons
    feature_settings_postmod/settings.php$_POST
    followinclude/follow.php$arr
    followinclude/follow.php$arr
    follow_allowinclude/follow.php$x
    gender_selectorinclude/profile_selectors.php$select
    gender_selector_mininclude/profile_selectors.php$select
    generate_mapinclude/text.php$arr
    generate_named_mapinclude/text.php$arr
    get_all_api_permsinclude/permissions.php$arr
    get_all_permsinclude/permissions.php$arr
    get_featuresinclude/features.php$arr
    get_role_permsinclude/permissions.php$ret
    get_widgetsboot.php$arr
    get_widgetsboot.php$arr
    global_permissionsinclude/permissions.php$ret
    home_contentmod/home.php$o
    home_initmod/home.php$ret
    hostxrdmod/hostxrd.php$arr
    html2bbcodeinclude/html2bbcode.php$message
    identity_basic_exportinclude/channel.php$addon
    import_author_xchaninclude/items.php$arr
    import_channelmod/import.php$addon
    import_directory_profileinclude/zot.php$d
    import_xchaninclude/zot.php$arr
    item_photo_menuinclude/conversation.php$args
    item_storeinclude/items.php$d
    item_storeinclude/items.php$arr
    item_store_updateinclude/items.php$d
    item_translateinclude/items.php$translate
    item_translateinclude/items.php$translate
    jot_networksinclude/acl_selectors.php$jotnets
    jot_networksinclude/conversation.php$jotnets
    jot_networksmod/editblock.php$jotnets
    jot_networksmod/editpost.php$jotnets
    jot_networksmod/editwebpage.php$jotnets
    jot_networksmod/editlayout.php$jotnets
    jot_toolinclude/conversation.php$jotplugins
    jot_toolmod/editblock.php$jotplugins
    jot_toolmod/editpost.php$jotplugins
    jot_toolmod/editwebpage.php$jotplugins
    jot_toolmod/editlayout.php$jotplugins
    load_pdlboot.php$arr
    local_dir_updateinclude/dir_fns.php$arr
    logged_ininclude/oauth.php$a->user
    logged_ininclude/api.php$a->user
    logged_ininclude/security.php$a->account
    logged_ininclude/security.php$user_record
    logging_outinclude/auth.php$args
    login_hookboot.php$o
    magic_authmod/magic.php$arr
    magic_auth_openid_successmod/openid.php$arr
    magic_auth_openid_successmod/openid.php$arr
    magic_auth_successmod/post.php$arr
    main_sliderinclude/widgets.php$arr
    marital_selectorinclude/profile_selectors.php$select
    marital_selector_mininclude/profile_selectors.php$select
    module_loadedindex.php$x
    mood_verbsinclude/text.php$arr
    navinclude/nav.php$x
    network_content_initmod/network.php$arr
    network_pingmod/ping.php$arr
    network_tabsinclude/conversation.php$arr
    network_to_nameinclude/contact_selectors.php$nets
    notifier_endinclude/notifier.php$target_item
    notifier_hubinclude/notifier.php$narr
    notifier_normalinclude/deliver_hooks.php$r[0]
    obj_verbsinclude/taxonomy.php$arr
    oembed_probeinclude/oembed.php$x
    page_content_topindex.php$a->page[content]
    page_endindex.php$a->page[content]
    page_headerinclude/nav.php$a->page[nav]
    parse_atominclude/items.php$arr
    parse_linkmod/linkinfo.php$arr
    pdl_selectorinclude/comanche.php$arr
    perm_is_allowedinclude/permissions.php$arr
    permissions_createinclude/notifier.php$perm_update
    permissions_updateinclude/notifier.php$perm_update
    personal_xrdmod/xrd.php$arr
    photo_post_endinclude/photos.php$ret
    photo_post_endinclude/photos.php$ret
    photo_upload_begininclude/attach.php$arr
    photo_upload_begininclude/photos.php$args
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/attach.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_endinclude/photos.php$ret
    photo_upload_fileinclude/attach.php$f
    photo_upload_fileinclude/photos.php$f
    photo_upload_formmod/photos.php$ret
    poke_verbsinclude/text.php$arr
    post_localinclude/zot.php$arr
    post_localinclude/items.php$arr
    post_localmod/item.php$datarray
    post_local_endinclude/items.php$arr
    post_local_endinclude/attach.php$arr
    post_local_endinclude/attach.php$arr
    post_local_endextend/addon/matrix/randpost/randpost.php$x
    post_local_endextend/addon/matrix/randpost/randpost.php$x
    post_local_endmod/mood.php$arr
    post_local_endmod/like.php$arr
    post_local_endmod/item.php$datarray
    post_local_endmod/subthread.php$arr
    post_local_startmod/item.php$_REQUEST
    post_mailinclude/items.php$arr
    post_mail_endinclude/items.php$arr
    post_remoteinclude/items.php$arr
    post_remote_endinclude/items.php$arr
    post_remote_updateinclude/items.php$arr
    post_remote_update_endinclude/items.php$arr
    prepare_bodyinclude/text.php$prep_arr
    prepare_body_finalinclude/text.php$prep_arr
    prepare_body_initinclude/text.php$item
    probe_well_knowninclude/probe.php$ret
    proc_runboot.php$arr
    process_channel_sync_deliveryinclude/zot.php$addon
    profile_advancedmod/profile.php$o
    profile_editmod/profiles.php$arr
    profile_photo_content_endmod/profile_photo.php$o
    profile_postmod/profiles.php$_POST
    profile_sidebarinclude/channel.php$arr
    profile_sidebar_enterinclude/channel.php$profile
    profile_tabsinclude/conversation.php$arr
    register_accountinclude/account.php$result
    render_locationinclude/conversation.php$locate
    replace_macrosinclude/text.php$arr
    reverse_magic_authmod/rmagic.php$arr
    settings_accountmod/settings.php$_POST
    settings_formmod/settings.php$o
    settings_postmod/settings.php$_POST
    sexpref_selectorinclude/profile_selectors.php$select
    sexpref_selector_mininclude/profile_selectors.php$select
    smilieinclude/text.php$params
    smilieextend/addon/matrix/smileybutton/smileybutton.php$params
    taggedinclude/items.php$arr
    validate_channelnameinclude/channel.php$arr
    webfingermod/wfinger.php$arr
    well_knownmod/_well_known.php$arr
    zidinclude/channel.php$arr
    zid_initinclude/channel.php$arr
    zot_fingerinclude/zot.php$ret

    Generated Tue Nov 03 21:19:02 PST 2015

    \ No newline at end of file diff --git a/include/account.php b/include/account.php index 5998609d4..e367e002d 100644 --- a/include/account.php +++ b/include/account.php @@ -11,7 +11,7 @@ require_once('include/text.php'); require_once('include/language.php'); require_once('include/datetime.php'); require_once('include/crypto.php'); -require_once('include/identity.php'); +require_once('include/channel.php'); function check_account_email($email) { diff --git a/include/api.php b/include/api.php index 4a462d1e8..ba36cc01a 100644 --- a/include/api.php +++ b/include/api.php @@ -514,7 +514,7 @@ require_once('include/api_auth.php'); return false; } - require_once('include/identity.php'); + require_once('include/channel.php'); json_return_and_die(identity_basic_export(api_user(),(($_REQUEST['posts']) ? intval($_REQUEST['posts']) : 0 ))); } diff --git a/include/apps.php b/include/apps.php index 7439be6d4..e300bc50d 100644 --- a/include/apps.php +++ b/include/apps.php @@ -6,7 +6,7 @@ */ require_once('include/plugin.php'); -require_once('include/identity.php'); +require_once('include/channel.php'); function get_system_apps($translate = true) { diff --git a/include/identity.php b/include/channel.php similarity index 99% rename from include/identity.php rename to include/channel.php index 4ef1105ea..050c4824b 100644 --- a/include/identity.php +++ b/include/channel.php @@ -1,6 +1,6 @@ 0", + $r = q("select account_id from account where (account_roles & %d) > 0", intval(ACCOUNT_ROLE_ADMIN) ); diff --git a/include/contact_widgets.php b/include/contact_widgets.php index e62d57aa2..14d26e257 100644 --- a/include/contact_widgets.php +++ b/include/contact_widgets.php @@ -3,9 +3,6 @@ function findpeople_widget() { - require_once('include/Contact.php'); - - $a = get_app(); if(get_config('system','invitation_only')) { $x = get_pconfig(local_channel(),'system','invites_remaining'); @@ -37,7 +34,6 @@ function findpeople_widget() { function fileas_widget($baseurl,$selected = '') { - $a = get_app(); if(! local_channel()) return ''; @@ -65,8 +61,6 @@ function fileas_widget($baseurl,$selected = '') { } function categories_widget($baseurl,$selected = '') { - - $a = get_app(); if(! feature_enabled(App::$profile['profile_uid'],'categories')) return ''; @@ -108,8 +102,6 @@ function categories_widget($baseurl,$selected = '') { function common_friends_visitor_widget($profile_uid) { - $a = get_app(); - if(local_channel() == $profile_uid) return; diff --git a/include/conversation.php b/include/conversation.php index fca07a91d..ca73a7a07 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -1107,7 +1107,6 @@ function status_editor($a, $x, $popup = false) { $o = ''; - require_once('include/Contact.php'); $c = channelx_by_n($x['profile_uid']); if($c && $c['channel_moved']) return $o; @@ -1160,7 +1159,7 @@ function status_editor($a, $x, $popup = false) { $layoutselect = ''; if(array_key_exists('channel_select',$x) && $x['channel_select']) { - require_once('include/identity.php'); + require_once('include/channel.php'); $id_select = identity_selector(); } else diff --git a/include/feedutils.php b/include/feedutils.php index 700198ff8..f370c540a 100644 --- a/include/feedutils.php +++ b/include/feedutils.php @@ -1087,7 +1087,6 @@ function update_feed_item($uid,$datarray) { function handle_feed($uid,$abook_id,$url) { - require_once('include/Contact.php'); $channel = channelx_by_n($uid); if(! $channel) return; diff --git a/include/items.php b/include/items.php index a25be72b3..de0941c3c 100755 --- a/include/items.php +++ b/include/items.php @@ -77,7 +77,7 @@ function collect_recipients($item, &$private_envelope) { // by the directives in $item['public_policy']. $private_envelope = false; - require_once('include/identity.php'); + require_once('include/channel.php'); //$sys = get_sys_channel(); if(array_key_exists('public_policy',$item) && $item['public_policy'] !== 'self') { diff --git a/include/text.php b/include/text.php index df6dac056..91aeae989 100644 --- a/include/text.php +++ b/include/text.php @@ -1319,7 +1319,7 @@ function theme_attachments(&$item) { $title = t('Size') . ' ' . (($r['length']) ? userReadableSize($r['length']) : t('unknown')); - require_once('include/identity.php'); + require_once('include/channel.php'); if(is_foreigner($item['author_xchan'])) $url = $r['href']; else @@ -1486,7 +1486,7 @@ function format_event($jobject) { } function prepare_body(&$item,$attach = false) { - require_once('include/identity.php'); + require_once('include/channel.php'); call_hooks('prepare_body_init', $item); @@ -2261,7 +2261,7 @@ function design_tools() { $sys = false; if(App::$is_sys && is_site_admin()) { - require_once('include/identity.php'); + require_once('include/channel.php'); $channel = get_sys_channel(); $sys = true; } diff --git a/include/widgets.php b/include/widgets.php index 2641a718e..a158633ad 100644 --- a/include/widgets.php +++ b/include/widgets.php @@ -8,7 +8,7 @@ require_once('include/dir_fns.php'); require_once('include/contact_widgets.php'); require_once('include/attach.php'); -require_once('include/Contact.php'); + function widget_profile($args) { @@ -806,7 +806,6 @@ function widget_photo_albums($arr) { function widget_vcard($arr) { - require_once ('include/Contact.php'); return vcard_from_xchan('', App::get_observer()); } @@ -1052,7 +1051,7 @@ function widget_photo($arr) { function widget_cover_photo($arr) { - require_once('include/identity.php'); + require_once('include/channel.php'); $o = ''; if(App::$module == 'channel' && $_REQUEST['mid']) diff --git a/include/zot.php b/include/zot.php index f5fb87e12..4b780db2a 100644 --- a/include/zot.php +++ b/include/zot.php @@ -1332,7 +1332,7 @@ function zot_import($arr, $sender_url) { */ function public_recips($msg) { - require_once('include/identity.php'); + require_once('include/channel.php'); $check_mentions = false; $include_sys = false; @@ -3222,7 +3222,6 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { $clean = array(); if($abook['abook_xchan'] && $abook['entry_deleted']) { logger('process_channel_sync_delivery: removing abook entry for ' . $abook['abook_xchan']); - require_once('include/Contact.php'); $r = q("select abook_id, abook_feed from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1", dbesc($abook['abook_xchan']), @@ -3926,7 +3925,7 @@ function zotinfo($arr) { $ret['site']['accounts'] = account_total(); - require_once('include/identity.php'); + require_once('include/channel.php'); $ret['site']['channels'] = channel_total(); @@ -4421,7 +4420,6 @@ function zot_reply_purge($sender,$recipients) { $arr = $sender; $sender_hash = make_xchan_hash($arr['guid'],$arr['guid_sig']); - require_once('include/Contact.php'); remove_all_xchan_resources($sender_hash); $ret['success'] = true; diff --git a/util/hmessages.po b/util/hmessages.po index abc4d1a9f..c863c6a67 100644 --- a/util/hmessages.po +++ b/util/hmessages.po @@ -111,8 +111,8 @@ msgstr "" #: ../../Zotlabs/Module/Editwebpage.php:146 #: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Menu.php:112 #: ../../Zotlabs/Module/Settings.php:652 ../../Zotlabs/Module/Thing.php:260 -#: ../../Zotlabs/Module/Webpages.php:187 ../../include/identity.php:937 -#: ../../include/identity.php:941 ../../include/ItemObject.php:100 +#: ../../Zotlabs/Module/Webpages.php:187 ../../include/channel.php:937 +#: ../../include/channel.php:941 ../../include/ItemObject.php:100 #: ../../include/menu.php:108 ../../include/page_widgets.php:8 #: ../../include/page_widgets.php:36 ../../include/apps.php:291 msgid "Edit" @@ -247,7 +247,7 @@ msgstr "" #: ../../Zotlabs/Module/Editwebpage.php:33 #: ../../Zotlabs/Module/Filestorage.php:60 ../../Zotlabs/Module/Hcard.php:12 #: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Profile.php:20 -#: ../../Zotlabs/Module/Webpages.php:34 ../../include/identity.php:837 +#: ../../Zotlabs/Module/Webpages.php:34 ../../include/channel.php:837 msgid "Requested profile is not available." msgstr "" @@ -2030,8 +2030,8 @@ msgstr "" #: ../../Zotlabs/Module/Settings.php:346 ../../Zotlabs/Module/Settings.php:347 #: ../../Zotlabs/Module/Settings.php:350 ../../Zotlabs/Module/Settings.php:361 #: ../../include/profile_selectors.php:80 ../../include/widgets.php:495 -#: ../../include/identity.php:389 ../../include/identity.php:390 -#: ../../include/identity.php:397 +#: ../../include/channel.php:389 ../../include/channel.php:390 +#: ../../include/channel.php:397 msgid "Friends" msgstr "" @@ -2236,7 +2236,7 @@ msgstr "" msgid "%1$s updated their %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/identity.php:1807 +#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1807 msgid "cover photo" msgstr "" @@ -2318,12 +2318,12 @@ msgstr "" msgid "Homepage: " msgstr "" -#: ../../Zotlabs/Module/Directory.php:306 ../../include/identity.php:1329 +#: ../../Zotlabs/Module/Directory.php:306 ../../include/channel.php:1329 msgid "Age:" msgstr "" #: ../../Zotlabs/Module/Directory.php:311 ../../include/event.php:52 -#: ../../include/identity.php:1029 ../../include/text.php:1481 +#: ../../include/channel.php:1029 ../../include/text.php:1481 #: ../../include/bb2diaspora.php:509 msgid "Location:" msgstr "" @@ -2332,18 +2332,18 @@ msgstr "" msgid "Description:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:322 ../../include/identity.php:1345 +#: ../../Zotlabs/Module/Directory.php:322 ../../include/channel.php:1345 msgid "Hometown:" msgstr "" -#: ../../Zotlabs/Module/Directory.php:324 ../../include/identity.php:1353 +#: ../../Zotlabs/Module/Directory.php:324 ../../include/channel.php:1353 msgid "About:" msgstr "" #: ../../Zotlabs/Module/Directory.php:325 ../../Zotlabs/Module/Match.php:68 #: ../../Zotlabs/Module/Suggest.php:56 ../../include/Contact.php:101 #: ../../include/widgets.php:147 ../../include/widgets.php:184 -#: ../../include/identity.php:1014 ../../include/conversation.php:961 +#: ../../include/channel.php:1014 ../../include/conversation.php:961 msgid "Connect" msgstr "" @@ -4182,7 +4182,7 @@ msgstr "" msgid "View all" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1130 ../../include/identity.php:1304 +#: ../../Zotlabs/Module/Photos.php:1130 ../../include/channel.php:1304 #: ../../include/ItemObject.php:179 ../../include/conversation.php:1748 #: ../../include/taxonomy.php:403 msgctxt "noun" @@ -4243,13 +4243,13 @@ msgstr "" msgid "added your channel" msgstr "" -#: ../../Zotlabs/Module/Ping.php:322 ../../include/identity.php:1123 -#: ../../include/identity.php:1199 +#: ../../Zotlabs/Module/Ping.php:322 ../../include/channel.php:1123 +#: ../../include/channel.php:1199 msgid "g A l F d" msgstr "" -#: ../../Zotlabs/Module/Ping.php:345 ../../include/identity.php:1169 -#: ../../include/identity.php:1239 +#: ../../Zotlabs/Module/Ping.php:345 ../../include/channel.php:1169 +#: ../../include/channel.php:1239 msgid "[today]" msgstr "" @@ -4387,7 +4387,7 @@ msgid "View this profile" msgstr "" #: ../../Zotlabs/Module/Profiles.php:693 ../../Zotlabs/Module/Profiles.php:775 -#: ../../include/identity.php:959 +#: ../../include/channel.php:959 msgid "Edit visibility" msgstr "" @@ -4399,7 +4399,7 @@ msgstr "" msgid "Change cover photo" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:696 ../../include/identity.php:930 +#: ../../Zotlabs/Module/Profiles.php:696 ../../include/channel.php:930 msgid "Change profile photo" msgstr "" @@ -4560,11 +4560,11 @@ msgstr "" msgid "My other channels" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:771 ../../include/identity.php:955 +#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:955 msgid "Profile Image" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:781 ../../include/identity.php:937 +#: ../../Zotlabs/Module/Profiles.php:781 ../../include/channel.php:937 #: ../../include/nav.php:88 msgid "Edit Profiles" msgstr "" @@ -4577,7 +4577,7 @@ msgstr "" msgid "Profile Visibility Editor" msgstr "" -#: ../../Zotlabs/Module/Profperm.php:117 ../../include/identity.php:1395 +#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1395 msgid "Profile" msgstr "" @@ -5190,7 +5190,7 @@ msgstr "" msgid "Basic Settings" msgstr "" -#: ../../Zotlabs/Module/Settings.php:1040 ../../include/identity.php:1286 +#: ../../Zotlabs/Module/Settings.php:1040 ../../include/channel.php:1286 msgid "Full Name:" msgstr "" @@ -6952,185 +6952,185 @@ msgstr "" msgid "Room is full" msgstr "" -#: ../../include/identity.php:32 +#: ../../include/channel.php:32 msgid "Unable to obtain identity information from database" msgstr "" -#: ../../include/identity.php:66 +#: ../../include/channel.php:66 msgid "Empty name" msgstr "" -#: ../../include/identity.php:69 +#: ../../include/channel.php:69 msgid "Name too long" msgstr "" -#: ../../include/identity.php:180 +#: ../../include/channel.php:180 msgid "No account identifier" msgstr "" -#: ../../include/identity.php:192 +#: ../../include/channel.php:192 msgid "Nickname is required." msgstr "" -#: ../../include/identity.php:206 +#: ../../include/channel.php:206 msgid "Reserved nickname. Please choose another." msgstr "" -#: ../../include/identity.php:211 +#: ../../include/channel.php:211 msgid "" "Nickname has unsupported characters or is already being used on this site." msgstr "" -#: ../../include/identity.php:287 +#: ../../include/channel.php:287 msgid "Unable to retrieve created identity" msgstr "" -#: ../../include/identity.php:345 +#: ../../include/channel.php:345 msgid "Default Profile" msgstr "" -#: ../../include/identity.php:791 +#: ../../include/channel.php:791 msgid "Requested channel is not available." msgstr "" -#: ../../include/identity.php:938 +#: ../../include/channel.php:938 msgid "Create New Profile" msgstr "" -#: ../../include/identity.php:941 ../../include/nav.php:90 +#: ../../include/channel.php:941 ../../include/nav.php:90 msgid "Edit Profile" msgstr "" -#: ../../include/identity.php:958 +#: ../../include/channel.php:958 msgid "Visible to everybody" msgstr "" -#: ../../include/identity.php:1033 ../../include/identity.php:1288 +#: ../../include/channel.php:1033 ../../include/channel.php:1288 msgid "Gender:" msgstr "" -#: ../../include/identity.php:1034 ../../include/identity.php:1332 +#: ../../include/channel.php:1034 ../../include/channel.php:1332 msgid "Status:" msgstr "" -#: ../../include/identity.php:1035 ../../include/identity.php:1343 +#: ../../include/channel.php:1035 ../../include/channel.php:1343 msgid "Homepage:" msgstr "" -#: ../../include/identity.php:1036 +#: ../../include/channel.php:1036 msgid "Online Now" msgstr "" -#: ../../include/identity.php:1124 ../../include/identity.php:1200 +#: ../../include/channel.php:1124 ../../include/channel.php:1200 msgid "F d" msgstr "" -#: ../../include/identity.php:1180 +#: ../../include/channel.php:1180 msgid "Birthday Reminders" msgstr "" -#: ../../include/identity.php:1181 +#: ../../include/channel.php:1181 msgid "Birthdays this week:" msgstr "" -#: ../../include/identity.php:1232 +#: ../../include/channel.php:1232 msgid "[No description]" msgstr "" -#: ../../include/identity.php:1250 +#: ../../include/channel.php:1250 msgid "Event Reminders" msgstr "" -#: ../../include/identity.php:1251 +#: ../../include/channel.php:1251 msgid "Events this week:" msgstr "" -#: ../../include/identity.php:1293 +#: ../../include/channel.php:1293 msgid "Like this channel" msgstr "" -#: ../../include/identity.php:1317 +#: ../../include/channel.php:1317 msgid "j F, Y" msgstr "" -#: ../../include/identity.php:1318 +#: ../../include/channel.php:1318 msgid "j F" msgstr "" -#: ../../include/identity.php:1325 +#: ../../include/channel.php:1325 msgid "Birthday:" msgstr "" -#: ../../include/identity.php:1338 +#: ../../include/channel.php:1338 #, php-format msgid "for %1$d %2$s" msgstr "" -#: ../../include/identity.php:1341 +#: ../../include/channel.php:1341 msgid "Sexual Preference:" msgstr "" -#: ../../include/identity.php:1347 +#: ../../include/channel.php:1347 msgid "Tags:" msgstr "" -#: ../../include/identity.php:1349 +#: ../../include/channel.php:1349 msgid "Political Views:" msgstr "" -#: ../../include/identity.php:1351 +#: ../../include/channel.php:1351 msgid "Religion:" msgstr "" -#: ../../include/identity.php:1355 +#: ../../include/channel.php:1355 msgid "Hobbies/Interests:" msgstr "" -#: ../../include/identity.php:1357 +#: ../../include/channel.php:1357 msgid "Likes:" msgstr "" -#: ../../include/identity.php:1359 +#: ../../include/channel.php:1359 msgid "Dislikes:" msgstr "" -#: ../../include/identity.php:1361 +#: ../../include/channel.php:1361 msgid "Contact information and Social Networks:" msgstr "" -#: ../../include/identity.php:1363 +#: ../../include/channel.php:1363 msgid "My other channels:" msgstr "" -#: ../../include/identity.php:1365 +#: ../../include/channel.php:1365 msgid "Musical interests:" msgstr "" -#: ../../include/identity.php:1367 +#: ../../include/channel.php:1367 msgid "Books, literature:" msgstr "" -#: ../../include/identity.php:1369 +#: ../../include/channel.php:1369 msgid "Television:" msgstr "" -#: ../../include/identity.php:1371 +#: ../../include/channel.php:1371 msgid "Film/dance/culture/entertainment:" msgstr "" -#: ../../include/identity.php:1373 +#: ../../include/channel.php:1373 msgid "Love/Romance:" msgstr "" -#: ../../include/identity.php:1375 +#: ../../include/channel.php:1375 msgid "Work/employment:" msgstr "" -#: ../../include/identity.php:1377 +#: ../../include/channel.php:1377 msgid "School/education:" msgstr "" -#: ../../include/identity.php:1397 +#: ../../include/channel.php:1397 msgid "Like this thing" msgstr "" diff --git a/util/messages.po b/util/messages.po index f3c9782f3..dd847e9e0 100644 --- a/util/messages.po +++ b/util/messages.po @@ -1023,7 +1023,7 @@ msgstr "" #: ../../include/widgets.php:136 ../../include/widgets.php:175 #: ../../include/Contact.php:107 ../../include/conversation.php:956 -#: ../../include/identity.php:956 ../../mod/directory.php:316 +#: ../../include/channel.php:956 ../../mod/directory.php:316 #: ../../mod/match.php:64 ../../mod/suggest.php:52 msgid "Connect" msgstr "" @@ -1088,8 +1088,8 @@ msgstr "" msgid "Family" msgstr "" -#: ../../include/widgets.php:431 ../../include/identity.php:394 -#: ../../include/identity.php:395 ../../include/identity.php:402 +#: ../../include/widgets.php:431 ../../include/channel.php:394 +#: ../../include/channel.php:395 ../../include/channel.php:402 #: ../../include/profile_selectors.php:80 ../../mod/settings.php:345 #: ../../mod/settings.php:349 ../../mod/settings.php:350 #: ../../mod/settings.php:353 ../../mod/settings.php:364 @@ -1206,7 +1206,7 @@ msgid "Finishes:" msgstr "" #: ../../include/event.php:50 ../../include/bb2diaspora.php:481 -#: ../../include/identity.php:1007 ../../mod/directory.php:302 +#: ../../include/channel.php:1007 ../../mod/directory.php:302 #: ../../mod/events.php:684 msgid "Location:" msgstr "" @@ -1523,7 +1523,7 @@ msgid "View all" msgstr "" #: ../../include/ItemObject.php:179 ../../include/taxonomy.php:396 -#: ../../include/conversation.php:1712 ../../include/identity.php:1266 +#: ../../include/conversation.php:1712 ../../include/channel.php:1266 #: ../../mod/photos.php:1019 msgctxt "noun" msgid "Like" @@ -1775,7 +1775,7 @@ msgstr "" msgid "Manage/Edit profiles" msgstr "" -#: ../../include/nav.php:95 ../../include/identity.php:979 +#: ../../include/nav.php:95 ../../include/channel.php:979 msgid "Edit Profile" msgstr "" @@ -3279,48 +3279,48 @@ msgstr "" msgid "database storage failed." msgstr "" -#: ../../include/identity.php:33 +#: ../../include/channel.php:33 msgid "Unable to obtain identity information from database" msgstr "" -#: ../../include/identity.php:67 +#: ../../include/channel.php:67 msgid "Empty name" msgstr "" -#: ../../include/identity.php:70 +#: ../../include/channel.php:70 msgid "Name too long" msgstr "" -#: ../../include/identity.php:186 +#: ../../include/channel.php:186 msgid "No account identifier" msgstr "" -#: ../../include/identity.php:198 +#: ../../include/channel.php:198 msgid "Nickname is required." msgstr "" -#: ../../include/identity.php:212 +#: ../../include/channel.php:212 msgid "Reserved nickname. Please choose another." msgstr "" -#: ../../include/identity.php:217 ../../include/dimport.php:34 +#: ../../include/channel.php:217 ../../include/dimport.php:34 msgid "" "Nickname has unsupported characters or is already being used on this site." msgstr "" -#: ../../include/identity.php:292 +#: ../../include/channel.php:292 msgid "Unable to retrieve created identity" msgstr "" -#: ../../include/identity.php:350 +#: ../../include/channel.php:350 msgid "Default Profile" msgstr "" -#: ../../include/identity.php:759 +#: ../../include/channel.php:759 msgid "Requested channel is not available." msgstr "" -#: ../../include/identity.php:806 ../../mod/profile.php:16 +#: ../../include/channel.php:806 ../../mod/profile.php:16 #: ../../mod/achievements.php:11 ../../mod/webpages.php:29 #: ../../mod/connect.php:13 ../../mod/hcard.php:8 ../../mod/blocks.php:29 #: ../../mod/editlayout.php:27 ../../mod/editwebpage.php:28 @@ -3329,193 +3329,193 @@ msgstr "" msgid "Requested profile is not available." msgstr "" -#: ../../include/identity.php:969 ../../mod/profiles.php:774 +#: ../../include/channel.php:969 ../../mod/profiles.php:774 msgid "Change profile photo" msgstr "" -#: ../../include/identity.php:975 +#: ../../include/channel.php:975 msgid "Profiles" msgstr "" -#: ../../include/identity.php:975 +#: ../../include/channel.php:975 msgid "Manage/edit profiles" msgstr "" -#: ../../include/identity.php:976 ../../mod/profiles.php:775 +#: ../../include/channel.php:976 ../../mod/profiles.php:775 msgid "Create New Profile" msgstr "" -#: ../../include/identity.php:991 ../../mod/profiles.php:786 +#: ../../include/channel.php:991 ../../mod/profiles.php:786 msgid "Profile Image" msgstr "" -#: ../../include/identity.php:994 +#: ../../include/channel.php:994 msgid "visible to everybody" msgstr "" -#: ../../include/identity.php:995 ../../mod/profiles.php:669 +#: ../../include/channel.php:995 ../../mod/profiles.php:669 #: ../../mod/profiles.php:790 msgid "Edit visibility" msgstr "" -#: ../../include/identity.php:1011 ../../include/identity.php:1250 +#: ../../include/channel.php:1011 ../../include/channel.php:1250 msgid "Gender:" msgstr "" -#: ../../include/identity.php:1012 ../../include/identity.php:1294 +#: ../../include/channel.php:1012 ../../include/channel.php:1294 msgid "Status:" msgstr "" -#: ../../include/identity.php:1013 ../../include/identity.php:1305 +#: ../../include/channel.php:1013 ../../include/channel.php:1305 msgid "Homepage:" msgstr "" -#: ../../include/identity.php:1014 +#: ../../include/channel.php:1014 msgid "Online Now" msgstr "" -#: ../../include/identity.php:1097 ../../include/identity.php:1175 +#: ../../include/channel.php:1097 ../../include/channel.php:1175 #: ../../mod/ping.php:324 msgid "g A l F d" msgstr "" -#: ../../include/identity.php:1098 ../../include/identity.php:1176 +#: ../../include/channel.php:1098 ../../include/channel.php:1176 msgid "F d" msgstr "" -#: ../../include/identity.php:1143 ../../include/identity.php:1215 +#: ../../include/channel.php:1143 ../../include/channel.php:1215 #: ../../mod/ping.php:346 msgid "[today]" msgstr "" -#: ../../include/identity.php:1154 +#: ../../include/channel.php:1154 msgid "Birthday Reminders" msgstr "" -#: ../../include/identity.php:1155 +#: ../../include/channel.php:1155 msgid "Birthdays this week:" msgstr "" -#: ../../include/identity.php:1208 +#: ../../include/channel.php:1208 msgid "[No description]" msgstr "" -#: ../../include/identity.php:1226 +#: ../../include/channel.php:1226 msgid "Event Reminders" msgstr "" -#: ../../include/identity.php:1227 +#: ../../include/channel.php:1227 msgid "Events this week:" msgstr "" -#: ../../include/identity.php:1240 ../../include/identity.php:1357 +#: ../../include/channel.php:1240 ../../include/channel.php:1357 #: ../../include/apps.php:138 ../../mod/profperm.php:112 msgid "Profile" msgstr "" -#: ../../include/identity.php:1248 ../../mod/settings.php:1056 +#: ../../include/channel.php:1248 ../../mod/settings.php:1056 msgid "Full Name:" msgstr "" -#: ../../include/identity.php:1255 +#: ../../include/channel.php:1255 msgid "Like this channel" msgstr "" -#: ../../include/identity.php:1279 +#: ../../include/channel.php:1279 msgid "j F, Y" msgstr "" -#: ../../include/identity.php:1280 +#: ../../include/channel.php:1280 msgid "j F" msgstr "" -#: ../../include/identity.php:1287 +#: ../../include/channel.php:1287 msgid "Birthday:" msgstr "" -#: ../../include/identity.php:1291 ../../mod/directory.php:297 +#: ../../include/channel.php:1291 ../../mod/directory.php:297 msgid "Age:" msgstr "" -#: ../../include/identity.php:1300 +#: ../../include/channel.php:1300 #, php-format msgid "for %1$d %2$s" msgstr "" -#: ../../include/identity.php:1303 ../../mod/profiles.php:691 +#: ../../include/channel.php:1303 ../../mod/profiles.php:691 msgid "Sexual Preference:" msgstr "" -#: ../../include/identity.php:1307 ../../mod/directory.php:313 +#: ../../include/channel.php:1307 ../../mod/directory.php:313 #: ../../mod/profiles.php:693 msgid "Hometown:" msgstr "" -#: ../../include/identity.php:1309 +#: ../../include/channel.php:1309 msgid "Tags:" msgstr "" -#: ../../include/identity.php:1311 ../../mod/profiles.php:694 +#: ../../include/channel.php:1311 ../../mod/profiles.php:694 msgid "Political Views:" msgstr "" -#: ../../include/identity.php:1313 +#: ../../include/channel.php:1313 msgid "Religion:" msgstr "" -#: ../../include/identity.php:1315 ../../mod/directory.php:315 +#: ../../include/channel.php:1315 ../../mod/directory.php:315 msgid "About:" msgstr "" -#: ../../include/identity.php:1317 +#: ../../include/channel.php:1317 msgid "Hobbies/Interests:" msgstr "" -#: ../../include/identity.php:1319 ../../mod/profiles.php:697 +#: ../../include/channel.php:1319 ../../mod/profiles.php:697 msgid "Likes:" msgstr "" -#: ../../include/identity.php:1321 ../../mod/profiles.php:698 +#: ../../include/channel.php:1321 ../../mod/profiles.php:698 msgid "Dislikes:" msgstr "" -#: ../../include/identity.php:1323 +#: ../../include/channel.php:1323 msgid "Contact information and Social Networks:" msgstr "" -#: ../../include/identity.php:1325 +#: ../../include/channel.php:1325 msgid "My other channels:" msgstr "" -#: ../../include/identity.php:1327 +#: ../../include/channel.php:1327 msgid "Musical interests:" msgstr "" -#: ../../include/identity.php:1329 +#: ../../include/channel.php:1329 msgid "Books, literature:" msgstr "" -#: ../../include/identity.php:1331 +#: ../../include/channel.php:1331 msgid "Television:" msgstr "" -#: ../../include/identity.php:1333 +#: ../../include/channel.php:1333 msgid "Film/dance/culture/entertainment:" msgstr "" -#: ../../include/identity.php:1335 +#: ../../include/channel.php:1335 msgid "Love/Romance:" msgstr "" -#: ../../include/identity.php:1337 +#: ../../include/channel.php:1337 msgid "Work/employment:" msgstr "" -#: ../../include/identity.php:1339 +#: ../../include/channel.php:1339 msgid "School/education:" msgstr "" -#: ../../include/identity.php:1359 +#: ../../include/channel.php:1359 msgid "Like this thing" msgstr "" From 5e0698ba8731e7e4659a24c0ab4fa9c4a1aef173 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 17:52:30 -0700 Subject: [PATCH 33/39] turn the oft-repeated block_public ... check into a function observer_prohibited() --- Zotlabs/Module/Acl.php | 2 +- Zotlabs/Module/Cal.php | 9 +- Zotlabs/Module/Channel.php | 612 +++++++++++++++-------------- Zotlabs/Module/Directory.php | 4 +- Zotlabs/Module/Display.php | 6 +- Zotlabs/Module/Feed.php | 2 +- Zotlabs/Module/Photos.php | 4 +- Zotlabs/Module/Profile.php | 4 +- Zotlabs/Module/Pubstream.php | 2 +- Zotlabs/Module/Ratings.php | 6 +- Zotlabs/Module/Viewconnections.php | 4 +- Zotlabs/Module/Zotfeed.php | 4 +- boot.php | 9 + include/channel.php | 2 +- include/socgraph.php | 2 +- include/widgets.php | 8 +- 16 files changed, 342 insertions(+), 338 deletions(-) diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php index 5c14ab599..62ac29286 100644 --- a/Zotlabs/Module/Acl.php +++ b/Zotlabs/Module/Acl.php @@ -260,7 +260,7 @@ class Acl extends \Zotlabs\Web\Controller { // logger('navbar_complete'); - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { return; } diff --git a/Zotlabs/Module/Cal.php b/Zotlabs/Module/Cal.php index 602a2b5ab..a1adb30e5 100644 --- a/Zotlabs/Module/Cal.php +++ b/Zotlabs/Module/Cal.php @@ -11,7 +11,7 @@ require_once('include/items.php'); class Cal extends \Zotlabs\Web\Controller { function init() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { return; } @@ -45,13 +45,12 @@ class Cal extends \Zotlabs\Web\Controller { - function get() { + function get() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { return; } - - + $channel = null; if(argc() > 1) { diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php index f55705442..29bfcbc3c 100644 --- a/Zotlabs/Module/Channel.php +++ b/Zotlabs/Module/Channel.php @@ -13,353 +13,355 @@ require_once('include/PermissionDescription.php'); class Channel extends \Zotlabs\Web\Controller { -function init() { + function init() { - $which = null; - if(argc() > 1) - $which = argv(1); - if(! $which) { - if(local_channel()) { - $channel = \App::get_channel(); - if($channel && $channel['channel_address']) + $which = null; + if(argc() > 1) + $which = argv(1); + if(! $which) { + if(local_channel()) { + $channel = \App::get_channel(); + if($channel && $channel['channel_address']) + $which = $channel['channel_address']; + } + } + if(! $which) { + notice( t('You must be logged in to see this page.') . EOL ); + return; + } + + $profile = 0; + $channel = \App::get_channel(); + + if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) { $which = $channel['channel_address']; + $profile = argv(1); } - } - if(! $which) { - notice( t('You must be logged in to see this page.') . EOL ); - return; + + \App::$page['htmlhead'] .= '' . "\r\n" ; + \App::$page['htmlhead'] .= '' . "\r\n" ; + + // Not yet ready for prime time + // \App::$page['htmlhead'] .= '' . "\r\n" ; + // \App::$page['htmlhead'] .= '' . "\r\n" ; + + // Run profile_load() here to make sure the theme is set before + // we start loading content + + profile_load($a,$which,$profile); + } - $profile = 0; - $channel = \App::get_channel(); - - if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) { - $which = $channel['channel_address']; - $profile = argv(1); - } - - \App::$page['htmlhead'] .= '' . "\r\n" ; - \App::$page['htmlhead'] .= '' . "\r\n" ; - -// Not yet ready for prime time -// \App::$page['htmlhead'] .= '' . "\r\n" ; -// \App::$page['htmlhead'] .= '' . "\r\n" ; - - // Run profile_load() here to make sure the theme is set before - // we start loading content - - profile_load($a,$which,$profile); - -} - -function get($update = 0, $load = false) { + function get($update = 0, $load = false) { - if($load) - $_SESSION['loadtime'] = datetime_convert(); + if($load) + $_SESSION['loadtime'] = datetime_convert(); - $checkjs = new \Zotlabs\Web\CheckJS(1); + $checkjs = new \Zotlabs\Web\CheckJS(1); - $category = $datequery = $datequery2 = ''; + $category = $datequery = $datequery2 = ''; - $mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : ''); + $mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : ''); - $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : ''); - $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : ''); + $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : ''); + $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : ''); - if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) { + if(observer_prohibited(true)) { return login(); - } - - $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : ''); - $hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : ''); - - $groups = array(); - - $o = ''; - - if($update) { - // Ensure we've got a profile owner if updating. - \App::$profile['profile_uid'] = \App::$profile_uid = $update; - } - else { - if(\App::$profile['profile_uid'] == local_channel()) { - nav_set_selected('home'); } - } - $is_owner = (((local_channel()) && (\App::$profile['profile_uid'] == local_channel())) ? true : false); + $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : ''); + $hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : ''); - $channel = \App::get_channel(); - $observer = \App::get_observer(); - $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); + $groups = array(); - $perms = get_all_perms(\App::$profile['profile_uid'],$ob_hash); + $o = ''; - if(! $perms['view_stream']) { + if($update) { + // Ensure we've got a profile owner if updating. + \App::$profile['profile_uid'] = \App::$profile_uid = $update; + } + else { + if(\App::$profile['profile_uid'] == local_channel()) { + nav_set_selected('home'); + } + } + + $is_owner = (((local_channel()) && (\App::$profile['profile_uid'] == local_channel())) ? true : false); + + $channel = \App::get_channel(); + $observer = \App::get_observer(); + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); + + $perms = get_all_perms(\App::$profile['profile_uid'],$ob_hash); + + if(! $perms['view_stream']) { // We may want to make the target of this redirect configurable if($perms['view_profile']) { notice( t('Insufficient permissions. Request redirected to profile page.') . EOL); goaway (z_root() . "/profile/" . \App::$profile['channel_address']); } - notice( t('Permission denied.') . EOL); - return; - } - - - if(! $update) { - - $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']); - - $o .= common_friends_visitor_widget(\App::$profile['profile_uid']); - - if($channel && $is_owner) { - $channel_acl = array( - 'allow_cid' => $channel['channel_allow_cid'], - 'allow_gid' => $channel['channel_allow_gid'], - 'deny_cid' => $channel['channel_deny_cid'], - 'deny_gid' => $channel['channel_deny_gid'] - ); + notice( t('Permission denied.') . EOL); + return; } + + + if(! $update) { + + $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']); + + $o .= common_friends_visitor_widget(\App::$profile['profile_uid']); + + if($channel && $is_owner) { + $channel_acl = array( + 'allow_cid' => $channel['channel_allow_cid'], + 'allow_gid' => $channel['channel_allow_gid'], + 'deny_cid' => $channel['channel_deny_cid'], + 'deny_gid' => $channel['channel_deny_gid'] + ); + } + else + $channel_acl = array(); + + + if($perms['post_wall']) { + + $x = array( + 'is_owner' => $is_owner, + 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(\App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false), + 'default_location' => (($is_owner) ? \App::$profile['channel_location'] : ''), + 'nickname' => \App::$profile['channel_address'], + 'lockstate' => (((strlen(\App::$profile['channel_allow_cid'])) || (strlen(\App::$profile['channel_allow_gid'])) || (strlen(\App::$profile['channel_deny_cid'])) || (strlen(\App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'), + 'acl' => (($is_owner) ? populate_acl($channel_acl,true, \PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''), + 'showacl' => (($is_owner) ? 'yes' : ''), + 'bang' => '', + 'visitor' => (($is_owner || $observer) ? true : false), + 'profile_uid' => \App::$profile['profile_uid'], + 'editor_autocomplete' => true, + 'bbco_autocomplete' => 'bbcode', + 'bbcode' => true + ); + + $o .= status_editor($a,$x); + } + + } + + + /** + * Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups + */ + + $item_normal = item_normal(); + $sql_extra = item_permissions_sql(\App::$profile['profile_uid']); + + if(get_pconfig(\App::$profile['profile_uid'],'system','channel_list_mode') && (! $mid)) + $page_mode = 'list'; else - $channel_acl = array(); + $page_mode = 'client'; + $abook_uids = " and abook.abook_channel = " . intval(\App::$profile['profile_uid']) . " "; - if($perms['post_wall']) { + $simple_update = (($update) ? " AND item_unseen = 1 " : ''); - $x = array( - 'is_owner' => $is_owner, - 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(\App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false), - 'default_location' => (($is_owner) ? \App::$profile['channel_location'] : ''), - 'nickname' => \App::$profile['channel_address'], - 'lockstate' => (((strlen(\App::$profile['channel_allow_cid'])) || (strlen(\App::$profile['channel_allow_gid'])) || (strlen(\App::$profile['channel_deny_cid'])) || (strlen(\App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'), - 'acl' => (($is_owner) ? populate_acl($channel_acl,true, \PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''), - 'showacl' => (($is_owner) ? 'yes' : ''), - 'bang' => '', - 'visitor' => (($is_owner || $observer) ? true : false), - 'profile_uid' => \App::$profile['profile_uid'], - 'editor_autocomplete' => true, - 'bbco_autocomplete' => 'bbcode', - 'bbcode' => true - ); - - $o .= status_editor($a,$x); - } - - } - - - /** - * Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups - */ - - $item_normal = item_normal(); - $sql_extra = item_permissions_sql(\App::$profile['profile_uid']); - - if(get_pconfig(\App::$profile['profile_uid'],'system','channel_list_mode') && (! $mid)) - $page_mode = 'list'; - else - $page_mode = 'client'; - - $abook_uids = " and abook.abook_channel = " . intval(\App::$profile['profile_uid']) . " "; - - $simple_update = (($update) ? " AND item_unseen = 1 " : ''); - - \App::$page['htmlhead'] .= "\r\n" . '' . "\r\n"; + \App::$page['htmlhead'] .= "\r\n" . '' . "\r\n"; - if($update && $_SESSION['loadtime']) - $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) "; - if($load) - $simple_update = ''; + if($update && $_SESSION['loadtime']) + $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) "; + if($load) + $simple_update = ''; - if(($update) && (! $load)) { + if(($update) && (! $load)) { - if ($mid) { - $r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal - AND item_wall = 1 AND item_unseen = 1 $sql_extra limit 1", - dbesc($mid . '%'), - intval(\App::$profile['profile_uid']) - ); - } else { - $r = q("SELECT distinct parent AS `item_id`, created from item - left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) - WHERE uid = %d $item_normal - AND item_wall = 1 $simple_update - AND (abook.abook_blocked = 0 or abook.abook_flags is null) - $sql_extra - ORDER BY created DESC", - intval(\App::$profile['profile_uid']) - ); - $_SESSION['loadtime'] = datetime_convert(); - } - - } - else { - - if(x($category)) { - $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY)); - } - if(x($hashtags)) { - $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG)); - } - - if($datequery) { - $sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery)))); - } - if($datequery2) { - $sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2)))); - } - - $itemspage = get_pconfig(local_channel(),'system','itemspage'); - \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20)); - $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start'])); - - if($load || ($checkjs->disabled())) { - if ($mid) { - $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d $item_normal - AND item_wall = 1 $sql_extra limit 1", - dbesc($mid), + if($mid) { + $r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal + AND item_wall = 1 AND item_unseen = 1 $sql_extra limit 1", + dbesc($mid . '%'), intval(\App::$profile['profile_uid']) ); - if (! $r) { - notice( t('Permission denied.') . EOL); - } - - } else { - $r = q("SELECT distinct id AS item_id, created FROM item - left join abook on item.author_xchan = abook.abook_xchan + } + else { + $r = q("SELECT distinct parent AS `item_id`, created from item + left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) WHERE uid = %d $item_normal - AND item_wall = 1 and item_thread_top = 1 - AND (abook_blocked = 0 or abook.abook_flags is null) - $sql_extra $sql_extra2 - ORDER BY created DESC $pager_sql ", + AND item_wall = 1 $simple_update + AND (abook.abook_blocked = 0 or abook.abook_flags is null) + $sql_extra + ORDER BY created DESC", intval(\App::$profile['profile_uid']) ); + $_SESSION['loadtime'] = datetime_convert(); + } + + } + else { + + if(x($category)) { + $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY)); + } + if(x($hashtags)) { + $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG)); + } + + if($datequery) { + $sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery)))); + } + if($datequery2) { + $sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2)))); + } + + $itemspage = get_pconfig(local_channel(),'system','itemspage'); + \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20)); + $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start'])); + + if($load || ($checkjs->disabled())) { + if($mid) { + $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d $item_normal + AND item_wall = 1 $sql_extra limit 1", + dbesc($mid), + intval(\App::$profile['profile_uid']) + ); + if (! $r) { + notice( t('Permission denied.') . EOL); + } + + } + else { + $r = q("SELECT distinct id AS item_id, created FROM item + left join abook on item.author_xchan = abook.abook_xchan + WHERE uid = %d $item_normal + AND item_wall = 1 and item_thread_top = 1 + AND (abook_blocked = 0 or abook.abook_flags is null) + $sql_extra $sql_extra2 + ORDER BY created DESC $pager_sql ", + intval(\App::$profile['profile_uid']) + ); + } + } + else { + $r = array(); + } + } + + if($r) { + + $parents_str = ids_to_querystr($r,'item_id'); + + $items = q("SELECT `item`.*, `item`.`id` AS `item_id` + FROM `item` + WHERE `item`.`uid` = %d $item_normal + AND `item`.`parent` IN ( %s ) + $sql_extra ", + intval(\App::$profile['profile_uid']), + dbesc($parents_str) + ); + + xchan_query($items); + $items = fetch_post_tags($items, true); + $items = conv_sort($items,'created'); + + if($load && $mid && (! count($items))) { + // This will happen if we don't have sufficient permissions + // to view the parent item (or the item itself if it is toplevel) + notice( t('Permission denied.') . EOL); + } + + } + else { + $items = array(); + } + + if((! $update) && (! $load)) { + + // This is ugly, but we can't pass the profile_uid through the session to the ajax updater, + // because browser prefetching might change it on us. We have to deliver it with the page. + + $maxheight = get_pconfig(\App::$profile['profile_uid'],'system','channel_divmore_height'); + if(! $maxheight) + $maxheight = 400; + + $o .= '
    ' . "\r\n"; + $o .= "\r\n"; + + \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array( + '$baseurl' => z_root(), + '$pgtype' => 'channel', + '$uid' => ((\App::$profile['profile_uid']) ? \App::$profile['profile_uid'] : '0'), + '$gid' => '0', + '$cid' => '0', + '$cmin' => '0', + '$cmax' => '0', + '$star' => '0', + '$liked' => '0', + '$conv' => '0', + '$spam' => '0', + '$nouveau' => '0', + '$wall' => '1', + '$fh' => '0', + '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1), + '$search' => '', + '$order' => '', + '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0), + '$file' => '', + '$cats' => (($category) ? $category : ''), + '$tags' => (($hashtags) ? $hashtags : ''), + '$mid' => $mid, + '$verb' => '', + '$dend' => $datequery, + '$dbegin' => $datequery2 + )); + + + } + + $update_unseen = ''; + + if($page_mode === 'list') { + + /** + * in "list mode", only mark the parent item and any like activities as "seen". + * We won't distinguish between comment likes and post likes. The important thing + * is that the number of unseen comments will be accurate. The SQL to separate the + * comment likes could also get somewhat hairy. + */ + + if($parents_str) { + $update_unseen = " AND ( id IN ( " . dbesc($parents_str) . " )"; + $update_unseen .= " OR ( parent IN ( " . dbesc($parents_str) . " ) AND verb in ( '" . dbesc(ACTIVITY_LIKE) . "','" . dbesc(ACTIVITY_DISLIKE) . "' ))) "; } } else { - $r = array(); - } - } - - if($r) { - - $parents_str = ids_to_querystr($r,'item_id'); - - $items = q("SELECT `item`.*, `item`.`id` AS `item_id` - FROM `item` - WHERE `item`.`uid` = %d $item_normal - AND `item`.`parent` IN ( %s ) - $sql_extra ", - intval(\App::$profile['profile_uid']), - dbesc($parents_str) - ); - - xchan_query($items); - $items = fetch_post_tags($items, true); - $items = conv_sort($items,'created'); - - if ($load && $mid && (! count($items))) { - // This will happen if we don't have sufficient permissions - // to view the parent item (or the item itself if it is toplevel) - notice( t('Permission denied.') . EOL); + if($parents_str) { + $update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )"; + } } - } else { - $items = array(); - } - - if((! $update) && (! $load)) { - - // This is ugly, but we can't pass the profile_uid through the session to the ajax updater, - // because browser prefetching might change it on us. We have to deliver it with the page. - - $maxheight = get_pconfig(\App::$profile['profile_uid'],'system','channel_divmore_height'); - if(! $maxheight) - $maxheight = 400; - - $o .= '
    ' . "\r\n"; - $o .= "\r\n"; - - \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array( - '$baseurl' => z_root(), - '$pgtype' => 'channel', - '$uid' => ((\App::$profile['profile_uid']) ? \App::$profile['profile_uid'] : '0'), - '$gid' => '0', - '$cid' => '0', - '$cmin' => '0', - '$cmax' => '0', - '$star' => '0', - '$liked' => '0', - '$conv' => '0', - '$spam' => '0', - '$nouveau' => '0', - '$wall' => '1', - '$fh' => '0', - '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1), - '$search' => '', - '$order' => '', - '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0), - '$file' => '', - '$cats' => (($category) ? $category : ''), - '$tags' => (($hashtags) ? $hashtags : ''), - '$mid' => $mid, - '$verb' => '', - '$dend' => $datequery, - '$dbegin' => $datequery2 - )); - - - } - - $update_unseen = ''; - - if($page_mode === 'list') { - - /** - * in "list mode", only mark the parent item and any like activities as "seen". - * We won't distinguish between comment likes and post likes. The important thing - * is that the number of unseen comments will be accurate. The SQL to separate the - * comment likes could also get somewhat hairy. - */ - - if($parents_str) { - $update_unseen = " AND ( id IN ( " . dbesc($parents_str) . " )"; - $update_unseen .= " OR ( parent IN ( " . dbesc($parents_str) . " ) AND verb in ( '" . dbesc(ACTIVITY_LIKE) . "','" . dbesc(ACTIVITY_DISLIKE) . "' ))) "; + if($is_owner && $update_unseen) { + $r = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 and item_wall = 1 AND uid = %d $update_unseen", + intval(local_channel()) + ); } - } - else { - if($parents_str) { - $update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )"; + + + if($checkjs->disabled()) { + $o .= conversation($a,$items,'channel',$update,'traditional'); + } + else { + $o .= conversation($a,$items,'channel',$update,$page_mode); } + + if((! $update) || ($checkjs->disabled())) { + $o .= alt_pager($a,count($items)); + if ($mid && $items[0]['title']) + \App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title']; + } + + if($mid) + $o .= '
    '; + + return $o; } - - if($is_owner && $update_unseen) { - $r = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 and item_wall = 1 AND uid = %d $update_unseen", - intval(local_channel()) - ); - } - - - if($checkjs->disabled()) { - $o .= conversation($a,$items,'channel',$update,'traditional'); - } else { - $o .= conversation($a,$items,'channel',$update,$page_mode); - } - - if((! $update) || ($checkjs->disabled())) { - $o .= alt_pager($a,count($items)); - if ($mid && $items[0]['title']) - \App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title']; - } - - if($mid) - $o .= '
    '; - - return $o; -} - - } \ No newline at end of file diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php index b8bac53bb..560038ffc 100644 --- a/Zotlabs/Module/Directory.php +++ b/Zotlabs/Module/Directory.php @@ -57,9 +57,9 @@ class Directory extends \Zotlabs\Web\Controller { } } - function get() { + function get() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { notice( t('Public access denied.') . EOL); return; } diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php index 6e880cbb4..c1a0d84bc 100644 --- a/Zotlabs/Module/Display.php +++ b/Zotlabs/Module/Display.php @@ -7,17 +7,13 @@ class Display extends \Zotlabs\Web\Controller { function get($update = 0, $load = false) { - // logger("mod-display: update = $update load = $load"); - - $checkjs = new \Zotlabs\Web\CheckJS(1); - if($load) $_SESSION['loadtime'] = datetime_convert(); - if(intval(get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { notice( t('Public access denied.') . EOL); return; } diff --git a/Zotlabs/Module/Feed.php b/Zotlabs/Module/Feed.php index 9d33ba2c3..47871eafb 100644 --- a/Zotlabs/Module/Feed.php +++ b/Zotlabs/Module/Feed.php @@ -31,7 +31,7 @@ class Feed extends \Zotlabs\Web\Controller { $channel = $r[0]; - if((intval(get_config('system','block_public'))) && (! get_account_id())) + if(observer_prohibited(true)) killme(); logger('mod_feed: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']); diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php index 266ac05e0..7186209ba 100644 --- a/Zotlabs/Module/Photos.php +++ b/Zotlabs/Module/Photos.php @@ -18,7 +18,7 @@ class Photos extends \Zotlabs\Web\Controller { function init() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { return; } @@ -518,7 +518,7 @@ class Photos extends \Zotlabs\Web\Controller { // photos/name/image/xxxxx - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { notice( t('Public access denied.') . EOL); return; } diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php index 04a64fe76..8bf358bc8 100644 --- a/Zotlabs/Module/Profile.php +++ b/Zotlabs/Module/Profile.php @@ -55,8 +55,8 @@ class Profile extends \Zotlabs\Web\Controller { function get() { - if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) { - return login(); + if(observer_prohibited(true)) { + return login(); } $groups = array(); diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php index c25e04312..312be7718 100644 --- a/Zotlabs/Module/Pubstream.php +++ b/Zotlabs/Module/Pubstream.php @@ -12,7 +12,7 @@ class Pubstream extends \Zotlabs\Web\Controller { $_SESSION['loadtime'] = datetime_convert(); - if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) { + if(observer_prohibited(true)) { return login(); } diff --git a/Zotlabs/Module/Ratings.php b/Zotlabs/Module/Ratings.php index 802bbfec2..969fb5015 100644 --- a/Zotlabs/Module/Ratings.php +++ b/Zotlabs/Module/Ratings.php @@ -8,7 +8,7 @@ class Ratings extends \Zotlabs\Web\Controller { function init() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { return; } @@ -80,9 +80,9 @@ class Ratings extends \Zotlabs\Web\Controller { - function get() { + function get() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { notice( t('Public access denied.') . EOL); return; } diff --git a/Zotlabs/Module/Viewconnections.php b/Zotlabs/Module/Viewconnections.php index d58c431e5..ea478f92a 100644 --- a/Zotlabs/Module/Viewconnections.php +++ b/Zotlabs/Module/Viewconnections.php @@ -7,7 +7,7 @@ class Viewconnections extends \Zotlabs\Web\Controller { function init() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { return; } if(argc() > 1) @@ -16,7 +16,7 @@ class Viewconnections extends \Zotlabs\Web\Controller { function get() { - if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { notice( t('Public access denied.') . EOL); return; } diff --git a/Zotlabs/Module/Zotfeed.php b/Zotlabs/Module/Zotfeed.php index 28040149f..6b505c890 100644 --- a/Zotlabs/Module/Zotfeed.php +++ b/Zotlabs/Module/Zotfeed.php @@ -15,7 +15,7 @@ class Zotfeed extends \Zotlabs\Web\Controller { if(! $mindate) $mindate = datetime_convert('UTC','UTC', 'now - 14 days'); - if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) { + if(observer_prohibited()) { $result['message'] = 'Public access denied'; json_return_and_die($result); } @@ -45,8 +45,6 @@ class Zotfeed extends \Zotlabs\Web\Controller { $result['messages'] = zot_feed($r[0]['channel_id'],$observer['xchan_hash'],array('mindate' => $mindate)); $result['success'] = true; json_return_and_die($result); - - } } diff --git a/boot.php b/boot.php index 25551346b..690a330d8 100755 --- a/boot.php +++ b/boot.php @@ -2400,3 +2400,12 @@ function check_cron_broken() { } + +function observer_prohibited($allow_account = false) { + + if($allow_account) + return (((get_config('system','block_public')) && (! get_account_id()) && (! remote_channel())) ? true : false ); + return (((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) ? true : false ); + +} + diff --git a/include/channel.php b/include/channel.php index 050c4824b..8f93ca16f 100644 --- a/include/channel.php +++ b/include/channel.php @@ -1567,7 +1567,7 @@ function get_online_status($nick) { $ret = array('result' => false); - if(get_config('system','block_public') && ! local_channel() && ! remote_channel()) + if(observer_prohibited()) return $ret; $r = q("select channel_id, channel_hash from channel where channel_address = '%s' limit 1", diff --git a/include/socgraph.php b/include/socgraph.php index dffaa8923..4cb5600ec 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -402,7 +402,7 @@ function poco($a,$extended = false) { $system_mode = false; - if(intval(get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) { + if(observer_prohibited()) { logger('mod_poco: block_public'); http_status_exit(401); } diff --git a/include/widgets.php b/include/widgets.php index a158633ad..27f50e9be 100644 --- a/include/widgets.php +++ b/include/widgets.php @@ -12,13 +12,13 @@ require_once('include/attach.php'); function widget_profile($args) { - $block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false); + $block = observer_prohibited(); return profile_sidebar(App::$profile, $block, true); } function widget_zcard($args) { - $block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false); + $block = observer_prohibited(); $channel = channelx_by_n(App::$profile_uid); return get_zcard($channel,get_observer_hash(),array('width' => 875)); } @@ -369,7 +369,7 @@ function widget_fullprofile($arr) { if(! App::$profile['profile_uid']) return; - $block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false); + $block = observer_prohibited(); return profile_sidebar(App::$profile, $block); } @@ -379,7 +379,7 @@ function widget_shortprofile($arr) { if(! App::$profile['profile_uid']) return; - $block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false); + $block = observer_prohibited(); return profile_sidebar(App::$profile, $block, true, true); } From 2d06663490c5fd63b0ebbae141d0b2bbd5a4a8ca Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 19:25:27 -0700 Subject: [PATCH 34/39] move apps to zlib --- Zotlabs/Module/Appman.php | 17 +- Zotlabs/Module/Apps.php | 17 +- include/apps.php | 658 -------------------------------------- include/bbcode.php | 5 +- 4 files changed, 20 insertions(+), 677 deletions(-) delete mode 100644 include/apps.php diff --git a/Zotlabs/Module/Appman.php b/Zotlabs/Module/Appman.php index ba2a64f35..a200e986a 100644 --- a/Zotlabs/Module/Appman.php +++ b/Zotlabs/Module/Appman.php @@ -2,8 +2,9 @@ namespace Zotlabs\Module; -require_once('include/apps.php'); +//require_once('include/apps.php'); +use \Zotlabs\Lib as Zlib; class Appman extends \Zotlabs\Web\Controller { @@ -30,16 +31,16 @@ class Appman extends \Zotlabs\Web\Controller { 'categories' => escape_tags($_REQUEST['categories']) ); - $_REQUEST['appid'] = app_install(local_channel(),$arr); + $_REQUEST['appid'] = Zlib\Apps::app_install(local_channel(),$arr); - if(app_installed(local_channel(),$arr)) + if(Zlib\Apps::app_installed(local_channel(),$arr)) info( t('App installed.') . EOL); return; } - $papp = app_decode($_POST['papp']); + $papp = Zlib\Apps::app_decode($_POST['papp']); if(! is_array($papp)) { notice( t('Malformed app.') . EOL); @@ -47,13 +48,13 @@ class Appman extends \Zotlabs\Web\Controller { } if($_POST['install']) { - app_install(local_channel(),$papp); - if(app_installed(local_channel(),$papp)) + Zlib\Apps::app_install(local_channel(),$papp); + if(Zlib\Apps::app_installed(local_channel(),$papp)) info( t('App installed.') . EOL); } if($_POST['delete']) { - app_destroy(local_channel(),$papp); + Zlib\Apps::app_destroy(local_channel(),$papp); } if($_POST['edit']) { @@ -100,7 +101,7 @@ class Appman extends \Zotlabs\Web\Controller { } } - $embed = array('embed', t('Embed code'), app_encode($app,true),'', 'onclick="this.select();"'); + $embed = array('embed', t('Embed code'), Zlib\Apps::app_encode($app,true),'', 'onclick="this.select();"'); } diff --git a/Zotlabs/Module/Apps.php b/Zotlabs/Module/Apps.php index 33259b319..d3e8b1504 100644 --- a/Zotlabs/Module/Apps.php +++ b/Zotlabs/Module/Apps.php @@ -1,8 +1,9 @@ $v) { - if(strpos($v,'http') === 0) - $ret[$k] = zid($v); - } - - if(array_key_exists('desc',$ret)) - $ret['desc'] = str_replace(array('\'','"'),array(''','&dquot;'),$ret['desc']); - - if(array_key_exists('target',$ret)) - $ret['target'] = str_replace(array('\'','"'),array(''','&dquot;'),$ret['target']); - - if(array_key_exists('requires',$ret)) { - $requires = explode(',',$ret['requires']); - foreach($requires as $require) { - $require = trim(strtolower($require)); - switch($require) { - case 'nologin': - if(local_channel()) - unset($ret); - break; - case 'admin': - if(! is_site_admin()) - unset($ret); - break; - case 'local_channel': - if(! local_channel()) - unset($ret); - break; - case 'public_profile': - if(! is_public_profile()) - unset($ret); - break; - case 'observer': - if(! $observer) - unset($ret); - break; - default: - if(! (local_channel() && feature_enabled(local_channel(),$require))) - unset($ret); - break; - - } - } - } - if($ret) { - if($translate) - translate_system_apps($ret); - return $ret; - } - return false; -} - - -function translate_system_apps(&$arr) { - $apps = array( - 'Site Admin' => t('Site Admin'), - 'Bug Report' => t('Bug Report'), - 'View Bookmarks' => t('View Bookmarks'), - 'My Chatrooms' => t('My Chatrooms'), - 'Connections' => t('Connections'), - 'Firefox Share' => t('Firefox Share'), - 'Remote Diagnostics' => t('Remote Diagnostics'), - 'Suggest Channels' => t('Suggest Channels'), - 'Login' => t('Login'), - 'Channel Manager' => t('Channel Manager'), - 'Grid' => t('Grid'), - 'Settings' => t('Settings'), - 'Files' => t('Files'), - 'Webpages' => t('Webpages'), - 'Channel Home' => t('Channel Home'), - 'View Profile' => t('View Profile'), - 'Photos' => t('Photos'), - 'Events' => t('Events'), - 'Directory' => t('Directory'), - 'Help' => t('Help'), - 'Mail' => t('Mail'), - 'Mood' => t('Mood'), - 'Poke' => t('Poke'), - 'Chat' => t('Chat'), - 'Search' => t('Search'), - 'Probe' => t('Probe'), - 'Suggest' => t('Suggest'), - 'Random Channel' => t('Random Channel'), - 'Invite' => t('Invite'), - 'Features' => t('Features'), - 'Language' => t('Language'), - 'Post' => t('Post'), - 'Profile Photo' => t('Profile Photo') - ); - - if(array_key_exists($arr['name'],$apps)) - $arr['name'] = $apps[$arr['name']]; - -} - - -// papp is a portable app - -function app_render($papp,$mode = 'view') { - - /** - * modes: - * view: normal mode for viewing an app via bbcode from a conversation or page - * provides install/update button if you're logged in locally - * list: normal mode for viewing an app on the app page - * no buttons are shown - * edit: viewing the app page in editing mode provides a delete button - */ - - $installed = false; - - if(! $papp) - return; - - if(! $papp['photo']) - $papp['photo'] = z_root() . '/' . get_default_profile_photo(80); - - - - $papp['papp'] = papp_encode($papp); - - if(! strstr($papp['url'],'://')) - $papp['url'] = z_root() . ((strpos($papp['url'],'/') === 0) ? '' : '/') . $papp['url']; - - foreach($papp as $k => $v) { - if(strpos($v,'http') === 0 && $k != 'papp') - $papp[$k] = zid($v); - if($k === 'desc') - $papp['desc'] = str_replace(array('\'','"'),array(''','&dquot;'),$papp['desc']); - - if($k === 'requires') { - $requires = explode(',',$v); - foreach($requires as $require) { - $require = trim(strtolower($require)); - switch($require) { - case 'nologin': - if(local_channel()) - return ''; - break; - case 'admin': - if(! is_site_admin()) - return ''; - break; - case 'local_channel': - if(! local_channel()) - return ''; - break; - case 'public_profile': - if(! is_public_profile()) - return ''; - break; - case 'observer': - $observer = App::get_observer(); - if(! $observer) - return ''; - break; - default: - if(! (local_channel() && feature_enabled(local_channel(),$require))) - return ''; - break; - - } - } - - } - } - - $hosturl = ''; - - if(local_channel()) { - $installed = app_installed(local_channel(),$papp); - $hosturl = z_root() . '/'; - } - elseif(remote_channel()) { - $observer = App::get_observer(); - if($observer && $observer['xchan_network'] === 'zot') { - // some folks might have xchan_url redirected offsite, use the connurl - $x = parse_url($observer['xchan_connurl']); - if($x) { - $hosturl = $x['scheme'] . '://' . $x['host'] . '/'; - } - } - } - - $install_action = (($installed) ? t('Update') : t('Install')); - - return replace_macros(get_markup_template('app.tpl'),array( - '$app' => $papp, - '$hosturl' => $hosturl, - '$purchase' => (($papp['page'] && (! $installed)) ? t('Purchase') : ''), - '$install' => (($hosturl && $mode == 'view') ? $install_action : ''), - '$edit' => ((local_channel() && $installed && $mode == 'edit') ? t('Edit') : ''), - '$delete' => ((local_channel() && $installed && $mode == 'edit') ? t('Delete') : '') - )); -} - - -function app_install($uid,$app) { - $app['uid'] = $uid; - - if(app_installed($uid,$app)) - $x = app_update($app); - else - $x = app_store($app); - - if($x['success']) { - $r = q("select * from app where app_id = '%s' and app_channel = %d limit 1", - dbesc($x['app_id']), - intval($uid) - ); - if($r) { - if(! $r[0]['app_system']) { - if($app['categories'] && (! $app['term'])) { - $r[0]['term'] = q("select * from term where otype = %d and oid = d", - intval(TERM_OBJ_APP), - intval($r[0]['id']) - ); - build_sync_packet($uid,array('app' => $r[0])); - } - } - } - return $x['app_id']; - } - return false; -} - -function app_destroy($uid,$app) { - - - if($uid && $app['guid']) { - - $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1", - dbesc($app['guid']), - intval($uid) - ); - if($x) { - $x[0]['app_deleted'] = 1; - q("delete from term where otype = %d and oid = %d", - intval(TERM_OBJ_APP), - intval($x[0]['id']) - ); - if($x[0]['app_system']) { - $r = q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d", - dbesc($app['guid']), - intval($uid) - ); - } - else { - $r = q("delete from app where app_id = '%s' and app_channel = %d", - dbesc($app['guid']), - intval($uid) - ); - - // we don't sync system apps - they may be completely different on the other system - build_sync_packet($uid,array('app' => $x)); - } - } - } -} - - -function app_installed($uid,$app) { - - $r = q("select id from app where app_id = '%s' and app_version = '%s' and app_channel = %d limit 1", - dbesc((array_key_exists('guid',$app)) ? $app['guid'] : ''), - dbesc((array_key_exists('version',$app)) ? $app['version'] : ''), - intval($uid) - ); - return(($r) ? true : false); - -} - - -function app_list($uid, $deleted = false, $cat = '') { - if($deleted) - $sql_extra = " and app_deleted = 1 "; - else - $sql_extra = " and app_deleted = 0 "; - - if($cat) { - $r = q("select oid from term where otype = %d and term = '%s'", - intval(TERM_OBJ_APP), - dbesc($cat) - ); - if(! $r) - return $r; - $sql_extra .= " and app.id in ( "; - $s = ''; - foreach($r as $rr) { - if($s) - $s .= ','; - $s .= intval($rr['oid']); - } - $sql_extra .= $s . ') '; - } - - $r = q("select * from app where app_channel = %d $sql_extra order by app_name asc", - intval($uid) - ); - if($r) { - for($x = 0; $x < count($r); $x ++) { - if(! $r[$x]['app_system']) - $r[$x]['type'] = 'personal'; - $r[$x]['term'] = q("select * from term where otype = %d and oid = %d", - intval(TERM_OBJ_APP), - intval($r[$x]['id']) - ); - } - } - return($r); -} - - -function app_decode($s) { - $x = base64_decode(str_replace(array('
    ',"\r","\n",' '),array('','','',''),$s)); - return json_decode($x,true); -} - - -function app_store($arr) { - - // logger('app_store: ' . print_r($arr,true)); - - $darray = array(); - $ret = array('success' => false); - - $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : ''); - $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0); - - if((! $darray['app_url']) || (! $darray['app_channel'])) - return $ret; - - if($arr['photo'] && ! strstr($arr['photo'],z_root())) { - $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); - $arr['photo'] = $x[1]; - } - - - $darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : random_string(). '.' . App::get_hostname()); - $darray['app_sig'] = ((x($arr,'sig')) ? $arr['sig'] : ''); - $darray['app_author'] = ((x($arr,'author')) ? $arr['author'] : get_observer_hash()); - $darray['app_name'] = ((x($arr,'name')) ? escape_tags($arr['name']) : t('Unknown')); - $darray['app_desc'] = ((x($arr,'desc')) ? escape_tags($arr['desc']) : ''); - $darray['app_photo'] = ((x($arr,'photo')) ? $arr['photo'] : z_root() . '/' . get_default_profile_photo(80)); - $darray['app_version'] = ((x($arr,'version')) ? escape_tags($arr['version']) : ''); - $darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : ''); - $darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : ''); - $darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : ''); - $darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : ''); - $darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0); - $darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0); - - $created = datetime_convert(); - - $r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires, app_created, app_edited, app_system, app_deleted ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )", - dbesc($darray['app_id']), - dbesc($darray['app_sig']), - dbesc($darray['app_author']), - dbesc($darray['app_name']), - dbesc($darray['app_desc']), - dbesc($darray['app_url']), - dbesc($darray['app_photo']), - dbesc($darray['app_version']), - intval($darray['app_channel']), - dbesc($darray['app_addr']), - dbesc($darray['app_price']), - dbesc($darray['app_page']), - dbesc($darray['app_requires']), - dbesc($created), - dbesc($created), - intval($darray['app_system']), - intval($darray['app_deleted']) - ); - if($r) { - $ret['success'] = true; - $ret['app_id'] = $darray['app_id']; - } - if($arr['categories']) { - $x = q("select id from app where app_id = '%s' and app_channel = %d limit 1", - dbesc($darray['app_id']), - intval($darray['app_channel']) - ); - $y = explode(',',$arr['categories']); - if($y) { - foreach($y as $t) { - $t = trim($t); - if($t) { - store_item_tag($darray['app_channel'],$x[0]['id'],TERM_OBJ_APP,TERM_CATEGORY,escape_tags($t),escape_tags(z_root() . '/apps/?f=&cat=' . escape_tags($t))); - } - } - } - } - - return $ret; -} - - -function app_update($arr) { - - $darray = array(); - $ret = array('success' => false); - - $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : ''); - $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0); - $darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : 0); - - if((! $darray['app_url']) || (! $darray['app_channel']) || (! $darray['app_id'])) - return $ret; - - if($arr['photo'] && ! strstr($arr['photo'],z_root())) { - $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); - $arr['photo'] = $x[1]; - } - - $darray['app_sig'] = ((x($arr,'sig')) ? $arr['sig'] : ''); - $darray['app_author'] = ((x($arr,'author')) ? $arr['author'] : get_observer_hash()); - $darray['app_name'] = ((x($arr,'name')) ? escape_tags($arr['name']) : t('Unknown')); - $darray['app_desc'] = ((x($arr,'desc')) ? escape_tags($arr['desc']) : ''); - $darray['app_photo'] = ((x($arr,'photo')) ? $arr['photo'] : z_root() . '/' . get_default_profile_photo(80)); - $darray['app_version'] = ((x($arr,'version')) ? escape_tags($arr['version']) : ''); - $darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : ''); - $darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : ''); - $darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : ''); - $darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : ''); - $darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0); - $darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0); - - $edited = datetime_convert(); - - $r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s', app_edited = '%s', app_system = %d, app_deleted = %d where app_id = '%s' and app_channel = %d", - dbesc($darray['app_sig']), - dbesc($darray['app_author']), - dbesc($darray['app_name']), - dbesc($darray['app_desc']), - dbesc($darray['app_url']), - dbesc($darray['app_photo']), - dbesc($darray['app_version']), - dbesc($darray['app_addr']), - dbesc($darray['app_price']), - dbesc($darray['app_page']), - dbesc($darray['app_requires']), - dbesc($edited), - intval($darray['app_system']), - intval($darray['app_deleted']), - dbesc($darray['app_id']), - intval($darray['app_channel']) - ); - if($r) { - $ret['success'] = true; - $ret['app_id'] = $darray['app_id']; - } - - $x = q("select id from app where app_id = '%s' and app_channel = %d limit 1", - dbesc($darray['app_id']), - intval($darray['app_channel']) - ); - if($x) { - q("delete from term where otype = %d and oid = %d", - intval(TERM_OBJ_APP), - intval($x[0]['id']) - ); - if($arr['categories']) { - $y = explode(',',$arr['categories']); - if($y) { - foreach($y as $t) { - $t = trim($t); - if($t) { - store_item_tag($darray['app_channel'],$x[0]['id'],TERM_OBJ_APP,TERM_CATEGORY,escape_tags($t),escape_tags(z_root() . '/apps/?f=&cat=' . escape_tags($t))); - } - } - } - } - } - - return $ret; - -} - - -function app_encode($app,$embed = false) { - - $ret = array(); - - $ret['type'] = 'personal'; - - if($app['app_id']) - $ret['guid'] = $app['app_id']; - - if($app['app_id']) - $ret['guid'] = $app['app_id']; - - if($app['app_sig']) - $ret['sig'] = $app['app_sig']; - - if($app['app_author']) - $ret['author'] = $app['app_author']; - - if($app['app_name']) - $ret['name'] = $app['app_name']; - - if($app['app_desc']) - $ret['desc'] = $app['app_desc']; - - if($app['app_url']) - $ret['url'] = $app['app_url']; - - if($app['app_photo']) - $ret['photo'] = $app['app_photo']; - - if($app['app_version']) - $ret['version'] = $app['app_version']; - - if($app['app_addr']) - $ret['addr'] = $app['app_addr']; - - if($app['app_price']) - $ret['price'] = $app['app_price']; - - if($app['app_page']) - $ret['page'] = $app['app_page']; - - if($app['app_requires']) - $ret['requires'] = $app['app_requires']; - - if($app['app_system']) - $ret['system'] = $app['app_system']; - - if($app['app_deleted']) - $ret['deleted'] = $app['app_deleted']; - - if($app['term']) { - $s = ''; - foreach($app['term'] as $t) { - if($s) - $s .= ','; - $s .= $t['term']; - } - $ret['categories'] = $s; - } - - - if(! $embed) - return $ret; - - if(array_key_exists('categories',$ret)) - unset($ret['categories']); - - $j = json_encode($ret); - return '[app]' . chunk_split(base64_encode($j),72,"\n") . '[/app]'; - -} - - -function papp_encode($papp) { - return chunk_split(base64_encode(json_encode($papp)),72,"\n"); - -} - - diff --git a/include/bbcode.php b/include/bbcode.php index fd2d2f97a..ba35050e8 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -165,11 +165,10 @@ function bb_parse_crypt($match) { } function bb_parse_app($match) { - require_once('include/apps.php'); - $app = app_decode($match[1]); + $app = Zotlabs\Lib\Apps::app_decode($match[1]); if ($app) - return app_render($app); + return Zotlab\Lib\Apps::app_render($app); } function bb_parse_element($match) { From 20f444f5f2ff929fc43f1a9459510dad084ab030 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 19:26:21 -0700 Subject: [PATCH 35/39] add missing file --- Zotlabs/Lib/Apps.php | 659 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 659 insertions(+) create mode 100644 Zotlabs/Lib/Apps.php diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php new file mode 100644 index 000000000..6d2ef4e45 --- /dev/null +++ b/Zotlabs/Lib/Apps.php @@ -0,0 +1,659 @@ + $v) { + if(strpos($v,'http') === 0) + $ret[$k] = zid($v); + } + + if(array_key_exists('desc',$ret)) + $ret['desc'] = str_replace(array('\'','"'),array(''','&dquot;'),$ret['desc']); + + if(array_key_exists('target',$ret)) + $ret['target'] = str_replace(array('\'','"'),array(''','&dquot;'),$ret['target']); + + if(array_key_exists('requires',$ret)) { + $requires = explode(',',$ret['requires']); + foreach($requires as $require) { + $require = trim(strtolower($require)); + switch($require) { + case 'nologin': + if(local_channel()) + unset($ret); + break; + case 'admin': + if(! is_site_admin()) + unset($ret); + break; + case 'local_channel': + if(! local_channel()) + unset($ret); + break; + case 'public_profile': + if(! is_public_profile()) + unset($ret); + break; + case 'observer': + if(! $observer) + unset($ret); + break; + default: + if(! (local_channel() && feature_enabled(local_channel(),$require))) + unset($ret); + break; + + } + } + } + if($ret) { + if($translate) + self::translate_system_apps($ret); + return $ret; + } + return false; + } + + + static public function translate_system_apps(&$arr) { + $apps = array( + 'Site Admin' => t('Site Admin'), + 'Bug Report' => t('Bug Report'), + 'View Bookmarks' => t('View Bookmarks'), + 'My Chatrooms' => t('My Chatrooms'), + 'Connections' => t('Connections'), + 'Firefox Share' => t('Firefox Share'), + 'Remote Diagnostics' => t('Remote Diagnostics'), + 'Suggest Channels' => t('Suggest Channels'), + 'Login' => t('Login'), + 'Channel Manager' => t('Channel Manager'), + 'Grid' => t('Grid'), + 'Settings' => t('Settings'), + 'Files' => t('Files'), + 'Webpages' => t('Webpages'), + 'Channel Home' => t('Channel Home'), + 'View Profile' => t('View Profile'), + 'Photos' => t('Photos'), + 'Events' => t('Events'), + 'Directory' => t('Directory'), + 'Help' => t('Help'), + 'Mail' => t('Mail'), + 'Mood' => t('Mood'), + 'Poke' => t('Poke'), + 'Chat' => t('Chat'), + 'Search' => t('Search'), + 'Probe' => t('Probe'), + 'Suggest' => t('Suggest'), + 'Random Channel' => t('Random Channel'), + 'Invite' => t('Invite'), + 'Features' => t('Features'), + 'Language' => t('Language'), + 'Post' => t('Post'), + 'Profile Photo' => t('Profile Photo') + ); + + if(array_key_exists($arr['name'],$apps)) + $arr['name'] = $apps[$arr['name']]; + + } + + + // papp is a portable app + + static public function app_render($papp,$mode = 'view') { + + /** + * modes: + * view: normal mode for viewing an app via bbcode from a conversation or page + * provides install/update button if you're logged in locally + * list: normal mode for viewing an app on the app page + * no buttons are shown + * edit: viewing the app page in editing mode provides a delete button + */ + + $installed = false; + + if(! $papp) + return; + + if(! $papp['photo']) + $papp['photo'] = z_root() . '/' . get_default_profile_photo(80); + + $papp['papp'] = self::papp_encode($papp); + + if(! strstr($papp['url'],'://')) + $papp['url'] = z_root() . ((strpos($papp['url'],'/') === 0) ? '' : '/') . $papp['url']; + + foreach($papp as $k => $v) { + if(strpos($v,'http') === 0 && $k != 'papp') + $papp[$k] = zid($v); + if($k === 'desc') + $papp['desc'] = str_replace(array('\'','"'),array(''','&dquot;'),$papp['desc']); + + if($k === 'requires') { + $requires = explode(',',$v); + foreach($requires as $require) { + $require = trim(strtolower($require)); + switch($require) { + case 'nologin': + if(local_channel()) + return ''; + break; + case 'admin': + if(! is_site_admin()) + return ''; + break; + case 'local_channel': + if(! local_channel()) + return ''; + break; + case 'public_profile': + if(! is_public_profile()) + return ''; + break; + case 'observer': + $observer = \App::get_observer(); + if(! $observer) + return ''; + break; + default: + if(! (local_channel() && feature_enabled(local_channel(),$require))) + return ''; + break; + + } + } + } + } + + $hosturl = ''; + + if(local_channel()) { + $installed = self::app_installed(local_channel(),$papp); + $hosturl = z_root() . '/'; + } + elseif(remote_channel()) { + $observer = \App::get_observer(); + if($observer && $observer['xchan_network'] === 'zot') { + // some folks might have xchan_url redirected offsite, use the connurl + $x = parse_url($observer['xchan_connurl']); + if($x) { + $hosturl = $x['scheme'] . '://' . $x['host'] . '/'; + } + } + } + + $install_action = (($installed) ? t('Update') : t('Install')); + + return replace_macros(get_markup_template('app.tpl'),array( + '$app' => $papp, + '$hosturl' => $hosturl, + '$purchase' => (($papp['page'] && (! $installed)) ? t('Purchase') : ''), + '$install' => (($hosturl && $mode == 'view') ? $install_action : ''), + '$edit' => ((local_channel() && $installed && $mode == 'edit') ? t('Edit') : ''), + '$delete' => ((local_channel() && $installed && $mode == 'edit') ? t('Delete') : '') + )); + } + + static public function app_install($uid,$app) { + $app['uid'] = $uid; + + if(self::app_installed($uid,$app)) + $x = self::app_update($app); + else + $x = self::app_store($app); + + if($x['success']) { + $r = q("select * from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($x['app_id']), + intval($uid) + ); + if($r) { + if(! $r[0]['app_system']) { + if($app['categories'] && (! $app['term'])) { + $r[0]['term'] = q("select * from term where otype = %d and oid = d", + intval(TERM_OBJ_APP), + intval($r[0]['id']) + ); + build_sync_packet($uid,array('app' => $r[0])); + } + } + } + return $x['app_id']; + } + return false; + } + + static public function app_destroy($uid,$app) { + + + if($uid && $app['guid']) { + + $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($app['guid']), + intval($uid) + ); + if($x) { + $x[0]['app_deleted'] = 1; + q("delete from term where otype = %d and oid = %d", + intval(TERM_OBJ_APP), + intval($x[0]['id']) + ); + if($x[0]['app_system']) { + $r = q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d", + dbesc($app['guid']), + intval($uid) + ); + } + else { + $r = q("delete from app where app_id = '%s' and app_channel = %d", + dbesc($app['guid']), + intval($uid) + ); + + // we don't sync system apps - they may be completely different on the other system + build_sync_packet($uid,array('app' => $x)); + } + } + } + } + + + static public function app_installed($uid,$app) { + + $r = q("select id from app where app_id = '%s' and app_version = '%s' and app_channel = %d limit 1", + dbesc((array_key_exists('guid',$app)) ? $app['guid'] : ''), + dbesc((array_key_exists('version',$app)) ? $app['version'] : ''), + intval($uid) + ); + return(($r) ? true : false); + + } + + + static public function app_list($uid, $deleted = false, $cat = '') { + if($deleted) + $sql_extra = " and app_deleted = 1 "; + else + $sql_extra = " and app_deleted = 0 "; + + if($cat) { + $r = q("select oid from term where otype = %d and term = '%s'", + intval(TERM_OBJ_APP), + dbesc($cat) + ); + if(! $r) + return $r; + $sql_extra .= " and app.id in ( "; + $s = ''; + foreach($r as $rr) { + if($s) + $s .= ','; + $s .= intval($rr['oid']); + } + $sql_extra .= $s . ') '; + } + + $r = q("select * from app where app_channel = %d $sql_extra order by app_name asc", + intval($uid) + ); + if($r) { + for($x = 0; $x < count($r); $x ++) { + if(! $r[$x]['app_system']) + $r[$x]['type'] = 'personal'; + $r[$x]['term'] = q("select * from term where otype = %d and oid = %d", + intval(TERM_OBJ_APP), + intval($r[$x]['id']) + ); + } + } + return($r); + } + + + static public function app_decode($s) { + $x = base64_decode(str_replace(array('
    ',"\r","\n",' '),array('','','',''),$s)); + return json_decode($x,true); + } + + + static public function app_store($arr) { + + // logger('app_store: ' . print_r($arr,true)); + + $darray = array(); + $ret = array('success' => false); + + $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : ''); + $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0); + + if((! $darray['app_url']) || (! $darray['app_channel'])) + return $ret; + + if($arr['photo'] && ! strstr($arr['photo'],z_root())) { + $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); + $arr['photo'] = $x[1]; + } + + + $darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : random_string(). '.' . \App::get_hostname()); + $darray['app_sig'] = ((x($arr,'sig')) ? $arr['sig'] : ''); + $darray['app_author'] = ((x($arr,'author')) ? $arr['author'] : get_observer_hash()); + $darray['app_name'] = ((x($arr,'name')) ? escape_tags($arr['name']) : t('Unknown')); + $darray['app_desc'] = ((x($arr,'desc')) ? escape_tags($arr['desc']) : ''); + $darray['app_photo'] = ((x($arr,'photo')) ? $arr['photo'] : z_root() . '/' . get_default_profile_photo(80)); + $darray['app_version'] = ((x($arr,'version')) ? escape_tags($arr['version']) : ''); + $darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : ''); + $darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : ''); + $darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : ''); + $darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : ''); + $darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0); + $darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0); + + $created = datetime_convert(); + + $r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires, app_created, app_edited, app_system, app_deleted ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )", + dbesc($darray['app_id']), + dbesc($darray['app_sig']), + dbesc($darray['app_author']), + dbesc($darray['app_name']), + dbesc($darray['app_desc']), + dbesc($darray['app_url']), + dbesc($darray['app_photo']), + dbesc($darray['app_version']), + intval($darray['app_channel']), + dbesc($darray['app_addr']), + dbesc($darray['app_price']), + dbesc($darray['app_page']), + dbesc($darray['app_requires']), + dbesc($created), + dbesc($created), + intval($darray['app_system']), + intval($darray['app_deleted']) + ); + if($r) { + $ret['success'] = true; + $ret['app_id'] = $darray['app_id']; + } + if($arr['categories']) { + $x = q("select id from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($darray['app_id']), + intval($darray['app_channel']) + ); + $y = explode(',',$arr['categories']); + if($y) { + foreach($y as $t) { + $t = trim($t); + if($t) { + store_item_tag($darray['app_channel'],$x[0]['id'],TERM_OBJ_APP,TERM_CATEGORY,escape_tags($t),escape_tags(z_root() . '/apps/?f=&cat=' . escape_tags($t))); + } + } + } + } + + return $ret; + } + + + static public function app_update($arr) { + + $darray = array(); + $ret = array('success' => false); + + $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : ''); + $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0); + $darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : 0); + + if((! $darray['app_url']) || (! $darray['app_channel']) || (! $darray['app_id'])) + return $ret; + + if($arr['photo'] && ! strstr($arr['photo'],z_root())) { + $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); + $arr['photo'] = $x[1]; + } + + $darray['app_sig'] = ((x($arr,'sig')) ? $arr['sig'] : ''); + $darray['app_author'] = ((x($arr,'author')) ? $arr['author'] : get_observer_hash()); + $darray['app_name'] = ((x($arr,'name')) ? escape_tags($arr['name']) : t('Unknown')); + $darray['app_desc'] = ((x($arr,'desc')) ? escape_tags($arr['desc']) : ''); + $darray['app_photo'] = ((x($arr,'photo')) ? $arr['photo'] : z_root() . '/' . get_default_profile_photo(80)); + $darray['app_version'] = ((x($arr,'version')) ? escape_tags($arr['version']) : ''); + $darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : ''); + $darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : ''); + $darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : ''); + $darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : ''); + $darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0); + $darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0); + + $edited = datetime_convert(); + + $r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s', app_edited = '%s', app_system = %d, app_deleted = %d where app_id = '%s' and app_channel = %d", + dbesc($darray['app_sig']), + dbesc($darray['app_author']), + dbesc($darray['app_name']), + dbesc($darray['app_desc']), + dbesc($darray['app_url']), + dbesc($darray['app_photo']), + dbesc($darray['app_version']), + dbesc($darray['app_addr']), + dbesc($darray['app_price']), + dbesc($darray['app_page']), + dbesc($darray['app_requires']), + dbesc($edited), + intval($darray['app_system']), + intval($darray['app_deleted']), + dbesc($darray['app_id']), + intval($darray['app_channel']) + ); + if($r) { + $ret['success'] = true; + $ret['app_id'] = $darray['app_id']; + } + + $x = q("select id from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($darray['app_id']), + intval($darray['app_channel']) + ); + if($x) { + q("delete from term where otype = %d and oid = %d", + intval(TERM_OBJ_APP), + intval($x[0]['id']) + ); + if($arr['categories']) { + $y = explode(',',$arr['categories']); + if($y) { + foreach($y as $t) { + $t = trim($t); + if($t) { + store_item_tag($darray['app_channel'],$x[0]['id'],TERM_OBJ_APP,TERM_CATEGORY,escape_tags($t),escape_tags(z_root() . '/apps/?f=&cat=' . escape_tags($t))); + } + } + } + } + } + + return $ret; + + } + + + static public function app_encode($app,$embed = false) { + + $ret = array(); + + $ret['type'] = 'personal'; + + if($app['app_id']) + $ret['guid'] = $app['app_id']; + + if($app['app_id']) + $ret['guid'] = $app['app_id']; + + if($app['app_sig']) + $ret['sig'] = $app['app_sig']; + + if($app['app_author']) + $ret['author'] = $app['app_author']; + + if($app['app_name']) + $ret['name'] = $app['app_name']; + + if($app['app_desc']) + $ret['desc'] = $app['app_desc']; + + if($app['app_url']) + $ret['url'] = $app['app_url']; + + if($app['app_photo']) + $ret['photo'] = $app['app_photo']; + + if($app['app_version']) + $ret['version'] = $app['app_version']; + + if($app['app_addr']) + $ret['addr'] = $app['app_addr']; + + if($app['app_price']) + $ret['price'] = $app['app_price']; + + if($app['app_page']) + $ret['page'] = $app['app_page']; + + if($app['app_requires']) + $ret['requires'] = $app['app_requires']; + + if($app['app_system']) + $ret['system'] = $app['app_system']; + + if($app['app_deleted']) + $ret['deleted'] = $app['app_deleted']; + + if($app['term']) { + $s = ''; + foreach($app['term'] as $t) { + if($s) + $s .= ','; + $s .= $t['term']; + } + $ret['categories'] = $s; + } + + + if(! $embed) + return $ret; + + if(array_key_exists('categories',$ret)) + unset($ret['categories']); + + $j = json_encode($ret); + return '[app]' . chunk_split(base64_encode($j),72,"\n") . '[/app]'; + + } + + + static public function papp_encode($papp) { + return chunk_split(base64_encode(json_encode($papp)),72,"\n"); + + } + +} + + From 1aa3051e977dceb04fbe656763d8ef8a9803a571 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 20:54:52 -0700 Subject: [PATCH 36/39] move chatroom stuff to zlib --- Zotlabs/Lib/Chatroom.php | 267 +++++++++++++++++++++++++++++++++++++ Zotlabs/Module/Chat.php | 22 +-- Zotlabs/Module/Chatsvc.php | 12 +- include/chat.php | 262 ------------------------------------ include/conversation.php | 3 +- include/widgets.php | 3 +- 6 files changed, 288 insertions(+), 281 deletions(-) create mode 100644 Zotlabs/Lib/Chatroom.php delete mode 100644 include/chat.php diff --git a/Zotlabs/Lib/Chatroom.php b/Zotlabs/Lib/Chatroom.php new file mode 100644 index 000000000..e1a9a10b3 --- /dev/null +++ b/Zotlabs/Lib/Chatroom.php @@ -0,0 +1,267 @@ + false); + + $name = trim($arr['name']); + if(! $name) { + $ret['message'] = t('Missing room name'); + return $ret; + } + + $r = q("select cr_id from chatroom where cr_uid = %d and cr_name = '%s' limit 1", + intval($channel['channel_id']), + dbesc($name) + ); + if($r) { + $ret['message'] = t('Duplicate room name'); + return $ret; + } + + $r = q("select count(cr_id) as total from chatroom where cr_aid = %d", + intval($channel['channel_account_id']) + ); + if($r) + $limit = service_class_fetch($channel['channel_id'], 'chatrooms'); + + if(($r) && ($limit !== false) && ($r[0]['total'] >= $limit)) { + $ret['message'] = upgrade_message(); + return $ret; + } + + if(! array_key_exists('expire', $arr)) + $arr['expire'] = 120; // minutes, e.g. 2 hours + + $created = datetime_convert(); + + $x = q("insert into chatroom ( cr_aid, cr_uid, cr_name, cr_created, cr_edited, cr_expire, allow_cid, allow_gid, deny_cid, deny_gid ) + values ( %d, %d , '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s' ) ", + intval($channel['channel_account_id']), + intval($channel['channel_id']), + dbesc($name), + dbesc($created), + dbesc($created), + intval($arr['expire']), + dbesc($arr['allow_cid']), + dbesc($arr['allow_gid']), + dbesc($arr['deny_cid']), + dbesc($arr['deny_gid']) + ); + + if($x) + $ret['success'] = true; + + return $ret; + } + + + static public function destroy($channel,$arr) { + + $ret = array('success' => false); + + if(intval($arr['cr_id'])) + $sql_extra = " and cr_id = " . intval($arr['cr_id']) . " "; + elseif(trim($arr['cr_name'])) + $sql_extra = " and cr_name = '" . protect_sprintf(dbesc(trim($arr['cr_name']))) . "' "; + else { + $ret['message'] = t('Invalid room specifier.'); + return $ret; + } + + $r = q("select * from chatroom where cr_uid = %d $sql_extra limit 1", + intval($channel['channel_id']) + ); + if(! $r) { + $ret['message'] = t('Invalid room specifier.'); + return $ret; + } + + build_sync_packet($channel['channel_id'],array('chatroom' => $r)); + + q("delete from chatroom where cr_id = %d", + intval($r[0]['cr_id']) + ); + if($r[0]['cr_id']) { + q("delete from chatpresence where cp_room = %d", + intval($r[0]['cr_id']) + ); + q("delete from chat where chat_room = %d", + intval($r[0]['cr_id']) + ); + } + + $ret['success'] = true; + return $ret; + } + + + static public function enter($observer_xchan, $room_id, $status, $client) { + + if(! $room_id || ! $observer_xchan) + return; + + $r = q("select * from chatroom where cr_id = %d limit 1", + intval($room_id) + ); + if(! $r) { + notice( t('Room not found.') . EOL); + return false; + } + require_once('include/security.php'); + $sql_extra = permissions_sql($r[0]['cr_uid']); + + $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1", + intval($room_id), + intval($r[0]['cr_uid']) + ); + if(! $x) { + notice( t('Permission denied.') . EOL); + return false; + } + + $limit = service_class_fetch($r[0]['cr_uid'], 'chatters_inroom'); + if($limit !== false) { + $y = q("select count(*) as total from chatpresence where cp_room = %d", + intval($room_id) + ); + if($y && $y[0]['total'] > $limit) { + notice( t('Room is full') . EOL); + return false; + } + } + + if(intval($x[0]['cr_expire'])) { + $r = q("delete from chat where created < %s - INTERVAL %s and chat_room = %d", + db_utcnow(), + db_quoteinterval( intval($x[0]['cr_expire']) . ' MINUTE' ), + intval($x[0]['cr_id']) + ); + } + + $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1", + dbesc($observer_xchan), + intval($room_id) + ); + if($r) { + q("update chatpresence set cp_last = '%s' where cp_id = %d and cp_client = '%s'", + dbesc(datetime_convert()), + intval($r[0]['cp_id']), + dbesc($client) + ); + return true; + } + + $r = q("insert into chatpresence ( cp_room, cp_xchan, cp_last, cp_status, cp_client ) + values ( %d, '%s', '%s', '%s', '%s' )", + intval($room_id), + dbesc($observer_xchan), + dbesc(datetime_convert()), + dbesc($status), + dbesc($client) + ); + + return $r; + } + + + function leave($observer_xchan, $room_id, $client) { + if(! $room_id || ! $observer_xchan) + return; + + $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d and cp_client = '%s' limit 1", + dbesc($observer_xchan), + intval($room_id), + dbesc($client) + ); + if($r) { + q("delete from chatpresence where cp_id = %d", + intval($r[0]['cp_id']) + ); + } + + return true; + } + + + static public function roomlist($uid) { + require_once('include/security.php'); + $sql_extra = permissions_sql($uid); + + $r = q("select allow_cid, allow_gid, deny_cid, deny_gid, cr_name, cr_expire, cr_id, count(cp_id) as cr_inroom from chatroom left join chatpresence on cr_id = cp_room where cr_uid = %d $sql_extra group by cr_name, cr_id order by cr_name", + intval($uid) + ); + + return $r; + } + + static public function list_count($uid) { + require_once('include/security.php'); + $sql_extra = permissions_sql($uid); + + $r = q("select count(*) as total from chatroom where cr_uid = %d $sql_extra", + intval($uid) + ); + + return $r[0]['total']; + } + + /** + * create a chat message via API. + * It is the caller's responsibility to enter the room. + */ + + static public function message($uid, $room_id, $xchan, $text) { + + $ret = array('success' => false); + + if(! $text) + return; + + $sql_extra = permissions_sql($uid); + + $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra", + intval($uid), + intval($room_id) + ); + if(! $r) + return $ret; + + $arr = array( + 'chat_room' => $room_id, + 'chat_xchan' => $xchan, + 'chat_text' => $text + ); + + call_hooks('chat_message', $arr); + + $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text ) + values( %d, '%s', '%s', '%s' )", + intval($room_id), + dbesc($xchan), + dbesc(datetime_convert()), + dbesc($arr['chat_text']) + ); + + $ret['success'] = true; + return $ret; + } +} diff --git a/Zotlabs/Module/Chat.php b/Zotlabs/Module/Chat.php index 9508ed3de..d14c32b7d 100644 --- a/Zotlabs/Module/Chat.php +++ b/Zotlabs/Module/Chat.php @@ -1,9 +1,11 @@ - $room)); + Zlib\Chatroom::destroy($channel,array('cr_name' => $room)); goaway(z_root() . '/chat/' . $channel['channel_address']); } @@ -67,7 +69,7 @@ class Chat extends \Zotlabs\Web\Controller { if(intval($arr['expire']) < 0) $arr['expire'] = 0; - chatroom_create($channel,$arr); + Zlib\Chatroom::create($channel,$arr); $x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1", dbesc($room), @@ -87,7 +89,7 @@ class Chat extends \Zotlabs\Web\Controller { } - function get() { + function get() { if(local_channel()) $channel = \App::get_channel(); @@ -105,7 +107,7 @@ class Chat extends \Zotlabs\Web\Controller { } if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) { - chatroom_leave($observer,argv(2),$_SERVER['REMOTE_ADDR']); + Zlib\Chatroom::leave($observer,argv(2),$_SERVER['REMOTE_ADDR']); goaway(z_root() . '/channel/' . argv(1)); } @@ -158,7 +160,7 @@ class Chat extends \Zotlabs\Web\Controller { $room_id = intval(argv(2)); $bookmark_link = get_bookmark_link($ob); - $x = chatroom_enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']); + $x = Zlib\Chatroom::enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']); if(! $x) return; $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1", @@ -238,7 +240,7 @@ class Chat extends \Zotlabs\Web\Controller { )); } - $rooms = chatroom_list(\App::$profile['profile_uid']); + $rooms = Zlib\Chatroom::roomlist(\App::$profile['profile_uid']); $o .= replace_macros(get_markup_template('chatrooms.tpl'), array( '$header' => sprintf( t('%1$s\'s Chatrooms'), \App::$profile['name']), diff --git a/Zotlabs/Module/Chatsvc.php b/Zotlabs/Module/Chatsvc.php index a9bc97301..6a28a7c4d 100644 --- a/Zotlabs/Module/Chatsvc.php +++ b/Zotlabs/Module/Chatsvc.php @@ -1,14 +1,16 @@ - false); @@ -27,7 +29,7 @@ class Chatsvc extends \Zotlabs\Web\Controller { } - function post() { + function post() { $ret = array('success' => false); @@ -65,7 +67,7 @@ class Chatsvc extends \Zotlabs\Web\Controller { json_return_and_die($ret); } - function get() { + function get() { $status = strip_tags($_REQUEST['status']); $room_id = intval(\App::$data['chat']['room_id']); diff --git a/include/chat.php b/include/chat.php deleted file mode 100644 index 604402045..000000000 --- a/include/chat.php +++ /dev/null @@ -1,262 +0,0 @@ - false); - - $name = trim($arr['name']); - if(! $name) { - $ret['message'] = t('Missing room name'); - return $ret; - } - - $r = q("select cr_id from chatroom where cr_uid = %d and cr_name = '%s' limit 1", - intval($channel['channel_id']), - dbesc($name) - ); - if($r) { - $ret['message'] = t('Duplicate room name'); - return $ret; - } - - $r = q("select count(cr_id) as total from chatroom where cr_aid = %d", - intval($channel['channel_account_id']) - ); - if($r) - $limit = service_class_fetch($channel['channel_id'], 'chatrooms'); - - if(($r) && ($limit !== false) && ($r[0]['total'] >= $limit)) { - $ret['message'] = upgrade_message(); - return $ret; - } - - if(! array_key_exists('expire', $arr)) - $arr['expire'] = 120; // minutes, e.g. 2 hours - - $created = datetime_convert(); - - $x = q("insert into chatroom ( cr_aid, cr_uid, cr_name, cr_created, cr_edited, cr_expire, allow_cid, allow_gid, deny_cid, deny_gid ) - values ( %d, %d , '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s' ) ", - intval($channel['channel_account_id']), - intval($channel['channel_id']), - dbesc($name), - dbesc($created), - dbesc($created), - intval($arr['expire']), - dbesc($arr['allow_cid']), - dbesc($arr['allow_gid']), - dbesc($arr['deny_cid']), - dbesc($arr['deny_gid']) - ); - - if($x) - $ret['success'] = true; - - return $ret; -} - - -function chatroom_destroy($channel,$arr) { - - $ret = array('success' => false); - - if(intval($arr['cr_id'])) - $sql_extra = " and cr_id = " . intval($arr['cr_id']) . " "; - elseif(trim($arr['cr_name'])) - $sql_extra = " and cr_name = '" . protect_sprintf(dbesc(trim($arr['cr_name']))) . "' "; - else { - $ret['message'] = t('Invalid room specifier.'); - return $ret; - } - - $r = q("select * from chatroom where cr_uid = %d $sql_extra limit 1", - intval($channel['channel_id']) - ); - if(! $r) { - $ret['message'] = t('Invalid room specifier.'); - return $ret; - } - - build_sync_packet($channel['channel_id'],array('chatroom' => $r)); - - q("delete from chatroom where cr_id = %d", - intval($r[0]['cr_id']) - ); - if($r[0]['cr_id']) { - q("delete from chatpresence where cp_room = %d", - intval($r[0]['cr_id']) - ); - q("delete from chat where chat_room = %d", - intval($r[0]['cr_id']) - ); - } - - $ret['success'] = true; - return $ret; -} - - -function chatroom_enter($observer_xchan, $room_id, $status, $client) { - - if(! $room_id || ! $observer_xchan) - return; - - $r = q("select * from chatroom where cr_id = %d limit 1", - intval($room_id) - ); - if(! $r) { - notice( t('Room not found.') . EOL); - return false; - } - require_once('include/security.php'); - $sql_extra = permissions_sql($r[0]['cr_uid']); - - $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1", - intval($room_id), - intval($r[0]['cr_uid']) - ); - if(! $x) { - notice( t('Permission denied.') . EOL); - return false; - } - - $limit = service_class_fetch($r[0]['cr_uid'], 'chatters_inroom'); - if($limit !== false) { - $y = q("select count(*) as total from chatpresence where cp_room = %d", - intval($room_id) - ); - if($y && $y[0]['total'] > $limit) { - notice( t('Room is full') . EOL); - return false; - } - } - - if(intval($x[0]['cr_expire'])) { - $r = q("delete from chat where created < %s - INTERVAL %s and chat_room = %d", - db_utcnow(), - db_quoteinterval( intval($x[0]['cr_expire']) . ' MINUTE' ), - intval($x[0]['cr_id']) - ); - } - - $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1", - dbesc($observer_xchan), - intval($room_id) - ); - if($r) { - q("update chatpresence set cp_last = '%s' where cp_id = %d and cp_client = '%s'", - dbesc(datetime_convert()), - intval($r[0]['cp_id']), - dbesc($client) - ); - return true; - } - - $r = q("insert into chatpresence ( cp_room, cp_xchan, cp_last, cp_status, cp_client ) - values ( %d, '%s', '%s', '%s', '%s' )", - intval($room_id), - dbesc($observer_xchan), - dbesc(datetime_convert()), - dbesc($status), - dbesc($client) - ); - - return $r; -} - - -function chatroom_leave($observer_xchan, $room_id, $client) { - if(! $room_id || ! $observer_xchan) - return; - - $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d and cp_client = '%s' limit 1", - dbesc($observer_xchan), - intval($room_id), - dbesc($client) - ); - if($r) { - q("delete from chatpresence where cp_id = %d", - intval($r[0]['cp_id']) - ); - } - - return true; -} - - -function chatroom_list($uid) { - require_once('include/security.php'); - $sql_extra = permissions_sql($uid); - - $r = q("select allow_cid, allow_gid, deny_cid, deny_gid, cr_name, cr_expire, cr_id, count(cp_id) as cr_inroom from chatroom left join chatpresence on cr_id = cp_room where cr_uid = %d $sql_extra group by cr_name, cr_id order by cr_name", - intval($uid) - ); - - return $r; -} - -function chatroom_list_count($uid) { - require_once('include/security.php'); - $sql_extra = permissions_sql($uid); - - $r = q("select count(*) as total from chatroom where cr_uid = %d $sql_extra", - intval($uid) - ); - - return $r[0]['total']; -} - -/** - * create a chat message via API. - * It is the caller's responsibility to enter the room. - */ - -function chat_message($uid, $room_id, $xchan, $text) { - - $ret = array('success' => false); - - if(! $text) - return; - - $sql_extra = permissions_sql($uid); - - $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra", - intval($uid), - intval($room_id) - ); - if(! $r) - return $ret; - - $arr = array( - 'chat_room' => $room_id, - 'chat_xchan' => $xchan, - 'chat_text' => $text - ); - - call_hooks('chat_message', $arr); - - $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text ) - values( %d, '%s', '%s', '%s' )", - intval($room_id), - dbesc($xchan), - dbesc(datetime_convert()), - dbesc($arr['chat_text']) - ); - - $ret['success'] = true; - return $ret; -} diff --git a/include/conversation.php b/include/conversation.php index ca73a7a07..f405bc9d5 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -1658,8 +1658,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){ if ($p['chat'] && feature_enabled($uid,'ajaxchat')) { - require_once('include/chat.php'); - $has_chats = chatroom_list_count($uid); + $has_chats = Zotlabs\Lib\Chatroom::list_count($uid); if ($has_chats) { $tabs[] = array( 'label' => t('Chatrooms'), diff --git a/include/widgets.php b/include/widgets.php index 27f50e9be..e6d162ccd 100644 --- a/include/widgets.php +++ b/include/widgets.php @@ -834,8 +834,7 @@ function widget_menu_preview($arr) { function widget_chatroom_list($arr) { - require_once("include/chat.php"); - $r = chatroom_list(App::$profile['profile_uid']); + $r = Zotlabs\Lib\Chatroom::roomlist(App::$profile['profile_uid']); if($r) { return replace_macros(get_markup_template('chatroomlist.tpl'), array( From a1aa3d906159e4ad563779e5f220dddbfbd744c4 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 22:08:01 -0700 Subject: [PATCH 37/39] Can't use "use x as y" aliases in callback function declarations --- Zotlabs/Module/Apps.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zotlabs/Module/Apps.php b/Zotlabs/Module/Apps.php index d3e8b1504..4bdec4573 100644 --- a/Zotlabs/Module/Apps.php +++ b/Zotlabs/Module/Apps.php @@ -33,7 +33,7 @@ class Apps extends \Zotlabs\Web\Controller { else $syslist = Zlib\Apps::get_system_apps(true); - usort($syslist,'Zlib\\Apps::app_name_compare'); + usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare'); // logger('apps: ' . print_r($syslist,true)); From bbc71343bdfc724425927ebab404b035c65f569c Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 22:44:13 -0700 Subject: [PATCH 38/39] change the signed token format. We don't folks to be able to submit random text for signing by us, as they could then use these to generate known signatures. --- Zotlabs/Zot/Finger.php | 2 +- doc/zot.md | 5 +++++ include/zot.php | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Zotlabs/Zot/Finger.php b/Zotlabs/Zot/Finger.php index 63fdd4a4c..07798fbb1 100644 --- a/Zotlabs/Zot/Finger.php +++ b/Zotlabs/Zot/Finger.php @@ -110,7 +110,7 @@ class Finger { if($x) { $signed_token = ((is_array($x) && array_key_exists('signed_token',$x)) ? $x['signed_token'] : null); if($signed_token) { - $valid = rsa_verify(self::$token,base64url_decode($signed_token),$x['key']); + $valid = rsa_verify('token.' . self::$token,base64url_decode($signed_token),$x['key']); if(! $valid) { logger('invalid signed token: ' . $url . $rhs, LOGGER_NORMAL, LOG_WARN); return $ret; diff --git a/doc/zot.md b/doc/zot.md index f8881c551..1e454e495 100644 --- a/doc/zot.md +++ b/doc/zot.md @@ -140,6 +140,8 @@ target_sig => an RSA signature (base64url encoded) of the guid key => The public key needed to verify the signature +token => a string (possibly random) chosen by the requesting service. If provided, an entry in the discovered packet will be provided called 'signed_token' which consists of the base64url_encoded RSA signature of the concatenation of the string 'token.' and the provided token using the private key of the discovered channel. This can be verified using the provided 'key' entry, and provides assurance that the server is in possession of the private key for the discovered identity. After 2017-01-01 it is **required** that a server provide a signed_token *if* a token was provided in the request. + With no target provided, the permissions returned will be generic permissions for unknown or unauthenticated observers @@ -148,6 +150,7 @@ Example of discovery packet for 'mike@zothub.com' { "success": true, + "signed_token": "KBJrKTq1qrctNuxF3GwVh3GAGRqmgkirlXANPcJZAeWlvSt_9TMV097slR4AYnYCBEushbVqHEJ9Rb5wHTa0HzMbfRo8cRdl2yAirvvv5d98dtwHddQgX1jB0xEypXtmIYMdPGDLvhI1RNdIBhHkkrRcNreRzoy4xD--HM6m1W0-A8PJJJ9BcNxmGPcBtLzW08wzoP9trJ3M7DQ6Gkk6j7iwVsyApw1ZBaDvabGTdc_SFV-Iegtqw3rjzT_xXWsfzMlKBy-019MYn_KS-gu23YzjvGu5tS_zDfkQb8DMUlPLz5yyxM0yOMlUDtG2qQgIJAU2O0X6T5xDdJ6mtolNyhepg845PvFDEqBQGMIH1nc47CNumeudDi8IWymEALhjG_U8KAK7JVlQTJj2EKUb0au1g6fpiBFab5mmxCMtZEX3Jreyak5GOcFFz-WpxuXJD9TdSoIvaBfBFOoJnXkg2zE4RHXeQzZ2FotmrbBG5dm8B-_6byYGoHBc08ZsWze1K96JIeRnLpBaj6ifUDcVHxZMPcGHHT27dvU2PNbgLiBjlAsxhYqkhN5qOHN8XBcg2KRjcMBaI3V0YMxlzXz5MztmZq3fcB1p-ccIoIyMPMzSj3yMB7J9CEU2LYPSTHMdPkIeDE6GaCkQKviaQQJQde346tK_YjA2k7_SOBmvPYE", "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg", "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4", "key": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n", @@ -217,6 +220,8 @@ Discovery returns a JSON array with the following components: 'success' => ('1' or '') Operation was successful if '1'. Otherwise an optional 'message' may be present indicating the source of error. +'signed_token' => If a token parameter was provided in the request, it is prepended with the text 'token.' and then RSA signed with the channel private key and base64url encoded and returned as 'signed_token'. + 'guid' => the guid of the address on the target system 'guid_sig' => the base64url encoded RSA signature of the guid, signed with the private key associated with that guid. diff --git a/include/zot.php b/include/zot.php index 4b780db2a..8ba03ff5c 100644 --- a/include/zot.php +++ b/include/zot.php @@ -3818,7 +3818,7 @@ function zotinfo($arr) { // Communication details if($token) - $ret['signed_token'] = base64url_encode(rsa_sign($token,$e['channel_prvkey'])); + $ret['signed_token'] = base64url_encode(rsa_sign('token.' . $token,$e['channel_prvkey'])); $ret['guid'] = $e['xchan_guid']; From 1215638540056077a847713a8b345cd19b8cfbc4 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Sun, 22 May 2016 23:04:14 -0700 Subject: [PATCH 39/39] remove some doxygen files that leaked into /doc --- ...Redmatrix_1_1Import_1_1Import-members.html | 131 ----- doc/classRedmatrix_1_1Import_1_1Import.html | 446 ------------------ 2 files changed, 577 deletions(-) delete mode 100644 doc/classRedmatrix_1_1Import_1_1Import-members.html delete mode 100644 doc/classRedmatrix_1_1Import_1_1Import.html diff --git a/doc/classRedmatrix_1_1Import_1_1Import-members.html b/doc/classRedmatrix_1_1Import_1_1Import-members.html deleted file mode 100644 index d5e2f9277..000000000 --- a/doc/classRedmatrix_1_1Import_1_1Import-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - -The Hubzilla: Member List - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    The Hubzilla -
    -
    -
    - - - - - -
    -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/doc/classRedmatrix_1_1Import_1_1Import.html b/doc/classRedmatrix_1_1Import_1_1Import.html deleted file mode 100644 index 9a7128d65..000000000 --- a/doc/classRedmatrix_1_1Import_1_1Import.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - -The Hubzilla: Hubzilla\Import\Import Class Reference - - - - - - - - - - - - - -
    -
    - - - - - - - -
    -
    The Hubzilla -
    -
    -
    - - - - - -
    -
    - -
    -
    -
    - -
    - - - - -
    - -
    - -
    - -
    -
    Hubzilla\Import\Import Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     get_credentials ()
     
     get_itemlist ()
     
     get_item_ident ($item)
     
     get_item ($item_ident)
     
     get_taxonomy ($item_ident)
     
     get_children ($item_ident)
     
     convert_item ($item_ident)
     
     convert_taxonomy ($item_ident)
     
     convert_child ($child)
     
     store ($item, $update=false)
     
     run ()
     
    - - - - - - - -

    -Protected Attributes

     $itemlist = null
     
     $src_items = null
     
     $items = null
     
    - - - -

    -Private Attributes

     $credentials = null
     
    -

    Member Function Documentation

    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::convert_child ( $child)
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::convert_item ( $item_ident)
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::convert_taxonomy ( $item_ident)
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::get_children ( $item_ident)
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - -
    Hubzilla\Import\Import::get_credentials ()
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::get_item ( $item_ident)
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::get_item_ident ( $item)
    -
    - -
    -
    - -
    -
    - - - - - - - -
    Hubzilla\Import\Import::get_itemlist ()
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - - -
    Hubzilla\Import\Import::get_taxonomy ( $item_ident)
    -
    - -

    Referenced by Hubzilla\Import\Import\run().

    - -
    -
    - -
    -
    - - - - - - - -
    Hubzilla\Import\Import::run ()
    -
    - -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    Hubzilla\Import\Import::store ( $item,
     $update = false 
    )
    -
    - -
    -
    -

    Member Data Documentation

    - -
    -
    - - - - - -
    - - - - -
    Hubzilla\Import\Import::$credentials = null
    -
    -private
    -
    -
    - -
    -
    - - - - - -
    - - - - -
    Hubzilla\Import\Import::$itemlist = null
    -
    -protected
    -
    -
    - -
    -
    - - - - - -
    - - - - -
    Hubzilla\Import\Import::$items = null
    -
    -protected
    -
    - -
    -
    - -
    -
    - - - - - -
    - - - - -
    Hubzilla\Import\Import::$src_items = null
    -
    -protected
    -
    - -
    -
    -
    The documentation for this class was generated from the following file: -
    -
    \ No newline at end of file