mc-cms-namelessmc/modules/Core/queries/debug_link.php
tadhgboyle e569c92cde
Update Template config to use Settings system rather than Cache (#3669)
* Update Template config to use Settings system rather than Cache

* Remove is_default from templates, use only the Settings value

* Convert template_settings

* lint

* fix

* fix
2025-06-04 21:45:50 -07:00

285 lines
10 KiB
PHP
Executable file

<?php
// Can user generate the debug link?
if (!defined('DEBUGGING') && !$user->hasPermission('admincp.core.debugging')) {
require_once(ROOT_PATH . '/403.php');
die();
}
$namelessmc_modules = [];
$namelessmc_fe_templates = [];
$namelessmc_panel_templates = [];
// Get all modules
$modules = DB::getInstance()->get('modules', ['id', '<>', 0])->results();
$enabled_modules = Module::getModules();
foreach ($modules as $item) {
$exists = false;
foreach ($enabled_modules as $enabled_item) {
if ($enabled_item->getName() == $item->name) {
$exists = true;
$module = $enabled_item;
break;
}
}
if (!$exists) {
if (!file_exists(ROOT_PATH . '/modules/' . $item->name . '/init.php')) {
continue;
}
require_once(ROOT_PATH . '/modules/' . $item->name . '/init.php');
}
$namelessmc_modules[$module->getName()] = [
'name' => $module->getName(),
'enabled' => Util::isModuleEnabled($module->getName()),
'author' => $module->getAuthor(),
'module_version' => $module->getVersion(),
'namelessmc_version' => $module->getNamelessVersion(),
'debug_info' => $module->getDebugInfo(),
];
}
$templates_query = DB::getInstance()->get('templates', ['id', '<>', 0])->results();
foreach ($templates_query as $fe_template) {
$template_path = implode(DIRECTORY_SEPARATOR, [ROOT_PATH, 'custom', 'templates', Output::getClean($fe_template->name), 'template.php']);
if (file_exists($template_path)) {
require_once($template_path);
}
$namelessmc_fe_templates[$fe_template->name] = [
'name' => $fe_template->name,
'enabled' => (bool)$fe_template->enabled,
'is_default' => (bool)Settings::get('default_template') === $fe_template->name,
'author' => $template->getAuthor(),
'template_version' => $template->getVersion(),
'namelessmc_version' => $template->getNamelessVersion(),
];
}
$panel_templates_query = DB::getInstance()->get('panel_templates', ['id', '<>', 0])->results();
foreach ($panel_templates_query as $panel_template) {
$template_path = implode(DIRECTORY_SEPARATOR, [ROOT_PATH, 'custom', 'panel_templates', Output::getClean($panel_template->name), 'template.php']);
if (file_exists($template_path)) {
require_once($template_path);
}
$namelessmc_panel_templates[$panel_template->name] = [
'name' => $panel_template->name,
'enabled' => (bool)$panel_template->enabled,
'is_default' => (bool)Settings::get('default_panel_template') === $panel_template->name,
'author' => $template->getAuthor(),
'template_version' => $template->getVersion(),
'namelessmc_version' => $template->getNamelessVersion(),
];
}
$group_sync = [];
foreach (GroupSyncManager::getInstance()->getInjectors() as $injector) {
$group_sync['injectors'][] = [
'name' => $injector->getName(),
'enabled' => $injector->shouldEnable(),
'module' => $injector->getModule(),
'column_name' => $injector->getColumnName(),
];
}
$group_sync['rules'] = [];
foreach (DB::getInstance()->get('group_sync', ['id', '<>', 0])->results() as $rule) {
$rules = [];
foreach (get_object_vars($rule) as $column => $value) {
if ($column == 'id') {
$rules[$column] = (int)$value;
} else {
$rules[$column] = $value;
}
}
$group_sync['rules'][(int)$rule->id] = $rules;
}
$webhooks = [];
foreach (DB::getInstance()->query('SELECT `id`, `name`, `action`, `events` FROM nl2_hooks')->results() as $webhook) {
$webhooks[$webhook->id] = [
'id' => (int)$webhook->id,
'name' => $webhook->name,
'action' => (int)$webhook->action,
'events' => json_decode($webhook->events),
];
}
$forum_hooks = [];
foreach (DB::getInstance()->query('SELECT `id`, `forum_title`, `hooks` FROM nl2_forums WHERE `hooks` IS NOT NULL')->results() as $forum) {
$forum_hooks[] = [
'forum_id' => (int)$forum->id,
'title' => $forum->forum_title,
'hooks' => array_map(static fn($hook) => (int)$hook, json_decode($forum->hooks)),
];
}
$groups = [];
foreach (Group::all() as $group) {
$groups[(int)$group->id] = [
'id' => (int)$group->id,
'name' => $group->name,
'group_html' => $group->group_html,
'admin_cp' => (bool)$group->admin_cp,
'staff' => (bool)$group->staff,
'permissions' => json_decode($group->permissions, true) ?? [],
'default_group' => (bool)$group->default_group,
'order' => (int)$group->order,
'force_tfa' => (bool)$group->force_tfa,
'deleted' => (bool)$group->deleted,
];
}
$integrations = [];
foreach (Integrations::getInstance()->getAll() as $integration) {
$integrations[$integration->getName()] = [
'id' => (int) $integration->data()->id,
'name' => $integration->data()->name,
'enabled' => (bool) $integration->data()->enabled,
'can_unlink' => (bool) $integration->data()->can_unlink,
'required' => (bool) $integration->data()->required,
'order' => (int) $integration->data()->order
];
}
$oauth_providers = [];
$providers_available = array_keys(NamelessOAuth::getInstance()->getProvidersAvailable());
foreach (NamelessOAuth::getInstance()->getProviders() as $provider_name => $data) {
$oauth_providers[$provider_name] = [
'provider_name' => $provider_name,
'module' => $data['module'],
'class' => $data['class'],
'user_id_name' => $data['user_id_name'],
'scope_id_name' => $data['scope_id_name'],
'enabled' => in_array($provider_name, $providers_available),
'client_id' => NamelessOAuth::getInstance()->getCredentials($provider_name)[0],
];
}
$namelessmc_version = Settings::get('nameless_version');
$uuid = DB::getInstance()->query('SELECT identifier FROM nl2_users_integrations INNER JOIN nl2_integrations on integration_id=nl2_integrations.id WHERE name = \'Minecraft\' AND user_id = ?;', [$user->data()->id]);
if ($uuid->count()) {
$uuid = $uuid->first()->identifier;
} else {
$uuid = '';
}
$logs = [];
foreach (['fatal', 'warning', 'notice', 'other', 'custom'] as $type) {
$file_path = implode(DIRECTORY_SEPARATOR, [ROOT_PATH, 'cache', 'logs', $type . '-log.log']);
$logs[$type] = file_exists($file_path) ? Util::readFileEnd($file_path, $max_bytes = 10_000) : '';
}
$user_data = [];
if ($user->isLoggedIn()) {
$user_integrations = [];
foreach ($user->getIntegrations() as $integrationUser) {
$user_integrations[$integrationUser->getIntegration()->getName()] = [
'username' => $integrationUser->data()->username,
'identifier' => $integrationUser->data()->identifier,
'verified' => $integrationUser->data()->verified
];
}
$user_data = [
'id' => (int)$user->data()->id,
'username' => $user->data()->username,
'nickname' => $user->getDisplayname(),
'groups' => array_values($user->getAllGroupIds()),
'integrations' => $user_integrations
];
}
$group_sync_logs = [];
$logs_set = DB::getInstance()->orderWhere('logs', 'action LIKE \'%_role_set\' OR action LIKE \'%_group_set\'OR action = \'mc_group_sync_set\' ', 'time', 'DESC LIMIT 50')->results();
foreach ($logs_set as $log) {
$group_sync_logs[] = [
'time' => $log->time,
'user_id' => $log->user_id,
'action' => $log->action,
'info' => json_decode($log->info, true) ?? $log->info,
];
}
$data = [
'generated_at' => time(),
'generated_by_name' => $user->data()->username,
'generated_by_uuid' => $uuid,
'user' => $user_data,
'namelessmc' => [
'version' => $namelessmc_version,
'update_available' => Settings::get('version_update') === 'urgent' || Settings::get('version_update') === 'true',
'update_checked' => (int) Settings::get('version_checked'),
'settings' => [
'phpmailer' => Settings::get('phpmailer') === '1',
'api_enabled' => Settings::get('use_api') === '1',
'email_verification' => Settings::get('email_verification') === '1',
'login_method' => Settings::get('login_method'),
'captcha_type' => Settings::get('recaptcha_type'),
'captcha_login' => Settings::get('recaptcha_login') === 'false' ? false : true, // dont ask
'group_sync' => $group_sync,
'webhooks' => [
'actions' => [
2 => 'Discord',
],
'hooks' => $webhooks,
'forum_hooks' => $forum_hooks,
],
'trusted_proxies' => HttpUtils::getTrustedProxies(),
],
'groups' => $groups,
'config' => [
'core' => array_filter(
Config::get('core'),
static fn(string $key) => $key !== 'hostname' && $key !== 'trustedProxies',
ARRAY_FILTER_USE_KEY
),
],
'modules' => $namelessmc_modules,
'templates' => [
'front_end' => $namelessmc_fe_templates,
'panel' => $namelessmc_panel_templates,
],
'integrations' => $integrations,
'oauth_providers' => $oauth_providers,
],
'logs' => [
'fatal' => $logs['fatal'],
'warning' => $logs['warning'],
'notice' => $logs['notice'],
'other' => $logs['other'],
'custom' => $logs['custom'],
'group_sync' => $group_sync_logs,
],
'environment' => [
'php_version' => PHP_VERSION,
'php_modules' => get_loaded_extensions(),
'host_os' => PHP_OS,
'host_kernel_version' => php_uname('r'),
'official_docker_image' => getenv('NAMELESSMC_METRICS_DOCKER') == true,
'disk_total_space' => disk_total_space('./'),
'disk_free_space' => disk_free_space('./'),
'memory_total_space' => ini_get('memory_limit'),
'memory_used_space' => memory_get_usage(),
'config_writable' => is_writable(ROOT_PATH . '/core/config.php'),
'cache_writable' => is_writable(ROOT_PATH . '/cache'),
],
];
$result = HttpClient::post('https://bytebin.rkslot.nl/post', json_encode($data, JSON_PRETTY_PRINT), [
'headers' => [
'Content-Type' => 'application/json',
'User-Agent' => 'NamelessMC/' . $namelessmc_version,
],
])->json(true);
die('https://debug.namelessmc.com/' . $result['key']);