Fix EOL and EOF in Admin modules

This commit is contained in:
Hypolite Petovan 2019-05-02 00:01:43 -04:00
parent 2a035b9b2f
commit 92b415bc36
19 changed files with 1770 additions and 1760 deletions

View file

@ -1,122 +1,122 @@
<?php <?php
namespace Friendica\Module\Admin\Addons; namespace Friendica\Module\Admin\Addons;
use Friendica\Content\Text\Markdown; use Friendica\Content\Text\Markdown;
use Friendica\Core\Addon; use Friendica\Core\Addon;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class Details extends BaseAdminModule class Details extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$addon = $a->argv[2]; $addon = $a->argv[2];
$addon = Strings::sanitizeFilePathItem($addon); $addon = Strings::sanitizeFilePathItem($addon);
if (is_file('addon/' . $addon . '/' . $addon . '.php')) { if (is_file('addon/' . $addon . '/' . $addon . '.php')) {
include_once 'addon/' . $addon . '/' . $addon . '.php'; include_once 'addon/' . $addon . '/' . $addon . '.php';
if (function_exists($addon . '_addon_admin_post')) { if (function_exists($addon . '_addon_admin_post')) {
$func = $addon . '_addon_admin_post'; $func = $addon . '_addon_admin_post';
$func($a); $func($a);
} }
$a->internalRedirect('admin/addons/' . $addon); $a->internalRedirect('admin/addons/' . $addon);
} }
} }
$a->internalRedirect('admin/addons'); $a->internalRedirect('admin/addons');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
$addons_admin = Addon::getAdminList(); $addons_admin = Addon::getAdminList();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$addon = $a->argv[2]; $addon = $a->argv[2];
$addon = Strings::sanitizeFilePathItem($addon); $addon = Strings::sanitizeFilePathItem($addon);
if (!is_file("addon/$addon/$addon.php")) { if (!is_file("addon/$addon/$addon.php")) {
notice(L10n::t('Item not found.')); notice(L10n::t('Item not found.'));
$a->internalRedirect('admin/addons'); $a->internalRedirect('admin/addons');
} }
if (defaults($_GET, 'action', '') == 'toggle') { if (defaults($_GET, 'action', '') == 'toggle') {
parent::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_themes', 't'); parent::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_themes', 't');
// Toggle addon status // Toggle addon status
if (Addon::isEnabled($addon)) { if (Addon::isEnabled($addon)) {
Addon::uninstall($addon); Addon::uninstall($addon);
info(L10n::t('Addon %s disabled.', $addon)); info(L10n::t('Addon %s disabled.', $addon));
} else { } else {
Addon::install($addon); Addon::install($addon);
info(L10n::t('Addon %s enabled.', $addon)); info(L10n::t('Addon %s enabled.', $addon));
} }
Addon::saveEnabledList(); Addon::saveEnabledList();
$a->internalRedirect('admin/addons/' . $addon); $a->internalRedirect('admin/addons/' . $addon);
} }
// display addon details // display addon details
if (Addon::isEnabled($addon)) { if (Addon::isEnabled($addon)) {
$status = 'on'; $status = 'on';
$action = L10n::t('Disable'); $action = L10n::t('Disable');
} else { } else {
$status = 'off'; $status = 'off';
$action = L10n::t('Enable'); $action = L10n::t('Enable');
} }
$readme = null; $readme = null;
if (is_file("addon/$addon/README.md")) { if (is_file("addon/$addon/README.md")) {
$readme = Markdown::convert(file_get_contents("addon/$addon/README.md"), false); $readme = Markdown::convert(file_get_contents("addon/$addon/README.md"), false);
} elseif (is_file("addon/$addon/README")) { } elseif (is_file("addon/$addon/README")) {
$readme = '<pre>' . file_get_contents("addon/$addon/README") . '</pre>'; $readme = '<pre>' . file_get_contents("addon/$addon/README") . '</pre>';
} }
$admin_form = ''; $admin_form = '';
if (array_key_exists($addon, $addons_admin)) { if (array_key_exists($addon, $addons_admin)) {
require_once "addon/$addon/$addon.php"; require_once "addon/$addon/$addon.php";
$func = $addon . '_addon_admin'; $func = $addon . '_addon_admin';
$func($a, $admin_form); $func($a, $admin_form);
} }
$t = Renderer::getMarkupTemplate('admin/addons/details.tpl'); $t = Renderer::getMarkupTemplate('admin/addons/details.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Addons'), '$page' => L10n::t('Addons'),
'$toggle' => L10n::t('Toggle'), '$toggle' => L10n::t('Toggle'),
'$settings' => L10n::t('Settings'), '$settings' => L10n::t('Settings'),
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$addon' => $addon, '$addon' => $addon,
'$status' => $status, '$status' => $status,
'$action' => $action, '$action' => $action,
'$info' => Addon::getInfo($addon), '$info' => Addon::getInfo($addon),
'$str_author' => L10n::t('Author: '), '$str_author' => L10n::t('Author: '),
'$str_maintainer' => L10n::t('Maintainer: '), '$str_maintainer' => L10n::t('Maintainer: '),
'$admin_form' => $admin_form, '$admin_form' => $admin_form,
'$function' => 'addons', '$function' => 'addons',
'$screenshot' => '', '$screenshot' => '',
'$readme' => $readme, '$readme' => $readme,
'$form_security_token' => parent::getFormSecurityToken('admin_themes'), '$form_security_token' => parent::getFormSecurityToken('admin_themes'),
]); ]);
} }
$a->internalRedirect('admin/addons'); $a->internalRedirect('admin/addons');
} }
} }

View file

@ -1,62 +1,62 @@
<?php <?php
namespace Friendica\Module\Admin\Addons; namespace Friendica\Module\Admin\Addons;
use Friendica\Core\Addon; use Friendica\Core\Addon;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
class Index extends BaseAdminModule class Index extends BaseAdminModule
{ {
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
// reload active themes // reload active themes
if (!empty($_GET['action'])) { if (!empty($_GET['action'])) {
parent::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_addons', 't'); parent::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_addons', 't');
switch ($_GET['action']) { switch ($_GET['action']) {
case 'reload': case 'reload':
Addon::reload(); Addon::reload();
info('Addons reloaded'); info('Addons reloaded');
break; break;
case 'toggle' : case 'toggle' :
$addon = defaults($_GET, 'addon', ''); $addon = defaults($_GET, 'addon', '');
if (Addon::isEnabled($addon)) { if (Addon::isEnabled($addon)) {
Addon::uninstall($addon); Addon::uninstall($addon);
info(L10n::t('Addon %s disabled.', $addon)); info(L10n::t('Addon %s disabled.', $addon));
} elseif (Addon::install($addon)) { } elseif (Addon::install($addon)) {
info(L10n::t('Addon %s enabled.', $addon)); info(L10n::t('Addon %s enabled.', $addon));
} else { } else {
info(L10n::t('Addon %s failed to install.', $addon)); info(L10n::t('Addon %s failed to install.', $addon));
} }
break; break;
} }
$a->internalRedirect('admin/addons'); $a->internalRedirect('admin/addons');
} }
$addons = Addon::getAvailableList(); $addons = Addon::getAvailableList();
$t = Renderer::getMarkupTemplate('admin/addons/index.tpl'); $t = Renderer::getMarkupTemplate('admin/addons/index.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Addons'), '$page' => L10n::t('Addons'),
'$submit' => L10n::t('Save Settings'), '$submit' => L10n::t('Save Settings'),
'$reload' => L10n::t('Reload active addons'), '$reload' => L10n::t('Reload active addons'),
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$function' => 'addons', '$function' => 'addons',
'$addons' => $addons, '$addons' => $addons,
'$pcount' => count($addons), '$pcount' => count($addons),
'$noplugshint' => L10n::t('There are currently no addons available on your node. You can find the official addon repository at %1$s and might find other interesting addons in the open addon registry at %2$s', 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'), '$noplugshint' => L10n::t('There are currently no addons available on your node. You can find the official addon repository at %1$s and might find other interesting addons in the open addon registry at %2$s', 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'),
'$form_security_token' => parent::getFormSecurityToken('admin_addons'), '$form_security_token' => parent::getFormSecurityToken('admin_addons'),
]); ]);
} }
} }

View file

@ -1,86 +1,86 @@
<?php <?php
namespace Friendica\Module\Admin\Blocklist; namespace Friendica\Module\Admin\Blocklist;
use Friendica\Content\Pager; use Friendica\Content\Pager;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Model; use Friendica\Model;
class Contact extends BaseAdminModule class Contact extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
$contact_url = defaults($_POST, 'contact_url', ''); $contact_url = defaults($_POST, 'contact_url', '');
$contacts = defaults($_POST, 'contacts', []); $contacts = defaults($_POST, 'contacts', []);
parent::checkFormSecurityTokenRedirectOnError('/admin/blocklist/contact', 'admin_contactblock'); parent::checkFormSecurityTokenRedirectOnError('/admin/blocklist/contact', 'admin_contactblock');
if (!empty($_POST['page_contactblock_block'])) { if (!empty($_POST['page_contactblock_block'])) {
$contact_id = Model\Contact::getIdForURL($contact_url); $contact_id = Model\Contact::getIdForURL($contact_url);
if ($contact_id) { if ($contact_id) {
Model\Contact::block($contact_id); Model\Contact::block($contact_id);
notice(L10n::t('The contact has been blocked from the node')); notice(L10n::t('The contact has been blocked from the node'));
} else { } else {
notice(L10n::t("Could not find any contact entry for this URL \x28%s\x29", $contact_url)); notice(L10n::t("Could not find any contact entry for this URL \x28%s\x29", $contact_url));
} }
} }
if (!empty($_POST['page_contactblock_unblock'])) { if (!empty($_POST['page_contactblock_unblock'])) {
foreach ($contacts as $uid) { foreach ($contacts as $uid) {
Model\Contact::unblock($uid); Model\Contact::unblock($uid);
} }
notice(L10n::tt("%s contact unblocked", "%s contacts unblocked", count($contacts))); notice(L10n::tt("%s contact unblocked", "%s contacts unblocked", count($contacts)));
} }
self::getApp()->internalRedirect('admin/blocklist/contact'); self::getApp()->internalRedirect('admin/blocklist/contact');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
$condition = ['uid' => 0, 'blocked' => true]; $condition = ['uid' => 0, 'blocked' => true];
$total = DBA::count('contact', $condition); $total = DBA::count('contact', $condition);
$pager = new Pager($a->query_string, 30); $pager = new Pager($a->query_string, 30);
$contacts = Model\Contact::select([], $condition, ['limit' => [$pager->getStart(), $pager->getItemsPerPage()]]); $contacts = Model\Contact::select([], $condition, ['limit' => [$pager->getStart(), $pager->getItemsPerPage()]]);
$t = Renderer::getMarkupTemplate('admin/blocklist/contact.tpl'); $t = Renderer::getMarkupTemplate('admin/blocklist/contact.tpl');
$o = Renderer::replaceMacros($t, [ $o = Renderer::replaceMacros($t, [
// strings // // strings //
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Remote Contact Blocklist'), '$page' => L10n::t('Remote Contact Blocklist'),
'$description' => L10n::t('This page allows you to prevent any message from a remote contact to reach your node.'), '$description' => L10n::t('This page allows you to prevent any message from a remote contact to reach your node.'),
'$submit' => L10n::t('Block Remote Contact'), '$submit' => L10n::t('Block Remote Contact'),
'$select_all' => L10n::t('select all'), '$select_all' => L10n::t('select all'),
'$select_none' => L10n::t('select none'), '$select_none' => L10n::t('select none'),
'$block' => L10n::t('Block'), '$block' => L10n::t('Block'),
'$unblock' => L10n::t('Unblock'), '$unblock' => L10n::t('Unblock'),
'$no_data' => L10n::t('No remote contact is blocked from this node.'), '$no_data' => L10n::t('No remote contact is blocked from this node.'),
'$h_contacts' => L10n::t('Blocked Remote Contacts'), '$h_contacts' => L10n::t('Blocked Remote Contacts'),
'$h_newblock' => L10n::t('Block New Remote Contact'), '$h_newblock' => L10n::t('Block New Remote Contact'),
'$th_contacts' => [L10n::t('Photo'), L10n::t('Name'), L10n::t('Address'), L10n::t('Profile URL')], '$th_contacts' => [L10n::t('Photo'), L10n::t('Name'), L10n::t('Address'), L10n::t('Profile URL')],
'$form_security_token' => parent::getFormSecurityToken("admin_contactblock"), '$form_security_token' => parent::getFormSecurityToken("admin_contactblock"),
// values // // values //
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$contacts' => $contacts, '$contacts' => $contacts,
'$total_contacts' => L10n::tt('%s total blocked contact', '%s total blocked contacts', $total), '$total_contacts' => L10n::tt('%s total blocked contact', '%s total blocked contacts', $total),
'$paginate' => $pager->renderFull($total), '$paginate' => $pager->renderFull($total),
'$contacturl' => ['contact_url', L10n::t("Profile URL"), '', L10n::t("URL of the remote contact to block.")], '$contacturl' => ['contact_url', L10n::t("Profile URL"), '', L10n::t("URL of the remote contact to block.")],
]); ]);
return $o; return $o;
} }
} }

