IdLDAPV3Coder.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. {
  2. $Project$
  3. $Workfile$
  4. $Revision$
  5. $DateUTC$
  6. $Id$
  7. This file is part of the Indy (Internet Direct) project, and is offered
  8. under the dual-licensing agreement described on the Indy website.
  9. (http://www.indyproject.org/)
  10. Copyright:
  11. (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
  12. }
  13. {
  14. $Log$
  15. }
  16. {
  17. Rev 1.0 15/04/2005 7:25:06 AM GGrieve
  18. first ported to INdy
  19. }
  20. unit IdLDAPV3Coder;
  21. interface
  22. {$i IdCompilerDefines.inc}
  23. uses
  24. IdASN1Coder,
  25. IdLdapV3;
  26. type
  27. TIdLDAPV3Encoder = Class (TIdASN1Encoder)
  28. private
  29. procedure WriteAuthentication(oAuthentication: TIdLDAPv3AuthenticationChoice);
  30. procedure WriteFilterList(oFilterList : TIdLDAPV3FilterList; iTag : integer);
  31. procedure WriteAttributeValueAssertion(oAttributeValueAssertion : TIdLDAPV3AttributeValueAssertion; iTag : integer);
  32. procedure WriteSubstring(oSubstring : TIdLDAPV3Substring; iTag : integer);
  33. procedure WriteSubstringFilter(oSubstringFilter : TIdLDAPV3SubstringFilter; iTag : integer);
  34. procedure WriteMatchingRuleAssertion(oMatchingRuleAssertion : TIdLDAPV3MatchingRuleAssertion; iTag : integer);
  35. procedure WriteFilter(oFilter : TIdLDAPV3Filter; iTag : integer);
  36. procedure WriteAttributes(oAttributes : TIdLDAPV3AttributeDescriptionList; iTag : integer);
  37. procedure WriteReferral(oReferral : TIdLDAPV3Referral; iTag : integer);
  38. procedure WritePartialAttributeList(oAttributes : TIdLDAPV3PartialAttributeList; iTag : integer);
  39. procedure WritePartialAttribute(oAttribute : TIdLDAPV3PartialAttribute; iTag : integer);
  40. procedure WriteResultInner(oResult : TIdLDAPV3LDAPResult);
  41. procedure WritebindRequest(oBindRequest : TIdLDAPV3BindRequest);
  42. procedure WritebindResponse(oBindResponse : TIdLDAPV3BindResponse);
  43. procedure WriteunbindRequest(oUnbindRequest : TIdLDAPV3UnbindRequest);
  44. procedure WritesearchRequest(oSearchRequest : TIdLDAPV3SearchRequest);
  45. procedure WritesearchResEntry(oSearchResEntry : TIdLDAPV3SearchResultEntry);
  46. procedure WritesearchResDone(oSearchResDone : TIdLDAPV3SearchResultDone);
  47. procedure WritesearchResRef(oSearchResRef : TIdLDAPV3SearchResultReference);
  48. procedure WritemodifyRequest(oModifyRequest : TIdLDAPV3ModifyRequest);
  49. procedure WritemodifyResponse(oModifyResponse : TIdLDAPV3ModifyResponse);
  50. procedure WriteaddRequest(oAddRequest : TIdLDAPV3AddRequest);
  51. procedure WriteaddResponse(oAddResponse : TIdLDAPV3AddResponse);
  52. procedure WritedelRequest(oDelRequest : TIdLDAPV3DelRequest);
  53. procedure WritedelResponse(oDelResponse : TIdLDAPV3DelResponse);
  54. procedure WritemodDNRequest(oModDNRequest : TIdLDAPV3ModifyDNRequest);
  55. procedure WritemodDNResponse(oModDNResponse : TIdLDAPV3ModifyDNResponse);
  56. procedure WritecompareRequest(oCompareRequest : TIdLDAPV3CompareRequest);
  57. procedure WritecompareResponse(oCompareResponse : TIdLDAPV3CompareResponse);
  58. procedure WriteabandonRequest(oAbandonRequest : TIdLDAPV3AbandonRequest);
  59. procedure WriteextendedReq(oExtendedReq : TIdLDAPV3ExtendedRequest);
  60. procedure WriteextendedResp(oExtendedResp : TIdLDAPV3ExtendedResponse);
  61. public
  62. procedure Produce(oMessage : TIdLDAPV3Message); Overload; Virtual;
  63. end;
  64. TIdLDAPV3Decoder = Class (TIdASN1Decoder)
  65. private
  66. procedure ReadFilter(oFilter : TIdLDAPV3Filter);
  67. procedure ReadFilterList(oFilterList : TIdLDAPV3FilterList);
  68. procedure ReadAttributes(oAttributes : TIdLDAPV3AttributeDescriptionList);
  69. procedure ReadAttributeValueAssertion(oEqualityMatch : TIdLDAPV3AttributeValueAssertion);
  70. procedure ReadSubstringFilter(oSubstrings : TIdLDAPV3SubstringFilter);
  71. procedure ReadMatchingRuleAssertion(oExtensibleMatch : TIdLDAPV3MatchingRuleAssertion);
  72. procedure ReadSubString(oString : TIdLDAPV3Substring);
  73. procedure ReadPartialAttribute(oAttribute : TIdLDAPV3PartialAttribute);
  74. procedure ReadPartialAttributeList(oAttributes : TIdLDAPV3PartialAttributeList);
  75. procedure ReadReferral(oReferral : TIdLDAPV3Referral);
  76. procedure ReadResultInner(oResult : TIdLDAPV3LDAPResult);
  77. procedure ReadBindRequest(oMessage : TIdLDAPV3Message);
  78. procedure ReadBindResponse(oMessage : TIdLDAPV3Message);
  79. procedure ReadSearchRequest(oMessage : TIdLDAPV3Message);
  80. procedure ReadSearchResultEntry(oMessage : TIdLDAPV3Message);
  81. procedure ReadSearchResultDone(oMessage : TIdLDAPV3Message);
  82. public
  83. procedure ReadMessage(oMessage : TIdLDAPV3Message); Overload; Virtual;
  84. end;
  85. implementation
  86. uses
  87. SysUtils,
  88. IdException;
  89. { TIdLDAPV3Encoder }
  90. procedure TIdLDAPV3Encoder.Produce(oMessage: TIdLDAPV3Message);
  91. begin
  92. StartWriting;
  93. StartSequence;
  94. WriteInteger(oMessage.messageID);
  95. if assigned(oMessage.bindRequest) then
  96. WritebindRequest(oMessage.bindRequest) // TIdLDAPV3BindRequest
  97. else if assigned(oMessage.bindResponse) then
  98. WritebindResponse(oMessage.bindResponse) // TIdLDAPV3BindResponse
  99. else if assigned(oMessage.unbindRequest) then
  100. WriteunbindRequest(oMessage.unbindRequest) // TIdLDAPV3UnbindRequest
  101. else if assigned(oMessage.searchRequest) then
  102. WritesearchRequest(oMessage.searchRequest) // TIdLDAPV3SearchRequest
  103. else if assigned(oMessage.searchResEntry) then
  104. WritesearchResEntry(oMessage.searchResEntry) // TIdLDAPV3SearchResultEntry
  105. else if assigned(oMessage.searchResDone) then
  106. WritesearchResDone(oMessage.searchResDone) // TIdLDAPV3SearchResultDone
  107. else if assigned(oMessage.searchResRef) then
  108. WritesearchResRef(oMessage.searchResRef) // TIdLDAPV3SearchResultReference
  109. else if assigned(oMessage.modifyRequest) then
  110. WritemodifyRequest(oMessage.modifyRequest) // TIdLDAPV3ModifyRequest
  111. else if assigned(oMessage.modifyResponse) then
  112. WritemodifyResponse(oMessage.modifyResponse) // TIdLDAPV3ModifyResponse
  113. else if assigned(oMessage.addRequest) then
  114. WriteaddRequest(oMessage.addRequest) // TIdLDAPV3AddRequest
  115. else if assigned(oMessage.addResponse) then
  116. WriteaddResponse(oMessage.addResponse) // TIdLDAPV3AddResponse
  117. else if assigned(oMessage.delRequest) then
  118. WritedelRequest(oMessage.delRequest) // TIdLDAPV3DelRequest
  119. else if assigned(oMessage.delResponse) then
  120. WritedelResponse(oMessage.delResponse) // TIdLDAPV3DelResponse
  121. else if assigned(oMessage.modDNRequest) then
  122. WritemodDNRequest(oMessage.modDNRequest) // TIdLDAPV3ModifyDNRequest
  123. else if assigned(oMessage.modDNResponse) then
  124. WritemodDNResponse(oMessage.modDNResponse) // TIdLDAPV3ModifyDNResponse
  125. else if assigned(oMessage.compareRequest) then
  126. WritecompareRequest(oMessage.compareRequest) // TIdLDAPV3CompareRequest
  127. else if assigned(oMessage.compareResponse) then
  128. WritecompareResponse(oMessage.compareResponse) // TIdLDAPV3CompareResponse
  129. else if assigned(oMessage.abandonRequest) then
  130. WriteabandonRequest(oMessage.abandonRequest) // TIdLDAPV3AbandonRequest
  131. else if assigned(oMessage.extendedReq) then
  132. WriteextendedReq(oMessage.extendedReq) // TIdLDAPV3ExtendedRequest
  133. else if assigned(oMessage.extendedResp) then
  134. WriteextendedResp(oMessage.extendedResp) // TIdLDAPV3ExtendedResponse
  135. else
  136. raise EIdException.create('No Protocol Choice operation on message'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  137. StopSequence;
  138. StopWriting;
  139. end;
  140. procedure TIdLDAPV3Encoder.WritebindRequest(oBindRequest : TIdLDAPV3BindRequest);
  141. begin
  142. StartSequence(0);
  143. WriteInteger(oBindRequest.version);
  144. WriteString(oBindRequest.name);
  145. WriteAuthentication(oBindRequest.authentication);
  146. StopSequence;
  147. end;
  148. procedure TIdLDAPV3Encoder.WritebindResponse(oBindResponse : TIdLDAPV3BindResponse);
  149. begin
  150. StartSequence(1);
  151. WriteResultInner(oBindResponse);
  152. if oBindResponse.serverSaslCreds <> '' then
  153. WriteString(oBindResponse.serverSaslCreds);
  154. StopSequence;
  155. end;
  156. procedure TIdLDAPV3Encoder.WriteunbindRequest(oUnbindRequest : TIdLDAPV3UnbindRequest);
  157. begin
  158. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  159. end;
  160. procedure TIdLDAPV3Encoder.WritesearchRequest(oSearchRequest : TIdLDAPV3SearchRequest);
  161. begin
  162. StartSequence(3);
  163. WriteString(oSearchRequest.baseObject);
  164. WriteEnum(ord(oSearchRequest.scope));
  165. WriteEnum(ord(oSearchRequest.derefAliases));
  166. WriteInteger(oSearchRequest.sizeLimit);
  167. WriteInteger(oSearchRequest.timeLimit);
  168. WriteBoolean(oSearchRequest.typesOnly);
  169. WriteFilter(osearchRequest.filter, -1);
  170. WriteAttributes(osearchRequest.attributes, -1);
  171. StopSequence;
  172. end;
  173. procedure TIdLDAPV3Encoder.WritesearchResEntry(oSearchResEntry : TIdLDAPV3SearchResultEntry);
  174. begin
  175. StartSequence(4);
  176. WriteString(oSearchResEntry.objectName);
  177. WritePartialAttributeList(oSearchResEntry.attributes, -1);
  178. StopSequence;
  179. end;
  180. procedure TIdLDAPV3Encoder.WritesearchResDone(oSearchResDone : TIdLDAPV3SearchResultDone);
  181. begin
  182. StartSequence(5);
  183. WriteResultInner(oSearchResDone);
  184. StopSequence;
  185. end;
  186. procedure TIdLDAPV3Encoder.WritesearchResRef(oSearchResRef : TIdLDAPV3SearchResultReference);
  187. begin
  188. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  189. end;
  190. procedure TIdLDAPV3Encoder.WritemodifyRequest(oModifyRequest : TIdLDAPV3ModifyRequest);
  191. begin
  192. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  193. end;
  194. procedure TIdLDAPV3Encoder.WritemodifyResponse(oModifyResponse : TIdLDAPV3ModifyResponse);
  195. begin
  196. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  197. end;
  198. procedure TIdLDAPV3Encoder.WriteaddRequest(oAddRequest : TIdLDAPV3AddRequest);
  199. begin
  200. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  201. end;
  202. procedure TIdLDAPV3Encoder.WriteaddResponse(oAddResponse : TIdLDAPV3AddResponse);
  203. begin
  204. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  205. end;
  206. procedure TIdLDAPV3Encoder.WritedelRequest(oDelRequest : TIdLDAPV3DelRequest);
  207. begin
  208. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  209. end;
  210. procedure TIdLDAPV3Encoder.WritedelResponse(oDelResponse : TIdLDAPV3DelResponse);
  211. begin
  212. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  213. end;
  214. procedure TIdLDAPV3Encoder.WritemodDNRequest(oModDNRequest : TIdLDAPV3ModifyDNRequest);
  215. begin
  216. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  217. end;
  218. procedure TIdLDAPV3Encoder.WritemodDNResponse(oModDNResponse : TIdLDAPV3ModifyDNResponse);
  219. begin
  220. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  221. end;
  222. procedure TIdLDAPV3Encoder.WritecompareRequest(oCompareRequest : TIdLDAPV3CompareRequest);
  223. begin
  224. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  225. end;
  226. procedure TIdLDAPV3Encoder.WritecompareResponse(oCompareResponse : TIdLDAPV3CompareResponse);
  227. begin
  228. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  229. end;
  230. procedure TIdLDAPV3Encoder.WriteabandonRequest(oAbandonRequest : TIdLDAPV3AbandonRequest);
  231. begin
  232. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  233. end;
  234. procedure TIdLDAPV3Encoder.WriteextendedReq(oExtendedReq : TIdLDAPV3ExtendedRequest);
  235. begin
  236. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  237. end;
  238. procedure TIdLDAPV3Encoder.WriteextendedResp(oExtendedResp : TIdLDAPV3ExtendedResponse);
  239. begin
  240. raise EIdException.create('Not yet implemented'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  241. end;
  242. procedure TIdLDAPV3Encoder.WriteAuthentication(oAuthentication: TIdLDAPv3AuthenticationChoice);
  243. begin
  244. if assigned(oAuthentication.sasl) then
  245. raise EIdException.create('sasl not handled yet') {do not localize} // TODO: add a resource string, and create a new Exception class for this
  246. else
  247. WriteString(0, oAuthentication.simple);
  248. end;
  249. procedure TIdLDAPV3Encoder.WriteFilter(oFilter : TIdLDAPV3Filter; iTag : integer);
  250. begin
  251. if assigned(oFilter._and) then
  252. WriteFilterList(oFilter._And, 0)
  253. else if assigned(oFilter._or) then
  254. WriteFilterList(oFilter._or, 1)
  255. else if assigned(oFilter._not) then
  256. WriteFilter(oFilter._not, 2)
  257. else if assigned(oFilter.equalityMatch ) then
  258. WriteAttributeValueAssertion(oFilter.equalityMatch, 3)
  259. else if assigned(oFilter.substrings) then
  260. WriteSubstringFilter(oFilter.substrings, 4)
  261. else if assigned(oFilter.greaterOrEqual) then
  262. WriteAttributeValueAssertion(oFilter.greaterOrEqual, 5)
  263. else if assigned(oFilter.lessOrEqual) then
  264. WriteAttributeValueAssertion(oFilter.lessOrEqual, 6)
  265. else if oFilter.present <> '' then
  266. WriteString(7, oFilter.present)
  267. else if assigned(oFilter.approxMatch) then
  268. WriteAttributeValueAssertion(oFilter.approxMatch, 8)
  269. else if assigned(oFilter.extensibleMatch) then
  270. WriteMatchingRuleAssertion(oFilter.extensibleMatch, 9)
  271. else
  272. raise EIdException.create('No operation Choice on Filter'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  273. end;
  274. procedure TIdLDAPV3Encoder.WriteFilterList(oFilterList : TIdLDAPV3FilterList; iTag : integer);
  275. var
  276. iLoop : integer;
  277. begin
  278. for iLoop := 0 to oFilterList.count - 1 do
  279. writeFilter(oFilterList[iLoop], iTag);
  280. end;
  281. procedure TIdLDAPV3Encoder.WriteAttributeValueAssertion(oAttributeValueAssertion : TIdLDAPV3AttributeValueAssertion; iTag : integer);
  282. begin
  283. StartSequence(aicContextSpecific, iTag);
  284. WriteString(oAttributeValueAssertion.attributeDesc);
  285. WriteString(oAttributeValueAssertion.assertionValue);
  286. StopSequence;
  287. end;
  288. procedure TIdLDAPV3Encoder.WriteSubstring(oSubstring : TIdLDAPV3Substring; iTag : integer);
  289. begin
  290. StartSequence(aicContextSpecific, iTag);
  291. if oSubstring.initial <> '' then
  292. WriteString(0, oSubstring.initial)
  293. else if oSubstring.any <> '' then
  294. WriteString(1, oSubstring.any)
  295. else if oSubstring.final <> '' then
  296. WriteString(2, oSubstring.final);
  297. StopSequence;
  298. end;
  299. procedure TIdLDAPV3Encoder.WriteSubstringFilter(oSubstringFilter : TIdLDAPV3SubstringFilter; iTag : integer);
  300. var
  301. iLoop : integer;
  302. begin
  303. StartSequence(aicContextSpecific, iTag);
  304. WriteString(oSubstringFilter._type);
  305. for iLoop := 0 to oSubstringFilter.substrings.count - 1 do
  306. WriteSubString(oSubstringFilter.substrings[iLoop], -1);
  307. StopSequence;
  308. end;
  309. procedure TIdLDAPV3Encoder.WriteMatchingRuleAssertion(oMatchingRuleAssertion : TIdLDAPV3MatchingRuleAssertion; iTag : integer);
  310. begin
  311. StartSequence(aicContextSpecific, iTag);
  312. if oMatchingRuleAssertion.matchingRule <> '' then
  313. writeString(1, oMatchingRuleAssertion.matchingRule)
  314. else if oMatchingRuleAssertion._type <> '' then
  315. writeString(2, oMatchingRuleAssertion._type);
  316. WriteString(oMatchingRuleAssertion.matchValue);
  317. if oMatchingRuleAssertion.dnAttributes then
  318. WriteBoolean(true);
  319. StopSequence;
  320. end;
  321. procedure TIdLDAPV3Encoder.WriteAttributes(oAttributes : TIdLDAPV3AttributeDescriptionList; iTag : integer);
  322. var
  323. iLoop : integer;
  324. begin
  325. StartSequence(iTag);
  326. for iLoop := 0 to oAttributes.Count - 1 do
  327. WriteString(oAttributes[iLoop]);
  328. StopSequence;
  329. end;
  330. procedure TIdLDAPV3Encoder.WriteResultInner(oResult: TIdLDAPV3LDAPResult);
  331. begin
  332. WriteEnum(ord(oResult.resultCode));
  333. WriteString(oResult.matchedDN);
  334. WriteString(oResult.errorMessage);
  335. if assigned(oResult.referral) then
  336. writeReferral(oResult.referral, 3);
  337. end;
  338. procedure TIdLDAPV3Encoder.WriteReferral(oReferral: TIdLDAPV3Referral; iTag : integer);
  339. var
  340. iLoop : integer;
  341. begin
  342. StartSequence(aicContextSpecific, iTag);
  343. for iLoop := 0 to oReferral.Count - 1 do
  344. WriteString(oReferral[iLoop]);
  345. StopSequence;
  346. end;
  347. procedure TIdLDAPV3Encoder.WritePartialAttributeList(oAttributes: TIdLDAPV3PartialAttributeList; iTag: integer);
  348. var
  349. iLoop : integer;
  350. begin
  351. StartSequence(iTag);
  352. for iLoop := 0 to oAttributes.Count - 1 do
  353. WritePartialAttribute(oAttributes[iLoop], -1);
  354. StopSequence;
  355. end;
  356. procedure TIdLDAPV3Encoder.WritePartialAttribute(oAttribute: TIdLDAPV3PartialAttribute; iTag: integer);
  357. var
  358. iLoop : integer;
  359. begin
  360. StartSequence(iTag);
  361. WriteString(oAttribute._type);
  362. StartSequence(aicUniversal, 17);
  363. for iLoop := 0 to oAttribute.vals.count - 1 do
  364. WriteString(oAttribute.vals[iLoop]);
  365. StopSequence;
  366. StopSequence;
  367. end;
  368. { TIdLDAPV3Decoder }
  369. procedure TIdLDAPV3Decoder.ReadBindRequest(oMessage: TIdLDAPV3Message);
  370. begin
  371. oMessage.bindRequest := TIdLDAPV3BindRequest.Create;
  372. ReadSequencebegin;
  373. oMessage.bindRequest.version := ReadInteger;
  374. oMessage.bindRequest.name := ReadString;
  375. case NextTag Of
  376. 0: oMessage.bindRequest.authentication.simple := ReadString;
  377. 3: raise EIdException.create('SASL not handled yet'); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  378. else
  379. raise EIdException.CreateFmt('Unknown Tag %d', [NextTag]); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  380. end;
  381. ReadSequenceend;
  382. end;
  383. procedure TIdLDAPV3Decoder.ReadBindResponse(oMessage: TIdLDAPV3Message);
  384. begin
  385. oMessage.bindResponse := TIdLDAPV3BindResponse.Create;
  386. ReadSequencebegin;
  387. ReadResultInner(oMessage.BindResponse);
  388. if not SequenceEnded then
  389. oMessage.bindResponse.serverSaslCreds := ReadString;
  390. ReadSequenceend;
  391. end;
  392. procedure TIdLDAPV3Decoder.ReadFilter(oFilter: TIdLDAPV3Filter);
  393. begin
  394. case NextTag Of
  395. 0: begin
  396. oFilter._and := TIdLDAPV3FilterList.Create;
  397. ReadFilterList(oFilter._and);
  398. end;
  399. 1: begin
  400. oFilter._or := TIdLDAPV3FilterList.Create;
  401. ReadFilterList(oFilter._or);
  402. end;
  403. 2: begin
  404. oFilter._not := TIdLDAPV3Filter.Create;
  405. ReadFilter(oFilter._not);
  406. end;
  407. 3: begin
  408. oFilter.equalityMatch := TIdLDAPV3AttributeValueAssertion.Create;
  409. ReadAttributeValueAssertion(oFilter.equalityMatch );
  410. end;
  411. 4: begin
  412. oFilter.substrings := TIdLDAPV3SubstringFilter.Create;
  413. ReadSubstringFilter(oFilter.substrings);
  414. end;
  415. 5: begin
  416. oFilter.greaterOrEqual := TIdLDAPV3AttributeValueAssertion.Create;
  417. ReadAttributeValueAssertion(oFilter.greaterOrEqual);
  418. end;
  419. 6: begin
  420. oFilter.lessOrEqual := TIdLDAPV3AttributeValueAssertion.Create;
  421. ReadAttributeValueAssertion(oFilter.lessOrEqual);
  422. end;
  423. 7: oFilter.present := ReadString;
  424. 8: begin
  425. oFilter.approxMatch := TIdLDAPV3AttributeValueAssertion.Create;
  426. ReadAttributeValueAssertion(oFilter.approxMatch);
  427. end;
  428. 9: begin
  429. oFilter.extensibleMatch := TIdLDAPV3MatchingRuleAssertion.Create;
  430. ReadMatchingRuleAssertion(oFilter.extensibleMatch);
  431. end;
  432. else
  433. raise EIdException.CreateFmt('Unknown Tag %d', [NextTag]); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  434. end;
  435. end;
  436. procedure TIdLDAPV3Decoder.ReadFilterList(oFilterList : TIdLDAPV3FilterList);
  437. Var
  438. oFilter : TIdLDAPV3Filter;
  439. begin
  440. while NextTagType = aitSequence do
  441. begin
  442. ReadFilter(oFilter);
  443. oFilterList.Add(oFilter);
  444. end;
  445. end;
  446. procedure TIdLDAPV3Decoder.ReadAttributeValueAssertion(oEqualityMatch : TIdLDAPV3AttributeValueAssertion);
  447. begin
  448. ReadSequencebegin;
  449. oEqualityMatch.attributeDesc := ReadString;
  450. oEqualityMatch.assertionValue := ReadString;
  451. ReadSequenceend;
  452. end;
  453. procedure TIdLDAPV3Decoder.ReadSubString(oString: TIdLDAPV3Substring);
  454. begin
  455. ReadSequencebegin;
  456. case NextTag Of
  457. 0 : oString.initial := ReadString;
  458. 1 : oString.any := ReadString;
  459. 2 : oString.final := ReadString;
  460. else
  461. raise EIdException.CreateFmt('Unknown Tag %d', [NextTag]); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  462. end;
  463. ReadSequenceend;
  464. end;
  465. procedure TIdLDAPV3Decoder.ReadSubstringFilter(oSubstrings : TIdLDAPV3SubstringFilter);
  466. Var
  467. oString : TIdLDAPV3Substring;
  468. begin
  469. ReadSequencebegin;
  470. oSubstrings._type := ReadString;
  471. while not SequenceEnded do
  472. begin
  473. ReadSubString(oString);
  474. oSubstrings.substrings.Add(oString);
  475. end;
  476. ReadSequenceend;
  477. end;
  478. procedure TIdLDAPV3Decoder.ReadMatchingRuleAssertion(oExtensibleMatch : TIdLDAPV3MatchingRuleAssertion);
  479. begin
  480. ReadSequencebegin;
  481. if NextTag = 1 then
  482. oExtensibleMatch.matchingRule := ReadString;
  483. if NextTag = 2 then
  484. oExtensibleMatch._type := ReadString;
  485. oExtensibleMatch.matchValue := ReadString;
  486. if not SequenceEnded then
  487. oExtensibleMatch.dnAttributes := ReadBoolean
  488. else
  489. oExtensibleMatch.dnAttributes := False;
  490. ReadSequenceend;
  491. end;
  492. procedure TIdLDAPV3Decoder.ReadAttributes(oAttributes: TIdLDAPV3AttributeDescriptionList);
  493. begin
  494. ReadSequencebegin;
  495. while not SequenceEnded do
  496. oAttributes.Add(ReadString);
  497. ReadSequenceend;
  498. end;
  499. procedure TIdLDAPV3Decoder.ReadSearchRequest(oMessage : TIdLDAPV3Message);
  500. begin
  501. oMessage.searchRequest := TIdLDAPV3SearchRequest.Create;
  502. ReadSequencebegin;
  503. oMessage.searchRequest.baseObject := ReadString;
  504. oMessage.searchRequest.scope := TIdLDAPV3SearchScope(ReadEnum);
  505. oMessage.searchRequest.derefAliases := TIdLDAPV3SearchDerefAliases(ReadEnum);
  506. oMessage.searchRequest.sizeLimit := ReadInteger;
  507. oMessage.searchRequest.timeLimit := ReadInteger;
  508. oMessage.searchRequest.typesOnly := ReadBoolean;
  509. ReadFilter(oMessage.searchRequest.filter);
  510. ReadAttributes(oMessage.searchRequest.attributes);
  511. ReadSequenceend;
  512. end;
  513. procedure TIdLDAPV3Decoder.ReadSearchResultEntry(oMessage: TIdLDAPV3Message);
  514. begin
  515. oMessage.searchResEntry := TIdLDAPV3SearchResultEntry.Create;
  516. ReadSequencebegin;
  517. oMessage.searchResEntry.objectName := ReadString;
  518. ReadPartialAttributeList(oMessage.searchResEntry.attributes);
  519. ReadSequenceend;
  520. end;
  521. procedure TIdLDAPV3Decoder.ReadSearchResultDone(oMessage: TIdLDAPV3Message);
  522. begin
  523. oMessage.searchResDone := TIdLDAPV3SearchResultDone.Create;
  524. ReadSequencebegin;
  525. ReadResultInner(oMessage.searchResDone);
  526. ReadSequenceend;
  527. end;
  528. procedure TIdLDAPV3Decoder.ReadMessage(oMessage: TIdLDAPV3Message);
  529. begin
  530. StartReading;
  531. oMessage.Clear;
  532. ReadSequencebegin;
  533. oMessage.messageID := ReadInteger;
  534. case NextTag Of
  535. 0 : ReadBindRequest(oMessage);
  536. 1 : ReadBindResponse(oMessage);
  537. // 2 : ReadUnbindRequest(oMessage);
  538. 3 : ReadSearchRequest(oMessage);
  539. 4 : ReadSearchResultEntry(oMessage);
  540. 5 : ReadSearchResultDone(oMessage);
  541. // 6 : ReadModifyRequest(oMessage);
  542. // 7 : ReadModifyResponse(oMessage);
  543. // 8 : ReadAddRequest(oMessage);
  544. // 9 : ReadAddResponse(oMessage);
  545. // 10 : ReadDelRequest(oMessage);
  546. // 11 : ReadDelResponse(oMessage);
  547. // 12 : ReadModifyDNRequest(oMessage);
  548. // 13 : ReadModifyDNResponse(oMessage);
  549. // 14 : ReadCompareRequest(oMessage);
  550. // 15 : ReadCompareResponse(oMessage);
  551. // 16 : ReadAbandonRequest(oMessage);
  552. // 19 : ReadSearchResultReference(oMessage);
  553. // 23 : ReadExtendedRequest(oMessage);
  554. // 24 : ReadExtendedResponse(oMessage);
  555. else
  556. raise EIdException.CreateFmt('Unknown Tag %d', [NextTag]); {do not localize} // TODO: add a resource string, and create a new Exception class for this
  557. end;
  558. // while not SequenceEnded do
  559. // readControl....
  560. ReadSequenceend;
  561. StopReading;
  562. end;
  563. procedure TIdLDAPV3Decoder.ReadResultInner(oResult: TIdLDAPV3LDAPResult);
  564. begin
  565. oResult.resultCode := TIdLDAPV3ResultCode(ReadEnum);
  566. oResult.matchedDN := ReadString;
  567. oResult.errorMessage := ReadString;
  568. if not SequenceEnded and (NextTag = 3) then
  569. begin
  570. oResult.referral := TIdLDAPV3Referral.Create;
  571. ReadReferral(oResult.Referral);
  572. end;
  573. end;
  574. procedure TIdLDAPV3Decoder.ReadReferral(oReferral: TIdLDAPV3Referral);
  575. begin
  576. ReadSequencebegin;
  577. while not SequenceEnded do
  578. oReferral.Add(ReadString);
  579. ReadSequenceend;
  580. end;
  581. procedure TIdLDAPV3Decoder.ReadPartialAttributeList(oAttributes: TIdLDAPV3PartialAttributeList);
  582. Var
  583. oAttr : TIdLDAPV3PartialAttribute;
  584. begin
  585. ReadSequencebegin;
  586. while not SequenceEnded do
  587. begin
  588. ReadPartialAttribute(oAttr);
  589. oAttributes.Add(oAttr);
  590. end;
  591. ReadSequenceend;
  592. end;
  593. procedure TIdLDAPV3Decoder.ReadPartialAttribute(oAttribute: TIdLDAPV3PartialAttribute);
  594. begin
  595. ReadSequencebegin;
  596. oAttribute._type := ReadString;
  597. ReadSequencebegin;
  598. while not SequenceEnded do
  599. oAttribute.vals.Add(ReadString);
  600. ReadSequenceend;
  601. ReadSequenceend;
  602. end;
  603. End.