index.js~ 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // commands for handling umask
  2. var util = require("util")
  3. var log = require("npmlog")
  4. var defaultUmask = 0022
  5. var defaultUmaskString = toString(defaultUmask)
  6. exports.toString = toString
  7. exports.fromString = fromString
  8. exports.validate = validate
  9. function toString(val) {
  10. val = val.toString(8)
  11. while (val.length < 4) val = "0" + val
  12. return val
  13. }
  14. function validate (data, k, val) {
  15. // must be either an integer or an octal string.
  16. if (typeof val === "number") {
  17. data[k] = val
  18. return true
  19. }
  20. if (typeof val === "string") {
  21. if (val.charAt(0) !== "0" || isNaN(val)) return false
  22. data[k] = parseInt(val, 8)
  23. return true
  24. }
  25. return false
  26. }
  27. function fromString(val, cb) {
  28. // synchronous callback, no zalgo
  29. _fromString(val, cb || function (err, result) {
  30. if (err) log.warn("invalid umask", err.message)
  31. val = result
  32. })
  33. return val
  34. }
  35. function _fromString(val, cb) {
  36. if(typeof val === "string") {
  37. if (!/^[0-7]+$/.test(val)) {
  38. return cb(new Error(util.format("Expected octal string, got %j, defaulting to %j",
  39. val, defaultUmaskString)),
  40. defaultUmask)
  41. }
  42. val = parseInt(val, 8)
  43. } else if(typeof val !== "number") {
  44. return cb(new Error(util.format("Expected number or octal string, got %j, defaulting to %j",
  45. val, defaultUmaskString)),
  46. defaultUmask)
  47. }
  48. if ((val < 0) || (val > 511)) {
  49. return cb(new Error(util.format("Must be in range 0..511 (0000..0777), got %j", val)),
  50. defaultUmask)
  51. }
  52. cb(null, val)
  53. }