diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index f9d31ca..96dbff0 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use App\Models\User; use App\Notifications\NewUserRegistered; use App\Rules\NotDisposableEmail; +use App\Rules\ReservedIdentifier; use Illuminate\Auth\Events\Registered; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; @@ -27,8 +28,8 @@ class RegisteredUserController extends Controller } $request->validate([ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users', new NotDisposableEmail], + 'name' => ['required', 'string', 'max:255', new ReservedIdentifier('name')], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users', new NotDisposableEmail, new ReservedIdentifier('email')], 'password' => ['required', 'confirmed', Password::defaults()], 'birthday' => ['required', 'date', 'before:today'], 'gender' => ['required', 'in:male,female'], diff --git a/app/Rules/ReservedIdentifier.php b/app/Rules/ReservedIdentifier.php new file mode 100644 index 0000000..1cd2918 --- /dev/null +++ b/app/Rules/ReservedIdentifier.php @@ -0,0 +1,56 @@ +kind === 'email' + ? strtolower(trim(strstr($value, '@', true) ?: $value)) + : strtolower(trim($value)); + + // Collapse separators so "super_admin", "super-admin" and "superadmin" all match. + $normalized = preg_replace('/[\s._\-]+/', '', $candidate) ?? $candidate; + + foreach (self::RESERVED as $word) { + $target = preg_replace('/[\s._\-]+/', '', $word) ?? $word; + if ($normalized === $target) { + $fail($this->kind === 'email' + ? 'That email address is reserved. Please use a different one.' + : 'That name is reserved. Please choose a different one.'); + return; + } + } + } +}