X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fconfig.c;h=5ffb42cfff054e43c005155d4b0a7be31726f3ad;hb=933908f72f23f9bded8df99fa29ac39ded3435ab;hp=74560b5a46ba50005f03db59c44a0e57ce272aa7;hpb=1d8ae81a0690d54ac6ccd7e70064ab30d6dcd10d;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 74560b5a46..5ffb42cfff 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -11,7 +11,7 @@ #include #include -#include "ldapconfig.h" +#include "ldap_defaults.h" #include "slap.h" #define MAXARGS 100 @@ -21,10 +21,12 @@ */ 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; char *replogfile; int global_lastmod; +int global_idletimeout = 0; +char *global_realm = NULL; char *ldap_srvtab = ""; char *slapd_pid_file = NULL; @@ -40,14 +42,22 @@ int read_config( char *fname ) { FILE *fp; - char *line, *savefname; + char *line, *savefname, *saveline; int cargc, savelineno; char *cargv[MAXARGS]; 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, @@ -59,6 +69,13 @@ read_config( char *fname ) Debug( LDAP_DEBUG_CONFIG, "reading config file %s\n", fname, 0, 0 ); + if ( schema_init( ) != 0 ) { + Debug( LDAP_DEBUG_ANY, + "error initializing the schema\n", + 0, 0, 0 ); + return( 1 ); + } + fp_getline_init( &lineno ); while ( (line = fp_getline( fp, &lineno )) != NULL ) { @@ -69,6 +86,9 @@ read_config( char *fname ) Debug( LDAP_DEBUG_CONFIG, "line %d (%s)\n", lineno, line, 0 ); + /* fp_parse_line is destructive, we save a copy */ + saveline = ch_strdup( line ); + if ( fp_parse_line( line, &cargc, cargv ) != 0 ) { return( 1 ); } @@ -109,7 +129,7 @@ read_config( char *fname ) be = backend_db_init( cargv[1] ); /* assign a default depth limit for alias deref */ - be->be_maxDerefDepth = SLAPD_DEFAULT_MAXDEREFDEPTH; + be->be_max_deref_depth = SLAPD_DEFAULT_MAXDEREFDEPTH; /* get pid file name */ } else if ( strcasecmp( cargv[0], "pidfile" ) == 0 ) { @@ -133,7 +153,28 @@ read_config( char *fname ) slapd_args_file = ch_strdup( cargv[1] ); - /* set size limit */ + /* set DIGEST realm */ + } else if ( strcasecmp( cargv[0], "digest-realm" ) == 0 ) { + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing realm in \"digest-realm \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + if ( be != NULL ) { + be->be_realm = ch_strdup( cargv[1] ); + + } else if ( global_realm != NULL ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: already set global realm!\n", + fname, lineno, 0 ); + return 1; + + } else { + global_realm = ch_strdup( cargv[1] ); + } + + /* set time limit */ } else if ( strcasecmp( cargv[0], "sizelimit" ) == 0 ) { if ( cargc < 2 ) { Debug( LDAP_DEBUG_ANY, @@ -179,58 +220,16 @@ read_config( char *fname ) fname, lineno, 0 ); } else { char *dn = ch_strdup( cargv[1] ); - (void) dn_normalize_case( dn ); + (void) dn_normalize( dn ); charray_add( &be->be_suffix, dn ); + (void) 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 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", @@ -241,9 +240,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[i])) < 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 */ @@ -307,10 +311,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 ) { @@ -343,12 +347,24 @@ read_config( char *fname ) #endif /* specify an objectclass */ } else if ( strcasecmp( cargv[0], "objectclass" ) == 0 ) { - parse_oc( be, fname, lineno, cargc, cargv ); + if ( *cargv[1] == '(' ) { + char * p; + p = strchr(saveline,'('); + parse_oc( fname, lineno, p ); + } else { + parse_oc_old( be, fname, lineno, cargc, cargv ); + } /* specify an attribute */ } else if ( strcasecmp( cargv[0], "attribute" ) == 0 ) { - attr_syntax_config( fname, lineno, cargc - 1, - &cargv[1] ); + if ( *cargv[1] == '(' ) { + char * p; + p = strchr(saveline,'('); + parse_at( fname, lineno, p ); + } else { + attr_syntax_config( fname, lineno, cargc - 1, + &cargv[1] ); + } /* turn on/off schema checking */ } else if ( strcasecmp( cargv[0], "schemacheck" ) == 0 ) { @@ -358,10 +374,10 @@ read_config( char *fname ) fname, lineno, 0 ); return( 1 ); } - if ( strcasecmp( cargv[1], "on" ) == 0 ) { - global_schemacheck = 1; - } else { + if ( strcasecmp( cargv[1], "off" ) == 0 ) { global_schemacheck = 0; + } else { + global_schemacheck = 1; } /* specify access control info */ @@ -377,18 +393,21 @@ read_config( char *fname ) return( 1 ); } if ( be == NULL ) { - if ( (global_default_access = - str2access( cargv[1] )) == -1 ) { + if ( ACL_IS_INVALID(ACL_SET(global_default_access, + str2access(cargv[1]))) ) + { Debug( LDAP_DEBUG_ANY, "%s: line %d: bad access \"%s\" expecting [self]{none|compare|read|write}\n", fname, lineno, cargv[1] ); return( 1 ); } } else { - if ( (be->be_dfltaccess = - str2access( cargv[1] )) == -1 ) { + if ( ACL_IS_INVALID(ACL_SET(be->be_dfltaccess, + 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|compare|search|read|write}\n", fname, lineno, cargv[1] ); return( 1 ); } @@ -421,7 +440,7 @@ read_config( char *fname ) if ( strncasecmp( cargv[i], "host=", 5 ) == 0 ) { charray_add( &be->be_replica, - ch_strdup( cargv[i] + 5 ) ); + cargv[i] + 5 ); break; } } @@ -449,6 +468,27 @@ read_config( char *fname ) (void) dn_normalize_case( be->be_update_ndn ); } + } 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 */ } else if ( strcasecmp( cargv[0], "replogfile" ) == 0 ) { if ( cargc < 2 ) { @@ -483,6 +523,27 @@ read_config( char *fname ) global_lastmod = OFF; } + /* set idle timeout value */ + } else if ( strcasecmp( cargv[0], "idletimeout" ) == 0 ) { + int i; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing timeout value in \"idletimeout \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + + i = atoi( cargv[1] ); + + if( i < 0 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: timeout value (%d) invalid \"idletimeout \" line\n", + fname, lineno, i ); + return( 1 ); + } + + global_idletimeout = i; + /* include another config file */ } else if ( strcasecmp( cargv[0], "include" ) == 0 ) { if ( cargc < 2 ) { @@ -511,10 +572,78 @@ read_config( char *fname ) } ldap_srvtab = ch_strdup( cargv[1] ); +#ifdef SLAPD_MODULES + } else if (strcasecmp( cargv[0], "loadmodule") == 0 ) { + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing filename in \"loadmodule \" line\n", + fname, lineno, 0 ); + exit( 1 ); + } + if (!load_module(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 ); + } + +#endif /*SLAPD_MODULES*/ + +#ifdef HAVE_TLS + } 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], "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 */ } else { if ( bi != NULL ) { - if (bi->bi_config == NULL) { + if ( bi->bi_config == 0 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: unknown directive \"%s\" inside backend info definition (ignored)\n", fname, lineno, cargv[0] ); @@ -526,7 +655,7 @@ read_config( char *fname ) } } } else if ( be != NULL ) { - if ( be->be_config == NULL ) { + if ( be->be_config == 0 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: unknown directive \"%s\" inside backend database definition (ignored)\n", fname, lineno, cargv[0] ); @@ -543,6 +672,7 @@ read_config( char *fname ) fname, lineno, cargv[0] ); } } + free( saveline ); } fclose( fp ); return( 0 );