]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
slight improvements; doesn't work yet
[openldap] / servers / slapd / backend.c
index 1a6a1e6eeb1cc51aeb28fcf12eadece09105ddc7..344ba7354580f08055dcc4d09a049a4fffa79cb5 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2003 The OpenLDAP Foundation.
+ * Copyright 1998-2004 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,7 +40,7 @@
 #include "ldap_rq.h"
 
 #ifdef LDAP_SLAPI
-#include "slapi.h"
+#include "slapi/slapi.h"
 #endif
 
 /*
@@ -81,6 +81,9 @@
 #if defined(SLAPD_PERL) && !defined(SLAPD_PERL_DYNAMIC)
 #include "back-perl/external.h"
 #endif
+#if defined(SLAPD_RELAY) && !defined(SLAPD_RELAY_DYNAMIC)
+#include "back-relay/external.h"
+#endif
 #if defined(SLAPD_SHELL) && !defined(SLAPD_SHELL_DYNAMIC)
 #include "back-shell/external.h"
 #endif
@@ -125,6 +128,9 @@ static BackendInfo binfo[] = {
 #if defined(SLAPD_PERL) && !defined(SLAPD_PERL_DYNAMIC)
        {"perl",        perl_back_initialize},
 #endif
+#if defined(SLAPD_RELAY) && !defined(SLAPD_RELAY_DYNAMIC)
+       {"relay",       relay_back_initialize},
+#endif
 #if defined(SLAPD_SHELL) && !defined(SLAPD_SHELL_DYNAMIC)
        {"shell",       shell_back_initialize},
 #endif
@@ -172,6 +178,8 @@ int backend_init(void)
                binfo[nBackendInfo].bi_type != NULL;
                nBackendInfo++ )
        {
+               assert( binfo[nBackendInfo].bi_init );
+
                rc = binfo[nBackendInfo].bi_init( &binfo[nBackendInfo] );
 
                if(rc != 0) {
@@ -223,6 +231,21 @@ int backend_add(BackendInfo *aBackendInfo)
 {
    int rc = 0;
 
+   if ( aBackendInfo->bi_init == NULL ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( BACKEND, ERR, 
+                  "backend_add:  backend type \"%s\" does not have the "
+                 "(mandatory)init function\n",
+                  aBackendInfo->bi_type, 0, 0 );
+#else
+      Debug( LDAP_DEBUG_ANY,
+                  "backend_add:  backend type \"%s\" does not have the "
+                 "(mandatory)init function\n",
+                  aBackendInfo->bi_type, 0, 0 );
+#endif
+      return -1;
+   }
+
    if ((rc = aBackendInfo->bi_init(aBackendInfo)) != 0) {
 #ifdef NEW_LOGGING
                LDAP_LOG( BACKEND, ERR, 
@@ -283,11 +306,13 @@ int backend_startup(Backend *be)
 
 #ifdef NEW_LOGGING
                LDAP_LOG( BACKEND, DETAIL1, "backend_startup:  starting \"%s\"\n",
-                          be->be_suffix[0].bv_val, 0, 0 );
+                       be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)",
+                       0, 0 );
 #else
                Debug( LDAP_DEBUG_TRACE,
                        "backend_startup: starting \"%s\"\n",
-                       be->be_suffix[0].bv_val, 0, 0 );
+                       be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)",
+                       0, 0 );
 #endif
 
                if ( be->bd_info->bi_open ) {
@@ -358,6 +383,20 @@ int backend_startup(Backend *be)
 
                LDAP_TAILQ_INIT( &backendDB[i].be_pending_csn_list );
 
+               if ( backendDB[i].be_suffix == NULL ) {
+#ifdef NEW_LOGGING
+                       LDAP_LOG( BACKEND, CRIT, 
+                               "backend_startup: warning, database %d (%s) "
+                               "has no suffix\n",
+                               i, backendDB[i].bd_info->bi_type, 0 );
+#else
+                       Debug( LDAP_DEBUG_ANY,
+                               "backend_startup: warning, database %d (%s) "
+                               "has no suffix\n",
+                               i, backendDB[i].bd_info->bi_type, 0 );
+#endif
+               }
+
                if ( backendDB[i].bd_info->bi_db_open ) {
                        rc = backendDB[i].bd_info->bi_db_open(
                                &backendDB[i] );
@@ -376,6 +415,21 @@ int backend_startup(Backend *be)
 
                if ( !LDAP_STAILQ_EMPTY( &backendDB[i].be_syncinfo )) {
                        syncinfo_t *si;
+
+                       if ( !( backendDB[i].be_search && backendDB[i].be_add &&
+                               backendDB[i].be_modify && backendDB[i].be_delete )) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( BACKEND, CRIT, 
+                                       "backend_startup: database(%d) does not support "
+                                       "operations required for syncrepl", i, 0, 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                       "backend_startup: database(%d) does not support "
+                                       "operations required for syncrepl", i, 0, 0 );
+#endif
+                               continue;
+                       }
+
                        LDAP_STAILQ_FOREACH( si, &backendDB[i].be_syncinfo, si_next ) {
                                si->si_be = &backendDB[i];
                                init_syncrepl( si );
@@ -751,9 +805,9 @@ backend_unbind( Operation *op, SlapReply *rs )
 #if defined( LDAP_SLAPI )
                if ( op->o_pb ) {
                        int rc;
-                       if ( i == 0 ) slapi_x_pblock_set_operation( op->o_pb, op );
+                       if ( i == 0 ) slapi_int_pblock_set_operation( op->o_pb, op );
                        slapi_pblock_set( op->o_pb, SLAPI_BACKEND, (void *)&backends[i] );
-                       rc = doPluginFNs( &backends[i], SLAPI_PLUGIN_PRE_UNBIND_FN,
+                       rc = slapi_int_call_plugins( &backends[i], SLAPI_PLUGIN_PRE_UNBIND_FN,
                                        (Slapi_PBlock *)op->o_pb );
                        if ( rc < 0 ) {
                                /*
@@ -778,7 +832,7 @@ backend_unbind( Operation *op, SlapReply *rs )
                }
 
 #if defined( LDAP_SLAPI )
-               if ( op->o_pb && doPluginFNs( &backends[i], SLAPI_PLUGIN_POST_UNBIND_FN,
+               if ( op->o_pb != NULL && slapi_int_call_plugins( &backends[i], SLAPI_PLUGIN_POST_UNBIND_FN,
                                (Slapi_PBlock *)op->o_pb ) < 0 ) {
 #ifdef NEW_LOGGING
                        LDAP_LOG( OPERATION, INFO, "do_unbind: Unbind postoperation plugins "
@@ -904,27 +958,19 @@ backend_check_restrictions(
                        break;
                }
 
-               {
-                       if( bvmatch( opdata, &slap_EXOP_START_TLS ) ) {
-                               session++;
-                               starttls++;
-                               break;
-                       }
+               if( bvmatch( opdata, &slap_EXOP_START_TLS ) ) {
+                       session++;
+                       starttls++;
+                       break;
                }
 
-               {
-                       if( bvmatch( opdata, &slap_EXOP_WHOAMI ) ) {
-                               break;
-                       }
+               if( bvmatch( opdata, &slap_EXOP_WHOAMI ) ) {
+                       break;
                }
 
-#ifdef LDAP_EXOP_X_CANCEL
-               {
-                       if ( bvmatch( opdata, &slap_EXOP_CANCEL ) ) {
-                               break;
-                       }
+               if ( bvmatch( opdata, &slap_EXOP_CANCEL ) ) {
+                       break;
                }
-#endif
 
                /* treat everything else as a modify */
                opflag = SLAP_RESTRICT_OP_MODIFY;
