gitea源码

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package db
  4. import (
  5. "fmt"
  6. "slices"
  7. "strings"
  8. "unicode/utf8"
  9. "code.gitea.io/gitea/modules/util"
  10. )
  11. // ErrNameReserved represents a "reserved name" error.
  12. type ErrNameReserved struct {
  13. Name string
  14. }
  15. // IsErrNameReserved checks if an error is a ErrNameReserved.
  16. func IsErrNameReserved(err error) bool {
  17. _, ok := err.(ErrNameReserved)
  18. return ok
  19. }
  20. func (err ErrNameReserved) Error() string {
  21. return fmt.Sprintf("name is reserved [name: %s]", err.Name)
  22. }
  23. // Unwrap unwraps this as a ErrInvalid err
  24. func (err ErrNameReserved) Unwrap() error {
  25. return util.ErrInvalidArgument
  26. }
  27. // ErrNamePatternNotAllowed represents a "pattern not allowed" error.
  28. type ErrNamePatternNotAllowed struct {
  29. Pattern string
  30. }
  31. // IsErrNamePatternNotAllowed checks if an error is an ErrNamePatternNotAllowed.
  32. func IsErrNamePatternNotAllowed(err error) bool {
  33. _, ok := err.(ErrNamePatternNotAllowed)
  34. return ok
  35. }
  36. func (err ErrNamePatternNotAllowed) Error() string {
  37. return fmt.Sprintf("name pattern is not allowed [pattern: %s]", err.Pattern)
  38. }
  39. // Unwrap unwraps this as a ErrInvalid err
  40. func (err ErrNamePatternNotAllowed) Unwrap() error {
  41. return util.ErrInvalidArgument
  42. }
  43. // ErrNameCharsNotAllowed represents a "character not allowed in name" error.
  44. type ErrNameCharsNotAllowed struct {
  45. Name string
  46. }
  47. // IsErrNameCharsNotAllowed checks if an error is an ErrNameCharsNotAllowed.
  48. func IsErrNameCharsNotAllowed(err error) bool {
  49. _, ok := err.(ErrNameCharsNotAllowed)
  50. return ok
  51. }
  52. func (err ErrNameCharsNotAllowed) Error() string {
  53. return fmt.Sprintf("name is invalid [%s]: must be valid alpha or numeric or dash(-_) or dot characters", err.Name)
  54. }
  55. // Unwrap unwraps this as a ErrInvalid err
  56. func (err ErrNameCharsNotAllowed) Unwrap() error {
  57. return util.ErrInvalidArgument
  58. }
  59. // IsUsableName checks if name is reserved or pattern of name is not allowed
  60. // based on given reserved names and patterns.
  61. // Names are exact match, patterns can be a prefix or suffix match with placeholder '*'.
  62. func IsUsableName(reservedNames, reservedPatterns []string, name string) error {
  63. name = strings.TrimSpace(strings.ToLower(name))
  64. if utf8.RuneCountInString(name) == 0 {
  65. return util.NewInvalidArgumentErrorf("name is empty")
  66. }
  67. if slices.Contains(reservedNames, name) {
  68. return ErrNameReserved{name}
  69. }
  70. for _, pat := range reservedPatterns {
  71. if pat[0] == '*' && strings.HasSuffix(name, pat[1:]) ||
  72. (pat[len(pat)-1] == '*' && strings.HasPrefix(name, pat[:len(pat)-1])) {
  73. return ErrNamePatternNotAllowed{pat}
  74. }
  75. }
  76. return nil
  77. }