SimpleDecoderTest.php 14 KB

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