Ohm-Management - Projektarbeit B-ME
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.js 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // Copyright 2011 Mark Cavage, Inc. All rights reserved.
  2. var assert = require('assert');
  3. var asn1 = require('asn1');
  4. var parents = require('ldap-filter');
  5. var Protocol = require('../protocol');
  6. var Filter = require('./filter');
  7. var AndFilter = require('./and_filter');
  8. var ApproximateFilter = require('./approx_filter');
  9. var EqualityFilter = require('./equality_filter');
  10. var ExtensibleFilter = require('./ext_filter');
  11. var GreaterThanEqualsFilter = require('./ge_filter');
  12. var LessThanEqualsFilter = require('./le_filter');
  13. var NotFilter = require('./not_filter');
  14. var OrFilter = require('./or_filter');
  15. var PresenceFilter = require('./presence_filter');
  16. var SubstringFilter = require('./substr_filter');
  17. ///--- Globals
  18. var BerReader = asn1.BerReader;
  19. ///--- Internal Parsers
  20. /*
  21. * A filter looks like this coming in:
  22. * Filter ::= CHOICE {
  23. * and [0] SET OF Filter,
  24. * or [1] SET OF Filter,
  25. * not [2] Filter,
  26. * equalityMatch [3] AttributeValueAssertion,
  27. * substrings [4] SubstringFilter,
  28. * greaterOrEqual [5] AttributeValueAssertion,
  29. * lessOrEqual [6] AttributeValueAssertion,
  30. * present [7] AttributeType,
  31. * approxMatch [8] AttributeValueAssertion,
  32. * extensibleMatch [9] MatchingRuleAssertion --v3 only
  33. * }
  34. *
  35. * SubstringFilter ::= SEQUENCE {
  36. * type AttributeType,
  37. * SEQUENCE OF CHOICE {
  38. * initial [0] IA5String,
  39. * any [1] IA5String,
  40. * final [2] IA5String
  41. * }
  42. * }
  43. *
  44. * The extensibleMatch was added in LDAPv3:
  45. *
  46. * MatchingRuleAssertion ::= SEQUENCE {
  47. * matchingRule [1] MatchingRuleID OPTIONAL,
  48. * type [2] AttributeDescription OPTIONAL,
  49. * matchValue [3] AssertionValue,
  50. * dnAttributes [4] BOOLEAN DEFAULT FALSE
  51. * }
  52. */
  53. function _parse(ber) {
  54. assert.ok(ber);
  55. function parseSet(f) {
  56. var end = ber.offset + ber.length;
  57. while (ber.offset < end)
  58. f.addFilter(_parse(ber));
  59. }
  60. var f;
  61. var type = ber.readSequence();
  62. switch (type) {
  63. case Protocol.FILTER_AND:
  64. f = new AndFilter();
  65. parseSet(f);
  66. break;
  67. case Protocol.FILTER_APPROX:
  68. f = new ApproximateFilter();
  69. f.parse(ber);
  70. break;
  71. case Protocol.FILTER_EQUALITY:
  72. f = new EqualityFilter();
  73. f.parse(ber);
  74. return f;
  75. case Protocol.FILTER_EXT:
  76. f = new ExtensibleFilter();
  77. f.parse(ber);
  78. return f;
  79. case Protocol.FILTER_GE:
  80. f = new GreaterThanEqualsFilter();
  81. f.parse(ber);
  82. return f;
  83. case Protocol.FILTER_LE:
  84. f = new LessThanEqualsFilter();
  85. f.parse(ber);
  86. return f;
  87. case Protocol.FILTER_NOT:
  88. var _f = _parse(ber);
  89. f = new NotFilter({
  90. filter: _f
  91. });
  92. break;
  93. case Protocol.FILTER_OR:
  94. f = new OrFilter();
  95. parseSet(f);
  96. break;
  97. case Protocol.FILTER_PRESENT:
  98. f = new PresenceFilter();
  99. f.parse(ber);
  100. break;
  101. case Protocol.FILTER_SUBSTRINGS:
  102. f = new SubstringFilter();
  103. f.parse(ber);
  104. break;
  105. default:
  106. throw new Error('Invalid search filter type: 0x' + type.toString(16));
  107. }
  108. assert.ok(f);
  109. return f;
  110. }
  111. function cloneFilter(input) {
  112. var child;
  113. if (input.type === 'and' || input.type === 'or') {
  114. child = input.filters.map(cloneFilter);
  115. } else if (input.type === 'not') {
  116. child = cloneFilter(input.filter);
  117. }
  118. switch (input.type) {
  119. case 'and':
  120. return new AndFilter({filters: child});
  121. case 'or':
  122. return new OrFilter({filters: child});
  123. case 'not':
  124. return new NotFilter({filter: child});
  125. case 'equal':
  126. return new EqualityFilter(input);
  127. case 'substring':
  128. return new SubstringFilter(input);
  129. case 'ge':
  130. return new GreaterThanEqualsFilter(input);
  131. case 'le':
  132. return new LessThanEqualsFilter(input);
  133. case 'present':
  134. return new PresenceFilter(input);
  135. case 'approx':
  136. return new ApproximateFilter(input);
  137. case 'ext':
  138. return new ExtensibleFilter(input);
  139. default:
  140. throw new Error('invalid filter type:' + input.type);
  141. }
  142. }
  143. function parseString(str) {
  144. var generic = parents.parse(str);
  145. // The filter object(s) return from ldap-filter.parse lack the toBer/parse
  146. // decoration that native ldapjs filter possess. cloneFilter adds that back.
  147. return cloneFilter(generic);
  148. }
  149. ///--- API
  150. module.exports = {
  151. parse: function (ber) {
  152. if (!ber || !(ber instanceof BerReader))
  153. throw new TypeError('ber (BerReader) required');
  154. return _parse(ber);
  155. },
  156. parseString: parseString,
  157. isFilter: Filter.isFilter,
  158. AndFilter: AndFilter,
  159. ApproximateFilter: ApproximateFilter,
  160. EqualityFilter: EqualityFilter,
  161. ExtensibleFilter: ExtensibleFilter,
  162. GreaterThanEqualsFilter: GreaterThanEqualsFilter,
  163. LessThanEqualsFilter: LessThanEqualsFilter,
  164. NotFilter: NotFilter,
  165. OrFilter: OrFilter,
  166. PresenceFilter: PresenceFilter,
  167. SubstringFilter: SubstringFilter
  168. };