@@ -57,6 +57,7 @@ def test_str2dn(self):
5757 test function str2dn()
5858 """
5959 self .assertEqual (ldap .dn .str2dn ('' ), [])
60+ self .assertEqual (ldap .dn .str2dn (None ), [])
6061 self .assertEqual (
6162 ldap .dn .str2dn ('uid=test42,ou=Testing,dc=example,dc=com' ),
6263 [
@@ -105,15 +106,24 @@ def test_str2dn(self):
105106 self .assertEqual (
106107 ldap .dn .str2dn ('cn=äöüÄÖÜß,dc=example,dc=com' , flags = 0 ),
107108 [
108- [('cn' , 'äöüÄÖÜß' , 4 )],
109+ [('cn' , 'äöüÄÖÜß' , ldap . AVA_NONPRINTABLE )],
109110 [('dc' , 'example' , 1 )],
110111 [('dc' , 'com' , 1 )]
111112 ]
112113 )
113114 self .assertEqual (
114115 ldap .dn .str2dn ('cn=\\ c3\\ a4\\ c3\\ b6\\ c3\\ bc\\ c3\\ 84\\ c3\\ 96\\ c3\\ 9c\\ c3\\ 9f,dc=example,dc=com' , flags = 0 ),
115116 [
116- [('cn' , 'äöüÄÖÜß' , 4 )],
117+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_NONPRINTABLE )],
118+ [('dc' , 'example' , 1 )],
119+ [('dc' , 'com' , 1 )]
120+ ]
121+ )
122+ self .assertEqual (
123+ ldap .dn .str2dn ('/dc=com/dc=example/ou=Testing/uid=test42' , flags = ldap .DN_FORMAT_DCE ),
124+ [
125+ [('uid' , 'test42' , 1 )],
126+ [('ou' , 'Testing' , 1 )],
117127 [('dc' , 'example' , 1 )],
118128 [('dc' , 'com' , 1 )]
119129 ]
@@ -123,7 +133,7 @@ def test_dn2str(self):
123133 """
124134 test function dn2str()
125135 """
126- self .assertEqual (ldap .dn .str2dn ( '' ), [] )
136+ self .assertEqual (ldap .dn .dn2str ([] ), '' )
127137 self .assertEqual (
128138 ldap .dn .dn2str ([
129139 [('uid' , 'test42' , 1 )],
@@ -162,12 +172,197 @@ def test_dn2str(self):
162172 )
163173 self .assertEqual (
164174 ldap .dn .dn2str ([
165- [('cn' , 'äöüÄÖÜß' , 4 )],
175+ [('uid' , 'test, 42' , 1 )],
176+ [('ou' , 'Testing' , 1 )],
177+ [('dc' , 'example' , 1 )],
178+ [('dc' , 'com' , 1 )]
179+ ], ldap .DN_FORMAT_LDAPV3 ),
180+ r'uid=test\2C 42,ou=Testing,dc=example,dc=com'
181+ )
182+ self .assertEqual (
183+ ldap .dn .dn2str ([
184+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_NONPRINTABLE )],
166185 [('dc' , 'example' , 1 )],
167186 [('dc' , 'com' , 1 )]
168187 ]),
169188 'cn=äöüÄÖÜß,dc=example,dc=com'
170189 )
190+ self .assertEqual (
191+ ldap .dn .dn2str ([
192+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_NONPRINTABLE )],
193+ [('dc' , 'example' , 1 )],
194+ [('dc' , 'com' , 1 )]
195+ ], ldap .DN_FORMAT_LDAPV3 ),
196+ r'cn=\C3\A4\C3\B6\C3\BC\C3\84\C3\96\C3\9C\C3\9F,dc=example,dc=com'
197+ )
198+ self .assertEqual (
199+ ldap .dn .dn2str ([
200+ [('uid' , 'test42' , 1 ), ('cn' , 'test42' , 1 )],
201+ [('ou' , 'Testing' , 1 )],
202+ [('dc' , 'example' , 1 )],
203+ [('dc' , 'com' , 1 )]
204+ ], ldap .DN_FORMAT_AD_CANONICAL ),
205+ 'example.com/Testing/test42,test42'
206+ )
207+ self .assertEqual (
208+ ldap .dn .dn2str ([
209+ [('uid' , 'test42' , 1 ), ('cn' , 'test42' , 1 )],
210+ [('ou' , 'Testing' , 1 )],
211+ [('dc' , 'example' , 1 )],
212+ [('dc' , 'com' , 1 )]
213+ ], ldap .DN_FORMAT_UFN ),
214+ 'test42 + test42, Testing, example.com'
215+ )
216+ self .assertEqual (
217+ ldap .dn .dn2str ([
218+ [('uid' , 'test42' , 1 ), ('cn' , 'test42' , 1 )],
219+ [('ou' , 'Testing' , 1 )],
220+ [('dc' , 'example' , 1 )],
221+ [('dc' , 'com' , 1 )]
222+ ], ldap .DN_FORMAT_DCE ),
223+ '/dc=com/dc=example/ou=Testing/uid=test42,cn=test42'
224+ )
225+
226+ self .assertEqual (
227+ ldap .dn .dn2str ([
228+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_BINARY )],
229+ [('dc' , 'example' , 1 )],
230+ [('dc' , 'com' , 1 )]
231+ ], ldap .DN_FORMAT_LDAPV3 ),
232+ 'cn=#C3A4C3B6C3BCC384C396C39CC39F,dc=example,dc=com'
233+ )
234+ self .assertEqual (
235+ ldap .dn .dn2str ([
236+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_NULL )],
237+ [('dc' , 'example' , 1 )],
238+ [('dc' , 'com' , 1 )]
239+ ], ldap .DN_FORMAT_LDAPV3 ),
240+ r'cn=\C3\A4\C3\B6\C3\BC\C3\84\C3\96\C3\9C\C3\9F,dc=example,dc=com'
241+ )
242+ self .assertEqual (
243+ ldap .dn .dn2str ([
244+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_STRING )],
245+ [('dc' , 'example' , 1 )],
246+ [('dc' , 'com' , 1 )]
247+ ], ldap .DN_FORMAT_LDAPV3 ),
248+ r'cn=\C3\A4\C3\B6\C3\BC\C3\84\C3\96\C3\9C\C3\9F,dc=example,dc=com'
249+ )
250+ self .assertEqual (
251+ ldap .dn .dn2str ([
252+ [('cn' , 'äöüÄÖÜß' , ldap .AVA_NONPRINTABLE )],
253+ [('dc' , 'example' , 1 )],
254+ [('dc' , 'com' , 1 )]
255+ ], ldap .DN_FORMAT_LDAPV3 ),
256+ r'cn=\C3\A4\C3\B6\C3\BC\C3\84\C3\96\C3\9C\C3\9F,dc=example,dc=com'
257+ )
258+
259+ def test_dn_various_lengths (self ):
260+ base = [
261+ [('dc' , 'example' , 1 )],
262+ [('dc' , 'com' , 1 )]
263+ ]
264+
265+ test_lengths = [1 , 10 , 100 , 500 ]
266+ for n in test_lengths :
267+ rdn_prefix = [
268+ [('ou' , f'unit{ i } ' , 1 )] for i in range (n )
269+ ]
270+ full_dn = rdn_prefix + base
271+ full_dn .insert (0 , [('uid' , f'user{ n } ' , 1 )])
272+
273+ result = ldap .dn .dn2str (full_dn , ldap .DN_FORMAT_LDAPV3 )
274+
275+ self .assertTrue (result .startswith (f'uid=user{ n } ,' ))
276+ self .assertTrue (result .endswith (',dc=example,dc=com' ))
277+ self .assertEqual (result .count (',' ), n + 2 )
278+
279+ def test_dn2str_errors (self ):
280+ """
281+ test error handling of function dn2str()
282+ """
283+ with self .assertRaises (RuntimeError ):
284+ ldap .dn .dn2str ([[('uid' , 'test42' , 1 )]], 142 )
285+
286+ DN_FORMAT_LBER = 0xf0
287+ with self .assertRaises (RuntimeError ):
288+ ldap .dn .dn2str ([
289+ [('dc' , 'com' , 1 )]
290+ ], DN_FORMAT_LBER )
291+
292+ ldap_format = ldap .DN_FORMAT_LDAPV3
293+
294+ with self .assertRaises (TypeError ):
295+ ldap .dn .dn2str (None )
296+
297+ with self .assertRaises (TypeError ):
298+ ldap .dn .dn2str (None , ldap_format )
299+
300+ with self .assertRaises (TypeError ):
301+ ldap .dn .dn2str ([1 ], ldap_format )
302+
303+ with self .assertRaises (TypeError ):
304+ ldap .dn .dn2str ([[1 ]], ldap_format )
305+
306+ with self .assertRaises (TypeError ):
307+ ldap .dn .dn2str ([[('uid' , 'test42' , '1' )]], ldap_format )
308+
309+ with self .assertRaises (TypeError ):
310+ ldap .dn .dn2str ([[('uid' , 'test42' , 1.0 )]], ldap_format )
311+
312+ with self .assertRaises (TypeError ):
313+ ldap .dn .dn2str ([[['uid' , 'test42' , 1 ]]], ldap_format )
314+
315+ with self .assertRaises (TypeError ):
316+ ldap .dn .dn2str ([
317+ [('uid' , 'test42' , 1 ), ('cn' , 'test42' , 1 )],
318+ [('ou' , 'Testing' , 1 )],
319+ [('dc' , 'example' , '1' )],
320+ [('dc' , 'com' , 1 )]
321+ ], ldap_format ),
322+
323+ with self .assertRaises (TypeError ):
324+ ldap .dn .dn2str ([
325+ [('ou' , 'Testing' , 1 )],
326+ [('dc' , 'example' , 1 )],
327+ [('uid' , 'test42' , 1 ), ('cn' , 'test42' , '1' )],
328+ [('dc' , 'com' , 1 )]
329+ ], ldap_format ),
330+
331+ with self .assertRaises (TypeError ):
332+ ldap .dn .dn2str ([
333+ [('dc' , 'example' , 1 )],
334+ [('dc' , 'com' , None )],
335+ ], ldap_format ),
336+
337+ with self .assertRaises (TypeError ):
338+ ldap .dn .dn2str ([
339+ [('dc' , 'example' , 1 )],
340+ [('dc' , None , 1 )],
341+ ], ldap_format ),
342+
343+ with self .assertRaises (TypeError ):
344+ ldap .dn .dn2str ([
345+ [('dc' , 'example' , 1 )],
346+ [(None , 'com' , 1 )],
347+ ], ldap_format ),
348+
349+ with self .assertRaises (TypeError ):
350+ ldap .dn .dn2str ([
351+ [('dc' , 'example' , 1 )],
352+ [None ],
353+ ], ldap_format ),
354+
355+ with self .assertRaises (TypeError ):
356+ ldap .dn .dn2str ([
357+ [('dc' , 'example' , 1 )],
358+ None ,
359+ ], ldap_format ),
360+
361+ with self .assertRaises (TypeError ):
362+ ldap .dn .dn2str ([
363+ [('dc' , 'example' , 1 )],
364+ [('dc' , 'com' , 1 ), None ],
365+ ], ldap_format ),
171366
172367 def test_explode_dn (self ):
173368 """
0 commit comments