X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconfig.c;h=e4d67fedde2e219a18faf43cd42232ae397fc327;hb=04c5711506f17cc7403240c1f335527c6bccaa33;hp=1dfbdf2a98fb66f7a493e2d5f8f99dfe0c590efd;hpb=106eef41d8489ab5e55813f2b995e48884f64e16;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 1dfbdf2a98..e4d67fedde 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -21,7 +21,7 @@ */ 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; @@ -46,10 +46,18 @@ read_config( char *fname ) 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, @@ -121,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 ) { @@ -214,59 +222,14 @@ read_config( char *fname ) char *dn = ch_strdup( cargv[1] ); (void) dn_normalize( dn ); charray_add( &be->be_suffix, dn ); - (void) dn_upcase( 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", @@ -277,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[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 +264,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 */ @@ -343,10 +320,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 ) { @@ -425,16 +402,18 @@ read_config( char *fname ) return( 1 ); } if ( be == NULL ) { - if ( ACL_IS_INVALID(ACL_SET(str2access(cargv[1]), - global_default_access)) ) { + 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 ( ACL_IS_INVALID(ACL_SET(str2access(cargv[1]), - be->be_dfltaccess)) ) { + 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|search|read|write}\n", @@ -495,7 +474,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 */ @@ -598,6 +603,57 @@ read_config( char *fname ) #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 ) {