Merge branch '1.8RC'
This commit is contained in:
commit
fb61c4fb34
2
.gitignore
vendored
2
.gitignore
vendored
@ -14,6 +14,8 @@
|
|||||||
*.rej
|
*.rej
|
||||||
# OSX .DS_Store files
|
# OSX .DS_Store files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
# version scripts (repo master only)
|
||||||
|
.version*
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
|
|
||||||
|
76
CHANGELOG
76
CHANGELOG
@ -1,3 +1,79 @@
|
|||||||
|
Hubzilla 1.8
|
||||||
|
Administration:
|
||||||
|
Cleanup and resolve some edge cases with addon repository manager
|
||||||
|
Provide sort field and direction on all fields of account and channel administration tables
|
||||||
|
Rename 'user' administration to account administration to reflect its true purpose
|
||||||
|
'safemode' tool to quickly disable and re-enable addons during a hypothetical upgrade crisis
|
||||||
|
Security:
|
||||||
|
Edited comments to private posts could lose their privacy settings under some circumstances
|
||||||
|
Provide zot-finger signatures to prevent a possible but rare exploit involving DNS spoofing and phishing
|
||||||
|
ACL selections:
|
||||||
|
Various improvements to the ACL editor to further simplify the concepts and make it more intuitive
|
||||||
|
Chat:
|
||||||
|
Notifications of chatroom activity using standard browser notification interfaces.
|
||||||
|
Themes:
|
||||||
|
Allow a theme:schema string to represent a valid theme name. This fixes issues with setting schemas on site themes.
|
||||||
|
Pubsites:
|
||||||
|
Show server role (identify UNO or basic sites as opposed to hubzilla pro) and link to statistics
|
||||||
|
Documentation:
|
||||||
|
Clarify privacy rights of commenters w/r/t conversation owners, as this policy is network dependent.
|
||||||
|
Wiki (Git backed):
|
||||||
|
Brand new feature. We'll call it experimental until it has undergone a bit more testing.
|
||||||
|
Account Cloning:
|
||||||
|
Regression on clone channel creation created a new channel name each time.
|
||||||
|
New issue (fixed) with directory creation on cloned file content
|
||||||
|
Content Rendering:
|
||||||
|
Add inline code (in addition to the existing code blocks) to BBcode
|
||||||
|
Add emoji reactions
|
||||||
|
Add emojis as extended smilies with auto-complete support
|
||||||
|
Emoji added as feature so it can be enabled/disabled and locked
|
||||||
|
Ability to configure the standard reactions available on a site basis
|
||||||
|
Disable 'convenience' ajax autoload on pgdn key, as it could lead to premature memory exhaustion
|
||||||
|
Photos:
|
||||||
|
Change album sort ordering, allow widgets and plugins to define other orderings
|
||||||
|
Apps:
|
||||||
|
Synchronise app list with changes to system apps
|
||||||
|
Preserve existing app categories on app updates/edits
|
||||||
|
Regression: fixed translated system app names
|
||||||
|
Architecture:
|
||||||
|
Provide autoloaded class files and libraries for plugins.
|
||||||
|
Further refactoring of session driver to sort out some cookie anomolies
|
||||||
|
Experimental PDO database driver
|
||||||
|
Creation of Daemon Master class and port all daemon (background task) interfaces to use it
|
||||||
|
Create separate class for each of 'Cron', 'Cron daily', and 'Cron weekly'.
|
||||||
|
Always run a Cron maintenance task if not run in the last four hours
|
||||||
|
Refactor the template classes
|
||||||
|
Refactor the ConversationItem mess into ThreadItem and ThreadStream
|
||||||
|
Refactor Apps, Enotify, and Chat library code
|
||||||
|
Refactor the various Config libraries (Config, PConfig, XConfig, AConfig, AbConfig, and IConfig)
|
||||||
|
Created WebServer class for top level
|
||||||
|
Remove mcrypt dependencies (deprecated in PHP 7.1)
|
||||||
|
Remove all reserved (including merely 'not recommended') words as DB table column names
|
||||||
|
Provide mutex lock on DB logging to prevent recursion under rare failure modes.
|
||||||
|
Bugfixes:
|
||||||
|
Remove db_close function on page end - not needed and will not work with persistent DB connections.
|
||||||
|
Undefined ref_session_write
|
||||||
|
Some session functions needed to be static to work with CalDAV/CardDAV
|
||||||
|
CLI interface: argc and argv were reversed
|
||||||
|
HTML entities double encoded in edited titles
|
||||||
|
Prevent delivering to empty recipients
|
||||||
|
Sabre library setting some security headers for SAML after we've emitted HTML content
|
||||||
|
Always initialise miniApp (caused obscure warning message if not set)
|
||||||
|
Block 'sys' channels from being 'random profile' candidates
|
||||||
|
DB update failed email could be sent in the wrong language under rare circumstances
|
||||||
|
Openid remote authentication used incorrect namespace
|
||||||
|
URL attached to profile "things" was not linked, always showing the "thing" manage page
|
||||||
|
New connection wasn't added to default privacy group when "auto-accept" was enabled
|
||||||
|
Regression: iconfig sharing wasn't working properly
|
||||||
|
Plugins:
|
||||||
|
CalDAV/CardDAV plugin provided
|
||||||
|
Issue sending Diaspora 'like' activities from sources that did not propagate the DCV
|
||||||
|
Allow 'superblock' to work across API calls from third party clients
|
||||||
|
statistics.json: use 'zot' as protocol
|
||||||
|
Issues fixed during testing of ability to follow Diaspora tags
|
||||||
|
Parse issue with Diaspora reshare content
|
||||||
|
Chess: moved to main repo, ported to 1.8
|
||||||
|
|
||||||
Hubzilla 1.6
|
Hubzilla 1.6
|
||||||
Cleanup and standardise the interfaces to the "jot" editor
|
Cleanup and standardise the interfaces to the "jot" editor
|
||||||
Router re-written to support calling class object methods as controllers
|
Router re-written to support calling class object methods as controllers
|
||||||
|
2
LICENSE
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010-2016 Hubzilla
|
Copyright (c) 2010-2016 the Hubzilla Community
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
@ -3,8 +3,11 @@
|
|||||||
Hubzilla - Community Server
|
Hubzilla - Community Server
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
Connected and linked web communities.
|
Groupware re-imagined and re-invented.
|
||||||
-------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
|
Connect and link decentralised web communities.
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
<p align="center" markdown="1">
|
<p align="center" markdown="1">
|
||||||
<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em>
|
<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em>
|
||||||
|
55
Zotlabs/Daemon/Checksites.php
Normal file
55
Zotlabs/Daemon/Checksites.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/hubloc.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Checksites {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
logger('checksites: start');
|
||||||
|
|
||||||
|
if(($argc > 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;
|
||||||
|
}
|
||||||
|
}
|
14
Zotlabs/Daemon/Cli_suggest.php
Normal file
14
Zotlabs/Daemon/Cli_suggest.php
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/socgraph.php');
|
||||||
|
|
||||||
|
class Cli_suggest {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
update_suggestions();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
181
Zotlabs/Daemon/Cron.php
Normal file
181
Zotlabs/Daemon/Cron.php
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
class Cron {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
$maxsysload = intval(get_config('system','maxloadavg'));
|
||||||
|
if($maxsysload < 1)
|
||||||
|
$maxsysload = 50;
|
||||||
|
if(function_exists('sys_getloadavg')) {
|
||||||
|
$load = sys_getloadavg();
|
||||||
|
if(intval($load[0]) > $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(array('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;
|
||||||
|
}
|
||||||
|
}
|
90
Zotlabs/Daemon/Cron_daily.php
Normal file
90
Zotlabs/Daemon/Cron_daily.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
class Cron_daily {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
logger('cron_daily: start');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cron Daily
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
require_once('include/dir_fns.php');
|
||||||
|
check_upstream_directory();
|
||||||
|
|
||||||
|
|
||||||
|
// Fire off the Cron_weekly process if it's the correct day.
|
||||||
|
|
||||||
|
$d3 = intval(datetime_convert('UTC','UTC','now','N'));
|
||||||
|
if($d3 == 7) {
|
||||||
|
Master::Summon(array('Cron_weekly'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// once daily run birthday_updates and then expire in background
|
||||||
|
|
||||||
|
// FIXME: add birthday updates, both locally and for xprof for use
|
||||||
|
// by directory servers
|
||||||
|
|
||||||
|
update_birthdays();
|
||||||
|
|
||||||
|
// expire any read notifications over a month old
|
||||||
|
|
||||||
|
q("delete from notify where seen = 1 and created < %s - INTERVAL %s",
|
||||||
|
db_utcnow(), db_quoteinterval('30 DAY')
|
||||||
|
);
|
||||||
|
|
||||||
|
//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 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?
|
||||||
|
|
||||||
|
$dirmode = get_config('system','directory_mode');
|
||||||
|
|
||||||
|
if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
|
||||||
|
require_once('include/dir_fns.php');
|
||||||
|
sync_directories($dirmode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Master::Summon(array('Expire'));
|
||||||
|
Master::Summon(array('Cli_suggest'));
|
||||||
|
|
||||||
|
require_once('include/hubloc.php');
|
||||||
|
remove_obsolete_hublocs();
|
||||||
|
|
||||||
|
call_hooks('cron_daily',datetime_convert());
|
||||||
|
|
||||||
|
set_config('system','last_expire_day',$d2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* End Cron Daily
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
49
Zotlabs/Daemon/Cron_weekly.php
Normal file
49
Zotlabs/Daemon/Cron_weekly.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
class Cron_weekly {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
17
Zotlabs/Daemon/Cronhooks.php
Normal file
17
Zotlabs/Daemon/Cronhooks.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
class Cronhooks {
|
||||||
|
|
||||||
|
static public function run($argc,$argv){
|
||||||
|
|
||||||
|
logger('cronhooks: start');
|
||||||
|
|
||||||
|
$d = datetime_convert();
|
||||||
|
|
||||||
|
call_hooks('cron', $d);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
85
Zotlabs/Daemon/Deliver.php
Normal file
85
Zotlabs/Daemon/Deliver.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/queue_fn.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Deliver {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
if($argc < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
logger('deliver: invoked: ' . print_r($argv,true), LOGGER_DATA);
|
||||||
|
|
||||||
|
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])
|
||||||
|
);
|
||||||
|
if($r) {
|
||||||
|
|
||||||
|
$notify = json_decode($r[0]['outq_notify'],true);
|
||||||
|
|
||||||
|
// Messages without an outq_msg will need to go via the web, even if it's a
|
||||||
|
// local delivery. This includes conversation requests and refresh packets.
|
||||||
|
|
||||||
|
if(($r[0]['outq_posturl'] === z_root() . '/post') && ($r[0]['outq_msg'])) {
|
||||||
|
logger('deliver: local delivery', LOGGER_DEBUG);
|
||||||
|
|
||||||
|
// local delivery
|
||||||
|
// we should probably batch these and save a few delivery processes
|
||||||
|
|
||||||
|
if($r[0]['outq_msg']) {
|
||||||
|
$m = json_decode($r[0]['outq_msg'],true);
|
||||||
|
if(array_key_exists('message_list',$m)) {
|
||||||
|
foreach($m['message_list'] as $mm) {
|
||||||
|
$msg = array('body' => 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);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
Zotlabs/Daemon/Deliver_hooks.php
Normal file
24
Zotlabs/Daemon/Deliver_hooks.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
|
||||||
|
class Deliver_hooks {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
if($argc < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
$r = q("select * from item where id = '%d'",
|
||||||
|
intval($argv[1])
|
||||||
|
);
|
||||||
|
if($r)
|
||||||
|
call_hooks('notifier_normal',$r[0]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
100
Zotlabs/Daemon/Directory.php
Normal file
100
Zotlabs/Daemon/Directory.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/dir_fns.php');
|
||||||
|
require_once('include/queue_fn.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Directory {
|
||||||
|
|
||||||
|
static public function run($argc,$argv){
|
||||||
|
|
||||||
|
if($argc < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$force = false;
|
||||||
|
$pushall = true;
|
||||||
|
|
||||||
|
if($argc > 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)
|
||||||
|
Master::Summon(array('Notifier','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)
|
||||||
|
Master::Summon(array('Notifier','refresh_all',$channel['channel_id']));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
93
Zotlabs/Daemon/Expire.php
Normal file
93
Zotlabs/Daemon/Expire.php
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
|
||||||
|
class Expire {
|
||||||
|
|
||||||
|
static public function run($argc,$argv){
|
||||||
|
|
||||||
|
cli_startup();
|
||||||
|
|
||||||
|
// perform final cleanup on previously delete items
|
||||||
|
|
||||||
|
$r = q("select id from item where item_deleted = 1 and item_pending_remove = 0 and changed < %s - INTERVAL %s",
|
||||||
|
db_utcnow(), db_quoteinterval('10 DAY')
|
||||||
|
);
|
||||||
|
if ($r) {
|
||||||
|
foreach ($r as $rr) {
|
||||||
|
drop_item($rr['id'], false, DROPITEM_PHASE2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// physically remove anything that has been deleted for more than two months
|
||||||
|
/** @FIXME - this is a wretchedly inefficient query */
|
||||||
|
|
||||||
|
$r = q("delete from item where item_pending_remove = 1 and changed < %s - INTERVAL %s",
|
||||||
|
db_utcnow(), db_quoteinterval('36 DAY')
|
||||||
|
);
|
||||||
|
|
||||||
|
/** @FIXME make this optional as it could have a performance impact on large sites */
|
||||||
|
|
||||||
|
if (intval(get_config('system', 'optimize_items')))
|
||||||
|
q("optimize table item");
|
||||||
|
|
||||||
|
logger('expire: start', LOGGER_DEBUG);
|
||||||
|
|
||||||
|
$site_expire = get_config('system', 'default_expire_days');
|
||||||
|
|
||||||
|
logger('site_expire: ' . $site_expire);
|
||||||
|
|
||||||
|
$r = q("SELECT channel_id, channel_address, channel_pageflags, channel_expire_days from channel where true");
|
||||||
|
|
||||||
|
if ($r) {
|
||||||
|
foreach ($r as $rr) {
|
||||||
|
|
||||||
|
// expire the sys channel separately
|
||||||
|
if (intval($rr['channel_system']))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// service class default (if non-zero) over-rides the site default
|
||||||
|
|
||||||
|
$service_class_expire = service_class_fetch($rr['channel_id'], 'expire_days');
|
||||||
|
if (intval($service_class_expire))
|
||||||
|
$channel_expire = $service_class_expire;
|
||||||
|
else
|
||||||
|
$channel_expire = $site_expire;
|
||||||
|
|
||||||
|
if (intval($channel_expire) && (intval($channel_expire) < intval($rr['channel_expire_days'])) ||
|
||||||
|
intval($rr['channel_expire_days'] == 0)) {
|
||||||
|
$expire_days = $channel_expire;
|
||||||
|
} else {
|
||||||
|
$expire_days = $rr['channel_expire_days'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the site or service class expiration is non-zero and less than person expiration, use that
|
||||||
|
logger('Expire: ' . $rr['channel_address'] . ' interval: ' . $expire_days, LOGGER_DEBUG);
|
||||||
|
item_expire($rr['channel_id'], $expire_days);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$x = get_sys_channel();
|
||||||
|
if ($x) {
|
||||||
|
|
||||||
|
// this should probably just fetch the channel_expire_days from the sys channel,
|
||||||
|
// but there's no convenient way to set it.
|
||||||
|
|
||||||
|
$expire_days = get_config('system', 'sys_expire_days');
|
||||||
|
if ($expire_days === false)
|
||||||
|
$expire_days = 30;
|
||||||
|
|
||||||
|
if (intval($site_expire) && (intval($site_expire) < intval($expire_days))) {
|
||||||
|
$expire_days = $site_expire;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger('Expire: sys interval: ' . $expire_days, LOGGER_DEBUG);
|
||||||
|
|
||||||
|
if ($expire_days)
|
||||||
|
item_expire($x['channel_id'], $expire_days);
|
||||||
|
|
||||||
|
logger('Expire: sys: done', LOGGER_DEBUG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
98
Zotlabs/Daemon/Externals.php
Normal file
98
Zotlabs/Daemon/Externals.php
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/channel.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Externals {
|
||||||
|
|
||||||
|
static public function run($argc,$argv){
|
||||||
|
|
||||||
|
$total = 0;
|
||||||
|
$attempts = 0;
|
||||||
|
|
||||||
|
logger('externals: startup', LOGGER_DEBUG);
|
||||||
|
|
||||||
|
// pull in some public posts
|
||||||
|
|
||||||
|
|
||||||
|
while($total == 0 && $attempts < 3) {
|
||||||
|
$arr = array('url' => '');
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
Zotlabs/Daemon/Gprobe.php
Normal file
33
Zotlabs/Daemon/Gprobe.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
|
||||||
|
// performs zot_finger on $argv[1], which is a hex_encoded webbie/reddress
|
||||||
|
|
||||||
|
class Gprobe {
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
if($argc != 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$url = hex2bin($argv[1]);
|
||||||
|
|
||||||
|
if(! strpos($url,'@'))
|
||||||
|
return;
|
||||||
|
|
||||||
|
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
|
||||||
|
dbesc($url)
|
||||||
|
);
|
||||||
|
|
||||||
|
if(! $r) {
|
||||||
|
$j = \Zotlabs\Zot\Finger::run($url,null);
|
||||||
|
if($j['success']) {
|
||||||
|
$y = import_xchan($j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
35
Zotlabs/Daemon/Importdoc.php
Executable file
35
Zotlabs/Daemon/Importdoc.php
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
|
||||||
|
class Importdoc {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
require_once('include/help.php');
|
||||||
|
|
||||||
|
self::update_docs_dir('doc/*');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function update_docs_dir($s) {
|
||||||
|
$f = basename($s);
|
||||||
|
$d = dirname($s);
|
||||||
|
if($s === 'doc/html')
|
||||||
|
return;
|
||||||
|
$files = glob("$d/$f");
|
||||||
|
if($files) {
|
||||||
|
foreach($files as $fi) {
|
||||||
|
if($fi === 'doc/html')
|
||||||
|
continue;
|
||||||
|
if(is_dir($fi))
|
||||||
|
self::update_docs_dir("$fi/*");
|
||||||
|
else
|
||||||
|
store_doc_file($fi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
31
Zotlabs/Daemon/Master.php
Normal file
31
Zotlabs/Daemon/Master.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
if(array_search( __file__ , get_included_files()) === 0) {
|
||||||
|
|
||||||
|
require_once('include/cli_startup.php');
|
||||||
|
array_shift($argv);
|
||||||
|
$argc = count($argv);
|
||||||
|
|
||||||
|
if($argc)
|
||||||
|
Master::Release($argc,$argv);
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Master {
|
||||||
|
|
||||||
|
static public function Summon($arr) {
|
||||||
|
proc_run('php','Zotlabs/Daemon/Master.php',$arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function Release($argc,$argv) {
|
||||||
|
cli_startup();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
663
Zotlabs/Daemon/Notifier.php
Normal file
663
Zotlabs/Daemon/Notifier.php
Normal file
@ -0,0 +1,663 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/queue_fn.php');
|
||||||
|
require_once('include/html2plain.php');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was at one time responsible for doing all deliveries, but this caused
|
||||||
|
* big problems on shared hosting systems, where the process might get killed by the
|
||||||
|
* hosting provider and nothing would get delivered.
|
||||||
|
* It now only delivers one message under certain cases, and invokes a queued
|
||||||
|
* delivery mechanism (include/deliver.php) to deliver individual contacts at
|
||||||
|
* controlled intervals.
|
||||||
|
* This has a much better chance of surviving random processes getting killed
|
||||||
|
* by the hosting provider.
|
||||||
|
*
|
||||||
|
* The basic flow is:
|
||||||
|
* Identify the type of message
|
||||||
|
* Collect any information that needs to be sent
|
||||||
|
* Convert it into a suitable generic format for sending
|
||||||
|
* Figure out who the recipients are and if we need to relay
|
||||||
|
* through a conversation owner
|
||||||
|
* Once we know what recipients are involved, collect a list of
|
||||||
|
* destination sites
|
||||||
|
* Build and store a queue item for each unique site and invoke
|
||||||
|
* a delivery process for each site or a small number of sites (1-3)
|
||||||
|
* and add a slight delay between each delivery invocation if desired (usually)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The notifier is typically called with:
|
||||||
|
*
|
||||||
|
* Zotlabs\Daemon\Master::Summon(array('Notifier', COMMAND, ITEM_ID));
|
||||||
|
*
|
||||||
|
* where COMMAND is one of the following:
|
||||||
|
*
|
||||||
|
* activity (in diaspora.php, dfrn_confirm.php, profiles.php)
|
||||||
|
* comment-import (in diaspora.php, items.php)
|
||||||
|
* comment-new (in item.php)
|
||||||
|
* drop (in diaspora.php, items.php, photos.php)
|
||||||
|
* edit_post (in item.php)
|
||||||
|
* event (in events.php)
|
||||||
|
* expire (in items.php)
|
||||||
|
* like (in like.php, poke.php)
|
||||||
|
* mail (in message.php)
|
||||||
|
* tag (in photos.php, poke.php, tagger.php)
|
||||||
|
* tgroup (in items.php)
|
||||||
|
* wall-new (in photos.php, item.php)
|
||||||
|
*
|
||||||
|
* and ITEM_ID is the id of the item in the database that needs to be sent to others.
|
||||||
|
*
|
||||||
|
* ZOT
|
||||||
|
* permission_create abook_id
|
||||||
|
* permission_update abook_id
|
||||||
|
* refresh_all channel_id
|
||||||
|
* purge_all channel_id
|
||||||
|
* expire channel_id
|
||||||
|
* relay item_id (item was relayed to owner, we will deliver it as owner)
|
||||||
|
* single_activity item_id (deliver to a singleton network from the appropriate clone)
|
||||||
|
* single_mail mail_id (deliver to a singleton network from the appropriate clone)
|
||||||
|
* location channel_id
|
||||||
|
* request channel_id xchan_hash message_id
|
||||||
|
* rating xlink_id
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/queue_fn.php');
|
||||||
|
require_once('include/datetime.php');
|
||||||
|
require_once('include/items.php');
|
||||||
|
require_once('include/bbcode.php');
|
||||||
|
require_once('include/channel.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Notifier {
|
||||||
|
|
||||||
|
static public function run($argc,$argv){
|
||||||
|
|
||||||
|
if($argc < 3)
|
||||||
|
return;
|
||||||
|
|
||||||
|
logger('notifier: invoked: ' . print_r($argv,true), LOGGER_DEBUG);
|
||||||
|
|
||||||
|
$cmd = $argv[1];
|
||||||
|
|
||||||
|
$item_id = $argv[2];
|
||||||
|
|
||||||
|
$extra = (($argc > 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for non published items, but allow an exclusion for transmitting hidden file activities
|
||||||
|
|
||||||
|
if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) ||
|
||||||
|
( intval($target_item['item_hidden']) && ($target_item['obj_type'] !== ACTIVITY_OBJ_FILE))) {
|
||||||
|
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');
|
||||||
|
Master::Summon(array('Notifier','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)
|
||||||
|
Master::Summon(array('Deliver_hooks',$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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
76
Zotlabs/Daemon/Onedirsync.php
Normal file
76
Zotlabs/Daemon/Onedirsync.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/dir_fns.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Onedirsync {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
logger('onedirsync: start ' . intval($argv[1]));
|
||||||
|
|
||||||
|
if(($argc > 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;
|
||||||
|
}
|
||||||
|
}
|
152
Zotlabs/Daemon/Onepoll.php
Normal file
152
Zotlabs/Daemon/Onepoll.php
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/socgraph.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Onepoll {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
logger('onepoll: start');
|
||||||
|
|
||||||
|
if(($argc > 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;
|
||||||
|
}
|
||||||
|
}
|
202
Zotlabs/Daemon/Poller.php
Normal file
202
Zotlabs/Daemon/Poller.php
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
class Poller {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
$maxsysload = intval(get_config('system','maxloadavg'));
|
||||||
|
if($maxsysload < 1)
|
||||||
|
$maxsysload = 50;
|
||||||
|
if(function_exists('sys_getloadavg')) {
|
||||||
|
$load = sys_getloadavg();
|
||||||
|
if(intval($load[0]) > $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');
|
||||||
|
|
||||||
|
$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();
|
||||||
|
|
||||||
|
// 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) {
|
||||||
|
Master::Summon(array('Onepoll',$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;
|
||||||
|
|
||||||
|
Master::Summon(array('Onepoll',$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;
|
||||||
|
Master::Summon(array('Onedirsync',$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;
|
||||||
|
}
|
||||||
|
}
|
90
Zotlabs/Daemon/Queue.php
Normal file
90
Zotlabs/Daemon/Queue.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/queue_fn.php');
|
||||||
|
require_once('include/zot.php');
|
||||||
|
|
||||||
|
class Queue {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
require_once('include/items.php');
|
||||||
|
require_once('include/bbcode.php');
|
||||||
|
|
||||||
|
if(argc() > 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
113
Zotlabs/Daemon/Ratenotif.php
Normal file
113
Zotlabs/Daemon/Ratenotif.php
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Daemon;
|
||||||
|
|
||||||
|
require_once('include/zot.php');
|
||||||
|
require_once('include/queue_fn.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Ratenotif {
|
||||||
|
|
||||||
|
static public function run($argc,$argv) {
|
||||||
|
|
||||||
|
require_once("datetime.php");
|
||||||
|
require_once('include/items.php');
|
||||||
|
|
||||||
|
if($argc < 3)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
logger('ratenotif: invoked: ' . print_r($argv,true), LOGGER_DEBUG);
|
||||||
|
|
||||||
|
$cmd = $argv[1];
|
||||||
|
|
||||||
|
$item_id = $argv[2];
|
||||||
|
|
||||||
|
|
||||||
|
if($cmd === 'rating') {
|
||||||
|
$r = q("select * from xlink where xlink_id = %d and xlink_static = 1 limit 1",
|
||||||
|
intval($item_id)
|
||||||
|
);
|
||||||
|
if(! $r) {
|
||||||
|
logger('rating not found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$encoded_item = array(
|
||||||
|
'type' => '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) {
|
||||||
|
Master::Summon(array('Deliver',$deliver));
|
||||||
|
$deliver = array();
|
||||||
|
if($interval)
|
||||||
|
@time_sleep_until(microtime(true) + (float) $interval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// catch any stragglers
|
||||||
|
|
||||||
|
if(count($deliver)) {
|
||||||
|
Master::Summon(array('Deliver',$deliver));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger('ratenotif: complete.');
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ class Hook {
|
|||||||
$function = serialize($function);
|
$function = serialize($function);
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' and priority = %d and hook_version = %d LIMIT 1",
|
$r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `fn` = '%s' and priority = %d and hook_version = %d LIMIT 1",
|
||||||
dbesc($hook),
|
dbesc($hook),
|
||||||
dbesc($file),
|
dbesc($file),
|
||||||
dbesc($function),
|
dbesc($function),
|
||||||
@ -23,13 +23,13 @@ class Hook {
|
|||||||
// To aid in upgrade and transition, remove old settings for any registered hooks that match in all respects except
|
// To aid in upgrade and transition, remove old settings for any registered hooks that match in all respects except
|
||||||
// for priority or hook_version
|
// for priority or hook_version
|
||||||
|
|
||||||
$r = q("DELETE FROM `hook` where `hook` = '%s' and `file` = '%s' and `function` = '%s'",
|
$r = q("DELETE FROM `hook` where `hook` = '%s' and `file` = '%s' and `fn` = '%s'",
|
||||||
dbesc($hook),
|
dbesc($hook),
|
||||||
dbesc($file),
|
dbesc($file),
|
||||||
dbesc($function)
|
dbesc($function)
|
||||||
);
|
);
|
||||||
|
|
||||||
$r = q("INSERT INTO `hook` (`hook`, `file`, `function`, `priority`, `hook_version`) VALUES ( '%s', '%s', '%s', %d, %d )",
|
$r = q("INSERT INTO `hook` (`hook`, `file`, `fn`, `priority`, `hook_version`) VALUES ( '%s', '%s', '%s', %d, %d )",
|
||||||
dbesc($hook),
|
dbesc($hook),
|
||||||
dbesc($file),
|
dbesc($file),
|
||||||
dbesc($function),
|
dbesc($function),
|
||||||
@ -44,7 +44,7 @@ class Hook {
|
|||||||
if(is_array($function)) {
|
if(is_array($function)) {
|
||||||
$function = serialize($function);
|
$function = serialize($function);
|
||||||
}
|
}
|
||||||
$r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `function` = '%s' and priority = %d and hook_version = %d",
|
$r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `fn` = '%s' and priority = %d and hook_version = %d",
|
||||||
dbesc($hook),
|
dbesc($hook),
|
||||||
dbesc($file),
|
dbesc($file),
|
||||||
dbesc($function),
|
dbesc($function),
|
||||||
|
25
Zotlabs/Lib/AConfig.php
Normal file
25
Zotlabs/Lib/AConfig.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
// account configuration storage is built on top of the under-utilised xconfig
|
||||||
|
|
||||||
|
class AConfig {
|
||||||
|
|
||||||
|
static public function Load($account_id) {
|
||||||
|
return XConfig::Load('a_' . $account_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function Get($account_id,$family,$key) {
|
||||||
|
return XConfig::Get('a_' . $account_id,$family,$key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function Set($account_id,$family,$key,$value) {
|
||||||
|
return XConfig::Get('a_' . $account_id,$family,$key,$value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function Delete($account_id,$family,$key) {
|
||||||
|
return XConfig::Delete('a_' . $account_id,$family,$key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
73
Zotlabs/Lib/AbConfig.php
Normal file
73
Zotlabs/Lib/AbConfig.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
|
||||||
|
class AbConfig {
|
||||||
|
|
||||||
|
static public function Load($chash,$xhash) {
|
||||||
|
$r = q("select * from abconfig where chan = '%s' and xchan = '%s'",
|
||||||
|
dbesc($chash),
|
||||||
|
dbesc($xhash)
|
||||||
|
);
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public function Get($chash,$xhash,$family,$key) {
|
||||||
|
$r = q("select * from abconfig where chan = '%s' and xchan = '%s' and cat = '%s' and k = '%s' limit 1",
|
||||||
|
dbesc($chash),
|
||||||
|
dbesc($xhash),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
if($r) {
|
||||||
|
return ((preg_match('|^a:[0-9]+:{.*}$|s', $r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public function Set($chash,$xhash,$family,$key,$value) {
|
||||||
|
|
||||||
|
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
|
||||||
|
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
|
||||||
|
|
||||||
|
if(self::Get($chash,$xhash,$family,$key) === false) {
|
||||||
|
$r = q("insert into abconfig ( chan, xchan, cat, k, v ) values ( '%s', '%s', '%s', '%s', '%s' ) ",
|
||||||
|
dbesc($chash),
|
||||||
|
dbesc($xhash),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key),
|
||||||
|
dbesc($dbvalue)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$r = q("update abconfig set v = '%s' where chan = '%s' and xchan = '%s' and cat = '%s' and k = '%s' ",
|
||||||
|
dbesc($dbvalue),
|
||||||
|
dbesc($chash),
|
||||||
|
dbesc($xhash),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($r)
|
||||||
|
return $value;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public function Delete($chash,$xhash,$family,$key) {
|
||||||
|
|
||||||
|
$r = q("delete from abconfig where chan = '%s' and xchan = '%s' and cat = '%s' and k = '%s' ",
|
||||||
|
dbesc($chash),
|
||||||
|
dbesc($xhash),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
708
Zotlabs/Lib/Apps.php
Normal file
708
Zotlabs/Lib/Apps.php
Normal file
@ -0,0 +1,708 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apps
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once('include/plugin.php');
|
||||||
|
require_once('include/channel.php');
|
||||||
|
|
||||||
|
|
||||||
|
class Apps {
|
||||||
|
|
||||||
|
static public $installed_system_apps = null;
|
||||||
|
|
||||||
|
static public function get_system_apps($translate = true) {
|
||||||
|
|
||||||
|
$ret = array();
|
||||||
|
if(is_dir('apps'))
|
||||||
|
$files = glob('apps/*.apd');
|
||||||
|
else
|
||||||
|
$files = glob('app/*.apd');
|
||||||
|
if($files) {
|
||||||
|
foreach($files as $f) {
|
||||||
|
$x = self::parse_app_description($f,$translate);
|
||||||
|
if($x) {
|
||||||
|
$ret[] = $x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$files = glob('addon/*/*.apd');
|
||||||
|
if($files) {
|
||||||
|
foreach($files as $f) {
|
||||||
|
$n = basename($f,'.apd');
|
||||||
|
if(plugin_is_installed($n)) {
|
||||||
|
$x = self::parse_app_description($f,$translate);
|
||||||
|
if($x) {
|
||||||
|
$ret[] = $x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public function import_system_apps() {
|
||||||
|
if(! local_channel())
|
||||||
|
return;
|
||||||
|
$apps = self::get_system_apps(false);
|
||||||
|
|
||||||
|
|
||||||
|
self::$installed_system_apps = q("select * from app where app_system = 1 and app_channel = %d",
|
||||||
|
intval(local_channel())
|
||||||
|
);
|
||||||
|
|
||||||
|
if($apps) {
|
||||||
|
foreach($apps as $app) {
|
||||||
|
$id = self::check_install_system_app($app);
|
||||||
|
// $id will be boolean true or false to install an app, or an integer id to update an existing app
|
||||||
|
if($id === false)
|
||||||
|
continue;
|
||||||
|
if($id !== true) {
|
||||||
|
// if we already installed this app, but it changed, preserve any categories we created
|
||||||
|
$s = '';
|
||||||
|
$r = q("select * from term where otype = %d and oid = d",
|
||||||
|
intval(TERM_OBJ_APP),
|
||||||
|
intval($id)
|
||||||
|
);
|
||||||
|
if($r) {
|
||||||
|
foreach($r as $t) {
|
||||||
|
if($s)
|
||||||
|
$s .= ',';
|
||||||
|
$s .= $t['term'];
|
||||||
|
}
|
||||||
|
$app['categories'] = $s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$app['uid'] = local_channel();
|
||||||
|
$app['guid'] = hash('whirlpool',$app['name']);
|
||||||
|
$app['system'] = 1;
|
||||||
|
self::app_install(local_channel(),$app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install the system app if no system apps have been installed, or if a new system app
|
||||||
|
* is discovered, or if the version of a system app changes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function check_install_system_app($app) {
|
||||||
|
if((! is_array(self::$installed_system_apps)) || (! count(self::$installed_system_apps))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$notfound = true;
|
||||||
|
foreach(self::$installed_system_apps as $iapp) {
|
||||||
|
if($iapp['app_id'] == hash('whirlpool',$app['name'])) {
|
||||||
|
$notfound = false;
|
||||||
|
if($iapp['app_version'] != $app['version']) {
|
||||||
|
return intval($iapp['app_id']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $notfound;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public function app_name_compare($a,$b) {
|
||||||
|
return strcmp($a['name'],$b['name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public function parse_app_description($f,$translate = true) {
|
||||||
|
$ret = array();
|
||||||
|
|
||||||
|
$baseurl = z_root();
|
||||||
|
$channel = \App::get_channel();
|
||||||
|
$address = (($channel) ? $channel['channel_address'] : '');
|
||||||
|
|
||||||
|
//future expansion
|
||||||
|
|
||||||
|
$observer = \App::get_observer();
|
||||||
|
|
||||||
|
|
||||||
|
$lines = @file($f);
|
||||||
|
if($lines) {
|
||||||
|
foreach($lines as $x) {
|
||||||
|
if(preg_match('/^([a-zA-Z].*?):(.*?)$/ism',$x,$matches)) {
|
||||||
|
$ret[$matches[1]] = trim(str_replace(array('$baseurl','$nick'),array($baseurl,$address),$matches[2]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(! $ret['photo'])
|
||||||
|
$ret['photo'] = $baseurl . '/' . get_default_profile_photo(80);
|
||||||
|
|
||||||
|
$ret['type'] = 'system';
|
||||||
|
|
||||||
|
foreach($ret as $k => $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('version',$ret))
|
||||||
|
$ret['version'] = str_replace(array('\'','"'),array(''','&dquot;'),$ret['version']);
|
||||||
|
|
||||||
|
|
||||||
|
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'),
|
||||||
|
'Wiki' => t('Wiki'),
|
||||||
|
'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);
|
||||||
|
|
||||||
|
self::translate_system_apps($papp);
|
||||||
|
|
||||||
|
$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('<br />',"\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");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
267
Zotlabs/Lib/Chatroom.php
Normal file
267
Zotlabs/Lib/Chatroom.php
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
<?php
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Chat related functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Chatroom {
|
||||||
|
/**
|
||||||
|
* @brief Creates a chatroom.
|
||||||
|
*
|
||||||
|
* @param array $channel
|
||||||
|
* @param array $arr
|
||||||
|
* @return An associative array containing:
|
||||||
|
* - success: A boolean
|
||||||
|
* - message: (optional) A string
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function create($channel, $arr) {
|
||||||
|
|
||||||
|
$ret = array('success' => 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;
|
||||||
|
}
|
||||||
|
}
|
166
Zotlabs/Lib/Config.php
Normal file
166
Zotlabs/Lib/Config.php
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
|
||||||
|
class Config {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads the hub's configuration from database to a cached storage.
|
||||||
|
*
|
||||||
|
* Retrieve a category ($family) of config variables from database to a cached
|
||||||
|
* storage in the global App::$config[$family].
|
||||||
|
*
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Load($family) {
|
||||||
|
if(! array_key_exists($family, \App::$config))
|
||||||
|
\App::$config[$family] = array();
|
||||||
|
|
||||||
|
if(! array_key_exists('config_loaded', \App::$config[$family])) {
|
||||||
|
$r = q("SELECT * FROM config WHERE cat = '%s'", dbesc($family));
|
||||||
|
if($r !== false) {
|
||||||
|
if($r) {
|
||||||
|
foreach($r as $rr) {
|
||||||
|
$k = $rr['k'];
|
||||||
|
\App::$config[$family][$k] = $rr['v'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\App::$config[$family]['config_loaded'] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets a configuration value for the hub.
|
||||||
|
*
|
||||||
|
* Stores a config value ($value) in the category ($family) under the key ($key).
|
||||||
|
*
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to set
|
||||||
|
* @param mixed $value
|
||||||
|
* The value to store in the configuration
|
||||||
|
* @return mixed
|
||||||
|
* Return the set value, or false if the database update failed
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Set($family,$key,$value) {
|
||||||
|
// manage array value
|
||||||
|
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
|
||||||
|
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
|
||||||
|
|
||||||
|
if(get_config($family, $key) === false || (! self::get_from_storage($family, $key))) {
|
||||||
|
$ret = q("INSERT INTO config ( cat, k, v ) VALUES ( '%s', '%s', '%s' ) ",
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key),
|
||||||
|
dbesc($dbvalue)
|
||||||
|
);
|
||||||
|
if($ret) {
|
||||||
|
\App::$config[$family][$key] = $value;
|
||||||
|
$ret = $value;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = q("UPDATE config SET v = '%s' WHERE cat = '%s' AND k = '%s'",
|
||||||
|
dbesc($dbvalue),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
|
||||||
|
if($ret) {
|
||||||
|
\App::$config[$family][$key] = $value;
|
||||||
|
$ret = $value;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get a particular config variable given the category name ($family)
|
||||||
|
* and a key.
|
||||||
|
*
|
||||||
|
* Get a particular config variable from the given category ($family) and the
|
||||||
|
* $key from a cached storage in App::$config[$family]. If a key is found in the
|
||||||
|
* DB but does not exist in local config cache, pull it into the cache so we
|
||||||
|
* do not have to hit the DB again for this item.
|
||||||
|
*
|
||||||
|
* Returns false if not set.
|
||||||
|
*
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to query
|
||||||
|
* @return mixed Return value or false on error or if not set
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Get($family,$key) {
|
||||||
|
if((! array_key_exists($family, \App::$config)) || (! array_key_exists('config_loaded', \App::$config[$family])))
|
||||||
|
self::Load($family);
|
||||||
|
|
||||||
|
if(array_key_exists('config_loaded', \App::$config[$family])) {
|
||||||
|
if(! array_key_exists($key, \App::$config[$family])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return ((! is_array(\App::$config[$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$family][$key]))
|
||||||
|
? unserialize(\App::$config[$family][$key])
|
||||||
|
: \App::$config[$family][$key]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deletes the given key from the hub's configuration database.
|
||||||
|
*
|
||||||
|
* Removes the configured value from the stored cache in App::$config[$family]
|
||||||
|
* and removes it from the database.
|
||||||
|
*
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to delete
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Delete($family,$key) {
|
||||||
|
|
||||||
|
$ret = false;
|
||||||
|
|
||||||
|
if(array_key_exists($family, \App::$config) && array_key_exists($key, \App::$config[$family]))
|
||||||
|
unset(\App::$config[$family][$key]);
|
||||||
|
$ret = q("DELETE FROM config WHERE cat = '%s' AND k = '%s'",
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a value directly from the database configuration storage.
|
||||||
|
*
|
||||||
|
* This function queries directly the database and bypasses the chached storage
|
||||||
|
* from get_config($family, $key).
|
||||||
|
*
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to query
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
|
||||||
|
static private function get_from_storage($family,$key) {
|
||||||
|
$ret = q("SELECT * FROM config WHERE cat = '%s' AND k = '%s' LIMIT 1",
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,95 +1,99 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @file include/enotify.php
|
namespace Zotlabs\Lib;
|
||||||
*
|
|
||||||
* @brief File with functions and a class for email notifications.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief File with functions and a class for generating system and email notifications.
|
||||||
*
|
|
||||||
* @param array $params an assoziative array with:
|
|
||||||
* * \e string \b from_xchan sender xchan hash
|
|
||||||
* * \e string \b to_xchan recipient xchan hash
|
|
||||||
* * \e array \b item an assoziative array
|
|
||||||
* * \e int \b type one of the NOTIFY_* constants from boot.php
|
|
||||||
* * \e string \b link
|
|
||||||
* * \e string \b parent_mid
|
|
||||||
* * \e string \b otype
|
|
||||||
* * \e string \b verb
|
|
||||||
* * \e string \b activity
|
|
||||||
*/
|
*/
|
||||||
function notification($params) {
|
|
||||||
|
|
||||||
logger('notification: entry', LOGGER_DEBUG);
|
|
||||||
|
|
||||||
// throw a small amount of entropy into the system to breakup duplicates arriving at the same precise instant.
|
|
||||||
usleep(mt_rand(0, 10000));
|
|
||||||
|
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
|
|
||||||
if ($params['from_xchan']) {
|
class Enotify {
|
||||||
$x = q("select * from xchan where xchan_hash = '%s' limit 1",
|
|
||||||
dbesc($params['from_xchan'])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ($params['to_xchan']) {
|
|
||||||
$y = q("select channel.*, account.* from channel left join account on channel_account_id = account_id
|
|
||||||
where channel_hash = '%s' and channel_removed = 0 limit 1",
|
|
||||||
dbesc($params['to_xchan'])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ($x & $y) {
|
|
||||||
$sender = $x[0];
|
|
||||||
$recip = $y[0];
|
|
||||||
} else {
|
|
||||||
logger('notification: no sender or recipient.');
|
|
||||||
logger('sender: ' . $params['from_xchan']);
|
|
||||||
logger('recip: ' . $params['to_xchan']);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// from here on everything is in the recipients language
|
/**
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param array $params an assoziative array with:
|
||||||
|
* * \e string \b from_xchan sender xchan hash
|
||||||
|
* * \e string \b to_xchan recipient xchan hash
|
||||||
|
* * \e array \b item an assoziative array
|
||||||
|
* * \e int \b type one of the NOTIFY_* constants from boot.php
|
||||||
|
* * \e string \b link
|
||||||
|
* * \e string \b parent_mid
|
||||||
|
* * \e string \b otype
|
||||||
|
* * \e string \b verb
|
||||||
|
* * \e string \b activity
|
||||||
|
*/
|
||||||
|
|
||||||
push_lang($recip['account_language']); // should probably have a channel language
|
|
||||||
|
|
||||||
$banner = t('$Projectname Notification');
|
static public function submit($params) {
|
||||||
$product = t('$projectname'); // PLATFORM_NAME;
|
|
||||||
$siteurl = z_root();
|
|
||||||
$thanks = t('Thank You,');
|
|
||||||
$sitename = get_config('system','sitename');
|
|
||||||
$site_admin = sprintf( t('%s Administrator'), $sitename);
|
|
||||||
|
|
||||||
$sender_name = $product;
|
logger('notification: entry', LOGGER_DEBUG);
|
||||||
$hostname = App::get_hostname();
|
|
||||||
if(strpos($hostname,':'))
|
// throw a small amount of entropy into the system to breakup duplicates arriving at the same precise instant.
|
||||||
|
usleep(mt_rand(0, 10000));
|
||||||
|
|
||||||
|
if ($params['from_xchan']) {
|
||||||
|
$x = q("select * from xchan where xchan_hash = '%s' limit 1",
|
||||||
|
dbesc($params['from_xchan'])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($params['to_xchan']) {
|
||||||
|
$y = q("select channel.*, account.* from channel left join account on channel_account_id = account_id
|
||||||
|
where channel_hash = '%s' and channel_removed = 0 limit 1",
|
||||||
|
dbesc($params['to_xchan'])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($x & $y) {
|
||||||
|
$sender = $x[0];
|
||||||
|
$recip = $y[0];
|
||||||
|
} else {
|
||||||
|
logger('notification: no sender or recipient.');
|
||||||
|
logger('sender: ' . $params['from_xchan']);
|
||||||
|
logger('recip: ' . $params['to_xchan']);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// from here on everything is in the recipients language
|
||||||
|
|
||||||
|
push_lang($recip['account_language']); // should probably have a channel language
|
||||||
|
|
||||||
|
$banner = t('$Projectname Notification');
|
||||||
|
$product = t('$projectname'); // PLATFORM_NAME;
|
||||||
|
$siteurl = z_root();
|
||||||
|
$thanks = t('Thank You,');
|
||||||
|
$sitename = get_config('system','sitename');
|
||||||
|
$site_admin = sprintf( t('%s Administrator'), $sitename);
|
||||||
|
|
||||||
|
$sender_name = $product;
|
||||||
|
$hostname = \App::get_hostname();
|
||||||
|
if(strpos($hostname,':'))
|
||||||
$hostname = substr($hostname,0,strpos($hostname,':'));
|
$hostname = substr($hostname,0,strpos($hostname,':'));
|
||||||
|
|
||||||
// Do not translate 'noreply' as it must be a legal 7-bit email address
|
// Do not translate 'noreply' as it must be a legal 7-bit email address
|
||||||
$sender_email = 'noreply' . '@' . $hostname;
|
$sender_email = 'noreply' . '@' . $hostname;
|
||||||
|
|
||||||
$additional_mail_header = "";
|
$additional_mail_header = "";
|
||||||
|
|
||||||
if (array_key_exists('item', $params)) {
|
if(array_key_exists('item', $params)) {
|
||||||
require_once('include/conversation.php');
|
require_once('include/conversation.php');
|
||||||
// if it's a normal item...
|
// if it's a normal item...
|
||||||
if (array_key_exists('verb', $params['item'])) {
|
if (array_key_exists('verb', $params['item'])) {
|
||||||
// localize_item() alters the original item so make a copy first
|
// localize_item() alters the original item so make a copy first
|
||||||
$i = $params['item'];
|
$i = $params['item'];
|
||||||
logger('calling localize');
|
logger('calling localize');
|
||||||
localize_item($i);
|
localize_item($i);
|
||||||
$title = $i['title'];
|
$title = $i['title'];
|
||||||
$body = $i['body'];
|
$body = $i['body'];
|
||||||
$private = (($i['item_private']) || intval($i['item_obscured']));
|
$private = (($i['item_private']) || intval($i['item_obscured']));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
$title = $params['item']['title'];
|
||||||
|
$body = $params['item']['body'];
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
$title = $params['item']['title'];
|
$title = $body = '';
|
||||||
$body = $params['item']['body'];
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$title = $body = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// e.g. "your post", "David's photo", etc.
|
// e.g. "your post", "David's photo", etc.
|
||||||
@ -344,7 +348,7 @@ function notification($params) {
|
|||||||
$hash = random_string();
|
$hash = random_string();
|
||||||
$r = q("SELECT `id` FROM `notify` WHERE `hash` = '%s' LIMIT 1",
|
$r = q("SELECT `id` FROM `notify` WHERE `hash` = '%s' LIMIT 1",
|
||||||
dbesc($hash));
|
dbesc($hash));
|
||||||
if (count($r))
|
if ($r)
|
||||||
$dups = true;
|
$dups = true;
|
||||||
} while ($dups === true);
|
} while ($dups === true);
|
||||||
|
|
||||||
@ -352,16 +356,16 @@ function notification($params) {
|
|||||||
$datarray = array();
|
$datarray = array();
|
||||||
$datarray['hash'] = $hash;
|
$datarray['hash'] = $hash;
|
||||||
$datarray['sender_hash'] = $sender['xchan_hash'];
|
$datarray['sender_hash'] = $sender['xchan_hash'];
|
||||||
$datarray['name'] = $sender['xchan_name'];
|
$datarray['xname'] = $sender['xchan_name'];
|
||||||
$datarray['url'] = $sender['xchan_url'];
|
$datarray['url'] = $sender['xchan_url'];
|
||||||
$datarray['photo'] = $sender['xchan_photo_s'];
|
$datarray['photo'] = $sender['xchan_photo_s'];
|
||||||
$datarray['date'] = datetime_convert();
|
$datarray['created'] = datetime_convert();
|
||||||
$datarray['aid'] = $recip['channel_account_id'];
|
$datarray['aid'] = $recip['channel_account_id'];
|
||||||
$datarray['uid'] = $recip['channel_id'];
|
$datarray['uid'] = $recip['channel_id'];
|
||||||
$datarray['link'] = $itemlink;
|
$datarray['link'] = $itemlink;
|
||||||
$datarray['parent'] = $parent_mid;
|
$datarray['parent'] = $parent_mid;
|
||||||
$datarray['parent_item'] = $parent_item;
|
$datarray['parent_item'] = $parent_item;
|
||||||
$datarray['type'] = $params['type'];
|
$datarray['ntype'] = $params['type'];
|
||||||
$datarray['verb'] = $params['verb'];
|
$datarray['verb'] = $params['verb'];
|
||||||
$datarray['otype'] = $params['otype'];
|
$datarray['otype'] = $params['otype'];
|
||||||
$datarray['abort'] = false;
|
$datarray['abort'] = false;
|
||||||
@ -390,19 +394,19 @@ function notification($params) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("insert into notify (hash,name,url,photo,date,aid,uid,link,parent,seen,type,verb,otype)
|
$r = q("insert into notify (hash,xname,url,photo,created,aid,uid,link,parent,seen,ntype,verb,otype)
|
||||||
values('%s','%s','%s','%s','%s',%d,%d,'%s','%s',%d,%d,'%s','%s')",
|
values('%s','%s','%s','%s','%s',%d,%d,'%s','%s',%d,%d,'%s','%s')",
|
||||||
dbesc($datarray['hash']),
|
dbesc($datarray['hash']),
|
||||||
dbesc($datarray['name']),
|
dbesc($datarray['xname']),
|
||||||
dbesc($datarray['url']),
|
dbesc($datarray['url']),
|
||||||
dbesc($datarray['photo']),
|
dbesc($datarray['photo']),
|
||||||
dbesc($datarray['date']),
|
dbesc($datarray['created']),
|
||||||
intval($datarray['aid']),
|
intval($datarray['aid']),
|
||||||
intval($datarray['uid']),
|
intval($datarray['uid']),
|
||||||
dbesc($datarray['link']),
|
dbesc($datarray['link']),
|
||||||
dbesc($datarray['parent']),
|
dbesc($datarray['parent']),
|
||||||
intval($seen),
|
intval($seen),
|
||||||
intval($datarray['type']),
|
intval($datarray['ntype']),
|
||||||
dbesc($datarray['verb']),
|
dbesc($datarray['verb']),
|
||||||
dbesc($datarray['otype'])
|
dbesc($datarray['otype'])
|
||||||
);
|
);
|
||||||
@ -424,7 +428,7 @@ function notification($params) {
|
|||||||
|
|
||||||
// wretched hack, but we don't want to duplicate all the preamble variations and we also don't want to screw up a translation
|
// wretched hack, but we don't want to duplicate all the preamble variations and we also don't want to screw up a translation
|
||||||
|
|
||||||
if ((App::$language === 'en' || (! App::$language)) && strpos($msg,', '))
|
if ((\App::$language === 'en' || (! \App::$language)) && strpos($msg,', '))
|
||||||
$msg = substr($msg,strpos($msg,', ')+1);
|
$msg = substr($msg,strpos($msg,', ')+1);
|
||||||
|
|
||||||
$r = q("update notify set msg = '%s' where id = %d and uid = %d",
|
$r = q("update notify set msg = '%s' where id = %d and uid = %d",
|
||||||
@ -441,7 +445,7 @@ function notification($params) {
|
|||||||
logger('notification: sending notification email');
|
logger('notification: sending notification email');
|
||||||
|
|
||||||
$hn = get_pconfig($recip['channel_id'],'system','email_notify_host');
|
$hn = get_pconfig($recip['channel_id'],'system','email_notify_host');
|
||||||
if($hn && (! stristr(App::get_hostname(),$hn))) {
|
if($hn && (! stristr(\App::get_hostname(),$hn))) {
|
||||||
// this isn't the email notification host
|
// this isn't the email notification host
|
||||||
pop_lang();
|
pop_lang();
|
||||||
return;
|
return;
|
||||||
@ -455,7 +459,7 @@ function notification($params) {
|
|||||||
// use $_SESSION['zid_override'] to force zid() to use
|
// use $_SESSION['zid_override'] to force zid() to use
|
||||||
// the recipient address instead of the current observer
|
// the recipient address instead of the current observer
|
||||||
|
|
||||||
$_SESSION['zid_override'] = $recip['channel_address'] . '@' . App::get_hostname();
|
$_SESSION['zid_override'] = $recip['channel_address'] . '@' . \App::get_hostname();
|
||||||
$_SESSION['zrl_override'] = z_root() . '/channel/' . $recip['channel_address'];
|
$_SESSION['zrl_override'] = z_root() . '/channel/' . $recip['channel_address'];
|
||||||
|
|
||||||
$textversion = zidify_links($textversion);
|
$textversion = zidify_links($textversion);
|
||||||
@ -529,7 +533,7 @@ function notification($params) {
|
|||||||
$tpl = get_markup_template('email_notify_html.tpl');
|
$tpl = get_markup_template('email_notify_html.tpl');
|
||||||
$email_html_body = replace_macros($tpl,array(
|
$email_html_body = replace_macros($tpl,array(
|
||||||
'$banner' => $datarray['banner'],
|
'$banner' => $datarray['banner'],
|
||||||
'$notify_icon' => Zotlabs\Project\System::get_notify_icon(),
|
'$notify_icon' => \Zotlabs\Lib\System::get_notify_icon(),
|
||||||
'$product' => $datarray['product'],
|
'$product' => $datarray['product'],
|
||||||
'$preamble' => $datarray['preamble'],
|
'$preamble' => $datarray['preamble'],
|
||||||
'$sitename' => $datarray['sitename'],
|
'$sitename' => $datarray['sitename'],
|
||||||
@ -570,7 +574,7 @@ function notification($params) {
|
|||||||
|
|
||||||
// use the EmailNotification library to send the message
|
// use the EmailNotification library to send the message
|
||||||
|
|
||||||
enotify::send(array(
|
self::send(array(
|
||||||
'fromName' => $sender_name,
|
'fromName' => $sender_name,
|
||||||
'fromEmail' => $sender_email,
|
'fromEmail' => $sender_email,
|
||||||
'replyTo' => $sender_email,
|
'replyTo' => $sender_email,
|
||||||
@ -587,12 +591,6 @@ function notification($params) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief A class for sending email notifications.
|
|
||||||
*
|
|
||||||
* @fixme Class names start mostly with capital letter to distinguish them easier.
|
|
||||||
*/
|
|
||||||
class enotify {
|
|
||||||
/**
|
/**
|
||||||
* @brief Send a multipart/alternative message with Text and HTML versions.
|
* @brief Send a multipart/alternative message with Text and HTML versions.
|
||||||
*
|
*
|
||||||
@ -649,4 +647,39 @@ class enotify {
|
|||||||
);
|
);
|
||||||
logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
|
logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public function format($item) {
|
||||||
|
|
||||||
|
$ret = '';
|
||||||
|
|
||||||
|
require_once('include/conversation.php');
|
||||||
|
|
||||||
|
// Call localize_item with the "brief" flag to get a one line status for activities.
|
||||||
|
// This should set $item['localized'] to indicate we have a brief summary.
|
||||||
|
|
||||||
|
localize_item($item);
|
||||||
|
|
||||||
|
if($item_localize) {
|
||||||
|
$itemem_text = $item['localize'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$itemem_text = (($item['item_thread_top'])
|
||||||
|
? t('created a new post')
|
||||||
|
: sprintf( t('commented on %s\'s post'), $item['owner']['xchan_name']));
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert this logic into a json array just like the system notifications
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'notify_link' => $item['llink'],
|
||||||
|
'name' => $item['author']['xchan_name'],
|
||||||
|
'url' => $item['author']['xchan_url'],
|
||||||
|
'photo' => $item['author']['xchan_photo_s'],
|
||||||
|
'when' => relative_date($item['created']),
|
||||||
|
'class' => (intval($item['item_unseen']) ? 'notify-unseen' : 'notify-seen'),
|
||||||
|
'message' => strip_tags(bbcode($itemem_text))
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
165
Zotlabs/Lib/IConfig.php
Normal file
165
Zotlabs/Lib/IConfig.php
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class IConfig {
|
||||||
|
|
||||||
|
static public function Load(&$item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function Get(&$item, $family, $key) {
|
||||||
|
|
||||||
|
$is_item = false;
|
||||||
|
|
||||||
|
if(is_array($item)) {
|
||||||
|
$is_item = true;
|
||||||
|
if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
|
||||||
|
$item['iconfig'] = array();
|
||||||
|
|
||||||
|
if(array_key_exists('item_id',$item))
|
||||||
|
$iid = $item['item_id'];
|
||||||
|
else
|
||||||
|
$iid = $item['id'];
|
||||||
|
}
|
||||||
|
elseif(intval($item))
|
||||||
|
$iid = $item;
|
||||||
|
|
||||||
|
if(! $iid)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(is_array($item) && array_key_exists('iconfig',$item) && is_array($item['iconfig'])) {
|
||||||
|
foreach($item['iconfig'] as $c) {
|
||||||
|
if($c['iid'] == $iid && $c['cat'] == $family && $c['k'] == $key)
|
||||||
|
return $c['v'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = q("select * from iconfig where iid = %d and cat = '%s' and k = '%s' limit 1",
|
||||||
|
intval($iid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
if($r) {
|
||||||
|
$r[0]['v'] = ((preg_match('|^a:[0-9]+:{.*}$|s',$r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
|
||||||
|
if($is_item)
|
||||||
|
$item['iconfig'][] = $r[0];
|
||||||
|
return $r[0]['v'];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IConfig::Set(&$item, $family, $key, $value, $sharing = false);
|
||||||
|
*
|
||||||
|
* $item - item array or item id. If passed an array the iconfig meta information is
|
||||||
|
* added to the item structure (which will need to be saved with item_store eventually).
|
||||||
|
* If passed an id, the DB is updated, but may not be federated and/or cloned.
|
||||||
|
* $family - namespace of meta variable
|
||||||
|
* $key - key of meta variable
|
||||||
|
* $value - value of meta variable
|
||||||
|
* $sharing - boolean (default false); if true the meta information is propagated with the item
|
||||||
|
* to other sites/channels, mostly useful when $item is an array and has not yet been stored/delivered.
|
||||||
|
* If the meta information is added after delivery and you wish it to be shared, it may be necessary to
|
||||||
|
* alter the item edited timestamp and invoke the delivery process on the updated item. The edited
|
||||||
|
* timestamp needs to be altered in order to trigger an item_store_update() at the receiving end.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static public function Set(&$item, $family, $key, $value, $sharing = false) {
|
||||||
|
|
||||||
|
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
|
||||||
|
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
|
||||||
|
|
||||||
|
$is_item = false;
|
||||||
|
$idx = null;
|
||||||
|
|
||||||
|
if(is_array($item)) {
|
||||||
|
$is_item = true;
|
||||||
|
if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
|
||||||
|
$item['iconfig'] = array();
|
||||||
|
elseif($item['iconfig']) {
|
||||||
|
for($x = 0; $x < count($item['iconfig']); $x ++) {
|
||||||
|
if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
|
||||||
|
$idx = $x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$entry = array('cat' => $family, 'k' => $key, 'v' => $value, 'sharing' => $sharing);
|
||||||
|
|
||||||
|
if(is_null($idx))
|
||||||
|
$item['iconfig'][] = $entry;
|
||||||
|
else
|
||||||
|
$item['iconfig'][$idx] = $entry;
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(intval($item))
|
||||||
|
$iid = intval($item);
|
||||||
|
|
||||||
|
if(! $iid)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(self::Get($item, $family, $key) === false) {
|
||||||
|
$r = q("insert into iconfig( iid, cat, k, v, sharing ) values ( %d, '%s', '%s', '%s', %d ) ",
|
||||||
|
intval($iid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key),
|
||||||
|
dbesc($dbvalue),
|
||||||
|
intval($sharing)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$r = q("update iconfig set v = '%s', sharing = %d where iid = %d and cat = '%s' and k = '%s' ",
|
||||||
|
dbesc($dbvalue),
|
||||||
|
intval($sharing),
|
||||||
|
intval($iid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(! $r)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static public function Delete(&$item, $family, $key) {
|
||||||
|
|
||||||
|
|
||||||
|
$is_item = false;
|
||||||
|
$idx = null;
|
||||||
|
|
||||||
|
if(is_array($item)) {
|
||||||
|
$is_item = true;
|
||||||
|
if(is_array($item['iconfig'])) {
|
||||||
|
for($x = 0; $x < count($item['iconfig']); $x ++) {
|
||||||
|
if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
|
||||||
|
unset($item['iconfig'][$x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(intval($item))
|
||||||
|
$iid = intval($item);
|
||||||
|
|
||||||
|
if(! $iid)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return q("delete from iconfig where iid = %d and cat = '%s' and k = '%s' ",
|
||||||
|
intval($iid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
189
Zotlabs/Lib/PConfig.php
Normal file
189
Zotlabs/Lib/PConfig.php
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
|
||||||
|
class PConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads all configuration values of a channel into a cached storage.
|
||||||
|
*
|
||||||
|
* All configuration values of the given channel are stored in global cache
|
||||||
|
* which is available under the global variable App::$config[$uid].
|
||||||
|
*
|
||||||
|
* @param string $uid
|
||||||
|
* The channel_id
|
||||||
|
* @return void|false Nothing or false if $uid is false
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Load($uid) {
|
||||||
|
if($uid === false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(! array_key_exists($uid, \App::$config))
|
||||||
|
\App::$config[$uid] = array();
|
||||||
|
|
||||||
|
$r = q("SELECT * FROM pconfig WHERE uid = %d",
|
||||||
|
intval($uid)
|
||||||
|
);
|
||||||
|
|
||||||
|
if($r) {
|
||||||
|
foreach($r as $rr) {
|
||||||
|
$k = $rr['k'];
|
||||||
|
$c = $rr['cat'];
|
||||||
|
if(! array_key_exists($c, \App::$config[$uid])) {
|
||||||
|
\App::$config[$uid][$c] = array();
|
||||||
|
\App::$config[$uid][$c]['config_loaded'] = true;
|
||||||
|
}
|
||||||
|
\App::$config[$uid][$c][$k] = $rr['v'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get a particular channel's config variable given the category name
|
||||||
|
* ($family) and a key.
|
||||||
|
*
|
||||||
|
* Get a particular channel's config value from the given category ($family)
|
||||||
|
* and the $key from a cached storage in App::$config[$uid].
|
||||||
|
*
|
||||||
|
* Returns false if not set.
|
||||||
|
*
|
||||||
|
* @param string $uid
|
||||||
|
* The channel_id
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to query
|
||||||
|
* @param boolean $instore (deprecated, without function)
|
||||||
|
* @return mixed Stored value or false if it does not exist
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Get($uid,$family,$key,$instore = false) {
|
||||||
|
|
||||||
|
if($uid === false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(! array_key_exists($uid, \App::$config))
|
||||||
|
self::Load($uid);
|
||||||
|
|
||||||
|
if((! array_key_exists($family, \App::$config[$uid])) || (! array_key_exists($key, \App::$config[$uid][$family])))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return ((! is_array(\App::$config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$uid][$family][$key]))
|
||||||
|
? unserialize(\App::$config[$uid][$family][$key])
|
||||||
|
: \App::$config[$uid][$family][$key]
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets a configuration value for a channel.
|
||||||
|
*
|
||||||
|
* Stores a config value ($value) in the category ($family) under the key ($key)
|
||||||
|
* for the channel_id $uid.
|
||||||
|
*
|
||||||
|
* @param string $uid
|
||||||
|
* The channel_id
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to set
|
||||||
|
* @param string $value
|
||||||
|
* The value to store
|
||||||
|
* @return mixed Stored $value or false
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Set($uid, $family, $key, $value) {
|
||||||
|
|
||||||
|
// this catches subtle errors where this function has been called
|
||||||
|
// with local_channel() when not logged in (which returns false)
|
||||||
|
// and throws an error in array_key_exists below.
|
||||||
|
// we provide a function backtrace in the logs so that we can find
|
||||||
|
// and fix the calling function.
|
||||||
|
|
||||||
|
if($uid === false) {
|
||||||
|
btlogger('UID is FALSE!', LOGGER_NORMAL, LOG_ERR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// manage array value
|
||||||
|
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
|
||||||
|
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
|
||||||
|
|
||||||
|
if(get_pconfig($uid, $family, $key) === false) {
|
||||||
|
if(! array_key_exists($uid, \App::$config))
|
||||||
|
\App::$config[$uid] = array();
|
||||||
|
if(! array_key_exists($family, \App::$config[$uid]))
|
||||||
|
\App::$config[$uid][$family] = array();
|
||||||
|
|
||||||
|
$ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
|
||||||
|
intval($uid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key),
|
||||||
|
dbesc($dbvalue)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
$ret = q("UPDATE pconfig SET v = '%s' WHERE uid = %d and cat = '%s' AND k = '%s'",
|
||||||
|
dbesc($dbvalue),
|
||||||
|
intval($uid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep a separate copy for all variables which were
|
||||||
|
// set in the life of this page. We need this to
|
||||||
|
// synchronise channel clones.
|
||||||
|
|
||||||
|
if(! array_key_exists('transient', \App::$config[$uid]))
|
||||||
|
\App::$config[$uid]['transient'] = array();
|
||||||
|
if(! array_key_exists($family, \App::$config[$uid]['transient']))
|
||||||
|
\App::$config[$uid]['transient'][$family] = array();
|
||||||
|
|
||||||
|
\App::$config[$uid][$family][$key] = $value;
|
||||||
|
\App::$config[$uid]['transient'][$family][$key] = $value;
|
||||||
|
|
||||||
|
if($ret)
|
||||||
|
return $value;
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deletes the given key from the channel's configuration.
|
||||||
|
*
|
||||||
|
* Removes the configured value from the stored cache in App::$config[$uid]
|
||||||
|
* and removes it from the database.
|
||||||
|
*
|
||||||
|
* @param string $uid
|
||||||
|
* The channel_id
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to delete
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Delete($uid, $family, $key) {
|
||||||
|
|
||||||
|
$ret = false;
|
||||||
|
|
||||||
|
if(array_key_exists($key, \App::$config[$uid][$family]))
|
||||||
|
unset(\App::$config[$uid][$family][$key]);
|
||||||
|
$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
|
||||||
|
intval($uid),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,7 @@
|
|||||||
<?php /** @file */
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Abstraction class for dealing with alternate networks (which of course do not exist, hence the abstraction)
|
* Abstraction class for dealing with alternate networks (which of course do not exist, hence the abstraction)
|
||||||
*/
|
*/
|
||||||
@ -15,29 +17,3 @@ abstract class ProtoDriver {
|
|||||||
abstract protected function collect_private($channel,$connection);
|
abstract protected function collect_private($channel,$connection);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZotDriver extends ProtoDriver {
|
|
||||||
|
|
||||||
protected function discover($channel,$location) {
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function deliver($item,$channel,$recipients) {
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function collect($channel,$connection) {
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function change_permissions($permissions,$channel,$recipient) {
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function acknowledge_permissions($permissions,$channel,$recipient) {
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function deliver_private($item,$channel,$recipients) {
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function collect_private($channel,$connection) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Zotlabs\Project;
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
class System {
|
class System {
|
||||||
|
|
||||||
static public function get_platform_name() {
|
static public function get_platform_name() {
|
||||||
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['platform_name'])
|
if(is_array(\App::$config) && is_array(\App::$config['system']) && array_key_exists('platform_name',\App::$config['system']))
|
||||||
return \App::$config['system']['platform_name'];
|
return \App::$config['system']['platform_name'];
|
||||||
return PLATFORM_NAME;
|
return PLATFORM_NAME;
|
||||||
}
|
}
|
||||||
@ -45,7 +45,7 @@ class System {
|
|||||||
static public function get_server_role() {
|
static public function get_server_role() {
|
||||||
if(UNO)
|
if(UNO)
|
||||||
return 'basic';
|
return 'basic';
|
||||||
return 'advanced';
|
return 'pro';
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function get_std_version() {
|
static public function get_std_version() {
|
@ -1,21 +1,21 @@
|
|||||||
<?php /** @file */
|
<?php /** @file */
|
||||||
|
|
||||||
if(class_exists('Item'))
|
namespace Zotlabs\Lib;
|
||||||
return;
|
|
||||||
|
|
||||||
require_once('include/BaseObject.php');
|
|
||||||
require_once('include/text.php');
|
require_once('include/text.php');
|
||||||
require_once('boot.php');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An item
|
* A thread item
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Item extends BaseObject {
|
class ThreadItem {
|
||||||
|
|
||||||
public $data = array();
|
public $data = array();
|
||||||
private $template = 'conv_item.tpl';
|
private $template = 'conv_item.tpl';
|
||||||
private $comment_box_template = 'comment_item.tpl';
|
private $comment_box_template = 'comment_item.tpl';
|
||||||
private $commentable = false;
|
private $commentable = false;
|
||||||
|
// list of supported reaction emojis - a site can over-ride this via config system.reactions
|
||||||
|
private $reactions = ['1f60a','1f44f','1f37e','1f48b','1f61e','2665','1f606','1f62e','1f634','1f61c','1f607','1f608'];
|
||||||
private $toplevel = false;
|
private $toplevel = false;
|
||||||
private $children = array();
|
private $children = array();
|
||||||
private $parent = null;
|
private $parent = null;
|
||||||
@ -32,7 +32,6 @@ class Item extends BaseObject {
|
|||||||
|
|
||||||
|
|
||||||
public function __construct($data) {
|
public function __construct($data) {
|
||||||
$a = $this->get_app();
|
|
||||||
|
|
||||||
$this->data = $data;
|
$this->data = $data;
|
||||||
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
|
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
|
||||||
@ -49,10 +48,18 @@ class Item extends BaseObject {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$child = new Item($item);
|
$child = new ThreadItem($item);
|
||||||
$this->add_child($child);
|
$this->add_child($child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allow a site to configure the order and content of the reaction emoji list
|
||||||
|
if($this->toplevel) {
|
||||||
|
$x = get_config('system','reactions');
|
||||||
|
if($x && is_array($x) && count($x)) {
|
||||||
|
$this->reactions = $x;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,7 +74,6 @@ class Item extends BaseObject {
|
|||||||
|
|
||||||
$result = array();
|
$result = array();
|
||||||
|
|
||||||
$a = $this->get_app();
|
|
||||||
$item = $this->get_data();
|
$item = $this->get_data();
|
||||||
|
|
||||||
$commentww = '';
|
$commentww = '';
|
||||||
@ -219,7 +225,8 @@ class Item extends BaseObject {
|
|||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
$indent = 'comment';
|
$indent = 'comment';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,8 +355,9 @@ class Item extends BaseObject {
|
|||||||
'photo' => $body['photo'],
|
'photo' => $body['photo'],
|
||||||
'event' => $body['event'],
|
'event' => $body['event'],
|
||||||
'has_tags' => $has_tags,
|
'has_tags' => $has_tags,
|
||||||
|
'reactions' => $this->reactions,
|
||||||
// Item toolbar buttons
|
// Item toolbar buttons
|
||||||
|
'emojis' => (($this->is_toplevel() && $this->is_commentable() && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
|
||||||
'like' => $like,
|
'like' => $like,
|
||||||
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
|
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
|
||||||
'share' => $share,
|
'share' => $share,
|
||||||
@ -675,7 +683,6 @@ class Item extends BaseObject {
|
|||||||
|
|
||||||
$template = get_markup_template($this->get_comment_box_template());
|
$template = get_markup_template($this->get_comment_box_template());
|
||||||
|
|
||||||
$a = $this->get_app();
|
|
||||||
$observer = $conv->get_observer();
|
$observer = $conv->get_observer();
|
||||||
|
|
||||||
$qc = ((local_channel()) ? get_pconfig(local_channel(),'system','qcomment') : null);
|
$qc = ((local_channel()) ? get_pconfig(local_channel(),'system','qcomment') : null);
|
||||||
@ -714,7 +721,7 @@ class Item extends BaseObject {
|
|||||||
'$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
|
'$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
|
||||||
'$encrypt' => t('Encrypt text'),
|
'$encrypt' => t('Encrypt text'),
|
||||||
'$cipher' => $conv->get_cipher(),
|
'$cipher' => $conv->get_cipher(),
|
||||||
'$sourceapp' => App::$sourcename
|
'$sourceapp' => \App::$sourcename
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
@ -1,11 +1,8 @@
|
|||||||
<?php /** @file */
|
<?php /** @file */
|
||||||
|
|
||||||
if(class_exists('Conversation'))
|
namespace Zotlabs\Lib;
|
||||||
return;
|
|
||||||
|
|
||||||
require_once('boot.php');
|
require_once('boot.php');
|
||||||
require_once('include/BaseObject.php');
|
|
||||||
require_once('include/ItemObject.php');
|
|
||||||
require_once('include/text.php');
|
require_once('include/text.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
|
|
||||||
@ -14,7 +11,7 @@ require_once('include/items.php');
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Conversation extends BaseObject {
|
class ThreadStream {
|
||||||
|
|
||||||
private $threads = array();
|
private $threads = array();
|
||||||
private $mode = null;
|
private $mode = null;
|
||||||
@ -46,9 +43,7 @@ class Conversation extends BaseObject {
|
|||||||
if($this->get_mode() == $mode)
|
if($this->get_mode() == $mode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$a = $this->get_app();
|
$this->observer = \App::get_observer();
|
||||||
|
|
||||||
$this->observer = App::get_observer();
|
|
||||||
$ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : '');
|
$ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : '');
|
||||||
|
|
||||||
switch($mode) {
|
switch($mode) {
|
||||||
@ -57,7 +52,7 @@ class Conversation extends BaseObject {
|
|||||||
$this->writable = true;
|
$this->writable = true;
|
||||||
break;
|
break;
|
||||||
case 'channel':
|
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');
|
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
|
||||||
break;
|
break;
|
||||||
case 'display':
|
case 'display':
|
||||||
@ -67,7 +62,7 @@ class Conversation extends BaseObject {
|
|||||||
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
|
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
|
||||||
break;
|
break;
|
||||||
case 'page':
|
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');
|
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -170,7 +165,7 @@ class Conversation extends BaseObject {
|
|||||||
$item->set_commentable(can_comment_on_post($this->observer['xchan_hash'],$item->data));
|
$item->set_commentable(can_comment_on_post($this->observer['xchan_hash'],$item->data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
|
|
||||||
$item->set_conversation($this);
|
$item->set_conversation($this);
|
||||||
$this->threads[] = $item;
|
$this->threads[] = $item;
|
160
Zotlabs/Lib/XConfig.php
Normal file
160
Zotlabs/Lib/XConfig.php
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
|
||||||
|
class XConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads a full xchan's configuration into a cached storage.
|
||||||
|
*
|
||||||
|
* All configuration values of the given observer hash are stored in global
|
||||||
|
* cache which is available under the global variable App::$config[$xchan].
|
||||||
|
*
|
||||||
|
* @param string $xchan
|
||||||
|
* The observer's hash
|
||||||
|
* @return void|false Returns false if xchan is not set
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Load($xchan) {
|
||||||
|
|
||||||
|
if(! $xchan)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(! array_key_exists($xchan, \App::$config))
|
||||||
|
\App::$config[$xchan] = array();
|
||||||
|
|
||||||
|
$r = q("SELECT * FROM xconfig WHERE xchan = '%s'",
|
||||||
|
dbesc($xchan)
|
||||||
|
);
|
||||||
|
|
||||||
|
if($r) {
|
||||||
|
foreach($r as $rr) {
|
||||||
|
$k = $rr['k'];
|
||||||
|
$c = $rr['cat'];
|
||||||
|
if(! array_key_exists($c, \App::$config[$xchan])) {
|
||||||
|
\App::$config[$xchan][$c] = array();
|
||||||
|
\App::$config[$xchan][$c]['config_loaded'] = true;
|
||||||
|
}
|
||||||
|
\App::$config[$xchan][$c][$k] = $rr['v'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get a particular observer's config variable given the category
|
||||||
|
* name ($family) and a key.
|
||||||
|
*
|
||||||
|
* Get a particular observer's config value from the given category ($family)
|
||||||
|
* and the $key from a cached storage in App::$config[$xchan].
|
||||||
|
*
|
||||||
|
* Returns false if not set.
|
||||||
|
*
|
||||||
|
* @param string $xchan
|
||||||
|
* The observer's hash
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to query
|
||||||
|
* @return mixed Stored $value or false if it does not exist
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Get($xchan, $family, $key) {
|
||||||
|
|
||||||
|
if(! $xchan)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(! array_key_exists($xchan, \App::$config))
|
||||||
|
load_xconfig($xchan);
|
||||||
|
|
||||||
|
if((! array_key_exists($family, \App::$config[$xchan])) || (! array_key_exists($key, \App::$config[$xchan][$family])))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return ((! is_array(\App::$config[$xchan][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$xchan][$family][$key]))
|
||||||
|
? unserialize(\App::$config[$xchan][$family][$key])
|
||||||
|
: \App::$config[$xchan][$family][$key]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets a configuration value for an observer.
|
||||||
|
*
|
||||||
|
* Stores a config value ($value) in the category ($family) under the key ($key)
|
||||||
|
* for the observer's $xchan hash.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param string $xchan
|
||||||
|
* The observer's hash
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to set
|
||||||
|
* @param string $value
|
||||||
|
* The value to store
|
||||||
|
* @return mixed Stored $value or false
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Set($xchan, $family, $key, $value) {
|
||||||
|
|
||||||
|
// manage array value
|
||||||
|
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
|
||||||
|
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
|
||||||
|
|
||||||
|
if(self::Get($xchan, $family, $key) === false) {
|
||||||
|
if(! array_key_exists($xchan, \App::$config))
|
||||||
|
\App::$config[$xchan] = array();
|
||||||
|
if(! array_key_exists($family, \App::$config[$xchan]))
|
||||||
|
\App::$config[$xchan][$family] = array();
|
||||||
|
|
||||||
|
$ret = q("INSERT INTO xconfig ( xchan, cat, k, v ) VALUES ( '%s', '%s', '%s', '%s' ) ",
|
||||||
|
dbesc($xchan),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key),
|
||||||
|
dbesc($dbvalue)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ret = q("UPDATE xconfig SET v = '%s' WHERE xchan = '%s' and cat = '%s' AND k = '%s'",
|
||||||
|
dbesc($dbvalue),
|
||||||
|
dbesc($xchan),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
App::$config[$xchan][$family][$key] = $value;
|
||||||
|
|
||||||
|
if($ret)
|
||||||
|
return $value;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deletes the given key from the observer's config.
|
||||||
|
*
|
||||||
|
* Removes the configured value from the stored cache in App::$config[$xchan]
|
||||||
|
* and removes it from the database.
|
||||||
|
*
|
||||||
|
* @param string $xchan
|
||||||
|
* The observer's hash
|
||||||
|
* @param string $family
|
||||||
|
* The category of the configuration value
|
||||||
|
* @param string $key
|
||||||
|
* The configuration key to delete
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public function Delete($xchan, $family, $key) {
|
||||||
|
|
||||||
|
if(x(\App::$config[$xchan][$family], $key))
|
||||||
|
unset(\App::$config[$xchan][$family][$key]);
|
||||||
|
$ret = q("DELETE FROM xconfig WHERE xchan = '%s' AND cat = '%s' AND k = '%s'",
|
||||||
|
dbesc($xchan),
|
||||||
|
dbesc($family),
|
||||||
|
dbesc($key)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
30
Zotlabs/Lib/ZotDriver.php
Normal file
30
Zotlabs/Lib/ZotDriver.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php /** @file */
|
||||||
|
|
||||||
|
namespace Zotlabs\Lib;
|
||||||
|
|
||||||
|
|
||||||
|
class ZotDriver extends ProtoDriver {
|
||||||
|
|
||||||
|
protected function discover($channel,$location) {
|
||||||
|
|
||||||
|
}
|
||||||
|
protected function deliver($item,$channel,$recipients) {
|
||||||
|
|
||||||
|
}
|
||||||
|
protected function collect($channel,$connection) {
|
||||||
|
|
||||||
|
}
|
||||||
|
protected function change_permissions($permissions,$channel,$recipient) {
|
||||||
|
|
||||||
|
}
|
||||||
|
protected function acknowledge_permissions($permissions,$channel,$recipient) {
|
||||||
|
|
||||||
|
}
|
||||||
|
protected function deliver_private($item,$channel,$recipients) {
|
||||||
|
|
||||||
|
}
|
||||||
|
protected function collect_private($channel,$connection) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -53,30 +53,32 @@ class Acl extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if ($type=='' || $type=='g'){
|
if ($type=='' || $type=='g'){
|
||||||
|
|
||||||
$r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`name`
|
$r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`gname`
|
||||||
FROM `groups`,`group_member`
|
FROM `groups`,`group_member`
|
||||||
WHERE `groups`.`deleted` = 0 AND `groups`.`uid` = %d
|
WHERE `groups`.`deleted` = 0 AND `groups`.`uid` = %d
|
||||||
AND `group_member`.`gid`=`groups`.`id`
|
AND `group_member`.`gid`=`groups`.`id`
|
||||||
$sql_extra
|
$sql_extra
|
||||||
GROUP BY `groups`.`id`
|
GROUP BY `groups`.`id`
|
||||||
ORDER BY `groups`.`name`
|
ORDER BY `groups`.`gname`
|
||||||
LIMIT %d OFFSET %d",
|
LIMIT %d OFFSET %d",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
intval($count),
|
intval($count),
|
||||||
intval($start)
|
intval($start)
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach($r as $g){
|
if($r) {
|
||||||
// logger('acl: group: ' . $g['name'] . ' members: ' . group_get_members_xchan($g['id']));
|
foreach($r as $g){
|
||||||
$groups[] = array(
|
// logger('acl: group: ' . $g['gname'] . ' members: ' . group_get_members_xchan($g['id']));
|
||||||
"type" => "g",
|
$groups[] = array(
|
||||||
"photo" => "images/twopeople.png",
|
"type" => "g",
|
||||||
"name" => $g['name'],
|
"photo" => "images/twopeople.png",
|
||||||
"id" => $g['id'],
|
"name" => $g['gname'],
|
||||||
"xid" => $g['hash'],
|
"id" => $g['id'],
|
||||||
"uids" => group_get_members_xchan($g['id']),
|
"xid" => $g['hash'],
|
||||||
"link" => ''
|
"uids" => group_get_members_xchan($g['id']),
|
||||||
);
|
"link" => ''
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +206,7 @@ class Acl extends \Zotlabs\Web\Controller {
|
|||||||
else
|
else
|
||||||
$r = array();
|
$r = array();
|
||||||
|
|
||||||
if(count($r)) {
|
if($r) {
|
||||||
foreach($r as $g){
|
foreach($r as $g){
|
||||||
|
|
||||||
// remove RSS feeds from ACLs - they are inaccessible
|
// remove RSS feeds from ACLs - they are inaccessible
|
||||||
@ -260,7 +262,7 @@ class Acl extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
// logger('navbar_complete');
|
// logger('navbar_complete');
|
||||||
|
|
||||||
if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
|
if(observer_prohibited()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
case 'site':
|
case 'site':
|
||||||
$this->admin_page_site_post($a);
|
$this->admin_page_site_post($a);
|
||||||
break;
|
break;
|
||||||
case 'users':
|
case 'accounts':
|
||||||
$this->admin_page_users_post($a);
|
$this->admin_page_accounts_post($a);
|
||||||
break;
|
break;
|
||||||
case 'channels':
|
case 'channels':
|
||||||
$this->admin_page_channels_post($a);
|
$this->admin_page_channels_post($a);
|
||||||
@ -127,8 +127,8 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
case 'site':
|
case 'site':
|
||||||
$o = $this->admin_page_site($a);
|
$o = $this->admin_page_site($a);
|
||||||
break;
|
break;
|
||||||
case 'users':
|
case 'accounts':
|
||||||
$o = $this->admin_page_users($a);
|
$o = $this->admin_page_accounts($a);
|
||||||
break;
|
break;
|
||||||
case 'channels':
|
case 'channels':
|
||||||
$o = $this->admin_page_channels($a);
|
$o = $this->admin_page_channels($a);
|
||||||
@ -872,20 +872,20 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Handle POST actions on users admin page.
|
* @brief Handle POST actions on accounts admin page.
|
||||||
*
|
*
|
||||||
* This function is called when on the admin user/account page the form was
|
* This function is called when on the admin user/account page the form was
|
||||||
* submitted to handle multiple operations at once. If one of the icons next
|
* submitted to handle multiple operations at once. If one of the icons next
|
||||||
* to an entry are pressed the function admin_page_users() will handle this.
|
* to an entry are pressed the function admin_page_accounts() will handle this.
|
||||||
*
|
*
|
||||||
* @param App $a
|
* @param App $a
|
||||||
*/
|
*/
|
||||||
function admin_page_users_post($a) {
|
function admin_page_accounts_post($a) {
|
||||||
$pending = ( x($_POST, 'pending') ? $_POST['pending'] : array() );
|
$pending = ( x($_POST, 'pending') ? $_POST['pending'] : array() );
|
||||||
$users = ( x($_POST, 'user') ? $_POST['user'] : array() );
|
$users = ( x($_POST, 'user') ? $_POST['user'] : array() );
|
||||||
$blocked = ( x($_POST, 'blocked') ? $_POST['blocked'] : array() );
|
$blocked = ( x($_POST, 'blocked') ? $_POST['blocked'] : array() );
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
|
check_form_security_token_redirectOnErr('/admin/accounts', 'admin_accounts');
|
||||||
|
|
||||||
// change to switch structure?
|
// change to switch structure?
|
||||||
// account block/unblock button was submitted
|
// account block/unblock button was submitted
|
||||||
@ -901,8 +901,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
notice( sprintf( tt("%s account blocked/unblocked", "%s account blocked/unblocked", count($users)), count($users)) );
|
notice( sprintf( tt("%s account blocked/unblocked", "%s account blocked/unblocked", count($users)), count($users)) );
|
||||||
}
|
}
|
||||||
// account delete button was submitted
|
// account delete button was submitted
|
||||||
if (x($_POST, 'page_users_delete')) {
|
if (x($_POST, 'page_accounts_delete')) {
|
||||||
require_once('include/Contact.php');
|
|
||||||
foreach ($users as $uid){
|
foreach ($users as $uid){
|
||||||
account_remove($uid, true, false);
|
account_remove($uid, true, false);
|
||||||
}
|
}
|
||||||
@ -921,20 +920,20 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
goaway(z_root() . '/admin/users' );
|
goaway(z_root() . '/admin/accounts' );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Generate users admin page and handle single item operations.
|
* @brief Generate accounts admin page and handle single item operations.
|
||||||
*
|
*
|
||||||
* This function generates the users/account admin page and handles the actions
|
* This function generates the accounts/account admin page and handles the actions
|
||||||
* if an icon next to an entry was clicked. If several items were selected and
|
* if an icon next to an entry was clicked. If several items were selected and
|
||||||
* the form was submitted it is handled by the function admin_page_users_post().
|
* the form was submitted it is handled by the function admin_page_accounts_post().
|
||||||
*
|
*
|
||||||
* @param App &$a
|
* @param App &$a
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function admin_page_users(&$a){
|
function admin_page_accounts(&$a){
|
||||||
if (argc() > 2) {
|
if (argc() > 2) {
|
||||||
$uid = argv(3);
|
$uid = argv(3);
|
||||||
$account = q("SELECT * FROM account WHERE account_id = %d",
|
$account = q("SELECT * FROM account WHERE account_id = %d",
|
||||||
@ -943,15 +942,14 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if (! $account) {
|
if (! $account) {
|
||||||
notice( t('Account not found') . EOL);
|
notice( t('Account not found') . EOL);
|
||||||
goaway(z_root() . '/admin/users' );
|
goaway(z_root() . '/admin/accounts' );
|
||||||
}
|
}
|
||||||
|
|
||||||
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
|
check_form_security_token_redirectOnErr('/admin/accounts', 'admin_accounts', 't');
|
||||||
|
|
||||||
switch (argv(2)){
|
switch (argv(2)){
|
||||||
case 'delete':
|
case 'delete':
|
||||||
// delete user
|
// delete user
|
||||||
require_once('include/Contact.php');
|
|
||||||
account_remove($uid,true,false);
|
account_remove($uid,true,false);
|
||||||
|
|
||||||
notice( sprintf(t("Account '%s' deleted"), $account[0]['account_email']) . EOL);
|
notice( sprintf(t("Account '%s' deleted"), $account[0]['account_email']) . EOL);
|
||||||
@ -974,7 +972,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
goaway(z_root() . '/admin/users' );
|
goaway(z_root() . '/admin/accounts' );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get pending */
|
/* get pending */
|
||||||
@ -982,7 +980,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
intval(ACCOUNT_PENDING)
|
intval(ACCOUNT_PENDING)
|
||||||
);
|
);
|
||||||
|
|
||||||
/* get users */
|
/* get accounts */
|
||||||
|
|
||||||
$total = q("SELECT count(*) as total FROM account");
|
$total = q("SELECT count(*) as total FROM account");
|
||||||
if (count($total)) {
|
if (count($total)) {
|
||||||
@ -990,22 +988,20 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
\App::set_pager_itemspage(100);
|
\App::set_pager_itemspage(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// We'll still need to link email addresses to admin/users/channels or some such, but this bit doesn't exist yet.
|
|
||||||
// That's where we need to be doing last post/channel flags/etc, not here.
|
|
||||||
|
|
||||||
$serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
|
$serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
|
||||||
|
|
||||||
|
$key = (($_REQUEST['key']) ? dbesc($_REQUEST['key']) : 'account_id');
|
||||||
|
$dir = 'asc';
|
||||||
|
if(array_key_exists('dir',$_REQUEST))
|
||||||
|
$dir = ((intval($_REQUEST['dir'])) ? 'asc' : 'desc');
|
||||||
|
|
||||||
|
$base = z_root() . '/admin/accounts?f=';
|
||||||
|
$odir = (($dir === 'asc') ? '0' : '1');
|
||||||
|
|
||||||
$order = " order by account_email asc ";
|
$users = q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d ) > 0 as `blocked`, " .
|
||||||
if($_REQUEST['order'] === 'expires')
|
|
||||||
$order = " order by account_expires desc ";
|
|
||||||
if($_REQUEST['order'] === 'created')
|
|
||||||
$order = " order by account_created desc ";
|
|
||||||
|
|
||||||
$users = q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d )>0 as `blocked`, " .
|
|
||||||
"(SELECT %s FROM channel as ch " .
|
"(SELECT %s FROM channel as ch " .
|
||||||
"WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as `channels` " .
|
"WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as `channels` " .
|
||||||
"FROM account as ac where true $serviceclass $order limit %d offset %d ",
|
"FROM account as ac where true $serviceclass order by $key $dir limit %d offset %d ",
|
||||||
intval(ACCOUNT_BLOCKED),
|
intval(ACCOUNT_BLOCKED),
|
||||||
db_concat('ch.channel_address', ' '),
|
db_concat('ch.channel_address', ' '),
|
||||||
intval(\App::$pager['itemspage']),
|
intval(\App::$pager['itemspage']),
|
||||||
@ -1028,14 +1024,14 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
// }
|
// }
|
||||||
// $users = array_map("_setup_users", $users);
|
// $users = array_map("_setup_users", $users);
|
||||||
|
|
||||||
$t = get_markup_template('admin_users.tpl');
|
$t = get_markup_template('admin_accounts.tpl');
|
||||||
$o = replace_macros($t, array(
|
$o = replace_macros($t, array(
|
||||||
// strings //
|
// strings //
|
||||||
'$title' => t('Administration'),
|
'$title' => t('Administration'),
|
||||||
'$page' => t('Users'),
|
'$page' => t('Accounts'),
|
||||||
'$submit' => t('Submit'),
|
'$submit' => t('Submit'),
|
||||||
'$select_all' => t('select all'),
|
'$select_all' => t('select all'),
|
||||||
'$h_pending' => t('User registrations waiting for confirm'),
|
'$h_pending' => t('Registrations waiting for confirm'),
|
||||||
'$th_pending' => array( t('Request date'), t('Email') ),
|
'$th_pending' => array( t('Request date'), t('Email') ),
|
||||||
'$no_pending' => t('No registrations.'),
|
'$no_pending' => t('No registrations.'),
|
||||||
'$approve' => t('Approve'),
|
'$approve' => t('Approve'),
|
||||||
@ -1043,14 +1039,22 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
'$delete' => t('Delete'),
|
'$delete' => t('Delete'),
|
||||||
'$block' => t('Block'),
|
'$block' => t('Block'),
|
||||||
'$unblock' => t('Unblock'),
|
'$unblock' => t('Unblock'),
|
||||||
|
'$odir' => $odir,
|
||||||
'$h_users' => t('Users'),
|
'$base' => $base,
|
||||||
'$th_users' => array( t('ID'), t('Email'), t('All Channels'), t('Register date'), t('Last login'), t('Expires'), t('Service Class')),
|
'$h_users' => t('Accounts'),
|
||||||
|
'$th_users' => array(
|
||||||
|
[ t('ID'), 'account_id' ],
|
||||||
|
[ t('Email'), 'account_email' ],
|
||||||
|
[ t('All Channels'), 'channels' ],
|
||||||
|
[ t('Register date'), 'account_created' ],
|
||||||
|
[ t('Last login'), 'account_lastlog' ],
|
||||||
|
[ t('Expires'), 'account_expires' ],
|
||||||
|
[ t('Service Class'), 'account_service_class'] ),
|
||||||
|
|
||||||
'$confirm_delete_multi' => t('Selected accounts will be deleted!\n\nEverything these accounts had posted on this site will be permanently deleted!\n\nAre you sure?'),
|
'$confirm_delete_multi' => t('Selected accounts will be deleted!\n\nEverything these accounts had posted on this site will be permanently deleted!\n\nAre you sure?'),
|
||||||
'$confirm_delete' => t('The account {0} will be deleted!\n\nEverything this account has posted on this site will be permanently deleted!\n\nAre you sure?'),
|
'$confirm_delete' => t('The account {0} will be deleted!\n\nEverything this account has posted on this site will be permanently deleted!\n\nAre you sure?'),
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token("admin_users"),
|
'$form_security_token' => get_form_security_token("admin_accounts"),
|
||||||
|
|
||||||
// values //
|
// values //
|
||||||
'$baseurl' => z_root(),
|
'$baseurl' => z_root(),
|
||||||
@ -1082,7 +1086,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
intval(PAGE_CENSORED),
|
intval(PAGE_CENSORED),
|
||||||
intval( $uid )
|
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)) );
|
notice( sprintf( tt("%s channel censored/uncensored", "%s channels censored/uncensored", count($channels)), count($channels)) );
|
||||||
}
|
}
|
||||||
@ -1096,7 +1100,6 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
notice( sprintf( tt("%s channel code allowed/disallowed", "%s channels code allowed/disallowed", count($channels)), count($channels)) );
|
notice( sprintf( tt("%s channel code allowed/disallowed", "%s channels code allowed/disallowed", count($channels)), count($channels)) );
|
||||||
}
|
}
|
||||||
if (x($_POST,'page_channels_delete')){
|
if (x($_POST,'page_channels_delete')){
|
||||||
require_once("include/Contact.php");
|
|
||||||
foreach($channels as $uid){
|
foreach($channels as $uid){
|
||||||
channel_remove($uid,true);
|
channel_remove($uid,true);
|
||||||
}
|
}
|
||||||
@ -1128,7 +1131,6 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
case "delete":{
|
case "delete":{
|
||||||
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
|
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
|
||||||
// delete channel
|
// delete channel
|
||||||
require_once("include/Contact.php");
|
|
||||||
channel_remove($uid,true);
|
channel_remove($uid,true);
|
||||||
|
|
||||||
notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
|
notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
|
||||||
@ -1141,7 +1143,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
intval($pflags),
|
intval($pflags),
|
||||||
intval( $uid )
|
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);
|
notice( sprintf( (($pflags & PAGE_CENSORED) ? t("Channel '%s' censored"): t("Channel '%s' uncensored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
|
||||||
}; break;
|
}; break;
|
||||||
@ -1162,6 +1164,17 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
goaway(z_root() . '/admin/channels' );
|
goaway(z_root() . '/admin/channels' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$key = (($_REQUEST['key']) ? dbesc($_REQUEST['key']) : 'channel_id');
|
||||||
|
$dir = 'asc';
|
||||||
|
if(array_key_exists('dir',$_REQUEST))
|
||||||
|
$dir = ((intval($_REQUEST['dir'])) ? 'asc' : 'desc');
|
||||||
|
|
||||||
|
$base = z_root() . '/admin/channels?f=';
|
||||||
|
$odir = (($dir === 'asc') ? '0' : '1');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* get channels */
|
/* get channels */
|
||||||
|
|
||||||
@ -1170,14 +1183,12 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
\App::set_pager_total($total[0]['total']);
|
\App::set_pager_total($total[0]['total']);
|
||||||
\App::set_pager_itemspage(100);
|
\App::set_pager_itemspage(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
$order = " order by channel_name asc ";
|
$channels = q("SELECT * from channel where channel_removed = 0 and channel_system = 0 order by $key $dir limit %d offset %d ",
|
||||||
|
|
||||||
$channels = q("SELECT * from channel where channel_removed = 0 and channel_system = 0 $order limit %d offset %d ",
|
|
||||||
intval(\App::$pager['itemspage']),
|
intval(\App::$pager['itemspage']),
|
||||||
intval(\App::$pager['start'])
|
intval(\App::$pager['start'])
|
||||||
);
|
);
|
||||||
|
|
||||||
if($channels) {
|
if($channels) {
|
||||||
for($x = 0; $x < count($channels); $x ++) {
|
for($x = 0; $x < count($channels); $x ++) {
|
||||||
if($channels[$x]['channel_pageflags'] & PAGE_CENSORED)
|
if($channels[$x]['channel_pageflags'] & PAGE_CENSORED)
|
||||||
@ -1205,7 +1216,12 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
'$code' => t('Allow Code'),
|
'$code' => t('Allow Code'),
|
||||||
'$uncode' => t('Disallow Code'),
|
'$uncode' => t('Disallow Code'),
|
||||||
'$h_channels' => t('Channel'),
|
'$h_channels' => t('Channel'),
|
||||||
'$th_channels' => array( t('UID'), t('Name'), t('Address')),
|
'$base' => $base,
|
||||||
|
'$odir' => $odir,
|
||||||
|
'$th_channels' => array(
|
||||||
|
[ t('UID'), 'channel_id' ],
|
||||||
|
[ t('Name'), 'channel_name' ],
|
||||||
|
[ t('Address'), 'channel_address' ]),
|
||||||
|
|
||||||
'$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
|
'$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
|
||||||
'$confirm_delete' => t('The channel {0} will be deleted!\n\nEverything that was posted in this channel on this site will be permanently deleted!\n\nAre you sure?'),
|
'$confirm_delete' => t('The channel {0} will be deleted!\n\nEverything that was posted in this channel on this site will be permanently deleted!\n\nAre you sure?'),
|
||||||
@ -1295,7 +1311,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$admin_form = '';
|
$admin_form = '';
|
||||||
|
|
||||||
$r = q("select * from addon where plugin_admin = 1 and name = '%s' limit 1",
|
$r = q("select * from addon where plugin_admin = 1 and aname = '%s' limit 1",
|
||||||
dbesc($plugin)
|
dbesc($plugin)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1408,7 +1424,9 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
'$plugins' => $plugins,
|
'$plugins' => $plugins,
|
||||||
'$disabled' => t('Disabled - version incompatibility'),
|
'$disabled' => t('Disabled - version incompatibility'),
|
||||||
'$form_security_token' => get_form_security_token('admin_plugins'),
|
'$form_security_token' => get_form_security_token('admin_plugins'),
|
||||||
'$addrepo' => t('Add Plugin Repo'),
|
'$managerepos' => t('Manage Repos'),
|
||||||
|
'$installedtitle' => t('Installed Plugin Repositories'),
|
||||||
|
'$addnewrepotitle' => t('Install a New Plugin Repository'),
|
||||||
'$expandform' => false,
|
'$expandform' => false,
|
||||||
'$form' => $admin_plugins_add_repo_form,
|
'$form' => $admin_plugins_add_repo_form,
|
||||||
'$newRepoModal' => $newRepoModal,
|
'$newRepoModal' => $newRepoModal,
|
||||||
@ -1423,13 +1441,15 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
function listAddonRepos() {
|
function listAddonRepos() {
|
||||||
$addonrepos = [];
|
$addonrepos = [];
|
||||||
$addonDir = __DIR__ . '/../../extend/addon/';
|
$addonDir = __DIR__ . '/../../extend/addon/';
|
||||||
if ($handle = opendir($addonDir)) {
|
if(is_dir($addonDir)) {
|
||||||
while (false !== ($entry = readdir($handle))) {
|
if ($handle = opendir($addonDir)) {
|
||||||
if ($entry != "." && $entry != "..") {
|
while (false !== ($entry = readdir($handle))) {
|
||||||
$addonrepos[] = $entry;
|
if ($entry != "." && $entry != "..") {
|
||||||
|
$addonrepos[] = $entry;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
closedir($handle);
|
||||||
}
|
}
|
||||||
closedir($handle);
|
|
||||||
}
|
}
|
||||||
return $addonrepos;
|
return $addonrepos;
|
||||||
}
|
}
|
||||||
@ -1718,7 +1738,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
// name, label, value, help string, extra data...
|
// name, label, value, help string, extra data...
|
||||||
'$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
|
'$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
|
||||||
'$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Red top-level directory.")),
|
'$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your top-level webserver directory.")),
|
||||||
'$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
|
'$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
|
||||||
|
|
||||||
'$form_security_token' => get_form_security_token('admin_logs'),
|
'$form_security_token' => get_form_security_token('admin_logs'),
|
||||||
@ -1733,7 +1753,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
} else {
|
} else {
|
||||||
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
|
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
|
||||||
}
|
}
|
||||||
$extendDir = __DIR__ . '/../../store/git/sys/extend';
|
$extendDir = __DIR__ . '/../../store/[data]/git/sys/extend';
|
||||||
$addonDir = $extendDir . '/addon';
|
$addonDir = $extendDir . '/addon';
|
||||||
if (!file_exists($extendDir)) {
|
if (!file_exists($extendDir)) {
|
||||||
if (!mkdir($extendDir, 0770, true)) {
|
if (!mkdir($extendDir, 0770, true)) {
|
||||||
@ -1746,7 +1766,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName;
|
$repoDir = __DIR__ . '/../../store/[data]/git/sys/extend/addon/' . $repoName;
|
||||||
if (!is_dir($repoDir)) {
|
if (!is_dir($repoDir)) {
|
||||||
logger('Repo directory does not exist: ' . $repoDir);
|
logger('Repo directory does not exist: ' . $repoDir);
|
||||||
json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
|
json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
|
||||||
@ -1758,6 +1778,18 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
$git = new GitRepo('sys', null, false, $repoName, $repoDir);
|
$git = new GitRepo('sys', null, false, $repoName, $repoDir);
|
||||||
try {
|
try {
|
||||||
if ($git->pull()) {
|
if ($git->pull()) {
|
||||||
|
$files = array_diff(scandir($repoDir), array('.', '..'));
|
||||||
|
foreach ($files as $file) {
|
||||||
|
if (is_dir($repoDir . '/' . $file) && $file !== '.git') {
|
||||||
|
$source = '../extend/addon/' . $repoName . '/' . $file;
|
||||||
|
$target = realpath(__DIR__ . '/../../addon/') . '/' . $file;
|
||||||
|
unlink($target);
|
||||||
|
if (!symlink($source, $target)) {
|
||||||
|
logger('Error linking addons to /addon');
|
||||||
|
json_return_and_die(array('message' => 'Error linking addons to /addon', 'success' => false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
json_return_and_die(array('message' => 'Repo updated.', 'success' => true));
|
json_return_and_die(array('message' => 'Repo updated.', 'success' => true));
|
||||||
} else {
|
} else {
|
||||||
json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false));
|
json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false));
|
||||||
@ -1771,7 +1803,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
} else {
|
} else {
|
||||||
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
|
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
|
||||||
}
|
}
|
||||||
$extendDir = __DIR__ . '/../../store/git/sys/extend';
|
$extendDir = __DIR__ . '/../../store/[data]/git/sys/extend';
|
||||||
$addonDir = $extendDir . '/addon';
|
$addonDir = $extendDir . '/addon';
|
||||||
if (!file_exists($extendDir)) {
|
if (!file_exists($extendDir)) {
|
||||||
if (!mkdir($extendDir, 0770, true)) {
|
if (!mkdir($extendDir, 0770, true)) {
|
||||||
@ -1784,7 +1816,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName;
|
$repoDir = __DIR__ . '/../../store/[data]/git/sys/extend/addon/' . $repoName;
|
||||||
if (!is_dir($repoDir)) {
|
if (!is_dir($repoDir)) {
|
||||||
logger('Repo directory does not exist: ' . $repoDir);
|
logger('Repo directory does not exist: ' . $repoDir);
|
||||||
json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
|
json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
|
||||||
@ -1804,7 +1836,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
if (array_key_exists('repoURL', $_REQUEST)) {
|
if (array_key_exists('repoURL', $_REQUEST)) {
|
||||||
require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies
|
require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies
|
||||||
$repoURL = $_REQUEST['repoURL'];
|
$repoURL = $_REQUEST['repoURL'];
|
||||||
$extendDir = __DIR__ . '/../../store/git/sys/extend';
|
$extendDir = __DIR__ . '/../../store/[data]/git/sys/extend';
|
||||||
$addonDir = $extendDir . '/addon';
|
$addonDir = $extendDir . '/addon';
|
||||||
if (!file_exists($extendDir)) {
|
if (!file_exists($extendDir)) {
|
||||||
if (!mkdir($extendDir, 0770, true)) {
|
if (!mkdir($extendDir, 0770, true)) {
|
||||||
@ -1832,7 +1864,7 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
json_return_and_die(array('message' => 'Invalid git repo', 'success' => false));
|
json_return_and_die(array('message' => 'Invalid git repo', 'success' => false));
|
||||||
}
|
}
|
||||||
$repoDir = $addonDir . '/' . $repoName;
|
$repoDir = $addonDir . '/' . $repoName;
|
||||||
$tempRepoBaseDir = __DIR__ . '/../../store/git/sys/temp/';
|
$tempRepoBaseDir = __DIR__ . '/../../store/[data]/git/sys/temp/';
|
||||||
$tempAddonDir = $tempRepoBaseDir . $repoName;
|
$tempAddonDir = $tempRepoBaseDir . $repoName;
|
||||||
|
|
||||||
if (!is_writable($addonDir) || !is_writable($tempAddonDir)) {
|
if (!is_writable($addonDir) || !is_writable($tempAddonDir)) {
|
||||||
@ -1866,9 +1898,9 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
if (array_key_exists('repoURL', $_REQUEST)) {
|
if (array_key_exists('repoURL', $_REQUEST)) {
|
||||||
require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies
|
require __DIR__ . '/../../library/PHPGit.autoload.php'; // Load PHPGit dependencies
|
||||||
$repoURL = $_REQUEST['repoURL'];
|
$repoURL = $_REQUEST['repoURL'];
|
||||||
$extendDir = __DIR__ . '/../../store/git/sys/extend';
|
$extendDir = __DIR__ . '/../../store/[data]/git/sys/extend';
|
||||||
$addonDir = $extendDir . '/addon';
|
$addonDir = $extendDir . '/addon';
|
||||||
$tempAddonDir = __DIR__ . '/../../store/git/sys/temp';
|
$tempAddonDir = __DIR__ . '/../../store/[data]/git/sys/temp';
|
||||||
if (!file_exists($extendDir)) {
|
if (!file_exists($extendDir)) {
|
||||||
if (!mkdir($extendDir, 0770, true)) {
|
if (!mkdir($extendDir, 0770, true)) {
|
||||||
logger('Error creating extend folder: ' . $extendDir);
|
logger('Error creating extend folder: ' . $extendDir);
|
||||||
@ -1880,6 +1912,12 @@ class Admin extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!is_dir($tempAddonDir)) {
|
||||||
|
if (!mkdir($tempAddonDir, 0770, true)) {
|
||||||
|
logger('Error creating temp plugin repo folder: ' . $tempAddonDir);
|
||||||
|
json_return_and_die(array('message' => 'Error creating temp plugin repo folder: ' . $tempAddonDir, 'success' => false));
|
||||||
|
}
|
||||||
|
}
|
||||||
$repoName = null;
|
$repoName = null;
|
||||||
if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') {
|
if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') {
|
||||||
$repoName = $_REQUEST['repoName'];
|
$repoName = $_REQUEST['repoName'];
|
||||||
|
@ -107,7 +107,7 @@ class Api extends \Zotlabs\Web\Controller {
|
|||||||
$r = q("SELECT `clients`.*
|
$r = q("SELECT `clients`.*
|
||||||
FROM `clients`, `tokens`
|
FROM `clients`, `tokens`
|
||||||
WHERE `clients`.`client_id`=`tokens`.`client_id`
|
WHERE `clients`.`client_id`=`tokens`.`client_id`
|
||||||
AND `tokens`.`id`='%s' AND `tokens`.`scope`='request'",
|
AND `tokens`.`id`='%s' AND `tokens`.`auth_scope`='request'",
|
||||||
dbesc($token));
|
dbesc($token));
|
||||||
|
|
||||||
if (!count($r))
|
if (!count($r))
|
||||||
|
@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/apps.php');
|
//require_once('include/apps.php');
|
||||||
|
|
||||||
|
use \Zotlabs\Lib as Zlib;
|
||||||
|
|
||||||
class Appman extends \Zotlabs\Web\Controller {
|
class Appman extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
@ -30,16 +31,16 @@ class Appman extends \Zotlabs\Web\Controller {
|
|||||||
'categories' => escape_tags($_REQUEST['categories'])
|
'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);
|
info( t('App installed.') . EOL);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$papp = app_decode($_POST['papp']);
|
$papp = Zlib\Apps::app_decode($_POST['papp']);
|
||||||
|
|
||||||
if(! is_array($papp)) {
|
if(! is_array($papp)) {
|
||||||
notice( t('Malformed app.') . EOL);
|
notice( t('Malformed app.') . EOL);
|
||||||
@ -47,13 +48,13 @@ class Appman extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($_POST['install']) {
|
if($_POST['install']) {
|
||||||
app_install(local_channel(),$papp);
|
Zlib\Apps::app_install(local_channel(),$papp);
|
||||||
if(app_installed(local_channel(),$papp))
|
if(Zlib\Apps::app_installed(local_channel(),$papp))
|
||||||
info( t('App installed.') . EOL);
|
info( t('App installed.') . EOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($_POST['delete']) {
|
if($_POST['delete']) {
|
||||||
app_destroy(local_channel(),$papp);
|
Zlib\Apps::app_destroy(local_channel(),$papp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($_POST['edit']) {
|
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();"');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/apps.php');
|
//require_once('include/apps.php');
|
||||||
|
|
||||||
|
use \Zotlabs\Lib as Zlib;
|
||||||
|
|
||||||
class Apps extends \Zotlabs\Web\Controller {
|
class Apps extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
@ -19,25 +20,25 @@ class Apps extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
|
|
||||||
if(local_channel()) {
|
if(local_channel()) {
|
||||||
import_system_apps();
|
Zlib\Apps::import_system_apps();
|
||||||
$syslist = array();
|
$syslist = array();
|
||||||
$list = app_list(local_channel(), false, $_GET['cat']);
|
$list = Zlib\Apps::app_list(local_channel(), false, $_GET['cat']);
|
||||||
if($list) {
|
if($list) {
|
||||||
foreach($list as $x) {
|
foreach($list as $x) {
|
||||||
$syslist[] = app_encode($x);
|
$syslist[] = Zlib\Apps::app_encode($x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
translate_system_apps($syslist);
|
Zlib\Apps::translate_system_apps($syslist);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$syslist = get_system_apps(true);
|
$syslist = Zlib\Apps::get_system_apps(true);
|
||||||
|
|
||||||
usort($syslist,'app_name_compare');
|
usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare');
|
||||||
|
|
||||||
// logger('apps: ' . print_r($syslist,true));
|
// logger('apps: ' . print_r($syslist,true));
|
||||||
|
|
||||||
foreach($syslist as $app) {
|
foreach($syslist as $app) {
|
||||||
$apps[] = app_render($app,$mode);
|
$apps[] = Zlib\Apps::app_render($app,$mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
return replace_macros(get_markup_template('myapps.tpl'), array(
|
return replace_macros(get_markup_template('myapps.tpl'), array(
|
||||||
|
@ -40,7 +40,7 @@ class Attach extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
|
header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
|
||||||
if(intval($r['data']['os_storage'])) {
|
if(intval($r['data']['os_storage'])) {
|
||||||
$fname = dbunescbin($r['data']['data']);
|
$fname = dbunescbin($r['data']['content']);
|
||||||
if(strpos($fname,'store') !== false)
|
if(strpos($fname,'store') !== false)
|
||||||
$istream = fopen($fname,'rb');
|
$istream = fopen($fname,'rb');
|
||||||
else
|
else
|
||||||
@ -53,7 +53,7 @@ class Attach extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
echo dbunescbin($r['data']['data']);
|
echo dbunescbin($r['data']['content']);
|
||||||
killme();
|
killme();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/conversation.php');
|
require_once('include/conversation.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
|
|
||||||
|
@ -6,14 +6,12 @@ require_once('include/bbcode.php');
|
|||||||
require_once('include/datetime.php');
|
require_once('include/datetime.php');
|
||||||
require_once('include/event.php');
|
require_once('include/event.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/Contact.php');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Cal extends \Zotlabs\Web\Controller {
|
class Cal extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
|
if(observer_prohibited()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$channel = null;
|
$channel = null;
|
||||||
|
|
||||||
if(argc() > 1) {
|
if(argc() > 1) {
|
||||||
@ -94,7 +91,7 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||||||
$mode = 'view';
|
$mode = 'view';
|
||||||
$y = 0;
|
$y = 0;
|
||||||
$m = 0;
|
$m = 0;
|
||||||
$ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
|
$ignored = ((x($_REQUEST,'ignored')) ? " and dismissed = " . intval($_REQUEST['ignored']) . " " : '');
|
||||||
|
|
||||||
// logger('args: ' . print_r(\App::$argv,true));
|
// logger('args: ' . print_r(\App::$argv,true));
|
||||||
|
|
||||||
@ -149,7 +146,7 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||||||
$ftext = datetime_convert('UTC',$tz,$fdt);
|
$ftext = datetime_convert('UTC',$tz,$fdt);
|
||||||
$ftext = substr($ftext,0,14) . "00:00";
|
$ftext = substr($ftext,0,14) . "00:00";
|
||||||
|
|
||||||
$type = ((x($orig_event)) ? $orig_event['type'] : 'event');
|
$type = ((x($orig_event)) ? $orig_event['etype'] : 'event');
|
||||||
|
|
||||||
$f = get_config('system','event_input_format');
|
$f = get_config('system','event_input_format');
|
||||||
if(! $f)
|
if(! $f)
|
||||||
@ -160,7 +157,7 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$show_bd = perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts');
|
$show_bd = perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts');
|
||||||
if(! $show_bd) {
|
if(! $show_bd) {
|
||||||
$sql_extra .= " and event.type != 'birthday' ";
|
$sql_extra .= " and event.etype != 'birthday' ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -228,8 +225,8 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||||||
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
|
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
|
||||||
from event left join item on event_hash = resource_id
|
from event left join item on event_hash = resource_id
|
||||||
where resource_type = 'event' and event.uid = %d $ignored
|
where resource_type = 'event' and event.uid = %d $ignored
|
||||||
AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
|
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
|
||||||
OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) $sql_extra ",
|
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) $sql_extra ",
|
||||||
intval($channel['channel_id']),
|
intval($channel['channel_id']),
|
||||||
dbesc($start),
|
dbesc($start),
|
||||||
dbesc($finish),
|
dbesc($finish),
|
||||||
@ -250,7 +247,7 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($r) {
|
if($r) {
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
|
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
|
||||||
if(! x($links,$j))
|
if(! x($links,$j))
|
||||||
$links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
|
$links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
|
||||||
}
|
}
|
||||||
@ -265,15 +262,15 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
|
||||||
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
|
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
|
||||||
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
|
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], $fmt) : datetime_convert('UTC','UTC',$rr['dtstart'],$fmt));
|
||||||
$d = day_translate($d);
|
$d = day_translate($d);
|
||||||
|
|
||||||
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
|
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
|
||||||
if ($rr['nofinish']){
|
if ($rr['nofinish']){
|
||||||
$end = null;
|
$end = null;
|
||||||
} else {
|
} else {
|
||||||
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
|
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,353 +13,355 @@ require_once('include/PermissionDescription.php');
|
|||||||
|
|
||||||
class Channel extends \Zotlabs\Web\Controller {
|
class Channel extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
|
|
||||||
$which = null;
|
$which = null;
|
||||||
if(argc() > 1)
|
if(argc() > 1)
|
||||||
$which = argv(1);
|
$which = argv(1);
|
||||||
if(! $which) {
|
if(! $which) {
|
||||||
if(local_channel()) {
|
if(local_channel()) {
|
||||||
$channel = \App::get_channel();
|
$channel = \App::get_channel();
|
||||||
if($channel && $channel['channel_address'])
|
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'];
|
$which = $channel['channel_address'];
|
||||||
|
$profile = argv(1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(! $which) {
|
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
|
||||||
notice( t('You must be logged in to see this page.') . EOL );
|
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Only posts') . '" href="' . z_root() . '/feed/' . $which . '?top=1" />' . "\r\n" ;
|
||||||
return;
|
|
||||||
|
// Not yet ready for prime time
|
||||||
|
// \App::$page['htmlhead'] .= '<link rel="openid.server" href="' . z_root() . '/id/' . $which .'?f=" />' . "\r\n" ;
|
||||||
|
// \App::$page['htmlhead'] .= '<link rel="openid.delegate" href="' . z_root() . '/channel/' . $which .'" />' . "\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;
|
function get($update = 0, $load = false) {
|
||||||
$channel = \App::get_channel();
|
|
||||||
|
|
||||||
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
|
|
||||||
$which = $channel['channel_address'];
|
|
||||||
$profile = argv(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
|
|
||||||
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Only posts') . '" href="' . z_root() . '/feed/' . $which . '?top=1" />' . "\r\n" ;
|
|
||||||
|
|
||||||
// Not yet ready for prime time
|
|
||||||
// \App::$page['htmlhead'] .= '<link rel="openid.server" href="' . z_root() . '/id/' . $which .'?f=" />' . "\r\n" ;
|
|
||||||
// \App::$page['htmlhead'] .= '<link rel="openid.delegate" href="' . z_root() . '/channel/' . $which .'" />' . "\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) {
|
|
||||||
|
|
||||||
|
|
||||||
if($load)
|
if($load)
|
||||||
$_SESSION['loadtime'] = datetime_convert();
|
$_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']) : '');
|
$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']) : '');
|
$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();
|
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();
|
$groups = array();
|
||||||
$observer = \App::get_observer();
|
|
||||||
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
|
|
||||||
|
|
||||||
$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
|
// We may want to make the target of this redirect configurable
|
||||||
if($perms['view_profile']) {
|
if($perms['view_profile']) {
|
||||||
notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
|
notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
|
||||||
goaway (z_root() . "/profile/" . \App::$profile['channel_address']);
|
goaway (z_root() . "/profile/" . \App::$profile['channel_address']);
|
||||||
}
|
}
|
||||||
notice( t('Permission denied.') . EOL);
|
notice( t('Permission denied.') . EOL);
|
||||||
return;
|
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']
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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
|
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(
|
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
|
||||||
'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" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
|
|
||||||
|
|
||||||
if($update && $_SESSION['loadtime'])
|
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']) . "' ) ";
|
$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)
|
if($load)
|
||||||
$simple_update = '';
|
$simple_update = '';
|
||||||
|
|
||||||
if(($update) && (! $load)) {
|
if(($update) && (! $load)) {
|
||||||
|
|
||||||
if ($mid) {
|
if($mid) {
|
||||||
$r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal
|
$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",
|
AND item_wall = 1 AND item_unseen = 1 $sql_extra limit 1",
|
||||||
dbesc($mid . '%'),
|
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),
|
|
||||||
intval(\App::$profile['profile_uid'])
|
intval(\App::$profile['profile_uid'])
|
||||||
);
|
);
|
||||||
if (! $r) {
|
}
|
||||||
notice( t('Permission denied.') . EOL);
|
else {
|
||||||
}
|
$r = q("SELECT distinct parent AS `item_id`, created from item
|
||||||
|
left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
|
||||||
} 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
|
WHERE uid = %d $item_normal
|
||||||
AND item_wall = 1 and item_thread_top = 1
|
AND item_wall = 1 $simple_update
|
||||||
AND (abook_blocked = 0 or abook.abook_flags is null)
|
AND (abook.abook_blocked = 0 or abook.abook_flags is null)
|
||||||
$sql_extra $sql_extra2
|
$sql_extra
|
||||||
ORDER BY created DESC $pager_sql ",
|
ORDER BY created DESC",
|
||||||
intval(\App::$profile['profile_uid'])
|
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 .= '<div id="live-channel"></div>' . "\r\n";
|
||||||
|
$o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
|
||||||
|
. "; var netargs = '?f='; var profile_page = " . \App::$pager['page']
|
||||||
|
. "; divmore_height = " . intval($maxheight) . "; </script>\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 {
|
else {
|
||||||
$r = array();
|
if($parents_str) {
|
||||||
}
|
$update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )";
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
if($is_owner && $update_unseen) {
|
||||||
$items = array();
|
$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((! $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 .= '<div id="live-channel"></div>' . "\r\n";
|
|
||||||
$o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
|
|
||||||
. "; var netargs = '?f='; var profile_page = " . \App::$pager['page']
|
|
||||||
. "; divmore_height = " . intval($maxheight) . "; </script>\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 {
|
|
||||||
if($parents_str) {
|
if($checkjs->disabled()) {
|
||||||
$update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )";
|
$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 .= '<div id="content-complete"></div>';
|
||||||
|
|
||||||
|
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 .= '<div id="content-complete"></div>';
|
|
||||||
|
|
||||||
return $o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -1,10 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/zot.php');
|
require_once('include/zot.php');
|
||||||
|
|
||||||
|
|
||||||
class Chanview extends \Zotlabs\Web\Controller {
|
class Chanview extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
@ -62,18 +60,15 @@ class Chanview extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($_REQUEST['address']) {
|
if($_REQUEST['address']) {
|
||||||
$ret = zot_finger($_REQUEST['address'],null);
|
$j = \Zotlabs\Zot\Finger::run($_REQUEST['address'],null);
|
||||||
if($ret['success']) {
|
if($j['success']) {
|
||||||
$j = json_decode($ret['body'],true);
|
import_xchan($j);
|
||||||
if($j)
|
|
||||||
import_xchan($j);
|
|
||||||
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
|
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
|
||||||
dbesc($_REQUEST['address'])
|
dbesc($_REQUEST['address'])
|
||||||
);
|
);
|
||||||
if($r)
|
if($r)
|
||||||
\App::$poi = $r[0];
|
\App::$poi = $r[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
<?php
|
<?php /** @file */
|
||||||
namespace Zotlabs\Module; /** @file */
|
|
||||||
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
|
|
||||||
require_once('include/chat.php');
|
|
||||||
require_once('include/bookmarks.php');
|
require_once('include/bookmarks.php');
|
||||||
|
|
||||||
|
use \Zotlabs\Lib as Zlib;
|
||||||
|
|
||||||
class Chat extends \Zotlabs\Web\Controller {
|
class Chat extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
@ -41,7 +43,7 @@ class Chat extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function post() {
|
function post() {
|
||||||
|
|
||||||
if($_POST['room_name'])
|
if($_POST['room_name'])
|
||||||
$room = strip_tags(trim($_POST['room_name']));
|
$room = strip_tags(trim($_POST['room_name']));
|
||||||
@ -54,7 +56,7 @@ class Chat extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($_POST['action'] === 'drop') {
|
if($_POST['action'] === 'drop') {
|
||||||
logger('delete chatroom');
|
logger('delete chatroom');
|
||||||
chatroom_destroy($channel,array('cr_name' => $room));
|
Zlib\Chatroom::destroy($channel,array('cr_name' => $room));
|
||||||
goaway(z_root() . '/chat/' . $channel['channel_address']);
|
goaway(z_root() . '/chat/' . $channel['channel_address']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +69,7 @@ class Chat extends \Zotlabs\Web\Controller {
|
|||||||
if(intval($arr['expire']) < 0)
|
if(intval($arr['expire']) < 0)
|
||||||
$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",
|
$x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
|
||||||
dbesc($room),
|
dbesc($room),
|
||||||
@ -87,7 +89,7 @@ class Chat extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|
||||||
if(local_channel())
|
if(local_channel())
|
||||||
$channel = \App::get_channel();
|
$channel = \App::get_channel();
|
||||||
@ -105,7 +107,7 @@ class Chat extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) {
|
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));
|
goaway(z_root() . '/channel/' . argv(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,7 +160,7 @@ class Chat extends \Zotlabs\Web\Controller {
|
|||||||
$room_id = intval(argv(2));
|
$room_id = intval(argv(2));
|
||||||
$bookmark_link = get_bookmark_link($ob);
|
$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)
|
if(! $x)
|
||||||
return;
|
return;
|
||||||
$x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
|
$x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
|
||||||
@ -238,10 +240,10 @@ 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(
|
$o .= replace_macros(get_markup_template('chatrooms.tpl'), array(
|
||||||
'$header' => sprintf( t('%1$s\'s Chatrooms'), \App::$profile['name']),
|
'$header' => sprintf( t('%1$s\'s Chatrooms'), \App::$profile['fullname']),
|
||||||
'$name' => t('Name'),
|
'$name' => t('Name'),
|
||||||
'$baseurl' => z_root(),
|
'$baseurl' => z_root(),
|
||||||
'$nickname' => \App::$profile['channel_address'],
|
'$nickname' => \App::$profile['channel_address'],
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
<?php
|
<?php /** @file */
|
||||||
namespace Zotlabs\Module; /** @file */
|
|
||||||
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/security.php');
|
require_once('include/security.php');
|
||||||
|
|
||||||
|
use \Zotlabs\Lib as Zlib;
|
||||||
|
|
||||||
class Chatsvc extends \Zotlabs\Web\Controller {
|
class Chatsvc extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
|
|
||||||
//logger('chatsvc');
|
//logger('chatsvc');
|
||||||
|
|
||||||
$ret = array('success' => false);
|
$ret = array('success' => false);
|
||||||
|
|
||||||
@ -27,7 +29,7 @@ class Chatsvc extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function post() {
|
function post() {
|
||||||
|
|
||||||
$ret = array('success' => false);
|
$ret = array('success' => false);
|
||||||
|
|
||||||
@ -65,7 +67,7 @@ class Chatsvc extends \Zotlabs\Web\Controller {
|
|||||||
json_return_and_die($ret);
|
json_return_and_die($ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|
||||||
$status = strip_tags($_REQUEST['status']);
|
$status = strip_tags($_REQUEST['status']);
|
||||||
$room_id = intval(\App::$data['chat']['room_id']);
|
$room_id = intval(\App::$data['chat']['room_id']);
|
||||||
|
@ -100,9 +100,12 @@ class Cloud extends \Zotlabs\Web\Controller {
|
|||||||
// require_once('\Zotlabs\Storage/QuotaPlugin.php');
|
// require_once('\Zotlabs\Storage/QuotaPlugin.php');
|
||||||
// $server->addPlugin(new \Zotlabs\Storage\\QuotaPlugin($auth));
|
// $server->addPlugin(new \Zotlabs\Storage\\QuotaPlugin($auth));
|
||||||
|
|
||||||
|
ob_start();
|
||||||
// All we need to do now, is to fire up the server
|
// All we need to do now, is to fire up the server
|
||||||
$server->exec();
|
$server->exec();
|
||||||
|
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
killme();
|
killme();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
namespace Zotlabs\Module; /** @file */
|
namespace Zotlabs\Module; /** @file */
|
||||||
|
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
|
|
||||||
@ -47,7 +47,8 @@ class Connect extends \Zotlabs\Web\Controller {
|
|||||||
intval(PAGE_PREMIUM),
|
intval(PAGE_PREMIUM),
|
||||||
intval(local_channel())
|
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);
|
set_pconfig(\App::$data['channel']['channel_id'],'system','selltext',$text);
|
||||||
// reload the page completely to get fresh data
|
// reload the page completely to get fresh data
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/socgraph.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/group.php');
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
require_once('include/zot.php');
|
require_once('include/zot.php');
|
||||||
|
@ -7,9 +7,9 @@ namespace Zotlabs\Module;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/socgraph.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/group.php');
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
require_once('include/zot.php');
|
require_once('include/zot.php');
|
||||||
@ -176,7 +176,7 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
$record = $z[0]['xlink_id'];
|
$record = $z[0]['xlink_id'];
|
||||||
}
|
}
|
||||||
if($record) {
|
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
|
if(\App::$poi && \App::$poi['abook_my_perms'] != $abook_my_perms
|
||||||
&& (! intval(\App::$poi['abook_self']))) {
|
&& (! intval(\App::$poi['abook_self']))) {
|
||||||
proc_run('php', 'include/notifier.php', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id);
|
\Zotlabs\Daemon\Master::Summon(array('Notifier', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
if($new_friend) {
|
if($new_friend) {
|
||||||
@ -270,7 +270,7 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
array('rel' => 'photo', 'type' => \App::$poi['xchan_photo_mimetype'], 'href' => \App::$poi['xchan_photo_l'])
|
array('rel' => 'photo', 'type' => \App::$poi['xchan_photo_mimetype'], 'href' => \App::$poi['xchan_photo_l'])
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
$xarr['object'] = json_encode($obj);
|
$xarr['obj'] = json_encode($obj);
|
||||||
$xarr['obj_type'] = ACTIVITY_OBJ_PERSON;
|
$xarr['obj_type'] = ACTIVITY_OBJ_PERSON;
|
||||||
|
|
||||||
$xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . \App::$poi['xchan_url'] . ']' . \App::$poi['xchan_name'] . '[/zrl]';
|
$xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . \App::$poi['xchan_url'] . ']' . \App::$poi['xchan_name'] . '[/zrl]';
|
||||||
@ -283,7 +283,7 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
|
|
||||||
// pull in a bit of content if there is any to pull in
|
// 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') {
|
if($cmd === 'update') {
|
||||||
// pull feed and consume it, which should subscribe to the hub.
|
// 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);
|
goaway(z_root() . '/connedit/' . $contact_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -427,7 +427,7 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
else {
|
else {
|
||||||
|
|
||||||
// if you are on a different network we'll force a refresh of the connection basic info
|
// 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);
|
goaway(z_root() . '/connedit/' . $contact_id);
|
||||||
}
|
}
|
||||||
@ -485,7 +485,6 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($cmd === 'drop') {
|
if($cmd === 'drop') {
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
|
|
||||||
// FIXME
|
// FIXME
|
||||||
// We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
|
// We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
|
||||||
@ -583,8 +582,6 @@ class Connedit extends \Zotlabs\Web\Controller {
|
|||||||
if(intval($contact['abook_self']))
|
if(intval($contact['abook_self']))
|
||||||
$self = true;
|
$self = true;
|
||||||
|
|
||||||
require_once('include/contact_selectors.php');
|
|
||||||
|
|
||||||
$tpl = get_markup_template("abook_edit.tpl");
|
$tpl = get_markup_template("abook_edit.tpl");
|
||||||
|
|
||||||
if(feature_enabled(local_channel(),'affinity')) {
|
if(feature_enabled(local_channel(),'affinity')) {
|
||||||
|
@ -41,10 +41,10 @@ class Contactgroup extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($change) {
|
if($change) {
|
||||||
if(in_array($change,$preselected)) {
|
if(in_array($change,$preselected)) {
|
||||||
group_rmv_member(local_channel(),$group['name'],$change);
|
group_rmv_member(local_channel(),$group['gname'],$change);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
group_add_member(local_channel(),$group['name'],$change);
|
group_add_member(local_channel(),$group['gname'],$change);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ namespace Zotlabs\Module;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
require_once('include/photo/photo_driver.php');
|
require_once('include/photo/photo_driver.php');
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
$profile = $r[0];
|
$profile = $r[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = 0 LIMIT 1",
|
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND imgscale = 0 LIMIT 1",
|
||||||
dbesc($image_id),
|
dbesc($image_id),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -88,9 +88,9 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
if($r) {
|
if($r) {
|
||||||
|
|
||||||
$base_image = $r[0];
|
$base_image = $r[0];
|
||||||
$base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data']));
|
$base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['content']) : dbunescbin($base_image['content']));
|
||||||
|
|
||||||
$im = photo_factory($base_image['data'], $base_image['type']);
|
$im = photo_factory($base_image['content'], $base_image['mimetype']);
|
||||||
if($im->is_valid()) {
|
if($im->is_valid()) {
|
||||||
|
|
||||||
// We are scaling and cropping the relative pixel locations to the original photo instead of the
|
// We are scaling and cropping the relative pixel locations to the original photo instead of the
|
||||||
@ -99,7 +99,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
// First load the scaled photo to check its size. (Should probably pass this in the post form and save
|
// First load the scaled photo to check its size. (Should probably pass this in the post form and save
|
||||||
// a query.)
|
// a query.)
|
||||||
|
|
||||||
$g = q("select width, height from photo where resource_id = '%s' and uid = %d and scale = 3",
|
$g = q("select width, height from photo where resource_id = '%s' and uid = %d and imgscale = 3",
|
||||||
dbesc($image_id),
|
dbesc($image_id),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -133,26 +133,26 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
$p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
|
$p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
|
||||||
'filename' => $base_image['filename'], 'album' => t('Cover Photos'));
|
'filename' => $base_image['filename'], 'album' => t('Cover Photos'));
|
||||||
|
|
||||||
$p['scale'] = 7;
|
$p['imgscale'] = 7;
|
||||||
$p['photo_usage'] = PHOTO_COVER;
|
$p['photo_usage'] = PHOTO_COVER;
|
||||||
|
|
||||||
$r1 = $im->save($p);
|
$r1 = $im->save($p);
|
||||||
|
|
||||||
$im->doScaleImage(850,310);
|
$im->doScaleImage(850,310);
|
||||||
$p['scale'] = 8;
|
$p['imgscale'] = 8;
|
||||||
|
|
||||||
$r2 = $im->save($p);
|
$r2 = $im->save($p);
|
||||||
|
|
||||||
|
|
||||||
$im->doScaleImage(425,160);
|
$im->doScaleImage(425,160);
|
||||||
$p['scale'] = 9;
|
$p['imgscale'] = 9;
|
||||||
|
|
||||||
$r3 = $im->save($p);
|
$r3 = $im->save($p);
|
||||||
|
|
||||||
if($r1 === false || $r2 === false || $r3 === false) {
|
if($r1 === false || $r2 === false || $r3 === false) {
|
||||||
// if one failed, delete them all so we can start over.
|
// if one failed, delete them all so we can start over.
|
||||||
notice( t('Image resize failed.') . EOL );
|
notice( t('Image resize failed.') . EOL );
|
||||||
$x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 7 ",
|
$x = q("delete from photo where resource_id = '%s' and uid = %d and imgscale >= 7 ",
|
||||||
dbesc($base_image['resource_id']),
|
dbesc($base_image['resource_id']),
|
||||||
local_channel()
|
local_channel()
|
||||||
);
|
);
|
||||||
@ -183,7 +183,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
logger('attach_store: ' . print_r($res,true));
|
logger('attach_store: ' . print_r($res,true));
|
||||||
|
|
||||||
if($res && intval($res['data']['is_photo'])) {
|
if($res && intval($res['data']['is_photo'])) {
|
||||||
$i = q("select * from photo where resource_id = '%s' and uid = %d and scale = 0",
|
$i = q("select * from photo where resource_id = '%s' and uid = %d and imgscale = 0",
|
||||||
dbesc($hash),
|
dbesc($hash),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -195,10 +195,10 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
$os_storage = false;
|
$os_storage = false;
|
||||||
|
|
||||||
foreach($i as $ii) {
|
foreach($i as $ii) {
|
||||||
$smallest = intval($ii['scale']);
|
$smallest = intval($ii['imgscale']);
|
||||||
$os_storage = intval($ii['os_storage']);
|
$os_storage = intval($ii['os_storage']);
|
||||||
$imagedata = $ii['data'];
|
$imagedata = $ii['content'];
|
||||||
$filetype = $ii['type'];
|
$filetype = $ii['mimetype'];
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -224,10 +224,10 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
$arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
|
$arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
|
||||||
$arr['verb'] = ACTIVITY_UPDATE;
|
$arr['verb'] = ACTIVITY_UPDATE;
|
||||||
|
|
||||||
$arr['object'] = json_encode(array(
|
$arr['obj'] = json_encode(array(
|
||||||
'type' => $arr['obj_type'],
|
'type' => $arr['obj_type'],
|
||||||
'id' => z_root() . '/photo/' . $photo['resource_id'] . '-7',
|
'id' => z_root() . '/photo/' . $photo['resource_id'] . '-7',
|
||||||
'link' => array('rel' => 'photo', 'type' => $photo['type'], 'href' => z_root() . '/photo/' . $photo['resource_id'] . '-7')
|
'link' => array('rel' => 'photo', 'type' => $photo['mimetype'], 'href' => z_root() . '/photo/' . $photo['resource_id'] . '-7')
|
||||||
));
|
));
|
||||||
|
|
||||||
if($profile && stripos($profile['gender'],t('female')) !== false)
|
if($profile && stripos($profile['gender'],t('female')) !== false)
|
||||||
@ -295,7 +295,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$resource_id = argv(2);
|
$resource_id = argv(2);
|
||||||
|
|
||||||
$r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
|
$r = q("SELECT id, album, imgscale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY imgscale ASC",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc($resource_id)
|
dbesc($resource_id)
|
||||||
);
|
);
|
||||||
@ -305,11 +305,11 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
$havescale = false;
|
$havescale = false;
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
if($rr['scale'] == 7)
|
if($rr['imgscale'] == 7)
|
||||||
$havescale = true;
|
$havescale = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
|
$r = q("SELECT `content`, `mimetype`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
|
||||||
intval($r[0]['id']),
|
intval($r[0]['id']),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
|
|
||||||
@ -320,15 +320,15 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(intval($r[0]['os_storage']))
|
if(intval($r[0]['os_storage']))
|
||||||
$data = @file_get_contents($r[0]['data']);
|
$data = @file_get_contents($r[0]['content']);
|
||||||
else
|
else
|
||||||
$data = dbunescbin($r[0]['data']);
|
$data = dbunescbin($r[0]['content']);
|
||||||
|
|
||||||
$ph = photo_factory($data, $r[0]['type']);
|
$ph = photo_factory($data, $r[0]['mimetype']);
|
||||||
$smallest = 0;
|
$smallest = 0;
|
||||||
if($ph->is_valid()) {
|
if($ph->is_valid()) {
|
||||||
// go ahead as if we have just uploaded a new photo to crop
|
// go ahead as if we have just uploaded a new photo to crop
|
||||||
$i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d and scale = 0",
|
$i = q("select resource_id, imgscale from photo where resource_id = '%s' and uid = %d and imgscale = 0",
|
||||||
dbesc($r[0]['resource_id']),
|
dbesc($r[0]['resource_id']),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -336,7 +336,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
|
|||||||
if($i) {
|
if($i) {
|
||||||
$hash = $i[0]['resource_id'];
|
$hash = $i[0]['resource_id'];
|
||||||
foreach($i as $ii) {
|
foreach($i as $ii) {
|
||||||
$smallest = intval($ii['scale']);
|
$smallest = intval($ii['imgscale']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ class Dav extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
|
|
||||||
$auth = new \Zotlabs\Storage\BasicAuth();
|
$auth = new \Zotlabs\Storage\BasicAuth();
|
||||||
|
$auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . 'WebDAV');
|
||||||
|
|
||||||
// $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function($userName,$password) {
|
// $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function($userName,$password) {
|
||||||
// if(account_verify_password($userName,$password))
|
// if(account_verify_password($userName,$password))
|
||||||
|
@ -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);
|
notice( t('Public access denied.') . EOL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -7,17 +7,13 @@ class Display extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
function get($update = 0, $load = false) {
|
function get($update = 0, $load = false) {
|
||||||
|
|
||||||
// logger("mod-display: update = $update load = $load");
|
|
||||||
|
|
||||||
|
|
||||||
$checkjs = new \Zotlabs\Web\CheckJS(1);
|
$checkjs = new \Zotlabs\Web\CheckJS(1);
|
||||||
|
|
||||||
|
|
||||||
if($load)
|
if($load)
|
||||||
$_SESSION['loadtime'] = datetime_convert();
|
$_SESSION['loadtime'] = datetime_convert();
|
||||||
|
|
||||||
|
|
||||||
if(intval(get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
|
if(observer_prohibited()) {
|
||||||
notice( t('Public access denied.') . EOL);
|
notice( t('Public access denied.') . EOL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -185,7 +181,7 @@ class Display extends \Zotlabs\Web\Controller {
|
|||||||
if($load || ($checkjs->disabled())) {
|
if($load || ($checkjs->disabled())) {
|
||||||
$r = null;
|
$r = null;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
$sys = get_sys_channel();
|
$sys = get_sys_channel();
|
||||||
$sysid = $sys['channel_id'];
|
$sysid = $sys['channel_id'];
|
||||||
|
|
||||||
@ -233,7 +229,7 @@ class Display extends \Zotlabs\Web\Controller {
|
|||||||
elseif($update && !$load) {
|
elseif($update && !$load) {
|
||||||
$r = null;
|
$r = null;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
$sys = get_sys_channel();
|
$sys = get_sys_channel();
|
||||||
$sysid = $sys['channel_id'];
|
$sysid = $sys['channel_id'];
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
require_once('include/conversation.php');
|
require_once('include/conversation.php');
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
require_once('include/conversation.php');
|
require_once('include/conversation.php');
|
||||||
|
|
||||||
|
@ -87,11 +87,11 @@ class Editpost extends \Zotlabs\Web\Controller {
|
|||||||
'hide_location' => true,
|
'hide_location' => true,
|
||||||
'mimetype' => $itm[0]['mimetype'],
|
'mimetype' => $itm[0]['mimetype'],
|
||||||
'ptyp' => $itm[0]['obj_type'],
|
'ptyp' => $itm[0]['obj_type'],
|
||||||
'body' => undo_post_tagging($itm[0]['body']),
|
'body' => htmlspecialchars_decode(undo_post_tagging($itm[0]['body']),ENT_COMPAT),
|
||||||
'post_id' => $post_id,
|
'post_id' => $post_id,
|
||||||
'defloc' => $channel['channel_location'],
|
'defloc' => $channel['channel_location'],
|
||||||
'visitor' => true,
|
'visitor' => true,
|
||||||
'title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
|
'title' => htmlspecialchars_decode($itm[0]['title'],ENT_COMPAT),
|
||||||
'category' => $category,
|
'category' => $category,
|
||||||
'showacl' => false,
|
'showacl' => false,
|
||||||
'profile_uid' => $owner_uid,
|
'profile_uid' => $owner_uid,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
require_once('include/conversation.php');
|
require_once('include/conversation.php');
|
||||||
require_once('include/PermissionDescription.php');
|
require_once('include/PermissionDescription.php');
|
||||||
|
@ -171,7 +171,7 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
foreach($cats as $cat) {
|
foreach($cats as $cat) {
|
||||||
$post_tags[] = array(
|
$post_tags[] = array(
|
||||||
'uid' => $profile_uid,
|
'uid' => $profile_uid,
|
||||||
'type' => TERM_CATEGORY,
|
'ttype' => TERM_CATEGORY,
|
||||||
'otype' => TERM_OBJ_POST,
|
'otype' => TERM_OBJ_POST,
|
||||||
'term' => trim($cat),
|
'term' => trim($cat),
|
||||||
'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
|
'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
|
||||||
@ -180,12 +180,12 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$datarray = array();
|
$datarray = array();
|
||||||
$datarray['start'] = $start;
|
$datarray['dtstart'] = $start;
|
||||||
$datarray['finish'] = $finish;
|
$datarray['dtend'] = $finish;
|
||||||
$datarray['summary'] = $summary;
|
$datarray['summary'] = $summary;
|
||||||
$datarray['description'] = $desc;
|
$datarray['description'] = $desc;
|
||||||
$datarray['location'] = $location;
|
$datarray['location'] = $location;
|
||||||
$datarray['type'] = $type;
|
$datarray['etype'] = $type;
|
||||||
$datarray['adjust'] = $adjust;
|
$datarray['adjust'] = $adjust;
|
||||||
$datarray['nofinish'] = $nofinish;
|
$datarray['nofinish'] = $nofinish;
|
||||||
$datarray['uid'] = local_channel();
|
$datarray['uid'] = local_channel();
|
||||||
@ -232,7 +232,7 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($share)
|
if($share)
|
||||||
proc_run('php',"include/notifier.php","event","$item_id");
|
\Zotlabs\Daemon\Master::Summon(array('Notifier','event',$item_id));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,14 +269,14 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
nav_set_selected('all_events');
|
nav_set_selected('all_events');
|
||||||
|
|
||||||
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
|
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
|
||||||
$r = q("update event set ignore = 1 where id = %d and uid = %d",
|
$r = q("update event set dismissed = 1 where id = %d and uid = %d",
|
||||||
intval(argv(2)),
|
intval(argv(2)),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
|
if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
|
||||||
$r = q("update event set ignore = 0 where id = %d and uid = %d",
|
$r = q("update event set dismissed = 0 where id = %d and uid = %d",
|
||||||
intval(argv(2)),
|
intval(argv(2)),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -301,7 +301,7 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
$mode = 'view';
|
$mode = 'view';
|
||||||
$y = 0;
|
$y = 0;
|
||||||
$m = 0;
|
$m = 0;
|
||||||
$ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
|
$ignored = ((x($_REQUEST,'ignored')) ? " and dismissed = " . intval($_REQUEST['ignored']) . " " : '');
|
||||||
|
|
||||||
|
|
||||||
// logger('args: ' . print_r(\App::$argv,true));
|
// logger('args: ' . print_r(\App::$argv,true));
|
||||||
@ -358,9 +358,9 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
if(x($_REQUEST,'summary')) $orig_event['summary'] = $_REQUEST['summary'];
|
if(x($_REQUEST,'summary')) $orig_event['summary'] = $_REQUEST['summary'];
|
||||||
if(x($_REQUEST,'description')) $orig_event['description'] = $_REQUEST['description'];
|
if(x($_REQUEST,'description')) $orig_event['description'] = $_REQUEST['description'];
|
||||||
if(x($_REQUEST,'location')) $orig_event['location'] = $_REQUEST['location'];
|
if(x($_REQUEST,'location')) $orig_event['location'] = $_REQUEST['location'];
|
||||||
if(x($_REQUEST,'start')) $orig_event['start'] = $_REQUEST['start'];
|
if(x($_REQUEST,'start')) $orig_event['dtstart'] = $_REQUEST['start'];
|
||||||
if(x($_REQUEST,'finish')) $orig_event['finish'] = $_REQUEST['finish'];
|
if(x($_REQUEST,'finish')) $orig_event['dtend'] = $_REQUEST['finish'];
|
||||||
if(x($_REQUEST,'type')) $orig_event['type'] = $_REQUEST['type'];
|
if(x($_REQUEST,'type')) $orig_event['etype'] = $_REQUEST['type'];
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
|
$n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
|
||||||
@ -380,9 +380,9 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
if($orig_event['event_xchan'])
|
if($orig_event['event_xchan'])
|
||||||
$sh_checked .= ' disabled="disabled" ';
|
$sh_checked .= ' disabled="disabled" ';
|
||||||
|
|
||||||
$sdt = ((x($orig_event)) ? $orig_event['start'] : 'now');
|
$sdt = ((x($orig_event)) ? $orig_event['dtstart'] : 'now');
|
||||||
|
|
||||||
$fdt = ((x($orig_event)) ? $orig_event['finish'] : '+1 hour');
|
$fdt = ((x($orig_event)) ? $orig_event['dtend'] : '+1 hour');
|
||||||
|
|
||||||
$tz = date_default_timezone_get();
|
$tz = date_default_timezone_get();
|
||||||
if(x($orig_event))
|
if(x($orig_event))
|
||||||
@ -406,7 +406,7 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
$ftext = datetime_convert('UTC',$tz,$fdt);
|
$ftext = datetime_convert('UTC',$tz,$fdt);
|
||||||
$ftext = substr($ftext,0,14) . "00:00";
|
$ftext = substr($ftext,0,14) . "00:00";
|
||||||
|
|
||||||
$type = ((x($orig_event)) ? $orig_event['type'] : 'event');
|
$type = ((x($orig_event)) ? $orig_event['etype'] : 'event');
|
||||||
|
|
||||||
$f = get_config('system','event_input_format');
|
$f = get_config('system','event_input_format');
|
||||||
if(! $f)
|
if(! $f)
|
||||||
@ -536,8 +536,8 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
);
|
);
|
||||||
} elseif($export) {
|
} elseif($export) {
|
||||||
$r = q("SELECT * from event where uid = %d
|
$r = q("SELECT * from event where uid = %d
|
||||||
AND (( `adjust` = 0 AND ( `finish` >= '%s' or nofinish = 1 ) AND `start` <= '%s' )
|
AND (( `adjust` = 0 AND ( `dtend` >= '%s' or nofinish = 1 ) AND `dtstart` <= '%s' )
|
||||||
OR ( `adjust` = 1 AND ( `finish` >= '%s' or nofinish = 1 ) AND `start` <= '%s' )) ",
|
OR ( `adjust` = 1 AND ( `dtend` >= '%s' or nofinish = 1 ) AND `dtstart` <= '%s' )) ",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc($start),
|
dbesc($start),
|
||||||
dbesc($finish),
|
dbesc($finish),
|
||||||
@ -554,8 +554,8 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
|
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
|
||||||
from event left join item on event_hash = resource_id
|
from event left join item on event_hash = resource_id
|
||||||
where resource_type = 'event' and event.uid = %d $ignored
|
where resource_type = 'event' and event.uid = %d $ignored
|
||||||
AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
|
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
|
||||||
OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) ",
|
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc($start),
|
dbesc($start),
|
||||||
dbesc($finish),
|
dbesc($finish),
|
||||||
@ -576,7 +576,7 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($r) {
|
if($r) {
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
|
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
|
||||||
if(! x($links,$j))
|
if(! x($links,$j))
|
||||||
$links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
|
$links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
|
||||||
}
|
}
|
||||||
@ -591,15 +591,15 @@ class Events extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
|
||||||
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
|
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
|
||||||
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
|
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], $fmt) : datetime_convert('UTC','UTC',$rr['dtstart'],$fmt));
|
||||||
$d = day_translate($d);
|
$d = day_translate($d);
|
||||||
|
|
||||||
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
|
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
|
||||||
if ($rr['nofinish']){
|
if ($rr['nofinish']){
|
||||||
$end = null;
|
$end = null;
|
||||||
} else {
|
} else {
|
||||||
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
|
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,10 +45,10 @@ class Fbrowser extends \Zotlabs\Web\Controller {
|
|||||||
$album = hex2bin(\App::$argv[2]);
|
$album = hex2bin(\App::$argv[2]);
|
||||||
$sql_extra = sprintf("AND `album` = '%s' ",dbesc($album));
|
$sql_extra = sprintf("AND `album` = '%s' ",dbesc($album));
|
||||||
$sql_extra2 = "";
|
$sql_extra2 = "";
|
||||||
$path[]=array(z_root()."/fbrowser/image/".\App::$argv[2]."/", $album);
|
$path[]=array(z_root() . "/fbrowser/image/" . \App::$argv[2] . "/", $album);
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `description`
|
$r = q("SELECT `resource_id`, `id`, `filename`, type, min(`imgscale`) AS `hiq`,max(`imgscale`) AS `loq`, `description`
|
||||||
FROM `photo` WHERE `uid` = %d $sql_extra
|
FROM `photo` WHERE `uid` = %d $sql_extra
|
||||||
GROUP BY `resource_id` $sql_extra2",
|
GROUP BY `resource_id` $sql_extra2",
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
|
@ -31,7 +31,7 @@ class Feed extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$channel = $r[0];
|
$channel = $r[0];
|
||||||
|
|
||||||
if((intval(get_config('system','block_public'))) && (! get_account_id()))
|
if(observer_prohibited(true))
|
||||||
killme();
|
killme();
|
||||||
|
|
||||||
logger('mod_feed: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
|
logger('mod_feed: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
|
||||||
|
@ -39,7 +39,7 @@ class Filer extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$filetags = array();
|
$filetags = array();
|
||||||
$r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
|
$r = q("select distinct(term) from term where uid = %d and ttype = %d order by term asc",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
intval(TERM_FILE)
|
intval(TERM_FILE)
|
||||||
);
|
);
|
||||||
|
@ -22,7 +22,7 @@ class Filerm extends \Zotlabs\Web\Controller {
|
|||||||
logger('filerm: tag ' . $term . ' item ' . $item_id);
|
logger('filerm: tag ' . $term . ' item ' . $item_id);
|
||||||
|
|
||||||
if($item_id && strlen($term)) {
|
if($item_id && strlen($term)) {
|
||||||
$r = q("delete from term where uid = %d and type = %d and oid = %d and term = '%s'",
|
$r = q("delete from term where uid = %d and ttype = %d and oid = %d and term = '%s'",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
intval(($category) ? TERM_CATEGORY : TERM_FILE),
|
intval(($category) ? TERM_CATEGORY : TERM_FILE),
|
||||||
intval($item_id),
|
intval($item_id),
|
||||||
|
@ -53,14 +53,13 @@ class Follow extends \Zotlabs\Web\Controller {
|
|||||||
// If we can view their stream, pull in some posts
|
// If we can view their stream, pull in some posts
|
||||||
|
|
||||||
if(($result['abook']['abook_their_perms'] & PERMS_R_STREAM) || ($result['abook']['xchan_network'] === 'rss'))
|
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');
|
goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?f=&follow=1');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|
||||||
if(! local_channel()) {
|
if(! local_channel()) {
|
||||||
return login();
|
return login();
|
||||||
}
|
}
|
||||||
|
@ -1,117 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Zotlabs\Module;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Fsuggest extends \Zotlabs\Web\Controller {
|
|
||||||
|
|
||||||
function post() {
|
|
||||||
|
|
||||||
if(! local_channel()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(\App::$argc != 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
$contact_id = intval(\App::$argv[1]);
|
|
||||||
|
|
||||||
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
|
||||||
intval($contact_id),
|
|
||||||
intval(local_channel())
|
|
||||||
);
|
|
||||||
if(! count($r)) {
|
|
||||||
notice( t('Contact not found.') . EOL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$contact = $r[0];
|
|
||||||
|
|
||||||
$new_contact = intval($_POST['suggest']);
|
|
||||||
|
|
||||||
$hash = random_string();
|
|
||||||
|
|
||||||
$note = escape_tags(trim($_POST['note']));
|
|
||||||
|
|
||||||
if($new_contact) {
|
|
||||||
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
|
||||||
intval($new_contact),
|
|
||||||
intval(local_channel())
|
|
||||||
);
|
|
||||||
if(count($r)) {
|
|
||||||
|
|
||||||
$x = q("INSERT INTO `fsuggest` ( `uid`,`cid`,`name`,`url`,`request`,`photo`,`note`,`created`)
|
|
||||||
VALUES ( %d, %d, '%s','%s','%s','%s','%s','%s')",
|
|
||||||
intval(local_channel()),
|
|
||||||
intval($contact_id),
|
|
||||||
dbesc($r[0]['name']),
|
|
||||||
dbesc($r[0]['url']),
|
|
||||||
dbesc($r[0]['request']),
|
|
||||||
dbesc($r[0]['photo']),
|
|
||||||
dbesc($hash),
|
|
||||||
dbesc(datetime_convert())
|
|
||||||
);
|
|
||||||
$r = q("SELECT `id` FROM `fsuggest` WHERE `note` = '%s' AND `uid` = %d LIMIT 1",
|
|
||||||
dbesc($hash),
|
|
||||||
intval(local_channel())
|
|
||||||
);
|
|
||||||
if(count($r)) {
|
|
||||||
$fsuggest_id = $r[0]['id'];
|
|
||||||
q("UPDATE `fsuggest` SET `note` = '%s' WHERE `id` = %d AND `uid` = %d",
|
|
||||||
dbesc($note),
|
|
||||||
intval($fsuggest_id),
|
|
||||||
intval(local_channel())
|
|
||||||
);
|
|
||||||
proc_run('php', 'include/notifier.php', 'suggest' , $fsuggest_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
info( t('Friend suggestion sent.') . EOL);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function get() {
|
|
||||||
|
|
||||||
require_once('include/acl_selectors.php');
|
|
||||||
|
|
||||||
if(! local_channel()) {
|
|
||||||
notice( t('Permission denied.') . EOL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(\App::$argc != 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
$contact_id = intval(\App::$argv[1]);
|
|
||||||
|
|
||||||
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
|
||||||
intval($contact_id),
|
|
||||||
intval(local_channel())
|
|
||||||
);
|
|
||||||
if(! count($r)) {
|
|
||||||
notice( t('Contact not found.') . EOL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$contact = $r[0];
|
|
||||||
|
|
||||||
$o = '<h3>' . t('Suggest Friends') . '</h3>';
|
|
||||||
|
|
||||||
$o .= '<div id="fsuggest-desc" >' . sprintf( t('Suggest a friend for %s'), $contact['name']) . '</div>';
|
|
||||||
|
|
||||||
$o .= '<form id="fsuggest-form" action="fsuggest/' . $contact_id . '" method="post" >';
|
|
||||||
|
|
||||||
// FIXME contact_selector deprecated, removed
|
|
||||||
// $o .= contact_selector('suggest','suggest-select', false,
|
|
||||||
// array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
|
|
||||||
|
|
||||||
|
|
||||||
$o .= '<div id="fsuggest-submit-wrapper"><input id="fsuggest-submit" type="submit" name="submit" value="' . t('Submit') . '" /></div>';
|
|
||||||
$o .= '</form>';
|
|
||||||
|
|
||||||
return $o;
|
|
||||||
}
|
|
||||||
}
|
|
@ -21,7 +21,6 @@ namespace Zotlabs\Module;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/attach.php');
|
require_once('include/attach.php');
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,8 +47,8 @@ class Group extends \Zotlabs\Web\Controller {
|
|||||||
$groupname = notags(trim($_POST['groupname']));
|
$groupname = notags(trim($_POST['groupname']));
|
||||||
$public = intval($_POST['public']);
|
$public = intval($_POST['public']);
|
||||||
|
|
||||||
if((strlen($groupname)) && (($groupname != $group['name']) || ($public != $group['visible']))) {
|
if((strlen($groupname)) && (($groupname != $group['gname']) || ($public != $group['visible']))) {
|
||||||
$r = q("UPDATE `groups` SET `name` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d",
|
$r = q("UPDATE `groups` SET `gname` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d",
|
||||||
dbesc($groupname),
|
dbesc($groupname),
|
||||||
intval($public),
|
intval($public),
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
@ -106,7 +106,7 @@ class Group extends \Zotlabs\Web\Controller {
|
|||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
if($r)
|
if($r)
|
||||||
$result = group_rmv(local_channel(),$r[0]['name']);
|
$result = group_rmv(local_channel(),$r[0]['gname']);
|
||||||
if($result)
|
if($result)
|
||||||
info( t('Privacy group removed.') . EOL);
|
info( t('Privacy group removed.') . EOL);
|
||||||
else
|
else
|
||||||
@ -156,10 +156,10 @@ class Group extends \Zotlabs\Web\Controller {
|
|||||||
if($change) {
|
if($change) {
|
||||||
|
|
||||||
if(in_array($change,$preselected)) {
|
if(in_array($change,$preselected)) {
|
||||||
group_rmv_member(local_channel(),$group['name'],$change);
|
group_rmv_member(local_channel(),$group['gname'],$change);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
group_add_member(local_channel(),$group['name'],$change);
|
group_add_member(local_channel(),$group['gname'],$change);
|
||||||
}
|
}
|
||||||
|
|
||||||
$members = group_get_members($group['id']);
|
$members = group_get_members($group['id']);
|
||||||
@ -181,7 +181,7 @@ class Group extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$context = $context + array(
|
$context = $context + array(
|
||||||
'$title' => t('Privacy group editor'),
|
'$title' => t('Privacy group editor'),
|
||||||
'$gname' => array('groupname',t('Privacy group name: '),$group['name'], ''),
|
'$gname' => array('groupname',t('Privacy group name: '),$group['gname'], ''),
|
||||||
'$gid' => $group['id'],
|
'$gid' => $group['id'],
|
||||||
'$drop' => $drop_txt,
|
'$drop' => $drop_txt,
|
||||||
'$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
|
'$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
|
||||||
@ -209,7 +209,7 @@ class Group extends \Zotlabs\Web\Controller {
|
|||||||
$groupeditor['members'][] = micropro($member,true,'mpgroup', $textmode);
|
$groupeditor['members'][] = micropro($member,true,'mpgroup', $textmode);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
group_rmv_member(local_channel(),$group['name'],$member['xchan_hash']);
|
group_rmv_member(local_channel(),$group['gname'],$member['xchan_hash']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
|
$r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
|
||||||
|
@ -37,7 +37,7 @@ class Help extends \Zotlabs\Web\Controller {
|
|||||||
$path = trim(substr($dirname,4),'/');
|
$path = trim(substr($dirname,4),'/');
|
||||||
|
|
||||||
$o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br />' .
|
$o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br />' .
|
||||||
str_replace('$Projectname',\Zotlabs\Project\System::get_platform_name(),substr($rr['text'],0,200)) . '...<br /><br /></li>';
|
str_replace('$Projectname',\Zotlabs\Lib\System::get_platform_name(),substr($rr['text'],0,200)) . '...<br /><br /></li>';
|
||||||
|
|
||||||
}
|
}
|
||||||
$o .= '</ul>';
|
$o .= '</ul>';
|
||||||
|
@ -4,9 +4,9 @@ namespace Zotlabs\Module;
|
|||||||
// Import a channel, either by direct file upload or via
|
// Import a channel, either by direct file upload or via
|
||||||
// connection to original server.
|
// connection to original server.
|
||||||
|
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/zot.php');
|
require_once('include/zot.php');
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/import.php');
|
require_once('include/import.php');
|
||||||
|
|
||||||
|
|
||||||
@ -408,8 +408,12 @@ class Import extends \Zotlabs\Web\Controller {
|
|||||||
$saved = array();
|
$saved = array();
|
||||||
foreach($groups as $group) {
|
foreach($groups as $group) {
|
||||||
$saved[$group['hash']] = array('old' => $group['id']);
|
$saved[$group['hash']] = array('old' => $group['id']);
|
||||||
|
if(array_key_exists('name',$group)) {
|
||||||
|
$group['gname'] = $group['name'];
|
||||||
|
unset($group['name']);
|
||||||
|
}
|
||||||
unset($group['id']);
|
unset($group['id']);
|
||||||
$group['uid'] = $channel['channel_id'];
|
$group['uid'] = $channel['channel_id'];
|
||||||
dbesc_array($group);
|
dbesc_array($group);
|
||||||
$r = dbq("INSERT INTO groups (`"
|
$r = dbq("INSERT INTO groups (`"
|
||||||
. implode("`, `", array_keys($group))
|
. implode("`, `", array_keys($group))
|
||||||
@ -496,11 +500,11 @@ class Import extends \Zotlabs\Web\Controller {
|
|||||||
// send out refresh requests
|
// send out refresh requests
|
||||||
// notify old server that it may no longer be primary.
|
// 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
|
// 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);
|
notice( t('Import completed.') . EOL);
|
||||||
|
@ -17,10 +17,10 @@ namespace Zotlabs\Module;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
require_once('include/crypto.php');
|
require_once('include/crypto.php');
|
||||||
require_once('include/enotify.php');
|
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/attach.php');
|
require_once('include/attach.php');
|
||||||
|
|
||||||
|
use \Zotlabs\Lib as Zlib;
|
||||||
|
|
||||||
class Item extends \Zotlabs\Web\Controller {
|
class Item extends \Zotlabs\Web\Controller {
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
$remote_xchan = $remote_observer = false;
|
$remote_xchan = $remote_observer = false;
|
||||||
|
|
||||||
$profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
|
$profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
$sys = get_sys_channel();
|
$sys = get_sys_channel();
|
||||||
if($sys && $profile_uid && ($sys['channel_id'] == $profile_uid) && is_site_admin()) {
|
if($sys && $profile_uid && ($sys['channel_id'] == $profile_uid) && is_site_admin()) {
|
||||||
$uid = intval($sys['channel_id']);
|
$uid = intval($sys['channel_id']);
|
||||||
@ -581,7 +581,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
if($success['replaced']) {
|
if($success['replaced']) {
|
||||||
$post_tags[] = array(
|
$post_tags[] = array(
|
||||||
'uid' => $profile_uid,
|
'uid' => $profile_uid,
|
||||||
'type' => $success['termtype'],
|
'ttype' => $success['termtype'],
|
||||||
'otype' => TERM_OBJ_POST,
|
'otype' => TERM_OBJ_POST,
|
||||||
'term' => $success['term'],
|
'term' => $success['term'],
|
||||||
'url' => $success['url']
|
'url' => $success['url']
|
||||||
@ -666,7 +666,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
foreach($cats as $cat) {
|
foreach($cats as $cat) {
|
||||||
$post_tags[] = array(
|
$post_tags[] = array(
|
||||||
'uid' => $profile_uid,
|
'uid' => $profile_uid,
|
||||||
'type' => TERM_CATEGORY,
|
'ttype' => TERM_CATEGORY,
|
||||||
'otype' => TERM_OBJ_POST,
|
'otype' => TERM_OBJ_POST,
|
||||||
'term' => trim($cat),
|
'term' => trim($cat),
|
||||||
'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
|
'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
|
||||||
@ -676,7 +676,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($orig_post) {
|
if($orig_post) {
|
||||||
// preserve original tags
|
// preserve original tags
|
||||||
$t = q("select * from term where oid = %d and otype = %d and uid = %d and type in ( %d, %d, %d )",
|
$t = q("select * from term where oid = %d and otype = %d and uid = %d and ttype in ( %d, %d, %d )",
|
||||||
intval($orig_post['id']),
|
intval($orig_post['id']),
|
||||||
intval(TERM_OBJ_POST),
|
intval(TERM_OBJ_POST),
|
||||||
intval($profile_uid),
|
intval($profile_uid),
|
||||||
@ -688,7 +688,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
foreach($t as $t1) {
|
foreach($t as $t1) {
|
||||||
$post_tags[] = array(
|
$post_tags[] = array(
|
||||||
'uid' => $profile_uid,
|
'uid' => $profile_uid,
|
||||||
'type' => $t1['type'],
|
'ttype' => $t1['type'],
|
||||||
'otype' => TERM_OBJ_POST,
|
'otype' => TERM_OBJ_POST,
|
||||||
'term' => $t1['term'],
|
'term' => $t1['term'],
|
||||||
'url' => $t1['url'],
|
'url' => $t1['url'],
|
||||||
@ -901,7 +901,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(! $nopush)
|
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)) {
|
if((x($_REQUEST,'return')) && strlen($return_path)) {
|
||||||
logger('return: ' . $return_path);
|
logger('return: ' . $return_path);
|
||||||
@ -925,7 +925,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
// otherwise it will happen during delivery
|
// otherwise it will happen during delivery
|
||||||
|
|
||||||
if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
|
if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
|
||||||
notification(array(
|
Zlib\Enotify::submit(array(
|
||||||
'type' => NOTIFY_COMMENT,
|
'type' => NOTIFY_COMMENT,
|
||||||
'from_xchan' => $datarray['author_xchan'],
|
'from_xchan' => $datarray['author_xchan'],
|
||||||
'to_xchan' => $datarray['owner_xchan'],
|
'to_xchan' => $datarray['owner_xchan'],
|
||||||
@ -943,7 +943,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
$parent = $post_id;
|
$parent = $post_id;
|
||||||
|
|
||||||
if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
|
if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
|
||||||
notification(array(
|
Zlib\Enotify::submit(array(
|
||||||
'type' => NOTIFY_WALL,
|
'type' => NOTIFY_WALL,
|
||||||
'from_xchan' => $datarray['author_xchan'],
|
'from_xchan' => $datarray['author_xchan'],
|
||||||
'to_xchan' => $datarray['owner_xchan'],
|
'to_xchan' => $datarray['owner_xchan'],
|
||||||
@ -1008,7 +1008,7 @@ class Item extends \Zotlabs\Web\Controller {
|
|||||||
call_hooks('post_local_end', $datarray);
|
call_hooks('post_local_end', $datarray);
|
||||||
|
|
||||||
if(! $nopush)
|
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');
|
logger('post_complete');
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/conversation.php');
|
require_once('include/conversation.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
|
|
||||||
|
@ -346,7 +346,7 @@ class Like extends \Zotlabs\Web\Controller {
|
|||||||
// drop_item was not done interactively, so we need to invoke the notifier
|
// drop_item was not done interactively, so we need to invoke the notifier
|
||||||
// in order to push the changes to connections
|
// 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']));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -483,7 +483,7 @@ class Like extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$arr['verb'] = $activity;
|
$arr['verb'] = $activity;
|
||||||
$arr['obj_type'] = $objtype;
|
$arr['obj_type'] = $objtype;
|
||||||
$arr['object'] = $object;
|
$arr['obj'] = $object;
|
||||||
|
|
||||||
if($target) {
|
if($target) {
|
||||||
$arr['tgt_type'] = $tgttype;
|
$arr['tgt_type'] = $tgttype;
|
||||||
@ -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) {
|
if($interactive) {
|
||||||
notice( t('Action completed.') . EOL);
|
notice( t('Action completed.') . EOL);
|
||||||
|
@ -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 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);
|
$template = str_replace('url','zrl',$template);
|
||||||
|
|
||||||
if($siteinfo["title"] == "") {
|
if($siteinfo["title"] == "") {
|
||||||
|
@ -88,10 +88,10 @@ class Lockview extends \Zotlabs\Web\Controller {
|
|||||||
stringify_array_elms($deny_users,true);
|
stringify_array_elms($deny_users,true);
|
||||||
|
|
||||||
if(count($allowed_groups)) {
|
if(count($allowed_groups)) {
|
||||||
$r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
|
$r = q("SELECT gname FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
|
||||||
if($r)
|
if($r)
|
||||||
foreach($r as $rr)
|
foreach($r as $rr)
|
||||||
$l[] = '<li><b>' . $rr['name'] . '</b></li>';
|
$l[] = '<li><b>' . $rr['gname'] . '</b></li>';
|
||||||
}
|
}
|
||||||
if(count($allowed_users)) {
|
if(count($allowed_users)) {
|
||||||
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
|
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
|
||||||
@ -100,10 +100,10 @@ class Lockview extends \Zotlabs\Web\Controller {
|
|||||||
$l[] = '<li>' . $rr['xchan_name'] . '</li>';
|
$l[] = '<li>' . $rr['xchan_name'] . '</li>';
|
||||||
}
|
}
|
||||||
if(count($deny_groups)) {
|
if(count($deny_groups)) {
|
||||||
$r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
|
$r = q("SELECT gname FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
|
||||||
if($r)
|
if($r)
|
||||||
foreach($r as $rr)
|
foreach($r as $rr)
|
||||||
$l[] = '<li><b><strike>' . $rr['name'] . '</strike></b></li>';
|
$l[] = '<li><b><strike>' . $rr['gname'] . '</strike></b></li>';
|
||||||
}
|
}
|
||||||
if(count($deny_users)) {
|
if(count($deny_users)) {
|
||||||
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
|
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
|
||||||
|
@ -34,7 +34,7 @@ class Locs extends \Zotlabs\Web\Controller {
|
|||||||
dbesc($channel['channel_hash'])
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,7 +72,7 @@ class Locs extends \Zotlabs\Web\Controller {
|
|||||||
intval($hubloc_id),
|
intval($hubloc_id),
|
||||||
dbesc($channel['channel_hash'])
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,7 +91,7 @@ class Locs extends \Zotlabs\Web\Controller {
|
|||||||
$channel = \App::get_channel();
|
$channel = \App::get_channel();
|
||||||
|
|
||||||
if($_REQUEST['sync']) {
|
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);
|
info( t('Syncing locations') . EOL);
|
||||||
goaway(z_root() . '/locs');
|
goaway(z_root() . '/locs');
|
||||||
}
|
}
|
||||||
|
@ -47,11 +47,9 @@ class Magic extends \Zotlabs\Web\Controller {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$ret = zot_finger((($addr) ? $addr : '[system]@' . $parsed['host']),null);
|
$j = \Zotlabs\Zot\Finger::run((($addr) ? $addr : '[system]@' . $parsed['host']),null);
|
||||||
if($ret['success']) {
|
if($j['success']) {
|
||||||
$j = json_decode($ret['body'],true);
|
import_xchan($j);
|
||||||
if($j)
|
|
||||||
import_xchan($j);
|
|
||||||
|
|
||||||
// Now try again
|
// Now try again
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ require_once('include/acl_selectors.php');
|
|||||||
require_once('include/message.php');
|
require_once('include/message.php');
|
||||||
require_once('include/zot.php');
|
require_once('include/zot.php');
|
||||||
require_once("include/bbcode.php");
|
require_once("include/bbcode.php");
|
||||||
require_once('include/Contact.php');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -32,17 +32,16 @@ class Mail extends \Zotlabs\Web\Controller {
|
|||||||
if(! $recipient) {
|
if(! $recipient) {
|
||||||
$channel = \App::get_channel();
|
$channel = \App::get_channel();
|
||||||
|
|
||||||
$ret = zot_finger($rstr,$channel);
|
$j = \Zotlabs\Zot\Finger::run($rstr,$channel);
|
||||||
|
|
||||||
if(! $ret['success']) {
|
if(! $j['success']) {
|
||||||
notice( t('Unable to lookup recipient.') . EOL);
|
notice( t('Unable to lookup recipient.') . EOL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$j = json_decode($ret['body'],true);
|
|
||||||
|
|
||||||
logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
|
logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
|
||||||
|
|
||||||
if(! ($j['success'] && $j['guid'])) {
|
if(! $j['guid']) {
|
||||||
notice( t('Unable to communicate with requested channel.'));
|
notice( t('Unable to communicate with requested channel.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -173,7 +172,7 @@ class Mail extends \Zotlabs\Web\Controller {
|
|||||||
build_sync_packet(local_channel(),array('mail' => encode_mail($x[0],true)));
|
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) {
|
if($r) {
|
||||||
info( t('Message recalled.') . EOL );
|
info( t('Message recalled.') . EOL );
|
||||||
@ -306,11 +305,6 @@ class Mail extends \Zotlabs\Web\Controller {
|
|||||||
else
|
else
|
||||||
\App::$poi = $messages[0]['to'];
|
\App::$poi = $messages[0]['to'];
|
||||||
|
|
||||||
// require_once('include/Contact.php');
|
|
||||||
|
|
||||||
// \App::set_widget('mail_conversant',vcard_from_xchan(\App::$poi,$get_observer_hash,'mail'));
|
|
||||||
|
|
||||||
|
|
||||||
$tpl = get_markup_template('msg-header.tpl');
|
$tpl = get_markup_template('msg-header.tpl');
|
||||||
|
|
||||||
\App::$page['htmlhead'] .= replace_macros($tpl, array(
|
\App::$page['htmlhead'] .= replace_macros($tpl, array(
|
||||||
|
@ -93,9 +93,9 @@ class Manage extends \Zotlabs\Web\Controller {
|
|||||||
$channels[$x]['mail'] = intval($mails[0]['total']);
|
$channels[$x]['mail'] = intval($mails[0]['total']);
|
||||||
|
|
||||||
|
|
||||||
$events = q("SELECT type, start, adjust FROM `event`
|
$events = q("SELECT etype, dtstart, adjust FROM `event`
|
||||||
WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
|
WHERE `event`.`uid` = %d AND dtstart < '%s' AND dtstart > '%s' and `dismissed` = 0
|
||||||
ORDER BY `start` ASC ",
|
ORDER BY `dtstart` ASC ",
|
||||||
intval($channels[$x]['channel_id']),
|
intval($channels[$x]['channel_id']),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
||||||
@ -108,14 +108,14 @@ class Manage extends \Zotlabs\Web\Controller {
|
|||||||
$str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
|
$str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
|
||||||
foreach($events as $e) {
|
foreach($events as $e) {
|
||||||
$bd = false;
|
$bd = false;
|
||||||
if($e['type'] === 'birthday') {
|
if($e['etype'] === 'birthday') {
|
||||||
$channels[$x]['birthdays'] ++;
|
$channels[$x]['birthdays'] ++;
|
||||||
$bd = true;
|
$bd = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$channels[$x]['events'] ++;
|
$channels[$x]['events'] ++;
|
||||||
}
|
}
|
||||||
if(datetime_convert('UTC', ((intval($e['adjust'])) ? date_default_timezone_get() : 'UTC'), $e['start'], 'Y-m-d') === $str_now) {
|
if(datetime_convert('UTC', ((intval($e['adjust'])) ? date_default_timezone_get() : 'UTC'), $e['dtstart'], 'Y-m-d') === $str_now) {
|
||||||
$channels[$x]['all_events_today'] ++;
|
$channels[$x]['all_events_today'] ++;
|
||||||
if($bd)
|
if($bd)
|
||||||
$channels[$x]['birthdays_today'] ++;
|
$channels[$x]['birthdays_today'] ++;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/menu.php');
|
require_once('include/menu.php');
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
|
|
||||||
|
|
||||||
class Menu extends \Zotlabs\Web\Controller {
|
class Menu extends \Zotlabs\Web\Controller {
|
||||||
|
@ -5,8 +5,6 @@ require_once('include/acl_selectors.php');
|
|||||||
require_once('include/message.php');
|
require_once('include/message.php');
|
||||||
require_once('include/zot.php');
|
require_once('include/zot.php');
|
||||||
require_once("include/bbcode.php");
|
require_once("include/bbcode.php");
|
||||||
require_once('include/Contact.php');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Message extends \Zotlabs\Web\Controller {
|
class Message extends \Zotlabs\Web\Controller {
|
||||||
|
@ -97,7 +97,7 @@ class Mood extends \Zotlabs\Web\Controller {
|
|||||||
$item_id = $post['item_id'];
|
$item_id = $post['item_id'];
|
||||||
|
|
||||||
if($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);
|
call_hooks('post_local_end', $arr);
|
||||||
|
@ -223,7 +223,7 @@ class Network extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($x) {
|
if($x) {
|
||||||
$title = replace_macros(get_markup_template("section_title.tpl"),array(
|
$title = replace_macros(get_markup_template("section_title.tpl"),array(
|
||||||
'$title' => t('Privacy group: ') . $x['name']
|
'$title' => t('Privacy group: ') . $x['gname']
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ class Network extends \Zotlabs\Web\Controller {
|
|||||||
$abook_uids = " and abook.abook_channel = " . local_channel() . " ";
|
$abook_uids = " and abook.abook_channel = " . local_channel() . " ";
|
||||||
|
|
||||||
if($firehose && (! get_config('system','disable_discover_tab'))) {
|
if($firehose && (! get_config('system','disable_discover_tab'))) {
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
$sys = get_sys_channel();
|
$sys = get_sys_channel();
|
||||||
$uids = " and item.uid = " . intval($sys['channel_id']) . " ";
|
$uids = " and item.uid = " . intval($sys['channel_id']) . " ";
|
||||||
\App::$data['firehose'] = intval($sys['channel_id']);
|
\App::$data['firehose'] = intval($sys['channel_id']);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/permissions.php');
|
require_once('include/permissions.php');
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,18 +80,18 @@ class Notifications extends \Zotlabs\Web\Controller {
|
|||||||
$not_tpl = get_markup_template('notify.tpl');
|
$not_tpl = get_markup_template('notify.tpl');
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
|
|
||||||
$r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
|
$r = q("SELECT * from notify where uid = %d and seen = 0 order by created desc",
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
|
|
||||||
if (count($r) > 0) {
|
if ($r > 0) {
|
||||||
$notifications_available =1;
|
$notifications_available =1;
|
||||||
foreach ($r as $it) {
|
foreach ($r as $it) {
|
||||||
$notif_content .= replace_macros($not_tpl,array(
|
$notif_content .= replace_macros($not_tpl,array(
|
||||||
'$item_link' => z_root().'/notify/view/'. $it['id'],
|
'$item_link' => z_root().'/notify/view/'. $it['id'],
|
||||||
'$item_image' => $it['photo'],
|
'$item_image' => $it['photo'],
|
||||||
'$item_text' => strip_tags(bbcode($it['msg'])),
|
'$item_text' => strip_tags(bbcode($it['msg'])),
|
||||||
'$item_when' => relative_date($it['date'])
|
'$item_when' => relative_date($it['created'])
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -39,7 +39,7 @@ class Notify extends \Zotlabs\Web\Controller {
|
|||||||
$not_tpl = get_markup_template('notify.tpl');
|
$not_tpl = get_markup_template('notify.tpl');
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
|
|
||||||
$r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
|
$r = q("SELECT * from notify where uid = %d and seen = 0 order by created desc",
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ class Notify extends \Zotlabs\Web\Controller {
|
|||||||
'$item_link' => z_root().'/notify/view/'. $it['id'],
|
'$item_link' => z_root().'/notify/view/'. $it['id'],
|
||||||
'$item_image' => $it['photo'],
|
'$item_image' => $it['photo'],
|
||||||
'$item_text' => strip_tags(bbcode($it['msg'])),
|
'$item_text' => strip_tags(bbcode($it['msg'])),
|
||||||
'$item_when' => relative_date($it['date'])
|
'$item_when' => relative_date($it['created'])
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -181,8 +181,8 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
function oep_profile_reply($args) {
|
function oep_profile_reply($args) {
|
||||||
|
|
||||||
|
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
require_once('include/Contact.php');
|
|
||||||
$url = $args['url'];
|
$url = $args['url'];
|
||||||
|
|
||||||
if(preg_match('#//(.*?)/(.*?)/(.*?)(/|\?|&|$)#',$url,$matches)) {
|
if(preg_match('#//(.*?)/(.*?)/(.*?)(/|\?|&|$)#',$url,$matches)) {
|
||||||
@ -249,7 +249,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$sql_extra = permissions_sql($c[0]['channel_id']);
|
$sql_extra = permissions_sql($c[0]['channel_id']);
|
||||||
|
|
||||||
$p = q("select resource_id from photo where album = '%s' and uid = %d and scale = 0 $sql_extra order by created desc limit 1",
|
$p = q("select resource_id from photo where album = '%s' and uid = %d and imgscale = 0 $sql_extra order by created desc limit 1",
|
||||||
dbesc($res),
|
dbesc($res),
|
||||||
intval($c[0]['channel_id'])
|
intval($c[0]['channel_id'])
|
||||||
);
|
);
|
||||||
@ -258,7 +258,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$res = $p[0]['resource_id'];
|
$res = $p[0]['resource_id'];
|
||||||
|
|
||||||
$r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
|
$r = q("select height, width, imgscale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by imgscale asc",
|
||||||
intval($c[0]['channel_id']),
|
intval($c[0]['channel_id']),
|
||||||
dbesc($res)
|
dbesc($res)
|
||||||
);
|
);
|
||||||
@ -276,7 +276,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($foundres) {
|
if($foundres) {
|
||||||
$ret['type'] = 'link';
|
$ret['type'] = 'link';
|
||||||
$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
|
$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['imgscale'];
|
||||||
$ret['thumbnail_width'] = $rr['width'];
|
$ret['thumbnail_width'] = $rr['width'];
|
||||||
$ret['thumbnail_height'] = $rr['height'];
|
$ret['thumbnail_height'] = $rr['height'];
|
||||||
}
|
}
|
||||||
@ -310,7 +310,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$sql_extra = permissions_sql($c[0]['channel_id']);
|
$sql_extra = permissions_sql($c[0]['channel_id']);
|
||||||
|
|
||||||
$p = q("select resource_id from photo where uid = %d and scale = 0 $sql_extra order by created desc limit 1",
|
$p = q("select resource_id from photo where uid = %d and imgscale = 0 $sql_extra order by created desc limit 1",
|
||||||
intval($c[0]['channel_id'])
|
intval($c[0]['channel_id'])
|
||||||
);
|
);
|
||||||
if(! $p)
|
if(! $p)
|
||||||
@ -318,7 +318,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$res = $p[0]['resource_id'];
|
$res = $p[0]['resource_id'];
|
||||||
|
|
||||||
$r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
|
$r = q("select height, width, imgscale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by imgscale asc",
|
||||||
intval($c[0]['channel_id']),
|
intval($c[0]['channel_id']),
|
||||||
dbesc($res)
|
dbesc($res)
|
||||||
);
|
);
|
||||||
@ -336,7 +336,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($foundres) {
|
if($foundres) {
|
||||||
$ret['type'] = 'link';
|
$ret['type'] = 'link';
|
||||||
$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
|
$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['imgscale'];
|
||||||
$ret['thumbnail_width'] = $rr['width'];
|
$ret['thumbnail_width'] = $rr['width'];
|
||||||
$ret['thumbnail_height'] = $rr['height'];
|
$ret['thumbnail_height'] = $rr['height'];
|
||||||
}
|
}
|
||||||
@ -372,7 +372,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
$sql_extra = permissions_sql($c[0]['channel_id']);
|
$sql_extra = permissions_sql($c[0]['channel_id']);
|
||||||
|
|
||||||
|
|
||||||
$r = q("select height, width, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale asc",
|
$r = q("select height, width, imgscale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by imgscale asc",
|
||||||
intval($c[0]['channel_id']),
|
intval($c[0]['channel_id']),
|
||||||
dbesc($res)
|
dbesc($res)
|
||||||
);
|
);
|
||||||
@ -390,7 +390,7 @@ class Oep extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
if($foundres) {
|
if($foundres) {
|
||||||
$ret['type'] = 'link';
|
$ret['type'] = 'link';
|
||||||
$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['scale'];
|
$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['imgscale'];
|
||||||
$ret['thumbnail_width'] = $rr['width'];
|
$ret['thumbnail_width'] = $rr['width'];
|
||||||
$ret['thumbnail_height'] = $rr['height'];
|
$ret['thumbnail_height'] = $rr['height'];
|
||||||
}
|
}
|
||||||
|
@ -57,14 +57,14 @@ class Photo extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
$uid = $person;
|
$uid = $person;
|
||||||
|
|
||||||
$r = q("SELECT * FROM photo WHERE scale = %d AND uid = %d AND photo_usage = %d LIMIT 1",
|
$r = q("SELECT * FROM photo WHERE imgscale = %d AND uid = %d AND photo_usage = %d LIMIT 1",
|
||||||
intval($resolution),
|
intval($resolution),
|
||||||
intval($uid),
|
intval($uid),
|
||||||
intval(PHOTO_PROFILE)
|
intval(PHOTO_PROFILE)
|
||||||
);
|
);
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
$data = dbunescbin($r[0]['data']);
|
$data = dbunescbin($r[0]['content']);
|
||||||
$mimetype = $r[0]['type'];
|
$mimetype = $r[0]['mimetype'];
|
||||||
}
|
}
|
||||||
if(intval($r[0]['os_storage']))
|
if(intval($r[0]['os_storage']))
|
||||||
$data = file_get_contents($data);
|
$data = file_get_contents($data);
|
||||||
@ -113,7 +113,7 @@ class Photo extends \Zotlabs\Web\Controller {
|
|||||||
// If using resolution 1, make sure it exists before proceeding:
|
// If using resolution 1, make sure it exists before proceeding:
|
||||||
if ($resolution == 1)
|
if ($resolution == 1)
|
||||||
{
|
{
|
||||||
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
|
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
|
||||||
dbesc($photo),
|
dbesc($photo),
|
||||||
intval($resolution)
|
intval($resolution)
|
||||||
);
|
);
|
||||||
@ -121,7 +121,7 @@ class Photo extends \Zotlabs\Web\Controller {
|
|||||||
$resolution = 2;
|
$resolution = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
|
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
|
||||||
dbesc($photo),
|
dbesc($photo),
|
||||||
intval($resolution)
|
intval($resolution)
|
||||||
);
|
);
|
||||||
@ -133,14 +133,14 @@ class Photo extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
// Now we'll see if we can access the photo
|
// Now we'll see if we can access the photo
|
||||||
|
|
||||||
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND scale = %d $sql_extra LIMIT 1",
|
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d $sql_extra LIMIT 1",
|
||||||
dbesc($photo),
|
dbesc($photo),
|
||||||
intval($resolution)
|
intval($resolution)
|
||||||
);
|
);
|
||||||
|
|
||||||
if($r && $allowed) {
|
if($r && $allowed) {
|
||||||
$data = dbunescbin($r[0]['data']);
|
$data = dbunescbin($r[0]['content']);
|
||||||
$mimetype = $r[0]['type'];
|
$mimetype = $r[0]['mimetype'];
|
||||||
if(intval($r[0]['os_storage']))
|
if(intval($r[0]['os_storage']))
|
||||||
$data = file_get_contents($data);
|
$data = file_get_contents($data);
|
||||||
}
|
}
|
||||||
@ -154,7 +154,7 @@ class Photo extends \Zotlabs\Web\Controller {
|
|||||||
// they won't have the photo link, so there's a reasonable chance that the person
|
// they won't have the photo link, so there's a reasonable chance that the person
|
||||||
// might be able to obtain permission to view it.
|
// might be able to obtain permission to view it.
|
||||||
|
|
||||||
$r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `scale` = %d LIMIT 1",
|
$r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `imgscale` = %d LIMIT 1",
|
||||||
dbesc($photo),
|
dbesc($photo),
|
||||||
intval($resolution)
|
intval($resolution)
|
||||||
);
|
);
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
require_once('include/photo/photo_driver.php');
|
require_once('include/photo/photo_driver.php');
|
||||||
require_once('include/photos.php');
|
require_once('include/photos.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
require_once('include/security.php');
|
require_once('include/security.php');
|
||||||
require_once('include/Contact.php');
|
|
||||||
require_once('include/attach.php');
|
require_once('include/attach.php');
|
||||||
require_once('include/text.php');
|
require_once('include/text.php');
|
||||||
require_once('include/PermissionDescription.php');
|
require_once('include/PermissionDescription.php');
|
||||||
@ -18,7 +18,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
function init() {
|
function init() {
|
||||||
|
|
||||||
|
|
||||||
if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
|
if(observer_prohibited()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,13 +255,13 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
|
( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
|
||||||
logger('rotate');
|
logger('rotate');
|
||||||
|
|
||||||
$r = q("select * from photo where `resource_id` = '%s' and uid = %d and scale = 0 limit 1",
|
$r = q("select * from photo where `resource_id` = '%s' and uid = %d and imgscale = 0 limit 1",
|
||||||
dbesc($resource_id),
|
dbesc($resource_id),
|
||||||
intval($page_owner_uid)
|
intval($page_owner_uid)
|
||||||
);
|
);
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
$d = (($r[0]['os_storage']) ? @file_get_contents($r[0]['data']) : dbunescbin($r[0]['data']));
|
$d = (($r[0]['os_storage']) ? @file_get_contents($r[0]['content']) : dbunescbin($r[0]['content']));
|
||||||
$ph = photo_factory($d, $r[0]['type']);
|
$ph = photo_factory($d, $r[0]['mimetype']);
|
||||||
if($ph->is_valid()) {
|
if($ph->is_valid()) {
|
||||||
$rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
|
$rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
|
||||||
$ph->rotate($rotate_deg);
|
$ph->rotate($rotate_deg);
|
||||||
@ -270,9 +270,9 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$height = $ph->getHeight();
|
$height = $ph->getHeight();
|
||||||
|
|
||||||
if(intval($r[0]['os_storage'])) {
|
if(intval($r[0]['os_storage'])) {
|
||||||
@file_put_contents($r[0]['data'],$ph->imageString());
|
@file_put_contents($r[0]['content'],$ph->imageString());
|
||||||
$data = $r[0]['data'];
|
$data = $r[0]['content'];
|
||||||
$fsize = @filesize($r[0]['data']);
|
$fsize = @filesize($r[0]['content']);
|
||||||
q("update attach set filesize = %d where hash = '%s' and uid = %d limit 1",
|
q("update attach set filesize = %d where hash = '%s' and uid = %d limit 1",
|
||||||
intval($fsize),
|
intval($fsize),
|
||||||
dbesc($resource_id),
|
dbesc($resource_id),
|
||||||
@ -284,7 +284,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$fsize = strlen($data);
|
$fsize = strlen($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
$x = q("update photo set data = '%s', `size` = %d, height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 0",
|
$x = q("update photo set content = '%s', filesize = %d, height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 0",
|
||||||
dbescbin($data),
|
dbescbin($data),
|
||||||
intval($fsize),
|
intval($fsize),
|
||||||
intval($height),
|
intval($height),
|
||||||
@ -299,7 +299,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$width = $ph->getWidth();
|
$width = $ph->getWidth();
|
||||||
$height = $ph->getHeight();
|
$height = $ph->getHeight();
|
||||||
|
|
||||||
$x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 1",
|
$x = q("update photo set content = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 1",
|
||||||
dbescbin($ph->imageString()),
|
dbescbin($ph->imageString()),
|
||||||
intval($height),
|
intval($height),
|
||||||
intval($width),
|
intval($width),
|
||||||
@ -314,7 +314,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$width = $ph->getWidth();
|
$width = $ph->getWidth();
|
||||||
$height = $ph->getHeight();
|
$height = $ph->getHeight();
|
||||||
|
|
||||||
$x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 2",
|
$x = q("update photo set content = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 2",
|
||||||
dbescbin($ph->imageString()),
|
dbescbin($ph->imageString()),
|
||||||
intval($height),
|
intval($height),
|
||||||
intval($width),
|
intval($width),
|
||||||
@ -329,7 +329,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$width = $ph->getWidth();
|
$width = $ph->getWidth();
|
||||||
$height = $ph->getHeight();
|
$height = $ph->getHeight();
|
||||||
|
|
||||||
$x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 3",
|
$x = q("update photo set content = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 3",
|
||||||
dbescbin($ph->imageString()),
|
dbescbin($ph->imageString()),
|
||||||
intval($height),
|
intval($height),
|
||||||
intval($width),
|
intval($width),
|
||||||
@ -340,12 +340,12 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$p = q("SELECT type, is_nsfw, description, resource_id, scale, allow_cid, allow_gid, deny_cid, deny_gid FROM photo WHERE resource_id = '%s' AND uid = %d ORDER BY scale DESC",
|
$p = q("SELECT mimetype, is_nsfw, description, resource_id, imgscale, allow_cid, allow_gid, deny_cid, deny_gid FROM photo WHERE resource_id = '%s' AND uid = %d ORDER BY imgscale DESC",
|
||||||
dbesc($resource_id),
|
dbesc($resource_id),
|
||||||
intval($page_owner_uid)
|
intval($page_owner_uid)
|
||||||
);
|
);
|
||||||
if($p) {
|
if($p) {
|
||||||
$ext = $phototypes[$p[0]['type']];
|
$ext = $phototypes[$p[0]['mimetype']];
|
||||||
|
|
||||||
$r = q("UPDATE `photo` SET `description` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
|
$r = q("UPDATE `photo` SET `description` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
|
||||||
dbesc($desc),
|
dbesc($desc),
|
||||||
@ -440,7 +440,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
if($success['replaced']) {
|
if($success['replaced']) {
|
||||||
$post_tags[] = array(
|
$post_tags[] = array(
|
||||||
'uid' => $profile_uid,
|
'uid' => $profile_uid,
|
||||||
'type' => $success['termtype'],
|
'ttype' => $success['termtype'],
|
||||||
'otype' => TERM_OBJ_POST,
|
'otype' => TERM_OBJ_POST,
|
||||||
'term' => $success['term'],
|
'term' => $success['term'],
|
||||||
'url' => $success['url']
|
'url' => $success['url']
|
||||||
@ -510,7 +510,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|
||||||
// URLs:
|
// URLs:
|
||||||
// photos/name
|
// photos/name
|
||||||
@ -518,7 +518,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
// photos/name/image/xxxxx
|
// photos/name/image/xxxxx
|
||||||
|
|
||||||
|
|
||||||
if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
|
if(observer_prohibited()) {
|
||||||
notice( t('Public access denied.') . EOL);
|
notice( t('Public access denied.') . EOL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -611,7 +611,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
/* Show space usage */
|
/* Show space usage */
|
||||||
|
|
||||||
$r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
|
$r = q("select sum(filesize) as total from photo where aid = %d and imgscale = 0 ",
|
||||||
intval(\App::$data['channel']['channel_account_id'])
|
intval(\App::$data['channel']['channel_account_id'])
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -704,8 +704,8 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
|
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
|
||||||
|
|
||||||
|
|
||||||
$r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
|
$r = q("SELECT `resource_id`, max(`imgscale`) AS `imgscale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
|
||||||
AND `scale` <= 4 and photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
|
AND `imgscale` <= 4 and photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
|
||||||
intval($owner_uid),
|
intval($owner_uid),
|
||||||
dbesc($album),
|
dbesc($album),
|
||||||
intval(PHOTO_NORMAL),
|
intval(PHOTO_NORMAL),
|
||||||
@ -725,9 +725,9 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$order = 'DESC';
|
$order = 'DESC';
|
||||||
|
|
||||||
|
|
||||||
$r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.scale, p.description, p.created FROM photo p INNER JOIN
|
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
|
||||||
(SELECT resource_id, max(scale) scale FROM photo WHERE uid = %d AND album = '%s' AND scale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
|
(SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
|
||||||
ON (p.resource_id = ph.resource_id AND p.scale = ph.scale)
|
ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
|
||||||
ORDER BY created $order LIMIT %d OFFSET %d",
|
ORDER BY created $order LIMIT %d OFFSET %d",
|
||||||
intval($owner_uid),
|
intval($owner_uid),
|
||||||
dbesc($album),
|
dbesc($album),
|
||||||
@ -777,7 +777,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
else
|
else
|
||||||
$twist = 'rotright';
|
$twist = 'rotright';
|
||||||
|
|
||||||
$ext = $phototypes[$rr['type']];
|
$ext = $phototypes[$rr['mimetype']];
|
||||||
|
|
||||||
$imgalt_e = $rr['filename'];
|
$imgalt_e = $rr['filename'];
|
||||||
$desc_e = $rr['description'];
|
$desc_e = $rr['description'];
|
||||||
@ -790,7 +790,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
'twist' => ' ' . $twist . rand(2,4),
|
'twist' => ' ' . $twist . rand(2,4),
|
||||||
'link' => $imagelink,
|
'link' => $imagelink,
|
||||||
'title' => t('View Photo'),
|
'title' => t('View Photo'),
|
||||||
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' .$ext,
|
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['imgscale'] . '.' .$ext,
|
||||||
'alt' => $imgalt_e,
|
'alt' => $imgalt_e,
|
||||||
'desc'=> $desc_e,
|
'desc'=> $desc_e,
|
||||||
'ext' => $ext,
|
'ext' => $ext,
|
||||||
@ -852,8 +852,8 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
// fetch image, item containing image, then comments
|
// fetch image, item containing image, then comments
|
||||||
|
|
||||||
$ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
|
$ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,mimetype,height,width,filesize,imgscale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
|
||||||
$sql_extra ORDER BY `scale` ASC ",
|
$sql_extra ORDER BY `imgscale` ASC ",
|
||||||
intval($owner_uid),
|
intval($owner_uid),
|
||||||
dbesc($datum)
|
dbesc($datum)
|
||||||
);
|
);
|
||||||
@ -884,7 +884,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$order = 'DESC';
|
$order = 'DESC';
|
||||||
|
|
||||||
|
|
||||||
$prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0
|
$prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `imgscale` = 0
|
||||||
$sql_extra ORDER BY `created` $order ",
|
$sql_extra ORDER BY `created` $order ",
|
||||||
dbesc($ph[0]['album']),
|
dbesc($ph[0]['album']),
|
||||||
intval($owner_uid)
|
intval($owner_uid)
|
||||||
@ -911,7 +911,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
if(count($ph) == 1)
|
if(count($ph) == 1)
|
||||||
$hires = $lores = $ph[0];
|
$hires = $lores = $ph[0];
|
||||||
if(count($ph) > 1) {
|
if(count($ph) > 1) {
|
||||||
if($ph[1]['scale'] == 2) {
|
if($ph[1]['imgscale'] == 2) {
|
||||||
// original is 640 or less, we can display it directly
|
// original is 640 or less, we can display it directly
|
||||||
$hires = $lores = $ph[0];
|
$hires = $lores = $ph[0];
|
||||||
}
|
}
|
||||||
@ -949,9 +949,9 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
$prevlink = array($prevlink, t('Previous'));
|
$prevlink = array($prevlink, t('Previous'));
|
||||||
|
|
||||||
$photo = array(
|
$photo = array(
|
||||||
'href' => z_root() . '/photo/' . $hires['resource_id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
|
'href' => z_root() . '/photo/' . $hires['resource_id'] . '-' . $hires['imgscale'] . '.' . $phototypes[$hires['mimetype']],
|
||||||
'title'=> t('View Full Size'),
|
'title'=> t('View Full Size'),
|
||||||
'src' => z_root() . '/photo/' . $lores['resource_id'] . '-' . $lores['scale'] . '.' . $phototypes[$lores['type']] . '?f=&_u=' . datetime_convert('','','','ymdhis')
|
'src' => z_root() . '/photo/' . $lores['resource_id'] . '-' . $lores['imgscale'] . '.' . $phototypes[$lores['mimetype']] . '?f=&_u=' . datetime_convert('','','','ymdhis')
|
||||||
);
|
);
|
||||||
|
|
||||||
if($nextlink)
|
if($nextlink)
|
||||||
@ -1277,28 +1277,25 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
|
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
|
||||||
|
|
||||||
|
|
||||||
$r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
|
$r = q("SELECT `resource_id`, max(`imgscale`) AS `imgscale` FROM `photo` WHERE `uid` = %d
|
||||||
and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
|
and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
|
||||||
intval(\App::$data['channel']['channel_id']),
|
intval(\App::$data['channel']['channel_id']),
|
||||||
dbesc('Contact Photos'),
|
|
||||||
dbesc( t('Contact Photos')),
|
|
||||||
intval(PHOTO_NORMAL),
|
intval(PHOTO_NORMAL),
|
||||||
intval(PHOTO_PROFILE),
|
intval(PHOTO_PROFILE),
|
||||||
intval($unsafe)
|
intval($unsafe)
|
||||||
);
|
);
|
||||||
if(count($r)) {
|
if($r) {
|
||||||
\App::set_pager_total(count($r));
|
\App::set_pager_total(count($r));
|
||||||
\App::set_pager_itemspage(60);
|
\App::set_pager_itemspage(60);
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.album, p.scale, p.created FROM photo p INNER JOIN
|
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.album, p.imgscale, p.created FROM photo p
|
||||||
(SELECT resource_id, max(scale) scale FROM photo
|
INNER JOIN ( SELECT resource_id, max(imgscale) imgscale FROM photo
|
||||||
WHERE uid=%d AND album != '%s' AND album != '%s'
|
WHERE uid = %d AND photo_usage IN ( %d, %d )
|
||||||
AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra group by resource_id) ph
|
AND is_nsfw = %d $sql_extra group by resource_id ) ph
|
||||||
ON (p.resource_id = ph.resource_id and p.scale = ph.scale) ORDER by p.created DESC LIMIT %d OFFSET %d",
|
ON (p.resource_id = ph.resource_id and p.imgscale = ph.imgscale)
|
||||||
|
ORDER by p.created DESC LIMIT %d OFFSET %d",
|
||||||
intval(\App::$data['channel']['channel_id']),
|
intval(\App::$data['channel']['channel_id']),
|
||||||
dbesc('Contact Photos'),
|
|
||||||
dbesc( t('Contact Photos')),
|
|
||||||
intval(PHOTO_NORMAL),
|
intval(PHOTO_NORMAL),
|
||||||
intval(PHOTO_PROFILE),
|
intval(PHOTO_PROFILE),
|
||||||
intval($unsafe),
|
intval($unsafe),
|
||||||
@ -1309,14 +1306,14 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
|
|
||||||
$photos = array();
|
$photos = array();
|
||||||
if(count($r)) {
|
if($r) {
|
||||||
$twist = 'rotright';
|
$twist = 'rotright';
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
if($twist == 'rotright')
|
if($twist == 'rotright')
|
||||||
$twist = 'rotleft';
|
$twist = 'rotleft';
|
||||||
else
|
else
|
||||||
$twist = 'rotright';
|
$twist = 'rotright';
|
||||||
$ext = $phototypes[$rr['type']];
|
$ext = $phototypes[$rr['mimetype']];
|
||||||
|
|
||||||
if(\App::get_template_engine() === 'internal') {
|
if(\App::get_template_engine() === 'internal') {
|
||||||
$alt_e = template_escape($rr['filename']);
|
$alt_e = template_escape($rr['filename']);
|
||||||
@ -1332,7 +1329,7 @@ class Photos extends \Zotlabs\Web\Controller {
|
|||||||
'twist' => ' ' . $twist . rand(2,4),
|
'twist' => ' ' . $twist . rand(2,4),
|
||||||
'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id'],
|
'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id'],
|
||||||
'title' => t('View Photo'),
|
'title' => t('View Photo'),
|
||||||
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext,
|
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['imgscale']) == 6) ? 4 : $rr['imgscale']) . '.' . $ext,
|
||||||
'alt' => $alt_e,
|
'alt' => $alt_e,
|
||||||
'album' => array(
|
'album' => array(
|
||||||
'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
|
'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Zotlabs\Module;
|
namespace Zotlabs\Module;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file mod/ping.php
|
* @file mod/ping.php
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
require_once('include/notify.php');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief do several updates when pinged.
|
* @brief do several updates when pinged.
|
||||||
@ -172,7 +173,7 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'all_events':
|
case 'all_events':
|
||||||
$r = q("update event set `ignore` = 1 where `ignore` = 0 and uid = %d AND start < '%s' AND start > '%s' ",
|
$r = q("update event set `dimissed` = 1 where `dismissed` = 0 and uid = %d AND dtstart < '%s' AND dtstart > '%s' ",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
||||||
@ -208,17 +209,17 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
);
|
);
|
||||||
if($t && intval($t[0]['total']) > 49) {
|
if($t && intval($t[0]['total']) > 49) {
|
||||||
$z = q("select * from notify where uid = %d
|
$z = q("select * from notify where uid = %d
|
||||||
and seen = 0 order by date desc limit 50",
|
and seen = 0 order by created desc limit 50",
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$z1 = q("select * from notify where uid = %d
|
$z1 = q("select * from notify where uid = %d
|
||||||
and seen = 0 order by date desc limit 50",
|
and seen = 0 order by created desc limit 50",
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
$z2 = q("select * from notify where uid = %d
|
$z2 = q("select * from notify where uid = %d
|
||||||
and seen = 1 order by date desc limit %d",
|
and seen = 1 order by created desc limit %d",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
intval(50 - intval($t[0]['total']))
|
intval(50 - intval($t[0]['total']))
|
||||||
);
|
);
|
||||||
@ -229,10 +230,10 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
foreach($z as $zz) {
|
foreach($z as $zz) {
|
||||||
$notifs[] = array(
|
$notifs[] = array(
|
||||||
'notify_link' => z_root() . '/notify/view/' . $zz['id'],
|
'notify_link' => z_root() . '/notify/view/' . $zz['id'],
|
||||||
'name' => $zz['name'],
|
'name' => $zz['xname'],
|
||||||
'url' => $zz['url'],
|
'url' => $zz['url'],
|
||||||
'photo' => $zz['photo'],
|
'photo' => $zz['photo'],
|
||||||
'when' => relative_date($zz['date']),
|
'when' => relative_date($zz['created']),
|
||||||
'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'),
|
'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'),
|
||||||
'message' => strip_tags(bbcode($zz['msg']))
|
'message' => strip_tags(bbcode($zz['msg']))
|
||||||
);
|
);
|
||||||
@ -285,7 +286,7 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
foreach($r as $item) {
|
foreach($r as $item) {
|
||||||
if((argv(1) === 'home') && (! intval($item['item_wall'])))
|
if((argv(1) === 'home') && (! intval($item['item_wall'])))
|
||||||
continue;
|
continue;
|
||||||
$result[] = format_notification($item);
|
$result[] = \Zotlabs\Lib\Enotify::format($item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA);
|
// logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA);
|
||||||
@ -324,9 +325,9 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
$result = array();
|
$result = array();
|
||||||
|
|
||||||
$r = q("SELECT * FROM event left join xchan on event_xchan = xchan_hash
|
$r = q("SELECT * FROM event left join xchan on event_xchan = xchan_hash
|
||||||
WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
|
WHERE `event`.`uid` = %d AND dtstart < '%s' AND dtstart > '%s' and `dismissed` = 0
|
||||||
and type in ( 'event', 'birthday' )
|
and etype in ( 'event', 'birthday' )
|
||||||
ORDER BY `start` DESC LIMIT 1000",
|
ORDER BY `dtstart` DESC LIMIT 1000",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
||||||
@ -335,14 +336,14 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
if($r) {
|
if($r) {
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
if($rr['adjust'])
|
if($rr['adjust'])
|
||||||
$md = datetime_convert('UTC', date_default_timezone_get(), $rr['start'], 'Y/m');
|
$md = datetime_convert('UTC', date_default_timezone_get(), $rr['dtstart'], 'Y/m');
|
||||||
else
|
else
|
||||||
$md = datetime_convert('UTC', 'UTC', $rr['start'], 'Y/m');
|
$md = datetime_convert('UTC', 'UTC', $rr['dtstart'], 'Y/m');
|
||||||
|
|
||||||
$strt = datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['start']);
|
$strt = datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['dtstart']);
|
||||||
$today = ((substr($strt, 0, 10) === datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d')) ? true : false);
|
$today = ((substr($strt, 0, 10) === datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d')) ? true : false);
|
||||||
|
|
||||||
$when = day_translate(datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
|
$when = day_translate(datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['dtstart'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
|
||||||
|
|
||||||
$result[] = array(
|
$result[] = array(
|
||||||
'notify_link' => z_root() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
|
'notify_link' => z_root() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
|
||||||
@ -442,10 +443,10 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
$t5 = dba_timer();
|
$t5 = dba_timer();
|
||||||
|
|
||||||
if($vnotify & (VNOTIFY_EVENT|VNOTIFY_EVENTTODAY|VNOTIFY_BIRTHDAY)) {
|
if($vnotify & (VNOTIFY_EVENT|VNOTIFY_EVENTTODAY|VNOTIFY_BIRTHDAY)) {
|
||||||
$events = q("SELECT type, start, adjust FROM `event`
|
$events = q("SELECT etype, dtstart, adjust FROM `event`
|
||||||
WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
|
WHERE `event`.`uid` = %d AND dtstart < '%s' AND dtstart > '%s' and `dismissed` = 0
|
||||||
and type in ( 'event', 'birthday' )
|
and etype in ( 'event', 'birthday' )
|
||||||
ORDER BY `start` ASC ",
|
ORDER BY `dtstart` ASC ",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
|
||||||
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
|
||||||
@ -458,14 +459,14 @@ class Ping extends \Zotlabs\Web\Controller {
|
|||||||
$str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
|
$str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
|
||||||
foreach($events as $x) {
|
foreach($events as $x) {
|
||||||
$bd = false;
|
$bd = false;
|
||||||
if($x['type'] === 'birthday') {
|
if($x['etype'] === 'birthday') {
|
||||||
$result['birthdays'] ++;
|
$result['birthdays'] ++;
|
||||||
$bd = true;
|
$bd = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$result['events'] ++;
|
$result['events'] ++;
|
||||||
}
|
}
|
||||||
if(datetime_convert('UTC', ((intval($x['adjust'])) ? date_default_timezone_get() : 'UTC'), $x['start'], 'Y-m-d') === $str_now) {
|
if(datetime_convert('UTC', ((intval($x['adjust'])) ? date_default_timezone_get() : 'UTC'), $x['dtstart'], 'Y-m-d') === $str_now) {
|
||||||
$result['all_events_today'] ++;
|
$result['all_events_today'] ++;
|
||||||
if($bd)
|
if($bd)
|
||||||
$result['birthdays_today'] ++;
|
$result['birthdays_today'] ++;
|
||||||
|
@ -115,7 +115,7 @@ class Poke extends \Zotlabs\Web\Controller {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
$arr['object'] = json_encode($obj);
|
$arr['obj'] = json_encode($obj);
|
||||||
|
|
||||||
$arr['item_origin'] = 1;
|
$arr['item_origin'] = 1;
|
||||||
$arr['item_wall'] = 1;
|
$arr['item_wall'] = 1;
|
||||||
|
@ -85,7 +85,7 @@ class Prate extends \Zotlabs\Web\Controller {
|
|||||||
$record = $z[0]['xlink_id'];
|
$record = $z[0]['xlink_id'];
|
||||||
}
|
}
|
||||||
if($record) {
|
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));;
|
json_return_and_die(array('result' => true));;
|
||||||
|
@ -20,17 +20,17 @@ class Probe extends \Zotlabs\Web\Controller {
|
|||||||
$channel = \App::get_channel();
|
$channel = \App::get_channel();
|
||||||
$addr = trim($_GET['addr']);
|
$addr = trim($_GET['addr']);
|
||||||
$do_import = ((intval($_GET['import']) && is_site_admin()) ? true : false);
|
$do_import = ((intval($_GET['import']) && is_site_admin()) ? true : false);
|
||||||
$res = zot_finger($addr,$channel,false);
|
|
||||||
|
$j = \Zotlabs\Zot\Finger::run($addr,$channel,false);
|
||||||
|
|
||||||
|
// $res = zot_finger($addr,$channel,false);
|
||||||
|
|
||||||
$o .= '<pre>';
|
$o .= '<pre>';
|
||||||
if($res['success'])
|
if(! $j['success']) {
|
||||||
$j = json_decode($res['body'],true);
|
|
||||||
else {
|
|
||||||
$o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
|
$o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
|
||||||
$o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
|
$o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
|
||||||
$res = zot_finger($addr,$channel,true);
|
$j = \Zotlabs\Zot\Finger::run($addr,$channel,true);
|
||||||
if($res['success'])
|
if(! $j['success'])
|
||||||
$j = json_decode($res['body'],true);
|
|
||||||
else
|
|
||||||
$o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
|
$o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,8 +55,8 @@ class Profile extends \Zotlabs\Web\Controller {
|
|||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|
||||||
if(get_config('system','block_public') && (! get_account_id()) && (! remote_channel())) {
|
if(observer_prohibited(true)) {
|
||||||
return login();
|
return login();
|
||||||
}
|
}
|
||||||
|
|
||||||
$groups = array();
|
$groups = array();
|
||||||
|
@ -9,7 +9,7 @@ namespace Zotlabs\Module;
|
|||||||
|
|
||||||
require_once('include/photo/photo_driver.php');
|
require_once('include/photo/photo_driver.php');
|
||||||
require_once('include/photos.php');
|
require_once('include/photos.php');
|
||||||
require_once('include/identity.php');
|
require_once('include/channel.php');
|
||||||
|
|
||||||
/* @brief Function for sync'ing permissions of profile-photos and their profile
|
/* @brief Function for sync'ing permissions of profile-photos and their profile
|
||||||
*
|
*
|
||||||
@ -93,7 +93,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
$srcW = $_POST['xfinal'] - $srcX;
|
$srcW = $_POST['xfinal'] - $srcX;
|
||||||
$srcH = $_POST['yfinal'] - $srcY;
|
$srcH = $_POST['yfinal'] - $srcY;
|
||||||
|
|
||||||
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = %d LIMIT 1",
|
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND imgscale = %d LIMIT 1",
|
||||||
dbesc($image_id),
|
dbesc($image_id),
|
||||||
dbesc(local_channel()),
|
dbesc(local_channel()),
|
||||||
intval($scale));
|
intval($scale));
|
||||||
@ -101,9 +101,9 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
if($r) {
|
if($r) {
|
||||||
|
|
||||||
$base_image = $r[0];
|
$base_image = $r[0];
|
||||||
$base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data']));
|
$base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['content']) : dbunescbin($base_image['content']));
|
||||||
|
|
||||||
$im = photo_factory($base_image['data'], $base_image['type']);
|
$im = photo_factory($base_image['content'], $base_image['mimetype']);
|
||||||
if($im->is_valid()) {
|
if($im->is_valid()) {
|
||||||
|
|
||||||
$im->cropImage(300,$srcX,$srcY,$srcW,$srcH);
|
$im->cropImage(300,$srcX,$srcY,$srcW,$srcH);
|
||||||
@ -113,25 +113,25 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
$p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
|
$p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
|
||||||
'filename' => $base_image['filename'], 'album' => t('Profile Photos'));
|
'filename' => $base_image['filename'], 'album' => t('Profile Photos'));
|
||||||
|
|
||||||
$p['scale'] = 4;
|
$p['imgscale'] = 4;
|
||||||
$p['photo_usage'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
|
$p['photo_usage'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
|
||||||
|
|
||||||
$r1 = $im->save($p);
|
$r1 = $im->save($p);
|
||||||
|
|
||||||
$im->scaleImage(80);
|
$im->scaleImage(80);
|
||||||
$p['scale'] = 5;
|
$p['imgscale'] = 5;
|
||||||
|
|
||||||
$r2 = $im->save($p);
|
$r2 = $im->save($p);
|
||||||
|
|
||||||
$im->scaleImage(48);
|
$im->scaleImage(48);
|
||||||
$p['scale'] = 6;
|
$p['imgscale'] = 6;
|
||||||
|
|
||||||
$r3 = $im->save($p);
|
$r3 = $im->save($p);
|
||||||
|
|
||||||
if($r1 === false || $r2 === false || $r3 === false) {
|
if($r1 === false || $r2 === false || $r3 === false) {
|
||||||
// if one failed, delete them all so we can start over.
|
// if one failed, delete them all so we can start over.
|
||||||
notice( t('Image resize failed.') . EOL );
|
notice( t('Image resize failed.') . EOL );
|
||||||
$x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 4 ",
|
$x = q("delete from photo where resource_id = '%s' and uid = %d and imgscale >= 4 ",
|
||||||
dbesc($base_image['resource_id']),
|
dbesc($base_image['resource_id']),
|
||||||
local_channel()
|
local_channel()
|
||||||
);
|
);
|
||||||
@ -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);
|
info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
|
||||||
|
|
||||||
// Update directory in background
|
// 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'
|
// Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures'
|
||||||
|
|
||||||
@ -208,7 +208,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
logger('attach_store: ' . print_r($res,true));
|
logger('attach_store: ' . print_r($res,true));
|
||||||
|
|
||||||
if($res && intval($res['data']['is_photo'])) {
|
if($res && intval($res['data']['is_photo'])) {
|
||||||
$i = q("select * from photo where resource_id = '%s' and uid = %d order by scale",
|
$i = q("select * from photo where resource_id = '%s' and uid = %d order by imgscale",
|
||||||
dbesc($hash),
|
dbesc($hash),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -220,11 +220,11 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
$os_storage = false;
|
$os_storage = false;
|
||||||
|
|
||||||
foreach($i as $ii) {
|
foreach($i as $ii) {
|
||||||
if(intval($ii['scale']) < 2) {
|
if(intval($ii['imgscale']) < 2) {
|
||||||
$smallest = intval($ii['scale']);
|
$smallest = intval($ii['imgscale']);
|
||||||
$os_storage = intval($ii['os_storage']);
|
$os_storage = intval($ii['os_storage']);
|
||||||
$imagedata = $ii['data'];
|
$imagedata = $ii['content'];
|
||||||
$filetype = $ii['type'];
|
$filetype = $ii['mimetype'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -250,7 +250,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
|
|
||||||
if(! local_channel()) {
|
if(! local_channel()) {
|
||||||
notice( t('Permission denied.') . EOL );
|
notice( t('Permission denied.') . EOL );
|
||||||
@ -275,7 +275,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
$resource_id = argv(2);
|
$resource_id = argv(2);
|
||||||
|
|
||||||
|
|
||||||
$r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
|
$r = q("SELECT id, album, imgscale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY imgscale ASC",
|
||||||
intval(local_channel()),
|
intval(local_channel()),
|
||||||
dbesc($resource_id)
|
dbesc($resource_id)
|
||||||
);
|
);
|
||||||
@ -285,7 +285,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
$havescale = false;
|
$havescale = false;
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
if($rr['scale'] == 5)
|
if($rr['imgscale'] == 5)
|
||||||
$havescale = true;
|
$havescale = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,11 +311,11 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
);
|
);
|
||||||
|
|
||||||
profile_photo_set_profile_perms(); //Reset default photo permissions to public
|
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');
|
goaway(z_root() . '/profiles');
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
|
$r = q("SELECT content, mimetype, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
|
||||||
intval($r[0]['id']),
|
intval($r[0]['id']),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
|
|
||||||
@ -326,15 +326,15 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(intval($r[0]['os_storage']))
|
if(intval($r[0]['os_storage']))
|
||||||
$data = @file_get_contents($r[0]['data']);
|
$data = @file_get_contents($r[0]['content']);
|
||||||
else
|
else
|
||||||
$data = dbunescbin($r[0]['data']);
|
$data = dbunescbin($r[0]['content']);
|
||||||
|
|
||||||
$ph = photo_factory($data, $r[0]['type']);
|
$ph = photo_factory($data, $r[0]['mimetype']);
|
||||||
$smallest = 0;
|
$smallest = 0;
|
||||||
if($ph->is_valid()) {
|
if($ph->is_valid()) {
|
||||||
// go ahead as if we have just uploaded a new photo to crop
|
// go ahead as if we have just uploaded a new photo to crop
|
||||||
$i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d order by scale",
|
$i = q("select resource_id, imgscale from photo where resource_id = '%s' and uid = %d order by imgscale",
|
||||||
dbesc($r[0]['resource_id']),
|
dbesc($r[0]['resource_id']),
|
||||||
intval(local_channel())
|
intval(local_channel())
|
||||||
);
|
);
|
||||||
@ -342,8 +342,8 @@ class Profile_photo extends \Zotlabs\Web\Controller {
|
|||||||
if($i) {
|
if($i) {
|
||||||
$hash = $i[0]['resource_id'];
|
$hash = $i[0]['resource_id'];
|
||||||
foreach($i as $ii) {
|
foreach($i as $ii) {
|
||||||
if(intval($ii['scale']) < 2) {
|
if(intval($ii['imgscale']) < 2) {
|
||||||
$smallest = intval($ii['scale']);
|
$smallest = intval($ii['imgscale']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user