View file

@ -1,92 +1,92 @@
<?php <?php
namespace Friendica\Module\Admin\Blocklist; namespace Friendica\Module\Admin\Blocklist;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class Server extends BaseAdminModule class Server extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
if (empty($_POST['page_blocklist_save']) && empty($_POST['page_blocklist_edit'])) { if (empty($_POST['page_blocklist_save']) && empty($_POST['page_blocklist_edit'])) {
return; return;
} }
parent::checkFormSecurityTokenRedirectOnError('/admin/blocklist/server', 'admin_blocklist'); parent::checkFormSecurityTokenRedirectOnError('/admin/blocklist/server', 'admin_blocklist');
if (!empty($_POST['page_blocklist_save'])) { if (!empty($_POST['page_blocklist_save'])) {
// Add new item to blocklist // Add new item to blocklist
$blocklist = Config::get('system', 'blocklist'); $blocklist = Config::get('system', 'blocklist');
$blocklist[] = [ $blocklist[] = [
'domain' => Strings::escapeTags(trim($_POST['newentry_domain'])), 'domain' => Strings::escapeTags(trim($_POST['newentry_domain'])),
'reason' => Strings::escapeTags(trim($_POST['newentry_reason'])) 'reason' => Strings::escapeTags(trim($_POST['newentry_reason']))
]; ];
Config::set('system', 'blocklist', $blocklist); Config::set('system', 'blocklist', $blocklist);
info(L10n::t('Server added to blocklist.') . EOL); info(L10n::t('Server added to blocklist.') . EOL);
} else { } else {
// Edit the entries from blocklist // Edit the entries from blocklist
$blocklist = []; $blocklist = [];
foreach ($_POST['domain'] as $id => $domain) { foreach ($_POST['domain'] as $id => $domain) {
// Trimming whitespaces as well as any lingering slashes // Trimming whitespaces as well as any lingering slashes
$domain = Strings::escapeTags(trim($domain, "\x00..\x1F/")); $domain = Strings::escapeTags(trim($domain, "\x00..\x1F/"));
$reason = Strings::escapeTags(trim($_POST['reason'][$id])); $reason = Strings::escapeTags(trim($_POST['reason'][$id]));
if (empty($_POST['delete'][$id])) { if (empty($_POST['delete'][$id])) {
$blocklist[] = [ $blocklist[] = [
'domain' => $domain, 'domain' => $domain,
'reason' => $reason 'reason' => $reason
]; ];
} }
} }
Config::set('system', 'blocklist', $blocklist); Config::set('system', 'blocklist', $blocklist);
info(L10n::t('Site blocklist updated.') . EOL); info(L10n::t('Site blocklist updated.') . EOL);
} }
self::getApp()->internalRedirect('admin/blocklist/server'); self::getApp()->internalRedirect('admin/blocklist/server');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
$blocklist = Config::get('system', 'blocklist'); $blocklist = Config::get('system', 'blocklist');
$blocklistform = []; $blocklistform = [];
if (is_array($blocklist)) { if (is_array($blocklist)) {
foreach ($blocklist as $id => $b) { foreach ($blocklist as $id => $b) {
$blocklistform[] = [ $blocklistform[] = [
'domain' => ["domain[$id]", L10n::t('Blocked domain'), $b['domain'], '', L10n::t('The blocked domain'), 'required', '', ''], 'domain' => ["domain[$id]", L10n::t('Blocked domain'), $b['domain'], '', L10n::t('The blocked domain'), 'required', '', ''],
'reason' => ["reason[$id]", L10n::t("Reason for the block"), $b['reason'], L10n::t('The reason why you blocked this domain.') . '(' . $b['domain'] . ')', 'required', '', ''], 'reason' => ["reason[$id]", L10n::t("Reason for the block"), $b['reason'], L10n::t('The reason why you blocked this domain.') . '(' . $b['domain'] . ')', 'required', '', ''],
'delete' => ["delete[$id]", L10n::t("Delete domain") . ' (' . $b['domain'] . ')', false, L10n::t("Check to delete this entry from the blocklist")] 'delete' => ["delete[$id]", L10n::t("Delete domain") . ' (' . $b['domain'] . ')', false, L10n::t("Check to delete this entry from the blocklist")]
]; ];
} }
} }
$t = Renderer::getMarkupTemplate('admin/blocklist/server.tpl'); $t = Renderer::getMarkupTemplate('admin/blocklist/server.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Server Blocklist'), '$page' => L10n::t('Server Blocklist'),
'$intro' => L10n::t('This page can be used to define a black list of servers from the federated network that are not allowed to interact with your node. For all entered domains you should also give a reason why you have blocked the remote server.'), '$intro' => L10n::t('This page can be used to define a black list of servers from the federated network that are not allowed to interact with your node. For all entered domains you should also give a reason why you have blocked the remote server.'),
'$public' => L10n::t('The list of blocked servers will be made publically available on the /friendica page so that your users and people investigating communication problems can find the reason easily.'), '$public' => L10n::t('The list of blocked servers will be made publically available on the /friendica page so that your users and people investigating communication problems can find the reason easily.'),
'$addtitle' => L10n::t('Add new entry to block list'), '$addtitle' => L10n::t('Add new entry to block list'),
'$newdomain' => ['newentry_domain', L10n::t('Server Domain'), '', L10n::t('The domain of the new server to add to the block list. Do not include the protocol.'), 'required', '', ''], '$newdomain' => ['newentry_domain', L10n::t('Server Domain'), '', L10n::t('The domain of the new server to add to the block list. Do not include the protocol.'), 'required', '', ''],
'$newreason' => ['newentry_reason', L10n::t('Block reason'), '', L10n::t('The reason why you blocked this domain.'), 'required', '', ''], '$newreason' => ['newentry_reason', L10n::t('Block reason'), '', L10n::t('The reason why you blocked this domain.'), 'required', '', ''],
'$submit' => L10n::t('Add Entry'), '$submit' => L10n::t('Add Entry'),
'$savechanges' => L10n::t('Save changes to the blocklist'), '$savechanges' => L10n::t('Save changes to the blocklist'),
'$currenttitle' => L10n::t('Current Entries in the Blocklist'), '$currenttitle' => L10n::t('Current Entries in the Blocklist'),
'$thurl' => L10n::t('Blocked domain'), '$thurl' => L10n::t('Blocked domain'),
'$threason' => L10n::t('Reason for the block'), '$threason' => L10n::t('Reason for the block'),
'$delentry' => L10n::t('Delete entry from blocklist'), '$delentry' => L10n::t('Delete entry from blocklist'),
'$entries' => $blocklistform, '$entries' => $blocklistform,
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$confirm_delete' => L10n::t('Delete entry from blocklist?'), '$confirm_delete' => L10n::t('Delete entry from blocklist?'),
'$form_security_token' => parent::getFormSecurityToken("admin_blocklist") '$form_security_token' => parent::getFormSecurityToken("admin_blocklist")
]); ]);
} }
} }

View file

@ -1,107 +1,107 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Update; use Friendica\Core\Update;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure; use Friendica\Database\DBStructure;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
class DBSync extends BaseAdminModule class DBSync extends BaseAdminModule
{ {
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
$o = ''; $o = '';
if ($a->argc > 3 && $a->argv[2] === 'mark') { if ($a->argc > 3 && $a->argv[2] === 'mark') {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$update = intval($a->argv[3]); $update = intval($a->argv[3]);
if ($update) { if ($update) {
Config::set('database', 'update_' . $update, 'success'); Config::set('database', 'update_' . $update, 'success');
$curr = Config::get('system', 'build'); $curr = Config::get('system', 'build');
if (intval($curr) == $update) { if (intval($curr) == $update) {
Config::set('system', 'build', intval($curr) + 1); Config::set('system', 'build', intval($curr) + 1);
} }
info(L10n::t('Update has been marked successful') . EOL); info(L10n::t('Update has been marked successful') . EOL);
} }
$a->internalRedirect('admin/dbsync'); $a->internalRedirect('admin/dbsync');
} }
if ($a->argc > 2) { if ($a->argc > 2) {
if ($a->argv[2] === 'check') { if ($a->argv[2] === 'check') {
// @TODO Seems like a similar logic like Update::check() // @TODO Seems like a similar logic like Update::check()
$retval = DBStructure::update($a->getBasePath(), false, true); $retval = DBStructure::update($a->getBasePath(), false, true);
if ($retval === '') { if ($retval === '') {
$o .= L10n::t("Database structure update %s was successfully applied.", DB_UPDATE_VERSION) . "<br />"; $o .= L10n::t("Database structure update %s was successfully applied.", DB_UPDATE_VERSION) . "<br />";
Config::set('database', 'last_successful_update', DB_UPDATE_VERSION); Config::set('database', 'last_successful_update', DB_UPDATE_VERSION);
Config::set('database', 'last_successful_update_time', time()); Config::set('database', 'last_successful_update_time', time());
} else { } else {
$o .= L10n::t("Executing of database structure update %s failed with error: %s", DB_UPDATE_VERSION, $retval) . "<br />"; $o .= L10n::t("Executing of database structure update %s failed with error: %s", DB_UPDATE_VERSION, $retval) . "<br />";
} }
if ($a->argv[2] === 'check') { if ($a->argv[2] === 'check') {
return $o; return $o;
} }
} elseif (intval($a->argv[2])) { } elseif (intval($a->argv[2])) {
require_once 'update.php'; require_once 'update.php';
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$update = intval($a->argv[2]); $update = intval($a->argv[2]);
$func = 'update_' . $update; $func = 'update_' . $update;
if (function_exists($func)) { if (function_exists($func)) {
$retval = $func(); $retval = $func();
if ($retval === Update::FAILED) { if ($retval === Update::FAILED) {
$o .= L10n::t("Executing %s failed with error: %s", $func, $retval); $o .= L10n::t("Executing %s failed with error: %s", $func, $retval);
} elseif ($retval === Update::SUCCESS) { } elseif ($retval === Update::SUCCESS) {
$o .= L10n::t('Update %s was successfully applied.', $func); $o .= L10n::t('Update %s was successfully applied.', $func);
Config::set('database', $func, 'success'); Config::set('database', $func, 'success');
} else { } else {
$o .= L10n::t('Update %s did not return a status. Unknown if it succeeded.', $func); $o .= L10n::t('Update %s did not return a status. Unknown if it succeeded.', $func);
} }
} else { } else {
$o .= L10n::t('There was no additional update function %s that needed to be called.', $func) . "<br />"; $o .= L10n::t('There was no additional update function %s that needed to be called.', $func) . "<br />";
Config::set('database', $func, 'success'); Config::set('database', $func, 'success');
} }
return $o; return $o;
} }
} }
$failed = []; $failed = [];
$configStmt = DBA::select('config', ['k', 'v'], ['cat' => 'database']); $configStmt = DBA::select('config', ['k', 'v'], ['cat' => 'database']);
while ($config = DBA::fetch($configStmt)) { while ($config = DBA::fetch($configStmt)) {
$upd = intval(substr($config['k'], 7)); $upd = intval(substr($config['k'], 7));
if ($upd >= 1139 && $config['v'] != 'success') { if ($upd >= 1139 && $config['v'] != 'success') {
$failed[] = $upd; $failed[] = $upd;
} }
} }
if (!count($failed)) { if (!count($failed)) {
$o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/structure_check.tpl'), [ $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/structure_check.tpl'), [
'$base' => $a->getBaseURL(true), '$base' => $a->getBaseURL(true),
'$banner' => L10n::t('No failed updates.'), '$banner' => L10n::t('No failed updates.'),
'$check' => L10n::t('Check database structure'), '$check' => L10n::t('Check database structure'),
]); ]);
} else { } else {
$o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/failed_updates.tpl'), [ $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/failed_updates.tpl'), [
'$base' => $a->getBaseURL(true), '$base' => $a->getBaseURL(true),
'$banner' => L10n::t('Failed Updates'), '$banner' => L10n::t('Failed Updates'),
'$desc' => L10n::t('This does not include updates prior to 1139, which did not return a status.'), '$desc' => L10n::t('This does not include updates prior to 1139, which did not return a status.'),
'$mark' => L10n::t("Mark success \x28if update was manually applied\x29"), '$mark' => L10n::t("Mark success \x28if update was manually applied\x29"),
'$apply' => L10n::t('Attempt to execute this update step automatically'), '$apply' => L10n::t('Attempt to execute this update step automatically'),
'$failed' => $failed '$failed' => $failed
]); ]);
} }
return $o; return $o;
} }
} }

