Files
2025-10-08 11:12:59 -04:00

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
}
}