/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2005-2007 The OpenLDAP Foundation.
+ * Copyright 2005-2009 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
ContentRule *c_cr_head, *c_cr_tail;
ObjectClass *c_oc_head, *c_oc_tail;
OidMacro *c_om_head, *c_om_tail;
+ Syntax *c_syn_head, *c_syn_tail;
BerVarray c_dseFiles;
} ConfigFile;
static CfBackInfo cfBackInfo;
static char *passwd_salt;
+static FILE *logfile;
static char *logfileName;
#ifdef SLAP_AUTH_REWRITE
static BerVarray authz_rewrites;
/* Private state */
static AttributeDescription *cfAd_backend, *cfAd_database, *cfAd_overlay,
- *cfAd_include, *cfAd_attr, *cfAd_oc, *cfAd_om;
+ *cfAd_include, *cfAd_attr, *cfAd_oc, *cfAd_om, *cfAd_syntax;
static ConfigFile *cfn;
extern AttributeType *at_sys_tail; /* at.c */
extern ObjectClass *oc_sys_tail; /* oc.c */
extern OidMacro *om_sys_tail; /* oidm.c */
+extern Syntax *syn_sys_tail; /* syntax.c */
static AttributeType *cf_at_tail;
static ObjectClass *cf_oc_tail;
static OidMacro *cf_om_tail;
+static Syntax *cf_syn_tail;
static int config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca,
SlapReply *rs, int *renumber, Operation *op );
CFG_DATABASE,
CFG_TLS_RAND,
CFG_TLS_CIPHER,
+ CFG_TLS_PROTOCOL_MIN,
CFG_TLS_CERT_FILE,
CFG_TLS_CERT_KEY,
CFG_TLS_CA_PATH,
CFG_MONITORING,
CFG_SERVERID,
CFG_SORTVALS,
+ CFG_IX_INTLEN,
+ CFG_SYNTAX,
+ CFG_ACL_ADD,
CFG_LAST
};
} OidRec;
static OidRec OidMacros[] = {
- /* OpenLDAProot:666.11.1 */
- { "OLcfg", "1.3.6.1.4.1.4203.666.11.1" },
+ /* OpenLDAProot:1.12.2 */
+ { "OLcfg", "1.3.6.1.4.1.4203.1.12.2" },
{ "OLcfgAt", "OLcfg:3" },
{ "OLcfgGlAt", "OLcfgAt:0" },
{ "OLcfgBkAt", "OLcfgAt:1" },
* OLcfg{Bk|Db}{Oc|At}:4 -> back-monitor
* OLcfg{Bk|Db}{Oc|At}:5 -> back-relay
* OLcfg{Bk|Db}{Oc|At}:6 -> back-sql
+ * OLcfg{Bk|Db}{Oc|At}:7 -> back-sock
*/
/*
* OLcfgOv{Oc|At}:17 -> dyngroup
* OLcfgOv{Oc|At}:18 -> memberof
* OLcfgOv{Oc|At}:19 -> collect
+ * OLcfgOv{Oc|At}:20 -> retcode
*/
/* alphabetical ordering */
"DESC 'Access Control List' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )", NULL, NULL },
+ { "add_content_acl", NULL, 0, 0, 0, ARG_MAY_DB|ARG_ON_OFF|ARG_MAGIC|CFG_ACL_ADD,
+ &config_generic, "( OLcfgGlAt:86 NAME 'olcAddContentAcl' "
+ "DESC 'Check ACLs against content of Add ops' "
+ "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
{ "allows", "features", 2, 0, 5, ARG_PRE_DB|ARG_MAGIC,
&config_allows, "( OLcfgGlAt:2 NAME 'olcAllows' "
"DESC 'Allowed set of deprecated features' "
{ "index_substr_any_step", "step", 2, 2, 0, ARG_INT|ARG_NONZERO,
&index_substr_any_step, "( OLcfgGlAt:23 NAME 'olcIndexSubstrAnyStep' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
+ { "index_intlen", "len", 2, 2, 0, ARG_INT|ARG_MAGIC|CFG_IX_INTLEN,
+ &config_generic, "( OLcfgGlAt:84 NAME 'olcIndexIntLen' "
+ "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
{ "lastmod", "on|off", 2, 2, 0, ARG_DB|ARG_ON_OFF|ARG_MAGIC|CFG_LASTMOD,
&config_generic, "( OLcfgDbAt:0.4 NAME 'olcLastMod' "
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
+ { "ldapsyntax", "syntax", 2, 0, 0,
+ ARG_PAREN|ARG_MAGIC|CFG_SYNTAX,
+ &config_generic, "( OLcfgGlAt:85 NAME 'olcLdapSyntaxes' "
+ "DESC 'OpenLDAP ldapSyntax' "
+ "EQUALITY caseIgnoreMatch "
+ "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )",
+ NULL, NULL },
{ "limits", "limits", 2, 0, 0, ARG_DB|ARG_MAGIC|CFG_LIMITS,
&config_generic, "( OLcfgDbAt:0.5 NAME 'olcLimits' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
{ "rootdn", "dn", 2, 2, 0, ARG_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
&config_rootdn, "( OLcfgDbAt:0.8 NAME 'olcRootDN' "
+ "EQUALITY distinguishedNameMatch "
"SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
{ "rootDSE", "file", 2, 2, 0, ARG_MAGIC|CFG_ROOTDSE,
&config_generic, "( OLcfgGlAt:51 NAME 'olcRootDSE' "
&config_generic, NULL, NULL, NULL },
{ "sasl-host", "host", 2, 2, 0,
#ifdef HAVE_CYRUS_SASL
- ARG_STRING|ARG_UNIQUE, &global_host,
+ ARG_STRING|ARG_UNIQUE, &sasl_host,
#else
ARG_IGNORED, NULL,
#endif
&config_generic, NULL, NULL, NULL },
{ "schemadn", "dn", 2, 2, 0, ARG_MAY_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
&config_schema_dn, "( OLcfgGlAt:58 NAME 'olcSchemaDN' "
+ "EQUALITY distinguishedNameMatch "
"SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
{ "security", "factors", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,
&config_security, "( OLcfgGlAt:59 NAME 'olcSecurity' "
#endif
"( OLcfgGlAt:77 NAME 'olcTLSDHParamFile' "
"SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
+ { "TLSProtocolMin", NULL, 0, 0, 0,
+#ifdef HAVE_TLS
+ CFG_TLS_PROTOCOL_MIN|ARG_STRING|ARG_MAGIC, &config_tls_config,
+#else
+ ARG_IGNORED, NULL,
+#endif
+ "( OLcfgGlAt:87 NAME 'olcTLSProtocolMin' "
+ "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
{ "tool-threads", "count", 2, 2, 0, ARG_INT|ARG_MAGIC|CFG_TTHREADS,
&config_generic, "( OLcfgGlAt:80 NAME 'olcToolThreads' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
&config_updateref, "( OLcfgDbAt:0.13 NAME 'olcUpdateRef' "
"EQUALITY caseIgnoreMatch "
"SUP labeledURI )", NULL, NULL },
+ { "writetimeout", "timeout", 2, 2, 0, ARG_INT,
+ &global_writetimeout, "( OLcfgGlAt:88 NAME 'olcWriteTimeout' "
+ "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
{ NULL, NULL, 0, 0, 0, ARG_IGNORED,
NULL, NULL, NULL, NULL }
};
+/* Need to no-op this keyword for dynamic config */
+ConfigTable olcDatabaseDummy[] = {
+ { "", "", 0, 0, 0, ARG_IGNORED,
+ NULL, "( OLcfgGlAt:13 NAME 'olcDatabase' "
+ "DESC 'The backend type for a database instance' "
+ "SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", NULL, NULL },
+ { NULL, NULL, 0, 0, 0, ARG_IGNORED }
+};
+
/* Routines to check if a child can be added to this type */
static ConfigLDAPadd cfAddSchema, cfAddInclude, cfAddDatabase,
cfAddBackend, cfAddModule, cfAddOverlay;
"olcConnMaxPending $ olcConnMaxPendingAuth $ "
"olcDisallows $ olcGentleHUP $ olcIdleTimeout $ "
"olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ "
- "olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcLocalSSF $ "
- "olcLogLevel $ "
+ "olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ "
+ "olcLocalSSF $ olcLogFile $ olcLogLevel $ "
"olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ "
"olcPluginLogFile $ olcReadOnly $ olcReferral $ "
"olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ "
"olcTLSCACertificatePath $ olcTLSCertificateFile $ "
"olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ "
"olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ "
- "olcTLSCRLFile $ olcToolThreads $ "
+ "olcTLSCRLFile $ olcToolThreads $ olcWriteTimeout $ "
"olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ "
- "olcDitContentRules ) )", Cft_Global },
+ "olcDitContentRules $ olcLdapSyntaxes ) )", Cft_Global },
{ "( OLcfgGlOc:2 "
"NAME 'olcSchemaConfig' "
"DESC 'OpenLDAP schema object' "
"SUP olcConfig STRUCTURAL "
"MAY ( cn $ olcObjectIdentifier $ olcAttributeTypes $ "
- "olcObjectClasses $ olcDitContentRules ) )",
+ "olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )",
Cft_Schema, NULL, cfAddSchema },
{ "( OLcfgGlOc:3 "
"NAME 'olcBackendConfig' "
"SUP olcConfig STRUCTURAL "
"MUST olcDatabase "
"MAY ( olcHidden $ olcSuffix $ olcSubordinate $ olcAccess $ "
- "olcLastMod $ olcLimits $ "
+ "olcAddContentAcl $ olcLastMod $ olcLimits $ "
"olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ "
"olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ "
"olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ "
static ServerID *sid_list;
+typedef struct voidList {
+ struct voidList *vl_next;
+ void *vl_ptr;
+} voidList;
+
typedef struct ADlist {
struct ADlist *al_next;
AttributeDescription *al_desc;
}
break;
case CFG_OID: {
- ConfigFile *cf = c->private;
+ ConfigFile *cf = c->ca_private;
if ( !cf )
oidm_unparse( &c->rvalue_vals, NULL, NULL, 1 );
else if ( cf->c_om_head )
ad_unparse_options( &c->rvalue_vals );
break;
case CFG_OC: {
- ConfigFile *cf = c->private;
+ ConfigFile *cf = c->ca_private;
if ( !cf )
oc_unparse( &c->rvalue_vals, NULL, NULL, 1 );
else if ( cf->c_oc_head )
}
break;
case CFG_ATTR: {
- ConfigFile *cf = c->private;
+ ConfigFile *cf = c->ca_private;
if ( !cf )
at_unparse( &c->rvalue_vals, NULL, NULL, 1 );
else if ( cf->c_at_head )
rc = 1;
}
break;
+ case CFG_SYNTAX: {
+ ConfigFile *cf = c->ca_private;
+ if ( !cf )
+ syn_unparse( &c->rvalue_vals, NULL, NULL, 1 );
+ else if ( cf->c_syn_head )
+ syn_unparse( &c->rvalue_vals, cf->c_syn_head,
+ cf->c_syn_tail, 0 );
+ if ( !c->rvalue_vals )
+ rc = 1;
+ }
+ break;
case CFG_DIT: {
- ConfigFile *cf = c->private;
+ ConfigFile *cf = c->ca_private;
if ( !cf )
cr_unparse( &c->rvalue_vals, NULL, NULL, 1 );
else if ( cf->c_cr_head )
rc = (!i);
break;
}
+ case CFG_ACL_ADD:
+ c->value_int = (SLAP_DBACL_ADD(c->be) != 0);
+ break;
case CFG_ROOTDSE: {
- ConfigFile *cf = c->private;
+ ConfigFile *cf = c->ca_private;
if ( cf->c_dseFiles ) {
value_add( &c->rvalue_vals, cf->c_dseFiles );
} else {
if ( !BER_BVISEMPTY( &si->si_url )) {
bv.bv_len = si->si_url.bv_len + 6;
bv.bv_val = ch_malloc( bv.bv_len );
- sprintf( bv.bv_val, "%d %s", si->si_num,
+ bv.bv_len = sprintf( bv.bv_val, "%d %s", si->si_num,
si->si_url.bv_val );
ber_bvarray_add( &c->rvalue_vals, &bv );
} else {
case CFG_SSTR_IF_MIN:
c->value_int = index_substr_if_minlen;
break;
+ case CFG_IX_INTLEN:
+ c->value_int = index_intlen;
+ break;
case CFG_SORTVALS: {
ADlist *sv;
rc = 1;
} break;
#ifdef SLAPD_MODULES
case CFG_MODLOAD: {
- ModPaths *mp = c->private;
+ ModPaths *mp = c->ca_private;
if (mp->mp_loads) {
int i;
for (i=0; !BER_BVISNULL(&mp->mp_loads[i]); i++) {
}
break;
case CFG_MODPATH: {
- ModPaths *mp = c->private;
+ ModPaths *mp = c->ca_private;
if ( !BER_BVISNULL( &mp->mp_path ))
value_add_one( &c->rvalue_vals, &mp->mp_path );
case CFG_SASLSECP:
case CFG_SSTR_IF_MAX:
case CFG_SSTR_IF_MIN:
+ case CFG_ACL_ADD:
break;
/* no-ops, requires slapd restart */
case CFG_LOGFILE:
ch_free( logfileName );
logfileName = NULL;
+ if ( logfile ) {
+ fclose( logfile );
+ logfile = NULL;
+ }
break;
case CFG_SERVERID: {
c->be->be_flags &= ~SLAP_DBFLAG_HIDDEN;
break;
+ case CFG_IX_INTLEN:
+ index_intlen = SLAP_INDEX_INTLEN_DEFAULT;
+ index_intlen_strlen = SLAP_INDEX_INTLEN_STRLEN(
+ SLAP_INDEX_INTLEN_DEFAULT );
+ break;
+
case CFG_ACL:
if ( c->valx < 0 ) {
- AccessControl *end;
- if ( c->be == frontendDB )
- end = NULL;
- else
- end = frontendDB->be_acl;
- acl_destroy( c->be->be_acl, end );
- c->be->be_acl = end;
+ acl_destroy( c->be->be_acl );
+ c->be->be_acl = NULL;
} else {
AccessControl **prev, *a;
return 1;
}
}
- cfn = c->private;
+ cfn = c->ca_private;
if ( c->valx < 0 ) {
ObjectClass *oc;
return 1;
}
}
- cfn = c->private;
+ cfn = c->ca_private;
if ( c->valx < 0 ) {
AttributeType *at;
}
}
break;
+
+ case CFG_SYNTAX: {
+ CfEntryInfo *ce;
+ /* Can be NULL when undoing a failed add */
+ if ( c->ca_entry ) {
+ ce = c->ca_entry->e_private;
+ /* can't modify the hardcoded schema */
+ if ( ce->ce_parent->ce_type == Cft_Global )
+ return 1;
+ }
+ }
+ cfn = c->ca_private;
+ if ( c->valx < 0 ) {
+ Syntax *syn;
+
+ for( syn = cfn->c_syn_head; syn; syn_next( &syn )) {
+ syn_delete( syn );
+ if ( syn == cfn->c_syn_tail )
+ break;
+ }
+ cfn->c_syn_head = cfn->c_syn_tail = NULL;
+ } else {
+ Syntax *syn, *prev = NULL;
+
+ for ( i = 0, syn = cfn->c_syn_head; i < c->valx; i++) {
+ prev = syn;
+ syn_next( &syn );
+ }
+ syn_delete( syn );
+ if ( cfn->c_syn_tail == syn ) {
+ cfn->c_syn_tail = prev;
+ }
+ if ( cfn->c_syn_head == syn ) {
+ syn_next( &syn );
+ cfn->c_syn_head = syn;
+ }
+ }
+ break;
case CFG_SORTVALS:
if ( c->valx < 0 ) {
ADlist *sv;
case CFG_OID: {
OidMacro *om;
- if ( c->op == LDAP_MOD_ADD && c->private && cfn != c->private )
- cfn = c->private;
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && cfn != c->ca_private )
+ cfn = c->ca_private;
if(parse_oidm(c, 1, &om))
return(1);
if (!cfn->c_om_head) cfn->c_om_head = om;
case CFG_OC: {
ObjectClass *oc, *prev;
- if ( c->op == LDAP_MOD_ADD && c->private && cfn != c->private )
- cfn = c->private;
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && cfn != c->ca_private )
+ cfn = c->ca_private;
if ( c->valx < 0 ) {
prev = cfn->c_oc_tail;
} else {
case CFG_ATTR: {
AttributeType *at, *prev;
- if ( c->op == LDAP_MOD_ADD && c->private && cfn != c->private )
- cfn = c->private;
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && cfn != c->ca_private )
+ cfn = c->ca_private;
if ( c->valx < 0 ) {
prev = cfn->c_at_tail;
} else {
}
break;
+ case CFG_SYNTAX: {
+ Syntax *syn, *prev;
+
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && cfn != c->ca_private )
+ cfn = c->ca_private;
+ if ( c->valx < 0 ) {
+ prev = cfn->c_syn_tail;
+ } else {
+ prev = NULL;
+ /* If adding anything after the first, prev is easy */
+ if ( c->valx ) {
+ int i;
+ for ( i = 0, syn = cfn->c_syn_head; i < c->valx; i++ ) {
+ prev = syn;
+ syn_next( &syn );
+ }
+ } else
+ /* If adding the first, and head exists, find its prev */
+ if (cfn->c_syn_head) {
+ for ( syn_start( &syn ); syn != cfn->c_syn_head; ) {
+ prev = syn;
+ syn_next( &syn );
+ }
+ }
+ /* else prev is NULL, append to end of global list */
+ }
+ if ( parse_syn( c, &syn, prev ) ) return(1);
+ if ( !cfn->c_syn_head ) cfn->c_syn_head = syn;
+ if ( cfn->c_syn_tail == prev ) cfn->c_syn_tail = syn;
+ }
+ break;
+
case CFG_DIT: {
ContentRule *cr;
- if ( c->op == LDAP_MOD_ADD && c->private && cfn != c->private )
- cfn = c->private;
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && cfn != c->ca_private )
+ cfn = c->ca_private;
if(parse_cr(c, &cr)) return(1);
if (!cfn->c_cr_head) cfn->c_cr_head = cr;
cfn->c_cr_tail = cr;
return(1);
break;
+ case CFG_IX_INTLEN:
+ if ( c->value_int < SLAP_INDEX_INTLEN_DEFAULT )
+ c->value_int = SLAP_INDEX_INTLEN_DEFAULT;
+ else if ( c->value_int > 255 )
+ c->value_int = 255;
+ index_intlen = c->value_int;
+ index_intlen_strlen = SLAP_INDEX_INTLEN_STRLEN(
+ index_intlen );
+ break;
+
case CFG_SORTVALS: {
ADlist *svnew = NULL, *svtail, *sv;
case CFG_ACL:
/* 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 ) {
+ if ( c->valx == -1 ) {
AccessControl *a;
i = 0;
- for ( a=c->be->be_acl; a && a != frontendDB->be_acl;
- a = a->acl_next )
+ for ( a=c->be->be_acl; a; a = a->acl_next )
i++;
}
if ( parse_acl(c->be, c->fname, c->lineno, c->argc, c->argv, i ) ) {
}
break;
+ case CFG_ACL_ADD:
+ if(c->value_int)
+ SLAP_DBFLAGS(c->be) |= SLAP_DBFLAG_ACL_ADD;
+ else
+ SLAP_DBFLAGS(c->be) &= ~SLAP_DBFLAG_ACL_ADD;
+ break;
+
case CFG_ROOTDSE:
if(root_dse_read_file(c->argv[1])) {
snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> could not read file", c->argv[0] );
{
struct berval bv;
ber_str2bv( c->argv[1], 0, 1, &bv );
- if ( c->op == LDAP_MOD_ADD && c->private && cfn != c->private )
- cfn = c->private;
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && cfn != c->ca_private )
+ cfn = c->ca_private;
ber_bvarray_add( &cfn->c_dseFiles, &bv );
}
break;
*sip = si;
if (( slapMode & SLAP_SERVER_MODE ) && c->argc > 2 ) {
+ Listener **l = slapd_get_listeners();
+ int i, isMe = 0;
+
+ /* Try a straight compare with Listener strings */
+ for ( i=0; l && l[i]; i++ ) {
+ if ( !strcasecmp( c->argv[2], l[i]->sl_url.bv_val )) {
+ isMe = 1;
+ break;
+ }
+ }
+
/* If hostname is empty, or is localhost, or matches
* our hostname, this serverID refers to this host.
* Compare it against listeners and ports.
*/
- if ( !lud->lud_host || !lud->lud_host[0] ||
+ if ( !isMe && ( !lud->lud_host || !lud->lud_host[0] ||
!strncasecmp("localhost", lud->lud_host,
STRLENOF("localhost")) ||
- !strcasecmp( global_host, lud->lud_host )) {
- Listener **l = slapd_get_listeners();
- int i;
+ !strcasecmp( global_host, lud->lud_host ))) {
- for ( i=0; l[i]; i++ ) {
+ for ( i=0; l && l[i]; i++ ) {
LDAPURLDesc *lu2;
- int isMe = 0;
ldap_url_parse( l[i]->sl_url.bv_val, &lu2 );
do {
if ( strcasecmp( lud->lud_scheme,
} while(0);
ldap_free_urldesc( lu2 );
if ( isMe ) {
- slap_serverID = si->si_num;
- Debug( LDAP_DEBUG_CONFIG,
- "%s: SID=%d (listener=%s)\n",
- c->log, slap_serverID,
- l[i]->sl_url.bv_val );
break;
}
}
}
+ if ( isMe ) {
+ slap_serverID = si->si_num;
+ Debug( LDAP_DEBUG_CONFIG,
+ "%s: SID=%d (listener=%s)\n",
+ c->log, slap_serverID,
+ l[i]->sl_url.bv_val );
+ }
}
if ( c->argc > 2 )
ldap_free_urldesc( lud );
}
break;
case CFG_LOGFILE: {
- FILE *logfile;
if ( logfileName ) ch_free( logfileName );
logfileName = c->value_string;
logfile = fopen(logfileName, "w");
/* If we're just adding a module on an existing modpath,
* make sure we've selected the current path.
*/
- if ( c->op == LDAP_MOD_ADD && c->private && modcur != c->private ) {
- modcur = c->private;
+ if ( c->op == LDAP_MOD_ADD && c->ca_private && modcur != c->ca_private ) {
+ modcur = c->ca_private;
/* This should never fail */
if ( module_path( modcur->mp_path.bv_val )) {
snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> module path no longer valid",
mp->mp_next = NULL;
mp->mp_loads = NULL;
modlast = mp;
- c->private = mp;
+ c->ca_private = mp;
modcur = mp;
}
static int
config_fname(ConfigArgs *c) {
if(c->op == SLAP_CONFIG_EMIT) {
- if (c->private) {
- ConfigFile *cf = c->private;
+ if (c->ca_private) {
+ ConfigFile *cf = c->ca_private;
value_add_one( &c->rvalue_vals, &cf->c_file );
return 0;
}
assert(0);
}
if(c->argv[1][0] == '-' && overlay_config(c->be, &c->argv[1][1],
- c->valx, &c->bi)) {
+ c->valx, &c->bi, &c->reply)) {
/* log error */
Debug( LDAP_DEBUG_ANY,
"%s: (optional) %s overlay \"%s\" configuration failed.\n",
c->log, c->be == frontendDB ? "global " : "", &c->argv[1][1]);
return 1;
- } else if(overlay_config(c->be, c->argv[1], c->valx, &c->bi)) {
+ } else if(overlay_config(c->be, c->argv[1], c->valx, &c->bi, &c->reply)) {
return(1);
}
return(0);
}
#endif
+ if (SLAP_DB_ONE_SUFFIX( c->be ) && c->be->be_suffix ) {
+ snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> Only one suffix is allowed on this %s backend",
+ c->argv[0], c->be->bd_info->bi_type );
+ Debug(LDAP_DEBUG_ANY, "%s: %s\n",
+ c->log, c->cr_msg, 0);
+ return(1);
+ }
+
pdn = c->value_dn;
ndn = c->value_ndn;
+
if (SLAP_DBHIDDEN( c->be ))
tbe = NULL;
else
{ BER_BVC("bind_simple"), SLAP_DISALLOW_BIND_SIMPLE },
{ BER_BVC("tls_2_anon"), SLAP_DISALLOW_TLS_2_ANON },
{ BER_BVC("tls_authc"), SLAP_DISALLOW_TLS_AUTHC },
+ { BER_BVC("proxy_authz_non_critical"), SLAP_DISALLOW_PROXY_AUTHZ_N_CRIT },
+ { BER_BVC("dontusecopy_non_critical"), SLAP_DISALLOW_DONTUSECOPY_N_CRIT },
{ BER_BVNULL, 0 }
};
if (c->op == SLAP_CONFIG_EMIT) {
return 1;
}
- SLAP_DBFLAGS(c->be) |= (SLAP_DBFLAG_SHADOW | SLAP_DBFLAG_SINGLE_SHADOW | flag);
+ if ( SLAP_SHADOW(c->be) ) {
+ /* if already shadow, only check consistency */
+ if ( ( SLAP_DBFLAGS(c->be) & flag ) != flag ) {
+ Debug( LDAP_DEBUG_ANY, "%s: inconsistent shadow flag 0x%x.\n", c->log, flag, 0 );
+ return 1;
+ }
+
+ } else {
+ SLAP_DBFLAGS(c->be) |= (SLAP_DBFLAG_SHADOW | SLAP_DBFLAG_SINGLE_SHADOW | flag);
+ }
return 0;
}
ch_free( cf->c_file.bv_val );
ch_free( cf );
} else {
- c->private = cf;
+ c->ca_private = cf;
}
return(rc);
}
switch(c->type) {
case CFG_TLS_CRLCHECK: flag = LDAP_OPT_X_TLS_CRLCHECK; break;
case CFG_TLS_VERIFY: flag = LDAP_OPT_X_TLS_REQUIRE_CERT; break;
+ case CFG_TLS_PROTOCOL_MIN: flag = LDAP_OPT_X_TLS_PROTOCOL_MIN; break;
default:
Debug(LDAP_DEBUG_ANY, "%s: "
"unknown tls_option <0x%x>\n",
}
return(ldap_pvt_tls_set_option(slap_tls_ld, flag, &i));
} else {
- return(ldap_int_tls_config(slap_tls_ld, flag, c->argv[1]));
+ return(ldap_pvt_tls_config(slap_tls_ld, flag, c->argv[1]));
}
}
#endif
ConfigArgs *ca;
Entry *frontend;
Entry *config;
- int got_frontend;
+ int got_frontend;
int got_config;
} setup_cookie;
{
if ( rs->sr_type == REP_SEARCH ) {
setup_cookie *sc = op->o_callback->sc_private;
+ struct berval pdn;
sc->cfb->cb_got_ldif = 1;
/* Does the frontend exist? */
if ( !sc->got_frontend ) {
if ( !strncmp( rs->sr_entry->e_nname.bv_val,
- "olcDatabase", STRLENOF( "olcDatabase" ))) {
+ "olcDatabase", STRLENOF( "olcDatabase" )))
+ {
if ( strncmp( rs->sr_entry->e_nname.bv_val +
STRLENOF( "olcDatabase" ), "={-1}frontend",
- STRLENOF( "={-1}frontend" ))) {
+ STRLENOF( "={-1}frontend" )))
+ {
struct berval rdn;
int i = op->o_noop;
sc->ca->be = frontendDB;
}
}
}
+
+ dnParent( &rs->sr_entry->e_nname, &pdn );
+
/* Does the configDB exist? */
if ( sc->got_frontend && !sc->got_config &&
!strncmp( rs->sr_entry->e_nname.bv_val,
- "olcDatabase", STRLENOF( "olcDatabase" ))) {
+ "olcDatabase", STRLENOF( "olcDatabase" )) &&
+ dn_match( &config_rdn, &pdn ) )
+ {
if ( strncmp( rs->sr_entry->e_nname.bv_val +
STRLENOF( "olcDatabase" ), "={0}config",
- STRLENOF( "={0}config" ))) {
+ STRLENOF( "={0}config" )))
+ {
struct berval rdn;
int i = op->o_noop;
sc->ca->be = LDAP_STAILQ_FIRST( &backendDB );
rs->sr_entry = ce->ce_entry;
rs->sr_flags = 0;
rc = send_search_entry( op, rs );
+ if ( rc != LDAP_SUCCESS ) {
+ return rc;
+ }
}
if ( op->ors_scope == LDAP_SCOPE_SUBTREE ) {
if ( ce->ce_kids ) {
struct berval rdn, nrdn;
for (ce2 = ce->ce_kids; ce2; ce2 = ce2->ce_sibs) {
+ struct berval newdn, newndn;
dnRdn ( &ce2->ce_entry->e_name, &rdn );
dnRdn ( &ce2->ce_entry->e_nname, &nrdn );
+ build_new_dn( &newdn, &ce->ce_entry->e_name, &rdn, NULL );
+ build_new_dn( &newndn, &ce->ce_entry->e_nname, &nrdn, NULL );
free( ce2->ce_entry->e_name.bv_val );
free( ce2->ce_entry->e_nname.bv_val );
- build_new_dn( &ce2->ce_entry->e_name, &ce->ce_entry->e_name,
- &rdn, NULL );
- build_new_dn( &ce2->ce_entry->e_nname, &ce->ce_entry->e_nname,
- &nrdn, NULL );
+ ce2->ce_entry->e_name = newdn;
+ ce2->ce_entry->e_nname = newndn;
config_rename_kids( ce2 );
}
}
isconfig = 1;
}
ptr1 = ber_bvchr( &e->e_name, '{' );
- if ( ptr1 && ptr1 - e->e_name.bv_val < rdn.bv_len ) {
+ if ( ptr1 && ptr1 < &e->e_name.bv_val[ rdn.bv_len ] ) {
char *next;
ptr2 = strchr( ptr1, '}' );
- if (!ptr2 || ptr2 - e->e_name.bv_val > rdn.bv_len)
+ if ( !ptr2 || ptr2 > &e->e_name.bv_val[ rdn.bv_len ] )
return LDAP_NAMING_VIOLATION;
if ( ptr2-ptr1 == 1)
return LDAP_NAMING_VIOLATION;
if ( isconfig && index == -1 ) {
index = 0;
}
- if ( !isfrontend && index == -1 ) {
+ if (( !isfrontend && index == -1 ) || ( index > nsibs ) ){
index = nsibs;
}
/* This entry is hardcoded, don't re-parse it */
if ( p->ce_type == Cft_Global ) {
cfn = p->ce_private;
- ca->private = cfn;
+ ca->ca_private = cfn;
return LDAP_COMPARE_TRUE;
}
if ( p->ce_type != Cft_Schema )
return LDAP_CONSTRAINT_VIOLATION;
cfn = ch_calloc( 1, sizeof(ConfigFile) );
- ca->private = cfn;
+ ca->ca_private = cfn;
cfo = p->ce_private;
cfn->c_sibs = cfo->c_kids;
cfo->c_kids = cfn;
if ( p->ce_type != Cft_Global ) {
return LDAP_CONSTRAINT_VIOLATION;
}
+ /* config must be {0}, nothing else allowed */
+ if ( !strncmp( e->e_nname.bv_val, "olcDatabase={0}", STRLENOF("olcDatabase={0}")) &&
+ strncmp( e->e_nname.bv_val + STRLENOF("olcDatabase={0}"), "config,", STRLENOF("config,") )) {
+ return LDAP_CONSTRAINT_VIOLATION;
+ }
ca->be = frontendDB; /* just to get past check_vals */
return LDAP_SUCCESS;
}
ct = config_find_table( colst, nocs, ad, ca );
config_del_vals( ct, ca );
}
+ if ( cfn->c_syn_head ) {
+ struct berval bv = BER_BVC("olcLdapSyntaxes");
+ ad = NULL;
+ slap_bv2ad( &bv, &ad, &text );
+ ct = config_find_table( colst, nocs, ad, ca );
+ config_del_vals( ct, ca );
+ }
if ( cfn->c_om_head ) {
struct berval bv = BER_BVC("olcObjectIdentifier");
ad = NULL;
rc = LDAP_CONSTRAINT_VIOLATION;
if ( coptr->co_type == Cft_Global && !last ) {
cfn = cfb->cb_config;
- ca->private = cfn;
+ ca->ca_private = cfn;
ca->be = frontendDB; /* just to get past check_vals */
rc = LDAP_SUCCESS;
}
if ( !ct ) continue; /* user data? */
for (i=0; a->a_vals[i].bv_val; i++) {
char *iptr = NULL;
+ ca->valx = -1;
ca->line = a->a_vals[i].bv_val;
if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED ) {
ptr = strchr( ca->line, '}' );
if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED_SIB ) {
if ( iptr ) {
ca->valx = strtol( iptr+1, NULL, 0 );
- } else {
- ca->valx = -1;
}
} else {
ca->valx = i;
ce->ce_type = colst[0]->co_type;
ce->ce_be = ca->be;
ce->ce_bi = ca->bi;
- ce->ce_private = ca->private;
+ ce->ce_private = ca->ca_private;
ca->ca_entry = ce->ce_entry;
if ( !last ) {
cfb->cb_root = ce;
goto out;
}
+ /*
+ * Check for attribute ACL
+ */
+ if ( !acl_check_modlist( op, op->ora_e, op->orm_modlist )) {
+ rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
+ rs->sr_text = "no write access to attribute";
+ goto out;
+ }
+
cfb = (CfBackInfo *)op->o_bd->be_private;
/* add opattrs for syncprov */
{
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
- rs->sr_err = entry_schema_check(op, op->ora_e, NULL, 0, 1,
+ rs->sr_err = entry_schema_check(op, op->ora_e, NULL, 0, 1, NULL,
&rs->sr_text, textbuf, sizeof( textbuf ) );
if ( rs->sr_err != LDAP_SUCCESS )
goto out;
{
int rc;
+ ca->valx = -1;
if (ad->ad_type->sat_flags & SLAP_AT_ORDERED &&
ca->line[0] == '{' )
{
init_config_argv( ca );
ca->be = ce->ce_be;
ca->bi = ce->ce_bi;
- ca->private = ce->ce_private;
+ ca->ca_private = ce->ce_private;
ca->ca_entry = e;
ca->fname = "slapd";
ca->ca_op = op;
if ( rc == LDAP_SUCCESS) {
/* check that the entry still obeys the schema */
- rc = entry_schema_check(op, e, NULL, 0, 0,
+ rc = entry_schema_check(op, e, NULL, 0, 0, NULL,
&rs->sr_text, ca->cr_msg, sizeof(ca->cr_msg) );
- if ( rc ) goto out_noop;
}
+ if ( rc ) goto out_noop;
+
/* Basic syntax checks are OK. Do the actual settings. */
for ( ml = op->orm_modlist; ml; ml = ml->sml_next ) {
ct = config_find_table( colst, nocs, ml->sml_desc, ca );
out:
/* Undo for a failed operation */
if ( rc != LDAP_SUCCESS ) {
+ ConfigReply msg = ca->reply;
for ( s = save_attrs; s; s = s->a_next ) {
if ( s->a_flags & SLAP_ATTR_IXDEL ) {
s->a_flags &= ~(SLAP_ATTR_IXDEL|SLAP_ATTR_IXADD);
}
}
}
+ ca->reply = msg;
}
if ( ca->cleanup )
struct berval rdn;
char *ptr;
AttributeDescription *rad = NULL;
+ int do_pause = 1;
cfb = (CfBackInfo *)op->o_bd->be_private;
rs->sr_text = "Use modrdn to change the entry name";
goto out;
}
+ /* Internal update of contextCSN? */
+ if ( ml->sml_desc == slap_schema.si_ad_contextCSN && op->o_conn->c_conn_idx == -1 ) {
+ do_pause = 0;
+ break;
+ }
}
slap_mods_opattrs( op, &op->orm_modlist, 1 );
- if ( !slapd_shutdown )
+ if ( do_pause )
ldap_pvt_thread_pool_pause( &connection_pool );
/* Strategy:
op->o_ndn = ndn;
}
- if ( !slapd_shutdown )
+ if ( do_pause )
ldap_pvt_thread_pool_resume( &connection_pool );
out:
send_ldap_result( op, rs );
static int
config_back_delete( Operation *op, SlapReply *rs )
{
- send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, NULL );
+#ifdef SLAP_CONFIG_DELETE
+ CfBackInfo *cfb;
+ CfEntryInfo *ce, *last, *ce2;
+
+ cfb = (CfBackInfo *)op->o_bd->be_private;
+
+ ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last );
+ if ( !ce ) {
+ if ( last )
+ rs->sr_matched = last->ce_entry->e_name.bv_val;
+ rs->sr_err = LDAP_NO_SUCH_OBJECT;
+ } else if ( ce->ce_kids ) {
+ rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
+ } else if ( ce->ce_type == Cft_Overlay || ce->ce_type == Cft_Database ){
+ char *iptr;
+ int count, ixold;
+
+ ldap_pvt_thread_pool_pause( &connection_pool );
+
+ if ( ce->ce_type == Cft_Overlay ){
+ overlay_remove( ce->ce_be, (slap_overinst *)ce->ce_bi );
+ } else { /* Cft_Database*/
+ if ( ce->ce_be == frontendDB || ce->ce_be == op->o_bd ){
+ rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
+ rs->sr_text = "Cannot delete config or frontend database";
+ ldap_pvt_thread_pool_resume( &connection_pool );
+ goto out;
+ }
+ if ( ce->ce_be->bd_info->bi_db_close ) {
+ ce->ce_be->bd_info->bi_db_close( ce->ce_be, NULL );
+ }
+ backend_destroy_one( ce->ce_be, 1);
+ }
+
+ /* remove CfEntryInfo from the siblings list */
+ if ( ce->ce_parent->ce_kids == ce ) {
+ ce->ce_parent->ce_kids = ce->ce_sibs;
+ } else {
+ for ( ce2 = ce->ce_parent->ce_kids ; ce2; ce2 = ce2->ce_sibs ) {
+ if ( ce2->ce_sibs == ce ) {
+ ce2->ce_sibs = ce->ce_sibs;
+ break;
+ }
+ }
+ }
+
+ /* remove from underlying database */
+ if ( cfb->cb_use_ldif ) {
+ BackendDB *be = op->o_bd;
+ slap_callback sc = { NULL, slap_null_cb, NULL, NULL }, *scp;
+ struct berval dn, ndn, req_dn, req_ndn;
+
+ op->o_bd = &cfb->cb_db;
+
+ dn = op->o_dn;
+ ndn = op->o_ndn;
+ req_dn = op->o_req_dn;
+ req_ndn = op->o_req_ndn;
+
+ op->o_dn = op->o_bd->be_rootdn;
+ op->o_ndn = op->o_bd->be_rootndn;
+ op->o_req_dn = ce->ce_entry->e_name;
+ op->o_req_ndn = ce->ce_entry->e_nname;
+
+ scp = op->o_callback;
+ op->o_callback = ≻
+ op->o_bd->be_delete( op, rs );
+ op->o_bd = be;
+ op->o_callback = scp;
+ op->o_dn = dn;
+ op->o_ndn = ndn;
+ op->o_req_dn = req_dn;
+ op->o_req_ndn = req_ndn;
+ }
+
+ /* renumber siblings */
+ iptr = ber_bvchr( &op->o_req_ndn, '{' ) + 1;
+ ixold = strtol( iptr, NULL, 0 );
+ for (ce2 = ce->ce_sibs, count=0; ce2; ce2=ce2->ce_sibs) {
+ config_renumber_one( op, rs, ce2->ce_parent, ce2->ce_entry,
+ count+ixold, 0, cfb->cb_use_ldif );
+ count++;
+ }
+
+ ce->ce_entry->e_private=NULL;
+ entry_free(ce->ce_entry);
+ ch_free(ce);
+ ldap_pvt_thread_pool_resume( &connection_pool );
+ } else {
+ rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
+ }
+#else
+ rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
+#endif /* SLAP_CONFIG_DELETE */
+out:
+ send_ldap_result( op, rs );
return rs->sr_err;
}
switch ( op->ors_scope ) {
case LDAP_SCOPE_BASE:
case LDAP_SCOPE_SUBTREE:
- config_send( op, rs, ce, 0 );
+ rs->sr_err = config_send( op, rs, ce, 0 );
break;
case LDAP_SCOPE_ONELEVEL:
for (ce = ce->ce_kids; ce; ce=ce->ce_sibs) {
- config_send( op, rs, ce, 1 );
+ rs->sr_err = config_send( op, rs, ce, 1 );
+ if ( rs->sr_err ) {
+ break;
+ }
}
break;
}
-
- rs->sr_err = LDAP_SUCCESS;
+
out:
send_ldap_result( op, rs );
- return 0;
+ return rs->sr_err;
}
/* no-op, we never free entries */
{
CfBackInfo *cfb;
CfEntryInfo *ce, *last;
+ int rc = LDAP_NO_SUCH_OBJECT;
cfb = (CfBackInfo *)op->o_bd->be_private;
ce = config_find_base( cfb->cb_root, ndn, &last );
if ( ce ) {
*ent = ce->ce_entry;
- if ( *ent && oc && !is_entry_objectclass_or_sub( *ent, oc ) ) {
- *ent = NULL;
+ if ( *ent ) {
+ rc = LDAP_SUCCESS;
+ if ( oc && !is_entry_objectclass_or_sub( *ent, oc ) ) {
+ rc = LDAP_NO_SUCH_ATTRIBUTE;
+ *ent = NULL;
+ }
}
}
- return ( *ent == NULL ? 1 : 0 );
+ return rc;
}
-static void
+static int
config_build_attrs( Entry *e, AttributeType **at, AttributeDescription *ad,
ConfigTable *ct, ConfigArgs *c )
{
* returns success with no values */
if (rc == LDAP_SUCCESS && c->rvalue_vals != NULL ) {
if ( c->rvalue_nvals )
- attr_merge(e, ct[i].ad, c->rvalue_vals,
+ rc = attr_merge(e, ct[i].ad, c->rvalue_vals,
c->rvalue_nvals);
- else
- attr_merge_normalize(e, ct[i].ad,
+ else {
+ slap_syntax_validate_func *validate =
+ ct[i].ad->ad_type->sat_syntax->ssyn_validate;
+ if ( validate ) {
+ int j;
+ for ( j=0; c->rvalue_vals[j].bv_val; j++ ) {
+ rc = ordered_value_validate( ct[i].ad,
+ &c->rvalue_vals[j], LDAP_MOD_ADD );
+ if ( rc ) {
+ Debug( LDAP_DEBUG_ANY,
+ "config_build_attrs: error %d on %s value #%d\n",
+ rc, ct[i].ad->ad_cname.bv_val, j );
+ return rc;
+ }
+ }
+ }
+
+ rc = attr_merge_normalize(e, ct[i].ad,
c->rvalue_vals, NULL);
+ }
ber_bvarray_free( c->rvalue_nvals );
ber_bvarray_free( c->rvalue_vals );
+ if ( rc ) {
+ Debug( LDAP_DEBUG_ANY,
+ "config_build_attrs: error %d on %s\n",
+ rc, ct[i].ad->ad_cname.bv_val, 0 );
+ return rc;
+ }
}
break;
}
}
}
+ return 0;
}
Entry *
AttributeDescription *ad = NULL;
int rc;
char *ptr;
- const char *text;
+ const char *text = "";
Attribute *oc_at;
struct berval pdn;
ObjectClass *oc;
ce->ce_parent = parent;
if ( parent ) {
pdn = parent->ce_entry->e_nname;
- if ( parent->ce_kids )
+ if ( parent->ce_kids && parent->ce_kids->ce_type <= ce->ce_type )
for ( ceprev = parent->ce_kids; ceprev->ce_sibs &&
ceprev->ce_type <= ce->ce_type;
ceprev = ceprev->ce_sibs );
BER_BVZERO( &pdn );
}
- ce->ce_private = c->private;
+ ce->ce_private = c->ca_private;
ce->ce_be = c->be;
ce->ce_bi = c->bi;
ad_name.bv_len = ptr - rdn->bv_val;
rc = slap_bv2ad( &ad_name, &ad, &text );
if ( rc ) {
- return NULL;
+ goto fail;
}
val.bv_val = ptr+1;
val.bv_len = rdn->bv_len - (val.bv_val - rdn->bv_val);
oc = main->co_oc;
c->table = main->co_type;
- if ( oc->soc_required )
- config_build_attrs( e, oc->soc_required, ad, main->co_table, c );
+ if ( oc->soc_required ) {
+ rc = config_build_attrs( e, oc->soc_required, ad, main->co_table, c );
+ if ( rc ) goto fail;
+ }
- if ( oc->soc_allowed )
- config_build_attrs( e, oc->soc_allowed, ad, main->co_table, c );
+ if ( oc->soc_allowed ) {
+ rc = config_build_attrs( e, oc->soc_allowed, ad, main->co_table, c );
+ if ( rc ) goto fail;
+ }
if ( extra ) {
oc = extra->co_oc;
c->table = extra->co_type;
- if ( oc->soc_required )
- config_build_attrs( e, oc->soc_required, ad, extra->co_table, c );
+ if ( oc->soc_required ) {
+ rc = config_build_attrs( e, oc->soc_required, ad, extra->co_table, c );
+ if ( rc ) goto fail;
+ }
- if ( oc->soc_allowed )
- config_build_attrs( e, oc->soc_allowed, ad, extra->co_table, c );
+ if ( oc->soc_allowed ) {
+ rc = config_build_attrs( e, oc->soc_allowed, ad, extra->co_table, c );
+ if ( rc ) goto fail;
+ }
}
oc_at = attr_find( e->e_attrs, slap_schema.si_ad_objectClass );
rc = structural_class(oc_at->a_vals, &oc, NULL, &text, c->cr_msg,
sizeof(c->cr_msg), op ? op->o_tmpmemctx : NULL );
+ if ( rc != LDAP_SUCCESS ) {
+fail:
+ Debug( LDAP_DEBUG_ANY,
+ "config_build_entry: build \"%s\" failed: \"%s\"\n",
+ rdn->bv_val, text, 0);
+ return NULL;
+ }
attr_merge_normalize_one(e, slap_schema.si_ad_structuralObjectClass, &oc->soc_cname, NULL );
- if ( op && !op->o_noop ) {
+ if ( op ) {
op->ora_e = e;
op->ora_modlist = NULL;
- op->o_bd->be_add( op, rs );
- if ( ( rs->sr_err != LDAP_SUCCESS )
- && (rs->sr_err != LDAP_ALREADY_EXISTS) ) {
- return NULL;
+ slap_add_opattrs( op, NULL, NULL, 0, 0 );
+ if ( !op->o_noop ) {
+ op->o_bd->be_add( op, rs );
+ if ( ( rs->sr_err != LDAP_SUCCESS )
+ && (rs->sr_err != LDAP_ALREADY_EXISTS) ) {
+ goto fail;
+ }
}
}
if ( ceprev ) {
Operation *op, SlapReply *rs )
{
Entry *e;
- ConfigFile *cf = c->private;
+ ConfigFile *cf = c->ca_private;
char *ptr;
- struct berval bv;
+ struct berval bv, rdn;
for (; cf; cf=cf->c_sibs, c->depth++) {
if ( !cf->c_at_head && !cf->c_cr_head && !cf->c_oc_head &&
- !cf->c_om_head ) continue;
+ !cf->c_om_head && !cf->c_syn_head ) continue;
c->value_dn.bv_val = c->log;
LUTIL_SLASHPATH( cf->c_file.bv_val );
bv.bv_val = strrchr(cf->c_file.bv_val, LDAP_DIRSEP[0]);
bv.bv_len );
c->value_dn.bv_len += bv.bv_len;
c->value_dn.bv_val[c->value_dn.bv_len] ='\0';
+ rdn = c->value_dn;
- c->private = cf;
- e = config_build_entry( op, rs, ceparent, c, &c->value_dn,
+ c->ca_private = cf;
+ e = config_build_entry( op, rs, ceparent, c, &rdn,
&CFOC_SCHEMA, NULL );
if ( !e ) {
return -1;
} else if ( e && cf->c_kids ) {
- c->private = cf->c_kids;
+ c->ca_private = cf->c_kids;
config_build_schema_inc( c, e->e_private, op, rs );
}
}
/* FIXME: how can indicate error? */
return -1;
}
- c->private = mp;
+ c->ca_private = mp;
if ( ! config_build_entry( op, rs, ceparent, c, &c->value_dn, &CFOC_MODULE, NULL )) {
return -1;
}
ber_bvarray_free( bv );
cf_oc_tail = oc_sys_tail;
}
+ if ( cf_syn_tail != syn_sys_tail ) {
+ a = attr_find( e->e_attrs, cfAd_syntax );
+ if ( a ) {
+ if ( a->a_nvals != a->a_vals )
+ ber_bvarray_free( a->a_nvals );
+ ber_bvarray_free( a->a_vals );
+ a->a_vals = NULL;
+ a->a_nvals = NULL;
+ a->a_numvals = 0;
+ }
+ syn_unparse( &bv, NULL, NULL, 1 );
+ attr_merge_normalize( e, cfAd_syntax, bv, NULL );
+ ber_bvarray_free( bv );
+ cf_syn_tail = syn_sys_tail;
+ }
} else {
SlapReply rs = {REP_RESULT};
- c.private = NULL;
+ c.ca_private = NULL;
e = config_build_entry( op, &rs, cfb->cb_root, &c, &schema_rdn,
&CFOC_SCHEMA, NULL );
if ( !e ) {
cf_at_tail = at_sys_tail;
cf_oc_tail = oc_sys_tail;
cf_om_tail = om_sys_tail;
+ cf_syn_tail = syn_sys_tail;
}
return 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 ) {
+ if ( !be->be_acl ) {
parse_acl(be, "config_back_db_open", 0, 6, (char **)defacl, 0 );
}
/* create root of tree */
rdn = config_rdn;
- c.private = cfb->cb_config;
+ c.ca_private = cfb->cb_config;
c.be = frontendDB;
e = config_build_entry( op, &rs, NULL, &c, &rdn, &CFOC_GLOBAL, NULL );
if ( !e ) {
* files.
*/
rdn = schema_rdn;
- c.private = NULL;
+ c.ca_private = NULL;
e = config_build_entry( op, &rs, ceparent, &c, &rdn, &CFOC_SCHEMA, NULL );
if ( !e ) {
return -1;
cf_at_tail = at_sys_tail;
cf_oc_tail = oc_sys_tail;
cf_om_tail = om_sys_tail;
+ cf_syn_tail = syn_sys_tail;
/* Create schema nodes for included schema... */
if ( cfb->cb_config->c_kids ) {
c.depth = 0;
- c.private = cfb->cb_config->c_kids;
+ c.ca_private = cfb->cb_config->c_kids;
if (config_build_schema_inc( &c, ce, op, &rs )) {
return -1;
}
slap_overinst *on;
Entry *oe;
int j;
-
- for (j=0,on=oi->oi_list; on; j++,on=on->on_next) {
+ voidList *vl, *v0 = NULL;
+
+ /* overlays are in LIFO order, must reverse stack */
+ for (on=oi->oi_list; on; on=on->on_next) {
+ vl = ch_malloc( sizeof( voidList ));
+ vl->vl_next = v0;
+ v0 = vl;
+ vl->vl_ptr = on;
+ }
+ for (j=0; vl; j++,vl=v0) {
+ on = vl->vl_ptr;
+ v0 = vl->vl_next;
+ ch_free( vl );
if ( on->on_bi.bi_db_config && !on->on_bi.bi_cf_ocs ) {
Debug( LDAP_DEBUG_ANY,
"WARNING: No dynamic config support for overlay %s.\n",
/* Hide from namingContexts */
SLAP_BFLAGS(be) |= SLAP_BFLAG_CONFIG;
+ /* Check ACLs on content of Adds by default */
+ SLAP_DBFLAGS(be) |= SLAP_DBFLAG_ACL_ADD;
+
return 0;
}
Connection conn = {0};
Operation *op = NULL;
void *thrctx;
+ int isFrontend = 0;
/* Create entry for frontend database if it does not exist already */
if ( !entry_put_got_frontend ) {
}
} else {
entry_put_got_frontend++;
+ isFrontend = 1;
}
}
}
/* Create entry for config database if it does not exist already */
- if ( !entry_put_got_config ) {
+ if ( !entry_put_got_config && !isFrontend ) {
if ( !strncmp( e->e_nname.bv_val, "olcDatabase",
STRLENOF( "olcDatabase" ))) {
if ( strncmp( e->e_nname.bv_val +
{ "backend", &cfAd_backend },
{ "database", &cfAd_database },
{ "include", &cfAd_include },
+ { "ldapsyntax", &cfAd_syntax },
{ "objectclass", &cfAd_oc },
{ "objectidentifier", &cfAd_om },
{ "overlay", &cfAd_overlay },
i = config_register_schema( ct, cf_ocs );
if ( i ) return i;
+ i = slap_str2ad( "olcDatabase", &olcDatabaseDummy[0].ad, &text );
+ if ( i ) return i;
+
/* setup olcRootPW to be base64-encoded when written in LDIF form;
* basically, we don't care if it fails */
i = slap_str2ad( "olcRootPW", &ad, &text );