View file

@ -1,74 +1,74 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
class Features extends BaseAdminModule class Features extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
parent::checkFormSecurityTokenRedirectOnError('/admin/features', 'admin_manage_features'); parent::checkFormSecurityTokenRedirectOnError('/admin/features', 'admin_manage_features');
$features = Feature::get(false); $features = Feature::get(false);
foreach ($features as $fname => $fdata) { foreach ($features as $fname => $fdata) {
foreach (array_slice($fdata, 1) as $f) { foreach (array_slice($fdata, 1) as $f) {
$feature = $f[0]; $feature = $f[0];
$feature_state = 'feature_' . $feature; $feature_state = 'feature_' . $feature;
$featurelock = 'featurelock_' . $feature; $featurelock = 'featurelock_' . $feature;
if (!empty($_POST[$feature_state])) { if (!empty($_POST[$feature_state])) {
$val = intval($_POST[$feature_state]); $val = intval($_POST[$feature_state]);
} else { } else {
$val = 0; $val = 0;
} }
Config::set('feature', $feature, $val); Config::set('feature', $feature, $val);
if (!empty($_POST[$featurelock])) { if (!empty($_POST[$featurelock])) {
Config::set('feature_lock', $feature, $val); Config::set('feature_lock', $feature, $val);
} else { } else {
Config::delete('feature_lock', $feature); Config::delete('feature_lock', $feature);
} }
} }
} }
self::getApp()->internalRedirect('admin/features'); self::getApp()->internalRedirect('admin/features');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$arr = []; $arr = [];
$features = Feature::get(false); $features = Feature::get(false);
foreach ($features as $fname => $fdata) { foreach ($features as $fname => $fdata) {
$arr[$fname] = []; $arr[$fname] = [];
$arr[$fname][0] = $fdata[0]; $arr[$fname][0] = $fdata[0];
foreach (array_slice($fdata, 1) as $f) { foreach (array_slice($fdata, 1) as $f) {
$set = Config::get('feature', $f[0], $f[3]); $set = Config::get('feature', $f[0], $f[3]);
$arr[$fname][1][] = [ $arr[$fname][1][] = [
['feature_' . $f[0], $f[1], $set, $f[2], [L10n::t('Off'), L10n::t('On')]], ['feature_' . $f[0], $f[1], $set, $f[2], [L10n::t('Off'), L10n::t('On')]],
['featurelock_' . $f[0], L10n::t('Lock feature %s', $f[1]), (($f[4] !== false) ? "1" : ''), '', [L10n::t('Off'), L10n::t('On')]] ['featurelock_' . $f[0], L10n::t('Lock feature %s', $f[1]), (($f[4] !== false) ? "1" : ''), '', [L10n::t('Off'), L10n::t('On')]]
]; ];
} }
} }
$tpl = Renderer::getMarkupTemplate('admin/features.tpl'); $tpl = Renderer::getMarkupTemplate('admin/features.tpl');
$o = Renderer::replaceMacros($tpl, [ $o = Renderer::replaceMacros($tpl, [
'$form_security_token' => parent::getFormSecurityToken("admin_manage_features"), '$form_security_token' => parent::getFormSecurityToken("admin_manage_features"),
'$title' => L10n::t('Manage Additional Features'), '$title' => L10n::t('Manage Additional Features'),
'$features' => $arr, '$features' => $arr,
'$submit' => L10n::t('Save Settings'), '$submit' => L10n::t('Save Settings'),
]); ]);
return $o; return $o;
} }
} }

View file

@ -1,55 +1,55 @@
<?php <?php
namespace Friendica\Module\Admin\Item; namespace Friendica\Module\Admin\Item;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Model\Item; use Friendica\Model\Item;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class Delete extends BaseAdminModule class Delete extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
if (empty($_POST['page_deleteitem_submit'])) { if (empty($_POST['page_deleteitem_submit'])) {
return; return;
} }
parent::checkFormSecurityTokenRedirectOnError('/admin/item/delete', 'admin_deleteitem'); parent::checkFormSecurityTokenRedirectOnError('/admin/item/delete', 'admin_deleteitem');
if (!empty($_POST['page_deleteitem_submit'])) { if (!empty($_POST['page_deleteitem_submit'])) {
$guid = trim(Strings::escapeTags($_POST['deleteitemguid'])); $guid = trim(Strings::escapeTags($_POST['deleteitemguid']));
// The GUID should not include a "/", so if there is one, we got an URL // The GUID should not include a "/", so if there is one, we got an URL
// and the last part of it is most likely the GUID. // and the last part of it is most likely the GUID.
if (strpos($guid, '/')) { if (strpos($guid, '/')) {
$guid = substr($guid, strrpos($guid, '/') + 1); $guid = substr($guid, strrpos($guid, '/') + 1);
} }
// Now that we have the GUID, drop those items, which will also delete the // Now that we have the GUID, drop those items, which will also delete the
// associated threads. // associated threads.
Item::delete(['guid' => $guid]); Item::delete(['guid' => $guid]);
} }
info(L10n::t('Item marked for deletion.') . EOL); info(L10n::t('Item marked for deletion.') . EOL);
self::getApp()->internalRedirect('admin/item/delete'); self::getApp()->internalRedirect('admin/item/delete');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$t = Renderer::getMarkupTemplate('admin/item/delete.tpl'); $t = Renderer::getMarkupTemplate('admin/item/delete.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Delete Item'), '$page' => L10n::t('Delete Item'),
'$submit' => L10n::t('Delete this Item'), '$submit' => L10n::t('Delete this Item'),
'$intro1' => L10n::t('On this page you can delete an item from your node. If the item is a top level posting, the entire thread will be deleted.'), '$intro1' => L10n::t('On this page you can delete an item from your node. If the item is a top level posting, the entire thread will be deleted.'),
'$intro2' => L10n::t('You need to know the GUID of the item. You can find it e.g. by looking at the display URL. The last part of http://example.com/display/123456 is the GUID, here 123456.'), '$intro2' => L10n::t('You need to know the GUID of the item. You can find it e.g. by looking at the display URL. The last part of http://example.com/display/123456 is the GUID, here 123456.'),
'$deleteitemguid' => ['deleteitemguid', L10n::t("GUID"), '', L10n::t("The GUID of the item you want to delete."), 'required', 'autofocus'], '$deleteitemguid' => ['deleteitemguid', L10n::t("GUID"), '', L10n::t("The GUID of the item you want to delete."), 'required', 'autofocus'],
'$form_security_token' => parent::getFormSecurityToken("admin_deleteitem") '$form_security_token' => parent::getFormSecurityToken("admin_deleteitem")
]); ]);
} }
} }

View file

@ -1,74 +1,74 @@
<?php <?php
namespace Friendica\Module\Admin\Logs; namespace Friendica\Module\Admin\Logs;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use Psr\Log\LogLevel; use Psr\Log\LogLevel;
class Settings extends BaseAdminModule class Settings extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
if (!empty($_POST['page_logs'])) { if (!empty($_POST['page_logs'])) {
parent::checkFormSecurityTokenRedirectOnError('/admin/logs', 'admin_logs'); parent::checkFormSecurityTokenRedirectOnError('/admin/logs', 'admin_logs');
$logfile = (!empty($_POST['logfile']) ? Strings::escapeTags(trim($_POST['logfile'])) : ''); $logfile = (!empty($_POST['logfile']) ? Strings::escapeTags(trim($_POST['logfile'])) : '');
$debugging = !empty($_POST['debugging']); $debugging = !empty($_POST['debugging']);
$loglevel = defaults($_POST, 'loglevel', LogLevel::ERROR); $loglevel = defaults($_POST, 'loglevel', LogLevel::ERROR);
Config::set('system', 'logfile', $logfile); Config::set('system', 'logfile', $logfile);
Config::set('system', 'debugging', $debugging); Config::set('system', 'debugging', $debugging);
Config::set('system', 'loglevel', $loglevel); Config::set('system', 'loglevel', $loglevel);
} }
info(L10n::t("Log settings updated.")); info(L10n::t("Log settings updated."));
self::getApp()->internalRedirect('admin/logs'); self::getApp()->internalRedirect('admin/logs');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
$log_choices = [ $log_choices = [
LogLevel::ERROR => 'Error', LogLevel::ERROR => 'Error',
LogLevel::WARNING => 'Warning', LogLevel::WARNING => 'Warning',
LogLevel::NOTICE => 'Notice', LogLevel::NOTICE => 'Notice',
LogLevel::INFO => 'Info', LogLevel::INFO => 'Info',
LogLevel::DEBUG => 'Debug', LogLevel::DEBUG => 'Debug',
]; ];
if (ini_get('log_errors')) { if (ini_get('log_errors')) {
$phplogenabled = L10n::t('PHP log currently enabled.'); $phplogenabled = L10n::t('PHP log currently enabled.');
} else { } else {
$phplogenabled = L10n::t('PHP log currently disabled.'); $phplogenabled = L10n::t('PHP log currently disabled.');
} }
$t = Renderer::getMarkupTemplate('admin/logs/settings.tpl'); $t = Renderer::getMarkupTemplate('admin/logs/settings.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Logs'), '$page' => L10n::t('Logs'),
'$submit' => L10n::t('Save Settings'), '$submit' => L10n::t('Save Settings'),
'$clear' => L10n::t('Clear'), '$clear' => L10n::t('Clear'),
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$logname' => Config::get('system', 'logfile'), '$logname' => Config::get('system', 'logfile'),
// see /help/smarty3-templates#1_1 on any Friendica node // see /help/smarty3-templates#1_1 on any Friendica node
'$debugging' => ['debugging', L10n::t("Enable Debugging"), Config::get('system', 'debugging'), ""], '$debugging' => ['debugging', L10n::t("Enable Debugging"), Config::get('system', 'debugging'), ""],
'$logfile' => ['logfile', L10n::t("Log file"), Config::get('system', 'logfile'), L10n::t("Must be writable by web server. Relative to your Friendica top-level directory.")], '$logfile' => ['logfile', L10n::t("Log file"), Config::get('system', 'logfile'), L10n::t("Must be writable by web server. Relative to your Friendica top-level directory.")],
'$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices], '$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices],
'$form_security_token' => parent::getFormSecurityToken("admin_logs"), '$form_security_token' => parent::getFormSecurityToken("admin_logs"),
'$phpheader' => L10n::t("PHP logging"), '$phpheader' => L10n::t("PHP logging"),
'$phphint' => L10n::t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."), '$phphint' => L10n::t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."),
'$phplogcode' => "error_reporting(E_ERROR | E_WARNING | E_PARSE);\nini_set('error_log','php.out');\nini_set('log_errors','1');\nini_set('display_errors', '1');", '$phplogcode' => "error_reporting(E_ERROR | E_WARNING | E_PARSE);\nini_set('error_log','php.out');\nini_set('log_errors','1');\nini_set('display_errors', '1');",
'$phplogenabled' => $phplogenabled, '$phplogenabled' => $phplogenabled,
]); ]);
} }
} }

