Diff for /servers/slapd/bconfig.c between versions 1.202 and 1.202.2.3

version 1.202, 2006/04/01 21:44:42 version 1.202.2.3, 2006/05/15 17:04:41
Line 1 Line 1
 /* bconfig.c - the config backend */  /* bconfig.c - the config backend */
 /* $OpenLDAP: pkg/ldap/servers/slapd/bconfig.c,v 1.201 2006/03/31 10:20:04 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/bconfig.c,v 1.202.2.2 2006/04/18 17:33:07 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2005-2006 The OpenLDAP Foundation.   * Copyright 2005-2006 The OpenLDAP Foundation.
Line 40 Line 40
 static struct berval config_rdn = BER_BVC("cn=config");  static struct berval config_rdn = BER_BVC("cn=config");
 static struct berval schema_rdn = BER_BVC("cn=schema");  static struct berval schema_rdn = BER_BVC("cn=schema");
   
   extern int slap_DN_strict;      /* dn.c */
   
 #ifdef SLAPD_MODULES  #ifdef SLAPD_MODULES
 typedef struct modpath_s {  typedef struct modpath_s {
         struct modpath_s *mp_next;          struct modpath_s *mp_next;
Line 86  static ConfigFile *cfn; Line 88  static ConfigFile *cfn;
 static Avlnode *CfOcTree;  static Avlnode *CfOcTree;
   
 static int config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca,  static int config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca,
         SlapReply *rs, int *renumber );          SlapReply *rs, int *renumber, Operation *op );
   
 static ConfigDriver config_fname;  static ConfigDriver config_fname;
 static ConfigDriver config_cfdir;  static ConfigDriver config_cfdir;
