X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Fcompare.c;h=e3b075e742991b4c78150eb4c8b6af53700bc84b;hb=743c402265e56c084d7fa4517e1257bc3457daeb;hp=f4318c5e946f796a3726980550f1132d87cbfd71;hpb=5fdba2728822b5cb293b300021025b1a5d435a87;p=openldap diff --git a/servers/slapd/back-monitor/compare.c b/servers/slapd/back-monitor/compare.c index f4318c5e94..e3b075e742 100644 --- a/servers/slapd/back-monitor/compare.c +++ b/servers/slapd/back-monitor/compare.c @@ -44,13 +44,61 @@ int monitor_back_compare( Backend *be, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, + Connection *conn, + Operation *op, + struct berval *dn, + struct berval *ndn, AttributeAssertion *ava ) { - return( 0 ); + struct monitorinfo *mi = (struct monitorinfo *) be->be_private; int rc; + Entry *e, *matched = NULL; + Attribute *a; + + /* get entry with reader lock */ + monitor_cache_dn2entry( mi, ndn, &e, &matched ); + if ( e == NULL ) { + send_ldap_result( conn, op, LDAP_NO_SUCH_OBJECT, + matched ? matched->e_dn : NULL, + NULL, NULL, NULL ); + if ( matched ) { + monitor_cache_release( mi, matched ); + } + + return( 0 ); + } + + rc = access_allowed( be, conn, op, e, ava->aa_desc, + &ava->aa_value, ACL_COMPARE ); + if ( !rc ) { + send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS, + NULL, NULL, NULL, NULL ); + rc = 1; + goto return_results; + } + + rc = LDAP_NO_SUCH_ATTRIBUTE; + + for ( a = attrs_find( e->e_attrs, ava->aa_desc ); + a != NULL; + a = attrs_find( a->a_next, ava->aa_desc )) { + rc = LDAP_COMPARE_FALSE; + + if ( value_find( ava->aa_desc, a->a_vals, &ava->aa_value ) == 0 ) { + rc = LDAP_COMPARE_TRUE; + break; + } + } + + send_ldap_result( conn, op, rc, NULL, NULL, NULL, NULL ); + + if( rc != LDAP_NO_SUCH_ATTRIBUTE ) { + rc = 0; + } + +return_results:; + monitor_cache_release( mi, e ); + + return( rc ); }