View file

@ -1,52 +1,52 @@
<?php <?php
namespace Friendica\Module\Admin\Logs; namespace Friendica\Module\Admin\Logs;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class View extends BaseAdminModule class View extends BaseAdminModule
{ {
public static function content() public static function content()
{ {
parent::content(); parent::content();
$t = Renderer::getMarkupTemplate('admin/logs/view.tpl'); $t = Renderer::getMarkupTemplate('admin/logs/view.tpl');
$f = Config::get('system', 'logfile'); $f = Config::get('system', 'logfile');
$data = ''; $data = '';
if (!file_exists($f)) { if (!file_exists($f)) {
$data = L10n::t('Error trying to open <strong>%1$s</strong> log file.\r\n<br/>Check to see if file %1$s exist and is readable.', $f); $data = L10n::t('Error trying to open <strong>%1$s</strong> log file.\r\n<br/>Check to see if file %1$s exist and is readable.', $f);
} else { } else {
$fp = fopen($f, 'r'); $fp = fopen($f, 'r');
if (!$fp) { if (!$fp) {
$data = L10n::t('Couldn\'t open <strong>%1$s</strong> log file.\r\n<br/>Check to see if file %1$s is readable.', $f); $data = L10n::t('Couldn\'t open <strong>%1$s</strong> log file.\r\n<br/>Check to see if file %1$s is readable.', $f);
} else { } else {
$fstat = fstat($fp); $fstat = fstat($fp);
$size = $fstat['size']; $size = $fstat['size'];
if ($size != 0) { if ($size != 0) {
if ($size > 5000000 || $size < 0) { if ($size > 5000000 || $size < 0) {
$size = 5000000; $size = 5000000;
} }
$seek = fseek($fp, 0 - $size, SEEK_END); $seek = fseek($fp, 0 - $size, SEEK_END);
if ($seek === 0) { if ($seek === 0) {
$data = Strings::escapeHtml(fread($fp, $size)); $data = Strings::escapeHtml(fread($fp, $size));
while (!feof($fp)) { while (!feof($fp)) {
$data .= Strings::escapeHtml(fread($fp, 4096)); $data .= Strings::escapeHtml(fread($fp, 4096));
} }
} }
} }
fclose($fp); fclose($fp);
} }
} }
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('View Logs'), '$page' => L10n::t('View Logs'),
'$data' => $data, '$data' => $data,
'$logname' => Config::get('system', 'logfile') '$logname' => Config::get('system', 'logfile')
]); ]);
} }
} }

View file

@ -1,16 +1,16 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
class PhpInfo extends BaseAdminModule class PhpInfo extends BaseAdminModule
{ {
public static function rawContent() public static function rawContent()
{ {
parent::rawContent(); parent::rawContent();
phpinfo(); phpinfo();
exit(); exit();
} }
} }

View file

@ -1,66 +1,66 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Arrays; use Friendica\Util\Arrays;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
/** /**
* @brief Admin Inspect Queue Page * @brief Admin Inspect Queue Page
* *
* Generates a page for the admin to have a look into the current queue of * Generates a page for the admin to have a look into the current queue of
* worker jobs. Shown are the parameters for the job and its priority. * worker jobs. Shown are the parameters for the job and its priority.
* *
* @return string * @return string
*/ */
class Queue extends BaseAdminModule class Queue extends BaseAdminModule
{ {
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$deferred = $a->argc > 2 && $a->argv[2] == 'deferred'; $deferred = $a->argc > 2 && $a->argv[2] == 'deferred';
// get jobs from the workerqueue table // get jobs from the workerqueue table
if ($deferred) { if ($deferred) {
$condition = ["NOT `done` AND `next_try` > ?", DateTimeFormat::utcNow()]; $condition = ["NOT `done` AND `next_try` > ?", DateTimeFormat::utcNow()];
$sub_title = L10n::t('Inspect Deferred Worker Queue'); $sub_title = L10n::t('Inspect Deferred Worker Queue');
$info = L10n::t("This page lists the deferred worker jobs. This are jobs that couldn't be executed at the first time."); $info = L10n::t("This page lists the deferred worker jobs. This are jobs that couldn't be executed at the first time.");
} else { } else {
$condition = ["NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()]; $condition = ["NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()];
$sub_title = L10n::t('Inspect Worker Queue'); $sub_title = L10n::t('Inspect Worker Queue');
$info = L10n::t('This page lists the currently queued worker jobs. These jobs are handled by the worker cronjob you\'ve set up during install.'); $info = L10n::t('This page lists the currently queued worker jobs. These jobs are handled by the worker cronjob you\'ve set up during install.');
} }
$entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], $condition, ['order' => ['priority']]); $entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], $condition, ['order' => ['priority']]);
$r = []; $r = [];
while ($entry = DBA::fetch($entries)) { while ($entry = DBA::fetch($entries)) {
// fix GH-5469. ref: src/Core/Worker.php:217 // fix GH-5469. ref: src/Core/Worker.php:217
$entry['parameter'] = Arrays::recursiveImplode(json_decode($entry['parameter'], true), ': '); $entry['parameter'] = Arrays::recursiveImplode(json_decode($entry['parameter'], true), ': ');
$entry['created'] = DateTimeFormat::local($entry['created']); $entry['created'] = DateTimeFormat::local($entry['created']);
$r[] = $entry; $r[] = $entry;
} }
DBA::close($entries); DBA::close($entries);
$t = Renderer::getMarkupTemplate('admin/queue.tpl'); $t = Renderer::getMarkupTemplate('admin/queue.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => $sub_title, '$page' => $sub_title,
'$count' => count($r), '$count' => count($r),
'$id_header' => L10n::t('ID'), '$id_header' => L10n::t('ID'),
'$param_header' => L10n::t('Job Parameters'), '$param_header' => L10n::t('Job Parameters'),
'$created_header' => L10n::t('Created'), '$created_header' => L10n::t('Created'),
'$prio_header' => L10n::t('Priority'), '$prio_header' => L10n::t('Priority'),
'$info' => $info, '$info' => $info,
'$entries' => $r, '$entries' => $r,
]); ]);
} }
} }

View file

@ -39,6 +39,7 @@ class Site extends BaseAdminModule
} }
// relocate // relocate
// @TODO This file could benefit from moving this feature away in a Module\Admin\Relocate class for example
if (!empty($_POST['relocate']) && !empty($_POST['relocate_url']) && $_POST['relocate_url'] != "") { if (!empty($_POST['relocate']) && !empty($_POST['relocate_url']) && $_POST['relocate_url'] != "") {
$new_url = $_POST['relocate_url']; $new_url = $_POST['relocate_url'];
$new_url = rtrim($new_url, "/"); $new_url = rtrim($new_url, "/");

View file

@ -1,147 +1,147 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Core\Addon; use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Update; use Friendica\Core\Update;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure; use Friendica\Database\DBStructure;
use Friendica\Model\Register; use Friendica\Model\Register;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network; use Friendica\Util\Network;
class Summary extends BaseAdminModule class Summary extends BaseAdminModule
{ {
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
// are there MyISAM tables in the DB? If so, trigger a warning message // are there MyISAM tables in the DB? If so, trigger a warning message
$warningtext = []; $warningtext = [];
if (DBA::count('`information_schema`.`tables`', ['engine' => 'myisam', 'table_schema' => DBA::databaseName()])) { if (DBA::count('`information_schema`.`tables`', ['engine' => 'myisam', 'table_schema' => DBA::databaseName()])) {
$warningtext[] = L10n::t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); $warningtext[] = L10n::t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html');
} }
// Check if github.com/friendica/master/VERSION is higher then // Check if github.com/friendica/master/VERSION is higher then
// the local version of Friendica. Check is opt-in, source may be master or devel branch // the local version of Friendica. Check is opt-in, source may be master or devel branch
if (Config::get('system', 'check_new_version_url', 'none') != 'none') { if (Config::get('system', 'check_new_version_url', 'none') != 'none') {
$gitversion = Config::get('system', 'git_friendica_version'); $gitversion = Config::get('system', 'git_friendica_version');
if (version_compare(FRIENDICA_VERSION, $gitversion) < 0) { if (version_compare(FRIENDICA_VERSION, $gitversion) < 0) {
$warningtext[] = L10n::t('There is a new version of Friendica available for download. Your current version is %1$s, upstream version is %2$s', FRIENDICA_VERSION, $gitversion); $warningtext[] = L10n::t('There is a new version of Friendica available for download. Your current version is %1$s, upstream version is %2$s', FRIENDICA_VERSION, $gitversion);
} }
} }
if (Config::get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) { if (Config::get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) {
DBStructure::update($a->getBasePath(), false, true); DBStructure::update($a->getBasePath(), false, true);
} }
if (Config::get('system', 'dbupdate') == DBStructure::UPDATE_FAILED) { if (Config::get('system', 'dbupdate') == DBStructure::UPDATE_FAILED) {
$warningtext[] = L10n::t('The database update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear.'); $warningtext[] = L10n::t('The database update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear.');
} }
if (Config::get('system', 'update') == Update::FAILED) { if (Config::get('system', 'update') == Update::FAILED) {
$warningtext[] = L10n::t('The last update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)'); $warningtext[] = L10n::t('The last update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)');
} }
$last_worker_call = Config::get('system', 'last_worker_execution', false); $last_worker_call = Config::get('system', 'last_worker_execution', false);
if (!$last_worker_call) { if (!$last_worker_call) {
$warningtext[] = L10n::t('The worker was never executed. Please check your database structure!'); $warningtext[] = L10n::t('The worker was never executed. Please check your database structure!');
} elseif ((strtotime(DateTimeFormat::utcNow()) - strtotime($last_worker_call)) > 60 * 60) { } elseif ((strtotime(DateTimeFormat::utcNow()) - strtotime($last_worker_call)) > 60 * 60) {
$warningtext[] = L10n::t('The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings.', $last_worker_call); $warningtext[] = L10n::t('The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings.', $last_worker_call);
} }
// Legacy config file warning // Legacy config file warning
if (file_exists('.htconfig.php')) { if (file_exists('.htconfig.php')) {
$warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>.htconfig.php</code>. See <a href="%s">the Config help page</a> for help with the transition.', $a->getBaseURL() . '/help/Config'); $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>.htconfig.php</code>. See <a href="%s">the Config help page</a> for help with the transition.', $a->getBaseURL() . '/help/Config');
} }
if (file_exists('config/local.ini.php')) { if (file_exists('config/local.ini.php')) {
$warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>config/local.ini.php</code>. See <a href="%s">the Config help page</a> for help with the transition.', $a->getBaseURL() . '/help/Config'); $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from <code>config/local.ini.php</code>. See <a href="%s">the Config help page</a> for help with the transition.', $a->getBaseURL() . '/help/Config');
} }
// Check server vitality // Check server vitality
if (!self::checkSelfHostMeta()) { if (!self::checkSelfHostMeta()) {
$well_known = $a->getBaseURL() . '/.well-known/host-meta'; $well_known = $a->getBaseURL() . '/.well-known/host-meta';
$warningtext[] = L10n::t('<a href="%s">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href="%s">the installation page</a> for help.', $warningtext[] = L10n::t('<a href="%s">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href="%s">the installation page</a> for help.',
$well_known, $well_known, $a->getBaseURL() . '/help/Install'); $well_known, $well_known, $a->getBaseURL() . '/help/Install');
} }
$accounts = [ $accounts = [
[L10n::t('Normal Account'), 0], [L10n::t('Normal Account'), 0],
[L10n::t('Automatic Follower Account'), 0], [L10n::t('Automatic Follower Account'), 0],
[L10n::t('Public Forum Account'), 0], [L10n::t('Public Forum Account'), 0],
[L10n::t('Automatic Friend Account'), 0], [L10n::t('Automatic Friend Account'), 0],
[L10n::t('Blog Account'), 0], [L10n::t('Blog Account'), 0],
[L10n::t('Private Forum Account'), 0] [L10n::t('Private Forum Account'), 0]
]; ];
$users = 0; $users = 0;
$pageFlagsCountStmt = DBA::p('SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`'); $pageFlagsCountStmt = DBA::p('SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`');
while ($pageFlagsCount = DBA::fetch($pageFlagsCountStmt)) { while ($pageFlagsCount = DBA::fetch($pageFlagsCountStmt)) {
$accounts[$pageFlagsCount['page-flags']][1] = $pageFlagsCount['count']; $accounts[$pageFlagsCount['page-flags']][1] = $pageFlagsCount['count'];
$users += $pageFlagsCount['count']; $users += $pageFlagsCount['count'];
} }
DBA::close($pageFlagsCountStmt); DBA::close($pageFlagsCountStmt);
Logger::log('accounts: ' . print_r($accounts, true), Logger::DATA); Logger::log('accounts: ' . print_r($accounts, true), Logger::DATA);
$pending = Register::getPendingCount(); $pending = Register::getPendingCount();
$queue = DBA::count('queue', []); $queue = DBA::count('queue', []);
$deferred = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` > ?', $deferred = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` > ?',
DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); DBA::NULL_DATETIME, DateTimeFormat::utcNow()]);
$workerqueue = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` < ?', $workerqueue = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` < ?',
DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); DBA::NULL_DATETIME, DateTimeFormat::utcNow()]);
// We can do better, but this is a quick queue status // We can do better, but this is a quick queue status
$queues = ['label' => L10n::t('Message queues'), 'queue' => $queue, 'deferred' => $deferred, 'workerq' => $workerqueue]; $queues = ['label' => L10n::t('Message queues'), 'queue' => $queue, 'deferred' => $deferred, 'workerq' => $workerqueue];
$variables = DBA::toArray(DBA::p('SHOW variables LIKE "max_allowed_packet"')); $variables = DBA::toArray(DBA::p('SHOW variables LIKE "max_allowed_packet"'));
$max_allowed_packet = $variables ? $variables[0]['Value'] : 0; $max_allowed_packet = $variables ? $variables[0]['Value'] : 0;
$server_settings = [ $server_settings = [
'label' => L10n::t('Server Settings'), 'label' => L10n::t('Server Settings'),
'php' => [ 'php' => [
'upload_max_filesize' => ini_get('upload_max_filesize'), 'upload_max_filesize' => ini_get('upload_max_filesize'),
'post_max_size' => ini_get('post_max_size'), 'post_max_size' => ini_get('post_max_size'),
'memory_limit' => ini_get('memory_limit') 'memory_limit' => ini_get('memory_limit')
], ],
'mysql' => [ 'mysql' => [
'max_allowed_packet' => $max_allowed_packet 'max_allowed_packet' => $max_allowed_packet
] ]
]; ];
$t = Renderer::getMarkupTemplate('admin/summary.tpl'); $t = Renderer::getMarkupTemplate('admin/summary.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Summary'), '$page' => L10n::t('Summary'),
'$queues' => $queues, '$queues' => $queues,
'$users' => [L10n::t('Registered users'), $users], '$users' => [L10n::t('Registered users'), $users],
'$accounts' => $accounts, '$accounts' => $accounts,
'$pending' => [L10n::t('Pending registrations'), $pending], '$pending' => [L10n::t('Pending registrations'), $pending],
'$version' => [L10n::t('Version'), FRIENDICA_VERSION], '$version' => [L10n::t('Version'), FRIENDICA_VERSION],
'$platform' => FRIENDICA_PLATFORM, '$platform' => FRIENDICA_PLATFORM,
'$codename' => FRIENDICA_CODENAME, '$codename' => FRIENDICA_CODENAME,
'$build' => Config::get('system', 'build'), '$build' => Config::get('system', 'build'),
'$addons' => [L10n::t('Active addons'), Addon::getEnabledList()], '$addons' => [L10n::t('Active addons'), Addon::getEnabledList()],
'$serversettings' => $server_settings, '$serversettings' => $server_settings,
'$warningtext' => $warningtext '$warningtext' => $warningtext
]); ]);
} }
private static function checkSelfHostMeta() private static function checkSelfHostMeta()
{ {
// Fetch the host-meta to check if this really is a vital server // Fetch the host-meta to check if this really is a vital server
return Network::curl(self::getApp()->getBaseURL() . '/.well-known/host-meta')->isSuccess(); return Network::curl(self::getApp()->getBaseURL() . '/.well-known/host-meta')->isSuccess();
} }
} }

