]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/config.c
cleanup
[openldap] / servers / slapd / back-ldap / config.c
index d43ef4d8d53196cbe8493c5404e23cb2ddf35d20..215555372c24f6edbda7989e3b562ef5313fc2f3 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2006 The OpenLDAP Foundation.
+ * Copyright 2003-2007 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
@@ -65,6 +65,8 @@ enum {
        LDAP_BACK_CFG_NETWORK_TIMEOUT,
        LDAP_BACK_CFG_VERSION,
        LDAP_BACK_CFG_SINGLECONN,
+       LDAP_BACK_CFG_USETEMP,
+       LDAP_BACK_CFG_CONNPOOLMAX,
        LDAP_BACK_CFG_CANCEL,
        LDAP_BACK_CFG_QUARANTINE,
        LDAP_BACK_CFG_REWRITE,
@@ -81,7 +83,7 @@ static ConfigTable ldapcfg[] = {
                        "SYNTAX OMsDirectoryString "
                        "SINGLE-VALUE )",
                NULL, NULL },
-       { "tls", "what", 2, 2, 0,
+       { "tls", "what", 2, 0, 0,
                ARG_MAGIC|LDAP_BACK_CFG_TLS,
                ldap_back_cf_gen, "( OLcfgDbAt:3.1 "
                        "NAME 'olcDbStartTLS' "
@@ -277,6 +279,22 @@ static ConfigTable ldapcfg[] = {
                        "SYNTAX OMsDirectoryString "
                        "SINGLE-VALUE )",
                NULL, NULL },
+       { "use-temporary-conn", "TRUE/FALSE", 2, 0, 0,
+               ARG_MAGIC|ARG_ON_OFF|LDAP_BACK_CFG_USETEMP,
+               ldap_back_cf_gen, "( OLcfgDbAt:3.22 "
+                       "NAME 'olcDbUseTemporaryConn' "
+                       "DESC 'Use temporary connections if the cached one is busy' "
+                       "SYNTAX OMsBoolean "
+                       "SINGLE-VALUE )",
+               NULL, NULL },
+       { "conn-pool-max", "<n>", 2, 0, 0,
+               ARG_MAGIC|ARG_INT|LDAP_BACK_CFG_CONNPOOLMAX,
+               ldap_back_cf_gen, "( OLcfgDbAt:3.23 "
+                       "NAME 'olcDbConnectionPoolMax' "
+                       "DESC 'Max size of privileged connections pool' "
+                       "SYNTAX OMsInteger "
+                       "SINGLE-VALUE )",
+               NULL, NULL },
        { "suffixmassage", "[virtual]> <real", 2, 3, 0,
                ARG_STRING|ARG_MAGIC|LDAP_BACK_CFG_REWRITE,
                ldap_back_cf_gen, NULL, NULL, NULL },
@@ -314,6 +332,8 @@ static ConfigOCs ldapocs[] = {
                        "$ olcDbSingleConn "
                        "$ olcDbCancel "
                        "$ olcDbQuarantine "
+                       "$ olcDbUseTemporaryConn "
+                       "$ olcDbConnectionPoolMax "
                ") )",
                        Cft_Database, ldapcfg},
        { NULL, 0, NULL }
@@ -332,6 +352,7 @@ static slap_verbmasks tls_mode[] = {
        { BER_BVC( "try-propagate" ),   LDAP_BACK_F_PROPAGATE_TLS },
        { BER_BVC( "start" ),           LDAP_BACK_F_TLS_USE_MASK },
        { BER_BVC( "try-start" ),       LDAP_BACK_F_USE_TLS },
+       { BER_BVC( "ldaps" ),           LDAP_BACK_F_TLS_LDAPS },
        { BER_BVC( "none" ),            LDAP_BACK_F_NONE },
        { BER_BVNULL,                   0 }
 };
@@ -530,15 +551,41 @@ slap_idassert_authzfrom_parse( ConfigArgs *c, slap_idassert_t *si )
        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;
-       }
+       if ( strcmp( c->argv[ 1 ], "*" ) == 0
+               || strcmp( c->argv[ 1 ], "dn:*" ) == 0
+               || strcasecmp( c->argv[ 1 ], "dn.regex:.*" ) == 0 )
+       {
+               if ( si->si_authz != NULL ) {
+                       snprintf( c->msg, sizeof( c->msg ),
+                               "\"idassert-authzFrom <authz>\": "
+                               "\"%s\" conflicts with existing authz rules",
+                               c->argv[ 1 ] );
+                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                       return 1;
+               }
+               si->si_flags |= LDAP_BACK_AUTH_AUTHZ_ALL;
+               return 0;
+       } else if ( ( si->si_flags & LDAP_BACK_AUTH_AUTHZ_ALL ) ) {
+               snprintf( c->msg, sizeof( c->msg ),
+                       "\"idassert-authzFrom <authz>\": "
+                       "\"<authz>\" conflicts with \"*\"" );
+               Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+               return 1;
+       }
+       
+       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;
@@ -665,6 +712,7 @@ slap_idassert_parse( ConfigArgs *c, slap_idassert_t *si )
                        return 1;
                }
        }
