]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldbm/group.c
Suck in latest changes from -devel. Besides the usually lint removal,
[openldap] / servers / slapd / back-ldbm / group.c
1 /* compare.c - ldbm backend compare routine */
2
3 #include "portable.h"
4
5 #include <stdio.h>
6
7 #include <ac/socket.h>
8 #include <ac/string.h>
9
10 #include "slap.h"
11 #include "back-ldbm.h"
12 #include "proto-back-ldbm.h"
13
14
15 #ifdef SLAPD_ACLGROUPS
16 /* return 0 IFF edn is a value in member attribute
17  * of entry with bdn AND that entry has an objectClass
18  * value of groupOfNames
19  */
20 int
21 ldbm_back_group(
22         Backend     *be,
23         char        *bdn,
24         char        *edn,
25         char        *objectclassValue,
26         char        *groupattrName
27 )
28 {
29         struct ldbminfo *li = (struct ldbminfo *) be->be_private;    
30         Entry        *e;
31         char        *matched;
32         Attribute   *objectClass;
33         Attribute   *member;
34         int          rc;
35
36         Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: bdn: %s\n", bdn, 0, 0 ); 
37         Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: edn: %s\n", edn, 0, 0 ); 
38         Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: objectClass: %s attrName: %s\n", 
39                 objectclassValue, groupattrName, 0 ); 
40
41         /* can we find bdn entry with reader lock */
42         if ((e = dn2entry_r(be, bdn, &matched )) == NULL) {
43                 Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: cannot find bdn: %s matched: %s\n", bdn, (matched ? matched : ""), 0 ); 
44                 if (matched != NULL)
45                         free(matched);
46                 return( 1 );
47         }
48
49         Debug( LDAP_DEBUG_ARGS, "=> ldbm_back_group: found bdn: %s\n", bdn, 0, 0 ); 
50
51         /* check for deleted */
52
53         /* find it's objectClass and member attribute values
54          * make sure this is a group entry
55          * finally test if we can find edn in the member attribute value list *
56          */
57         
58         rc = 1;
59         if ((objectClass = attr_find(e->e_attrs, "objectclass")) == NULL)  {
60             Debug( LDAP_DEBUG_TRACE, "<= ldbm_back_group: failed to find objectClass\n", 0, 0, 0 ); 
61         }
62         else if ((member = attr_find(e->e_attrs, groupattrName)) == NULL) {
63             Debug( LDAP_DEBUG_TRACE, "<= ldbm_back_group: failed to find %s\n", groupattrName, 0, 0 ); 
64         }
65         else {
66             struct berval bvObjectClass;
67             struct berval bvMembers;
68
69             Debug( LDAP_DEBUG_ARGS, "<= ldbm_back_group: found objectClass and %s\n", groupattrName, 0, 0 ); 
70
71             bvObjectClass.bv_val = objectclassValue;
72             bvObjectClass.bv_len = strlen( bvObjectClass.bv_val );         
73
74             bvMembers.bv_val = edn;
75             bvMembers.bv_len = strlen( edn );         
76
77             if (value_find(objectClass->a_vals, &bvObjectClass, SYNTAX_CIS, 1) != 0) {
78                 Debug( LDAP_DEBUG_TRACE,
79                                         "<= ldbm_back_group: failed to find %s in objectClass\n", 
80                         objectclassValue, 0, 0 ); 
81             }
82             else if (value_find(member->a_vals, &bvMembers, SYNTAX_CIS, 1) != 0) {
83                 Debug( LDAP_DEBUG_ACL, "<= ldbm_back_group: %s not in %s: %s\n", 
84                         edn, bdn, groupattrName ); 
85             }
86             else {
87                 Debug( LDAP_DEBUG_ACL, "<= ldbm_back_group: %s is in %s: %s\n", 
88                         edn, bdn, groupattrName ); 
89                 rc = 0;
90             }
91         }
92
93         /* free entry and reader lock */
94         cache_return_entry_r( &li->li_cache, e );                 
95         Debug( LDAP_DEBUG_ARGS, "ldbm_back_group: rc: %d\n", rc, 0, 0 ); 
96         return(rc);
97 }
98 #endif /* SLAPD_ACLGROUPS */
99