View file

@ -1,126 +1,126 @@
<?php <?php
namespace Friendica\Module\Admin\Themes; namespace Friendica\Module\Admin\Themes;
use Friendica\Content\Text\Markdown; use Friendica\Content\Text\Markdown;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Theme; use Friendica\Core\Theme;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class Details extends BaseAdminModule class Details extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$theme = $a->argv[2]; $theme = $a->argv[2];
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
if (is_file("view/theme/$theme/config.php")) { if (is_file("view/theme/$theme/config.php")) {
require_once "view/theme/$theme/config.php"; require_once "view/theme/$theme/config.php";
if (function_exists('theme_admin_post')) { if (function_exists('theme_admin_post')) {
theme_admin_post($a); theme_admin_post($a);
} }
} }
info(L10n::t('Theme settings updated.')); info(L10n::t('Theme settings updated.'));
if ($a->isAjax()) { if ($a->isAjax()) {
return; return;
} }
$a->internalRedirect('admin/themes/' . $theme); $a->internalRedirect('admin/themes/' . $theme);
} }
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$theme = $a->argv[2]; $theme = $a->argv[2];
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
if (!is_dir("view/theme/$theme")) { if (!is_dir("view/theme/$theme")) {
notice(L10n::t("Item not found.")); notice(L10n::t("Item not found."));
return ''; return '';
} }
$isEnabled = in_array($theme, Theme::getAllowedList()); $isEnabled = in_array($theme, Theme::getAllowedList());
if ($isEnabled) { if ($isEnabled) {
$status = "on"; $status = "on";
$action = L10n::t("Disable"); $action = L10n::t("Disable");
} else { } else {
$status = "off"; $status = "off";
$action = L10n::t("Enable"); $action = L10n::t("Enable");
} }
if (!empty($_GET['action']) && $_GET['action'] == 'toggle') { if (!empty($_GET['action']) && $_GET['action'] == 'toggle') {
parent::checkFormSecurityTokenRedirectOnError('/admin/themes', 'admin_themes', 't'); parent::checkFormSecurityTokenRedirectOnError('/admin/themes', 'admin_themes', 't');
if ($isEnabled) { if ($isEnabled) {
Theme::uninstall($theme); Theme::uninstall($theme);
info(L10n::t('Theme %s disabled.', $theme)); info(L10n::t('Theme %s disabled.', $theme));
} elseif (Theme::install($theme)) { } elseif (Theme::install($theme)) {
info(L10n::t('Theme %s successfully enabled.', $theme)); info(L10n::t('Theme %s successfully enabled.', $theme));
} else { } else {
info(L10n::t('Theme %s failed to install.', $theme)); info(L10n::t('Theme %s failed to install.', $theme));
} }
$a->internalRedirect('admin/themes/' . $theme); $a->internalRedirect('admin/themes/' . $theme);
} }
$readme = null; $readme = null;
if (is_file("view/theme/$theme/README.md")) { if (is_file("view/theme/$theme/README.md")) {
$readme = Markdown::convert(file_get_contents("view/theme/$theme/README.md"), false); $readme = Markdown::convert(file_get_contents("view/theme/$theme/README.md"), false);
} elseif (is_file("view/theme/$theme/README")) { } elseif (is_file("view/theme/$theme/README")) {
$readme = "<pre>" . file_get_contents("view/theme/$theme/README") . "</pre>"; $readme = "<pre>" . file_get_contents("view/theme/$theme/README") . "</pre>";
} }
$admin_form = ''; $admin_form = '';
if (is_file("view/theme/$theme/config.php")) { if (is_file("view/theme/$theme/config.php")) {
require_once "view/theme/$theme/config.php"; require_once "view/theme/$theme/config.php";
if (function_exists('theme_admin')) { if (function_exists('theme_admin')) {
$admin_form = '<iframe onload="resizeIframe(this);" src="/admin/themes/' . $theme . '/embed?mode=minimal" width="100%" height="600px" frameborder="no"></iframe>'; $admin_form = '<iframe onload="resizeIframe(this);" src="/admin/themes/' . $theme . '/embed?mode=minimal" width="100%" height="600px" frameborder="no"></iframe>';
} }
} }
$screenshot = [Theme::getScreenshot($theme), L10n::t('Screenshot')]; $screenshot = [Theme::getScreenshot($theme), L10n::t('Screenshot')];
if (!stristr($screenshot[0], $theme)) { if (!stristr($screenshot[0], $theme)) {
$screenshot = null; $screenshot = null;
} }
$t = Renderer::getMarkupTemplate('admin/addons/details.tpl'); $t = Renderer::getMarkupTemplate('admin/addons/details.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Themes'), '$page' => L10n::t('Themes'),
'$toggle' => L10n::t('Toggle'), '$toggle' => L10n::t('Toggle'),
'$settings' => L10n::t('Settings'), '$settings' => L10n::t('Settings'),
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$addon' => $theme, '$addon' => $theme,
'$status' => $status, '$status' => $status,
'$action' => $action, '$action' => $action,
'$info' => Theme::getInfo($theme), '$info' => Theme::getInfo($theme),
'$function' => 'themes', '$function' => 'themes',
'$admin_form' => $admin_form, '$admin_form' => $admin_form,
'$str_author' => L10n::t('Author: '), '$str_author' => L10n::t('Author: '),
'$str_maintainer' => L10n::t('Maintainer: '), '$str_maintainer' => L10n::t('Maintainer: '),
'$screenshot' => $screenshot, '$screenshot' => $screenshot,
'$readme' => $readme, '$readme' => $readme,
'$form_security_token' => parent::getFormSecurityToken("admin_themes"), '$form_security_token' => parent::getFormSecurityToken("admin_themes"),
]); ]);
} }
$a->internalRedirect('admin/themes'); $a->internalRedirect('admin/themes');
} }
} }

View file

