]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/frontend.c
don't return entry if requested attr is not present (ITS#5650)
[openldap] / servers / slapd / frontend.c
index f9cfe6f466137c0110dc178e324dc7c27704b8ae..4ab36e5a2a3ba8c57856ce5b9dac7d6a671c0138 100644 (file)
@@ -1,7 +1,8 @@
 /* frontend.c - routines for dealing with frontend */
+/* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2008 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 #include "ldap_rq.h"
 
-#ifdef LDAP_SLAPI
-#include "slapi/slapi.h"
-#endif
-
 static BackendInfo     slap_frontendInfo;
 static BackendDB       slap_frontendDB;
 BackendDB      *frontendDB;
 
+static int
+fe_entry_get_rw(
+       Operation *op,
+       struct berval *ndn,
+       ObjectClass *oc,
+       AttributeDescription *at,
+       int rw,
+       Entry **e )
+{
+       BackendDB       *bd;
+       int             rc = LDAP_NO_SUCH_OBJECT;
+
+       bd = op->o_bd;
+       op->o_bd = select_backend( ndn, 0 );
+       if ( op->o_bd != NULL ) {
+               if ( op->o_bd->be_fetch ) {
+                       rc = op->o_bd->be_fetch( op, ndn, oc, at, rw, e );
+               }
+       }
+       op->o_bd = bd;
+
+       return rc;
+}
+
+static int
+fe_entry_release_rw(
+       Operation *op,
+       Entry *e,
+       int rw )
+{
+       BackendDB       *bd;
+       int             rc = LDAP_NO_SUCH_OBJECT;
+
+       bd = op->o_bd;
+       op->o_bd = select_backend( &e->e_nname, 0 );
+       if ( op->o_bd != NULL ) {
+               if ( op->o_bd->be_release ) {
+                       rc = op->o_bd->be_release( op, e, rw );
+               }
+       }
+       op->o_bd = bd;
+
+       return rc;
+}
+
 int
 frontend_init( void )
 {
        /* data */
        frontendDB = &slap_frontendDB;
+       frontendDB->bd_self = frontendDB;
 
        /* ACLs */
        frontendDB->be_dfltaccess = ACL_READ;
@@ -82,6 +125,8 @@ frontend_init( void )
        /* info */
        frontendDB->bd_info = &slap_frontendInfo;
 
+       SLAP_BFLAGS(frontendDB) |= SLAP_BFLAG_FRONTEND;
+
        /* name */
        frontendDB->bd_info->bi_type = "frontend";
 
@@ -116,6 +161,12 @@ frontend_init( void )
        frontendDB->bd_info->bi_op_modrdn = fe_op_modrdn;
        frontendDB->bd_info->bi_op_search = fe_op_search;
        frontendDB->bd_info->bi_extended = fe_extended;
+       frontendDB->bd_info->bi_operational = fe_aux_operational;
+       frontendDB->bd_info->bi_entry_get_rw = fe_entry_get_rw;
+       frontendDB->bd_info->bi_entry_release_rw = fe_entry_release_rw;
+       frontendDB->bd_info->bi_access_allowed = fe_access_allowed;
+       frontendDB->bd_info->bi_acl_group = fe_acl_group;
+       frontendDB->bd_info->bi_acl_attribute = fe_acl_attribute;
 
 #if 0
        /* FIXME: is this too early? */