+       bindconf_tls_defaults( &si->si_bc );
 
        return 0;
 }
@@ -729,10 +777,25 @@ ldap_back_cf_gen( ConfigArgs *c )
                        }
                        break;
 
-               case LDAP_BACK_CFG_TLS:
+               case LDAP_BACK_CFG_TLS: {
+                       struct berval bc = BER_BVNULL, bv2;
                        enum_to_verb( tls_mode, ( li->li_flags & LDAP_BACK_F_TLS_MASK ), &bv );
                        assert( !BER_BVISNULL( &bv ) );
-                       value_add_one( &c->rvalue_vals, &bv );
+                       bindconf_tls_unparse( &li->li_tls, &bc );
+
+                       if ( !BER_BVISEMPTY( &bc )) {
+                               bv2.bv_len = bv.bv_len + bc.bv_len + 1;
+                               bv2.bv_val = ch_malloc( bv2.bv_len + 1 );
+                               strcpy( bv2.bv_val, bv.bv_val );
+                               bv2.bv_val[bv.bv_len] = ' ';
+                               strcpy( &bv2.bv_val[bv.bv_len + 1], bc.bv_val );
+                               ber_bvarray_add( &c->rvalue_vals, &bv2 );
+
+                       } else {
+                               value_add_one( &c->rvalue_vals, &bv );
+                       }
+                       ber_memfree( bc.bv_val );
+                       }
                        break;
 
                case LDAP_BACK_CFG_ACL_AUTHCDN:
@@ -776,7 +839,13 @@ ldap_back_cf_gen( ConfigArgs *c )
                        int             i;
 
                        if ( li->li_idassert_authz == NULL ) {
-                               rc = 1;
+                               if ( ( li->li_idassert_flags & LDAP_BACK_AUTH_AUTHZ_ALL ) ) {
+                                       BER_BVSTR( &bv, "*" );
+                                       value_add_one( &c->rvalue_vals, &bv );
+
+                               } else {
+                                       rc = 1;
+                               }
                                break;
                        }
 
@@ -1013,6 +1082,14 @@ ldap_back_cf_gen( ConfigArgs *c )
                        c->value_int = LDAP_BACK_SINGLECONN( li );
                        break;
 
