]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
Do not return pointers into BerElement we do not own
[openldap] / servers / slapd / config.c
index bd777a81c40496fac43366da4849fbacb7807708..8951f40664229f103fa8e1c54acede67ce3d63bc 100644 (file)
@@ -1,7 +1,7 @@
 /* config.c - configuration file handling routines */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
 #include <ac/socket.h>
 #include <ac/errno.h>
 
-#include "lutil.h"
 #include "ldap_pvt.h"
 #include "slap.h"
+#ifdef LDAP_SLAPI
+#include "slapi.h"
+#endif
+#include "lutil.h"
 
 #define ARGS_STEP      512
 
@@ -30,12 +33,9 @@ struct slap_limits_set deflimit = {
 
        SLAPD_DEFAULT_SIZELIMIT,        /* backward compatible limits */
        0,
-       -1                              /* no limit on unchecked size */
-#ifdef LDAP_CONTROL_PAGEDRESULTS
-       ,
+       -1,                             /* no limit on unchecked size */
        0,                              /* page limit */
        0                               /* hide number of entries left */
-#endif /* LDAP_CONTROL_PAGEDRESULTS */
 };
 
 AccessControl  *global_acl = NULL;
@@ -63,16 +63,15 @@ struct berval global_schemandn = { 0, NULL };
 ber_len_t sockbuf_max_incoming = SLAP_SB_MAX_INCOMING_DEFAULT;
 ber_len_t sockbuf_max_incoming_auth= SLAP_SB_MAX_INCOMING_AUTH;
 
+int    slap_conn_max_pending = SLAP_CONN_MAX_PENDING_DEFAULT;
+int    slap_conn_max_pending_auth = SLAP_CONN_MAX_PENDING_AUTH;
+
 char   *slapd_pid_file  = NULL;
 char   *slapd_args_file = NULL;
 
 char   *strtok_quote_ptr;
 
-#ifdef SLAPD_RLOOKUPS
-int use_reverse_lookup = 1;
-#else /* !SLAPD_RLOOKUPS */
 int use_reverse_lookup = 0;
-#endif /* !SLAPD_RLOOKUPS */
 
 static char    *fp_getline(FILE *fp, int *lineno);
 static void    fp_getline_init(int *lineno);
@@ -336,6 +335,80 @@ read_config( const char *fname, int depth )
 
                        sockbuf_max_incoming_auth = max;
 
