index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. 'use strict'
  2. const core = Object.freeze({
  3. LDAP_VERSION_3: 0x03,
  4. LBER_SET: 0x31,
  5. LDAP_CONTROLS: 0xa0
  6. })
  7. const operations = Object.freeze({
  8. LDAP_REQ_BIND: 0x60,
  9. LDAP_REQ_UNBIND: 0x42,
  10. LDAP_REQ_SEARCH: 0x63,
  11. LDAP_REQ_MODIFY: 0x66,
  12. LDAP_REQ_ADD: 0x68,
  13. LDAP_REQ_DELETE: 0x4a,
  14. LDAP_REQ_MODRDN: 0x6c,
  15. LDAP_REQ_COMPARE: 0x6e,
  16. LDAP_REQ_ABANDON: 0x50,
  17. LDAP_REQ_EXTENSION: 0x77,
  18. LDAP_RES_BIND: 0x61,
  19. LDAP_RES_SEARCH_ENTRY: 0x64,
  20. LDAP_RES_SEARCH_DONE: 0x65,
  21. LDAP_RES_SEARCH_REF: 0x73,
  22. LDAP_RES_SEARCH: 0x65,
  23. LDAP_RES_MODIFY: 0x67,
  24. LDAP_RES_ADD: 0x69,
  25. LDAP_RES_DELETE: 0x6b,
  26. LDAP_RES_MODRDN: 0x6d,
  27. LDAP_RES_COMPARE: 0x6f,
  28. LDAP_RES_EXTENSION: 0x78,
  29. LDAP_RES_INTERMEDIATE: 0x79,
  30. // This is really an operation. It's a specific
  31. // sequence tag. But the referral situation is
  32. // so specific it makes more sense to put it here.
  33. LDAP_RES_REFERRAL: 0xa3
  34. })
  35. /**
  36. * List of LDAP response result codes. See
  37. * https://web.archive.org/web/20220812122129/https://nawilson.com/ldap-result-code-reference/
  38. */
  39. const resultCodes = Object.freeze({
  40. SUCCESS: 0,
  41. OPERATIONS_ERROR: 1,
  42. PROTOCOL_ERROR: 2,
  43. TIME_LIMIT_EXCEEDED: 3,
  44. SIZE_LIMIT_EXCEEDED: 4,
  45. COMPARE_FALSE: 5,
  46. COMPARE_TRUE: 6,
  47. AUTH_METHOD_NOT_SUPPORTED: 7,
  48. STRONGER_AUTH_REQUIRED: 8,
  49. REFERRAL: 10,
  50. ADMIN_LIMIT_EXCEEDED: 11,
  51. UNAVAILABLE_CRITICAL_EXTENSION: 12,
  52. CONFIDENTIALITY_REQUIRED: 13,
  53. SASL_BIND_IN_PROGRESS: 14,
  54. NO_SUCH_ATTRIBUTE: 16,
  55. UNDEFINED_ATTRIBUTE_TYPE: 17,
  56. INAPPROPRIATE_MATCHING: 18,
  57. CONSTRAINT_VIOLATION: 19,
  58. ATTRIBUTE_OR_VALUE_EXISTS: 20,
  59. INVALID_ATTRIBUTE_SYNTAX: 21,
  60. NO_SUCH_OBJECT: 32,
  61. ALIAS_PROBLEM: 33,
  62. INVALID_DN_SYNTAX: 34,
  63. IS_LEAF: 35,
  64. ALIAS_DEREFERENCING_PROBLEM: 36,
  65. INAPPROPRIATE_AUTHENTICATION: 48,
  66. INVALID_CREDENTIALS: 49,
  67. INSUFFICIENT_ACCESS_RIGHTS: 50,
  68. BUSY: 51,
  69. UNAVAILABLE: 52,
  70. UNWILLING_TO_PERFORM: 53,
  71. LOOP_DETECT: 54,
  72. SORT_CONTROL_MISSING: 60,
  73. OFFSET_RANGE_ERROR: 61,
  74. NAMING_VIOLATION: 64,
  75. OBJECT_CLASS_VIOLATION: 65,
  76. NOT_ALLOWED_ON_NON_LEAF: 66,
  77. NOT_ALLOWED_ON_RDN: 67,
  78. ENTRY_ALREADY_EXISTS: 68,
  79. OBJECT_CLASS_MODS_PROHIBITED: 69,
  80. RESULTS_TOO_LARGE: 70,
  81. AFFECTS_MULTIPLE_DSAS: 71,
  82. CONTROL_ERROR: 76,
  83. OTHER: 80,
  84. SERVER_DOWN: 81,
  85. LOCAL_ERROR: 82,
  86. ENCODING_ERROR: 83,
  87. DECODING_ERROR: 84,
  88. TIMEOUT: 85,
  89. AUTH_UNKNOWN: 86,
  90. FILTER_ERROR: 87,
  91. USER_CANCELED: 88,
  92. PARAM_ERROR: 89,
  93. NO_MEMORY: 90,
  94. CONNECT_ERROR: 91,
  95. NOT_SUPPORTED: 92,
  96. CONTROL_NOT_FOUND: 93,
  97. NO_RESULTS_RETURNED: 94,
  98. MORE_RESULTS_TO_RETURN: 95,
  99. CLIENT_LOOP: 96,
  100. REFERRAL_LIMIT_EXCEEDED: 97,
  101. INVALID_RESPONSE: 100,
  102. AMBIGUOUS_RESPONSE: 101,
  103. TLS_NOT_SUPPORTED: 112,
  104. INTERMEDIATE_RESPONSE: 113,
  105. UNKNOWN_TYPE: 114,
  106. CANCELED: 118,
  107. NO_SUCH_OPERATION: 119,
  108. TOO_LATE: 120,
  109. CANNOT_CANCEL: 121,
  110. ASSERTION_FAILED: 122,
  111. AUTHORIZATION_DENIED: 123,
  112. E_SYNC_REFRESH_REQUIRED: 4096,
  113. NO_OPERATION: 16654
  114. })
  115. /**
  116. * Value constants and ASN.1 tags as defined in:
  117. * https://datatracker.ietf.org/doc/html/rfc4511#section-4.5.1
  118. */
  119. const search = Object.freeze({
  120. SCOPE_BASE_OBJECT: 0,
  121. SCOPE_ONE_LEVEL: 1,
  122. SCOPE_SUBTREE: 2,
  123. NEVER_DEREF_ALIASES: 0,
  124. DEREF_IN_SEARCHING: 1,
  125. DEREF_BASE_OBJECT: 2,
  126. DEREF_ALWAYS: 3,
  127. FILTER_AND: 0xa0,
  128. FILTER_OR: 0xa1,
  129. FILTER_NOT: 0xa2,
  130. FILTER_EQUALITY: 0xa3,
  131. FILTER_SUBSTRINGS: 0xa4,
  132. FILTER_GE: 0xa5,
  133. FILTER_LE: 0xa6,
  134. FILTER_PRESENT: 0x87,
  135. FILTER_APPROX: 0xa8,
  136. FILTER_EXT: 0xa9
  137. })
  138. module.exports = Object.freeze({
  139. core,
  140. operations,
  141. resultCodes,
  142. search,
  143. resultCodeToName
  144. })
  145. /**
  146. * Given an LDAP result code, return the constant name for that code.
  147. *
  148. * @param {number} code
  149. *
  150. * @returns {string|undefined}
  151. */
  152. function resultCodeToName (code) {
  153. for (const [key, value] of Object.entries(resultCodes)) {
  154. if (value === code) return key
  155. }
  156. }