1 | 'use strict'
|
2 |
|
3 | const util = require('util')
|
4 | const assert = require('assert-plus')
|
5 |
|
6 | const LDAPResult = require('../messages').LDAPResult
|
7 |
|
8 |
|
9 |
|
10 | const CODES = require('./codes')
|
11 | const ERRORS = []
|
12 |
|
13 |
|
14 |
|
15 | function 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 | }
|
21 | util.inherits(LDAPError, Error)
|
22 | Object.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 |
|
46 |
|
47 | module.exports = {}
|
48 | module.exports.LDAPError = LDAPError
|
49 |
|
50 |
|
51 | Object.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 |
|
68 |
|
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 |
|
91 | module.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 |
|
101 | module.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 |
|
109 |
|
110 | function ConnectionError (message) {
|
111 | LDAPError.call(this, message, null, ConnectionError)
|
112 | }
|
113 | util.inherits(ConnectionError, LDAPError)
|
114 | module.exports.ConnectionError = ConnectionError
|
115 | Object.defineProperties(ConnectionError.prototype, {
|
116 | name: {
|
117 | get: function () { return 'ConnectionError' },
|
118 | configurable: false
|
119 | }
|
120 | })
|
121 |
|
122 | function AbandonedError (message) {
|
123 | LDAPError.call(this, message, null, AbandonedError)
|
124 | }
|
125 | util.inherits(AbandonedError, LDAPError)
|
126 | module.exports.AbandonedError = AbandonedError
|
127 | Object.defineProperties(AbandonedError.prototype, {
|
128 | name: {
|
129 | get: function () { return 'AbandonedError' },
|
130 | configurable: false
|
131 | }
|
132 | })
|
133 |
|
134 | function TimeoutError (message) {
|
135 | LDAPError.call(this, message, null, TimeoutError)
|
136 | }
|
137 | util.inherits(TimeoutError, LDAPError)
|
138 | module.exports.TimeoutError = TimeoutError
|
139 | Object.defineProperties(TimeoutError.prototype, {
|
140 | name: {
|
141 | get: function () { return 'TimeoutError' },
|
142 | configurable: false
|
143 | }
|
144 | })
|