X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconfig.c;h=493045cdf2dfe24ad6494fe0a107b042170c8613;hb=e642a1b9cdcfcb6f0c1b1737d5eba0b60cf4fca9;hp=f95adad34f283521715b6713994a0e875f6efc3f;hpb=d92c7c1c7d3226a8671b59c1fd20ae49ee62f43b;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index f95adad34f..493045cdf2 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -1,4 +1,9 @@ /* config.c - configuration file handling routines */ +/* $OpenLDAP$ */ +/* + * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ #include "portable.h" @@ -11,7 +16,7 @@ #include #include -#include "ldap_defaults.h" +#include "ldap_pvt.h" #include "slap.h" #define MAXARGS 100 @@ -21,10 +26,11 @@ */ int defsize = SLAPD_DEFAULT_SIZELIMIT; int deftime = SLAPD_DEFAULT_TIMELIMIT; -struct acl *global_acl = NULL; +AccessControl *global_acl = NULL; int global_default_access = ACL_READ; +int global_readonly = 0; char *replogfile; -int global_lastmod; +int global_lastmod = ON; int global_idletimeout = 0; char *global_realm = NULL; char *ldap_srvtab = ""; @@ -39,17 +45,25 @@ static int fp_parse_line(char *line, int *argcp, char **argv); static char *strtok_quote(char *line, char *sep); int -read_config( char *fname ) +read_config( const char *fname ) { FILE *fp; char *line, *savefname, *saveline; int cargc, savelineno; char *cargv[MAXARGS]; - int lineno, i, rc; + int lineno, i; +#ifdef HAVE_TLS + int rc; +#endif + struct berval *vals[2]; + struct berval val; static BackendInfo *bi = NULL; static BackendDB *be = NULL; + vals[0] = &val; + vals[1] = NULL; + if ( (fp = fopen( fname, "r" )) == NULL ) { ldap_syslog = 1; Debug( LDAP_DEBUG_ANY, @@ -120,9 +134,6 @@ read_config( char *fname ) bi = NULL; be = backend_db_init( cargv[1] ); - /* assign a default depth limit for alias deref */ - be->be_maxDerefDepth = SLAPD_DEFAULT_MAXDEREFDEPTH; - /* get pid file name */ } else if ( strcasecmp( cargv[0], "pidfile" ) == 0 ) { if ( cargc < 2 ) { @@ -196,6 +207,7 @@ read_config( char *fname ) /* set database suffix */ } else if ( strcasecmp( cargv[0], "suffix" ) == 0 ) { + Backend *tmp_be; if ( cargc < 2 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: missing dn in \"suffix \" line\n", @@ -210,63 +222,80 @@ read_config( char *fname ) Debug( LDAP_DEBUG_ANY, "%s: line %d: suffix line must appear inside a database definition (ignored)\n", fname, lineno, 0 ); + } else if ( ( tmp_be = select_backend( cargv[1] ) ) == be ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: suffix already served by this backend (ignored)\n", + fname, lineno, 0 ); + } else if ( tmp_be != NULL ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: suffix already served by a preceeding backend \"%s\" (ignored)\n", + fname, lineno, tmp_be->be_suffix[0] ); } else { char *dn = ch_strdup( cargv[1] ); (void) dn_normalize( dn ); charray_add( &be->be_suffix, dn ); - (void) dn_upcase( dn ); + (void) ldap_pvt_str2upper( dn ); charray_add( &be->be_nsuffix, dn ); free( dn ); } - /* set database suffixAlias */ - } else if ( strcasecmp( cargv[0], "suffixAlias" ) == 0 ) { - if ( cargc < 2 ) { - Debug( LDAP_DEBUG_ANY, - "%s: line %d: missing alias and aliased_dn in \"suffixAlias \" line\n", - fname, lineno, 0 ); - return( 1 ); - } else if ( cargc < 3 ) { - Debug( LDAP_DEBUG_ANY, - "%s: line %d: missing aliased_dn in \"suffixAlias \" line\n", - fname, lineno, 0 ); - return( 1 ); - } else if ( cargc > 3 ) { - Debug( LDAP_DEBUG_ANY, - "%s: line %d: extra cruft in suffixAlias line (ignored)\n", - fname, lineno, 0 ); - } - if ( be == NULL ) { - Debug( LDAP_DEBUG_ANY, -"%s: line %d: suffixAlias line must appear inside a database definition (ignored)\n", - fname, lineno, 0 ); - } else { - char *alias, *aliased_dn; - - alias = ch_strdup( cargv[1] ); - (void) dn_normalize( alias ); - - aliased_dn = ch_strdup( cargv[2] ); - (void) dn_normalize( aliased_dn ); - - - if ( strcasecmp( alias, aliased_dn) == 0 ) { - Debug( LDAP_DEBUG_ANY, -"%s: line %d: suffixAlias %s is not different from aliased dn (ignored)\n", - fname, lineno, alias ); - } else { - (void) dn_normalize_case( alias ); - (void) dn_normalize_case( aliased_dn ); - charray_add( &be->be_suffixAlias, alias ); - charray_add( &be->be_suffixAlias, aliased_dn ); - } - - free(alias); - free(aliased_dn); - } + /* set database suffixAlias */ + } else if ( strcasecmp( cargv[0], "suffixAlias" ) == 0 ) { + Backend *tmp_be; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: missing alias and aliased_dn in \"suffixAlias \" line\n", + fname, lineno, 0 ); + return( 1 ); + } else if ( cargc < 3 ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: missing aliased_dn in \"suffixAlias \" line\n", + fname, lineno, 0 ); + return( 1 ); + } else if ( cargc > 3 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: extra cruft in suffixAlias line (ignored)\n", + fname, lineno, 0 ); + } + + if ( be == NULL ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: suffixAlias line" + " must appear inside a database definition (ignored)\n", + fname, lineno, 0 ); + } else if ( (tmp_be = select_backend( cargv[1] )) != NULL ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: suffixAlias served by" + " a preceeding backend \"%s\" (ignored)\n", + fname, lineno, tmp_be->be_suffix[0] ); + + } else if ( (tmp_be = select_backend( cargv[2] )) != NULL ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: suffixAlias derefs to differnet backend" + " a preceeding backend \"%s\" (ignored)\n", + fname, lineno, tmp_be->be_suffix[0] ); + + } else { + char *alias, *aliased_dn; + + alias = ch_strdup( cargv[1] ); + (void) dn_normalize( alias ); + + aliased_dn = ch_strdup( cargv[2] ); + (void) dn_normalize( aliased_dn ); + + (void) dn_normalize_case( alias ); + (void) dn_normalize_case( aliased_dn ); + charray_add( &be->be_suffixAlias, alias ); + charray_add( &be->be_suffixAlias, aliased_dn ); + + free(alias); + free(aliased_dn); + } /* set max deref depth */ } else if ( strcasecmp( cargv[0], "maxDerefDepth" ) == 0 ) { + int i; if ( cargc < 2 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: missing depth in \"maxDerefDepth \" line\n", @@ -277,9 +306,14 @@ read_config( char *fname ) Debug( LDAP_DEBUG_ANY, "%s: line %d: depth line must appear inside a database definition (ignored)\n", fname, lineno, 0 ); + } else if ((i = atoi(cargv[1])) < 0) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: depth must be positive (ignored)\n", + fname, lineno, 0 ); + } else { - be->be_maxDerefDepth = atoi (cargv[1]); - } + be->be_max_deref_depth = i; + } /* set magic "root" dn for this database */ @@ -296,7 +330,16 @@ read_config( char *fname ) fname, lineno, 0 ); } else { be->be_root_dn = ch_strdup( cargv[1] ); - be->be_root_ndn = dn_normalize_case( ch_strdup( cargv[1] ) ); + be->be_root_ndn = ch_strdup( cargv[1] ); + + if( dn_normalize_case( be->be_root_ndn ) == NULL ) { + free( be->be_root_dn ); + free( be->be_root_ndn ); + Debug( LDAP_DEBUG_ANY, +"%s: line %d: rootdn DN is invalid\n", + fname, lineno, 0 ); + return( 1 ); + } } /* set super-secret magic database password */ @@ -324,9 +367,7 @@ read_config( char *fname ) return( 1 ); } if ( be == NULL ) { - Debug( LDAP_DEBUG_ANY, -"%s: line %d: readonly line must appear inside a database definition (ignored)\n", - fname, lineno, 0 ); + global_readonly = (strcasecmp( cargv[1], "on" ) == 0); } else { if ( strcasecmp( cargv[1], "on" ) == 0 ) { be->be_readonly = 1; @@ -343,10 +384,10 @@ read_config( char *fname ) fname, lineno, 0 ); return( 1 ); } - default_referral = (char *) ch_malloc( strlen( cargv[1] ) - + sizeof("Referral:\n") + 1 ); - strcpy( default_referral, "Referral:\n" ); - strcat( default_referral, cargv[1] ); + + vals[0]->bv_val = cargv[1]; + vals[0]->bv_len = strlen( vals[0]->bv_val ); + value_add( &default_referral, vals ); /* specify locale */ } else if ( strcasecmp( cargv[0], "locale" ) == 0 ) { @@ -377,12 +418,15 @@ read_config( char *fname ) fname, lineno, 0 ); return( 1 ); #endif + /* specify an Object Identifier macro */ + } else if ( strcasecmp( cargv[0], "objectidentifier" ) == 0 ) { + parse_oidm( fname, lineno, cargc, cargv ); /* specify an objectclass */ } else if ( strcasecmp( cargv[0], "objectclass" ) == 0 ) { if ( *cargv[1] == '(' ) { char * p; p = strchr(saveline,'('); - parse_oc( fname, lineno, p ); + parse_oc( fname, lineno, p, cargv ); } else { parse_oc_old( be, fname, lineno, cargc, cargv ); } @@ -392,7 +436,7 @@ read_config( char *fname ) if ( *cargv[1] == '(' ) { char * p; p = strchr(saveline,'('); - parse_at( fname, lineno, p ); + parse_at( fname, lineno, p, cargv ); } else { attr_syntax_config( fname, lineno, cargc - 1, &cargv[1] ); @@ -429,7 +473,7 @@ read_config( char *fname ) str2access(cargv[1]))) ) { Debug( LDAP_DEBUG_ANY, -"%s: line %d: bad access \"%s\" expecting [self]{none|compare|read|write}\n", +"%s: line %d: bad access \"%s\" expecting [self]{none|auth|compare|search|read|write}\n", fname, lineno, cargv[1] ); return( 1 ); } @@ -439,7 +483,7 @@ read_config( char *fname ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: bad access \"%s\", " - "expecting [self]{none|compare|search|read|write}\n", + "expecting [self]{none|auth|compare|search|read|write}\n", fname, lineno, cargv[1] ); return( 1 ); } @@ -497,7 +541,33 @@ read_config( char *fname ) fname, lineno, 0 ); } else { be->be_update_ndn = ch_strdup( cargv[1] ); - (void) dn_normalize_case( be->be_update_ndn ); + if( dn_normalize_case( be->be_update_ndn ) == NULL ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: updatedn DN is invalid\n", + fname, lineno, 0 ); + return 1; + } + } + + } else if ( strcasecmp( cargv[0], "updateref" ) == 0 ) { + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing dn in \"updateref \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + if ( be == NULL ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: updateref line must appear inside a database definition (ignored)\n", + fname, lineno, 0 ); + } else if ( be->be_update_ndn == NULL ) { + Debug( LDAP_DEBUG_ANY, +"%s: line %d: updateref line must after updatedn (ignored)\n", + fname, lineno, 0 ); + } else { + vals[0]->bv_val = cargv[1]; + vals[0]->bv_len = strlen( vals[0]->bv_val ); + value_add( &be->be_update_refs, vals ); } /* replication log file to which changes are appended */ @@ -584,36 +654,84 @@ read_config( char *fname ) ldap_srvtab = ch_strdup( cargv[1] ); #ifdef SLAPD_MODULES - } else if (strcasecmp( cargv[0], "loadmodule") == 0 ) { + } else if (strcasecmp( cargv[0], "moduleload") == 0 ) { if ( cargc < 2 ) { Debug( LDAP_DEBUG_ANY, - "%s: line %d: missing filename in \"loadmodule \" line\n", + "%s: line %d: missing filename in \"moduleload \" line\n", fname, lineno, 0 ); - exit( 1 ); + exit( EXIT_FAILURE ); } - if (!load_module(cargv[1], cargc - 2, (cargc > 2) ? cargv + 2 : NULL)) { + if (module_load(cargv[1], cargc - 2, (cargc > 2) ? cargv + 2 : NULL)) { Debug( LDAP_DEBUG_ANY, "%s: line %d: failed to load or initialize module %s\n", fname, lineno, cargv[1]); - exit( 1 ); + exit( EXIT_FAILURE ); + } + } else if (strcasecmp( cargv[0], "modulepath") == 0 ) { + if ( cargc != 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing path in \"modulepath \" line\n", + fname, lineno, 0 ); + exit( EXIT_FAILURE ); + } + if (module_path( cargv[1] )) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: failed to set module search path to %s\n", + fname, lineno, cargv[1]); + exit( EXIT_FAILURE ); } #endif /*SLAPD_MODULES*/ #ifdef HAVE_TLS - } else if ( !strcasecmp( cargv[0], "SSLCertificateFile" ) ) { + } else if ( !strcasecmp( cargv[0], "TLSProtocol" ) ) { + rc = ldap_pvt_tls_set_option( NULL, + LDAP_OPT_X_TLS_PROTOCOL, + cargv[1] ); + if ( rc ) + return rc; + + } else if ( !strcasecmp( cargv[0], "TLSCipherSuite" ) ) { + rc = ldap_pvt_tls_set_option( NULL, + LDAP_OPT_X_TLS_CIPHER_SUITE, + cargv[1] ); + if ( rc ) + return rc; + + } else if ( !strcasecmp( cargv[0], "TLSCertificateFile" ) ) { rc = ldap_pvt_tls_set_option( NULL, LDAP_OPT_X_TLS_CERTFILE, cargv[1] ); if ( rc ) return rc; - } else if ( !strcasecmp( cargv[0], "SSLCertificateKeyFile" ) ) { + } else if ( !strcasecmp( cargv[0], "TLSCertificateKeyFile" ) ) { rc = ldap_pvt_tls_set_option( NULL, LDAP_OPT_X_TLS_KEYFILE, cargv[1] ); if ( rc ) return rc; + + } else if ( !strcasecmp( cargv[0], "TLSCACertificatePath" ) ) { + rc = ldap_pvt_tls_set_option( NULL, + LDAP_OPT_X_TLS_CACERTDIR, + cargv[1] ); + if ( rc ) + return rc; + + } else if ( !strcasecmp( cargv[0], "TLSCACertificateFile" ) ) { + rc = ldap_pvt_tls_set_option( NULL, + LDAP_OPT_X_TLS_CACERTFILE, + cargv[1] ); + if ( rc ) + return rc; + } else if ( !strcasecmp( cargv[0], "TLSVerifyClient" ) ) { + rc = ldap_pvt_tls_set_option( NULL, + LDAP_OPT_X_TLS_REQUIRE_CERT, + cargv[1] ); + if ( rc ) + return rc; + #endif /* pass anything else to the current backend info/db config routine */