false]); return true; } 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; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { register_plugin_handle_submission($validSession, $app_root, $db, $logger); return true; } register_plugin_render_form($validSession, $app_root); return true; } function register_plugin_handle_submission(bool $validSession, string $app_root, $db, $logger = null): void { checkRateLimit($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.'); register_plugin_render_form($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()); 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; } \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'); }