168 lines
3.7 KiB
JavaScript
168 lines
3.7 KiB
JavaScript
'use strict'
|
|
|
|
const core = Object.freeze({
|
|
LDAP_VERSION_3: 0x03,
|
|
LBER_SET: 0x31,
|
|
LDAP_CONTROLS: 0xa0
|
|
})
|
|
|
|
const operations = Object.freeze({
|
|
LDAP_REQ_BIND: 0x60,
|
|
LDAP_REQ_UNBIND: 0x42,
|
|
LDAP_REQ_SEARCH: 0x63,
|
|
LDAP_REQ_MODIFY: 0x66,
|
|
LDAP_REQ_ADD: 0x68,
|
|
LDAP_REQ_DELETE: 0x4a,
|
|
LDAP_REQ_MODRDN: 0x6c,
|
|
LDAP_REQ_COMPARE: 0x6e,
|
|
LDAP_REQ_ABANDON: 0x50,
|
|
LDAP_REQ_EXTENSION: 0x77,
|
|
|
|
LDAP_RES_BIND: 0x61,
|
|
LDAP_RES_SEARCH_ENTRY: 0x64,
|
|
LDAP_RES_SEARCH_DONE: 0x65,
|
|
LDAP_RES_SEARCH_REF: 0x73,
|
|
LDAP_RES_SEARCH: 0x65,
|
|
LDAP_RES_MODIFY: 0x67,
|
|
LDAP_RES_ADD: 0x69,
|
|
LDAP_RES_DELETE: 0x6b,
|
|
LDAP_RES_MODRDN: 0x6d,
|
|
LDAP_RES_COMPARE: 0x6f,
|
|
LDAP_RES_EXTENSION: 0x78,
|
|
LDAP_RES_INTERMEDIATE: 0x79,
|
|
|
|
// This is really an operation. It's a specific
|
|
// sequence tag. But the referral situation is
|
|
// so specific it makes more sense to put it here.
|
|
LDAP_RES_REFERRAL: 0xa3
|
|
})
|
|
|
|
/**
|
|
* List of LDAP response result codes. See
|
|
* https://web.archive.org/web/20220812122129/https://nawilson.com/ldap-result-code-reference/
|
|
*/
|
|
const resultCodes = Object.freeze({
|
|
SUCCESS: 0,
|
|
OPERATIONS_ERROR: 1,
|
|
PROTOCOL_ERROR: 2,
|
|
TIME_LIMIT_EXCEEDED: 3,
|
|
SIZE_LIMIT_EXCEEDED: 4,
|
|
COMPARE_FALSE: 5,
|
|
COMPARE_TRUE: 6,
|
|
AUTH_METHOD_NOT_SUPPORTED: 7,
|
|
STRONGER_AUTH_REQUIRED: 8,
|
|
REFERRAL: 10,
|
|
ADMIN_LIMIT_EXCEEDED: 11,
|
|
UNAVAILABLE_CRITICAL_EXTENSION: 12,
|
|
CONFIDENTIALITY_REQUIRED: 13,
|
|
SASL_BIND_IN_PROGRESS: 14,
|
|
NO_SUCH_ATTRIBUTE: 16,
|
|
UNDEFINED_ATTRIBUTE_TYPE: 17,
|
|
INAPPROPRIATE_MATCHING: 18,
|
|
CONSTRAINT_VIOLATION: 19,
|
|
ATTRIBUTE_OR_VALUE_EXISTS: 20,
|
|
INVALID_ATTRIBUTE_SYNTAX: 21,
|
|
NO_SUCH_OBJECT: 32,
|
|
ALIAS_PROBLEM: 33,
|
|
INVALID_DN_SYNTAX: 34,
|
|
IS_LEAF: 35,
|
|
ALIAS_DEREFERENCING_PROBLEM: 36,
|
|
INAPPROPRIATE_AUTHENTICATION: 48,
|
|
INVALID_CREDENTIALS: 49,
|
|
INSUFFICIENT_ACCESS_RIGHTS: 50,
|
|
BUSY: 51,
|
|
UNAVAILABLE: 52,
|
|
UNWILLING_TO_PERFORM: 53,
|
|
LOOP_DETECT: 54,
|
|
SORT_CONTROL_MISSING: 60,
|
|
OFFSET_RANGE_ERROR: 61,
|
|
NAMING_VIOLATION: 64,
|
|
OBJECT_CLASS_VIOLATION: 65,
|
|
NOT_ALLOWED_ON_NON_LEAF: 66,
|
|
NOT_ALLOWED_ON_RDN: 67,
|
|
ENTRY_ALREADY_EXISTS: 68,
|
|
OBJECT_CLASS_MODS_PROHIBITED: 69,
|
|
RESULTS_TOO_LARGE: 70,
|
|
AFFECTS_MULTIPLE_DSAS: 71,
|
|
CONTROL_ERROR: 76,
|
|
OTHER: 80,
|
|
SERVER_DOWN: 81,
|
|
LOCAL_ERROR: 82,
|
|
ENCODING_ERROR: 83,
|
|
DECODING_ERROR: 84,
|
|
TIMEOUT: 85,
|
|
AUTH_UNKNOWN: 86,
|
|
FILTER_ERROR: 87,
|
|
USER_CANCELED: 88,
|
|
PARAM_ERROR: 89,
|
|
NO_MEMORY: 90,
|
|
CONNECT_ERROR: 91,
|
|
NOT_SUPPORTED: 92,
|
|
CONTROL_NOT_FOUND: 93,
|
|
NO_RESULTS_RETURNED: 94,
|
|
MORE_RESULTS_TO_RETURN: 95,
|
|
CLIENT_LOOP: 96,
|
|
REFERRAL_LIMIT_EXCEEDED: 97,
|
|
INVALID_RESPONSE: 100,
|
|
AMBIGUOUS_RESPONSE: 101,
|
|
TLS_NOT_SUPPORTED: 112,
|
|
INTERMEDIATE_RESPONSE: 113,
|
|
UNKNOWN_TYPE: 114,
|
|
CANCELED: 118,
|
|
NO_SUCH_OPERATION: 119,
|
|
TOO_LATE: 120,
|
|
CANNOT_CANCEL: 121,
|
|
ASSERTION_FAILED: 122,
|
|
AUTHORIZATION_DENIED: 123,
|
|
E_SYNC_REFRESH_REQUIRED: 4096,
|
|
NO_OPERATION: 16654
|
|
})
|
|
|
|
/**
|
|
* Value constants and ASN.1 tags as defined in:
|
|
* https://datatracker.ietf.org/doc/html/rfc4511#section-4.5.1
|
|
*/
|
|
const search = Object.freeze({
|
|
SCOPE_BASE_OBJECT: 0,
|
|
SCOPE_ONE_LEVEL: 1,
|
|
SCOPE_SUBTREE: 2,
|
|
|
|
NEVER_DEREF_ALIASES: 0,
|
|
DEREF_IN_SEARCHING: 1,
|
|
DEREF_BASE_OBJECT: 2,
|
|
DEREF_ALWAYS: 3,
|
|
|
|
FILTER_AND: 0xa0,
|
|
FILTER_OR: 0xa1,
|
|
FILTER_NOT: 0xa2,
|
|
FILTER_EQUALITY: 0xa3,
|
|
FILTER_SUBSTRINGS: 0xa4,
|
|
FILTER_GE: 0xa5,
|
|
FILTER_LE: 0xa6,
|
|
FILTER_PRESENT: 0x87,
|
|
FILTER_APPROX: 0xa8,
|
|
FILTER_EXT: 0xa9
|
|
})
|
|
|
|
module.exports = Object.freeze({
|
|
core,
|
|
operations,
|
|
resultCodes,
|
|
search,
|
|
|
|
resultCodeToName
|
|
})
|
|
|
|
/**
|
|
* Given an LDAP result code, return the constant name for that code.
|
|
*
|
|
* @param {number} code
|
|
*
|
|
* @returns {string|undefined}
|
|
*/
|
|
function resultCodeToName (code) {
|
|
for (const [key, value] of Object.entries(resultCodes)) {
|
|
if (value === code) return key
|
|
}
|
|
}
|