]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb/compare.c
ece33d08b91f0fafc82701b57a306e61f52780c5
[openldap] / servers / slapd / back-bdb / compare.c
1 /* compare.c - bdb backend compare routine */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11 #include <ac/string.h>
12
13 #include "back-bdb.h"
14
15 int
16 bdb_compare(
17     Backend     *be,
18     Connection  *conn,
19     Operation   *op,
20     const char  *dn,
21     const char  *ndn,
22         AttributeAssertion *ava
23 )
24 {
25         struct bdb_info *bdb = (struct bdb_info *) be->be_private;
26         Entry           *matched;
27         Entry           *e;
28         Attribute       *a;
29         int                     rc; 
30         const char      *text = NULL;
31         int             manageDSAit = get_manageDSAit( op );
32
33         /* get entry */
34         rc = dn2entry_r( be, NULL, ndn, &e, &matched );
35
36         switch( rc ) {
37         case DB_NOTFOUND:
38                 break;
39         default:
40                 rc = LDAP_OTHER;
41                 text = "internal error";
42                 goto return_results;
43         }
44
45         if ( e == NULL ) {
46                 char *matched_dn = NULL;
47                 struct berval **refs = NULL;
48
49                 if ( matched != NULL ) {
50                         matched_dn = ch_strdup( matched->e_dn );
51                         refs = is_entry_referral( matched )
52                                 ? get_entry_referrals( be, conn, op, matched )
53                                 : NULL;
54                         bdb_entry_return( be, matched );
55                 } else {
56                         refs = default_referral;
57                 }
58
59                 send_ldap_result( conn, op, rc = LDAP_REFERRAL,
60                         matched_dn, NULL, refs, NULL );
61
62                 if( matched != NULL ) {
63                         ber_bvecfree( refs );
64                         free( matched_dn );
65                 }
66
67                 goto done;
68         }
69
70         if (!manageDSAit && is_entry_referral( e ) ) {
71                 /* entry is a referral, don't allow add */
72                 struct berval **refs = get_entry_referrals( be,
73                         conn, op, e );
74
75                 Debug( LDAP_DEBUG_TRACE, "entry is referral\n", 0,
76                     0, 0 );
77
78                 send_ldap_result( conn, op, rc = LDAP_REFERRAL,
79                     e->e_dn, NULL, refs, NULL );
80
81                 ber_bvecfree( refs );
82                 goto done;
83         }
84
85         if ( ! access_allowed( be, conn, op, e,
86                 ava->aa_desc, ava->aa_value, ACL_COMPARE ) )
87         {
88                 rc = LDAP_INSUFFICIENT_ACCESS;
89                 goto return_results;
90         }
91
92         rc = LDAP_NO_SUCH_ATTRIBUTE;
93
94         for(a = attrs_find( e->e_attrs, ava->aa_desc );
95                 a != NULL;
96                 a = attrs_find( a->a_next, ava->aa_desc ))
97         {
98                 rc = LDAP_COMPARE_FALSE;
99
100                 if ( value_find( ava->aa_desc, a->a_vals, ava->aa_value ) == 0 )
101                 {
102                         rc = LDAP_COMPARE_TRUE;
103                         break;
104                 }
105
106         }
107
108         if( rc != LDAP_NO_SUCH_ATTRIBUTE ) {
109                 rc = LDAP_SUCCESS;
110         }
111
112
113 return_results:
114         send_ldap_result( conn, op, LDAP_SUCCESS,
115                 NULL, text, NULL, NULL );
116
117 done:
118         /* free entry */
119         if( e != NULL ) bdb_entry_return( be, e );
120
121         return rc;
122 }