SafePath.coffee 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. BADCHAR_RX = ///
  2. [
  3. \/ # no slashes
  4. \* # no asterisk
  5. \u0000-\u001F # no control characters (0-31)
  6. \u007F # no delete
  7. \u0080-\u009F # no unicode control characters (C1)
  8. \uD800-\uDFFF # no unicode surrogate characters
  9. ]
  10. ///g
  11. BADFILE_RX = ///
  12. (^\.$) # reject . as a filename
  13. | (^\.\.$) # reject .. as a filename
  14. | (^\s+) # reject leading space
  15. | (\s+$) # reject trailing space
  16. ///g
  17. MAX_PATH = 1024 # Maximum path length, in characters. This is fairly arbitrary.
  18. module.exports = SafePath =
  19. clean: (filename) ->
  20. filename = filename.replace BADCHAR_RX, '_'
  21. # for BADFILE_RX replace any matches with an equal number of underscores
  22. filename = filename.replace BADFILE_RX, (match) ->
  23. return new Array(match.length + 1).join("_")
  24. return filename
  25. isCleanFilename: (filename) ->
  26. return SafePath.isAllowedLength(filename) &&
  27. not filename.match(BADCHAR_RX) &&
  28. not filename.match(BADFILE_RX)
  29. isAllowedLength: (pathname) ->
  30. return pathname.length > 0 && pathname.length <= MAX_PATH