SimpleDecoderTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Ldap
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. /**
  23. * Zend_Ldap_TestCase
  24. */
  25. require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'TestCase.php';
  26. /**
  27. * @see Zend_Ldap_Ldif_Encoder
  28. */
  29. require_once 'Zend/Ldap/Ldif/Encoder.php';
  30. /**
  31. * @category Zend
  32. * @package Zend_Ldap
  33. * @subpackage UnitTests
  34. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  35. * @license http://framework.zend.com/license/new-bsd New BSD License
  36. * @group Zend_Ldap
  37. * @group Zend_Ldap_Ldif
  38. */
  39. class Zend_Ldap_Ldif_SimpleDecoderTest extends Zend_Ldap_TestCase
  40. {
  41. public function testDecodeSimpleSingleItem()
  42. {
  43. $data =
  44. "version: 1
  45. dn: cn=test3,ou=example,dc=cno
  46. objectclass: oc1
  47. attr3: foo";
  48. $expected = array(
  49. 'dn' => 'cn=test3,ou=example,dc=cno',
  50. 'objectclass' => array('oc1'),
  51. 'attr3' => array('foo'));
  52. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  53. $this->assertEquals($expected, $actual);
  54. }
  55. public function testDecodeSingleItemWithFoldedAttribute()
  56. {
  57. $data =
  58. "dn: cn=test blabla,ou=example,dc=cno
  59. objectclass: oc2
  60. attr1: 12345
  61. attr2: 1234
  62. attr2: baz
  63. attr3: foo
  64. attr3: bar
  65. cn: test blabla
  66. verylong: fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8
  67. h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb
  68. 5789thvngwr789cghm738";
  69. $expected = array(
  70. 'dn' => 'cn=test blabla,ou=example,dc=cno',
  71. 'objectclass' => array('oc2'),
  72. 'attr1' => array('12345'),
  73. 'attr2' => array('1234', 'baz'),
  74. 'attr3' => array('foo', 'bar'),
  75. 'cn' => array('test blabla'),
  76. 'verylong' => array('fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8' .
  77. 'h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb' .
  78. '5789thvngwr789cghm738'),
  79. );
  80. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  81. $this->assertEquals($expected, $actual);
  82. }
  83. public function testDecodeSingleItemWithBase64Attributes()
  84. {
  85. $data =
  86. "dn:: Y249dGVzdCBibGFibGEsb3U9ZXhhbXBsZSxkYz1jbm8=
  87. objectclass: oc3
  88. attr1: 12345
  89. attr2: 1234
  90. attr2: baz
  91. attr3: foo
  92. attr3: bar
  93. attr4:: w7bDpMO8
  94. attr5:: ZW5kc3BhY2Ug
  95. attr6:: OmJhZGluaXRjaGFy
  96. attr6:: PGJhZGluaXRjaGFy
  97. cn:: dGVzdCDDtsOkw7w=";
  98. $expected = array(
  99. 'dn' => 'cn=test blabla,ou=example,dc=cno',
  100. 'objectclass' => array('oc3'),
  101. 'attr1' => array('12345'),
  102. 'attr2' => array('1234', 'baz'),
  103. 'attr3' => array('foo', 'bar'),
  104. 'attr4' => array('öäü'),
  105. 'attr5' => array('endspace '),
  106. 'attr6' => array(':badinitchar', '<badinitchar'),
  107. 'cn' => array('test öäü'),
  108. );
  109. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  110. $this->assertEquals($expected, $actual);
  111. }
  112. public function testDecodeSingleItemWithFoldedBase64Attribute()
  113. {
  114. $data =
  115. "dn:: Y249dGVzdCBibGFibGEsb
  116. 3U9ZXhhbXBsZSxkYz1jbm8=
  117. objectclass: oc3
  118. attr1: 12345
  119. attr2: 1234
  120. attr2: baz
  121. attr3: foo
  122. attr3: bar";
  123. $expected = array(
  124. 'dn' => 'cn=test blabla,ou=example,dc=cno',
  125. 'objectclass' => array('oc3'),
  126. 'attr1' => array('12345'),
  127. 'attr2' => array('1234', 'baz'),
  128. 'attr3' => array('foo', 'bar'),
  129. );
  130. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  131. $this->assertEquals($expected, $actual);
  132. }
  133. public function testDecodeTwoItems()
  134. {
  135. $data =
  136. "version: 1
  137. dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com
  138. objectclass: top
  139. objectclass: person
  140. objectclass: organizationalPerson
  141. cn: Barbara Jensen
  142. cn: Barbara J Jensen
  143. cn: Babs Jensen
  144. sn: Jensen
  145. uid: bjensen
  146. telephonenumber: +1 408 555 1212
  147. description: A big sailing fan.
  148. dn: cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com
  149. objectclass: top
  150. objectclass: person
  151. objectclass: organizationalPerson
  152. cn: Bjorn Jensen
  153. sn: Jensen
  154. telephonenumber: +1 408 555 1212";
  155. $expected = array(
  156. array(
  157. 'dn' => 'cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com',
  158. 'objectclass' => array('top', 'person', 'organizationalPerson'),
  159. 'cn' => array('Barbara Jensen', 'Barbara J Jensen', 'Babs Jensen'),
  160. 'sn' => array('Jensen'),
  161. 'uid' => array('bjensen'),
  162. 'telephonenumber' => array('+1 408 555 1212'),
  163. 'description' => array('A big sailing fan.'),
  164. ),
  165. array(
  166. 'dn' => 'cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com',
  167. 'objectclass' => array('top', 'person', 'organizationalPerson'),
  168. 'cn' => array('Bjorn Jensen'),
  169. 'sn' => array('Jensen'),
  170. 'telephonenumber' => array('+1 408 555 1212'),
  171. ),
  172. );
  173. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  174. $this->assertEquals($expected, $actual);
  175. }
  176. public function testDecodeStringContainingEntryWithFoldedAttributeValue()
  177. {
  178. $data =
  179. "version: 1
  180. dn:cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com
  181. objectclass:top
  182. objectclass:person
  183. objectclass:organizationalPerson
  184. cn:Barbara Jensen
  185. cn:Barbara J Jensen
  186. cn:Babs Jensen
  187. sn:Jensen
  188. uid:bjensen
  189. telephonenumber:+1 408 555 1212
  190. description:Babs is a big sailing fan, and travels extensively in sea
  191. rch of perfect sailing conditions.
  192. title:Product Manager, Rod and Reel Division";
  193. $expected = array(
  194. 'dn' => 'cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com',
  195. 'objectclass' => array('top', 'person', 'organizationalPerson'),
  196. 'cn' => array('Barbara Jensen', 'Barbara J Jensen', 'Babs Jensen'),
  197. 'sn' => array('Jensen'),
  198. 'uid' => array('bjensen'),
  199. 'telephonenumber' => array('+1 408 555 1212'),
  200. 'description' => array('Babs is a big sailing fan, and travels extensively' .
  201. ' in search of perfect sailing conditions.'),
  202. 'title' => array('Product Manager, Rod and Reel Division'),
  203. );
  204. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  205. $this->assertEquals($expected, $actual);
  206. }
  207. public function testDecodeStringContainingBase64EncodedValue()
  208. {
  209. $data =
  210. "version: 1
  211. dn: cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com
  212. objectclass: top
  213. objectclass: person
  214. objectclass: organizationalPerson
  215. cn: Gern Jensen
  216. cn: Gern O Jensen
  217. sn: Jensen
  218. uid: gernj
  219. telephonenumber: +1 408 555 1212
  220. description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl
  221. IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG
  222. VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg
  223. b3V0IG1vcmUu";
  224. $expected = array(
  225. 'dn' => 'cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com',
  226. 'objectclass' => array('top', 'person', 'organizationalPerson'),
  227. 'cn' => array('Gern Jensen', 'Gern O Jensen'),
  228. 'sn' => array('Jensen'),
  229. 'uid' => array('gernj'),
  230. 'telephonenumber' => array('+1 408 555 1212'),
  231. 'description' => array('What a careful reader you are!' .
  232. ' This value is base-64-encoded because it has a ' .
  233. 'control character in it (a CR).' . "\r" .
  234. ' By the way, you should really get out more.'),
  235. );
  236. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  237. $this->assertEquals($expected, $actual);
  238. }
  239. public function testDecodeStringContainingEntriesWithUtf8EncodedAttributeValues()
  240. {
  241. $data =
  242. "version: 1
  243. dn:: b3U95Za25qWt6YOoLG89QWlyaXVz
  244. # dn:: ou=営業部,o=Airius
  245. objectclass: top
  246. objectclass: organizationalUnit
  247. ou:: 5Za25qWt6YOo
  248. # ou:: 営業部
  249. ou;lang-ja:: 5Za25qWt6YOo
  250. # ou;lang-ja:: 営業部
  251. ou;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2
  252. # ou;lang-ja:: えいぎょうぶ
  253. ou;lang-en: Sales
  254. description: Japanese office
  255. dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz
  256. # dn:: uid=rogasawara,ou=営業部,o=Airius
  257. userpassword: {SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=
  258. objectclass: top
  259. objectclass: person
  260. objectclass: organizationalPerson
  261. objectclass: inetOrgPerson
  262. uid: rogasawara
  263. mail: rogasawara@airius.co.jp
  264. givenname;lang-ja:: 44Ot44OJ44OL44O8
  265. # givenname;lang-ja:: ロドニー
  266. sn;lang-ja:: 5bCP56yg5Y6f
  267. # sn;lang-ja:: 小笠原
  268. cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==
  269. # cn;lang-ja:: 小笠原 ロドニー
  270. title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==
  271. # title;lang-ja:: 営業部 部長
  272. preferredlanguage: ja
  273. givenname:: 44Ot44OJ44OL44O8
  274. # givenname:: ロドニー
  275. sn:: 5bCP56yg5Y6f
  276. # sn:: 小笠原
  277. cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==
  278. # cn:: 小笠原 ロドニー
  279. title:: 5Za25qWt6YOoIOmDqOmVtw==
  280. # title:: 営業部 部長
  281. givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8
  282. # givenname;lang-ja;phonetic:: ろどにー
  283. sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ
  284. # sn;lang-ja;phonetic:: おがさわら
  285. cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==
  286. # cn;lang-ja;phonetic:: おがさわら ろどにー
  287. title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==
  288. # title;lang-ja;phonetic:: えいぎょうぶ ぶちょう
  289. givenname;lang-en: Rodney
  290. sn;lang-en: Ogasawara
  291. cn;lang-en: Rodney Ogasawara
  292. title;lang-en: Sales, Director";
  293. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  294. $this->assertEquals('ou=営業部,o=Airius', $actual[0]['dn']);
  295. $this->assertEquals(array('top', 'organizationalUnit'), $actual[0]['objectclass']);
  296. $this->assertEquals('営業部', $actual[0]['ou'][0]);
  297. $this->assertEquals('営業部', $actual[0]['ou;lang-ja'][0]);
  298. $this->assertEquals('えいぎょうぶ', $actual[0]['ou;lang-ja;phonetic'][0]);
  299. $this->assertEquals('Sales', $actual[0]['ou;lang-en'][0]);
  300. $this->assertEquals('Japanese office', $actual[0]['description'][0]);
  301. $this->assertEquals('uid=rogasawara,ou=営業部,o=Airius', $actual[1]['dn']);
  302. $this->assertEquals('{SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=', $actual[1]['userpassword'][0]);
  303. $this->assertEquals(array('top', 'person', 'organizationalPerson', 'inetOrgPerson'),
  304. $actual[1]['objectclass']);
  305. $this->assertEquals('rogasawara', $actual[1]['uid'][0]);
  306. $this->assertEquals('rogasawara@airius.co.jp', $actual[1]['mail'][0]);
  307. $this->assertEquals('ロドニー', $actual[1]['givenname;lang-ja'][0]);
  308. $this->assertEquals('小笠原', $actual[1]['sn;lang-ja'][0]);
  309. $this->assertEquals('小笠原 ロドニー', $actual[1]['cn;lang-ja'][0]);
  310. $this->assertEquals('営業部 部長', $actual[1]['title;lang-ja'][0]);
  311. $this->assertEquals('ja', $actual[1]['preferredlanguage'][0]);
  312. $this->assertEquals('ロドニー', $actual[1]['givenname'][0]);
  313. $this->assertEquals('小笠原', $actual[1]['sn'][0]);
  314. $this->assertEquals('小笠原 ロドニー', $actual[1]['cn'][0]);
  315. $this->assertEquals('営業部 部長', $actual[1]['title'][0]);
  316. $this->assertEquals('ろどにー', $actual[1]['givenname;lang-ja;phonetic'][0]);
  317. $this->assertEquals('おがさわら', $actual[1]['sn;lang-ja;phonetic'][0]);
  318. $this->assertEquals('おがさわら ろどにー', $actual[1]['cn;lang-ja;phonetic'][0]);
  319. $this->assertEquals('えいぎょうぶ ぶちょう', $actual[1]['title;lang-ja;phonetic'][0]);
  320. $this->assertEquals('Rodney', $actual[1]['givenname;lang-en'][0]);
  321. $this->assertEquals('Ogasawara', $actual[1]['sn;lang-en'][0]);
  322. $this->assertEquals('Rodney Ogasawara', $actual[1]['cn;lang-en'][0]);
  323. $this->assertEquals('Sales, Director', $actual[1]['title;lang-en'][0]);
  324. }
  325. public function testDecodeSingleItemWithFoldedAttributesAndEmptyLinesBetween()
  326. {
  327. $data =
  328. "dn: cn=test blabla,ou=example,dc=cno
  329. objectclass: top
  330. objectclass: person
  331. objectclass: organizationalPerson
  332. description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl
  333. IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG
  334. VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg
  335. b3V0IG1vcmUu
  336. verylong: fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8
  337. h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb
  338. 5789thvngwr789cghm738";
  339. $expected = array(
  340. 'dn' => 'cn=test blabla,ou=example,dc=cno',
  341. 'objectclass' => array('top', 'person', 'organizationalPerson'),
  342. 'description' => array('What a careful reader you are!' .
  343. ' This value is base-64-encoded because it has a ' .
  344. 'control character in it (a CR).' . "\r" .
  345. ' By the way, you should really get out more.'),
  346. 'verylong' => array('fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8' .
  347. 'h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb' .
  348. '5789thvngwr789cghm738'),
  349. );
  350. $actual = Zend_Ldap_Ldif_Encoder::decode($data);
  351. $this->assertEquals($expected, $actual);
  352. }
  353. public function testRoundtripEncoding()
  354. {
  355. $node = $this->_createTestNode();
  356. $ldif = $node->toLdif();
  357. $data = Zend_Ldap_Ldif_Encoder::decode($ldif);
  358. $expected = array_merge(array('dn' => $node->getDnString()), $node->getData(false));
  359. $this->assertEquals($expected, $data);
  360. }
  361. }