+               case LDAP_BACK_CFG_USETEMP:
+                       c->value_int = LDAP_BACK_USE_TEMPORARIES( li );
+                       break;
+
+               case LDAP_BACK_CFG_CONNPOOLMAX:
+                       c->value_int = li->li_conn_priv_max;
+                       break;
+
                case LDAP_BACK_CFG_CANCEL: {
                        slap_mask_t     mask = LDAP_BACK_F_CANCEL_MASK2;
 
@@ -1139,6 +1216,14 @@ ldap_back_cf_gen( ConfigArgs *c )
                        li->li_flags &= ~LDAP_BACK_F_SINGLECONN;
                        break;
 
+               case LDAP_BACK_CFG_USETEMP:
+                       li->li_flags &= ~LDAP_BACK_F_USE_TEMPORARIES;
+                       break;
+
+               case LDAP_BACK_CFG_CONNPOOLMAX:
+                       li->li_conn_priv_max = LDAP_BACK_CONN_PRIV_MIN;
+                       break;
+
                case LDAP_BACK_CFG_QUARANTINE:
                        if ( !LDAP_BACK_QUARANTINE( li ) ) {
                                break;
@@ -1310,6 +1395,13 @@ done_url:;
                }
                li->li_flags &= ~LDAP_BACK_F_TLS_MASK;
                li->li_flags |= tls_mode[i].mask;
+               if ( c->argc > 2 ) {
+                       for ( i=2; i<c->argc; i++ ) {
+                               if ( bindconf_tls_parse( c->argv[i], &li->li_tls ))
+                                       return 1;
+                       }
+                       bindconf_tls_defaults( &li->li_tls );
+               }
                break;
 
        case LDAP_BACK_CFG_ACL_AUTHCDN:
@@ -1368,6 +1460,7 @@ done_url:;
                                return 1;
                        }
                }
+               bindconf_tls_defaults( &li->li_acl );
                break;
 
        case LDAP_BACK_CFG_IDASSERT_MODE:
@@ -1553,7 +1646,7 @@ done_url:;
                        && mask == LDAP_BACK_F_T_F_DISCOVER
                        && !LDAP_BACK_T_F( li ) )
                {
-                       slap_bindconf   sb = { 0 };
+                       slap_bindconf   sb = { BER_BVNULL };
                        int             rc;
 
                        if ( li->li_uri == NULL ) {
@@ -1684,6 +1777,33 @@ done_url:;
                }
                break;
 
+       case LDAP_BACK_CFG_USETEMP:
+               if ( c->value_int ) {
+                       li->li_flags |= LDAP_BACK_F_USE_TEMPORARIES;
+
+               } else {
+                       li->li_flags &= ~LDAP_BACK_F_USE_TEMPORARIES;
+               }
+               break;
+
+       case LDAP_BACK_CFG_CONNPOOLMAX:
+               if ( c->value_int < LDAP_BACK_CONN_PRIV_MIN
+                       || c->value_int > LDAP_BACK_CONN_PRIV_MAX )
+               {
+                       snprintf( c->msg, sizeof( c->msg ),
+                               "invalid max size " "of privileged "
+                               "connections pool \"%s\" "
+                               "in \"conn-pool-max <n> "
+                               "(must be between %d and %d)\"",
+                               c->argv[ 1 ],
+                               LDAP_BACK_CONN_PRIV_MIN,
+                               LDAP_BACK_CONN_PRIV_MAX );
+                       Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 );
+                       return 1;
+               }
+               li->li_conn_priv_max = c->value_int;
+               break;
+
        case LDAP_BACK_CFG_CANCEL: {
                slap_mask_t             mask;
 
@@ -1698,7 +1818,7 @@ done_url:;
                        && mask == LDAP_BACK_F_CANCEL_EXOP_DISCOVER
                        && !LDAP_BACK_CANCEL( li ) )
                {
-                       slap_bindconf   sb = { 0 };
+                       slap_bindconf   sb = { BER_BVNULL };
                        int             rc;
 
                        if ( li->li_uri == NULL ) {
@@ -1886,7 +2006,7 @@ retry:
                }
 
                if ( lc != NULL ) {
-                       ldap_back_release_conn( &op2, rs, lc );
+                       ldap_back_release_conn( (ldapinfo_t *)op2.o_bd->be_private, lc );
                }
 
        } else {