SpamSafe.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const XRegExp = require('xregexp')
  2. // A note about SAFE_REGEX:
  3. // We have to escape the escape characters because XRegExp compiles it first.
  4. // So it's equivalent to `^[\p{L}\p{N}\s\-_!&\(\)]+$]
  5. // \p{L} = any letter in any language
  6. // \p{N} = any kind of numeric character
  7. // https://www.regular-expressions.info/unicode.html#prop is a good resource for
  8. // more obscure regex features. standard RegExp does not support these
  9. const HAN_REGEX = XRegExp('\\p{Han}')
  10. const SAFE_REGEX = XRegExp("^[\\p{L}\\p{N}\\s\\-_!'&\\(\\)]+$")
  11. const EMAIL_REGEX = XRegExp('^[\\p{L}\\p{N}.+_-]+@[\\w.-]+$')
  12. const SPAM_TAGS_REGEX = /qun|jiaqun|jia|jnd/i
  13. function countDigits(str) {
  14. return (str.match(/\d/g) || []).length
  15. }
  16. const SpamSafe = {
  17. isSafeUserName(name) {
  18. return SAFE_REGEX.test(name) && name.length <= 30
  19. },
  20. isSafeProjectName(name) {
  21. if (SPAM_TAGS_REGEX.test(name) || countDigits(name) > 5) {
  22. return false
  23. }
  24. if (HAN_REGEX.test(name)) {
  25. return SAFE_REGEX.test(name) && name.length <= 10
  26. }
  27. return SAFE_REGEX.test(name) && name.length <= 100
  28. },
  29. isSafeEmail(email) {
  30. return EMAIL_REGEX.test(email) && email.length <= 40
  31. },
  32. safeUserName(name, alternative, project) {
  33. if (project == null) {
  34. project = false
  35. }
  36. if (SpamSafe.isSafeUserName(name)) {
  37. return name
  38. }
  39. return alternative
  40. },
  41. safeProjectName(name, alternative) {
  42. if (SpamSafe.isSafeProjectName(name)) {
  43. return name
  44. }
  45. return alternative
  46. },
  47. safeEmail(email, alternative) {
  48. if (SpamSafe.isSafeEmail(email)) {
  49. return email
  50. }
  51. return alternative
  52. },
  53. }
  54. module.exports = SpamSafe