Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
04518702d2
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))
|
||||||
|
load_pconfig($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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -15,7 +15,7 @@ class ThreadItem {
|
|||||||
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
|
// list of supported reaction emojis - a site can over-ride this via config system.reactions
|
||||||
private $reactions = ['1f60a','1f44f','1f37e','1f48b','1f61e','2665','1f622','1f62e','1f634','1f61c','1f607','1f608'];
|
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,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,7 +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')) {
|
||||||
foreach ($users as $uid){
|
foreach ($users as $uid){
|
||||||
account_remove($uid, true, false);
|
account_remove($uid, true, false);
|
||||||
}
|
}
|
||||||
@ -920,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",
|
||||||
@ -942,10 +942,10 @@ 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':
|
||||||
@ -972,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 */
|
||||||
@ -980,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)) {
|
||||||
@ -988,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']),
|
||||||
@ -1026,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'),
|
||||||
@ -1041,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(),
|
||||||
@ -1158,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 */
|
||||||
|
|
||||||
@ -1166,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)
|
||||||
@ -1201,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?'),
|
||||||
|
@ -86,6 +86,13 @@
|
|||||||
|
|
||||||
[h3]Addon Repositories[/h3]
|
[h3]Addon Repositories[/h3]
|
||||||
|
|
||||||
|
We [b]strongly recommend[/b] that authors of addons publish/submit them to the project addon repository. This has several advantages. Project developers can easily fix security flaws and make changes to comply with recent changes in core code. Addons provided in third-party repositories are considered untrusted. If the project core code changes in an incompatible way, there may be no alternative but to physically remove or rename the addon files in order to get your site working again. Often only the plugin/addon author can help you regain control of your website, and project developers are unable to assist you; because by definition your site configuration has been modified in ways that we cannot easily test or verify.
|
||||||
|
|
||||||
|
For these reasons we [b]strongly recommend[/b] that you do NOT install addons from third-party repositories.
|
||||||
|
|
||||||
|
We also recognise that some developers prefer working on their own and do not wish their code to be mingled with the project repository for a variety of reasons. These developers can ease troubleshooting and debugging by providing a README file in their respective code repository outlining the process for submitting patches and bug fixes. It is also recommended that these projects provide both a 'dev' (development) and 'master' (production) branch which tracks the current project branches of those names. This is because dev and master are often not compatible from the viewpoint of library interfaces. It is also highly recommended that your repository versions are tagged and moved forward within 24 hours of project releases. This is a major inconvenience for everybdy involved, and can present downtime for production sites while this process is being carried out; which is one more reason why we [b]strongly recommend[/b] that addons be submitted to the project addon repository and that you do NOT install such third-party addons.
|
||||||
|
|
||||||
|
|
||||||
[url=https://github.com/redmatrix/hubzilla-addons]https://github.com/redmatrix/hubzilla-addons[/url] Main project addon repository
|
[url=https://github.com/redmatrix/hubzilla-addons]https://github.com/redmatrix/hubzilla-addons[/url] Main project addon repository
|
||||||
|
|
||||||
[url=https://github.com/23n/red-addons]https://github.com/23n/red-addons[/url] Oliver's repository (mayan_places and flip)
|
[url=https://github.com/23n/red-addons]https://github.com/23n/red-addons[/url] Oliver's repository (mayan_places and flip)
|
||||||
|
@ -60,201 +60,33 @@ function del_config($family, $key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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
|
|
||||||
*/
|
|
||||||
|
|
||||||
function load_pconfig($uid) {
|
function load_pconfig($uid) {
|
||||||
|
|
||||||
if($uid === false)
|
Zlib\PConfig::Load($uid);
|
||||||
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
|
|
||||||
*/
|
|
||||||
function get_pconfig($uid, $family, $key, $instore = false) {
|
function get_pconfig($uid, $family, $key, $instore = false) {
|
||||||
// logger('include/config.php: get_pconfig() deprecated instore param used', LOGGER_DEBUG);
|
|
||||||
|
|
||||||
if($uid === false)
|
return Zlib\PConfig::Get($uid,$family,$key,$instore = false);
|
||||||
return false;
|
|
||||||
|
|
||||||
if(! array_key_exists($uid, App::$config))
|
|
||||||
load_pconfig($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.
|
|
||||||
*
|
|
||||||
* @note Please do not store booleans - convert to 0/1 integer values!
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*/
|
|
||||||
function set_pconfig($uid, $family, $key, $value) {
|
function set_pconfig($uid, $family, $key, $value) {
|
||||||
|
|
||||||
// this catches subtle errors where this function has been called
|
return Zlib\PConfig::Set($uid,$family,$key,$value);
|
||||||
// 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();
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
$ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
|
|
||||||
intval($uid),
|
|
||||||
dbesc($family),
|
|
||||||
dbesc($key),
|
|
||||||
dbesc($dbvalue)
|
|
||||||
);
|
|
||||||
if($ret)
|
|
||||||
return $value;
|
|
||||||
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
$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
|
|
||||||
*/
|
|
||||||
function del_pconfig($uid, $family, $key) {
|
function del_pconfig($uid, $family, $key) {
|
||||||
|
|
||||||
$ret = false;
|
return Zlib\PConfig::Delete($uid,$family,$key);
|
||||||
|
|
||||||
if (x(App::$config[$uid][$family], $key))
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Loads a full xchan's configuration into a cached storage.
|
* @brief Loads a full xchan's configuration into a cached storage.
|
||||||
*
|
*
|
||||||
|
@ -1166,7 +1166,7 @@ function list_smilies() {
|
|||||||
if(strpos($e['shortname'],':tone') === 0)
|
if(strpos($e['shortname'],':tone') === 0)
|
||||||
continue;
|
continue;
|
||||||
$texts[] = $e['shortname'];
|
$texts[] = $e['shortname'];
|
||||||
$icons[] = '<img height="16" width="16" src="images/emoji/' . $e['unicode'] . '.png' . '" alt="' . $e['name'] . '" />';
|
$icons[] = '<img class="smiley emoji" height="16" width="16" src="images/emoji/' . $e['unicode'] . '.png' . '" alt="' . $e['name'] . '" />';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1378,7 +1378,7 @@ function widget_admin($arr) {
|
|||||||
|
|
||||||
$aside = array(
|
$aside = array(
|
||||||
'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
|
'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
|
||||||
'users' => array(z_root() . '/admin/users/', t('Accounts'), 'users', 'pending-update', t('Member registrations waiting for confirmation')),
|
'accounts' => array(z_root() . '/admin/accounts/', t('Accounts'), 'accounts', 'pending-update', t('Member registrations waiting for confirmation')),
|
||||||
'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
|
'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
|
||||||
'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
|
'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
|
||||||
'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
|
'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
|
||||||
|
@ -17,7 +17,6 @@ EOT;
|
|||||||
require_once('include/cli_startup.php');
|
require_once('include/cli_startup.php');
|
||||||
|
|
||||||
cli_startup();
|
cli_startup();
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
$plugs = get_config('system', 'addon');
|
$plugs = get_config('system', 'addon');
|
||||||
$plugins_arr = array();
|
$plugins_arr = array();
|
||||||
|
27
util/safemode
Executable file
27
util/safemode
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ $# == 0 ] ; then
|
||||||
|
echo Usage: $0 on '|' $0 off
|
||||||
|
echo on saves current addons to addons-safemode and uninstalls all of them
|
||||||
|
echo off installs all addons in addons-safemode
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $1 == 'on' ] ; then
|
||||||
|
util/addons list > addons-safemode
|
||||||
|
for a in `cat addons-safemode` ; do
|
||||||
|
util/addons uninstall $a
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $1 == 'off' ] ; then
|
||||||
|
for a in `cat addons-safemode` ; do
|
||||||
|
util/addons install $a
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -312,3 +312,8 @@ code.inline-code {
|
|||||||
.overline {
|
.overline {
|
||||||
text-decoration: overline;
|
text-decoration: overline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img.smiley.emoji:hover {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -183,7 +183,7 @@ function string2bb(element) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
smilies = {
|
smilies = {
|
||||||
match: /(^|\s)(:[a-z]{2,})$/,
|
match: /(^|\s)(:[a-z_:]{2,})$/,
|
||||||
index: 2,
|
index: 2,
|
||||||
search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); },
|
search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); },
|
||||||
template: function(item) { return item.icon + item.text; },
|
template: function(item) { return item.icon + item.text; },
|
||||||
|
5431
view/nl/hmessages.po
5431
view/nl/hmessages.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -13,7 +13,7 @@
|
|||||||
<div class="generic-content-wrapper-styled" id="adminpage">
|
<div class="generic-content-wrapper-styled" id="adminpage">
|
||||||
<h1>{{$title}} - {{$page}}</h1>
|
<h1>{{$title}} - {{$page}}</h1>
|
||||||
|
|
||||||
<form action="{{$baseurl}}/admin/users" method="post">
|
<form action="{{$baseurl}}/admin/accounts" method="post">
|
||||||
<input type="hidden" name="form_security_token" value="{{$form_security_token}}">
|
<input type="hidden" name="form_security_token" value="{{$form_security_token}}">
|
||||||
|
|
||||||
<h3>{{$h_pending}}</h3>
|
<h3>{{$h_pending}}</h3>
|
||||||
@ -52,7 +52,7 @@
|
|||||||
<table id="users">
|
<table id="users">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
{{foreach $th_users as $th}}<th>{{$th}}</th>{{/foreach}}
|
{{foreach $th_users as $th}}<th><a href="{{$base}}&key={{$th.1}}&dir={{$odir}}">{{$th.0}}</a></th>{{/foreach}}
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
@ -73,7 +73,7 @@
|
|||||||
<td class="service_class">{{$u.account_service_class}}</td>
|
<td class="service_class">{{$u.account_service_class}}</td>
|
||||||
<td class="checkbox_bulkedit"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.account_id}}" name="user[]" value="{{$u.account_id}}"><input type="hidden" name="blocked[]" value="{{$u.blocked}}"></td>
|
<td class="checkbox_bulkedit"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.account_id}}" name="user[]" value="{{$u.account_id}}"><input type="hidden" name="blocked[]" value="{{$u.blocked}}"></td>
|
||||||
<td class="tools">
|
<td class="tools">
|
||||||
<a href="{{$baseurl}}/admin/users/{{if ($u.blocked)}}un{{/if}}block/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class="fa fa-ban admin-icons{{if ($u.blocked)}} dim{{/if}}"></i></a><a href="{{$baseurl}}/admin/users/delete/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class="fa fa-trash-o admin-icons"></i></a>
|
<a href="{{$baseurl}}/admin/accounts/{{if ($u.blocked)}}un{{/if}}block/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class="fa fa-ban admin-icons{{if ($u.blocked)}} dim{{/if}}"></i></a><a href="{{$baseurl}}/admin/accounts/delete/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class="fa fa-trash-o admin-icons"></i></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/foreach}}
|
{{/foreach}}
|
@ -21,7 +21,7 @@
|
|||||||
<table id='channels'>
|
<table id='channels'>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
{{foreach $th_channels as $th}}<th>{{$th}}</th>{{/foreach}}
|
{{foreach $th_channels as $th}}<th><a href="{{$base}}&key={{$th.1}}&dir={{$odir}}">{{$th.0}}</a></th>{{/foreach}}
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
Reference in New Issue
Block a user