]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/config.c
URIs need to be between double quotes
[openldap] / servers / slapd / back-ldap / config.c
index 14a44a51ed99627ab7e4d495fe752d3d52d3059a..1bbcf7dacf6af575de4bb983cc0553ce6caa96cb 100644 (file)
@@ -295,8 +295,8 @@ static ConfigOCs ldapocs[] = {
                "NAME 'olcLDAPConfig' "
                "DESC 'LDAP backend configuration' "
                "SUP olcDatabaseConfig "
-               "MUST olcDbURI "
-               "MAY ( olcDbStartTLS "
+               "MAY ( olcDbURI "
+                       "$ olcDbStartTLS "
                        "$ olcDbACLAuthcDn "
                        "$ olcDbACLPasswd "
                        "$ olcDbACLBind "
@@ -351,11 +351,22 @@ static slap_verbmasks cancel_mode[] = {
        { BER_BVNULL,                   0 }
 };
 
+/* see enum in slap.h */
 static slap_cf_aux_table timeout_table[] = {
-       { BER_BVC("add="), 0 * sizeof( time_t ), 'u', 0, NULL },
-       { BER_BVC("delete="), 1 * sizeof( time_t ), 'u', 0, NULL },
-       { BER_BVC("modify="), 2 * sizeof( time_t ), 'u', 0, NULL },
-       { BER_BVC("modrdn="), 3 * sizeof( time_t ), 'u', 0, NULL },
+       { BER_BVC("bind="),     SLAP_OP_BIND * sizeof( time_t ),        'u', 0, NULL },
+       /* unbind makes no sense */
+       { BER_BVC("add="),      SLAP_OP_ADD * sizeof( time_t ),         'u', 0, NULL },
+       { BER_BVC("delete="),   SLAP_OP_DELETE * sizeof( time_t ),      'u', 0, NULL },
+       { BER_BVC("modrdn="),   SLAP_OP_MODRDN * sizeof( time_t ),      'u', 0, NULL },
+       { BER_BVC("modify="),   SLAP_OP_MODIFY * sizeof( time_t ),      'u', 0, NULL },
+       { BER_BVC("compare="),  SLAP_OP_COMPARE * sizeof( time_t ),     'u', 0, NULL },
+#if 0  /* uses timelimit instead */
+       { BER_BVC("search="),   SLAP_OP_SEARCH * sizeof( time_t ),      'u', 0, NULL },
+#endif
+       /* abandon makes little sense */
+#if 0  /* not implemented yet */
+       { BER_BVC("extended="), SLAP_OP_EXTENDED * sizeof( time_t ),    'u', 0, NULL },
+#endif
        { BER_BVNULL, 0, 0, 0, NULL }
 };
 
@@ -512,6 +523,181 @@ slap_retry_info_destroy(
        ri->ri_num = NULL;
 }
 
+static int
+slap_idassert_authzfrom_parse( ConfigArgs *c, slap_idassert_t *si )
+{
+       struct berval   bv;
+       struct berval   in;
+       int             rc;
+
+       ber_str2bv( c->argv[ 1 ], 0, 0, &in );
+       rc = authzNormalize( 0, NULL, NULL, &in, &bv, NULL );
+       if ( rc != LDAP_SUCCESS ) {
+               snprintf( c->msg, sizeof( c->msg ),
+                       "\"idassert-authzFrom <authz>\": "
+                       "invalid syntax" );
+               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+               return 1;
+       }
+       ber_bvarray_add( &si->si_authz, &bv );
+
+       return 0;
+}
+
+static int
+slap_idassert_parse( ConfigArgs *c, slap_idassert_t *si )
+{
+       int             i;
+
+       for ( i = 1; i < c->argc; i++ ) {
+               if ( strncasecmp( c->argv[ i ], "mode=", STRLENOF( "mode=" ) ) == 0 ) {
+                       char    *argvi = c->argv[ i ] + STRLENOF( "mode=" );
+                       int     j;
+
+                       j = verb_to_mask( argvi, idassert_mode );
+                       if ( BER_BVISNULL( &idassert_mode[ j ].word ) ) {
+                               snprintf( c->msg, sizeof( c->msg ),
+                                       "\"idassert-bind <args>\": "
+                                       "unknown mode \"%s\"",
+                                       argvi );
+                               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                               return 1;
+                       }
+
+                       si->si_mode = idassert_mode[ j ].mask;
+
+               } else if ( strncasecmp( c->argv[ i ], "authz=", STRLENOF( "authz=" ) ) == 0 ) {
+                       char    *argvi = c->argv[ i ] + STRLENOF( "authz=" );
+
+                       if ( strcasecmp( argvi, "native" ) == 0 ) {
+                               if ( si->si_bc.sb_method != LDAP_AUTH_SASL ) {
+                                       snprintf( c->msg, sizeof( c->msg ),
+                                               "\"idassert-bind <args>\": "
+                                               "authz=\"native\" incompatible "
+                                               "with auth method" );
+                                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                                       return 1;
+                               }
+                               si->si_flags |= LDAP_BACK_AUTH_NATIVE_AUTHZ;
+
+                       } else if ( strcasecmp( argvi, "proxyAuthz" ) == 0 ) {
+                               si->si_flags &= ~LDAP_BACK_AUTH_NATIVE_AUTHZ;
+
+                       } else {
+                               snprintf( c->msg, sizeof( c->msg ),
+                                       "\"idassert-bind <args>\": "
+                                       "unknown authz \"%s\"",
+                                       argvi );
+                               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                               return 1;
+                       }
+
+               } else if ( strncasecmp( c->argv[ i ], "flags=", STRLENOF( "flags=" ) ) == 0 ) {
+                       char    *argvi = c->argv[ i ] + STRLENOF( "flags=" );
+                       char    **flags = ldap_str2charray( argvi, "," );
+                       int     j, err = 0;
+
+                       if ( flags == NULL ) {
+                               snprintf( c->msg, sizeof( c->msg ),
+                                       "\"idassert-bind <args>\": "
+                                       "unable to parse flags \"%s\"",
+                                       argvi );
+                               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                               return 1;
+                       }
+
+                       for ( j = 0; flags[ j ] != NULL; j++ ) {
+
+                               if ( strcasecmp( flags[ j ], "override" ) == 0 ) {
+                                       si->si_flags |= LDAP_BACK_AUTH_OVERRIDE;
+
+                               } else if ( strcasecmp( flags[ j ], "prescriptive" ) == 0 ) {
+                                       si->si_flags |= LDAP_BACK_AUTH_PRESCRIPTIVE;
+
+                               } else if ( strcasecmp( flags[ j ], "non-prescriptive" ) == 0 ) {
+                                       si->si_flags &= ( ~LDAP_BACK_AUTH_PRESCRIPTIVE );
+
+                               } else if ( strcasecmp( flags[ j ], "obsolete-proxy-authz" ) == 0 ) {
+                                       if ( si->si_flags & LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND ) {
+                                               Debug( LDAP_DEBUG_ANY,
+                                                               "%s: \"obsolete-proxy-authz\" flag "
+                                                               "in \"idassert-mode <args>\" "
+                                                               "incompatible with previously issued \"obsolete-encoding-workaround\" flag.\n",
+                                                               c->log, 0, 0 );
+                                               err = 1;
+                                               break;
+
+                                       } else {
+                                               si->si_flags |= LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ;
+                                       }
+
+                               } else if ( strcasecmp( flags[ j ], "obsolete-encoding-workaround" ) == 0 ) {
+                                       if ( si->si_flags & LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ ) {
+                                               Debug( LDAP_DEBUG_ANY,
+                                                               "%s: \"obsolete-encoding-workaround\" flag "
+                                                               "in \"idassert-mode <args>\" "
+                                                               "incompatible with previously issued \"obsolete-proxy-authz\" flag.\n",
+                                                               c->log, 0, 0 );
+                                               err = 1;
+                                               break;
+
+                                       } else {
+                                               si->si_flags |= LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND;
+                                       }
+
+                               } else {
+                                       snprintf( c->msg, sizeof( c->msg ),
+                                               "\"idassert-bind <args>\": "
+                                               "unknown flag \"%s\"",
+                                               flags[ j ] );
+                                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                                       err = 1;
+                                       break;
+                               }
+                       }
+
+                       ldap_charray_free( flags );
+                       if ( err ) {
+                               return 1;
+                       }
+
+               } else if ( bindconf_parse( c->argv[ i ], &si->si_bc ) ) {
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+/* NOTE: temporary, until back-meta is ported to back-config */
+int
+slap_idassert_authzfrom_parse_cf( const char *fname, int lineno, const char *arg, slap_idassert_t *si )
+{
+       ConfigArgs      c = { 0 };
+       char            *argv[ 3 ];
+
+       snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );
+       c.argc = 2;
+       c.argv = argv;
+       argv[ 0 ] = "idassert-authzFrom";
+       argv[ 1 ] = (char *)arg;
+       argv[ 2 ] = NULL;
+
+       return slap_idassert_authzfrom_parse( &c, si );
+}
+
+int
+slap_idassert_parse_cf( const char *fname, int lineno, int argc, char *argv[], slap_idassert_t *si )
+{
+       ConfigArgs      c = { 0 };
+
+       snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );
+       c.argc = argc;
+       c.argv = argv;
+
+       return slap_idassert_parse( &c, si );
+}
+
 static int
 ldap_back_cf_gen( ConfigArgs *c )
 {
@@ -529,10 +715,14 @@ ldap_back_cf_gen( ConfigArgs *c )
                switch( c->type ) {
                case LDAP_BACK_CFG_URI:
                        if ( li->li_uri != NULL ) {
-                               struct berval   bv;
+                               struct berval   bv, bv2;
 
                                ber_str2bv( li->li_uri, 0, 0, &bv );
-                               value_add_one( &c->rvalue_vals, &bv );
+                               bv2.bv_len = bv.bv_len + STRLENOF( "\"\"" );
+                               bv2.bv_val = ch_malloc( bv2.bv_len + 1 );
+                               snprintf( bv2.bv_val, bv2.bv_len + 1,
+                                       "\"%s\"", bv.bv_val );
+                               ber_bvarray_add( &c->rvalue_vals, &bv2 );
 
                        } else {
                                rc = 1;
@@ -689,7 +879,7 @@ ldap_back_cf_gen( ConfigArgs *c )
                                /* end-of-flags */
                        }
 
-                       bindconf_unparse( &li->li_idassert, &bc );
+                       bindconf_unparse( &li->li_idassert.si_bc, &bc );
 
                        if ( !BER_BVISNULL( &bv ) ) {
                                ber_len_t       len = bv.bv_len + bc.bv_len;
@@ -746,13 +936,13 @@ ldap_back_cf_gen( ConfigArgs *c )
                case LDAP_BACK_CFG_TIMEOUT:
                        BER_BVZERO( &bv );
 
-                       for ( i = 0; i < LDAP_BACK_OP_LAST; i++ ) {
+                       for ( i = 0; i < SLAP_OP_LAST; i++ ) {
                                if ( li->li_timeout[ i ] != 0 ) {
                                        break;
                                }
                        }
 
-                       if ( i == LDAP_BACK_OP_LAST ) {
+                       if ( i == SLAP_OP_LAST ) {
                                return 1;
                        }
 
@@ -912,7 +1102,7 @@ ldap_back_cf_gen( ConfigArgs *c )
                        break;
 
                case LDAP_BACK_CFG_IDASSERT_BIND:
-                       bindconf_free( &li->li_idassert );
+                       bindconf_free( &li->li_idassert.si_bc );
                        break;
 
                case LDAP_BACK_CFG_REBIND:
@@ -924,7 +1114,7 @@ ldap_back_cf_gen( ConfigArgs *c )
                        break;
 
                case LDAP_BACK_CFG_TIMEOUT:
-                       for ( i = 0; i < LDAP_BACK_OP_LAST; i++ ) {
+                       for ( i = 0; i < SLAP_OP_LAST; i++ ) {
                                li->li_timeout[ i ] = 0;
                        }
                        break;
@@ -1315,22 +1505,9 @@ done_url:;
                ber_str2bv( c->argv[ 1 ], 0, 1, &li->li_idassert_passwd );
                break;
 
-       case LDAP_BACK_CFG_IDASSERT_AUTHZFROM: {
-               struct berval   bv;
-               struct berval   in;
-               int             rc;
-
-               ber_str2bv( c->argv[ 1 ], 0, 0, &in );
-               rc = authzNormalize( 0, NULL, NULL, &in, &bv, NULL );
-               if ( rc != LDAP_SUCCESS ) {
-                       snprintf( c->msg, sizeof( c->msg ),
-                               "\"idassert-authzFrom <authz>\": "
-                               "invalid syntax" );
-                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
-                       return 1;
-               }
-               ber_bvarray_add( &li->li_idassert_authz, &bv );
-               } break;
+       case LDAP_BACK_CFG_IDASSERT_AUTHZFROM:
+               rc = slap_idassert_authzfrom_parse( c, &li->li_idassert );
+               break;
 
        case LDAP_BACK_CFG_IDASSERT_METHOD:
                /* no longer supported */
@@ -1341,122 +1518,7 @@ done_url:;
                return 1;
 
        case LDAP_BACK_CFG_IDASSERT_BIND:
-               for ( i = 1; i < c->argc; i++ ) {
-                       if ( strncasecmp( c->argv[ i ], "mode=", STRLENOF( "mode=" ) ) == 0 ) {
-                               char    *argvi = c->argv[ i ] + STRLENOF( "mode=" );
-                               int     j;
-
-                               j = verb_to_mask( argvi, idassert_mode );
-                               if ( BER_BVISNULL( &idassert_mode[ j ].word ) ) {
-                                       snprintf( c->msg, sizeof( c->msg ),
-                                               "\"idassert-bind <args>\": "
-                                               "unknown mode \"%s\"",
-                                               argvi );
-                                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
-                                       return 1;
-                               }
-
-                               li->li_idassert_mode = idassert_mode[ j ].mask;
-
-                       } else if ( strncasecmp( c->argv[ i ], "authz=", STRLENOF( "authz=" ) ) == 0 ) {
-                               char    *argvi = c->argv[ i ] + STRLENOF( "authz=" );
-
-                               if ( strcasecmp( argvi, "native" ) == 0 ) {
-                                       if ( li->li_idassert_authmethod != LDAP_AUTH_SASL ) {
-                                               snprintf( c->msg, sizeof( c->msg ),
-                                                       "\"idassert-bind <args>\": "
-                                                       "authz=\"native\" incompatible "
-                                                       "with auth method" );
-                                               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
-                                               return 1;
-                                       }
-                                       li->li_idassert_flags |= LDAP_BACK_AUTH_NATIVE_AUTHZ;
-
-                               } else if ( strcasecmp( argvi, "proxyAuthz" ) == 0 ) {
-                                       li->li_idassert_flags &= ~LDAP_BACK_AUTH_NATIVE_AUTHZ;
-
-                               } else {
-                                       snprintf( c->msg, sizeof( c->msg ),
-                                               "\"idassert-bind <args>\": "
-                                               "unknown authz \"%s\"",
-                                               argvi );
-                                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
-                                       return 1;
-                               }
-
-                       } else if ( strncasecmp( c->argv[ i ], "flags=", STRLENOF( "flags=" ) ) == 0 ) {
-                               char    *argvi = c->argv[ i ] + STRLENOF( "flags=" );
-                               char    **flags = ldap_str2charray( argvi, "," );
-                               int     j, err = 0;
-
-                               if ( flags == NULL ) {
-                                       snprintf( c->msg, sizeof( c->msg ),
-                                               "\"idassert-bind <args>\": "
-                                               "unable to parse flags \"%s\"",
-                                               argvi );
-                                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
-                                       return 1;
-                               }
-
-                               for ( j = 0; flags[ j ] != NULL; j++ ) {
-
-                                       if ( strcasecmp( flags[ j ], "override" ) == 0 ) {
-                                               li->li_idassert_flags |= LDAP_BACK_AUTH_OVERRIDE;
-
-                                       } else if ( strcasecmp( flags[ j ], "prescriptive" ) == 0 ) {
-                                               li->li_idassert_flags |= LDAP_BACK_AUTH_PRESCRIPTIVE;
-
-                                       } else if ( strcasecmp( flags[ j ], "non-prescriptive" ) == 0 ) {
-                                               li->li_idassert_flags &= ( ~LDAP_BACK_AUTH_PRESCRIPTIVE );
-
-                                       } else if ( strcasecmp( flags[ j ], "obsolete-proxy-authz" ) == 0 ) {
-                                               if ( li->li_idassert_flags & LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND ) {
-                                                       Debug( LDAP_DEBUG_ANY,
-                                                                       "%s: line %d: \"obsolete-proxy-authz\" flag "
-                                                                       "in \"idassert-mode <args>\" "
-                                                                       "incompatible with previously issued \"obsolete-encoding-workaround\" flag.\n",
-                                                                       c->fname, c->lineno, 0 );
-                                                       err = 1;
-                                                       break;
-
-                                               } else {
-                                                       li->li_idassert_flags |= LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ;
-                                               }
-
-                                       } else if ( strcasecmp( flags[ j ], "obsolete-encoding-workaround" ) == 0 ) {
-                                               if ( li->li_idassert_flags & LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ ) {
-                                                       Debug( LDAP_DEBUG_ANY,
-                                                                       "%s: line %d: \"obsolete-encoding-workaround\" flag "
-                                                               "in \"idassert-mode <args>\" "
-                                                               "incompatible with previously issued \"obsolete-proxy-authz\" flag.\n",
-                                                               c->fname, c->lineno, 0 );
-                                                       err = 1;
-                                                       break;
-
-                                               } else {
-                                                       li->li_idassert_flags |= LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND;
-                                               }
-
-                                       } else {
-                                               snprintf( c->msg, sizeof( c->msg ),
-                                                       "\"idassert-bind <args>\": "
-                                                       "unknown flag \"%s\"",
-                                                       flags[ j ] );
-                                               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
-                                               err = 1;
-                                               break;
-                                       }
-                               }
-
-                               ldap_charray_free( flags );
-                               if ( err ) {
-                                       return 1;
-                               }
-
-                       } else if ( bindconf_parse( c->argv[ i ], &li->li_idassert ) ) {
-                               return 1;
-                       }
-               }
+               rc = slap_idassert_parse( c, &li->li_idassert );
                break;
 
        case LDAP_BACK_CFG_REBIND:
@@ -1491,6 +1553,7 @@ done_url:;
                        && mask == LDAP_BACK_F_T_F_DISCOVER
                        && !LDAP_BACK_T_F( li ) )
                {
+                       slap_bindconf   sb = { 0 };
                        int             rc;
 
                        if ( li->li_uri == NULL ) {
@@ -1501,7 +1564,12 @@ done_url:;
                                return 1;
                        }
 
-                       rc = slap_discover_feature( li->li_uri, li->li_version,
+                       ber_str2bv( li->li_uri, 0, 0, &sb.sb_uri );
+                       sb.sb_version = li->li_version;
+                       sb.sb_method = LDAP_AUTH_SIMPLE;
+                       BER_BVSTR( &sb.sb_binddn, "" );
+
+                       rc = slap_discover_feature( &sb,
                                        slap_schema.si_ad_supportedFeatures->ad_cname.bv_val,
                                        LDAP_FEATURE_ABSOLUTE_FILTERS );
                        if ( rc == LDAP_COMPARE_TRUE ) {
@@ -1531,10 +1599,14 @@ done_url:;
                                unsigned        u;
 
                                if ( lutil_atoux( &u, c->argv[ i ], 0 ) != 0 ) {
+                                       snprintf( c->msg, sizeof( c->msg),
+                                               "unable to parse timeout \"%s\"",
+                                               c->argv[ i ] );
+                                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
                                        return 1;
                                }
 
-                               for ( j = 0; j < LDAP_BACK_OP_LAST; j++ ) {
+                               for ( j = 0; j < SLAP_OP_LAST; j++ ) {
                                        li->li_timeout[ j ] = u;
                                }
 
@@ -1542,6 +1614,10 @@ done_url:;
                        }
 
                        if ( slap_cf_aux_table_parse( c->argv[ i ], li->li_timeout, timeout_table, "slapd-ldap timeout" ) ) {
+                               snprintf( c->msg, sizeof( c->msg),
+                                       "unable to parse timeout \"%s\"",
+                                       c->argv[ i ] );
+                               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
                                return 1;
                        }
                }
@@ -1622,6 +1698,7 @@ done_url:;
                        && mask == LDAP_BACK_F_CANCEL_EXOP_DISCOVER
                        && !LDAP_BACK_CANCEL( li ) )
                {
+                       slap_bindconf   sb = { 0 };
                        int             rc;
 
                        if ( li->li_uri == NULL ) {
@@ -1632,7 +1709,12 @@ done_url:;
                                return 1;
                        }
 
-                       rc = slap_discover_feature( li->li_uri, li->li_version,
+                       ber_str2bv( li->li_uri, 0, 0, &sb.sb_uri );
+                       sb.sb_version = li->li_version;
+                       sb.sb_method = LDAP_AUTH_SIMPLE;
+                       BER_BVSTR( &sb.sb_binddn, "" );
+
+                       rc = slap_discover_feature( &sb,
                                        slap_schema.si_ad_supportedExtension->ad_cname.bv_val,
                                        LDAP_EXOP_CANCEL );
                        if ( rc == LDAP_COMPARE_TRUE ) {