1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.operations.compare;
21
22
23 import javax.naming.NamingEnumeration;
24 import javax.naming.ReferralException;
25 import javax.naming.directory.SearchControls;
26 import javax.naming.directory.SearchResult;
27 import javax.naming.ldap.LdapContext;
28
29 import netscape.ldap.LDAPAttribute;
30 import netscape.ldap.LDAPConnection;
31 import netscape.ldap.LDAPConstraints;
32 import netscape.ldap.LDAPControl;
33 import netscape.ldap.LDAPException;
34 import netscape.ldap.LDAPResponse;
35 import netscape.ldap.LDAPResponseListener;
36
37 import org.apache.directory.server.core.integ.Level;
38 import org.apache.directory.server.core.integ.annotations.ApplyLdifs;
39 import org.apache.directory.server.core.integ.annotations.CleanupLevel;
40 import org.apache.directory.server.integ.SiRunner;
41 import org.apache.directory.server.ldap.LdapService;
42 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
43 import org.junit.Test;
44 import org.junit.runner.RunWith;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredConnection;
49 import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContextThrowOnRefferal;
50 import static org.junit.Assert.assertEquals;
51 import static org.junit.Assert.assertFalse;
52 import static org.junit.Assert.assertTrue;
53 import static org.junit.Assert.fail;
54
55
56
57
58
59
60
61
62 @RunWith ( SiRunner.class )
63 @CleanupLevel ( Level.SUITE )
64 @ApplyLdifs( {
65
66 "dn: uid=akarasulu,ou=users,ou=system\n" +
67 "objectClass: uidObject\n" +
68 "objectClass: person\n" +
69 "objectClass: top\n" +
70 "uid: akarasulu\n" +
71 "cn: Alex Karasulu\n" +
72 "sn: karasulu\n\n" +
73
74 "dn: ou=Computers,uid=akarasulu,ou=users,ou=system\n" +
75 "objectClass: organizationalUnit\n" +
76 "objectClass: top\n" +
77 "ou: computers\n" +
78 "description: Computers for Alex\n" +
79 "seeAlso: ou=Machines,uid=akarasulu,ou=users,ou=system\n\n" +
80
81 "dn: uid=akarasuluref,ou=users,ou=system\n" +
82 "objectClass: uidObject\n" +
83 "objectClass: referral\n" +
84 "objectClass: top\n" +
85 "uid: akarasuluref\n" +
86 "ref: ldap://localhost:10389/uid=akarasulu,ou=users,ou=system\n" +
87 "ref: ldap://foo:10389/uid=akarasulu,ou=users,ou=system\n" +
88 "ref: ldap://bar:10389/uid=akarasulu,ou=users,ou=system\n\n"
89 }
90 )
91 public class CompareIT
92 {
93 private static final Logger LOG = LoggerFactory.getLogger( CompareIT.class );
94
95 public static LdapService ldapService;
96
97
98
99
100
101
102 @Test
103 public void testNormalCompare() throws Exception
104 {
105 LDAPConnection conn = getWiredConnection( ldapService );
106
107
108 LDAPAttribute attribute = new LDAPAttribute( "sn", "karasulu" );
109 assertTrue( conn.compare( "uid=akarasulu,ou=users,ou=system", attribute ) );
110
111
112 attribute = new LDAPAttribute( "sn", "lecharny" );
113 assertFalse( conn.compare( "uid=akarasulu,ou=users,ou=system", attribute ) );
114
115 conn.disconnect();
116 }
117
118
119
120
121
122
123
124 @Test
125 public void testNormalCompareMissingAttribute() throws Exception
126 {
127 LDAPConnection conn = getWiredConnection( ldapService );
128
129
130 LDAPAttribute attribute = new LDAPAttribute( "sn", "karasulu" );
131 assertTrue( conn.compare( "uid=akarasulu,ou=users,ou=system", attribute ) );
132
133
134 attribute = new LDAPAttribute( "mail", "akarasulu@apache.org" );
135
136 try
137 {
138 conn.compare( "uid=akarasulu,ou=users,ou=system", attribute );
139 fail( "Should never get here" );
140 }
141 catch ( LDAPException e )
142 {
143 assertEquals( ResultCodeEnum.NO_SUCH_ATTRIBUTE.getValue(), e.getLDAPResultCode() );
144 }
145
146 conn.disconnect();
147 }
148
149
150
151
152
153 @Test
154 public void testOnReferralWithManageDsaITControl() throws Exception
155 {
156 LDAPConnection conn = getWiredConnection( ldapService );
157 LDAPConstraints constraints = new LDAPConstraints();
158 constraints.setClientControls( new LDAPControl( LDAPControl.MANAGEDSAIT, true, new byte[0] ) );
159 constraints.setServerControls( new LDAPControl( LDAPControl.MANAGEDSAIT, true, new byte[0] ) );
160 conn.setConstraints( constraints );
161
162
163 LDAPAttribute attribute = new LDAPAttribute( "uid", "akarasuluref" );
164 assertTrue( conn.compare( "uid=akarasuluref,ou=users,ou=system", attribute, constraints ) );
165
166
167 attribute = new LDAPAttribute( "uid", "elecharny" );
168 assertFalse( conn.compare( "uid=akarasuluref,ou=users,ou=system", attribute, constraints ) );
169
170 conn.disconnect();
171 }
172
173
174
175
176
177
178
179 @Test
180 public void testOnReferral() throws Exception
181 {
182 LDAPConnection conn = getWiredConnection( ldapService );
183 LDAPConstraints constraints = new LDAPConstraints();
184 constraints.setReferrals( false );
185 conn.setConstraints( constraints );
186
187
188 LDAPAttribute attribute = new LDAPAttribute( "uid", "akarasulu" );
189 assertTrue( conn.compare( "uid=akarasulu,ou=users,ou=system", attribute, constraints ) );
190
191
192 attribute = new LDAPAttribute( "uid", "akarasulu" );
193 LDAPResponseListener listener = null;
194 LDAPResponse response = null;
195
196 listener = conn.compare( "uid=akarasuluref,ou=users,ou=system", attribute, null, constraints );
197 response = listener.getResponse();
198 assertEquals( ResultCodeEnum.REFERRAL.getValue(), response.getResultCode() );
199
200 assertEquals( "ldap://localhost:10389/uid=akarasulu,ou=users,ou=system", response.getReferrals()[0] );
201 assertEquals( "ldap://foo:10389/uid=akarasulu,ou=users,ou=system", response.getReferrals()[1] );
202 assertEquals( "ldap://bar:10389/uid=akarasulu,ou=users,ou=system", response.getReferrals()[2] );
203
204 conn.disconnect();
205 }
206
207
208
209
210
211
212
213 @Test
214 public void testThrowOnReferralWithJndi() throws Exception
215 {
216 LdapContext ctx = getWiredContextThrowOnRefferal( ldapService );
217 SearchControls controls = new SearchControls();
218 controls.setReturningAttributes( new String[0] );
219 controls.setSearchScope( SearchControls.OBJECT_SCOPE );
220
221
222 NamingEnumeration<SearchResult> answer = ctx.search( "uid=akarasulu,ou=users,ou=system",
223 "(uid=akarasulu)", controls );
224 assertTrue( answer.hasMore() );
225 SearchResult result = answer.next();
226 assertEquals( "", result.getName() );
227 assertEquals( 0, result.getAttributes().size() );
228 assertFalse( answer.hasMore() );
229 answer.close();
230
231
232 try
233 {
234 answer = ctx.search( "uid=akarasuluref,ou=users,ou=system",
235 "(uid=akarasuluref)", controls );
236 fail( "Should never get here" );
237 }
238 catch ( ReferralException e )
239 {
240
241 assertEquals( "ldap://localhost:10389/uid=akarasulu,ou=users,ou=system", e.getReferralInfo() );
242 }
243
244 ctx.close();
245 }
246
247
248
249
250
251
252
253 @Test
254 public void testCompareWithoutAuthentication() throws LDAPException
255 {
256 ldapService.getDirectoryService().setAllowAnonymousAccess( false );
257 LDAPConnection conn = new LDAPConnection();
258 conn.connect( "localhost", ldapService.getIpPort() );
259 LDAPAttribute attr = new LDAPAttribute( "uid", "admin" );
260
261 try
262 {
263 conn.compare( "uid=admin,ou=system", attr );
264 fail( "Compare success without authentication" );
265 }
266 catch ( LDAPException e )
267 {
268 assertEquals( "no permission exception", 50, e.getLDAPResultCode() );
269 }
270 }
271
272
273
274
275
276 @Test
277 public void testAncestorReferral() throws Exception
278 {
279 LOG.debug( "" );
280
281 LDAPConnection conn = getWiredConnection( ldapService );
282 LDAPConstraints constraints = new LDAPConstraints();
283 conn.setConstraints( constraints );
284
285
286 LDAPAttribute attribute = new LDAPAttribute( "ou", "Computers" );
287 LDAPResponseListener listener = null;
288 LDAPResponse response = null;
289
290 listener = conn.compare( "ou=Computers,uid=akarasuluref,ou=users,ou=system", attribute, null, constraints );
291 response = listener.getResponse();
292 assertEquals( ResultCodeEnum.REFERRAL.getValue(), response.getResultCode() );
293
294 assertEquals( "ldap://localhost:10389/ou=Computers,uid=akarasulu,ou=users,ou=system", response.getReferrals()[0] );
295 assertEquals( "ldap://foo:10389/ou=Computers,uid=akarasulu,ou=users,ou=system", response.getReferrals()[1] );
296 assertEquals( "ldap://bar:10389/ou=Computers,uid=akarasulu,ou=users,ou=system", response.getReferrals()[2] );
297
298 conn.disconnect();
299 }
300 }