diff --git a/src/Module/Admin/Addons/Details.php b/src/Module/Admin/Addons/Details.php index 25e538122c..33e7c7a00c 100644 --- a/src/Module/Admin/Addons/Details.php +++ b/src/Module/Admin/Addons/Details.php @@ -1,122 +1,122 @@ -argc > 2) { - // @TODO: Replace with parameter from router - $addon = $a->argv[2]; - $addon = Strings::sanitizeFilePathItem($addon); - if (is_file('addon/' . $addon . '/' . $addon . '.php')) { - include_once 'addon/' . $addon . '/' . $addon . '.php'; - if (function_exists($addon . '_addon_admin_post')) { - $func = $addon . '_addon_admin_post'; - $func($a); - } - - $a->internalRedirect('admin/addons/' . $addon); - } - } - - $a->internalRedirect('admin/addons'); - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - $addons_admin = Addon::getAdminList(); - - if ($a->argc > 2) { - // @TODO: Replace with parameter from router - $addon = $a->argv[2]; - $addon = Strings::sanitizeFilePathItem($addon); - if (!is_file("addon/$addon/$addon.php")) { - notice(L10n::t('Item not found.')); - $a->internalRedirect('admin/addons'); - } - - if (defaults($_GET, 'action', '') == 'toggle') { - parent::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_themes', 't'); - - // Toggle addon status - if (Addon::isEnabled($addon)) { - Addon::uninstall($addon); - info(L10n::t('Addon %s disabled.', $addon)); - } else { - Addon::install($addon); - info(L10n::t('Addon %s enabled.', $addon)); - } - - Addon::saveEnabledList(); - - $a->internalRedirect('admin/addons/' . $addon); - } - - // display addon details - if (Addon::isEnabled($addon)) { - $status = 'on'; - $action = L10n::t('Disable'); - } else { - $status = 'off'; - $action = L10n::t('Enable'); - } - - $readme = null; - if (is_file("addon/$addon/README.md")) { - $readme = Markdown::convert(file_get_contents("addon/$addon/README.md"), false); - } elseif (is_file("addon/$addon/README")) { - $readme = '
' . file_get_contents("addon/$addon/README") . '
'; - } - - $admin_form = ''; - if (array_key_exists($addon, $addons_admin)) { - require_once "addon/$addon/$addon.php"; - $func = $addon . '_addon_admin'; - $func($a, $admin_form); - } - - $t = Renderer::getMarkupTemplate('admin/addons/details.tpl'); - - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Addons'), - '$toggle' => L10n::t('Toggle'), - '$settings' => L10n::t('Settings'), - '$baseurl' => $a->getBaseURL(true), - - '$addon' => $addon, - '$status' => $status, - '$action' => $action, - '$info' => Addon::getInfo($addon), - '$str_author' => L10n::t('Author: '), - '$str_maintainer' => L10n::t('Maintainer: '), - - '$admin_form' => $admin_form, - '$function' => 'addons', - '$screenshot' => '', - '$readme' => $readme, - - '$form_security_token' => parent::getFormSecurityToken('admin_themes'), - ]); - } - - $a->internalRedirect('admin/addons'); - } -} +argc > 2) { + // @TODO: Replace with parameter from router + $addon = $a->argv[2]; + $addon = Strings::sanitizeFilePathItem($addon); + if (is_file('addon/' . $addon . '/' . $addon . '.php')) { + include_once 'addon/' . $addon . '/' . $addon . '.php'; + if (function_exists($addon . '_addon_admin_post')) { + $func = $addon . '_addon_admin_post'; + $func($a); + } + + $a->internalRedirect('admin/addons/' . $addon); + } + } + + $a->internalRedirect('admin/addons'); + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + $addons_admin = Addon::getAdminList(); + + if ($a->argc > 2) { + // @TODO: Replace with parameter from router + $addon = $a->argv[2]; + $addon = Strings::sanitizeFilePathItem($addon); + if (!is_file("addon/$addon/$addon.php")) { + notice(L10n::t('Item not found.')); + $a->internalRedirect('admin/addons'); + } + + if (defaults($_GET, 'action', '') == 'toggle') { + parent::checkFormSecurityTokenRedirectOnError('/admin/addons', 'admin_themes', 't'); + + // Toggle addon status + if (Addon::isEnabled($addon)) { + Addon::uninstall($addon); + info(L10n::t('Addon %s disabled.', $addon)); + } else { + Addon::install($addon); + info(L10n::t('Addon %s enabled.', $addon)); + } + + Addon::saveEnabledList(); + + $a->internalRedirect('admin/addons/' . $addon); + } + + // display addon details + if (Addon::isEnabled($addon)) { + $status = 'on'; + $action = L10n::t('Disable'); + } else { + $status = 'off'; + $action = L10n::t('Enable'); + } + + $readme = null; + if (is_file("addon/$addon/README.md")) { + $readme = Markdown::convert(file_get_contents("addon/$addon/README.md"), false); + } elseif (is_file("addon/$addon/README")) { + $readme = '
' . file_get_contents("addon/$addon/README") . '
'; + } + + $admin_form = ''; + if (array_key_exists($addon, $addons_admin)) { + require_once "addon/$addon/$addon.php"; + $func = $addon . '_addon_admin'; + $func($a, $admin_form); + } + + $t = Renderer::getMarkupTemplate('admin/addons/details.tpl'); + + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Addons'), + '$toggle' => L10n::t('Toggle'), + '$settings' => L10n::t('Settings'), + '$baseurl' => $a->getBaseURL(true), + + '$addon' => $addon, + '$status' => $status, + '$action' => $action, + '$info' => Addon::getInfo($addon), + '$str_author' => L10n::t('Author: '), + '$str_maintainer' => L10n::t('Maintainer: '), + + '$admin_form' => $admin_form, + '$function' => 'addons', + '$screenshot' => '', + '$readme' => $readme, + + '$form_security_token' => parent::getFormSecurityToken('admin_themes'), + ]); + } + + $a->internalRedirect('admin/addons'); + } +} diff --git a/src/Module/Admin/Addons/Index.php b/src/Module/Admin/Addons/Index.php index 9df486c10e..2fa39d8e40 100644 --- a/src/Module/Admin/Addons/Index.php +++ b/src/Module/Admin/Addons/Index.php @@ -1,62 +1,62 @@ -internalRedirect('admin/addons'); - } - - $addons = Addon::getAvailableList(); - - $t = Renderer::getMarkupTemplate('admin/addons/index.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Addons'), - '$submit' => L10n::t('Save Settings'), - '$reload' => L10n::t('Reload active addons'), - '$baseurl' => $a->getBaseURL(true), - '$function' => 'addons', - '$addons' => $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'), - '$form_security_token' => parent::getFormSecurityToken('admin_addons'), - ]); - } -} +internalRedirect('admin/addons'); + } + + $addons = Addon::getAvailableList(); + + $t = Renderer::getMarkupTemplate('admin/addons/index.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Addons'), + '$submit' => L10n::t('Save Settings'), + '$reload' => L10n::t('Reload active addons'), + '$baseurl' => $a->getBaseURL(true), + '$function' => 'addons', + '$addons' => $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'), + '$form_security_token' => parent::getFormSecurityToken('admin_addons'), + ]); + } +} diff --git a/src/Module/Admin/Blocklist/Contact.php b/src/Module/Admin/Blocklist/Contact.php index 214a30cff7..1ec6e00df0 100644 --- a/src/Module/Admin/Blocklist/Contact.php +++ b/src/Module/Admin/Blocklist/Contact.php @@ -1,86 +1,86 @@ -internalRedirect('admin/blocklist/contact'); - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - $condition = ['uid' => 0, 'blocked' => true]; - - $total = DBA::count('contact', $condition); - - $pager = new Pager($a->query_string, 30); - - $contacts = Model\Contact::select([], $condition, ['limit' => [$pager->getStart(), $pager->getItemsPerPage()]]); - - $t = Renderer::getMarkupTemplate('admin/blocklist/contact.tpl'); - $o = Renderer::replaceMacros($t, [ - // strings // - '$title' => L10n::t('Administration'), - '$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.'), - '$submit' => L10n::t('Block Remote Contact'), - '$select_all' => L10n::t('select all'), - '$select_none' => L10n::t('select none'), - '$block' => L10n::t('Block'), - '$unblock' => L10n::t('Unblock'), - '$no_data' => L10n::t('No remote contact is blocked from this node.'), - - '$h_contacts' => L10n::t('Blocked Remote Contacts'), - '$h_newblock' => L10n::t('Block New Remote Contact'), - '$th_contacts' => [L10n::t('Photo'), L10n::t('Name'), L10n::t('Address'), L10n::t('Profile URL')], - - '$form_security_token' => parent::getFormSecurityToken("admin_contactblock"), - - // values // - '$baseurl' => $a->getBaseURL(true), - - '$contacts' => $contacts, - '$total_contacts' => L10n::tt('%s total blocked contact', '%s total blocked contacts', $total), - '$paginate' => $pager->renderFull($total), - '$contacturl' => ['contact_url', L10n::t("Profile URL"), '', L10n::t("URL of the remote contact to block.")], - ]); - return $o; - } -} +internalRedirect('admin/blocklist/contact'); + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + $condition = ['uid' => 0, 'blocked' => true]; + + $total = DBA::count('contact', $condition); + + $pager = new Pager($a->query_string, 30); + + $contacts = Model\Contact::select([], $condition, ['limit' => [$pager->getStart(), $pager->getItemsPerPage()]]); + + $t = Renderer::getMarkupTemplate('admin/blocklist/contact.tpl'); + $o = Renderer::replaceMacros($t, [ + // strings // + '$title' => L10n::t('Administration'), + '$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.'), + '$submit' => L10n::t('Block Remote Contact'), + '$select_all' => L10n::t('select all'), + '$select_none' => L10n::t('select none'), + '$block' => L10n::t('Block'), + '$unblock' => L10n::t('Unblock'), + '$no_data' => L10n::t('No remote contact is blocked from this node.'), + + '$h_contacts' => L10n::t('Blocked Remote Contacts'), + '$h_newblock' => L10n::t('Block New Remote Contact'), + '$th_contacts' => [L10n::t('Photo'), L10n::t('Name'), L10n::t('Address'), L10n::t('Profile URL')], + + '$form_security_token' => parent::getFormSecurityToken("admin_contactblock"), + + // values // + '$baseurl' => $a->getBaseURL(true), + + '$contacts' => $contacts, + '$total_contacts' => L10n::tt('%s total blocked contact', '%s total blocked contacts', $total), + '$paginate' => $pager->renderFull($total), + '$contacturl' => ['contact_url', L10n::t("Profile URL"), '', L10n::t("URL of the remote contact to block.")], + ]); + return $o; + } +} diff --git a/src/Module/Admin/Blocklist/Server.php b/src/Module/Admin/Blocklist/Server.php index 2d5f978937..754d1aad51 100644 --- a/src/Module/Admin/Blocklist/Server.php +++ b/src/Module/Admin/Blocklist/Server.php @@ -1,92 +1,92 @@ - Strings::escapeTags(trim($_POST['newentry_domain'])), - 'reason' => Strings::escapeTags(trim($_POST['newentry_reason'])) - ]; - Config::set('system', 'blocklist', $blocklist); - info(L10n::t('Server added to blocklist.') . EOL); - } else { - // Edit the entries from blocklist - $blocklist = []; - foreach ($_POST['domain'] as $id => $domain) { - // Trimming whitespaces as well as any lingering slashes - $domain = Strings::escapeTags(trim($domain, "\x00..\x1F/")); - $reason = Strings::escapeTags(trim($_POST['reason'][$id])); - if (empty($_POST['delete'][$id])) { - $blocklist[] = [ - 'domain' => $domain, - 'reason' => $reason - ]; - } - } - Config::set('system', 'blocklist', $blocklist); - info(L10n::t('Site blocklist updated.') . EOL); - } - - self::getApp()->internalRedirect('admin/blocklist/server'); - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - $blocklist = Config::get('system', 'blocklist'); - $blocklistform = []; - if (is_array($blocklist)) { - foreach ($blocklist as $id => $b) { - $blocklistform[] = [ - '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', '', ''], - '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'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$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.'), - '$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'), - '$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', '', ''], - '$submit' => L10n::t('Add Entry'), - '$savechanges' => L10n::t('Save changes to the blocklist'), - '$currenttitle' => L10n::t('Current Entries in the Blocklist'), - '$thurl' => L10n::t('Blocked domain'), - '$threason' => L10n::t('Reason for the block'), - '$delentry' => L10n::t('Delete entry from blocklist'), - '$entries' => $blocklistform, - '$baseurl' => $a->getBaseURL(true), - '$confirm_delete' => L10n::t('Delete entry from blocklist?'), - '$form_security_token' => parent::getFormSecurityToken("admin_blocklist") - ]); - } -} + Strings::escapeTags(trim($_POST['newentry_domain'])), + 'reason' => Strings::escapeTags(trim($_POST['newentry_reason'])) + ]; + Config::set('system', 'blocklist', $blocklist); + info(L10n::t('Server added to blocklist.') . EOL); + } else { + // Edit the entries from blocklist + $blocklist = []; + foreach ($_POST['domain'] as $id => $domain) { + // Trimming whitespaces as well as any lingering slashes + $domain = Strings::escapeTags(trim($domain, "\x00..\x1F/")); + $reason = Strings::escapeTags(trim($_POST['reason'][$id])); + if (empty($_POST['delete'][$id])) { + $blocklist[] = [ + 'domain' => $domain, + 'reason' => $reason + ]; + } + } + Config::set('system', 'blocklist', $blocklist); + info(L10n::t('Site blocklist updated.') . EOL); + } + + self::getApp()->internalRedirect('admin/blocklist/server'); + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + $blocklist = Config::get('system', 'blocklist'); + $blocklistform = []; + if (is_array($blocklist)) { + foreach ($blocklist as $id => $b) { + $blocklistform[] = [ + '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', '', ''], + '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'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$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.'), + '$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'), + '$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', '', ''], + '$submit' => L10n::t('Add Entry'), + '$savechanges' => L10n::t('Save changes to the blocklist'), + '$currenttitle' => L10n::t('Current Entries in the Blocklist'), + '$thurl' => L10n::t('Blocked domain'), + '$threason' => L10n::t('Reason for the block'), + '$delentry' => L10n::t('Delete entry from blocklist'), + '$entries' => $blocklistform, + '$baseurl' => $a->getBaseURL(true), + '$confirm_delete' => L10n::t('Delete entry from blocklist?'), + '$form_security_token' => parent::getFormSecurityToken("admin_blocklist") + ]); + } +} diff --git a/src/Module/Admin/DBSync.php b/src/Module/Admin/DBSync.php index 69001b9ce4..4c29eea34f 100644 --- a/src/Module/Admin/DBSync.php +++ b/src/Module/Admin/DBSync.php @@ -1,107 +1,107 @@ -argc > 3 && $a->argv[2] === 'mark') { - // @TODO: Replace with parameter from router - $update = intval($a->argv[3]); - if ($update) { - Config::set('database', 'update_' . $update, 'success'); - $curr = Config::get('system', 'build'); - if (intval($curr) == $update) { - Config::set('system', 'build', intval($curr) + 1); - } - info(L10n::t('Update has been marked successful') . EOL); - } - $a->internalRedirect('admin/dbsync'); - } - - if ($a->argc > 2) { - if ($a->argv[2] === 'check') { - // @TODO Seems like a similar logic like Update::check() - $retval = DBStructure::update($a->getBasePath(), false, true); - if ($retval === '') { - $o .= L10n::t("Database structure update %s was successfully applied.", DB_UPDATE_VERSION) . "
"; - Config::set('database', 'last_successful_update', DB_UPDATE_VERSION); - Config::set('database', 'last_successful_update_time', time()); - } else { - $o .= L10n::t("Executing of database structure update %s failed with error: %s", DB_UPDATE_VERSION, $retval) . "
"; - } - if ($a->argv[2] === 'check') { - return $o; - } - } elseif (intval($a->argv[2])) { - require_once 'update.php'; - - // @TODO: Replace with parameter from router - $update = intval($a->argv[2]); - - $func = 'update_' . $update; - - if (function_exists($func)) { - $retval = $func(); - - if ($retval === Update::FAILED) { - $o .= L10n::t("Executing %s failed with error: %s", $func, $retval); - } elseif ($retval === Update::SUCCESS) { - $o .= L10n::t('Update %s was successfully applied.', $func); - Config::set('database', $func, 'success'); - } else { - $o .= L10n::t('Update %s did not return a status. Unknown if it succeeded.', $func); - } - } else { - $o .= L10n::t('There was no additional update function %s that needed to be called.', $func) . "
"; - Config::set('database', $func, 'success'); - } - - return $o; - } - } - - $failed = []; - $configStmt = DBA::select('config', ['k', 'v'], ['cat' => 'database']); - while ($config = DBA::fetch($configStmt)) { - $upd = intval(substr($config['k'], 7)); - if ($upd >= 1139 && $config['v'] != 'success') { - $failed[] = $upd; - } - } - - if (!count($failed)) { - $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/structure_check.tpl'), [ - '$base' => $a->getBaseURL(true), - '$banner' => L10n::t('No failed updates.'), - '$check' => L10n::t('Check database structure'), - ]); - } else { - $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/failed_updates.tpl'), [ - '$base' => $a->getBaseURL(true), - '$banner' => L10n::t('Failed Updates'), - '$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"), - '$apply' => L10n::t('Attempt to execute this update step automatically'), - '$failed' => $failed - ]); - } - - return $o; - } -} +argc > 3 && $a->argv[2] === 'mark') { + // @TODO: Replace with parameter from router + $update = intval($a->argv[3]); + if ($update) { + Config::set('database', 'update_' . $update, 'success'); + $curr = Config::get('system', 'build'); + if (intval($curr) == $update) { + Config::set('system', 'build', intval($curr) + 1); + } + info(L10n::t('Update has been marked successful') . EOL); + } + $a->internalRedirect('admin/dbsync'); + } + + if ($a->argc > 2) { + if ($a->argv[2] === 'check') { + // @TODO Seems like a similar logic like Update::check() + $retval = DBStructure::update($a->getBasePath(), false, true); + if ($retval === '') { + $o .= L10n::t("Database structure update %s was successfully applied.", DB_UPDATE_VERSION) . "
"; + Config::set('database', 'last_successful_update', DB_UPDATE_VERSION); + Config::set('database', 'last_successful_update_time', time()); + } else { + $o .= L10n::t("Executing of database structure update %s failed with error: %s", DB_UPDATE_VERSION, $retval) . "
"; + } + if ($a->argv[2] === 'check') { + return $o; + } + } elseif (intval($a->argv[2])) { + require_once 'update.php'; + + // @TODO: Replace with parameter from router + $update = intval($a->argv[2]); + + $func = 'update_' . $update; + + if (function_exists($func)) { + $retval = $func(); + + if ($retval === Update::FAILED) { + $o .= L10n::t("Executing %s failed with error: %s", $func, $retval); + } elseif ($retval === Update::SUCCESS) { + $o .= L10n::t('Update %s was successfully applied.', $func); + Config::set('database', $func, 'success'); + } else { + $o .= L10n::t('Update %s did not return a status. Unknown if it succeeded.', $func); + } + } else { + $o .= L10n::t('There was no additional update function %s that needed to be called.', $func) . "
"; + Config::set('database', $func, 'success'); + } + + return $o; + } + } + + $failed = []; + $configStmt = DBA::select('config', ['k', 'v'], ['cat' => 'database']); + while ($config = DBA::fetch($configStmt)) { + $upd = intval(substr($config['k'], 7)); + if ($upd >= 1139 && $config['v'] != 'success') { + $failed[] = $upd; + } + } + + if (!count($failed)) { + $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/structure_check.tpl'), [ + '$base' => $a->getBaseURL(true), + '$banner' => L10n::t('No failed updates.'), + '$check' => L10n::t('Check database structure'), + ]); + } else { + $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/dbsync/failed_updates.tpl'), [ + '$base' => $a->getBaseURL(true), + '$banner' => L10n::t('Failed Updates'), + '$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"), + '$apply' => L10n::t('Attempt to execute this update step automatically'), + '$failed' => $failed + ]); + } + + return $o; + } +} diff --git a/src/Module/Admin/Features.php b/src/Module/Admin/Features.php index cb9acf4eb1..328e7e68b5 100644 --- a/src/Module/Admin/Features.php +++ b/src/Module/Admin/Features.php @@ -1,74 +1,74 @@ - $fdata) { - foreach (array_slice($fdata, 1) as $f) { - $feature = $f[0]; - $feature_state = 'feature_' . $feature; - $featurelock = 'featurelock_' . $feature; - - if (!empty($_POST[$feature_state])) { - $val = intval($_POST[$feature_state]); - } else { - $val = 0; - } - Config::set('feature', $feature, $val); - - if (!empty($_POST[$featurelock])) { - Config::set('feature_lock', $feature, $val); - } else { - Config::delete('feature_lock', $feature); - } - } - } - - self::getApp()->internalRedirect('admin/features'); - } - - public static function content() - { - parent::content(); - - $arr = []; - $features = Feature::get(false); - - foreach ($features as $fname => $fdata) { - $arr[$fname] = []; - $arr[$fname][0] = $fdata[0]; - foreach (array_slice($fdata, 1) as $f) { - $set = Config::get('feature', $f[0], $f[3]); - $arr[$fname][1][] = [ - ['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')]] - ]; - } - } - - $tpl = Renderer::getMarkupTemplate('admin/features.tpl'); - $o = Renderer::replaceMacros($tpl, [ - '$form_security_token' => parent::getFormSecurityToken("admin_manage_features"), - '$title' => L10n::t('Manage Additional Features'), - '$features' => $arr, - '$submit' => L10n::t('Save Settings'), - ]); - - return $o; - } -} \ No newline at end of file + $fdata) { + foreach (array_slice($fdata, 1) as $f) { + $feature = $f[0]; + $feature_state = 'feature_' . $feature; + $featurelock = 'featurelock_' . $feature; + + if (!empty($_POST[$feature_state])) { + $val = intval($_POST[$feature_state]); + } else { + $val = 0; + } + Config::set('feature', $feature, $val); + + if (!empty($_POST[$featurelock])) { + Config::set('feature_lock', $feature, $val); + } else { + Config::delete('feature_lock', $feature); + } + } + } + + self::getApp()->internalRedirect('admin/features'); + } + + public static function content() + { + parent::content(); + + $arr = []; + $features = Feature::get(false); + + foreach ($features as $fname => $fdata) { + $arr[$fname] = []; + $arr[$fname][0] = $fdata[0]; + foreach (array_slice($fdata, 1) as $f) { + $set = Config::get('feature', $f[0], $f[3]); + $arr[$fname][1][] = [ + ['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')]] + ]; + } + } + + $tpl = Renderer::getMarkupTemplate('admin/features.tpl'); + $o = Renderer::replaceMacros($tpl, [ + '$form_security_token' => parent::getFormSecurityToken("admin_manage_features"), + '$title' => L10n::t('Manage Additional Features'), + '$features' => $arr, + '$submit' => L10n::t('Save Settings'), + ]); + + return $o; + } +} diff --git a/src/Module/Admin/Item/Delete.php b/src/Module/Admin/Item/Delete.php index 9a9c9209b6..766e65c9a0 100644 --- a/src/Module/Admin/Item/Delete.php +++ b/src/Module/Admin/Item/Delete.php @@ -1,55 +1,55 @@ - $guid]); - } - - info(L10n::t('Item marked for deletion.') . EOL); - self::getApp()->internalRedirect('admin/item/delete'); - } - - public static function content() - { - parent::content(); - - $t = Renderer::getMarkupTemplate('admin/item/delete.tpl'); - - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Delete 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.'), - '$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'], - '$form_security_token' => parent::getFormSecurityToken("admin_deleteitem") - ]); - } -} \ No newline at end of file + $guid]); + } + + info(L10n::t('Item marked for deletion.') . EOL); + self::getApp()->internalRedirect('admin/item/delete'); + } + + public static function content() + { + parent::content(); + + $t = Renderer::getMarkupTemplate('admin/item/delete.tpl'); + + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Delete 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.'), + '$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'], + '$form_security_token' => parent::getFormSecurityToken("admin_deleteitem") + ]); + } +} diff --git a/src/Module/Admin/Logs/Settings.php b/src/Module/Admin/Logs/Settings.php index c42c5402ca..d55618454f 100644 --- a/src/Module/Admin/Logs/Settings.php +++ b/src/Module/Admin/Logs/Settings.php @@ -1,74 +1,74 @@ -internalRedirect('admin/logs'); - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - $log_choices = [ - LogLevel::ERROR => 'Error', - LogLevel::WARNING => 'Warning', - LogLevel::NOTICE => 'Notice', - LogLevel::INFO => 'Info', - LogLevel::DEBUG => 'Debug', - ]; - - if (ini_get('log_errors')) { - $phplogenabled = L10n::t('PHP log currently enabled.'); - } else { - $phplogenabled = L10n::t('PHP log currently disabled.'); - } - - $t = Renderer::getMarkupTemplate('admin/logs/settings.tpl'); - - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Logs'), - '$submit' => L10n::t('Save Settings'), - '$clear' => L10n::t('Clear'), - '$baseurl' => $a->getBaseURL(true), - '$logname' => Config::get('system', 'logfile'), - // see /help/smarty3-templates#1_1 on any Friendica node - '$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.")], - '$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices], - '$form_security_token' => parent::getFormSecurityToken("admin_logs"), - '$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."), - '$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, - ]); - } -} +internalRedirect('admin/logs'); + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + $log_choices = [ + LogLevel::ERROR => 'Error', + LogLevel::WARNING => 'Warning', + LogLevel::NOTICE => 'Notice', + LogLevel::INFO => 'Info', + LogLevel::DEBUG => 'Debug', + ]; + + if (ini_get('log_errors')) { + $phplogenabled = L10n::t('PHP log currently enabled.'); + } else { + $phplogenabled = L10n::t('PHP log currently disabled.'); + } + + $t = Renderer::getMarkupTemplate('admin/logs/settings.tpl'); + + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Logs'), + '$submit' => L10n::t('Save Settings'), + '$clear' => L10n::t('Clear'), + '$baseurl' => $a->getBaseURL(true), + '$logname' => Config::get('system', 'logfile'), + // see /help/smarty3-templates#1_1 on any Friendica node + '$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.")], + '$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices], + '$form_security_token' => parent::getFormSecurityToken("admin_logs"), + '$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."), + '$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, + ]); + } +} diff --git a/src/Module/Admin/Logs/View.php b/src/Module/Admin/Logs/View.php index 45b19bfacf..b66a6781e5 100644 --- a/src/Module/Admin/Logs/View.php +++ b/src/Module/Admin/Logs/View.php @@ -1,52 +1,52 @@ -%1$s log file.\r\n
Check to see if file %1$s exist and is readable.', $f); - } else { - $fp = fopen($f, 'r'); - if (!$fp) { - $data = L10n::t('Couldn\'t open %1$s log file.\r\n
Check to see if file %1$s is readable.', $f); - } else { - $fstat = fstat($fp); - $size = $fstat['size']; - if ($size != 0) { - if ($size > 5000000 || $size < 0) { - $size = 5000000; - } - $seek = fseek($fp, 0 - $size, SEEK_END); - if ($seek === 0) { - $data = Strings::escapeHtml(fread($fp, $size)); - while (!feof($fp)) { - $data .= Strings::escapeHtml(fread($fp, 4096)); - } - } - } - fclose($fp); - } - } - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('View Logs'), - '$data' => $data, - '$logname' => Config::get('system', 'logfile') - ]); - } -} +%1$s log file.\r\n
Check to see if file %1$s exist and is readable.', $f); + } else { + $fp = fopen($f, 'r'); + if (!$fp) { + $data = L10n::t('Couldn\'t open %1$s log file.\r\n
Check to see if file %1$s is readable.', $f); + } else { + $fstat = fstat($fp); + $size = $fstat['size']; + if ($size != 0) { + if ($size > 5000000 || $size < 0) { + $size = 5000000; + } + $seek = fseek($fp, 0 - $size, SEEK_END); + if ($seek === 0) { + $data = Strings::escapeHtml(fread($fp, $size)); + while (!feof($fp)) { + $data .= Strings::escapeHtml(fread($fp, 4096)); + } + } + } + fclose($fp); + } + } + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('View Logs'), + '$data' => $data, + '$logname' => Config::get('system', 'logfile') + ]); + } +} diff --git a/src/Module/Admin/PhpInfo.php b/src/Module/Admin/PhpInfo.php index 2d0e9c1d5a..b912117dc1 100644 --- a/src/Module/Admin/PhpInfo.php +++ b/src/Module/Admin/PhpInfo.php @@ -1,16 +1,16 @@ -argc > 2 && $a->argv[2] == 'deferred'; - - // get jobs from the workerqueue table - if ($deferred) { - $condition = ["NOT `done` AND `next_try` > ?", DateTimeFormat::utcNow()]; - $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."); - } else { - $condition = ["NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()]; - $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.'); - } - - $entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], $condition, ['order' => ['priority']]); - - $r = []; - while ($entry = DBA::fetch($entries)) { - // fix GH-5469. ref: src/Core/Worker.php:217 - $entry['parameter'] = Arrays::recursiveImplode(json_decode($entry['parameter'], true), ': '); - $entry['created'] = DateTimeFormat::local($entry['created']); - $r[] = $entry; - } - DBA::close($entries); - - $t = Renderer::getMarkupTemplate('admin/queue.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => $sub_title, - '$count' => count($r), - '$id_header' => L10n::t('ID'), - '$param_header' => L10n::t('Job Parameters'), - '$created_header' => L10n::t('Created'), - '$prio_header' => L10n::t('Priority'), - '$info' => $info, - '$entries' => $r, - ]); - } -} +argc > 2 && $a->argv[2] == 'deferred'; + + // get jobs from the workerqueue table + if ($deferred) { + $condition = ["NOT `done` AND `next_try` > ?", DateTimeFormat::utcNow()]; + $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."); + } else { + $condition = ["NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()]; + $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.'); + } + + $entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], $condition, ['order' => ['priority']]); + + $r = []; + while ($entry = DBA::fetch($entries)) { + // fix GH-5469. ref: src/Core/Worker.php:217 + $entry['parameter'] = Arrays::recursiveImplode(json_decode($entry['parameter'], true), ': '); + $entry['created'] = DateTimeFormat::local($entry['created']); + $r[] = $entry; + } + DBA::close($entries); + + $t = Renderer::getMarkupTemplate('admin/queue.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => $sub_title, + '$count' => count($r), + '$id_header' => L10n::t('ID'), + '$param_header' => L10n::t('Job Parameters'), + '$created_header' => L10n::t('Created'), + '$prio_header' => L10n::t('Priority'), + '$info' => $info, + '$entries' => $r, + ]); + } +} diff --git a/src/Module/Admin/Site.php b/src/Module/Admin/Site.php index 05ca16a16f..37507ca996 100644 --- a/src/Module/Admin/Site.php +++ b/src/Module/Admin/Site.php @@ -39,6 +39,7 @@ class Site extends BaseAdminModule } // 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'] != "") { $new_url = $_POST['relocate_url']; $new_url = rtrim($new_url, "/"); diff --git a/src/Module/Admin/Summary.php b/src/Module/Admin/Summary.php index 8529c7142c..a78a6b8d7c 100644 --- a/src/Module/Admin/Summary.php +++ b/src/Module/Admin/Summary.php @@ -1,147 +1,147 @@ - '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 here for a guide that may be helpful converting the table engines. You may also use the command php bin/console.php dbstructure toinnodb of your Friendica installation for an automatic conversion.
', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); - } - - // 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 - if (Config::get('system', 'check_new_version_url', 'none') != 'none') { - $gitversion = Config::get('system', 'git_friendica_version'); - 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); - } - } - - if (Config::get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) { - DBStructure::update($a->getBasePath(), false, true); - } - - 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.'); - } - - 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.)'); - } - - $last_worker_call = Config::get('system', 'last_worker_execution', false); - if (!$last_worker_call) { - $warningtext[] = L10n::t('The worker was never executed. Please check your database structure!'); - } 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); - } - - // Legacy config file warning - 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 .htconfig.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); - } - - 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 config/local.ini.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); - } - - // Check server vitality - if (!self::checkSelfHostMeta()) { - $well_known = $a->getBaseURL() . '/.well-known/host-meta'; - $warningtext[] = L10n::t('%s is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See the installation page for help.', - $well_known, $well_known, $a->getBaseURL() . '/help/Install'); - } - - $accounts = [ - [L10n::t('Normal Account'), 0], - [L10n::t('Automatic Follower Account'), 0], - [L10n::t('Public Forum Account'), 0], - [L10n::t('Automatic Friend Account'), 0], - [L10n::t('Blog Account'), 0], - [L10n::t('Private Forum Account'), 0] - ]; - - $users = 0; - $pageFlagsCountStmt = DBA::p('SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`'); - while ($pageFlagsCount = DBA::fetch($pageFlagsCountStmt)) { - $accounts[$pageFlagsCount['page-flags']][1] = $pageFlagsCount['count']; - $users += $pageFlagsCount['count']; - } - DBA::close($pageFlagsCountStmt); - - Logger::log('accounts: ' . print_r($accounts, true), Logger::DATA); - - $pending = Register::getPendingCount(); - - $queue = DBA::count('queue', []); - - $deferred = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` > ?', - DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); - - $workerqueue = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` < ?', - DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); - - // We can do better, but this is a quick queue status - $queues = ['label' => L10n::t('Message queues'), 'queue' => $queue, 'deferred' => $deferred, 'workerq' => $workerqueue]; - - $variables = DBA::toArray(DBA::p('SHOW variables LIKE "max_allowed_packet"')); - $max_allowed_packet = $variables ? $variables[0]['Value'] : 0; - - $server_settings = [ - 'label' => L10n::t('Server Settings'), - 'php' => [ - 'upload_max_filesize' => ini_get('upload_max_filesize'), - 'post_max_size' => ini_get('post_max_size'), - 'memory_limit' => ini_get('memory_limit') - ], - 'mysql' => [ - 'max_allowed_packet' => $max_allowed_packet - ] - ]; - - $t = Renderer::getMarkupTemplate('admin/summary.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Summary'), - '$queues' => $queues, - '$users' => [L10n::t('Registered users'), $users], - '$accounts' => $accounts, - '$pending' => [L10n::t('Pending registrations'), $pending], - '$version' => [L10n::t('Version'), FRIENDICA_VERSION], - '$platform' => FRIENDICA_PLATFORM, - '$codename' => FRIENDICA_CODENAME, - '$build' => Config::get('system', 'build'), - '$addons' => [L10n::t('Active addons'), Addon::getEnabledList()], - '$serversettings' => $server_settings, - '$warningtext' => $warningtext - ]); - } - - private static function checkSelfHostMeta() - { - // Fetch the host-meta to check if this really is a vital server - return Network::curl(self::getApp()->getBaseURL() . '/.well-known/host-meta')->isSuccess(); - } - -} \ No newline at end of file + '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 here for a guide that may be helpful converting the table engines. You may also use the command php bin/console.php dbstructure toinnodb of your Friendica installation for an automatic conversion.
', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); + } + + // 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 + if (Config::get('system', 'check_new_version_url', 'none') != 'none') { + $gitversion = Config::get('system', 'git_friendica_version'); + 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); + } + } + + if (Config::get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) { + DBStructure::update($a->getBasePath(), false, true); + } + + 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.'); + } + + 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.)'); + } + + $last_worker_call = Config::get('system', 'last_worker_execution', false); + if (!$last_worker_call) { + $warningtext[] = L10n::t('The worker was never executed. Please check your database structure!'); + } 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); + } + + // Legacy config file warning + 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 .htconfig.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); + } + + 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 config/local.ini.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); + } + + // Check server vitality + if (!self::checkSelfHostMeta()) { + $well_known = $a->getBaseURL() . '/.well-known/host-meta'; + $warningtext[] = L10n::t('%s is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See the installation page for help.', + $well_known, $well_known, $a->getBaseURL() . '/help/Install'); + } + + $accounts = [ + [L10n::t('Normal Account'), 0], + [L10n::t('Automatic Follower Account'), 0], + [L10n::t('Public Forum Account'), 0], + [L10n::t('Automatic Friend Account'), 0], + [L10n::t('Blog Account'), 0], + [L10n::t('Private Forum Account'), 0] + ]; + + $users = 0; + $pageFlagsCountStmt = DBA::p('SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`'); + while ($pageFlagsCount = DBA::fetch($pageFlagsCountStmt)) { + $accounts[$pageFlagsCount['page-flags']][1] = $pageFlagsCount['count']; + $users += $pageFlagsCount['count']; + } + DBA::close($pageFlagsCountStmt); + + Logger::log('accounts: ' . print_r($accounts, true), Logger::DATA); + + $pending = Register::getPendingCount(); + + $queue = DBA::count('queue', []); + + $deferred = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` > ?', + DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); + + $workerqueue = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` < ?', + DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); + + // We can do better, but this is a quick queue status + $queues = ['label' => L10n::t('Message queues'), 'queue' => $queue, 'deferred' => $deferred, 'workerq' => $workerqueue]; + + $variables = DBA::toArray(DBA::p('SHOW variables LIKE "max_allowed_packet"')); + $max_allowed_packet = $variables ? $variables[0]['Value'] : 0; + + $server_settings = [ + 'label' => L10n::t('Server Settings'), + 'php' => [ + 'upload_max_filesize' => ini_get('upload_max_filesize'), + 'post_max_size' => ini_get('post_max_size'), + 'memory_limit' => ini_get('memory_limit') + ], + 'mysql' => [ + 'max_allowed_packet' => $max_allowed_packet + ] + ]; + + $t = Renderer::getMarkupTemplate('admin/summary.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Summary'), + '$queues' => $queues, + '$users' => [L10n::t('Registered users'), $users], + '$accounts' => $accounts, + '$pending' => [L10n::t('Pending registrations'), $pending], + '$version' => [L10n::t('Version'), FRIENDICA_VERSION], + '$platform' => FRIENDICA_PLATFORM, + '$codename' => FRIENDICA_CODENAME, + '$build' => Config::get('system', 'build'), + '$addons' => [L10n::t('Active addons'), Addon::getEnabledList()], + '$serversettings' => $server_settings, + '$warningtext' => $warningtext + ]); + } + + private static function checkSelfHostMeta() + { + // Fetch the host-meta to check if this really is a vital server + return Network::curl(self::getApp()->getBaseURL() . '/.well-known/host-meta')->isSuccess(); + } + +} diff --git a/src/Module/Admin/Themes/Details.php b/src/Module/Admin/Themes/Details.php index d8a2d2139d..3750e96070 100644 --- a/src/Module/Admin/Themes/Details.php +++ b/src/Module/Admin/Themes/Details.php @@ -1,126 +1,126 @@ -argc > 2) { - // @TODO: Replace with parameter from router - $theme = $a->argv[2]; - $theme = Strings::sanitizeFilePathItem($theme); - if (is_file("view/theme/$theme/config.php")) { - require_once "view/theme/$theme/config.php"; - - if (function_exists('theme_admin_post')) { - theme_admin_post($a); - } - } - - info(L10n::t('Theme settings updated.')); - - if ($a->isAjax()) { - return; - } - - $a->internalRedirect('admin/themes/' . $theme); - } - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - if ($a->argc > 2) { - // @TODO: Replace with parameter from router - $theme = $a->argv[2]; - $theme = Strings::sanitizeFilePathItem($theme); - if (!is_dir("view/theme/$theme")) { - notice(L10n::t("Item not found.")); - return ''; - } - - $isEnabled = in_array($theme, Theme::getAllowedList()); - if ($isEnabled) { - $status = "on"; - $action = L10n::t("Disable"); - } else { - $status = "off"; - $action = L10n::t("Enable"); - } - - if (!empty($_GET['action']) && $_GET['action'] == 'toggle') { - parent::checkFormSecurityTokenRedirectOnError('/admin/themes', 'admin_themes', 't'); - - if ($isEnabled) { - Theme::uninstall($theme); - info(L10n::t('Theme %s disabled.', $theme)); - } elseif (Theme::install($theme)) { - info(L10n::t('Theme %s successfully enabled.', $theme)); - } else { - info(L10n::t('Theme %s failed to install.', $theme)); - } - - $a->internalRedirect('admin/themes/' . $theme); - } - - $readme = null; - if (is_file("view/theme/$theme/README.md")) { - $readme = Markdown::convert(file_get_contents("view/theme/$theme/README.md"), false); - } elseif (is_file("view/theme/$theme/README")) { - $readme = "
" . file_get_contents("view/theme/$theme/README") . "
"; - } - - $admin_form = ''; - if (is_file("view/theme/$theme/config.php")) { - require_once "view/theme/$theme/config.php"; - - if (function_exists('theme_admin')) { - $admin_form = ''; - } - } - - $screenshot = [Theme::getScreenshot($theme), L10n::t('Screenshot')]; - if (!stristr($screenshot[0], $theme)) { - $screenshot = null; - } - - $t = Renderer::getMarkupTemplate('admin/addons/details.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Themes'), - '$toggle' => L10n::t('Toggle'), - '$settings' => L10n::t('Settings'), - '$baseurl' => $a->getBaseURL(true), - '$addon' => $theme, - '$status' => $status, - '$action' => $action, - '$info' => Theme::getInfo($theme), - '$function' => 'themes', - '$admin_form' => $admin_form, - '$str_author' => L10n::t('Author: '), - '$str_maintainer' => L10n::t('Maintainer: '), - '$screenshot' => $screenshot, - '$readme' => $readme, - - '$form_security_token' => parent::getFormSecurityToken("admin_themes"), - ]); - } - - $a->internalRedirect('admin/themes'); - } -} \ No newline at end of file +argc > 2) { + // @TODO: Replace with parameter from router + $theme = $a->argv[2]; + $theme = Strings::sanitizeFilePathItem($theme); + if (is_file("view/theme/$theme/config.php")) { + require_once "view/theme/$theme/config.php"; + + if (function_exists('theme_admin_post')) { + theme_admin_post($a); + } + } + + info(L10n::t('Theme settings updated.')); + + if ($a->isAjax()) { + return; + } + + $a->internalRedirect('admin/themes/' . $theme); + } + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + if ($a->argc > 2) { + // @TODO: Replace with parameter from router + $theme = $a->argv[2]; + $theme = Strings::sanitizeFilePathItem($theme); + if (!is_dir("view/theme/$theme")) { + notice(L10n::t("Item not found.")); + return ''; + } + + $isEnabled = in_array($theme, Theme::getAllowedList()); + if ($isEnabled) { + $status = "on"; + $action = L10n::t("Disable"); + } else { + $status = "off"; + $action = L10n::t("Enable"); + } + + if (!empty($_GET['action']) && $_GET['action'] == 'toggle') { + parent::checkFormSecurityTokenRedirectOnError('/admin/themes', 'admin_themes', 't'); + + if ($isEnabled) { + Theme::uninstall($theme); + info(L10n::t('Theme %s disabled.', $theme)); + } elseif (Theme::install($theme)) { + info(L10n::t('Theme %s successfully enabled.', $theme)); + } else { + info(L10n::t('Theme %s failed to install.', $theme)); + } + + $a->internalRedirect('admin/themes/' . $theme); + } + + $readme = null; + if (is_file("view/theme/$theme/README.md")) { + $readme = Markdown::convert(file_get_contents("view/theme/$theme/README.md"), false); + } elseif (is_file("view/theme/$theme/README")) { + $readme = "
" . file_get_contents("view/theme/$theme/README") . "
"; + } + + $admin_form = ''; + if (is_file("view/theme/$theme/config.php")) { + require_once "view/theme/$theme/config.php"; + + if (function_exists('theme_admin')) { + $admin_form = ''; + } + } + + $screenshot = [Theme::getScreenshot($theme), L10n::t('Screenshot')]; + if (!stristr($screenshot[0], $theme)) { + $screenshot = null; + } + + $t = Renderer::getMarkupTemplate('admin/addons/details.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Themes'), + '$toggle' => L10n::t('Toggle'), + '$settings' => L10n::t('Settings'), + '$baseurl' => $a->getBaseURL(true), + '$addon' => $theme, + '$status' => $status, + '$action' => $action, + '$info' => Theme::getInfo($theme), + '$function' => 'themes', + '$admin_form' => $admin_form, + '$str_author' => L10n::t('Author: '), + '$str_maintainer' => L10n::t('Maintainer: '), + '$screenshot' => $screenshot, + '$readme' => $readme, + + '$form_security_token' => parent::getFormSecurityToken("admin_themes"), + ]); + } + + $a->internalRedirect('admin/themes'); + } +} diff --git a/src/Module/Admin/Themes/Embed.php b/src/Module/Admin/Themes/Embed.php index 4ca2a4e7ad..dc41d11a48 100644 --- a/src/Module/Admin/Themes/Embed.php +++ b/src/Module/Admin/Themes/Embed.php @@ -1,90 +1,90 @@ -argc > 2) { - // @TODO: Replace with parameter from router - $theme = $a->argv[2]; - $theme = Strings::sanitizeFilePathItem($theme); - if (is_file("view/theme/$theme/config.php")) { - $a->setCurrentTheme($theme); - } - } - } - - public static function post() - { - parent::post(); - - $a = self::getApp(); - - if ($a->argc > 2) { - // @TODO: Replace with parameter from router - $theme = $a->argv[2]; - $theme = Strings::sanitizeFilePathItem($theme); - if (is_file("view/theme/$theme/config.php")) { - self::checkFormSecurityTokenRedirectOnError('/admin/themes/' . $theme . '/embed?mode=minimal', 'admin_theme_settings'); - - require_once "view/theme/$theme/config.php"; - - if (function_exists('theme_admin_post')) { - theme_admin_post($a); - } - } - - info(L10n::t('Theme settings updated.')); - - if ($a->isAjax()) { - return; - } - - $a->internalRedirect('admin/themes/' . $theme . '/embed?mode=minimal'); - } - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - if ($a->argc > 2) { - // @TODO: Replace with parameter from router - $theme = $a->argv[2]; - $theme = Strings::sanitizeFilePathItem($theme); - if (!is_dir("view/theme/$theme")) { - notice(L10n::t('Unknown theme.')); - return ''; - } - - $admin_form = ''; - if (is_file("view/theme/$theme/config.php")) { - require_once "view/theme/$theme/config.php"; - - if (function_exists('theme_admin')) { - $admin_form = theme_admin($a); - } - } - - $t = Renderer::getMarkupTemplate('admin/addons/embed.tpl'); - return Renderer::replaceMacros($t, [ - '$action' => '/admin/themes/' . $theme . '/embed?mode=minimal', - '$form' => $admin_form, - '$form_security_token' => parent::getFormSecurityToken("admin_theme_settings"), - ]); - } - - return ''; - } -} \ No newline at end of file +argc > 2) { + // @TODO: Replace with parameter from router + $theme = $a->argv[2]; + $theme = Strings::sanitizeFilePathItem($theme); + if (is_file("view/theme/$theme/config.php")) { + $a->setCurrentTheme($theme); + } + } + } + + public static function post() + { + parent::post(); + + $a = self::getApp(); + + if ($a->argc > 2) { + // @TODO: Replace with parameter from router + $theme = $a->argv[2]; + $theme = Strings::sanitizeFilePathItem($theme); + if (is_file("view/theme/$theme/config.php")) { + self::checkFormSecurityTokenRedirectOnError('/admin/themes/' . $theme . '/embed?mode=minimal', 'admin_theme_settings'); + + require_once "view/theme/$theme/config.php"; + + if (function_exists('theme_admin_post')) { + theme_admin_post($a); + } + } + + info(L10n::t('Theme settings updated.')); + + if ($a->isAjax()) { + return; + } + + $a->internalRedirect('admin/themes/' . $theme . '/embed?mode=minimal'); + } + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + if ($a->argc > 2) { + // @TODO: Replace with parameter from router + $theme = $a->argv[2]; + $theme = Strings::sanitizeFilePathItem($theme); + if (!is_dir("view/theme/$theme")) { + notice(L10n::t('Unknown theme.')); + return ''; + } + + $admin_form = ''; + if (is_file("view/theme/$theme/config.php")) { + require_once "view/theme/$theme/config.php"; + + if (function_exists('theme_admin')) { + $admin_form = theme_admin($a); + } + } + + $t = Renderer::getMarkupTemplate('admin/addons/embed.tpl'); + return Renderer::replaceMacros($t, [ + '$action' => '/admin/themes/' . $theme . '/embed?mode=minimal', + '$form' => $admin_form, + '$form_security_token' => parent::getFormSecurityToken("admin_theme_settings"), + ]); + } + + return ''; + } +} diff --git a/src/Module/Admin/Themes/Index.php b/src/Module/Admin/Themes/Index.php index 62c775bf04..71a91919bd 100644 --- a/src/Module/Admin/Themes/Index.php +++ b/src/Module/Admin/Themes/Index.php @@ -1,107 +1,107 @@ -getBaseURL() . '/admin/themes', 'admin_themes', 't'); - - switch ($_GET['action']) { - case 'reload': - foreach ($allowed_themes as $theme) { - Theme::uninstall($theme['name']); - Theme::install($theme['name']); - } - - info('Themes reloaded'); - break; - - case 'toggle' : - $theme = defaults($_GET, 'addon', ''); - if ($theme) { - $theme = Strings::sanitizeFilePathItem($theme); - if (!is_dir("view/theme/$theme")) { - notice(L10n::t('Item not found.')); - return ''; - } - - if (in_array($theme, Theme::getAllowedList())) { - Theme::uninstall($theme); - info(L10n::t('Theme %s disabled.', $theme)); - } elseif (Theme::install($theme)) { - info(L10n::t('Theme %s successfully enabled.', $theme)); - } else { - info(L10n::t('Theme %s failed to install.', $theme)); - } - } - - break; - - } - - $a->internalRedirect('admin/themes'); - } - - $themes = []; - $files = glob('view/theme/*'); - if (is_array($files)) { - foreach ($files as $file) { - $theme = basename($file); - - // Is there a style file? - $theme_files = glob('view/theme/' . $theme . '/style.*'); - - // If not then quit - if (count($theme_files) == 0) { - continue; - } - - $is_experimental = intval(file_exists($file . '/experimental')); - $is_supported = 1 - (intval(file_exists($file . '/unsupported'))); - $is_allowed = intval(in_array($theme, $allowed_themes)); - - if ($is_allowed || $is_supported || Config::get('system', 'show_unsupported_themes')) { - $themes[] = ['name' => $theme, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed]; - } - } - } - - $addons = []; - foreach ($themes as $theme) { - $addons[] = [$theme['name'], (($theme['allowed']) ? 'on' : 'off'), Theme::getInfo($theme['name'])]; - } - - $t = Renderer::getMarkupTemplate('admin/addons/index.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Themes'), - '$submit' => L10n::t('Save Settings'), - '$reload' => L10n::t('Reload active themes'), - '$baseurl' => $a->getBaseURL(true), - '$function' => 'themes', - '$addons' => $addons, - '$pcount' => count($themes), - '$noplugshint' => L10n::t('No themes found on the system. They should be placed in %1$s', '/view/themes'), - '$experimental' => L10n::t('[Experimental]'), - '$unsupported' => L10n::t('[Unsupported]'), - '$form_security_token' => parent::getFormSecurityToken('admin_themes'), - ]); - } -} \ No newline at end of file +getBaseURL() . '/admin/themes', 'admin_themes', 't'); + + switch ($_GET['action']) { + case 'reload': + foreach ($allowed_themes as $theme) { + Theme::uninstall($theme['name']); + Theme::install($theme['name']); + } + + info('Themes reloaded'); + break; + + case 'toggle' : + $theme = defaults($_GET, 'addon', ''); + if ($theme) { + $theme = Strings::sanitizeFilePathItem($theme); + if (!is_dir("view/theme/$theme")) { + notice(L10n::t('Item not found.')); + return ''; + } + + if (in_array($theme, Theme::getAllowedList())) { + Theme::uninstall($theme); + info(L10n::t('Theme %s disabled.', $theme)); + } elseif (Theme::install($theme)) { + info(L10n::t('Theme %s successfully enabled.', $theme)); + } else { + info(L10n::t('Theme %s failed to install.', $theme)); + } + } + + break; + + } + + $a->internalRedirect('admin/themes'); + } + + $themes = []; + $files = glob('view/theme/*'); + if (is_array($files)) { + foreach ($files as $file) { + $theme = basename($file); + + // Is there a style file? + $theme_files = glob('view/theme/' . $theme . '/style.*'); + + // If not then quit + if (count($theme_files) == 0) { + continue; + } + + $is_experimental = intval(file_exists($file . '/experimental')); + $is_supported = 1 - (intval(file_exists($file . '/unsupported'))); + $is_allowed = intval(in_array($theme, $allowed_themes)); + + if ($is_allowed || $is_supported || Config::get('system', 'show_unsupported_themes')) { + $themes[] = ['name' => $theme, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed]; + } + } + } + + $addons = []; + foreach ($themes as $theme) { + $addons[] = [$theme['name'], (($theme['allowed']) ? 'on' : 'off'), Theme::getInfo($theme['name'])]; + } + + $t = Renderer::getMarkupTemplate('admin/addons/index.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Themes'), + '$submit' => L10n::t('Save Settings'), + '$reload' => L10n::t('Reload active themes'), + '$baseurl' => $a->getBaseURL(true), + '$function' => 'themes', + '$addons' => $addons, + '$pcount' => count($themes), + '$noplugshint' => L10n::t('No themes found on the system. They should be placed in %1$s', '/view/themes'), + '$experimental' => L10n::t('[Experimental]'), + '$unsupported' => L10n::t('[Unsupported]'), + '$form_security_token' => parent::getFormSecurityToken('admin_themes'), + ]); + } +} diff --git a/src/Module/Admin/Tos.php b/src/Module/Admin/Tos.php index efab22f8ef..4eb6e3426c 100644 --- a/src/Module/Admin/Tos.php +++ b/src/Module/Admin/Tos.php @@ -1,53 +1,53 @@ -internalRedirect('admin/tos'); - } - - public static function content() - { - parent::content(); - - $tos = new \Friendica\Module\Tos(); - $t = Renderer::getMarkupTemplate('admin/tos.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$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.')], - '$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 EU-GDPR.', 'https://en.wikipedia.org/wiki/General_Data_Protection_Regulation')], - '$preview' => L10n::t('Privacy Statement Preview'), - '$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.')], - '$form_security_token' => parent::getFormSecurityToken('admin_tos'), - '$submit' => L10n::t('Save Settings'), - ]); - } -} \ No newline at end of file +internalRedirect('admin/tos'); + } + + public static function content() + { + parent::content(); + + $tos = new \Friendica\Module\Tos(); + $t = Renderer::getMarkupTemplate('admin/tos.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$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.')], + '$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 EU-GDPR.', 'https://en.wikipedia.org/wiki/General_Data_Protection_Regulation')], + '$preview' => L10n::t('Privacy Statement Preview'), + '$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.')], + '$form_security_token' => parent::getFormSecurityToken('admin_tos'), + '$submit' => L10n::t('Save Settings'), + ]); + } +} diff --git a/src/Module/Admin/Users.php b/src/Module/Admin/Users.php index 4d25f4f893..d9852e98d0 100644 --- a/src/Module/Admin/Users.php +++ b/src/Module/Admin/Users.php @@ -1,318 +1,318 @@ - $nu_name, - 'email' => $nu_email, - 'nickname' => $nu_nickname, - 'verified' => 1, - 'language' => $nu_language - ]); - } catch (\Exception $ex) { - notice($ex->getMessage()); - return; - } - - $user = $result['user']; - $preamble = Strings::deindent(L10n::t(' - Dear %1$s, - the administrator of %2$s has set up an account for you.')); - $body = Strings::deindent(L10n::t(' - The login details are as follows: - - Site Location: %1$s - Login Name: %2$s - Password: %3$s - - You may change your password from your account "Settings" page after logging - in. - - 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 - (on the "Profiles" page) so that other people can easily find you. - - We recommend setting your full name, adding a profile photo, - 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 - than that. - - 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 - you to make some new and interesting friends. - - If you ever want to delete your account, you can do so at %1$s/removeme - - Thank you and welcome to %4$s.')); - - $preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename')); - $body = sprintf($body, $a->getBaseURL(), $user['nickname'], $result['password'], Config::get('config', 'sitename')); - - notification([ - 'type' => SYSTEM_EMAIL, - 'language' => $user['language'], - 'to_name' => $user['username'], - 'to_email' => $user['email'], - 'uid' => $user['uid'], - 'subject' => L10n::t('Registration details for %s', Config::get('config', 'sitename')), - 'preamble' => $preamble, - 'body' => $body]); - } - - if (!empty($_POST['page_users_block'])) { - DBA::update('user', ['blocked' => 1], ['uid' => $users]); - notice(L10n::tt('%s user blocked', '%s users blocked', count($users))); - } - - if (!empty($_POST['page_users_unblock'])) { - DBA::update('user', ['blocked' => 0], ['uid' => $users]); - notice(L10n::tt('%s user unblocked', '%s users unblocked', count($users))); - } - - if (!empty($_POST['page_users_delete'])) { - foreach ($users as $uid) { - if (local_user() != $uid) { - User::remove($uid); - } else { - notice(L10n::t('You can\'t remove yourself')); - } - } - - notice(L10n::tt('%s user deleted', '%s users deleted', count($users))); - } - - if (!empty($_POST['page_users_approve'])) { - require_once 'mod/regmod.php'; - foreach ($pending as $hash) { - user_allow($hash); - } - } - - if (!empty($_POST['page_users_deny'])) { - require_once 'mod/regmod.php'; - foreach ($pending as $hash) { - user_deny($hash); - } - } - - $a->internalRedirect('admin/users'); - } - - public static function content() - { - parent::content(); - - $a = self::getApp(); - - if ($a->argc > 3) { - // @TODO: Replace with parameter from router - $action = $a->argv[2]; - $uid = $a->argv[3]; - $user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]); - if (!DBA::isResult($user)) { - notice('User not found' . EOL); - $a->internalRedirect('admin/users'); - return ''; // NOTREACHED - } - - switch ($action) { - case 'delete': - if (local_user() != $uid) { - parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); - // delete user - User::remove($uid); - - notice(L10n::t('User "%s" deleted', $user['username'])); - } else { - notice(L10n::t('You can\'t remove yourself')); - } - break; - case 'block': - parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); - DBA::update('user', ['blocked' => 1], ['uid' => $uid]); - notice(L10n::t('User "%s" blocked', $user['username'])); - break; - case 'unblock': - parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); - DBA::update('user', ['blocked' => 0], ['uid' => $uid]); - notice(L10n::t('User "%s" unblocked', $user['username'])); - break; - } - - $a->internalRedirect('admin/users'); - } - - /* get pending */ - $pending = Register::getPending(); - - $pager = new Pager($a->query_string, 100); - - /* ordering */ - $valid_orders = [ - 'contact.name', - 'user.email', - 'user.register_date', - 'user.login_date', - 'lastitem_date', - 'user.page-flags' - ]; - - $order = 'contact.name'; - $order_direction = '+'; - if (!empty($_GET['o'])) { - $new_order = $_GET['o']; - if ($new_order[0] === '-') { - $order_direction = '-'; - $new_order = substr($new_order, 1); - } - - if (in_array($new_order, $valid_orders)) { - $order = $new_order; - } - } - $sql_order = '`' . str_replace('.', '`.`', $order) . '`'; - $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` - FROM `user` - INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` - WHERE `user`.`verified` - ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $pager->getStart(), $pager->getItemsPerPage() - ); - $users = DBA::toArray($usersStmt); - - $adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email'))); - $_setup_users = function ($e) use ($adminlist) { - $page_types = [ - User::PAGE_FLAGS_NORMAL => L10n::t('Normal Account Page'), - User::PAGE_FLAGS_SOAPBOX => L10n::t('Soapbox Page'), - User::PAGE_FLAGS_COMMUNITY => L10n::t('Public Forum'), - User::PAGE_FLAGS_FREELOVE => L10n::t('Automatic Friend Page'), - User::PAGE_FLAGS_PRVGROUP => L10n::t('Private Forum') - ]; - $account_types = [ - User::ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'), - User::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'), - User::ACCOUNT_TYPE_NEWS => L10n::t('News Page'), - User::ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum'), - User::ACCOUNT_TYPE_RELAY => L10n::t('Relay'), - ]; - - $e['page_flags_raw'] = $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'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : ''; - - $e['register_date'] = Temporal::getRelativeDate($e['register_date']); - $e['login_date'] = Temporal::getRelativeDate($e['login_date']); - $e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']); - $e['is_admin'] = in_array($e['email'], $adminlist); - $e['is_deletable'] = (intval($e['uid']) != local_user()); - $e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False); - - return $e; - }; - - $tmp_users = array_map($_setup_users, $users); - - // Get rid of dashes in key names, Smarty3 can't handle them - // and extracting deleted users - - $deleted = []; - $users = []; - foreach ($tmp_users as $user) { - foreach ($user as $k => $v) { - $newkey = str_replace('-', '_', $k); - $user[$newkey] = $v; - } - - if ($user['deleted']) { - $deleted[] = $user; - } else { - $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); - - $t = Renderer::getMarkupTemplate('admin/users.tpl'); - $o = Renderer::replaceMacros($t, [ - // strings // - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Users'), - '$submit' => L10n::t('Add User'), - '$select_all' => L10n::t('select all'), - '$h_pending' => L10n::t('User registrations waiting for confirm'), - '$h_deleted' => L10n::t('User waiting for permanent deletion'), - '$th_pending' => [L10n::t('Request date'), L10n::t('Name'), L10n::t('Email')], - '$no_pending' => L10n::t('No registrations.'), - '$pendingnotetext' => L10n::t('Note from the user'), - '$approve' => L10n::t('Approve'), - '$deny' => L10n::t('Deny'), - '$delete' => L10n::t('Delete'), - '$block' => L10n::t('Block'), - '$blocked' => L10n::t('User blocked'), - '$unblock' => L10n::t('Unblock'), - '$siteadmin' => L10n::t('Site admin'), - '$accountexpired' => L10n::t('Account expired'), - - '$h_users' => L10n::t('Users'), - '$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_users' => $th_users, - '$order_users' => $order, - '$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' => 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'), - - // values // - '$baseurl' => $a->getBaseURL(true), - - '$pending' => $pending, - 'deleted' => $deleted, - '$users' => $users, - '$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.')], - '$newuseremail' => ['new_user_email', L10n::t('Email'), '', L10n::t('Email address of the new user.'), '', '', 'email'], - ]); - - $o .= $pager->renderFull(DBA::count('user')); - - return $o; - } -} \ No newline at end of file + $nu_name, + 'email' => $nu_email, + 'nickname' => $nu_nickname, + 'verified' => 1, + 'language' => $nu_language + ]); + } catch (\Exception $ex) { + notice($ex->getMessage()); + return; + } + + $user = $result['user']; + $preamble = Strings::deindent(L10n::t(' + Dear %1$s, + the administrator of %2$s has set up an account for you.')); + $body = Strings::deindent(L10n::t(' + The login details are as follows: + + Site Location: %1$s + Login Name: %2$s + Password: %3$s + + You may change your password from your account "Settings" page after logging + in. + + 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 + (on the "Profiles" page) so that other people can easily find you. + + We recommend setting your full name, adding a profile photo, + 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 + than that. + + 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 + you to make some new and interesting friends. + + If you ever want to delete your account, you can do so at %1$s/removeme + + Thank you and welcome to %4$s.')); + + $preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename')); + $body = sprintf($body, $a->getBaseURL(), $user['nickname'], $result['password'], Config::get('config', 'sitename')); + + notification([ + 'type' => SYSTEM_EMAIL, + 'language' => $user['language'], + 'to_name' => $user['username'], + 'to_email' => $user['email'], + 'uid' => $user['uid'], + 'subject' => L10n::t('Registration details for %s', Config::get('config', 'sitename')), + 'preamble' => $preamble, + 'body' => $body]); + } + + if (!empty($_POST['page_users_block'])) { + DBA::update('user', ['blocked' => 1], ['uid' => $users]); + notice(L10n::tt('%s user blocked', '%s users blocked', count($users))); + } + + if (!empty($_POST['page_users_unblock'])) { + DBA::update('user', ['blocked' => 0], ['uid' => $users]); + notice(L10n::tt('%s user unblocked', '%s users unblocked', count($users))); + } + + if (!empty($_POST['page_users_delete'])) { + foreach ($users as $uid) { + if (local_user() != $uid) { + User::remove($uid); + } else { + notice(L10n::t('You can\'t remove yourself')); + } + } + + notice(L10n::tt('%s user deleted', '%s users deleted', count($users))); + } + + if (!empty($_POST['page_users_approve'])) { + require_once 'mod/regmod.php'; + foreach ($pending as $hash) { + user_allow($hash); + } + } + + if (!empty($_POST['page_users_deny'])) { + require_once 'mod/regmod.php'; + foreach ($pending as $hash) { + user_deny($hash); + } + } + + $a->internalRedirect('admin/users'); + } + + public static function content() + { + parent::content(); + + $a = self::getApp(); + + if ($a->argc > 3) { + // @TODO: Replace with parameter from router + $action = $a->argv[2]; + $uid = $a->argv[3]; + $user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]); + if (!DBA::isResult($user)) { + notice('User not found' . EOL); + $a->internalRedirect('admin/users'); + return ''; // NOTREACHED + } + + switch ($action) { + case 'delete': + if (local_user() != $uid) { + parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); + // delete user + User::remove($uid); + + notice(L10n::t('User "%s" deleted', $user['username'])); + } else { + notice(L10n::t('You can\'t remove yourself')); + } + break; + case 'block': + parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); + DBA::update('user', ['blocked' => 1], ['uid' => $uid]); + notice(L10n::t('User "%s" blocked', $user['username'])); + break; + case 'unblock': + parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't'); + DBA::update('user', ['blocked' => 0], ['uid' => $uid]); + notice(L10n::t('User "%s" unblocked', $user['username'])); + break; + } + + $a->internalRedirect('admin/users'); + } + + /* get pending */ + $pending = Register::getPending(); + + $pager = new Pager($a->query_string, 100); + + /* ordering */ + $valid_orders = [ + 'contact.name', + 'user.email', + 'user.register_date', + 'user.login_date', + 'lastitem_date', + 'user.page-flags' + ]; + + $order = 'contact.name'; + $order_direction = '+'; + if (!empty($_GET['o'])) { + $new_order = $_GET['o']; + if ($new_order[0] === '-') { + $order_direction = '-'; + $new_order = substr($new_order, 1); + } + + if (in_array($new_order, $valid_orders)) { + $order = $new_order; + } + } + $sql_order = '`' . str_replace('.', '`.`', $order) . '`'; + $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` + FROM `user` + INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self` + WHERE `user`.`verified` + ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $pager->getStart(), $pager->getItemsPerPage() + ); + $users = DBA::toArray($usersStmt); + + $adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email'))); + $_setup_users = function ($e) use ($adminlist) { + $page_types = [ + User::PAGE_FLAGS_NORMAL => L10n::t('Normal Account Page'), + User::PAGE_FLAGS_SOAPBOX => L10n::t('Soapbox Page'), + User::PAGE_FLAGS_COMMUNITY => L10n::t('Public Forum'), + User::PAGE_FLAGS_FREELOVE => L10n::t('Automatic Friend Page'), + User::PAGE_FLAGS_PRVGROUP => L10n::t('Private Forum') + ]; + $account_types = [ + User::ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'), + User::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'), + User::ACCOUNT_TYPE_NEWS => L10n::t('News Page'), + User::ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum'), + User::ACCOUNT_TYPE_RELAY => L10n::t('Relay'), + ]; + + $e['page_flags_raw'] = $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'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : ''; + + $e['register_date'] = Temporal::getRelativeDate($e['register_date']); + $e['login_date'] = Temporal::getRelativeDate($e['login_date']); + $e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']); + $e['is_admin'] = in_array($e['email'], $adminlist); + $e['is_deletable'] = (intval($e['uid']) != local_user()); + $e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False); + + return $e; + }; + + $tmp_users = array_map($_setup_users, $users); + + // Get rid of dashes in key names, Smarty3 can't handle them + // and extracting deleted users + + $deleted = []; + $users = []; + foreach ($tmp_users as $user) { + foreach ($user as $k => $v) { + $newkey = str_replace('-', '_', $k); + $user[$newkey] = $v; + } + + if ($user['deleted']) { + $deleted[] = $user; + } else { + $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); + + $t = Renderer::getMarkupTemplate('admin/users.tpl'); + $o = Renderer::replaceMacros($t, [ + // strings // + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Users'), + '$submit' => L10n::t('Add User'), + '$select_all' => L10n::t('select all'), + '$h_pending' => L10n::t('User registrations waiting for confirm'), + '$h_deleted' => L10n::t('User waiting for permanent deletion'), + '$th_pending' => [L10n::t('Request date'), L10n::t('Name'), L10n::t('Email')], + '$no_pending' => L10n::t('No registrations.'), + '$pendingnotetext' => L10n::t('Note from the user'), + '$approve' => L10n::t('Approve'), + '$deny' => L10n::t('Deny'), + '$delete' => L10n::t('Delete'), + '$block' => L10n::t('Block'), + '$blocked' => L10n::t('User blocked'), + '$unblock' => L10n::t('Unblock'), + '$siteadmin' => L10n::t('Site admin'), + '$accountexpired' => L10n::t('Account expired'), + + '$h_users' => L10n::t('Users'), + '$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_users' => $th_users, + '$order_users' => $order, + '$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' => 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'), + + // values // + '$baseurl' => $a->getBaseURL(true), + + '$pending' => $pending, + 'deleted' => $deleted, + '$users' => $users, + '$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.')], + '$newuseremail' => ['new_user_email', L10n::t('Email'), '', L10n::t('Email address of the new user.'), '', '', 'email'], + ]); + + $o .= $pager->renderFull(DBA::count('user')); + + return $o; + } +} diff --git a/src/Module/BaseAdminModule.php b/src/Module/BaseAdminModule.php index 5e56bd8d71..dd89bcb6c7 100644 --- a/src/Module/BaseAdminModule.php +++ b/src/Module/BaseAdminModule.php @@ -1,113 +1,122 @@ -page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/settings_head.tpl'), []); - - /* - * Side bar links - */ - - // array(url, name, extra css classes) - // not part of $aside to make the template more adjustable - $aside_sub = [ - 'information' => [L10n::t('Information'), [ - 'overview' => ['admin' , L10n::t('Overview') , 'overview'], - 'federation' => ['admin/federation' , L10n::t('Federation Statistics') , 'federation'] - ]], - 'configuration' => [L10n::t('Configuration'), [ - 'site' => ['admin/site' , L10n::t('Site') , 'site'], - 'users' => ['admin/users' , L10n::t('Users') , 'users'], - 'addons' => ['admin/addons' , L10n::t('Addons') , 'addons'], - 'themes' => ['admin/themes' , L10n::t('Themes') , 'themes'], - 'features' => ['admin/features' , L10n::t('Additional features') , 'features'], - 'tos' => ['admin/tos' , L10n::t('Terms of Service') , 'tos'], - ]], - 'database' => [L10n::t('Database'), [ - 'dbsync' => ['admin/dbsync' , L10n::t('DB updates') , 'dbsync'], - 'deferred' => ['admin/queue/deferred', L10n::t('Inspect Deferred Workers'), 'deferred'], - 'workerqueue' => ['admin/queue' , L10n::t('Inspect worker Queue') , 'workerqueue'], - ]], - 'tools' => [L10n::t('Tools'), [ - 'contactblock' => ['admin/blocklist/contact', L10n::t('Contact Blocklist') , 'contactblock'], - 'blocklist' => ['admin/blocklist/server' , L10n::t('Server Blocklist') , 'blocklist'], - 'deleteitem' => ['admin/item/delete' , L10n::t('Delete Item') , 'deleteitem'], - ]], - 'logs' => [L10n::t('Logs'), [ - 'logsconfig' => ['admin/logs/', L10n::t('Logs') , 'logs'], - 'logsview' => ['admin/logs/view' , L10n::t('View Logs') , 'viewlogs'], - ]], - 'diagnostics' => [L10n::t('Diagnostics'), [ - 'phpinfo' => ['admin/phpinfo' , L10n::t('PHP Info') , 'phpinfo'], - 'probe' => ['probe' , L10n::t('probe address') , 'probe'], - 'webfinger' => ['webfinger' , L10n::t('check webfinger') , 'webfinger'], - 'itemsource' => ['admin/item/source' , L10n::t('Item Source') , 'itemsource'], - 'babel' => ['babel' , L10n::t('Babel') , 'babel'], - ]], - ]; - - $t = Renderer::getMarkupTemplate('admin/aside.tpl'); - $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 ''; - } -} +page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/settings_head.tpl'), []); + + /* + * Side bar links + */ + + // array(url, name, extra css classes) + // not part of $aside to make the template more adjustable + $aside_sub = [ + 'information' => [L10n::t('Information'), [ + 'overview' => ['admin' , L10n::t('Overview') , 'overview'], + 'federation' => ['admin/federation' , L10n::t('Federation Statistics') , 'federation'] + ]], + 'configuration' => [L10n::t('Configuration'), [ + 'site' => ['admin/site' , L10n::t('Site') , 'site'], + 'users' => ['admin/users' , L10n::t('Users') , 'users'], + 'addons' => ['admin/addons' , L10n::t('Addons') , 'addons'], + 'themes' => ['admin/themes' , L10n::t('Themes') , 'themes'], + 'features' => ['admin/features' , L10n::t('Additional features') , 'features'], + 'tos' => ['admin/tos' , L10n::t('Terms of Service') , 'tos'], + ]], + 'database' => [L10n::t('Database'), [ + 'dbsync' => ['admin/dbsync' , L10n::t('DB updates') , 'dbsync'], + 'deferred' => ['admin/queue/deferred', L10n::t('Inspect Deferred Workers'), 'deferred'], + 'workerqueue' => ['admin/queue' , L10n::t('Inspect worker Queue') , 'workerqueue'], + ]], + 'tools' => [L10n::t('Tools'), [ + 'contactblock' => ['admin/blocklist/contact', L10n::t('Contact Blocklist') , 'contactblock'], + 'blocklist' => ['admin/blocklist/server' , L10n::t('Server Blocklist') , 'blocklist'], + 'deleteitem' => ['admin/item/delete' , L10n::t('Delete Item') , 'deleteitem'], + ]], + 'logs' => [L10n::t('Logs'), [ + 'logsconfig' => ['admin/logs/', L10n::t('Logs') , 'logs'], + 'logsview' => ['admin/logs/view' , L10n::t('View Logs') , 'viewlogs'], + ]], + 'diagnostics' => [L10n::t('Diagnostics'), [ + 'phpinfo' => ['admin/phpinfo' , L10n::t('PHP Info') , 'phpinfo'], + 'probe' => ['probe' , L10n::t('probe address') , 'probe'], + 'webfinger' => ['webfinger' , L10n::t('check webfinger') , 'webfinger'], + 'itemsource' => ['admin/item/source' , L10n::t('Item Source') , 'itemsource'], + 'babel' => ['babel' , L10n::t('Babel') , 'babel'], + ]], + ]; + + $t = Renderer::getMarkupTemplate('admin/aside.tpl'); + $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 ''; + } +}