@ -1,90 +1,90 @@
<?php <?php
namespace Friendica\Module\Admin\Themes; namespace Friendica\Module\Admin\Themes;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class Embed extends BaseAdminModule class Embed extends BaseAdminModule
{ {
public static function init() public static function init()
{ {
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$theme = $a->argv[2]; $theme = $a->argv[2];
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
if (is_file("view/theme/$theme/config.php")) { if (is_file("view/theme/$theme/config.php")) {
$a->setCurrentTheme($theme); $a->setCurrentTheme($theme);
} }
} }
} }
public static function post() public static function post()
{ {
parent::post(); parent::post();
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$theme = $a->argv[2]; $theme = $a->argv[2];
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
if (is_file("view/theme/$theme/config.php")) { if (is_file("view/theme/$theme/config.php")) {
self::checkFormSecurityTokenRedirectOnError('/admin/themes/' . $theme . '/embed?mode=minimal', 'admin_theme_settings'); self::checkFormSecurityTokenRedirectOnError('/admin/themes/' . $theme . '/embed?mode=minimal', 'admin_theme_settings');
require_once "view/theme/$theme/config.php"; require_once "view/theme/$theme/config.php";
if (function_exists('theme_admin_post')) { if (function_exists('theme_admin_post')) {
theme_admin_post($a); theme_admin_post($a);
} }
} }
info(L10n::t('Theme settings updated.')); info(L10n::t('Theme settings updated.'));
if ($a->isAjax()) { if ($a->isAjax()) {
return; return;
} }
$a->internalRedirect('admin/themes/' . $theme . '/embed?mode=minimal'); $a->internalRedirect('admin/themes/' . $theme . '/embed?mode=minimal');
} }
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 2) { if ($a->argc > 2) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$theme = $a->argv[2]; $theme = $a->argv[2];
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
if (!is_dir("view/theme/$theme")) { if (!is_dir("view/theme/$theme")) {
notice(L10n::t('Unknown theme.')); notice(L10n::t('Unknown theme.'));
return ''; return '';
} }
$admin_form = ''; $admin_form = '';
if (is_file("view/theme/$theme/config.php")) { if (is_file("view/theme/$theme/config.php")) {
require_once "view/theme/$theme/config.php"; require_once "view/theme/$theme/config.php";
if (function_exists('theme_admin')) { if (function_exists('theme_admin')) {
$admin_form = theme_admin($a); $admin_form = theme_admin($a);
} }
} }
$t = Renderer::getMarkupTemplate('admin/addons/embed.tpl'); $t = Renderer::getMarkupTemplate('admin/addons/embed.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$action' => '/admin/themes/' . $theme . '/embed?mode=minimal', '$action' => '/admin/themes/' . $theme . '/embed?mode=minimal',
'$form' => $admin_form, '$form' => $admin_form,
'$form_security_token' => parent::getFormSecurityToken("admin_theme_settings"), '$form_security_token' => parent::getFormSecurityToken("admin_theme_settings"),
]); ]);
} }
return ''; return '';
} }
} }

View file

@ -1,107 +1,107 @@
<?php <?php
namespace Friendica\Module\Admin\Themes; namespace Friendica\Module\Admin\Themes;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Theme; use Friendica\Core\Theme;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
class Index extends BaseAdminModule class Index extends BaseAdminModule
{ {
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
$allowed_themes = Theme::getAllowedList(); $allowed_themes = Theme::getAllowedList();
// reload active themes // reload active themes
if (!empty($_GET['action'])) { if (!empty($_GET['action'])) {
parent::checkFormSecurityTokenRedirectOnError($a->getBaseURL() . '/admin/themes', 'admin_themes', 't'); parent::checkFormSecurityTokenRedirectOnError($a->getBaseURL() . '/admin/themes', 'admin_themes', 't');
switch ($_GET['action']) { switch ($_GET['action']) {
case 'reload': case 'reload':
foreach ($allowed_themes as $theme) { foreach ($allowed_themes as $theme) {
Theme::uninstall($theme['name']); Theme::uninstall($theme['name']);
Theme::install($theme['name']); Theme::install($theme['name']);
} }
info('Themes reloaded'); info('Themes reloaded');
break; break;
case 'toggle' : case 'toggle' :
$theme = defaults($_GET, 'addon', ''); $theme = defaults($_GET, 'addon', '');
if ($theme) { if ($theme) {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
if (!is_dir("view/theme/$theme")) { if (!is_dir("view/theme/$theme")) {
notice(L10n::t('Item not found.')); notice(L10n::t('Item not found.'));
return ''; return '';
} }
if (in_array($theme, Theme::getAllowedList())) { if (in_array($theme, Theme::getAllowedList())) {
Theme::uninstall($theme); Theme::uninstall($theme);
info(L10n::t('Theme %s disabled.', $theme)); info(L10n::t('Theme %s disabled.', $theme));
} elseif (Theme::install($theme)) { } elseif (Theme::install($theme)) {
info(L10n::t('Theme %s successfully enabled.', $theme)); info(L10n::t('Theme %s successfully enabled.', $theme));
} else { } else {
info(L10n::t('Theme %s failed to install.', $theme)); info(L10n::t('Theme %s failed to install.', $theme));
} }
} }
break; break;
} }
$a->internalRedirect('admin/themes'); $a->internalRedirect('admin/themes');
} }
$themes = []; $themes = [];
$files = glob('view/theme/*'); $files = glob('view/theme/*');
if (is_array($files)) { if (is_array($files)) {
foreach ($files as $file) { foreach ($files as $file) {
$theme = basename($file); $theme = basename($file);
// Is there a style file? // Is there a style file?
$theme_files = glob('view/theme/' . $theme . '/style.*'); $theme_files = glob('view/theme/' . $theme . '/style.*');
// If not then quit // If not then quit
if (count($theme_files) == 0) { if (count($theme_files) == 0) {
continue; continue;
} }
$is_experimental = intval(file_exists($file . '/experimental')); $is_experimental = intval(file_exists($file . '/experimental'));
$is_supported = 1 - (intval(file_exists($file . '/unsupported'))); $is_supported = 1 - (intval(file_exists($file . '/unsupported')));
$is_allowed = intval(in_array($theme, $allowed_themes)); $is_allowed = intval(in_array($theme, $allowed_themes));
if ($is_allowed || $is_supported || Config::get('system', 'show_unsupported_themes')) { if ($is_allowed || $is_supported || Config::get('system', 'show_unsupported_themes')) {
$themes[] = ['name' => $theme, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed]; $themes[] = ['name' => $theme, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed];
} }
} }
} }
$addons = []; $addons = [];
foreach ($themes as $theme) { foreach ($themes as $theme) {
$addons[] = [$theme['name'], (($theme['allowed']) ? 'on' : 'off'), Theme::getInfo($theme['name'])]; $addons[] = [$theme['name'], (($theme['allowed']) ? 'on' : 'off'), Theme::getInfo($theme['name'])];
} }
$t = Renderer::getMarkupTemplate('admin/addons/index.tpl'); $t = Renderer::getMarkupTemplate('admin/addons/index.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Themes'), '$page' => L10n::t('Themes'),
'$submit' => L10n::t('Save Settings'), '$submit' => L10n::t('Save Settings'),
'$reload' => L10n::t('Reload active themes'), '$reload' => L10n::t('Reload active themes'),
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$function' => 'themes', '$function' => 'themes',
'$addons' => $addons, '$addons' => $addons,
'$pcount' => count($themes), '$pcount' => count($themes),
'$noplugshint' => L10n::t('No themes found on the system. They should be placed in %1$s', '<code>/view/themes</code>'), '$noplugshint' => L10n::t('No themes found on the system. They should be placed in %1$s', '<code>/view/themes</code>'),
'$experimental' => L10n::t('[Experimental]'), '$experimental' => L10n::t('[Experimental]'),
'$unsupported' => L10n::t('[Unsupported]'), '$unsupported' => L10n::t('[Unsupported]'),
'$form_security_token' => parent::getFormSecurityToken('admin_themes'), '$form_security_token' => parent::getFormSecurityToken('admin_themes'),
]); ]);
} }
} }

View file

@ -1,53 +1,53 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
class Tos extends BaseAdminModule class Tos extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
parent::checkFormSecurityTokenRedirectOnError('/admin/tos', 'admin_tos'); parent::checkFormSecurityTokenRedirectOnError('/admin/tos', 'admin_tos');
if (empty($_POST['page_tos'])) { if (empty($_POST['page_tos'])) {
return; return;
} }
$displaytos = !empty($_POST['displaytos']); $displaytos = !empty($_POST['displaytos']);
$displayprivstatement = !empty($_POST['displayprivstatement']); $displayprivstatement = !empty($_POST['displayprivstatement']);
$tostext = (!empty($_POST['tostext']) ? strip_tags(trim($_POST['tostext'])) : ''); $tostext = (!empty($_POST['tostext']) ? strip_tags(trim($_POST['tostext'])) : '');
Config::set('system', 'tosdisplay', $displaytos); Config::set('system', 'tosdisplay', $displaytos);
Config::set('system', 'tosprivstatement', $displayprivstatement); Config::set('system', 'tosprivstatement', $displayprivstatement);
Config::set('system', 'tostext', $tostext); Config::set('system', 'tostext', $tostext);
info(L10n::t('The Terms of Service settings have been updated.')); info(L10n::t('The Terms of Service settings have been updated.'));
self::getApp()->internalRedirect('admin/tos'); self::getApp()->internalRedirect('admin/tos');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$tos = new \Friendica\Module\Tos(); $tos = new \Friendica\Module\Tos();
$t = Renderer::getMarkupTemplate('admin/tos.tpl'); $t = Renderer::getMarkupTemplate('admin/tos.tpl');
return Renderer::replaceMacros($t, [ return Renderer::replaceMacros($t, [
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Terms of Service'), '$page' => L10n::t('Terms of Service'),
'$displaytos' => ['displaytos', L10n::t('Display Terms of Service'), Config::get('system', 'tosdisplay'), L10n::t('Enable the Terms of Service page. If this is enabled a link to the terms will be added to the registration form and the general information page.')], '$displaytos' => ['displaytos', L10n::t('Display Terms of Service'), Config::get('system', 'tosdisplay'), L10n::t('Enable the Terms of Service page. If this is enabled a link to the terms will be added to the registration form and the general information page.')],
'$displayprivstatement' => ['displayprivstatement', L10n::t('Display Privacy Statement'), Config::get('system', 'tosprivstatement'), L10n::t('Show some informations regarding the needed information to operate the node according e.g. to <a href="%s" target="_blank">EU-GDPR</a>.', 'https://en.wikipedia.org/wiki/General_Data_Protection_Regulation')], '$displayprivstatement' => ['displayprivstatement', L10n::t('Display Privacy Statement'), Config::get('system', 'tosprivstatement'), L10n::t('Show some informations regarding the needed information to operate the node according e.g. to <a href="%s" target="_blank">EU-GDPR</a>.', 'https://en.wikipedia.org/wiki/General_Data_Protection_Regulation')],
'$preview' => L10n::t('Privacy Statement Preview'), '$preview' => L10n::t('Privacy Statement Preview'),
'$privtext' => $tos->privacy_complete, '$privtext' => $tos->privacy_complete,
'$tostext' => ['tostext', L10n::t('The Terms of Service'), Config::get('system', 'tostext'), L10n::t('Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below.')], '$tostext' => ['tostext', L10n::t('The Terms of Service'), Config::get('system', 'tostext'), L10n::t('Enter the Terms of Service for your node here. You can use BBCode. Headers of sections should be [h2] and below.')],
'$form_security_token' => parent::getFormSecurityToken('admin_tos'), '$form_security_token' => parent::getFormSecurityToken('admin_tos'),
'$submit' => L10n::t('Save Settings'), '$submit' => L10n::t('Save Settings'),
]); ]);
} }
} }

View file

