diff --git a/plugins/register/bootstrap.php b/plugins/register/bootstrap.php index d292c6b..2bff358 100644 --- a/plugins/register/bootstrap.php +++ b/plugins/register/bootstrap.php @@ -12,11 +12,16 @@ if (!defined('PLUGIN_REGISTER_PATH')) { } require_once PLUGIN_REGISTER_PATH . 'helpers.php'; -require_once PLUGIN_REGISTER_PATH . 'controllers/register.php'; -// Register route with dispatcher class +// Register route with simple callable dispatcher register_plugin_route_prefix('register', [ - 'dispatcher' => \Plugins\Register\Controllers\RegisterController::class, + 'dispatcher' => function($action, array $context = []) { + require_once PLUGIN_REGISTER_PATH . 'controllers/register.php'; + if (function_exists('register_plugin_handle_register')) { + return register_plugin_handle_register($action, $context); + } + return false; + }, 'access' => 'public', 'defaults' => ['action' => 'register'], 'plugin' => 'register', diff --git a/plugins/register/controllers/register.php b/plugins/register/controllers/register.php index cc207d4..2e445fb 100644 --- a/plugins/register/controllers/register.php +++ b/plugins/register/controllers/register.php @@ -1,19 +1,11 @@ db = App::db(); - $this->config = App::config(); - $this->appRoot = App::get('app_root') ?? '/'; - $this->logger = App::get('logObject'); - } - - public function handle(string $action, array $context = []): bool - { - $validSession = (bool)($context['valid_session'] ?? false); - $app_root = $context['app_root'] ?? $this->appRoot; - - if (!$this->db) { - \Feedback::flash('ERROR', 'DEFAULT', 'Registration service unavailable. Please try again later.'); - $this->renderForm($validSession, $app_root, ['registrationEnabled' => false]); - return true; - } - - if (!$this->isRegistrationEnabled()) { - \Feedback::flash('NOTICE', 'DEFAULT', 'Registration is currently disabled.'); - $this->renderForm($validSession, $app_root, ['registrationEnabled' => false]); - return true; - } - - if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $this->handleSubmission($validSession, $app_root); - return true; - } - - $this->renderForm($validSession, $app_root); + if (!$db) { + \Feedback::flash('ERROR', 'DEFAULT', 'Registration service unavailable. Please try again later.'); + register_plugin_render_form($validSession, $app_root, ['registrationEnabled' => false]); return true; } - private function isRegistrationEnabled(): bool - { - return (bool)($this->config['registration_enabled'] ?? false); + if (!(bool)($config['registration_enabled'] ?? false)) { + \Feedback::flash('NOTICE', 'DEFAULT', 'Registration is currently disabled.'); + register_plugin_render_form($validSession, $app_root, ['registrationEnabled' => false]); + return true; } - private function handleSubmission(bool $validSession, string $app_root): void - { - checkRateLimit($this->db, 'register'); - - $security = \SecurityHelper::getInstance(); - $formData = $security->sanitizeArray( - $_POST, - ['username', 'password', 'confirm_password', 'csrf_token', 'terms'] - ); - - if (!$security->verifyCsrfToken($formData['csrf_token'] ?? '')) { - \Feedback::flash('ERROR', 'DEFAULT', 'Invalid security token. Please try again.'); - $this->renderForm($validSession, $app_root, [ - 'values' => ['username' => $formData['username'] ?? ''], - ]); - return; - } - - $validator = new \Validator($formData); - $rules = [ - 'username' => [ - 'required' => true, - 'min' => 3, - 'max' => 20, - ], - 'password' => [ - 'required' => true, - 'min' => 8, - 'max' => 255, - ], - 'confirm_password' => [ - 'required' => true, - 'matches' => 'password', - ], - 'terms' => [ - 'required' => true, - 'accepted' => true, - ], - ]; - - if (!$validator->validate($rules)) { - \Feedback::flash('ERROR', 'DEFAULT', $validator->getFirstError()); - $this->renderForm($validSession, $app_root, [ - 'values' => ['username' => $formData['username'] ?? ''], - ]); - return; - } - - $username = trim($formData['username']); - $password = $formData['password']; - - try { - $register = new \Register($this->db); - $result = $register->register($username, $password); - - if ($result === true) { - $this->logSuccessfulRegistration($username); - \Feedback::flash('NOTICE', 'DEFAULT', 'Registration successful. You can log in now.'); - header('Location: ' . $app_root . '?page=login'); - exit; - } - - \Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $result); - $this->renderForm($validSession, $app_root, [ - 'values' => ['username' => $username], - ]); - } catch (Exception $e) { - \Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $e->getMessage()); - $this->renderForm($validSession, $app_root, [ - 'values' => ['username' => $username], - ]); - } + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + register_plugin_handle_submission($validSession, $app_root, $db, $logger); + return true; } - private function logSuccessfulRegistration(string $username): void - { - if (!$this->logger) { - return; - } + register_plugin_render_form($validSession, $app_root); + return true; +} - try { - $userModel = new \User($this->db); - $userRecord = $userModel->getUserId($username); - $userId = $userRecord[0]['id'] ?? null; - $userIP = $_SERVER['REMOTE_ADDR'] ?? ''; +function register_plugin_handle_submission(bool $validSession, string $app_root, $db, $logger = null): void { + checkRateLimit($db, 'register'); - $this->logger->log( - 'info', - sprintf('Registration: New user "%s" registered successfully. IP: %s', $username, $userIP), - ['user_id' => $userId, 'scope' => 'user'] - ); - } catch (Exception $e) { - app_log('warning', 'RegisterController logging failed: ' . $e->getMessage(), ['scope' => 'plugin']); - } + $security = \SecurityHelper::getInstance(); + $formData = $security->sanitizeArray( + $_POST, + ['username', 'password', 'confirm_password', 'csrf_token', 'terms'] + ); + + if (!$security->verifyCsrfToken($formData['csrf_token'] ?? '')) { + \Feedback::flash('ERROR', 'DEFAULT', 'Invalid security token. Please try again.'); + register_plugin_render_form($validSession, $app_root, [ + 'values' => ['username' => $formData['username'] ?? ''], + ]); + return; } - private function renderForm(bool $validSession, string $app_root, array $data = []): void - { - $formValues = $data['values'] ?? ['username' => '']; - $registrationEnabled = $data['registrationEnabled'] ?? true; + $validator = new \Validator($formData); + $rules = [ + 'username' => [ + 'required' => true, + 'min' => 3, + 'max' => 20, + ], + 'password' => [ + 'required' => true, + 'min' => 8, + 'max' => 255, + ], + 'confirm_password' => [ + 'required' => true, + 'matches' => 'password', + ], + 'terms' => [ + 'required' => true, + 'accepted' => true, + ], + ]; - Theme::include('page-header'); - Theme::include('page-menu'); - if ($validSession) { - Theme::include('page-sidebar'); + if (!$validator->validate($rules)) { + \Feedback::flash('ERROR', 'DEFAULT', $validator->getFirstError()); + register_plugin_render_form($validSession, $app_root, [ + 'values' => ['username' => $formData['username'] ?? ''], + ]); + return; + } + + $username = trim($formData['username']); + $password = $formData['password']; + + $pdo = $db instanceof \PDO ? $db : $db->getConnection(); + + try { + $register = new \Register($pdo); + $result = $register->register($username, $password); + + if ($result === true) { + register_plugin_log_success($username, $db, $logger); + \Feedback::flash('NOTICE', 'DEFAULT', 'Registration successful. You can log in now.'); + header('Location: ' . $app_root . '?page=login'); + exit; } - include APP_PATH . 'helpers/feedback.php'; - - $app_root_value = $app_root; // align variable name for template include - $app_root = $app_root_value; - $values = $formValues; - - include PLUGIN_REGISTER_PATH . 'views/form-register.php'; - - Theme::include('page-footer'); + \Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $result); + register_plugin_render_form($validSession, $app_root, [ + 'values' => ['username' => $username], + ]); + } catch (Exception $e) { + \Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $e->getMessage()); + register_plugin_render_form($validSession, $app_root, [ + 'values' => ['username' => $username], + ]); } } + +function register_plugin_log_success(string $username, $db, $logger = null): void { + if (!$logger) { + return; + } + + try { + $userModel = new \User($db); + $userRecord = $userModel->getUserId($username); + $userId = $userRecord[0]['id'] ?? null; + $userIP = $_SERVER['REMOTE_ADDR'] ?? ''; + + $logger->log( + 'info', + sprintf('Registration: New user "%s" registered successfully. IP: %s', $username, $userIP), + ['user_id' => $userId, 'scope' => 'user'] + ); + } catch (Exception $e) { + app_log('warning', 'Register plugin logging failed: ' . $e->getMessage(), ['scope' => 'plugin']); + } +} + +function register_plugin_render_form(bool $validSession, string $app_root, array $data = []): void { + $formValues = $data['values'] ?? ['username' => '']; + $registrationEnabled = $data['registrationEnabled'] ?? true; + + \App\Helpers\Theme::include('page-header'); + \App\Helpers\Theme::include('page-menu'); + if ($validSession) { + \App\Helpers\Theme::include('page-sidebar'); + } + + include APP_PATH . 'helpers/feedback.php'; + + $values = $formValues; + $app_root = $app_root; + + include PLUGIN_REGISTER_PATH . 'views/form-register.php'; + + \App\Helpers\Theme::include('page-footer'); +}