+               /* set conn pending max */
+               } else if ( strcasecmp( cargv[0], "conn_max_pending" ) == 0 ) {
+                       long max;
+                       if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, CRIT, 
+                                  "%s: line %d: missing max in \"conn_max_pending "
+                                  "<requests>\" line\n", fname, lineno, 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                          "%s: line %d: missing max in \"conn_max_pending <requests>\" line\n",
+                                   fname, lineno, 0 );
+#endif
+
+                               return( 1 );
+                       }
+
+                       max = atol( cargv[1] );
+
+                       if( max < 0 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, CRIT, 
+                                          "%s: line %d: invalid max value (%ld) in "
+                                          "\"conn_max_pending <requests>\" line.\n",
+                                          fname, lineno, max );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                       "%s: line %d: invalid max value (%ld) in "
+                                       "\"conn_max_pending <requests>\" line.\n",
+                                   fname, lineno, max );
+#endif
+
+                               return( 1 );
+                       }
+
+                       slap_conn_max_pending = max;
+
+               /* set conn pending max authenticated */
+               } else if ( strcasecmp( cargv[0], "conn_max_pending_auth" ) == 0 ) {
+                       long max;
+                       if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, CRIT, 
+                                  "%s: line %d: missing max in \"conn_max_pending_auth "
+                                  "<requests>\" line\n", fname, lineno, 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                          "%s: line %d: missing max in \"conn_max_pending_auth <requests>\" line\n",
+                                   fname, lineno, 0 );
+#endif
+
+                               return( 1 );
+                       }
+
+                       max = atol( cargv[1] );
+
+                       if( max < 0 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, CRIT, 
+                                          "%s: line %d: invalid max value (%ld) in "
+                                          "\"conn_max_pending_auth <requests>\" line.\n",
+                                          fname, lineno, max );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                       "%s: line %d: invalid max value (%ld) in "
+                                       "\"conn_max_pending_auth <requests>\" line.\n",
+                                   fname, lineno, max );
+#endif
+
+                               return( 1 );
+                       }
+
+                       slap_conn_max_pending_auth = max;
+
                /* default search base */
                } else if ( strcasecmp( cargv[0], "defaultSearchBase" ) == 0 ) {
                        if ( cargc < 2 ) {
@@ -564,12 +637,10 @@ read_config( const char *fname, int depth )
 
                        lutil_salt_format( cargv[1] );
 
-#ifdef HAVE_CYRUS_SASL
                /* SASL config options */
                } else if ( strncasecmp( cargv[0], "sasl", 4 ) == 0 ) {
                        if ( slap_sasl_config( cargc, cargv, line, fname, lineno ) )
                                return 1;
-#endif /* HAVE_CYRUS_SASL */
 
                } else if ( strcasecmp( cargv[0], "schemadn" ) == 0 ) {
                        struct berval dn;
@@ -962,141 +1033,6 @@ read_config( const char *fname, int depth )
                        ber_bvarray_add( &be->be_suffix, &pdn );
                        ber_bvarray_add( &be->be_nsuffix, &ndn );
 
-               /* set database suffixAlias */
-               } else if ( strcasecmp( cargv[0], "suffixAlias" ) == 0 ) {
-                       Backend *tmp_be;
-                       struct berval alias, palias, nalias;
-                       struct berval aliased, paliased, naliased;
-
-                       if ( cargc < 2 ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, CRIT, 
-                                       "%s: line %d: missing alias and aliased_dn in "
-                                       "\"suffixAlias <alias> <aliased_dn>\" line.\n",
-                                       fname, lineno, 0 );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: missing alias and aliased_dn in "
-                                       "\"suffixAlias <alias> <aliased_dn>\" line.\n",
-                                       fname, lineno, 0 );
-#endif
-
-                               return( 1 );
-                       } else if ( cargc < 3 ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, CRIT, 
-                                       "%s: line %d: missing aliased_dn in "
-                                       "\"suffixAlias <alias> <aliased_dn>\" line\n",
-                                       fname, lineno, 0 );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: missing aliased_dn in "
-                                       "\"suffixAlias <alias> <aliased_dn>\" line\n",
-                                       fname, lineno, 0 );
-#endif
-                               return( 1 );
-
-                       } else if ( cargc > 3 ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, CRIT, 
-                                       "%s: line %d: extra cruft in suffixAlias line (ignored)\n",
-                                       fname, lineno, 0 );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: extra cruft in suffixAlias line (ignored)\n",
-                                       fname, lineno, 0 );
-#endif
-                       }
-
-                       if ( be == NULL ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, INFO, 
-                                       "%s: line %d: suffix line must appear inside a database "
-                                       "definition.\n", fname, lineno, 0 );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: suffixAlias line"
-                                       " must appear inside a database definition.\n",
-                                       fname, lineno, 0 );
-#endif
-                               return 1;
-                       }
-
-                       if ( load_ucdata( NULL ) < 0 ) return 1;
-                       
-                       alias.bv_val = cargv[1];
-                       alias.bv_len = strlen( cargv[1] );
-
-                       rc = dnPrettyNormal( NULL, &alias, &palias, &nalias );
-                       if( rc != LDAP_SUCCESS ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, CRIT, 
-                                       "%s: line %d: alias DN is invalid.\n", fname, lineno, 0 );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: alias DN is invalid\n",
-                                  fname, lineno, 0 );
-#endif
-                               return( 1 );
-                       }
-
-                       tmp_be = select_backend( &nalias, 0, 0 );
-                       free( nalias.bv_val );
-                       if ( tmp_be && tmp_be != be ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, INFO, 
-                                       "%s: line %d: suffixAlias served by a preceeding "
-                                       "backend \"%s\"\n", fname, lineno, 
-                                       tmp_be->be_suffix[0].bv_val );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: suffixAlias served by"
-                                       "  a preceeding backend \"%s\"\n",
-                                       fname, lineno, tmp_be->be_suffix[0].bv_val );
-#endif
-                               free( palias.bv_val );
-                               return -1;
-                       }
-
-                       aliased.bv_val = cargv[2];
-                       aliased.bv_len = strlen( cargv[2] );
-
-                       rc = dnPrettyNormal( NULL, &aliased, &paliased, &naliased );
-                       if( rc != LDAP_SUCCESS ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, CRIT, 
-                                       "%s: line %d: aliased DN is invalid.\n", fname, lineno,0 );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: aliased DN is invalid\n",
-                                  fname, lineno, 0 );
-#endif
-                               free( palias.bv_val );
-                               return( 1 );
-                       }
-
-                       tmp_be = select_backend( &naliased, 0, 0 );
-                       free( naliased.bv_val );
-                       if ( tmp_be && tmp_be != be ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( CONFIG, INFO, 
-                                       "%s: line %d: suffixAlias derefs to a different backend "
-                                       "a preceeding backend \"%s\"\n",
-                                       fname, lineno, tmp_be->be_suffix[0].bv_val );
-#else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "%s: line %d: suffixAlias derefs to differnet backend"
-                                       "  a preceeding backend \"%s\"\n",
-                                       fname, lineno, tmp_be->be_suffix[0].bv_val );
-#endif
-                               free( palias.bv_val );
-                               free( paliased.bv_val );
-                               return -1;
-                       }
-
-                       ber_bvarray_add( &be->be_suffixAlias, &palias ); 
-                       ber_bvarray_add( &be->be_suffixAlias, &paliased );
-
                /* set max deref depth */
                } else if ( strcasecmp( cargv[0], "maxDerefDepth" ) == 0 ) {
                                        int i;
@@ -1645,7 +1581,19 @@ read_config( const char *fname, int depth )
 
                /* specify an objectclass */
                } else if ( strcasecmp( cargv[0], "objectclass" ) == 0 ) {
-                       if ( *cargv[1] == '('  /*')'*/) {
+                       if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, INFO, 
+                                       "%s: line %d: illegal objectclass format.\n",
+                                       fname, lineno , 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY,
+                                      "%s: line %d: illegal objectclass format.\n",
+                                      fname, lineno, 0 );
+#endif
+                               return( 1 );
+
+                       } else if ( *cargv[1] == '('  /*')'*/) {
                                char * p;
                                p = strchr(saveline,'(' /*')'*/);
                                rc = parse_oc( fname, lineno, p, cargv );
@@ -1675,7 +1623,19 @@ read_config( const char *fname, int depth )
                } else if (( strcasecmp( cargv[0], "attributetype" ) == 0 )
                        || ( strcasecmp( cargv[0], "attribute" ) == 0 ))
                {
-                       if ( *cargv[1] == '(' /*')'*/) {
+                       if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, INFO, "%s: line %d: "
+                                       "illegal attribute type format.\n",
+                                       fname, lineno , 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY, "%s: line %d: "
+                                       "illegal attribute type format.\n",
+                                       fname, lineno, 0 );
+#endif
+                               return( 1 );
+
+                       } else if ( *cargv[1] == '(' /*')'*/) {
                                char * p;
                                p = strchr(saveline,'(' /*')'*/);
                                rc = parse_at( fname, lineno, p, cargv );
@@ -1694,6 +1654,13 @@ read_config( const char *fname, int depth )
 
                        }
 
