SafePath.coffee 1.0 KB

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