]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldbm/group.c
7def923a4dc5d48dace72223e1b2b9ac8e17572a
[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         Debug( LDAP_DEBUG_ARGS, "=> ldbm_back_group: found bdn: %s matched: %s\n", bdn, (matched ? matched : ""), 0 ); 
49
50         /* check for deleted */
51
52         /* find it's objectClass and member attribute values
53          * make sure this is a group entry
54          * finally test if we can find edn in the member attribute value list *
55          */
56         
57         rc = 1;
58         if ((objectClass = attr_find(e->e_attrs, "objectclass")) == NULL)  {
59             Debug( LDAP_DEBUG_TRACE, "<= ldbm_back_group: failed to find objectClass\n", 0, 0, 0 ); 
60         }
61         else if ((member = attr_find(e->e_attrs, groupattrName)) == NULL) {
62             Debug( LDAP_DEBUG_TRACE, "<= ldbm_back_group: failed to find %s\n", groupattrName, 0, 0 ); 
63         }
64         else {
65             struct berval bvObjectClass;
66             struct berval bvMembers;
67
68             Debug( LDAP_DEBUG_ARGS, "<= ldbm_back_group: found objectClass and %s\n", groupattrName, 0, 0 ); 
69
70             bvObjectClass.bv_val = objectclassValue;
71             bvObjectClass.bv_len = strlen( bvObjectClass.bv_val );         
72
73             bvMembers.bv_val = edn;
74             bvMembers.bv_len = strlen( edn );         
75
76             if (value_find(objectClass->a_vals, &bvObjectClass, SYNTAX_CIS, 1) != 0) {
77                 Debug( LDAP_DEBUG_TRACE,
78                                         "<= ldbm_back_group: failed to find %s in objectClass\n", 
79                         objectclassValue, 0, 0 ); 
80             }
81             else if (value_find(member->a_vals, &bvMembers, SYNTAX_CIS, 1) != 0) {
82                 Debug( LDAP_DEBUG_ACL, "<= ldbm_back_group: %s not in %s: %s\n", 
83                         edn, bdn, groupattrName ); 
84             }
85             else {
86                 Debug( LDAP_DEBUG_ACL, "<= ldbm_back_group: %s is in %s: %s\n", 
87                         edn, bdn, groupattrName ); 
88                 rc = 0;
89             }
90         }
91
92         /* free entry and reader lock */
93         cache_return_entry_r( &li->li_cache, e );                 
94         Debug( LDAP_DEBUG_ARGS, "ldbm_back_group: rc: %d\n", rc, 0, 0 ); 
95         return(rc);
96 }
97 #endif /* SLAPD_ACLGROUPS */
98