Line 213  static OidRec OidMacros[] = { Line 215  static OidRec OidMacros[] = {
  * OLcfgOv{Oc|At}:7                     -> distproc   * OLcfgOv{Oc|At}:7                     -> distproc
  * OLcfgOv{Oc|At}:8                     -> dynlist   * OLcfgOv{Oc|At}:8                     -> dynlist
  * OLcfgOv{Oc|At}:9                     -> dds   * OLcfgOv{Oc|At}:9                     -> dds
    * OLcfgOv{Oc|At}:10            -> unique
    * OLcfgOv{Oc|At}:11            -> refint
    * OLcfgOv{Oc|At}:12            -> ppolicy
    * OLcfgOv{Oc|At}:13            -> constraint
    * OLcfgOv{Oc|At}:14            -> translucent
  */   */
   
 /* alphabetical ordering */  /* alphabetical ordering */
Line 335  static ConfigTable config_back_cf_table[ Line 342  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
         { "limits", "limits", 2, 0, 0, ARG_DB|ARG_MAGIC|CFG_LIMITS,          { "limits", "limits", 2, 0, 0, ARG_DB|ARG_MAGIC|CFG_LIMITS,
                 &config_generic, "( OLcfgDbAt:0.5 NAME 'olcLimits' "                  &config_generic, "( OLcfgDbAt:0.5 NAME 'olcLimits' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },                          "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },
         { "localSSF", "ssf", 2, 2, 0, ARG_INT,          { "localSSF", "ssf", 2, 2, 0, ARG_INT,
                 &local_ssf, "( OLcfgGlAt:26 NAME 'olcLocalSSF' "                  &local_ssf, "( OLcfgGlAt:26 NAME 'olcLocalSSF' "
Line 344  static ConfigTable config_back_cf_table[ Line 352  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
         { "loglevel", "level", 2, 0, 0, ARG_MAGIC,          { "loglevel", "level", 2, 0, 0, ARG_MAGIC,
                 &config_loglevel, "( OLcfgGlAt:28 NAME 'olcLogLevel' "                  &config_loglevel, "( OLcfgGlAt:28 NAME 'olcLogLevel' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "maxDerefDepth", "depth", 2, 2, 0, ARG_DB|ARG_INT|ARG_MAGIC|CFG_DEPTH,          { "maxDerefDepth", "depth", 2, 2, 0, ARG_DB|ARG_INT|ARG_MAGIC|CFG_DEPTH,
                 &config_generic, "( OLcfgDbAt:0.6 NAME 'olcMaxDerefDepth' "                  &config_generic, "( OLcfgDbAt:0.6 NAME 'olcMaxDerefDepth' "
Line 358  static ConfigTable config_back_cf_table[ Line 367  static ConfigTable config_back_cf_table[
                 ARG_IGNORED, NULL,                  ARG_IGNORED, NULL,
 #endif  #endif
                 "( OLcfgGlAt:30 NAME 'olcModuleLoad' "                  "( OLcfgGlAt:30 NAME 'olcModuleLoad' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },                          "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },
         { "modulepath", "path", 2, 2, 0,          { "modulepath", "path", 2, 2, 0,
 #ifdef SLAPD_MODULES  #ifdef SLAPD_MODULES
Line 375  static ConfigTable config_back_cf_table[ Line 385  static ConfigTable config_back_cf_table[
                         NULL, NULL },                          NULL, NULL },
         { "objectidentifier", NULL,     0, 0, 0, ARG_MAGIC|CFG_OID,          { "objectidentifier", NULL,     0, 0, 0, ARG_MAGIC|CFG_OID,
                 &config_generic, "( OLcfgGlAt:33 NAME 'olcObjectIdentifier' "                  &config_generic, "( OLcfgGlAt:33 NAME 'olcObjectIdentifier' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },                          "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },
         { "overlay", "overlay", 2, 2, 0, ARG_MAGIC,          { "overlay", "overlay", 2, 2, 0, ARG_MAGIC,
                 &config_overlay, "( OLcfgGlAt:34 NAME 'olcOverlay' "                  &config_overlay, "( OLcfgGlAt:34 NAME 'olcOverlay' "
Line 384  static ConfigTable config_back_cf_table[ Line 395  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
         { "password-hash", "hash", 2, 2, 0, ARG_MAGIC,          { "password-hash", "hash", 2, 2, 0, ARG_MAGIC,
                 &config_passwd_hash, "( OLcfgGlAt:36 NAME 'olcPasswordHash' "                  &config_passwd_hash, "( OLcfgGlAt:36 NAME 'olcPasswordHash' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "pidfile", "file", 2, 2, 0, ARG_STRING,          { "pidfile", "file", 2, 2, 0, ARG_STRING,
                 &slapd_pid_file, "( OLcfgGlAt:37 NAME 'olcPidFile' "                  &slapd_pid_file, "( OLcfgGlAt:37 NAME 'olcPidFile' "
Line 395  static ConfigTable config_back_cf_table[ Line 407  static ConfigTable config_back_cf_table[
                 ARG_IGNORED, NULL,                  ARG_IGNORED, NULL,
 #endif  #endif
                 "( OLcfgGlAt:38 NAME 'olcPlugin' "                  "( OLcfgGlAt:38 NAME 'olcPlugin' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "pluginlog", "filename", 2, 2, 0,          { "pluginlog", "filename", 2, 2, 0,
 #ifdef LDAP_SLAPI  #ifdef LDAP_SLAPI
Line 412  static ConfigTable config_back_cf_table[ Line 425  static ConfigTable config_back_cf_table[
                         "SUP labeledURI SINGLE-VALUE )", NULL, NULL },                          "SUP labeledURI SINGLE-VALUE )", NULL, NULL },
         { "replica", "host or uri", 2, 0, 0, ARG_DB|ARG_MAGIC,          { "replica", "host or uri", 2, 0, 0, ARG_DB|ARG_MAGIC,
                 &config_replica, "( OLcfgDbAt:0.7 NAME 'olcReplica' "                  &config_replica, "( OLcfgDbAt:0.7 NAME 'olcReplica' "
                           "EQUALITY caseIgnoreMatch "
                         "SUP labeledURI X-ORDERED 'VALUES' )", NULL, NULL },                          "SUP labeledURI X-ORDERED 'VALUES' )", NULL, NULL },
         { "replica-argsfile", NULL, 0, 0, 0, ARG_MAY_DB|ARG_MAGIC|ARG_STRING|CFG_REPLICA_ARGSFILE,          { "replica-argsfile", NULL, 0, 0, 0, ARG_MAY_DB|ARG_MAGIC|ARG_STRING|CFG_REPLICA_ARGSFILE,
                 &config_generic, "( OLcfgGlAt:43 NAME 'olcReplicaArgsFile' "                  &config_generic, "( OLcfgGlAt:43 NAME 'olcReplicaArgsFile' "
Line 427  static ConfigTable config_back_cf_table[ Line 441  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
         { "require", "features", 2, 0, 7, ARG_MAY_DB|ARG_MAGIC,          { "require", "features", 2, 0, 7, ARG_MAY_DB|ARG_MAGIC,
                 &config_requires, "( OLcfgGlAt:47 NAME 'olcRequires' "                  &config_requires, "( OLcfgGlAt:47 NAME 'olcRequires' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "restrict", "op_list", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,          { "restrict", "op_list", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,
                 &config_restrict, "( OLcfgGlAt:48 NAME 'olcRestrict' "                  &config_restrict, "( OLcfgGlAt:48 NAME 'olcRestrict' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "reverse-lookup", "on|off", 2, 2, 0,          { "reverse-lookup", "on|off", 2, 2, 0,
 #ifdef SLAPD_RLOOKUPS  #ifdef SLAPD_RLOOKUPS
Line 444  static ConfigTable config_back_cf_table[ Line 460  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
         { "rootDSE", "file", 2, 2, 0, ARG_MAGIC|CFG_ROOTDSE,          { "rootDSE", "file", 2, 2, 0, ARG_MAGIC|CFG_ROOTDSE,
                 &config_generic, "( OLcfgGlAt:51 NAME 'olcRootDSE' "                  &config_generic, "( OLcfgGlAt:51 NAME 'olcRootDSE' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "rootpw", "password", 2, 2, 0, ARG_BERVAL|ARG_DB|ARG_MAGIC,          { "rootpw", "password", 2, 2, 0, ARG_BERVAL|ARG_DB|ARG_MAGIC,
                 &config_rootpw, "( OLcfgDbAt:0.9 NAME 'olcRootPW' "                  &config_rootpw, "( OLcfgDbAt:0.9 NAME 'olcRootPW' "
Line 483  static ConfigTable config_back_cf_table[ Line 500  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
         { "security", "factors", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,          { "security", "factors", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,
                 &config_security, "( OLcfgGlAt:59 NAME 'olcSecurity' "                  &config_security, "( OLcfgGlAt:59 NAME 'olcSecurity' "
                           "EQUALITY caseIgnoreMatch "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString )", NULL, NULL },
         { "sizelimit", "limit", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,          { "sizelimit", "limit", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,
                 &config_sizelimit, "( OLcfgGlAt:60 NAME 'olcSizeLimit' "                  &config_sizelimit, "( OLcfgGlAt:60 NAME 'olcSizeLimit' "
Line 503  static ConfigTable config_back_cf_table[ Line 521  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
         { "subordinate", "[advertise]", 1, 2, 0, ARG_DB|ARG_MAGIC,          { "subordinate", "[advertise]", 1, 2, 0, ARG_DB|ARG_MAGIC,
                 &config_subordinate, "( OLcfgDbAt:0.15 NAME 'olcSubordinate' "                  &config_subordinate, "( OLcfgDbAt:0.15 NAME 'olcSubordinate' "
                         "SYNTAX OMsDirectoryString )", NULL, NULL },                          "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
         { "suffix",     "suffix", 2, 2, 0, ARG_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,          { "suffix",     "suffix", 2, 2, 0, ARG_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
                 &config_suffix, "( OLcfgDbAt:0.10 NAME 'olcSuffix' "                  &config_suffix, "( OLcfgDbAt:0.10 NAME 'olcSuffix' "
                           "EQUALITY distinguishedNameMatch "
                         "SYNTAX OMsDN )", NULL, NULL },                          "SYNTAX OMsDN )", NULL, NULL },
         { "syncrepl", NULL, 0, 0, 0, ARG_DB|ARG_MAGIC,          { "syncrepl", NULL, 0, 0, 0, ARG_DB|ARG_MAGIC,
                 &syncrepl_config, "( OLcfgDbAt:0.11 NAME 'olcSyncrepl' "                  &syncrepl_config, "( OLcfgDbAt:0.11 NAME 'olcSyncrepl' "
Line 603  static ConfigTable config_back_cf_table[ Line 622  static ConfigTable config_back_cf_table[
                         "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
         { "updateref", "url", 2, 2, 0, ARG_DB|ARG_MAGIC,          { "updateref", "url", 2, 2, 0, ARG_DB|ARG_MAGIC,
                 &config_updateref, "( OLcfgDbAt:0.13 NAME 'olcUpdateRef' "                  &config_updateref, "( OLcfgDbAt:0.13 NAME 'olcUpdateRef' "
                           "EQUALITY caseIgnoreMatch "
                         "SUP labeledURI )", NULL, NULL },                          "SUP labeledURI )", NULL, NULL },
         { NULL, NULL, 0, 0, 0, ARG_IGNORED,          { NULL, NULL, 0, 0, 0, ARG_IGNORED,
                 NULL, NULL, NULL, NULL }                  NULL, NULL, NULL, NULL }
Line 1238  config_generic(ConfigArgs *c) { Line 1258  config_generic(ConfigArgs *c) {
                         break;                          break;
   
                 case CFG_ACL:                  case CFG_ACL:
                         if ( parse_acl(c->be, c->fname, c->lineno, c->argc, c->argv, c->valx ) ) {                          /* Don't append to the global ACL if we're on a specific DB */
                           i = c->valx;
                           if ( c->be != frontendDB && frontendDB->be_acl && c->valx == -1 ) {
                                   AccessControl *a;
                                   i = 0;
                                   for ( a=c->be->be_acl; a && a != frontendDB->be_acl;
                                           a = a->acl_next )
                                           i++;
                           }
                           if ( parse_acl(c->be, c->fname, c->lineno, c->argc, c->argv, i ) ) {
                                 return 1;                                  return 1;
                         }                          }
                         break;                          break;
Line 2602  config_replica(ConfigArgs *c) { Line 2631  config_replica(ConfigArgs *c) {
                                 /* dealt with separately; don't let it get to bindconf */                                  /* dealt with separately; don't let it get to bindconf */
                                 ;                                  ;
   
                           } else if(!strncasecmp(c->argv[i], "host=", STRLENOF("host="))) {
                                   /* dealt with separately; don't let it get to bindconf */
                                   ;
   
                         } else if(!strncasecmp(c->argv[i], "suffix=", STRLENOF( "suffix="))) {                          } else if(!strncasecmp(c->argv[i], "suffix=", STRLENOF( "suffix="))) {
                                 switch(add_replica_suffix(c->be, nr, c->argv[i] + STRLENOF("suffix="))) {                                  switch(add_replica_suffix(c->be, nr, c->argv[i] + STRLENOF("suffix="))) {
                                         case 1:                                          case 1:
Line 2796  config_include(ConfigArgs *c) { Line 2829  config_include(ConfigArgs *c) {
 static int  static int
 config_tls_option(ConfigArgs *c) {  config_tls_option(ConfigArgs *c) {
         int flag;          int flag;
           LDAP *ld = slap_tls_ld;
         switch(c->type) {          switch(c->type) {
         case CFG_TLS_RAND:      flag = LDAP_OPT_X_TLS_RANDOM_FILE;      break;          case CFG_TLS_RAND:      flag = LDAP_OPT_X_TLS_RANDOM_FILE;      ld = NULL; break;
         case CFG_TLS_CIPHER:    flag = LDAP_OPT_X_TLS_CIPHER_SUITE;     break;          case CFG_TLS_CIPHER:    flag = LDAP_OPT_X_TLS_CIPHER_SUITE;     break;
         case CFG_TLS_CERT_FILE: flag = LDAP_OPT_X_TLS_CERTFILE;         break;            case CFG_TLS_CERT_FILE: flag = LDAP_OPT_X_TLS_CERTFILE;         break;  
         case CFG_TLS_CERT_KEY:  flag = LDAP_OPT_X_TLS_KEYFILE;          break;          case CFG_TLS_CERT_KEY:  flag = LDAP_OPT_X_TLS_KEYFILE;          break;
Line 2810  config_tls_option(ConfigArgs *c) { Line 2844  config_tls_option(ConfigArgs *c) {
                 return 1;                  return 1;
         }          }
         if (c->op == SLAP_CONFIG_EMIT) {          if (c->op == SLAP_CONFIG_EMIT) {
                 return ldap_pvt_tls_get_option( NULL, flag, &c->value_string );                  return ldap_pvt_tls_get_option( ld, flag, &c->value_string );
         } else if ( c->op == LDAP_MOD_DELETE ) {          } else if ( c->op == LDAP_MOD_DELETE ) {
                 return ldap_pvt_tls_set_option( NULL, flag, NULL );                  return ldap_pvt_tls_set_option( ld, flag, NULL );
         }          }
         ch_free(c->value_string);          ch_free(c->value_string);
         return(ldap_pvt_tls_set_option(NULL, flag, c->argv[1]));          return(ldap_pvt_tls_set_option(ld, flag, c->argv[1]));
 }  }
   
 /* FIXME: this ought to be provided by libldap */  /* FIXME: this ought to be provided by libldap */
Line 2845  config_tls_config(ConfigArgs *c) { Line 2879  config_tls_config(ConfigArgs *c) {
                 return 1;                  return 1;
         }          }
         if (c->op == SLAP_CONFIG_EMIT) {          if (c->op == SLAP_CONFIG_EMIT) {
                 ldap_pvt_tls_get_option( NULL, flag, &c->value_int );                  ldap_pvt_tls_get_option( slap_tls_ld, flag, &c->value_int );
                 for (i=0; !BER_BVISNULL(&keys[i].word); i++) {                  for (i=0; !BER_BVISNULL(&keys[i].word); i++) {
                         if (keys[i].mask == c->value_int) {                          if (keys[i].mask == c->value_int) {
                                 c->value_string = ch_strdup( keys[i].word.bv_val );                                  c->value_string = ch_strdup( keys[i].word.bv_val );
Line 2855  config_tls_config(ConfigArgs *c) { Line 2889  config_tls_config(ConfigArgs *c) {
                 return 1;                  return 1;
         } else if ( c->op == LDAP_MOD_DELETE ) {          } else if ( c->op == LDAP_MOD_DELETE ) {
                 int i = 0;                  int i = 0;
                 return ldap_pvt_tls_set_option( NULL, flag, &i );                  return ldap_pvt_tls_set_option( slap_tls_ld, flag, &i );
         }          }
         ch_free( c->value_string );          ch_free( c->value_string );
         if ( isdigit( (unsigned char)c->argv[1][0] ) ) {          if ( isdigit( (unsigned char)c->argv[1][0] ) ) {
Line 2865  config_tls_config(ConfigArgs *c) { Line 2899  config_tls_config(ConfigArgs *c) {
                                 c->log, c->argv[0], c->argv[1] );                                  c->log, c->argv[0], c->argv[1] );
                         return 1;                          return 1;
                 }                  }
                 return(ldap_pvt_tls_set_option(NULL, flag, &i));                  return(ldap_pvt_tls_set_option(slap_tls_ld, flag, &i));
         } else {          } else {
                 return(ldap_int_tls_config(NULL, flag, c->argv[1]));                  return(ldap_int_tls_config(slap_tls_ld, flag, c->argv[1]));
         }          }
 }  }
 #endif  #endif
Line 2923  config_ldif_resp( Operation *op, SlapRep Line 2957  config_ldif_resp( Operation *op, SlapRep
                 setup_cookie *sc = op->o_callback->sc_private;                  setup_cookie *sc = op->o_callback->sc_private;
   
                 sc->cfb->cb_got_ldif = 1;                  sc->cfb->cb_got_ldif = 1;
                 rs->sr_err = config_add_internal( sc->cfb, rs->sr_entry, sc->ca, NULL, NULL );                  rs->sr_err = config_add_internal( sc->cfb, rs->sr_entry, sc->ca, NULL, NULL, NULL );
                 if ( rs->sr_err != LDAP_SUCCESS ) {                  if ( rs->sr_err != LDAP_SUCCESS ) {
                         Debug( LDAP_DEBUG_ANY, "config error processing %s: %s\n",                          Debug( LDAP_DEBUG_ANY, "config error processing %s: %s\n",
                                 rs->sr_entry->e_name.bv_val, sc->ca->msg, 0 );                                  rs->sr_entry->e_name.bv_val, sc->ca->msg, 0 );
Line 2996  config_setup_ldif( BackendDB *be, const Line 3030  config_setup_ldif( BackendDB *be, const
   
         if ( readit ) {          if ( readit ) {
                 void *thrctx = ldap_pvt_thread_pool_context();                  void *thrctx = ldap_pvt_thread_pool_context();
                   int prev_DN_strict;
   
                 op = (Operation *) &opbuf;                  op = (Operation *) &opbuf;
                 connection_fake_init( &conn, op, thrctx );                  connection_fake_init( &conn, op, thrctx );
Line 3026  config_setup_ldif( BackendDB *be, const Line 3061  config_setup_ldif( BackendDB *be, const
                 cb.sc_private = &sc;                  cb.sc_private = &sc;
   
                 op->o_bd = &cfb->cb_db;                  op->o_bd = &cfb->cb_db;
                   
                   /* Allow unknown attrs in DNs */
                   prev_DN_strict = slap_DN_strict;
                   slap_DN_strict = 0;
   
                 rc = op->o_bd->be_search( op, &rs );                  rc = op->o_bd->be_search( op, &rs );
   
                   /* Restore normal DN validation */
                   slap_DN_strict = prev_DN_strict;
   
                 ldap_pvt_thread_pool_context_reset( thrctx );                  ldap_pvt_thread_pool_context_reset( thrctx );
         }          }
   
Line 3081  read_config(const char *fname, const cha Line 3124  read_config(const char *fname, const cha
                 return 1;                  return 1;
   
         cfb = be->be_private;          cfb = be->be_private;
           be->be_dfltaccess = ACL_NONE;
   
         /* If no .conf, or a dir was specified, setup the dir */          /* If no .conf, or a dir was specified, setup the dir */
         if ( !fname || dir ) {          if ( !fname || dir ) {
Line 3106  read_config(const char *fname, const cha Line 3150  read_config(const char *fname, const cha
                         if ( rc != LDAP_NO_SUCH_OBJECT )                          if ( rc != LDAP_NO_SUCH_OBJECT )
                                 return 1;                                  return 1;
                         /* ITS#4194: But if dir was specified and no fname,                          /* ITS#4194: But if dir was specified and no fname,
                          * then we were supposed to read the dir.                           * then we were supposed to read the dir. Unless we're
                            * trying to slapadd the dir...
                          */                           */
                         if ( dir && !fname )                          if ( dir && !fname ) {
                                 return 1;                                  if ( slapMode & (SLAP_SERVER_MODE|SLAP_TOOL_READMAIN|SLAP_TOOL_READONLY))
                                           return 1;
                                   /* Assume it's slapadd with a config dir, let it continue */
                                   rc = 0;
                                   cfb->cb_got_ldif = 1;
                                   cfb->cb_use_ldif = 1;
                                   goto done;
                           }
                 }                  }
   
                 /* If we read the config from back-ldif, nothing to do here */                  /* If we read the config from back-ldif, nothing to do here */
Line 3129  read_config(const char *fname, const cha Line 3181  read_config(const char *fname, const cha
         if ( rc == 0 )          if ( rc == 0 )
                 ber_str2bv( cfname, 0, 1, &cfb->cb_config->c_file );                  ber_str2bv( cfname, 0, 1, &cfb->cb_config->c_file );
   
         /* If we got this far and failed, it may be a serious problem. In server  
          * mode, we should never come to this. However, it may be alright if we're  
          * using slapadd to create the conf dir.  
          */  
         while ( rc ) {  
                 if ( slapMode & (SLAP_SERVER_MODE|SLAP_TOOL_READMAIN|SLAP_TOOL_READONLY))  
                         break;  
                 /* If a config file was explicitly given, fail */  
                 if ( fname )  
                         break;  
                   
                 /* Seems to be slapadd with a config dir, let it continue */  
                 if ( cfb->cb_use_ldif ) {  
                         rc = 0;  
                         cfb->cb_got_ldif = 1;  
                 }  
                 break;  
         }  
   
 done:  done:
         if ( rc == 0 && BER_BVISNULL( &frontendDB->be_schemadn ) ) {          if ( rc == 0 && BER_BVISNULL( &frontendDB->be_schemadn ) ) {
                 ber_str2bv( SLAPD_SCHEMA_DN, STRLENOF( SLAPD_SCHEMA_DN ), 1,                  ber_str2bv( SLAPD_SCHEMA_DN, STRLENOF( SLAPD_SCHEMA_DN ), 1,
Line 3556  cfAddOverlay( CfEntryInfo *p, Entry *e, Line 3589  cfAddOverlay( CfEntryInfo *p, Entry *e,
   
 /* Parse an LDAP entry into config directives */  /* Parse an LDAP entry into config directives */
 static int  static int
 config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs, int *renum )  config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs,
           int *renum, Operation *op )
 {  {
         CfEntryInfo *ce, *last;          CfEntryInfo *ce, *last;
         ConfigOCs **colst;          ConfigOCs **colst;
Line 3582  config_add_internal( CfBackInfo *cfb, En Line 3616  config_add_internal( CfBackInfo *cfb, En
                 return LDAP_NO_SUCH_OBJECT;                  return LDAP_NO_SUCH_OBJECT;
         }          }
   
           if ( op ) {
                   /* No parent, must be root. This will never happen... */
                   if ( !last && !be_isroot( op ) && !be_shadow_update( op ))
                           return LDAP_NO_SUCH_OBJECT;
                   if ( last && !access_allowed( op, last->ce_entry,
                           slap_schema.si_ad_children, NULL, ACL_WADD, NULL ))
                           return LDAP_INSUFFICIENT_ACCESS;
           }
   
         oc_at = attr_find( e->e_attrs, slap_schema.si_ad_objectClass );          oc_at = attr_find( e->e_attrs, slap_schema.si_ad_objectClass );
         if ( !oc_at ) return LDAP_OBJECT_CLASS_VIOLATION;          if ( !oc_at ) return LDAP_OBJECT_CLASS_VIOLATION;
   
Line 3763  config_back_add( Operation *op, SlapRepl Line 3806  config_back_add( Operation *op, SlapRepl
         int renumber;          int renumber;
         ConfigArgs ca;          ConfigArgs ca;
   
         if ( !be_isroot( op ) ) {          if ( !access_allowed( op, op->ora_e, slap_schema.si_ad_entry,
                   NULL, ACL_WADD, NULL )) {
                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;                  rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
                 goto out;                  goto out;
         }          }
Line 3781  config_back_add( Operation *op, SlapRepl Line 3825  config_back_add( Operation *op, SlapRepl
          */           */
         /* NOTE: by now we do not accept adds that require renumbering */          /* NOTE: by now we do not accept adds that require renumbering */
         renumber = -1;          renumber = -1;
         rs->sr_err = config_add_internal( cfb, op->ora_e, &ca, rs, &renumber );          rs->sr_err = config_add_internal( cfb, op->ora_e, &ca, rs, &renumber, op );
         if ( rs->sr_err != LDAP_SUCCESS ) {          if ( rs->sr_err != LDAP_SUCCESS ) {
                 rs->sr_text = ca.msg;                  rs->sr_text = ca.msg;
                 goto out2;                  goto out2;
Line 4100  config_back_modify( Operation *op, SlapR Line 4144  config_back_modify( Operation *op, SlapR
         char *ptr;          char *ptr;
         AttributeDescription *rad = NULL;          AttributeDescription *rad = NULL;
   
         if ( !be_isroot( op ) ) {  
                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;  
                 goto out;  
         }  
   
         cfb = (CfBackInfo *)op->o_bd->be_private;          cfb = (CfBackInfo *)op->o_bd->be_private;
   
         ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last );          ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last );
Line 4115  config_back_modify( Operation *op, SlapR Line 4154  config_back_modify( Operation *op, SlapR
                 goto out;                  goto out;
         }          }
   
           if ( !acl_check_modlist( op, ce->ce_entry, op->orm_modlist )) {
                   rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
                   goto out;
           }
   
         /* Get type of RDN */          /* Get type of RDN */
         rdn = ce->ce_entry->e_nname;          rdn = ce->ce_entry->e_nname;
         ptr = strchr( rdn.bv_val, '=' );          ptr = strchr( rdn.bv_val, '=' );
Line 4175  config_back_modrdn( Operation *op, SlapR Line 4219  config_back_modrdn( Operation *op, SlapR
         CfBackInfo *cfb;          CfBackInfo *cfb;
         CfEntryInfo *ce, *last;          CfEntryInfo *ce, *last;
   
         if ( !be_isroot( op ) ) {  
                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;  
                 goto out;  
         }  
   
         cfb = (CfBackInfo *)op->o_bd->be_private;          cfb = (CfBackInfo *)op->o_bd->be_private;
   
         ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last );          ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last );
Line 4189  config_back_modrdn( Operation *op, SlapR Line 4228  config_back_modrdn( Operation *op, SlapR
                 rs->sr_err = LDAP_NO_SUCH_OBJECT;                  rs->sr_err = LDAP_NO_SUCH_OBJECT;
                 goto out;                  goto out;
         }          }
           if ( !access_allowed( op, ce->ce_entry, slap_schema.si_ad_entry,
                   NULL, ACL_WRITE, NULL )) {
                   rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
                   goto out;
           }
           { Entry *parent;
                   if ( ce->ce_parent )
                           parent = ce->ce_parent->ce_entry;
                   else
                           parent = (Entry *)&slap_entry_root;
                   if ( !access_allowed( op, parent, slap_schema.si_ad_children,
                           NULL, ACL_WRITE, NULL )) {
                           rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
                           goto out;
                   }
           }
   
         /* We don't allow moving objects to new parents.          /* We don't allow moving objects to new parents.
          * Generally we only allow reordering a set of ordered entries.           * Generally we only allow reordering a set of ordered entries.
Line 4213  config_back_search( Operation *op, SlapR Line 4268  config_back_search( Operation *op, SlapR
 {  {
         CfBackInfo *cfb;          CfBackInfo *cfb;
         CfEntryInfo *ce, *last;          CfEntryInfo *ce, *last;
           slap_mask_t mask;
         if ( !be_isroot( op ) ) {  
                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;  
                 goto out;  
         }  
   
         cfb = (CfBackInfo *)op->o_bd->be_private;          cfb = (CfBackInfo *)op->o_bd->be_private;
   
Line 4228  config_back_search( Operation *op, SlapR Line 4279  config_back_search( Operation *op, SlapR
                 rs->sr_err = LDAP_NO_SUCH_OBJECT;                  rs->sr_err = LDAP_NO_SUCH_OBJECT;
                 goto out;                  goto out;
         }          }
           if ( !access_allowed_mask( op, ce->ce_entry, slap_schema.si_ad_entry, NULL,
                   ACL_SEARCH, NULL, &mask ))
           {
                   if ( !ACL_GRANT( mask, ACL_DISCLOSE )) {
                           rs->sr_err = LDAP_NO_SUCH_OBJECT;
                   } else {
                           rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
                   }
                   goto out;
           }
         switch ( op->ors_scope ) {          switch ( op->ors_scope ) {
         case LDAP_SCOPE_BASE:          case LDAP_SCOPE_BASE:
         case LDAP_SCOPE_SUBTREE:          case LDAP_SCOPE_SUBTREE:
Line 4468  config_build_modules( ConfigArgs *c, CfE Line 4529  config_build_modules( ConfigArgs *c, CfE
 }  }
 #endif  #endif
   
   static const char *defacl[] = {
           NULL, "to", "*", "by", "*", "none", NULL
   };
   
 static int  static int
 config_back_db_open( BackendDB *be )  config_back_db_open( BackendDB *be )
 {  {
Line 4486  config_back_db_open( BackendDB *be ) Line 4551  config_back_db_open( BackendDB *be )
         void *thrctx = NULL;          void *thrctx = NULL;
   
         Debug( LDAP_DEBUG_TRACE, "config_back_db_open\n", 0, 0, 0);          Debug( LDAP_DEBUG_TRACE, "config_back_db_open\n", 0, 0, 0);
   
           /* If we have no explicitly configured ACLs, don't just use
            * the global ACLs. Explicitly deny access to everything.
            */
           if ( frontendDB->be_acl && be->be_acl == frontendDB->be_acl ) {
                   parse_acl(be, "config_back_db_open", 0, 6, (char **)defacl, 0 );
           }
   
         /* If we read the config from back-ldif, nothing to do here */          /* If we read the config from back-ldif, nothing to do here */
         if ( cfb->cb_got_ldif )          if ( cfb->cb_got_ldif )
                 return 0;                  return 0;
Line 4844  config_tool_entry_put( BackendDB *be, En Line 4917  config_tool_entry_put( BackendDB *be, En
         ConfigArgs ca;          ConfigArgs ca;
   
         if ( bi && bi->bi_tool_entry_put &&          if ( bi && bi->bi_tool_entry_put &&
                 config_add_internal( cfb, e, &ca, NULL, NULL ) == 0 )                  config_add_internal( cfb, e, &ca, NULL, NULL, NULL ) == 0 )
                 return bi->bi_tool_entry_put( &cfb->cb_db, e, text );                  return bi->bi_tool_entry_put( &cfb->cb_db, e, text );
         else          else
                 return NOID;                  return NOID;
Line 4927  config_back_initialize( BackendInfo *bi Line 5000  config_back_initialize( BackendInfo *bi
   
         bi->bi_chk_referrals = 0;          bi->bi_chk_referrals = 0;
   
 #ifdef SLAP_OVERLAY_ACCESS          bi->bi_access_allowed = slap_access_allowed;
         bi->bi_access_allowed = slap_access_always_allowed;  
 #endif /* SLAP_OVERLAY_ACCESS */  
   
         bi->bi_connection_init = 0;          bi->bi_connection_init = 0;
         bi->bi_connection_destroy = 0;          bi->bi_connection_destroy = 0;

Removed from v.1.202  
changed lines
  Added in v.1.202.2.3


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org