#ifndef _SLAP_H_
#define _SLAP_H_
-#define USE_LDAP_DN_PARSING
-
#include "ldap_defaults.h"
+#include <stdio.h>
#include <ac/stdlib.h>
#include <sys/types.h>
#define ssyn_oid ssyn_syn.syn_oid
#define ssyn_desc ssyn_syn.syn_desc
#define ssyn_extensions ssyn_syn.syn_extensions
+ ber_len_t ssyn_oidlen;
unsigned ssyn_flags;
typedef struct slap_matching_rule {
LDAPMatchingRule smr_mrule;
+ ber_len_t smr_oidlen;
slap_mask_t smr_usage;
#define SLAP_MR_TYPE_MASK 0xFF00U
AttributeDescription *si_ad_createTimestamp;
AttributeDescription *si_ad_modifiersName;
AttributeDescription *si_ad_modifyTimestamp;
+ AttributeDescription *si_ad_hasSubordinates;
AttributeDescription *si_ad_subschemaSubentry;
/* root DSE attribute descriptions */
typedef struct slap_mr_assertion {
MatchingRule *ma_rule; /* optional */
- char *ma_rule_text; /* optional */
+ struct berval ma_rule_text; /* optional */
AttributeDescription *ma_desc; /* optional */
int ma_dnattrs; /* boolean */
struct berval *ma_value; /* required */
*/
ID e_id;
- char *e_dn; /* DN of this entry */
- char *e_ndn; /* normalized DN of this entry */
+ struct berval e_name; /* name (DN) of this entry */
+ struct berval e_nname; /* normalized name (DN) of this entry */
+
+ /* for migration purposes */
+#define e_dn e_name.bv_val
+#define e_ndn e_nname.bv_val
+
Attribute *e_attrs; /* list of attributes + values */
/* for use by the backend for any purpose */
typedef struct slap_authz_info {
ber_tag_t sai_method; /* LDAP_AUTH_* from <ldap.h> */
char * sai_mech; /* SASL Mechanism */
- char * sai_dn; /* DN for reporting purposes */
- char * sai_ndn; /* Normalized DN */
+ struct berval sai_dn; /* DN for reporting purposes */
+ struct berval sai_ndn; /* Normalized DN */
/* Security Strength Factors */
slap_ssf_t sai_ssf; /* Overall SSF */
slap_style_t a_sockurl_style;
char *a_sockurl_pat;
slap_style_t a_set_style;
- char *a_set_pat;
+ struct berval a_set_pat;
#ifdef SLAPD_ACI_ENABLED
AttributeDescription *a_aci_at;
/* ACL Groups */
slap_style_t a_group_style;
- char *a_group_pat;
+ struct berval a_group_pat;
ObjectClass *a_group_oc;
AttributeDescription *a_group_at;
Filter *acl_filter;
slap_style_t acl_dn_style;
regex_t acl_dn_re;
- char *acl_dn_pat;
- char **acl_attrs;
+ struct berval acl_dn_pat;
+ struct berval **acl_attrs;
/* "by" part: list of who has what access to the entries */
Access *acl_access;
/*
* replog moddn param structure
*/
-struct replog_moddn {
- char *newrdn;
+struct slap_replog_moddn {
+ struct berval *newrdn;
int deloldrdn;
- char *newsup;
+ struct berval *newsup;
};
/*
LDAP_SLAPD_V (int) nBackendInfo;
LDAP_SLAPD_V (int) nBackendDB;
-LDAP_SLAPD_V (BackendInfo *) backendInfo;
+LDAP_SLAPD_V (BackendInfo *) backendInfo;
LDAP_SLAPD_V (BackendDB *) backendDB;
LDAP_SLAPD_V (int) slapMode;
#define SLAP_TRUNCATE_MODE 0x0100
struct slap_replica_info {
- char *ri_host; /* supersedes be_replica */
- char **ri_nsuffix; /* array of suffixes this replica accepts */
+ char *ri_host; /* supersedes be_replica */
+ struct berval **ri_nsuffix; /* array of suffixes this replica accepts */
};
struct slap_limits_set {
#define SLAP_LIMITS_ANONYMOUS 0x0006
#define SLAP_LIMITS_USERS 0x0007
regex_t lm_dn_regex; /* regex data for REGEX */
- struct berval *lm_dn_pat; /* ndn for EXACT, BASE, ONE, SUBTREE,
- * CHILDREN; pattern for REGEX; NULL
- * for ANONYMOUS, USERS */
+
+ /*
+ * normalized DN for EXACT, BASE, ONE, SUBTREE, CHILDREN;
+ * pattern for REGEX; NULL for ANONYMOUS, USERS
+ */
+ struct berval *lm_dn_pat;
+
struct slap_limits_set lm_limits;
};
#define be_chk_referrals bd_info->bi_chk_referrals
#define be_group bd_info->bi_acl_group
#define be_attribute bd_info->bi_acl_attribute
+#define be_operational bd_info->bi_operational
#define be_controls bd_info->bi_controls
| SLAP_RESTRICT_OP_MODIFY \
| SLAP_RESTRICT_OP_RENAME )
-#define SLAP_ALLOW_TLS_2_ANON 0x0001U /* StartTLS -> Anonymous */
-
-#define SLAP_DISALLOW_BIND_V2 0x0001U /* LDAPv2 bind */
-#define SLAP_DISALLOW_BIND_ANON 0x0002U /* no anonymous */
-#define SLAP_DISALLOW_BIND_ANON_CRED \
- 0x0004U /* cred should be empty */
-#define SLAP_DISALLOW_BIND_ANON_DN \
- 0x0008U /* dn should be empty */
+#define SLAP_ALLOW_BIND_V2 0x0001U /* LDAPv2 bind */
+#define SLAP_ALLOW_BIND_ANON_CRED 0x0002U /* cred should be empty */
+#define SLAP_ALLOW_BIND_ANON_DN 0x0003U /* dn should be empty */
-#define SLAP_DISALLOW_BIND_SIMPLE 0x0010U /* simple authentication */
-#define SLAP_DISALLOW_BIND_KRBV4 0x0020U /* Kerberos V4 authentication */
+#define SLAP_DISALLOW_BIND_ANON 0x0001U /* no anonymous */
+#define SLAP_DISALLOW_BIND_SIMPLE 0x0002U /* simple authentication */
+#define SLAP_DISALLOW_BIND_KRBV4 0x0004U /* Kerberos V4 authentication */
-#define SLAP_DISALLOW_TLS_AUTHC 0x0100U /* TLS while authenticated */
+#define SLAP_DISALLOW_TLS_2_ANON 0x0010U /* StartTLS -> Anonymous */
+#define SLAP_DISALLOW_TLS_AUTHC 0x0020U /* TLS while authenticated */
slap_mask_t be_requires; /* pre-operation requirements */
#define SLAP_REQUIRE_BIND 0x0001U /* bind before op */
slap_ssf_set_t be_ssf_set;
/* these should be renamed from be_ to bd_ */
- char **be_suffix; /* the DN suffixes of data in this backend */
- struct berval **be_nsuffix; /* the normalized DN suffixes in this backend */
- char **be_suffixAlias; /* pairs of DN suffix aliases and deref values */
- char *be_root_dn; /* the magic "root" dn for this db */
- char *be_root_ndn; /* the magic "root" normalized dn for this db */
- struct berval be_root_pw; /* the magic "root" password for this db */
+ struct berval **be_suffix; /* the DN suffixes of data in this backend */
+ struct berval **be_nsuffix; /* the normalized DN suffixes in this backend */
+ struct berval **be_suffixAlias; /* pairs of DN suffix aliases and deref values */
+ struct berval be_rootdn; /* the magic "root" name (DN) for this db */
+ struct berval be_rootndn; /* the magic "root" normalized name (DN) for this db */
+ struct berval be_rootpw; /* the magic "root" password for this db */
unsigned int be_max_deref_depth; /* limit for depth of an alias deref */
#define be_sizelimit be_def_limit.lms_s_soft
#define be_timelimit be_def_limit.lms_t_soft
slap_access_t be_dfltaccess; /* access given if no acl matches */
struct slap_replica_info **be_replica; /* replicas of this backend (in master) */
char *be_replogfile; /* replication log file (in master) */
- char *be_update_ndn; /* allowed to make changes (in replicas) */
+ struct berval be_update_ndn; /* allowed to make changes (in replicas) */
struct berval **be_update_refs; /* where to refer modifying clients to */
+ char *be_realm;
int be_lastmod; /* keep track of lastmodified{by,time} */
-#define SLAP_GLUE_SUBORDINATE 0x01 /* child of a glue hierarchy */
-#define SLAP_GLUE_INSTANCE 0x02 /* a glue backend */
+#define SLAP_GLUE_INSTANCE 0x01 /* a glue backend */
+#define SLAP_GLUE_SUBORDINATE 0x02 /* child of a glue hierarchy */
+#define SLAP_GLUE_LINKED 0x04 /* child is connected to parent */
int be_glueflags; /* */
-
- char *be_realm;
-
void *be_private; /* anything the backend database needs */
};
struct slap_conn;
struct slap_op;
-typedef int (*SLAP_EXTENDED_FN) LDAP_P((
+/* Backend function typedefs */
+typedef int (BI_init) LDAP_P((BackendInfo *bi));
+typedef int (BI_config) LDAP_P((BackendInfo *bi, const char *fname,
+ int lineno, int argc, char **argv));
+typedef int (BI_open) LDAP_P((BackendInfo *bi));
+typedef int (BI_close) LDAP_P((BackendInfo *bi));
+typedef int (BI_destroy) LDAP_P((BackendInfo *bi));
+
+typedef int (BI_db_init) LDAP_P((Backend *bd));
+typedef int (BI_db_config) LDAP_P((Backend *bd, const char *fname,
+ int lineno, int argc, char **argv));
+typedef int (BI_db_open) LDAP_P((Backend *bd));
+typedef int (BI_db_close) LDAP_P((Backend *bd));
+typedef int (BI_db_destroy) LDAP_P((Backend *bd));
+
+typedef int (BI_op_bind) LDAP_P(( BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ struct berval *dn, struct berval *ndn, int method,
+ struct berval *cred, struct berval *edn ));
+typedef int (BI_op_unbind) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o ));
+typedef int (BI_op_search) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ const char *base, const char *nbase,
+ int scope, int deref,
+ int slimit, int tlimit,
+ Filter *f, const char *filterstr,
+ struct berval **attrs, int attrsonly));
+typedef int (BI_op_compare)LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ const char *dn, const char *ndn,
+ AttributeAssertion *ava));
+typedef int (BI_op_modify) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ const char *dn, const char *ndn, Modifications *m));
+typedef int (BI_op_modrdn) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ const char *dn, const char *ndn,
+ const char *newrdn, int deleteoldrdn,
+ const char *newSuperior));
+typedef int (BI_op_add) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ Entry *e));
+typedef int (BI_op_delete) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ const char *dn, const char *ndn));
+typedef int (BI_op_abandon) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ ber_int_t msgid));
+
+typedef int (BI_op_extended) LDAP_P((
BackendDB *be,
struct slap_conn *conn,
struct slap_op *op,
const char ** text,
struct berval *** refs ));
+typedef int (BI_entry_release_rw) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ Entry *e, int rw));
+
+typedef int (BI_chk_referrals) LDAP_P((BackendDB *bd,
+ struct slap_conn *c, struct slap_op *o,
+ const char *dn, const char *ndn,
+ const char **text ));
+
+typedef int (BI_acl_group) LDAP_P((Backend *bd,
+ struct slap_conn *c, struct slap_op *o,
+ Entry *e, const char *bdn, const char *edn,
+ ObjectClass *group_oc,
+ AttributeDescription *group_at ));
+typedef int (BI_acl_attribute) LDAP_P((Backend *bd,
+ struct slap_conn *c, struct slap_op *o,
+ Entry *e, const char *edn,
+ AttributeDescription *entry_at,
+ struct berval ***vals ));
+
+typedef int (BI_operational) LDAP_P((Backend *bd,
+ struct slap_conn *c, struct slap_op *o,
+ Entry *e, struct berval **attrs, int opattrs, Attribute **a ));
+
+typedef int (BI_connection_init) LDAP_P((BackendDB *bd,
+ struct slap_conn *c));
+typedef int (BI_connection_destroy) LDAP_P((BackendDB *bd,
+ struct slap_conn *c));
+
+typedef int (BI_tool_entry_open) LDAP_P(( BackendDB *be, int mode ));
+typedef int (BI_tool_entry_close) LDAP_P(( BackendDB *be ));
+typedef ID (BI_tool_entry_first) LDAP_P(( BackendDB *be ));
+typedef ID (BI_tool_entry_next) LDAP_P(( BackendDB *be ));
+typedef Entry* (BI_tool_entry_get) LDAP_P(( BackendDB *be, ID id ));
+typedef ID (BI_tool_entry_put) LDAP_P(( BackendDB *be, Entry *e ));
+typedef int (BI_tool_entry_reindex) LDAP_P(( BackendDB *be, ID id ));
+typedef int (BI_tool_sync) LDAP_P(( BackendDB *be ));
+
struct slap_backend_info {
char *bi_type; /* type of backend */
* once during shutdown after all bi_db_destroy calls.
* bi_destory() is called from backend_destroy()
*/
- int (*bi_init) LDAP_P((BackendInfo *bi));
- int (*bi_config) LDAP_P((BackendInfo *bi,
- const char *fname, int lineno, int argc, char **argv ));
- int (*bi_open) LDAP_P((BackendInfo *bi));
- int (*bi_close) LDAP_P((BackendInfo *bi));
- int (*bi_destroy) LDAP_P((BackendInfo *bi));
+ BI_init *bi_init;
+ BI_config *bi_config;
+ BI_open *bi_open;
+ BI_close *bi_close;
+ BI_destroy *bi_destroy;
/*
* per database routines:
* bi_close calls but before bi_destory calls.
* called only by backend_destory()
*/
- int (*bi_db_init) LDAP_P((Backend *bd));
- int (*bi_db_config) LDAP_P((Backend *bd,
- const char *fname, int lineno, int argc, char **argv ));
- int (*bi_db_open) LDAP_P((Backend *bd));
- int (*bi_db_close) LDAP_P((Backend *bd));
- int (*bi_db_destroy) LDAP_P((Backend *db));
+ BI_db_init *bi_db_init;
+ BI_db_config *bi_db_config;
+ BI_db_open *bi_db_open;
+ BI_db_close *bi_db_close;
+ BI_db_destroy *bi_db_destroy;
/* LDAP Operations Handling Routines */
- int (*bi_op_bind) LDAP_P(( BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *dn, const char *ndn, int method,
- struct berval *cred, char** edn ));
- int (*bi_op_unbind) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o ));
- int (*bi_op_search) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *base, const char *nbase,
- int scope, int deref,
- int slimit, int tlimit,
- Filter *f, const char *filterstr,
- char **attrs, int attrsonly));
- int (*bi_op_compare)LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *dn, const char *ndn,
- AttributeAssertion *ava));
- int (*bi_op_modify) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *dn, const char *ndn, Modifications *m));
- int (*bi_op_modrdn) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *dn, const char *ndn,
- const char *newrdn, int deleteoldrdn,
- const char *newSuperior));
- int (*bi_op_add) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- Entry *e));
- int (*bi_op_delete) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *dn, const char *ndn));
- int (*bi_op_abandon) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- ber_int_t msgid));
+ BI_op_bind *bi_op_bind;
+ BI_op_unbind *bi_op_unbind;
+ BI_op_search *bi_op_search;
+ BI_op_compare *bi_op_compare;
+ BI_op_modify *bi_op_modify;
+ BI_op_modrdn *bi_op_modrdn;
+ BI_op_add *bi_op_add;
+ BI_op_delete *bi_op_delete;
+ BI_op_abandon *bi_op_abandon;
/* Extended Operations Helper */
- SLAP_EXTENDED_FN bi_extended;
+ BI_op_extended *bi_extended;
/* Auxilary Functions */
- int (*bi_entry_release_rw) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- Entry *e, int rw));
+ BI_entry_release_rw *bi_entry_release_rw;
+ BI_chk_referrals *bi_chk_referrals;
- int (*bi_chk_referrals) LDAP_P((BackendDB *bd,
- struct slap_conn *c, struct slap_op *o,
- const char *dn, const char *ndn,
- const char **text ));
+ BI_acl_group *bi_acl_group;
+ BI_acl_attribute *bi_acl_attribute;
- int (*bi_acl_group) LDAP_P((Backend *bd,
- struct slap_conn *c, struct slap_op *o,
- Entry *e, const char *bdn, const char *edn,
- ObjectClass *group_oc,
- AttributeDescription *group_at ));
- int (*bi_acl_attribute) LDAP_P((Backend *bd,
- struct slap_conn *c, struct slap_op *o,
- Entry *e, const char *edn,
- AttributeDescription *entry_at,
- struct berval ***vals ));
+ BI_operational *bi_operational;
- int (*bi_connection_init) LDAP_P((BackendDB *bd,
- struct slap_conn *c));
- int (*bi_connection_destroy) LDAP_P((BackendDB *bd,
- struct slap_conn *c));
+ BI_connection_init *bi_connection_init;
+ BI_connection_destroy *bi_connection_destroy;
/* hooks for slap tools */
- int (*bi_tool_entry_open) LDAP_P(( BackendDB *be, int mode ));
- int (*bi_tool_entry_close) LDAP_P(( BackendDB *be ));
- ID (*bi_tool_entry_first) LDAP_P(( BackendDB *be ));
- ID (*bi_tool_entry_next) LDAP_P(( BackendDB *be ));
- Entry* (*bi_tool_entry_get) LDAP_P(( BackendDB *be, ID id ));
- ID (*bi_tool_entry_put) LDAP_P(( BackendDB *be, Entry *e ));
- int (*bi_tool_entry_reindex) LDAP_P(( BackendDB *be, ID id ));
- int (*bi_tool_sync) LDAP_P(( BackendDB *be ));
+ BI_tool_entry_open *bi_tool_entry_open;
+ BI_tool_entry_close *bi_tool_entry_close;
+ BI_tool_entry_first *bi_tool_entry_first;
+ BI_tool_entry_next *bi_tool_entry_next;
+ BI_tool_entry_get *bi_tool_entry_get;
+ BI_tool_entry_put *bi_tool_entry_put;
+ BI_tool_entry_reindex *bi_tool_entry_reindex;
+ BI_tool_sync *bi_tool_sync;
#define SLAP_INDEX_ADD_OP 0x0001
#define SLAP_INDEX_DELETE_OP 0x0002
#define c_authtype c_authz.sai_method
#define c_authmech c_authz.sai_mech
#define c_dn c_authz.sai_dn
+#define c_ndn c_authz.sai_ndn
#define c_ssf c_authz.sai_ssf
#define c_transport_ssf c_authz.sai_transport_ssf
#define c_tls_ssf c_authz.sai_tls_ssf
ObjectClass *oc;
AttributeDescription *at;
int res;
- int len;
+ ber_len_t len;
char ndn[1];
} GroupAssertion;