validator.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package validator // import "miniflux.app/v2/internal/validator"
  4. import (
  5. "errors"
  6. "fmt"
  7. "regexp"
  8. "strings"
  9. "miniflux.app/v2/internal/model"
  10. )
  11. var domainRegex = regexp.MustCompile(`^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$`)
  12. // ValidateRange makes sure the offset/limit values are valid.
  13. func ValidateRange(offset, limit int) error {
  14. if offset < 0 {
  15. return errors.New(`offset value should be >= 0`)
  16. }
  17. if limit < 0 {
  18. return errors.New(`limit value should be >= 0`)
  19. }
  20. if limit > model.MaxEntryLimit {
  21. return fmt.Errorf(`limit value should be <= %d`, model.MaxEntryLimit)
  22. }
  23. return nil
  24. }
  25. // ValidateDirection makes sure the sorting direction is valid.
  26. func ValidateDirection(direction string) error {
  27. switch direction {
  28. case "asc", "desc":
  29. return nil
  30. }
  31. return errors.New(`invalid direction, valid direction values are: "asc" or "desc"`)
  32. }
  33. // IsValidRegex verifies if the regex can be compiled.
  34. func IsValidRegex(expr string) bool {
  35. _, err := regexp.Compile(expr)
  36. return err == nil
  37. }
  38. // IsValidDomain verifies a single domain name against length and character constraints.
  39. func IsValidDomain(domain string) bool {
  40. domain = strings.ToLower(domain)
  41. if len(domain) < 1 || len(domain) > 253 {
  42. return false
  43. }
  44. return domainRegex.MatchString(domain)
  45. }
  46. // IsValidDomainList verifies a space-separated list of domains for validity.
  47. func IsValidDomainList(value string) bool {
  48. domains := strings.SplitSeq(strings.TrimSpace(value), " ")
  49. for domain := range domains {
  50. if !IsValidDomain(domain) {
  51. return false
  52. }
  53. }
  54. return true
  55. }