index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. 'use strict'
  2. const util = require('util')
  3. const assert = require('assert-plus')
  4. const LDAPResult = require('../messages').LDAPResult
  5. /// --- Globals
  6. const CODES = require('./codes')
  7. const ERRORS = []
  8. /// --- Error Base class
  9. function LDAPError (message, dn, caller) {
  10. if (Error.captureStackTrace) { Error.captureStackTrace(this, caller || LDAPError) }
  11. this.lde_message = message
  12. this.lde_dn = dn
  13. }
  14. util.inherits(LDAPError, Error)
  15. Object.defineProperties(LDAPError.prototype, {
  16. name: {
  17. get: function getName () { return 'LDAPError' },
  18. configurable: false
  19. },
  20. code: {
  21. get: function getCode () { return CODES.LDAP_OTHER },
  22. configurable: false
  23. },
  24. message: {
  25. get: function getMessage () {
  26. return this.lde_message || this.name
  27. },
  28. set: function setMessage (message) {
  29. this.lde_message = message
  30. },
  31. configurable: false
  32. },
  33. dn: {
  34. get: function getDN () {
  35. return (this.lde_dn ? this.lde_dn.toString() : '')
  36. },
  37. configurable: false
  38. }
  39. })
  40. /// --- Exported API
  41. module.exports = {}
  42. module.exports.LDAPError = LDAPError
  43. // Some whacky games here to make sure all the codes are exported
  44. Object.keys(CODES).forEach(function (code) {
  45. module.exports[code] = CODES[code]
  46. if (code === 'LDAP_SUCCESS') { return }
  47. let err = ''
  48. let msg = ''
  49. const pieces = code.split('_').slice(1)
  50. for (let i = 0; i < pieces.length; i++) {
  51. const lc = pieces[i].toLowerCase()
  52. const key = lc.charAt(0).toUpperCase() + lc.slice(1)
  53. err += key
  54. msg += key + ((i + 1) < pieces.length ? ' ' : '')
  55. }
  56. if (!/\w+Error$/.test(err)) { err += 'Error' }
  57. // At this point LDAP_OPERATIONS_ERROR is now OperationsError in $err
  58. // and 'Operations Error' in $msg
  59. module.exports[err] = function (message, dn, caller) {
  60. LDAPError.call(this, message, dn, caller || module.exports[err])
  61. }
  62. module.exports[err].constructor = module.exports[err]
  63. util.inherits(module.exports[err], LDAPError)
  64. Object.defineProperties(module.exports[err].prototype, {
  65. name: {
  66. get: function getName () { return err },
  67. configurable: false
  68. },
  69. code: {
  70. get: function getCode () { return CODES[code] },
  71. configurable: false
  72. }
  73. })
  74. ERRORS[CODES[code]] = {
  75. err,
  76. message: msg
  77. }
  78. })
  79. module.exports.getError = function (res) {
  80. assert.ok(res instanceof LDAPResult, 'res (LDAPResult) required')
  81. const errObj = ERRORS[res.status]
  82. const E = module.exports[errObj.err]
  83. return new E(res.errorMessage || errObj.message,
  84. res.matchedDN || null,
  85. module.exports.getError)
  86. }
  87. module.exports.getMessage = function (code) {
  88. assert.number(code, 'code (number) required')
  89. const errObj = ERRORS[code]
  90. return (errObj && errObj.message ? errObj.message : '')
  91. }
  92. /// --- Custom application errors
  93. function ConnectionError (message) {
  94. LDAPError.call(this, message, null, ConnectionError)
  95. }
  96. util.inherits(ConnectionError, LDAPError)
  97. module.exports.ConnectionError = ConnectionError
  98. Object.defineProperties(ConnectionError.prototype, {
  99. name: {
  100. get: function () { return 'ConnectionError' },
  101. configurable: false
  102. }
  103. })
  104. function AbandonedError (message) {
  105. LDAPError.call(this, message, null, AbandonedError)
  106. }
  107. util.inherits(AbandonedError, LDAPError)
  108. module.exports.AbandonedError = AbandonedError
  109. Object.defineProperties(AbandonedError.prototype, {
  110. name: {
  111. get: function () { return 'AbandonedError' },
  112. configurable: false
  113. }
  114. })
  115. function TimeoutError (message) {
  116. LDAPError.call(this, message, null, TimeoutError)
  117. }
  118. util.inherits(TimeoutError, LDAPError)
  119. module.exports.TimeoutError = TimeoutError
  120. Object.defineProperties(TimeoutError.prototype, {
  121. name: {
  122. get: function () { return 'TimeoutError' },
  123. configurable: false
  124. }
  125. })