1 """
2 Test cases for ldaptor.protocols.ldap.distinguishedname module.
3 """
4
5 from twisted.trial import unittest
6 from ldaptor.protocols.ldap import distinguishedname as dn
7
9 knownValues = ()
10
12 for s, l in self.knownValues:
13 fromString = dn.DistinguishedName(s)
14 listOfRDNs = []
15 for av in l:
16 listOfAttributeTypesAndValues = []
17 for a,v in av:
18 listOfAttributeTypesAndValues.append(dn.LDAPAttributeTypeAndValue(attributeType=a, value=v))
19 r=dn.RelativeDistinguishedName(listOfAttributeTypesAndValues)
20 listOfRDNs.append(r)
21 fromList = dn.DistinguishedName(listOfRDNs)
22
23 self.assertEquals(fromString, fromList)
24
25 fromStringToString = str(fromString)
26 fromListToString = str(fromList)
27
28 assert fromStringToString == fromListToString
29
30 canon = fromStringToString
31
32
33
34 self.assertEquals(fromString, canon)
35 self.assertEquals(fromList, canon)
36 self.assertEquals(canon, fromString)
37 self.assertEquals(canon, fromList)
38
39
40
41 self.assertEquals(hash(fromString), hash(canon))
42 self.assertEquals(hash(fromList), hash(canon))
43 self.assertEquals(hash(canon), hash(fromString))
44 self.assertEquals(hash(canon), hash(fromList))
45
46
48 knownValues = (
49
50 ('', []),
51
52 ('cn=foo', [[('cn', 'foo')]]),
53
54 (r'cn=\,bar', [[('cn', r',bar')]]),
55 (r'cn=foo\,bar', [[('cn', r'foo,bar')]]),
56 (r'cn=foo\,', [[('cn', r'foo,')]]),
57
58 (r'cn=\+bar', [[('cn', r'+bar')]]),
59 (r'cn=foo\+bar', [[('cn', r'foo+bar')]]),
60 (r'cn=foo\+', [[('cn', r'foo+')]]),
61
62 (r'cn=\"bar', [[('cn', r'"bar')]]),
63 (r'cn=foo\"bar', [[('cn', r'foo"bar')]]),
64 (r'cn=foo\"', [[('cn', r'foo"')]]),
65
66 (r'cn=\\bar', [[('cn', r'\bar')]]),
67 (r'cn=foo\\bar', [[('cn', r'foo\bar')]]),
68 (r'cn=foo\\', [[('cn', 'foo\\')]]),
69
70 (r'cn=\<bar', [[('cn', r'<bar')]]),
71 (r'cn=foo\<bar', [[('cn', r'foo<bar')]]),
72 (r'cn=foo\<', [[('cn', r'foo<')]]),
73
74 (r'cn=\>bar', [[('cn', r'>bar')]]),
75 (r'cn=foo\>bar', [[('cn', r'foo>bar')]]),
76 (r'cn=foo\>', [[('cn', r'foo>')]]),
77
78 (r'cn=\;bar', [[('cn', r';bar')]]),
79 (r'cn=foo\;bar', [[('cn', r'foo;bar')]]),
80 (r'cn=foo\;', [[('cn', r'foo;')]]),
81
82 (r'cn=\#bar', [[('cn', r'#bar')]]),
83
84 (r'cn=\ bar', [[('cn', r' bar')]]),
85
86 (r'cn=bar\ ', [[('cn', r'bar ')]]),
87
88 (r'cn=test+owner=uid\=foo\,ou\=depar'
89 +r'tment\,dc\=example\,dc\=com,dc=ex'
90 +r'ample,dc=com', [[('cn', r'test'),
91 ('owner', r'uid=foo,ou=depart'
92 +r'ment,dc=example,dc=com'),
93 ],
94 [('dc', r'example')],
95 [('dc', r'com')]]),
96
97 (r'cn=bar,dc=example,dc=com', [[('cn', 'bar')],
98 [('dc', 'example')],
99 [('dc', 'com')]]),
100 (r'cn=bar, dc=example, dc=com', [[('cn', 'bar')],
101 [('dc', 'example')],
102 [('dc', 'com')]]),
103 (r'cn=bar, dc=example,dc=com', [[('cn', 'bar')],
104 [('dc', 'example')],
105 [('dc', 'com')]]),
106
107 )
108
110 """Slapd wants = to be escaped in RDN attributeValues."""
111 got = dn.DistinguishedName(listOfRDNs=[
112 dn.RelativeDistinguishedName(
113 attributeTypesAndValues=[
114 dn.LDAPAttributeTypeAndValue(attributeType='cn', value=r'test'),
115 dn.LDAPAttributeTypeAndValue(attributeType='owner', value=r'uid=foo,ou=depart'
116 +r'ment,dc=example,dc=com'),
117 ]),
118
119 dn.RelativeDistinguishedName('dc=example'),
120 dn.RelativeDistinguishedName('dc=com'),
121 ])
122 got = str(got)
123 self.assertEquals(got,
124 r'cn=test+owner=uid\=foo\,ou\=depar'
125 +r'tment\,dc\=example\,dc\=com,dc=ex'
126 +r'ample,dc=com')
127
129 knownValues = (
130
131 ('CN=Steve Kille,O=Isode Limited,C=GB',
132 [[('CN', 'Steve Kille')],
133 [('O', 'Isode Limited')],
134 [('C', 'GB')]]),
135
136
137 ('OU=Sales+CN=J. Smith,O=Widget Inc.,C=US',
138 [[('OU', 'Sales'),
139 ('CN', 'J. Smith')],
140 [('O', 'Widget Inc.')],
141 [('C', 'US')]]),
142
143 (r'CN=L. Eagle,O=Sue\, Grabbit and Runn,C=GB',
144 [[('CN', 'L. Eagle')],
145 [('O', 'Sue, Grabbit and Runn')],
146 [('C', 'GB')]]),
147
148 (r'CN=Before\0DAfter,O=Test,C=GB',
149 [[('CN', 'Before\x0dAfter')],
150 [('O', 'Test')],
151 [('C', 'GB')]]),
152
153 (r'1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB',
154 [[('1.3.6.1.4.1.1466.0', '#04024869')],
155 [('O', 'Test')],
156 [('C', 'GB')]]),
157
158 (u'SN=Lu\u010di\u0107'.encode('utf-8'),
159 [[('SN', u'Lu\u010di\u0107'.encode('utf-8'))]])
160
161 )
162
164 knownValues = (
165
166 ('cn=foo, ou=bar, dc=quux, \ attributeThatStartsWithSpace=Value',
167 [[('cn', 'foo')],
168 [('ou', 'bar')],
169 [('dc', 'quux')],
170 [(' attributeThatStartsWithSpace', 'Value')]]),
171
172 )
173
175 - def testNonDc(self):
176 d=dn.DistinguishedName('cn=foo,o=bar,c=us')
177 assert d.getDomainName() is None
178
180 d=dn.DistinguishedName('cn=foo,o=bar,dc=foo,c=us')
181 assert d.getDomainName() is None
182
186
190
194
198
200 shsec=dn.DistinguishedName('dc=sub2,cn=host,dc=sub,dc=example,dc=com')
201 hsec=dn.DistinguishedName('cn=host,dc=sub,dc=example,dc=com')
202 sec=dn.DistinguishedName('dc=sub,dc=example,dc=com')
203 ec=dn.DistinguishedName('dc=example,dc=com')
204 c=dn.DistinguishedName('dc=com')
205
206 soc=dn.DistinguishedName('dc=sub,dc=other,dc=com')
207 oc=dn.DistinguishedName('dc=other,dc=com')
208
209 other=dn.DistinguishedName('o=foo,c=US')
210
211 root=dn.DistinguishedName('')
212
226
249
269
271 groups=([self.shsec, self.hsec, self.sec, self.ec],
272 [self.soc, self.oc],
273 [self.other])
274 for g1 in groups:
275 for g2 in groups:
276 if g1!=g2:
277 for i1 in g1:
278 for i2 in g2:
279 assert not i1.contains(i2)
280 assert not self.c.contains(self.other)
281 assert not self.other.contains(self.c)
282
297
300 """str(DistinguishedName(...)) prettifies the DN by removing extra whitespace."""
301 d=dn.DistinguishedName('cn=foo, o=bar, c=us')
302 assert str(d) == 'cn=foo,o=bar,c=us'
303
306 d=dn.DistinguishedName('dc=example,dc=com')
307 self.assertEquals(str(d), 'dc=example,dc=com')
308
313
323
330