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