1 /* compare.c - monitor backend compare routine */
2 /* $OpenLDAP: pkg/ldap/servers/slapd/back-monitor/compare.c,v 1.24.2.5 2008/02/11 23:26:47 kurt Exp $ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 2001-2008 The OpenLDAP Foundation.
6 * Portions Copyright 2001-2003 Pierangelo Masarati.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
13 * A copy of this license is available in file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
18 * This work was initially developed by Pierangelo Masarati for inclusion
19 * in OpenLDAP Software.
27 #include "back-monitor.h"
30 monitor_back_compare( Operation
*op
, SlapReply
*rs
)
32 monitor_info_t
*mi
= ( monitor_info_t
* ) op
->o_bd
->be_private
;
33 Entry
*e
, *matched
= NULL
;
37 /* get entry with reader lock */
38 monitor_cache_dn2entry( op
, rs
, &op
->o_req_ndn
, &e
, &matched
);
40 rs
->sr_err
= LDAP_NO_SUCH_OBJECT
;
42 if ( !access_allowed_mask( op
, matched
,
43 slap_schema
.si_ad_entry
,
44 NULL
, ACL_DISCLOSE
, NULL
, NULL
) )
48 rs
->sr_matched
= matched
->e_dn
;
51 send_ldap_result( op
, rs
);
53 monitor_cache_release( mi
, matched
);
54 rs
->sr_matched
= NULL
;
60 rs
->sr_err
= access_allowed( op
, e
, op
->oq_compare
.rs_ava
->aa_desc
,
61 &op
->oq_compare
.rs_ava
->aa_value
, ACL_COMPARE
, NULL
);
63 rs
->sr_err
= LDAP_INSUFFICIENT_ACCESS
;
67 rs
->sr_err
= LDAP_NO_SUCH_ATTRIBUTE
;
69 for ( a
= attrs_find( e
->e_attrs
, op
->oq_compare
.rs_ava
->aa_desc
);
71 a
= attrs_find( a
->a_next
, op
->oq_compare
.rs_ava
->aa_desc
)) {
72 rs
->sr_err
= LDAP_COMPARE_FALSE
;
75 SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH
|
76 SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH
,
77 &op
->oq_compare
.rs_ava
->aa_value
, NULL
,
78 op
->o_tmpmemctx
) == 0 )
80 rs
->sr_err
= LDAP_COMPARE_TRUE
;
88 case LDAP_COMPARE_FALSE
:
89 case LDAP_COMPARE_TRUE
:
93 case LDAP_NO_SUCH_ATTRIBUTE
:
97 if ( !access_allowed_mask( op
, e
, slap_schema
.si_ad_entry
,
98 NULL
, ACL_DISCLOSE
, NULL
, NULL
) )
100 rs
->sr_err
= LDAP_NO_SUCH_OBJECT
;
105 send_ldap_result( op
, rs
);
108 monitor_cache_release( mi
, e
);