Fixes the register plugin

main
Yasen Pramatarov 2026-01-19 20:19:02 +02:00
parent d318b621d5
commit 4c5136adf4
2 changed files with 136 additions and 160 deletions

View File

@ -12,11 +12,16 @@ if (!defined('PLUGIN_REGISTER_PATH')) {
} }
require_once PLUGIN_REGISTER_PATH . 'helpers.php'; 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', [ 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', 'access' => 'public',
'defaults' => ['action' => 'register'], 'defaults' => ['action' => 'register'],
'plugin' => 'register', 'plugin' => 'register',

View File

@ -1,19 +1,11 @@
<?php <?php
/** /**
* User Registration API Controller * Register Plugin Controller
* *
* Provides RESTful endpoints for user registration. * Procedural handler used by the callable dispatcher.
* Follows the API pattern used by other plugins.
*/ */
namespace Plugins\Register\Controllers;
use App\App;
use App\Helpers\Theme;
use Exception;
use PDO;
require_once APP_PATH . 'classes/feedback.php'; require_once APP_PATH . 'classes/feedback.php';
require_once APP_PATH . 'classes/user.php'; require_once APP_PATH . 'classes/user.php';
require_once APP_PATH . 'classes/validator.php'; require_once APP_PATH . 'classes/validator.php';
@ -22,55 +14,36 @@ require_once APP_PATH . 'helpers/theme.php';
require_once APP_PATH . 'includes/rate_limit_middleware.php'; require_once APP_PATH . 'includes/rate_limit_middleware.php';
require_once PLUGIN_REGISTER_PATH . 'models/register.php'; require_once PLUGIN_REGISTER_PATH . 'models/register.php';
class RegisterController function register_plugin_handle_register(string $action, array $context = []): bool {
{
private $db;
private array $config;
private string $appRoot;
private $logger;
public function __construct()
{
$this->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); $validSession = (bool)($context['valid_session'] ?? false);
$app_root = $context['app_root'] ?? $this->appRoot; $app_root = $context['app_root'] ?? (\App\App::get('app_root') ?? '/');
$config = $context['config'] ?? \App\App::config();
$db = $context['db'] ?? \App\App::db();
$logger = $context['logger'] ?? \App\App::get('logger');
if (!$this->db) { if (!$db) {
\Feedback::flash('ERROR', 'DEFAULT', 'Registration service unavailable. Please try again later.'); \Feedback::flash('ERROR', 'DEFAULT', 'Registration service unavailable. Please try again later.');
$this->renderForm($validSession, $app_root, ['registrationEnabled' => false]); register_plugin_render_form($validSession, $app_root, ['registrationEnabled' => false]);
return true; return true;
} }
if (!$this->isRegistrationEnabled()) { if (!(bool)($config['registration_enabled'] ?? false)) {
\Feedback::flash('NOTICE', 'DEFAULT', 'Registration is currently disabled.'); \Feedback::flash('NOTICE', 'DEFAULT', 'Registration is currently disabled.');
$this->renderForm($validSession, $app_root, ['registrationEnabled' => false]); register_plugin_render_form($validSession, $app_root, ['registrationEnabled' => false]);
return true; return true;
} }
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$this->handleSubmission($validSession, $app_root); register_plugin_handle_submission($validSession, $app_root, $db, $logger);
return true; return true;
} }
$this->renderForm($validSession, $app_root); register_plugin_render_form($validSession, $app_root);
return true; return true;
} }
private function isRegistrationEnabled(): bool function register_plugin_handle_submission(bool $validSession, string $app_root, $db, $logger = null): void {
{ checkRateLimit($db, 'register');
return (bool)($this->config['registration_enabled'] ?? false);
}
private function handleSubmission(bool $validSession, string $app_root): void
{
checkRateLimit($this->db, 'register');
$security = \SecurityHelper::getInstance(); $security = \SecurityHelper::getInstance();
$formData = $security->sanitizeArray( $formData = $security->sanitizeArray(
@ -80,7 +53,7 @@ class RegisterController
if (!$security->verifyCsrfToken($formData['csrf_token'] ?? '')) { if (!$security->verifyCsrfToken($formData['csrf_token'] ?? '')) {
\Feedback::flash('ERROR', 'DEFAULT', 'Invalid security token. Please try again.'); \Feedback::flash('ERROR', 'DEFAULT', 'Invalid security token. Please try again.');
$this->renderForm($validSession, $app_root, [ register_plugin_render_form($validSession, $app_root, [
'values' => ['username' => $formData['username'] ?? ''], 'values' => ['username' => $formData['username'] ?? ''],
]); ]);
return; return;
@ -110,7 +83,7 @@ class RegisterController
if (!$validator->validate($rules)) { if (!$validator->validate($rules)) {
\Feedback::flash('ERROR', 'DEFAULT', $validator->getFirstError()); \Feedback::flash('ERROR', 'DEFAULT', $validator->getFirstError());
$this->renderForm($validSession, $app_root, [ register_plugin_render_form($validSession, $app_root, [
'values' => ['username' => $formData['username'] ?? ''], 'values' => ['username' => $formData['username'] ?? ''],
]); ]);
return; return;
@ -119,70 +92,68 @@ class RegisterController
$username = trim($formData['username']); $username = trim($formData['username']);
$password = $formData['password']; $password = $formData['password'];
$pdo = $db instanceof \PDO ? $db : $db->getConnection();
try { try {
$register = new \Register($this->db); $register = new \Register($pdo);
$result = $register->register($username, $password); $result = $register->register($username, $password);
if ($result === true) { if ($result === true) {
$this->logSuccessfulRegistration($username); register_plugin_log_success($username, $db, $logger);
\Feedback::flash('NOTICE', 'DEFAULT', 'Registration successful. You can log in now.'); \Feedback::flash('NOTICE', 'DEFAULT', 'Registration successful. You can log in now.');
header('Location: ' . $app_root . '?page=login'); header('Location: ' . $app_root . '?page=login');
exit; exit;
} }
\Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $result); \Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $result);
$this->renderForm($validSession, $app_root, [ register_plugin_render_form($validSession, $app_root, [
'values' => ['username' => $username], 'values' => ['username' => $username],
]); ]);
} catch (Exception $e) { } catch (Exception $e) {
\Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $e->getMessage()); \Feedback::flash('ERROR', 'DEFAULT', 'Registration failed: ' . $e->getMessage());
$this->renderForm($validSession, $app_root, [ register_plugin_render_form($validSession, $app_root, [
'values' => ['username' => $username], 'values' => ['username' => $username],
]); ]);
} }
} }
private function logSuccessfulRegistration(string $username): void function register_plugin_log_success(string $username, $db, $logger = null): void {
{ if (!$logger) {
if (!$this->logger) {
return; return;
} }
try { try {
$userModel = new \User($this->db); $userModel = new \User($db);
$userRecord = $userModel->getUserId($username); $userRecord = $userModel->getUserId($username);
$userId = $userRecord[0]['id'] ?? null; $userId = $userRecord[0]['id'] ?? null;
$userIP = $_SERVER['REMOTE_ADDR'] ?? ''; $userIP = $_SERVER['REMOTE_ADDR'] ?? '';
$this->logger->log( $logger->log(
'info', 'info',
sprintf('Registration: New user "%s" registered successfully. IP: %s', $username, $userIP), sprintf('Registration: New user "%s" registered successfully. IP: %s', $username, $userIP),
['user_id' => $userId, 'scope' => 'user'] ['user_id' => $userId, 'scope' => 'user']
); );
} catch (Exception $e) { } catch (Exception $e) {
app_log('warning', 'RegisterController logging failed: ' . $e->getMessage(), ['scope' => 'plugin']); app_log('warning', 'Register plugin logging failed: ' . $e->getMessage(), ['scope' => 'plugin']);
} }
} }
private function renderForm(bool $validSession, string $app_root, array $data = []): void function register_plugin_render_form(bool $validSession, string $app_root, array $data = []): void {
{
$formValues = $data['values'] ?? ['username' => '']; $formValues = $data['values'] ?? ['username' => ''];
$registrationEnabled = $data['registrationEnabled'] ?? true; $registrationEnabled = $data['registrationEnabled'] ?? true;
Theme::include('page-header'); \App\Helpers\Theme::include('page-header');
Theme::include('page-menu'); \App\Helpers\Theme::include('page-menu');
if ($validSession) { if ($validSession) {
Theme::include('page-sidebar'); \App\Helpers\Theme::include('page-sidebar');
} }
include APP_PATH . 'helpers/feedback.php'; include APP_PATH . 'helpers/feedback.php';
$app_root_value = $app_root; // align variable name for template include
$app_root = $app_root_value;
$values = $formValues; $values = $formValues;
$app_root = $app_root;
include PLUGIN_REGISTER_PATH . 'views/form-register.php'; include PLUGIN_REGISTER_PATH . 'views/form-register.php';
Theme::include('page-footer'); \App\Helpers\Theme::include('page-footer');
}
} }