feat: add admin-controlled authentication debug mode

This commit is contained in:
2026-08-23 16:01:09 +03:30
parent 6419f82ea5
commit 572a740d46
11 changed files with 187 additions and 42 deletions
@@ -4,6 +4,8 @@ namespace Dabestaniha\AuthenticateBridge\App\Http\Controllers;
use Dabestaniha\AuthenticateBridge\App\Http\Requests\MahakAuthenticateRequest;
use Dabestaniha\AuthenticateBridge\App\Support\JwtDecoder;
use RuntimeException;
use Throwable;
use UnexpectedValueException;
class AuthenticateController extends InvocableController
@@ -31,18 +33,14 @@ class AuthenticateController extends InvocableController
{
$jwt_secret = get_configured_option('jwt-secret');
try {
$decoded = JwtDecoder::decodeHs256($token, $jwt_secret);
$data = $decoded['data'] ?? null;
$decoded = JwtDecoder::decodeHs256($token, $jwt_secret);
$data = $decoded['data'] ?? null;
if (!is_array($data)) {
throw new UnexpectedValueException('JWT data must be an object.');
}
return $data;
} catch (\Throwable $e) {
wp_die(view('invalid-token'), 'Invalid Token', ['response' => 500]);
if (!is_array($data)) {
throw new UnexpectedValueException('JWT data must be an object.');
}
return $data;
}
public function find_or_create_user(string $identifier_name, string $identifier_value, string $name): int
@@ -63,17 +61,33 @@ class AuthenticateController extends InvocableController
$user_id = wp_create_user($username, $random_password, $email);
if (is_wp_error($user_id)) {
wp_die(view('invalid-token'), 'Invalid Token', ['response' => 500]);
throw new RuntimeException(
'WordPress could not create the user: '.$user_id->get_error_message()
);
}
wp_update_user([
$updated_user_id = wp_update_user([
'ID' => $user_id,
'display_name' => $name,
]);
if (is_wp_error($updated_user_id)) {
throw new RuntimeException(
'WordPress could not update the user: '.$updated_user_id->get_error_message()
);
}
return $user_id;
}
protected function handleException(Throwable $exception): void
{
$status = $exception->getCode() === 403 ? 403 : 500;
$fallbackView = $exception instanceof UnexpectedValueException ? 'invalid-token' : 'server-error';
mahak_render_error($exception, $status, $fallbackView);
}
public function login_user(int $user_id): bool
{
@@ -4,30 +4,41 @@ namespace Dabestaniha\AuthenticateBridge\App\Http\Controllers;
use Dabestaniha\AuthenticateBridge\App\Http\Requests\BaseFormRequest;
use ReflectionMethod;
use Throwable;
abstract class InvocableController
{
public static function resolve(): void
{
$reflection = new ReflectionMethod(static::class, '__invoke');
$args = [];
foreach ($reflection->getParameters() as $param) {
$class = $param->getType()->getName();
if (is_subclass_of($class, BaseFormRequest::class)) {
$request = new $class();
if (!$request->isRequestForThisRoute()) {
return;
}
$request->validate();
$args[] = $request;
}
}
$controller = new static();
$controller(...$args);
try {
$reflection = new ReflectionMethod(static::class, '__invoke');
$args = [];
foreach ($reflection->getParameters() as $param) {
$class = $param->getType()->getName();
if (is_subclass_of($class, BaseFormRequest::class)) {
$request = new $class();
if (!$request->isRequestForThisRoute()) {
return;
}
$request->validate();
$args[] = $request;
}
}
$controller(...$args);
} catch (Throwable $exception) {
$controller->handleException($exception);
}
}
}
protected function handleException(Throwable $exception): void
{
throw $exception;
}
}
@@ -7,7 +7,16 @@ class SettingsPageFormController extends InvocableController
public function __invoke()
{
foreach (config('mahak.options') as $configured => $options_key) {
register_setting(config('mahak.settings-group'), $options_key);
$args = [];
if ($configured === 'debug-mode') {
$args['sanitize_callback'] = function ($value): int {
return (int) filter_var($value, FILTER_VALIDATE_BOOLEAN);
};
$args['default'] = 0;
}
register_setting(config('mahak.settings-group'), $options_key, $args);
}
add_settings_section(
@@ -49,6 +58,14 @@ class SettingsPageFormController extends InvocableController
config('mahak.section-id')
);
add_settings_field(
config('mahak.options.debug-mode'),
config('mahak.translations.debug-mode'),
fn () => $this->debug_mode(),
config('mahak.settings-page'),
config('mahak.section-id')
);
$loginRouteOptionName = config('mahak.options.login-route');
add_filter("pre_update_option_{$loginRouteOptionName}", function ($value) {
return trim($value, '/');
@@ -103,4 +120,14 @@ class SettingsPageFormController extends InvocableController
echo "<input type='text' name='$name' value='$value' class='regular-text' />";
echo '</div>';
}
}
public function debug_mode(): void
{
$name = config('mahak.options.debug-mode');
$enabled = (bool) get_option($name, false);
echo "<input type='hidden' name='".esc_attr($name)."' value='0' />";
echo "<label><input type='checkbox' name='".esc_attr($name)."' value='1' ".checked($enabled, true, false).' /> ';
echo esc_html(config('mahak.translations.debug-mode-description')).'</label>';
}
}
+5 -1
View File
@@ -3,6 +3,7 @@
namespace Dabestaniha\AuthenticateBridge\App\Http\Requests;
use Dabestaniha\AuthenticateBridge\App\Support\Collection;
use UnexpectedValueException;
abstract class BaseFormRequest
{
@@ -44,7 +45,10 @@ abstract class BaseFormRequest
foreach ($rules as $rule) {
if (!$this->validateValue($value, $rule)) {
wp_die(view('invalid-token'), 'Invalid Token', ['response' => 403]);
throw new UnexpectedValueException(
sprintf('The request field "%s" failed the "%s" validation rule.', $attribute, $rule),
403
);
}
$data[$attribute] = $value;