Fixes the register plugin
parent
d318b621d5
commit
4c5136adf4
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue