UNPKG

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