PixelfedUsername.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. namespace App\Rules;
  3. use Closure;
  4. use App\Util\Lexer\RestrictedNames;
  5. use Illuminate\Contracts\Validation\ValidationRule;
  6. class PixelfedUsername implements ValidationRule
  7. {
  8. /**
  9. * Run the validation rule.
  10. *
  11. * @param string $attribute
  12. * @param mixed $value
  13. * @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail
  14. * @return void
  15. */
  16. public function validate(string $attribute, mixed $value, Closure $fail): void
  17. {
  18. $dash = substr_count($value, '-');
  19. $underscore = substr_count($value, '_');
  20. $period = substr_count($value, '.');
  21. if (ends_with($value, ['.php', '.js', '.css'])) {
  22. $fail('Username is invalid.');
  23. return;
  24. }
  25. if (($dash + $underscore + $period) > 1) {
  26. $fail('Username is invalid. Can only contain one dash (-), period (.) or underscore (_).');
  27. return;
  28. }
  29. if (! ctype_alnum($value[0])) {
  30. $fail('Username is invalid. Must start with a letter or number.');
  31. return;
  32. }
  33. if (! ctype_alnum($value[strlen($value) - 1])) {
  34. $fail('Username is invalid. Must end with a letter or number.');
  35. return;
  36. }
  37. $val = str_replace(['_', '.', '-'], '', $value);
  38. if (! ctype_alnum($val)) {
  39. $fail('Username is invalid. Username must be alpha-numeric and may contain dashes (-), periods (.) and underscores (_).');
  40. return;
  41. }
  42. $restricted = RestrictedNames::get();
  43. if (in_array(strtolower($value), array_map('strtolower', $restricted))) {
  44. $fail('Username cannot be used.');
  45. return;
  46. }
  47. }
  48. }