+               /* define attribute option(s) */
+               } else if ( strcasecmp( cargv[0], "attributeoptions" ) == 0 ) {
+                       ad_define_option( NULL, NULL, 0 );
+                       for ( i = 1; i < cargc; i++ )
+                               if ( ad_define_option( cargv[i], fname, lineno ) != 0 )
+                                       return 1;
+
                /* turn on/off schema checking */
                } else if ( strcasecmp( cargv[0], "schemacheck" ) == 0 ) {
                        if ( cargc < 2 ) {
@@ -2316,6 +2283,74 @@ read_config( const char *fname, int depth )
 #endif
 #endif /* !SLAPD_RLOOKUPS */
 
+               /* Netscape plugins */
+               } else if ( strcasecmp( cargv[0], "plugin" ) == 0 ) {
+#if defined( LDAP_SLAPI )
+
+#ifdef notdef /* allow global plugins, too */
+                       /*
+                        * a "plugin" line must be inside a database
+                        * definition, since we implement pre-,post- 
+                        * and extended operation plugins
+                        */
+                       if ( be == NULL ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, INFO, 
+                                       "%s: line %d: plugin line must appear "
+                                       "inside a database definition.\n",
+                                       fname, lineno, 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY, "%s: line %d: plugin "
+                                   "line must appear inside a database "
+                                   "definition\n", fname, lineno, 0 );
+#endif
+                               return( 1 );
+                       }
+#endif /* notdef */
+
+                       if ( netscape_plugin( be, fname, lineno, cargc, cargv ) 
+                                       != LDAP_SUCCESS ) {
+                               return( 1 );
+                       }
+
+#else /* !defined( LDAP_SLAPI ) */
+#ifdef NEW_LOGGING
+                       LDAP_LOG( CONFIG, INFO, 
+                               "%s: line %d: SLAPI not supported.\n",
+                               fname, lineno, 0 );
+#else
+                       Debug( LDAP_DEBUG_ANY, "%s: line %d: SLAPI "
+                           "not supported.\n", fname, lineno, 0 );
+#endif
+                       return( 1 );
+                       
+#endif /* !defined( LDAP_SLAPI ) */
+
+               /* Netscape plugins */
+               } else if ( strcasecmp( cargv[0], "pluginlog" ) == 0 ) {
+#if defined( LDAP_SLAPI )
+                       if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG( CONFIG, INFO, 
+                                       "%s: line %d: missing file name "
+                                       "in pluginlog <filename> line.\n",
+                                       fname, lineno, 0 );
+#else
+                               Debug( LDAP_DEBUG_ANY, 
+                                       "%s: line %d: missing file name "
+                                       "in pluginlog <filename> line.\n",
+                                       fname, lineno, 0 );
+#endif
+                               return( 1 );
+                       }
+
+                       if ( slapi_log_file != NULL ) {
+                               ch_free( slapi_log_file );
+                       }
+
+                       slapi_log_file = ch_strdup( cargv[1] );
+#endif /* !defined( LDAP_SLAPI ) */
+
                /* pass anything else to the current backend info/db config routine */
                } else {
                        if ( bi != NULL ) {
@@ -2610,5 +2645,7 @@ config_destroy( )
                free ( slapd_args_file );
        if ( slapd_pid_file )
                free ( slapd_pid_file );
+       if ( default_passwd_hash )
+               free( default_passwd_hash );
        acl_destroy( global_acl, NULL );
 }