@@ -1035,9 +1081,10 @@ backend_check_restrictions(
                if( requires & SLAP_REQUIRE_STRONG ) {
                        /* should check mechanism */
                        if( ( op->o_transport_ssf < ssf->sss_transport
-                               && op->o_authtype == LDAP_AUTH_SIMPLE ) || op->o_dn.bv_len == 0 )
+                               && op->o_authtype == LDAP_AUTH_SIMPLE )
+                               || op->o_dn.bv_len == 0 )
                        {
-                               rs->sr_text = "strong authentication required";
+                               rs->sr_text = "strong(er) authentication required";
                                rs->sr_err = LDAP_STRONG_AUTH_REQUIRED;
                                return rs->sr_err;
                        }
@@ -1233,15 +1280,21 @@ backend_group(
                                                        goto loopit;
                                                switch(ludp->lud_scope) {
                                                case LDAP_SCOPE_BASE:
-                                                       if ( !dn_match(&nbase, op_ndn)) goto loopit;
+                                                       if ( !dn_match( &nbase, op_ndn )) goto loopit;
                                                        break;
                                                case LDAP_SCOPE_ONELEVEL:
                                                        dnParent(op_ndn, &bv );
-                                                       if ( !dn_match(&nbase, &bv)) goto loopit;
+                                                       if ( !dn_match( &nbase, &bv )) goto loopit;
                                                        break;
                                                case LDAP_SCOPE_SUBTREE:
-                                                       if ( !dnIsSuffix(op_ndn, &nbase)) goto loopit;
+                                                       if ( !dnIsSuffix( op_ndn, &nbase )) goto loopit;
                                                        break;
+                                               case LDAP_SCOPE_SUBORDINATE:
+                                                       if ( dn_match( &nbase, op_ndn ) &&
+                                                               !dnIsSuffix(op_ndn, &nbase ))
+                                                       {
+                                                               goto loopit;
+                                                       }
                                                }
                                                filter = str2filter_x( op, ludp->lud_filter );
                                                if ( filter ) {
@@ -1280,7 +1333,7 @@ backend_group(
        }
 
        if ( op->o_tag != LDAP_REQ_BIND && !op->o_do_not_cache ) {
-               g = sl_malloc(sizeof(GroupAssertion) + gr_ndn->bv_len, op->o_tmpmemctx);
+               g = op->o_tmpalloc(sizeof(GroupAssertion) + gr_ndn->bv_len, op->o_tmpmemctx);
                g->ga_be = op->o_bd;
                g->ga_oc = group_oc;
                g->ga_at = group_at;