@ -1,318 +1,318 @@
<?php <?php
namespace Friendica\Module\Admin; namespace Friendica\Module\Admin;
use Friendica\Content\Pager; use Friendica\Content\Pager;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Model\Register; use Friendica\Model\Register;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Module\BaseAdminModule; use Friendica\Module\BaseAdminModule;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
class Users extends BaseAdminModule class Users extends BaseAdminModule
{ {
public static function post() public static function post()
{ {
parent::post(); parent::post();
$a = self::getApp(); $a = self::getApp();
$pending = defaults($_POST, 'pending' , []); $pending = defaults($_POST, 'pending' , []);
$users = defaults($_POST, 'user' , []); $users = defaults($_POST, 'user' , []);
$nu_name = defaults($_POST, 'new_user_name' , ''); $nu_name = defaults($_POST, 'new_user_name' , '');
$nu_nickname = defaults($_POST, 'new_user_nickname', ''); $nu_nickname = defaults($_POST, 'new_user_nickname', '');
$nu_email = defaults($_POST, 'new_user_email' , ''); $nu_email = defaults($_POST, 'new_user_email' , '');
$nu_language = Config::get('system', 'language'); $nu_language = Config::get('system', 'language');
parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users'); parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users');
if ($nu_name !== '' && $nu_email !== '' && $nu_nickname !== '') { if ($nu_name !== '' && $nu_email !== '' && $nu_nickname !== '') {
try { try {
$result = User::create([ $result = User::create([
'username' => $nu_name, 'username' => $nu_name,
'email' => $nu_email, 'email' => $nu_email,
'nickname' => $nu_nickname, 'nickname' => $nu_nickname,
'verified' => 1, 'verified' => 1,
'language' => $nu_language 'language' => $nu_language
]); ]);
} catch (\Exception $ex) { } catch (\Exception $ex) {
notice($ex->getMessage()); notice($ex->getMessage());
return; return;
} }
$user = $result['user']; $user = $result['user'];
$preamble = Strings::deindent(L10n::t(' $preamble = Strings::deindent(L10n::t('
Dear %1$s, Dear %1$s,
the administrator of %2$s has set up an account for you.')); the administrator of %2$s has set up an account for you.'));
$body = Strings::deindent(L10n::t(' $body = Strings::deindent(L10n::t('
The login details are as follows: The login details are as follows:
Site Location: %1$s Site Location: %1$s
Login Name: %2$s Login Name: %2$s
Password: %3$s Password: %3$s
You may change your password from your account "Settings" page after logging You may change your password from your account "Settings" page after logging
in. in.
Please take a few moments to review the other account settings on that page. Please take a few moments to review the other account settings on that page.
You may also wish to add some basic information to your default profile You may also wish to add some basic information to your default profile
(on the "Profiles" page) so that other people can easily find you. (on the "Profiles" page) so that other people can easily find you.
We recommend setting your full name, adding a profile photo, We recommend setting your full name, adding a profile photo,
adding some profile "keywords" (very useful in making new friends) - and adding some profile "keywords" (very useful in making new friends) - and
perhaps what country you live in; if you do not wish to be more specific perhaps what country you live in; if you do not wish to be more specific
than that. than that.
We fully respect your right to privacy, and none of these items are necessary. We fully respect your right to privacy, and none of these items are necessary.
If you are new and do not know anybody here, they may help If you are new and do not know anybody here, they may help
you to make some new and interesting friends. you to make some new and interesting friends.
If you ever want to delete your account, you can do so at %1$s/removeme If you ever want to delete your account, you can do so at %1$s/removeme
Thank you and welcome to %4$s.')); Thank you and welcome to %4$s.'));
$preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename')); $preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename'));
$body = sprintf($body, $a->getBaseURL(), $user['nickname'], $result['password'], Config::get('config', 'sitename')); $body = sprintf($body, $a->getBaseURL(), $user['nickname'], $result['password'], Config::get('config', 'sitename'));
notification([ notification([
'type' => SYSTEM_EMAIL, 'type' => SYSTEM_EMAIL,
'language' => $user['language'], 'language' => $user['language'],
'to_name' => $user['username'], 'to_name' => $user['username'],
'to_email' => $user['email'], 'to_email' => $user['email'],
'uid' => $user['uid'], 'uid' => $user['uid'],
'subject' => L10n::t('Registration details for %s', Config::get('config', 'sitename')), 'subject' => L10n::t('Registration details for %s', Config::get('config', 'sitename')),
'preamble' => $preamble, 'preamble' => $preamble,
'body' => $body]); 'body' => $body]);
} }
if (!empty($_POST['page_users_block'])) { if (!empty($_POST['page_users_block'])) {
DBA::update('user', ['blocked' => 1], ['uid' => $users]); DBA::update('user', ['blocked' => 1], ['uid' => $users]);
notice(L10n::tt('%s user blocked', '%s users blocked', count($users))); notice(L10n::tt('%s user blocked', '%s users blocked', count($users)));
} }
if (!empty($_POST['page_users_unblock'])) { if (!empty($_POST['page_users_unblock'])) {
DBA::update('user', ['blocked' => 0], ['uid' => $users]); DBA::update('user', ['blocked' => 0], ['uid' => $users]);
notice(L10n::tt('%s user unblocked', '%s users unblocked', count($users))); notice(L10n::tt('%s user unblocked', '%s users unblocked', count($users)));
} }
if (!empty($_POST['page_users_delete'])) { if (!empty($_POST['page_users_delete'])) {
foreach ($users as $uid) { foreach ($users as $uid) {
if (local_user() != $uid) { if (local_user() != $uid) {
User::remove($uid); User::remove($uid);
} else { } else {
notice(L10n::t('You can\'t remove yourself')); notice(L10n::t('You can\'t remove yourself'));
} }
} }
notice(L10n::tt('%s user deleted', '%s users deleted', count($users))); notice(L10n::tt('%s user deleted', '%s users deleted', count($users)));
} }
if (!empty($_POST['page_users_approve'])) { if (!empty($_POST['page_users_approve'])) {
require_once 'mod/regmod.php'; require_once 'mod/regmod.php';
foreach ($pending as $hash) { foreach ($pending as $hash) {
user_allow($hash); user_allow($hash);
} }
} }
if (!empty($_POST['page_users_deny'])) { if (!empty($_POST['page_users_deny'])) {
require_once 'mod/regmod.php'; require_once 'mod/regmod.php';
foreach ($pending as $hash) { foreach ($pending as $hash) {
user_deny($hash); user_deny($hash);
} }
} }
$a->internalRedirect('admin/users'); $a->internalRedirect('admin/users');
} }
public static function content() public static function content()
{ {
parent::content(); parent::content();
$a = self::getApp(); $a = self::getApp();
if ($a->argc > 3) { if ($a->argc > 3) {
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
$action = $a->argv[2]; $action = $a->argv[2];
$uid = $a->argv[3]; $uid = $a->argv[3];
$user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]); $user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
if (!DBA::isResult($user)) { if (!DBA::isResult($user)) {
notice('User not found' . EOL); notice('User not found' . EOL);
$a->internalRedirect('admin/users'); $a->internalRedirect('admin/users');
return ''; // NOTREACHED return ''; // NOTREACHED
} }
switch ($action) { switch ($action) {
case 'delete': case 'delete':
if (local_user() != $uid) { if (local_user() != $uid) {
parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
// delete user // delete user
User::remove($uid); User::remove($uid);
notice(L10n::t('User "%s" deleted', $user['username'])); notice(L10n::t('User "%s" deleted', $user['username']));
} else { } else {
notice(L10n::t('You can\'t remove yourself')); notice(L10n::t('You can\'t remove yourself'));
} }
break; break;
case 'block': case 'block':
parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
DBA::update('user', ['blocked' => 1], ['uid' => $uid]); DBA::update('user', ['blocked' => 1], ['uid' => $uid]);
notice(L10n::t('User "%s" blocked', $user['username'])); notice(L10n::t('User "%s" blocked', $user['username']));
break; break;
case 'unblock': case 'unblock':
parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
DBA::update('user', ['blocked' => 0], ['uid' => $uid]); DBA::update('user', ['blocked' => 0], ['uid' => $uid]);
notice(L10n::t('User "%s" unblocked', $user['username'])); notice(L10n::t('User "%s" unblocked', $user['username']));
break; break;
} }
$a->internalRedirect('admin/users'); $a->internalRedirect('admin/users');
} }
/* get pending */ /* get pending */
$pending = Register::getPending(); $pending = Register::getPending();
$pager = new Pager($a->query_string, 100); $pager = new Pager($a->query_string, 100);
/* ordering */ /* ordering */
$valid_orders = [ $valid_orders = [
'contact.name', 'contact.name',
'user.email', 'user.email',
'user.register_date', 'user.register_date',
'user.login_date', 'user.login_date',
'lastitem_date', 'lastitem_date',
'user.page-flags' 'user.page-flags'
]; ];
$order = 'contact.name'; $order = 'contact.name';
$order_direction = '+'; $order_direction = '+';
if (!empty($_GET['o'])) { if (!empty($_GET['o'])) {
$new_order = $_GET['o']; $new_order = $_GET['o'];
if ($new_order[0] === '-') { if ($new_order[0] === '-') {
$order_direction = '-'; $order_direction = '-';
$new_order = substr($new_order, 1); $new_order = substr($new_order, 1);
} }
if (in_array($new_order, $valid_orders)) { if (in_array($new_order, $valid_orders)) {
$order = $new_order; $order = $new_order;
} }
} }
$sql_order = '`' . str_replace('.', '`.`', $order) . '`'; $sql_order = '`' . str_replace('.', '`.`', $order) . '`';
$sql_order_direction = ($order_direction === '+') ? 'ASC' : 'DESC'; $sql_order_direction = ($order_direction === '+') ? 'ASC' : 'DESC';
$usersStmt = DBA::p("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date` $usersStmt = DBA::p("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date`
FROM `user` FROM `user`
INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
WHERE `user`.`verified` WHERE `user`.`verified`
ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $pager->getStart(), $pager->getItemsPerPage() ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $pager->getStart(), $pager->getItemsPerPage()
); );
$users = DBA::toArray($usersStmt); $users = DBA::toArray($usersStmt);
$adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email'))); $adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email')));
$_setup_users = function ($e) use ($adminlist) { $_setup_users = function ($e) use ($adminlist) {
$page_types = [ $page_types = [
User::PAGE_FLAGS_NORMAL => L10n::t('Normal Account Page'), User::PAGE_FLAGS_NORMAL => L10n::t('Normal Account Page'),
User::PAGE_FLAGS_SOAPBOX => L10n::t('Soapbox Page'), User::PAGE_FLAGS_SOAPBOX => L10n::t('Soapbox Page'),
User::PAGE_FLAGS_COMMUNITY => L10n::t('Public Forum'), User::PAGE_FLAGS_COMMUNITY => L10n::t('Public Forum'),
User::PAGE_FLAGS_FREELOVE => L10n::t('Automatic Friend Page'), User::PAGE_FLAGS_FREELOVE => L10n::t('Automatic Friend Page'),
User::PAGE_FLAGS_PRVGROUP => L10n::t('Private Forum') User::PAGE_FLAGS_PRVGROUP => L10n::t('Private Forum')
]; ];
$account_types = [ $account_types = [
User::ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'), User::ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'),
User::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'), User::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'),
User::ACCOUNT_TYPE_NEWS => L10n::t('News Page'), User::ACCOUNT_TYPE_NEWS => L10n::t('News Page'),
User::ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum'), User::ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum'),
User::ACCOUNT_TYPE_RELAY => L10n::t('Relay'), User::ACCOUNT_TYPE_RELAY => L10n::t('Relay'),
]; ];
$e['page_flags_raw'] = $e['page-flags']; $e['page_flags_raw'] = $e['page-flags'];
$e['page-flags'] = $page_types[$e['page-flags']]; $e['page-flags'] = $page_types[$e['page-flags']];
$e['account_type_raw'] = ($e['page_flags_raw'] == 0) ? $e['account-type'] : -1; $e['account_type_raw'] = ($e['page_flags_raw'] == 0) ? $e['account-type'] : -1;
$e['account-type'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : ''; $e['account-type'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : '';
$e['register_date'] = Temporal::getRelativeDate($e['register_date']); $e['register_date'] = Temporal::getRelativeDate($e['register_date']);
$e['login_date'] = Temporal::getRelativeDate($e['login_date']); $e['login_date'] = Temporal::getRelativeDate($e['login_date']);
$e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']); $e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']);
$e['is_admin'] = in_array($e['email'], $adminlist); $e['is_admin'] = in_array($e['email'], $adminlist);
$e['is_deletable'] = (intval($e['uid']) != local_user()); $e['is_deletable'] = (intval($e['uid']) != local_user());
$e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False); $e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False);
return $e; return $e;
}; };
$tmp_users = array_map($_setup_users, $users); $tmp_users = array_map($_setup_users, $users);
// Get rid of dashes in key names, Smarty3 can't handle them // Get rid of dashes in key names, Smarty3 can't handle them
// and extracting deleted users // and extracting deleted users
$deleted = []; $deleted = [];
$users = []; $users = [];
foreach ($tmp_users as $user) { foreach ($tmp_users as $user) {
foreach ($user as $k => $v) { foreach ($user as $k => $v) {
$newkey = str_replace('-', '_', $k); $newkey = str_replace('-', '_', $k);
$user[$newkey] = $v; $user[$newkey] = $v;
} }
if ($user['deleted']) { if ($user['deleted']) {
$deleted[] = $user; $deleted[] = $user;
} else { } else {
$users[] = $user; $users[] = $user;
} }
} }
$th_users = array_map(null, [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Type')], $valid_orders); $th_users = array_map(null, [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Type')], $valid_orders);
$t = Renderer::getMarkupTemplate('admin/users.tpl'); $t = Renderer::getMarkupTemplate('admin/users.tpl');
$o = Renderer::replaceMacros($t, [ $o = Renderer::replaceMacros($t, [
// strings // // strings //
'$title' => L10n::t('Administration'), '$title' => L10n::t('Administration'),
'$page' => L10n::t('Users'), '$page' => L10n::t('Users'),
'$submit' => L10n::t('Add User'), '$submit' => L10n::t('Add User'),
'$select_all' => L10n::t('select all'), '$select_all' => L10n::t('select all'),
'$h_pending' => L10n::t('User registrations waiting for confirm'), '$h_pending' => L10n::t('User registrations waiting for confirm'),
'$h_deleted' => L10n::t('User waiting for permanent deletion'), '$h_deleted' => L10n::t('User waiting for permanent deletion'),
'$th_pending' => [L10n::t('Request date'), L10n::t('Name'), L10n::t('Email')], '$th_pending' => [L10n::t('Request date'), L10n::t('Name'), L10n::t('Email')],
'$no_pending' => L10n::t('No registrations.'), '$no_pending' => L10n::t('No registrations.'),
'$pendingnotetext' => L10n::t('Note from the user'), '$pendingnotetext' => L10n::t('Note from the user'),
'$approve' => L10n::t('Approve'), '$approve' => L10n::t('Approve'),
'$deny' => L10n::t('Deny'), '$deny' => L10n::t('Deny'),
'$delete' => L10n::t('Delete'), '$delete' => L10n::t('Delete'),
'$block' => L10n::t('Block'), '$block' => L10n::t('Block'),
'$blocked' => L10n::t('User blocked'), '$blocked' => L10n::t('User blocked'),
'$unblock' => L10n::t('Unblock'), '$unblock' => L10n::t('Unblock'),
'$siteadmin' => L10n::t('Site admin'), '$siteadmin' => L10n::t('Site admin'),
'$accountexpired' => L10n::t('Account expired'), '$accountexpired' => L10n::t('Account expired'),
'$h_users' => L10n::t('Users'), '$h_users' => L10n::t('Users'),
'$h_newuser' => L10n::t('New User'), '$h_newuser' => L10n::t('New User'),
'$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Permanent deletion')], '$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Permanent deletion')],
'$th_users' => $th_users, '$th_users' => $th_users,
'$order_users' => $order, '$order_users' => $order,
'$order_direction_users' => $order_direction, '$order_direction_users' => $order_direction,
'$confirm_delete_multi' => L10n::t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'), '$confirm_delete_multi' => L10n::t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => L10n::t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'), '$confirm_delete' => L10n::t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
'$form_security_token' => parent::getFormSecurityToken('admin_users'), '$form_security_token' => parent::getFormSecurityToken('admin_users'),
// values // // values //
'$baseurl' => $a->getBaseURL(true), '$baseurl' => $a->getBaseURL(true),
'$pending' => $pending, '$pending' => $pending,
'deleted' => $deleted, 'deleted' => $deleted,
'$users' => $users, '$users' => $users,
'$newusername' => ['new_user_name', L10n::t('Name'), '', L10n::t('Name of the new user.')], '$newusername' => ['new_user_name', L10n::t('Name'), '', L10n::t('Name of the new user.')],
'$newusernickname' => ['new_user_nickname', L10n::t('Nickname'), '', L10n::t('Nickname of the new user.')], '$newusernickname' => ['new_user_nickname', L10n::t('Nickname'), '', L10n::t('Nickname of the new user.')],
'$newuseremail' => ['new_user_email', L10n::t('Email'), '', L10n::t('Email address of the new user.'), '', '', 'email'], '$newuseremail' => ['new_user_email', L10n::t('Email'), '', L10n::t('Email address of the new user.'), '', '', 'email'],
]); ]);
$o .= $pager->renderFull(DBA::count('user')); $o .= $pager->renderFull(DBA::count('user'));
return $o; return $o;
} }
} }

View file

@ -1,113 +1,122 @@
<?php <?php
namespace Friendica\Module; namespace Friendica\Module;
use Friendica\BaseModule; use Friendica\BaseModule;
use Friendica\Core\Addon; use Friendica\Core\Addon;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBA;
/**
abstract class BaseAdminModule extends BaseModule * This abstract module is meant to be extended by all modules that are reserved to administrator users.
{ *
public static function post() * It performs a blanket permission check in all the module methods as long as the relevant `parent::method()` is
{ * called in the inheriting module.
if (!is_site_admin()) { *
return; * Additionally, it puts together the administration page aside with all the administration links.
} *
* @package Friendica\Module
// do not allow a page manager to access the admin panel at all. */
if (!empty($_SESSION['submanage'])) { abstract class BaseAdminModule extends BaseModule
return; {
} public static function post()
} {
if (!is_site_admin()) {
public static function rawContent() return;
{ }
if (!is_site_admin()) {
System::httpExit(403); // do not allow a page manager to access the admin panel at all.
} if (!empty($_SESSION['submanage'])) {
return;
if (!empty($_SESSION['submanage'])) { }
System::httpExit(403); }
}
public static function rawContent()
return ''; {
} if (!is_site_admin()) {
System::httpExit(403);
public static function content() }
{
if (!is_site_admin()) { if (!empty($_SESSION['submanage'])) {
return Login::form(); System::httpExit(403);
} }
if (!empty($_SESSION['submanage'])) { return '';
return ''; }
}
public static function content()
$a = self::getApp(); {
if (!is_site_admin()) {
// APC deactivated, since there are problems with PHP 5.5 return Login::form();
//if (function_exists("apc_delete")) { }
// $toDelete = new APCIterator('user', APC_ITER_VALUE);
// apc_delete($toDelete); if (!empty($_SESSION['submanage'])) {
//} return '';
// Header stuff }
$a->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/settings_head.tpl'), []);
$a = self::getApp();
/*
* Side bar links // APC deactivated, since there are problems with PHP 5.5
*/ //if (function_exists("apc_delete")) {
// $toDelete = new APCIterator('user', APC_ITER_VALUE);
// array(url, name, extra css classes) // apc_delete($toDelete);
// not part of $aside to make the template more adjustable //}
$aside_sub = [ // Header stuff
'information' => [L10n::t('Information'), [ $a->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/settings_head.tpl'), []);
'overview' => ['admin' , L10n::t('Overview') , 'overview'],
'federation' => ['admin/federation' , L10n::t('Federation Statistics') , 'federation'] /*
]], * Side bar links
'configuration' => [L10n::t('Configuration'), [ */
'site' => ['admin/site' , L10n::t('Site') , 'site'],
'users' => ['admin/users' , L10n::t('Users') , 'users'], // array(url, name, extra css classes)
'addons' => ['admin/addons' , L10n::t('Addons') , 'addons'], // not part of $aside to make the template more adjustable
'themes' => ['admin/themes' , L10n::t('Themes') , 'themes'], $aside_sub = [
'features' => ['admin/features' , L10n::t('Additional features') , 'features'], 'information' => [L10n::t('Information'), [
'tos' => ['admin/tos' , L10n::t('Terms of Service') , 'tos'], 'overview' => ['admin' , L10n::t('Overview') , 'overview'],
]], 'federation' => ['admin/federation' , L10n::t('Federation Statistics') , 'federation']
'database' => [L10n::t('Database'), [ ]],
'dbsync' => ['admin/dbsync' , L10n::t('DB updates') , 'dbsync'], 'configuration' => [L10n::t('Configuration'), [
'deferred' => ['admin/queue/deferred', L10n::t('Inspect Deferred Workers'), 'deferred'], 'site' => ['admin/site' , L10n::t('Site') , 'site'],
'workerqueue' => ['admin/queue' , L10n::t('Inspect worker Queue') , 'workerqueue'], 'users' => ['admin/users' , L10n::t('Users') , 'users'],
]], 'addons' => ['admin/addons' , L10n::t('Addons') , 'addons'],
'tools' => [L10n::t('Tools'), [ 'themes' => ['admin/themes' , L10n::t('Themes') , 'themes'],
'contactblock' => ['admin/blocklist/contact', L10n::t('Contact Blocklist') , 'contactblock'], 'features' => ['admin/features' , L10n::t('Additional features') , 'features'],
'blocklist' => ['admin/blocklist/server' , L10n::t('Server Blocklist') , 'blocklist'], 'tos' => ['admin/tos' , L10n::t('Terms of Service') , 'tos'],
'deleteitem' => ['admin/item/delete' , L10n::t('Delete Item') , 'deleteitem'], ]],
]], 'database' => [L10n::t('Database'), [
'logs' => [L10n::t('Logs'), [ 'dbsync' => ['admin/dbsync' , L10n::t('DB updates') , 'dbsync'],
'logsconfig' => ['admin/logs/', L10n::t('Logs') , 'logs'], 'deferred' => ['admin/queue/deferred', L10n::t('Inspect Deferred Workers'), 'deferred'],
'logsview' => ['admin/logs/view' , L10n::t('View Logs') , 'viewlogs'], 'workerqueue' => ['admin/queue' , L10n::t('Inspect worker Queue') , 'workerqueue'],
]], ]],
'diagnostics' => [L10n::t('Diagnostics'), [ 'tools' => [L10n::t('Tools'), [
'phpinfo' => ['admin/phpinfo' , L10n::t('PHP Info') , 'phpinfo'], 'contactblock' => ['admin/blocklist/contact', L10n::t('Contact Blocklist') , 'contactblock'],
'probe' => ['probe' , L10n::t('probe address') , 'probe'], 'blocklist' => ['admin/blocklist/server' , L10n::t('Server Blocklist') , 'blocklist'],
'webfinger' => ['webfinger' , L10n::t('check webfinger') , 'webfinger'], 'deleteitem' => ['admin/item/delete' , L10n::t('Delete Item') , 'deleteitem'],
'itemsource' => ['admin/item/source' , L10n::t('Item Source') , 'itemsource'], ]],
'babel' => ['babel' , L10n::t('Babel') , 'babel'], 'logs' => [L10n::t('Logs'), [
]], 'logsconfig' => ['admin/logs/', L10n::t('Logs') , 'logs'],
]; 'logsview' => ['admin/logs/view' , L10n::t('View Logs') , 'viewlogs'],
]],
$t = Renderer::getMarkupTemplate('admin/aside.tpl'); 'diagnostics' => [L10n::t('Diagnostics'), [
$a->page['aside'] .= Renderer::replaceMacros($t, [ 'phpinfo' => ['admin/phpinfo' , L10n::t('PHP Info') , 'phpinfo'],
'$admin' => ['addons_admin' => Addon::getAdminList()], 'probe' => ['probe' , L10n::t('probe address') , 'probe'],
'$subpages' => $aside_sub, 'webfinger' => ['webfinger' , L10n::t('check webfinger') , 'webfinger'],
'$admtxt' => L10n::t('Admin'), 'itemsource' => ['admin/item/source' , L10n::t('Item Source') , 'itemsource'],
'$plugadmtxt' => L10n::t('Addon Features'), 'babel' => ['babel' , L10n::t('Babel') , 'babel'],
'$h_pending' => L10n::t('User registrations waiting for confirmation'), ]],
'$admurl' => 'admin/' ];
]);
$t = Renderer::getMarkupTemplate('admin/aside.tpl');
return ''; $a->page['aside'] .= Renderer::replaceMacros($t, [
} '$admin' => ['addons_admin' => Addon::getAdminList()],
} '$subpages' => $aside_sub,
'$admtxt' => L10n::t('Admin'),
'$plugadmtxt' => L10n::t('Addon Features'),
'$h_pending' => L10n::t('User registrations waiting for confirmation'),
'$admurl' => 'admin/'
]);
return '';
}
}