]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
slight improvements; doesn't work yet
[openldap] / servers / slapd / backend.c
index 8edb10f2d6ad8cb922fd288b788ef2133bf4cc6f..344ba7354580f08055dcc4d09a049a4fffa79cb5 100644 (file)
@@ -1,9 +1,28 @@
+/* backend.c - routines for dealing with back-end databases */
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2004 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* Portions Copyright (c) 1995 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
  */
-/* backend.c - routines for dealing with back-end databases */
 
 
 #include "portable.h"
@@ -21,7 +40,7 @@
 #include "ldap_rq.h"
 
 #ifdef LDAP_SLAPI
-#include "slapi.h"
+#include "slapi/slapi.h"
 #endif
 
 /*
@@ -62,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
@@ -106,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
@@ -153,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) {
@@ -204,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, 
@@ -264,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 ) {
@@ -334,30 +378,24 @@ int backend_startup(Backend *be)
 
        /* open each backend database */
        for( i = 0; i < nBackendDB; i++ ) {
-#ifndef SLAPD_MULTIMASTER
-               if ( backendDB[i].be_update_ndn.bv_val && (
-                       !backendDB[i].be_update_refs &&
-                       !backendDB[i].be_syncinfo &&
-                       !default_referral ) )
-               {
+               /* append global access controls */
+               acl_append( &backendDB[i].be_acl, global_acl );
+
+               LDAP_TAILQ_INIT( &backendDB[i].be_pending_csn_list );
+
+               if ( backendDB[i].be_suffix == NULL ) {
 #ifdef NEW_LOGGING
                        LDAP_LOG( BACKEND, CRIT, 
-                               "backend_startup: slave \"%s\" updateref missing\n",
-                               backendDB[i].be_suffix[0].bv_val, 0, 0 );
-                               
+                               "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: slave \"%s\" updateref missing\n",
-                               backendDB[i].be_suffix[0].bv_val, 0, 0 );
+                               "backend_startup: warning, database %d (%s) "
+                               "has no suffix\n",
+                               i, backendDB[i].bd_info->bi_type, 0 );
 #endif
-                       return -1;
                }
-#endif
-
-               /* append global access controls */
-               acl_append( &backendDB[i].be_acl, global_acl );
-
-               LDAP_TAILQ_INIT( &backendDB[i].be_pending_csn_list );
 
                if ( backendDB[i].bd_info->bi_db_open ) {
                        rc = backendDB[i].bd_info->bi_db_open(
@@ -375,14 +413,31 @@ int backend_startup(Backend *be)
                        }
                }
 
-               if ( backendDB[i].be_syncinfo != NULL ) {
-                       syncinfo_t *si = ( syncinfo_t * ) backendDB[i].be_syncinfo;
-                       si->si_be = &backendDB[i];
-                       init_syncrepl(si);
-                       ldap_pvt_thread_mutex_lock( &syncrepl_rq.rq_mutex );
-                       ldap_pvt_runqueue_insert( &syncrepl_rq, si->si_interval,
-                               do_syncrepl, (void *) backendDB[i].be_syncinfo );
-                       ldap_pvt_thread_mutex_unlock( &syncrepl_rq.rq_mutex );
+               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 );
+                               ldap_pvt_thread_mutex_lock( &syncrepl_rq.rq_mutex );
+                               ldap_pvt_runqueue_insert( &syncrepl_rq,
+                                               si->si_interval, do_syncrepl, (void *) si );
+                               ldap_pvt_thread_mutex_unlock( &syncrepl_rq.rq_mutex );
+                       }
                }
        }
 
@@ -552,7 +607,7 @@ backend_db_init(
        ldap_pvt_thread_mutex_init( &be->be_pcl_mutex );
        ldap_pvt_thread_mutex_init( &be->be_context_csn_mutex );
 
-       be->be_syncinfo = NULL;
+       LDAP_STAILQ_INIT( &be->be_syncinfo );
 
        /* assign a default depth limit for alias deref */
        be->be_max_deref_depth = SLAPD_DEFAULT_MAXDEREFDEPTH; 
@@ -750,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 ) {
                                /*
@@ -777,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 "
@@ -903,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;
@@ -1034,16 +1081,17 @@ backend_check_restrictions(
                if( requires & SLAP_REQUIRE_STRONG ) {
                        /* should check mechanism */
                        if( ( op->o_transport_ssf < ssf->sss_transport
-                               && op->o_authmech.bv_len == 0 ) || 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;
                        }
                }
 
                if( requires & SLAP_REQUIRE_SASL ) {
-                       if( op->o_authmech.bv_len == 0 || op->o_dn.bv_len == 0 ) {
+                       if( op->o_authtype != LDAP_AUTH_SASL || op->o_dn.bv_len == 0 ) {
                                rs->sr_text = "SASL authentication required";
                                rs->sr_err = LDAP_STRONG_AUTH_REQUIRED;
                                return rs->sr_err;
@@ -1232,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 ) {
@@ -1279,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;