slap.h 98.5 KB
Newer Older
Kurt Zeilenga's avatar
Kurt Zeilenga committed
1
/* slap.h - stand alone ldap server include file */
2
/* $OpenLDAP$ */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
3
4
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
 *
5
 * Copyright 1998-2009 The OpenLDAP Foundation.
Kurt Zeilenga's avatar
Kurt Zeilenga committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted only as authorized by the OpenLDAP
 * Public License.
 *
 * A copy of this license is available in the file LICENSE in the
 * top-level directory of the distribution or, alternatively, at
 * <http://www.OpenLDAP.org/license.html>.
 */
/* Portions Copyright (c) 1995 Regents of the University of Michigan.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that this notice is preserved and that due credit is given
 * to the University of Michigan at Ann Arbor. The name of the University
 * may not be used to endorse or promote products derived from this
 * software without specific prior written permission. This software
 * is provided ``as is'' without express or implied warranty.
25
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
26

Kurt Zeilenga's avatar
Kurt Zeilenga committed
27
28
#ifndef _SLAP_H_
#define _SLAP_H_
Kurt Zeilenga's avatar
Kurt Zeilenga committed
29

30
31
#include "ldap_defaults.h"

32
#include <stdio.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
33
#include <ac/stdlib.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
34

35
#include <sys/types.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
36
37
#include <ac/syslog.h>
#include <ac/regex.h>
Howard Chu's avatar
Howard Chu committed
38
#include <ac/signal.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
39
#include <ac/socket.h>
40
#include <ac/time.h>
41
#include <ac/param.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
42

Kurt Zeilenga's avatar
Kurt Zeilenga committed
43
#include "avl.h"
44
45
46
47
48
49
50

#ifndef ldap_debug
#define ldap_debug slap_debug
#endif

#include "ldap_log.h"

Kurt Zeilenga's avatar
Kurt Zeilenga committed
51
52
#include <ldap.h>
#include <ldap_schema.h>
53

54
#include "lber_pvt.h"
55
#include "ldap_pvt.h"
56
#include "ldap_pvt_thread.h"
57
#include "ldap_queue.h"
58
59

LDAP_BEGIN_DECL
60

61
62
#ifdef LDAP_DEVEL
#define LDAP_COLLECTIVE_ATTRIBUTES
63
#define LDAP_COMP_MATCH
64
#define LDAP_SYNC_TIMESTAMP
65
66
#define SLAP_CONTROL_X_SORTEDRESULTS
#define SLAP_CONTROL_X_SESSION_TRACKING
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
67
#define SLAP_CONTROL_X_WHATFAILED
68
#define SLAP_CONFIG_DELETE
69
#endif
Kurt Zeilenga's avatar
cleanup    
Kurt Zeilenga committed
70

71
72
#define LDAP_DYNAMIC_OBJECTS
#define SLAP_CONTROL_X_TREE_DELETE LDAP_CONTROL_X_TREE_DELETE
Kurt Zeilenga's avatar
Kurt Zeilenga committed
73
#define SLAP_DISTPROC
74

Kurt Zeilenga's avatar
cleanup    
Kurt Zeilenga committed
75
76
77
#ifdef ENABLE_REWRITE
#define SLAP_AUTH_REWRITE	1 /* use librewrite for sasl-regexp */
#endif
78

Kurt Zeilenga's avatar
Kurt Zeilenga committed
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 * SLAPD Memory allocation macros
 *
 * Unlike ch_*() routines, these routines do not assert() upon
 * allocation error.  They are intended to be used instead of
 * ch_*() routines where the caller has implemented proper
 * checking for and handling of allocation errors.
 *
 * Patches to convert ch_*() calls to SLAP_*() calls welcomed.
 */
#define SLAP_MALLOC(s)      ber_memalloc((s))
#define SLAP_CALLOC(n,s)    ber_memcalloc((n),(s))
#define SLAP_REALLOC(p,s)   ber_memrealloc((p),(s))
#define SLAP_FREE(p)        ber_memfree((p))
#define SLAP_VFREE(v)       ber_memvfree((void**)(v))
#define SLAP_STRDUP(s)      ber_strdup((s))
#define SLAP_STRNDUP(s,l)   ber_strndup((s),(l))
96

Hallvard Furuseth's avatar
Hallvard Furuseth committed
97
98
99
#ifdef f_next
#undef f_next /* name conflict between sys/file.h on SCO and struct filter */
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
100

Kurt Zeilenga's avatar
Kurt Zeilenga committed
101
#define SERVICE_NAME  OPENLDAP_PACKAGE "-slapd"
102
#define SLAPD_ANONYMOUS ""
Kurt Zeilenga's avatar
Kurt Zeilenga committed
103

104
105
106
107
108
109
110
#ifdef HAVE_TCPD
# include <tcpd.h>
# define SLAP_STRING_UNKNOWN	STRING_UNKNOWN
#else /* ! TCP Wrappers */
# define SLAP_STRING_UNKNOWN	"unknown"
#endif /* ! TCP Wrappers */

Juan Gomez's avatar
Juan Gomez committed
111
112
113
114
115
/* LDAPMod.mod_op value ===> Must be kept in sync with ldap.h!
 * This is a value used internally by the backends. It is needed to allow
 * adding values that already exist without getting an error as required by
 * modrdn when the new rdn was already an attribute value itself.
 */
116
#define SLAP_MOD_SOFTADD	0x1000
Juan Gomez's avatar
Juan Gomez committed
117

118
#define MAXREMATCHES (100)
119

120
#define SLAP_MAX_WORKER_THREADS		(16)
121

Kurt Zeilenga's avatar
Kurt Zeilenga committed
122
123
124
#define SLAP_SB_MAX_INCOMING_DEFAULT ((1<<18) - 1)
#define SLAP_SB_MAX_INCOMING_AUTH ((1<<24) - 1)

125
126
127
#define SLAP_CONN_MAX_PENDING_DEFAULT	100
#define SLAP_CONN_MAX_PENDING_AUTH	1000

128
#define SLAP_TEXT_BUFLEN (256)
129
130

/* psuedo error code indicating abandoned operation */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
131
#define SLAPD_ABANDON (-1024)
132
133

/* psuedo error code indicating disconnect */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
134
#define SLAPD_DISCONNECT (-1025)
135

136
/* unknown config file directive */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
137
#define SLAP_CONF_UNKNOWN (-1026)
138

139
140
/* We assume "C" locale, that is US-ASCII */
#define ASCII_SPACE(c)	( (c) == ' ' )
141
142
143
144
#define ASCII_LOWER(c)	( (c) >= 'a' && (c) <= 'z' )
#define ASCII_UPPER(c)	( (c) >= 'A' && (c) <= 'Z' )
#define ASCII_ALPHA(c)	( ASCII_LOWER(c) || ASCII_UPPER(c) )
#define ASCII_DIGIT(c)	( (c) >= '0' && (c) <= '9' )
Howard Chu's avatar
Howard Chu committed
145
146
#define ASCII_HEXLOWER(c)	( (c) >= 'a' && (c) <= 'f' )
#define ASCII_HEXUPPER(c)	( (c) >= 'A' && (c) <= 'F' )
147
148
#define ASCII_HEX(c)	( ASCII_DIGIT(c) || \
	ASCII_HEXLOWER(c) || ASCII_HEXUPPER(c) )
149
#define ASCII_ALNUM(c)	( ASCII_ALPHA(c) || ASCII_DIGIT(c) )
150
#define ASCII_PRINTABLE(c) ( (c) >= ' ' && (c) <= '~' )
151
152
153
154
155
156
157
158

#define SLAP_NIBBLE(c) ((c)&0x0f)
#define SLAP_ESCAPE_CHAR ('\\')
#define SLAP_ESCAPE_LO(c) ( "0123456789ABCDEF"[SLAP_NIBBLE(c)] )
#define SLAP_ESCAPE_HI(c) ( SLAP_ESCAPE_LO((c)>>4) )

#define FILTER_ESCAPE(c) ( (c) == '*' || (c) == '\\' \
	|| (c) == '(' || (c) == ')' || !ASCII_PRINTABLE(c) )
159

160
#define DN_ESCAPE(c)	((c) == SLAP_ESCAPE_CHAR)
161
162
163
164
/* NOTE: for consistency, this macro must only operate
 * on normalized/pretty DN, such that ';' is never used
 * as RDN separator, and all occurrences of ';' must be escaped */
#define DN_SEPARATOR(c)	((c) == ',')
Kurt Zeilenga's avatar
Kurt Zeilenga committed
165
#define RDN_ATTRTYPEANDVALUE_SEPARATOR(c) ((c) == '+') /* RFC 4514 */
166
#define RDN_SEPARATOR(c) (DN_SEPARATOR(c) || RDN_ATTRTYPEANDVALUE_SEPARATOR(c))
167
168
169
170
171
#define RDN_NEEDSESCAPE(c)	((c) == '\\' || (c) == '"')

#define DESC_LEADCHAR(c)	( ASCII_ALPHA(c) )
#define DESC_CHAR(c)	( ASCII_ALNUM(c) || (c) == '-' )
#define OID_LEADCHAR(c)	( ASCII_DIGIT(c) )
172
173
#define OID_SEPARATOR(c)	( (c) == '.' )
#define OID_CHAR(c)	( OID_LEADCHAR(c) || OID_SEPARATOR(c) )
174

175
#define ATTR_LEADCHAR(c)	( DESC_LEADCHAR(c) || OID_LEADCHAR(c) )
176
#define ATTR_CHAR(c)	( DESC_CHAR((c)) || OID_SEPARATOR(c) )
177

178
#define AD_LEADCHAR(c)	( ATTR_LEADCHAR(c) )
179
#define AD_CHAR(c)		( ATTR_CHAR(c) || (c) == ';' )
180

181
182
#define SLAP_NUMERIC(c) ( ASCII_DIGIT(c) || ASCII_SPACE(c) )

183
184
185
#define SLAP_PRINTABLE(c)	( ASCII_ALNUM(c) || (c) == '\'' || \
	(c) == '(' || (c) == ')' || (c) == '+' || (c) == ',' || \
	(c) == '-' || (c) == '.' || (c) == '/' || (c) == ':' || \
186
	(c) == '?' || (c) == ' ' || (c) == '=' )
187
188
#define SLAP_PRINTABLES(c)	( SLAP_PRINTABLE(c) || (c) == '$' )

189
190
/* must match in schema_init.c */
#define SLAPD_DN_SYNTAX			"1.3.6.1.4.1.1466.115.121.1.12"
Kurt Zeilenga's avatar
Kurt Zeilenga committed
191
#define SLAPD_NAMEUID_SYNTAX	"1.3.6.1.4.1.1466.115.121.1.34"
192
#define SLAPD_INTEGER_SYNTAX	"1.3.6.1.4.1.1466.115.121.1.27"
193
194
195
196
197
#define SLAPD_GROUP_ATTR		"member"
#define SLAPD_GROUP_CLASS		"groupOfNames"
#define SLAPD_ROLE_ATTR			"roleOccupant"
#define SLAPD_ROLE_CLASS		"organizationalRole"

198
199
#define SLAPD_TOP_OID			"2.5.6.0"

Howard Chu's avatar
Howard Chu committed
200
LDAP_SLAPD_V (int) slap_debug;
201

202
203
typedef unsigned long slap_mask_t;

204
205
206
207
208
209
210
211
212
213
214
215
/* Security Strength Factor */
typedef unsigned slap_ssf_t;

typedef struct slap_ssf_set {
	slap_ssf_t sss_ssf;
	slap_ssf_t sss_transport;
	slap_ssf_t sss_tls;
	slap_ssf_t sss_sasl;
	slap_ssf_t sss_update_ssf;
	slap_ssf_t sss_update_transport;
	slap_ssf_t sss_update_tls;
	slap_ssf_t sss_update_sasl;
216
	slap_ssf_t sss_simple_bind;
217
} slap_ssf_set_t;
218

219
220
221
222
/* Flags for telling slap_sasl_getdn() what type of identity is being passed */
#define SLAP_GETDN_AUTHCID 2
#define SLAP_GETDN_AUTHZID 4

223
224
225
/*
 * Index types
 */
226
227
228
229
230
231
232
233
234
235
#define SLAP_INDEX_TYPE           0x00FFUL
#define SLAP_INDEX_UNDEFINED      0x0001UL
#define SLAP_INDEX_PRESENT        0x0002UL
#define SLAP_INDEX_EQUALITY       0x0004UL
#define SLAP_INDEX_APPROX         0x0008UL
#define SLAP_INDEX_SUBSTR         0x0010UL
#define SLAP_INDEX_EXTENDED		  0x0020UL

#define SLAP_INDEX_DEFAULT        SLAP_INDEX_EQUALITY

236
#define IS_SLAP_INDEX(mask, type)	(((mask) & (type)) == (type))
237
238
239
240
241
242

#define SLAP_INDEX_SUBSTR_TYPE    0x0F00UL

#define SLAP_INDEX_SUBSTR_INITIAL ( SLAP_INDEX_SUBSTR | 0x0100UL ) 
#define SLAP_INDEX_SUBSTR_ANY     ( SLAP_INDEX_SUBSTR | 0x0200UL )
#define SLAP_INDEX_SUBSTR_FINAL   ( SLAP_INDEX_SUBSTR | 0x0400UL )
243
244
245
246
247
#define SLAP_INDEX_SUBSTR_DEFAULT \
	( SLAP_INDEX_SUBSTR \
	| SLAP_INDEX_SUBSTR_INITIAL \
	| SLAP_INDEX_SUBSTR_ANY \
	| SLAP_INDEX_SUBSTR_FINAL )
248

249
250
251
/* defaults for initial/final substring indices */
#define SLAP_INDEX_SUBSTR_IF_MINLEN_DEFAULT	2
#define SLAP_INDEX_SUBSTR_IF_MAXLEN_DEFAULT	4
252

253
254
255
/* defaults for any substring indices */
#define SLAP_INDEX_SUBSTR_ANY_LEN_DEFAULT		4
#define SLAP_INDEX_SUBSTR_ANY_STEP_DEFAULT		2
256

257
258
259
/* default for ordered integer index keys */
#define SLAP_INDEX_INTLEN_DEFAULT	4

260
261
#define SLAP_INDEX_FLAGS         0xF000UL
#define SLAP_INDEX_NOSUBTYPES    0x1000UL /* don't use index w/ subtypes */
262
#define SLAP_INDEX_NOTAGS        0x2000UL /* don't use index w/ tags */
263
264
265
266
267
268
269
270

/*
 * there is a single index for each attribute.  these prefixes ensure
 * that there is no collision among keys.
 */
#define SLAP_INDEX_EQUALITY_PREFIX	'=' 	/* prefix for equality keys     */
#define SLAP_INDEX_APPROX_PREFIX	'~'		/* prefix for approx keys       */
#define SLAP_INDEX_SUBSTR_PREFIX	'*'		/* prefix for substring keys    */
271
272
#define SLAP_INDEX_SUBSTR_INITIAL_PREFIX '^'
#define SLAP_INDEX_SUBSTR_FINAL_PREFIX '$'
273
#define SLAP_INDEX_CONT_PREFIX		'.'		/* prefix for continuation keys */
274

275
276
277
278
#define SLAP_SYNTAX_MATCHINGRULES_OID	 "1.3.6.1.4.1.1466.115.121.1.30"
#define SLAP_SYNTAX_ATTRIBUTETYPES_OID	 "1.3.6.1.4.1.1466.115.121.1.3"
#define SLAP_SYNTAX_OBJECTCLASSES_OID	 "1.3.6.1.4.1.1466.115.121.1.37"
#define SLAP_SYNTAX_MATCHINGRULEUSES_OID "1.3.6.1.4.1.1466.115.121.1.31"
279
#define SLAP_SYNTAX_CONTENTRULE_OID	 "1.3.6.1.4.1.1466.115.121.1.16"
280

281
282
283
/*
 * represents schema information for a database
 */
284
285
286
287
288
289
enum {
	SLAP_SCHERR_OUTOFMEM = 1,
	SLAP_SCHERR_CLASS_NOT_FOUND,
	SLAP_SCHERR_CLASS_BAD_USAGE,
	SLAP_SCHERR_CLASS_BAD_SUP,
	SLAP_SCHERR_CLASS_DUP,
290
	SLAP_SCHERR_CLASS_INCONSISTENT,
291
292
293
294
295
296
297
298
299
300
301
302
	SLAP_SCHERR_ATTR_NOT_FOUND,
	SLAP_SCHERR_ATTR_BAD_MR,
	SLAP_SCHERR_ATTR_BAD_USAGE,
	SLAP_SCHERR_ATTR_BAD_SUP,
	SLAP_SCHERR_ATTR_INCOMPLETE,
	SLAP_SCHERR_ATTR_DUP,
	SLAP_SCHERR_ATTR_INCONSISTENT,
	SLAP_SCHERR_MR_NOT_FOUND,
	SLAP_SCHERR_MR_INCOMPLETE,
	SLAP_SCHERR_MR_DUP,
	SLAP_SCHERR_SYN_NOT_FOUND,
	SLAP_SCHERR_SYN_DUP,
303
	SLAP_SCHERR_SYN_SUP_NOT_FOUND,
304
305
	SLAP_SCHERR_SYN_SUBST_NOT_SPECIFIED,
	SLAP_SCHERR_SYN_SUBST_NOT_FOUND,
306
307
308
309
310
311
312
313
314
315
316
	SLAP_SCHERR_NO_NAME,
	SLAP_SCHERR_NOT_SUPPORTED,
	SLAP_SCHERR_BAD_DESCR,
	SLAP_SCHERR_OIDM,
	SLAP_SCHERR_CR_DUP,
	SLAP_SCHERR_CR_BAD_STRUCT,
	SLAP_SCHERR_CR_BAD_AUX,
	SLAP_SCHERR_CR_BAD_AT,

	SLAP_SCHERR_LAST
};
Julio Sánchez Fernández's avatar
   
Julio Sánchez Fernández committed
317

318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
/* forward declarations */
typedef struct Syntax Syntax;
typedef struct MatchingRule MatchingRule;
typedef struct MatchingRuleUse MatchingRuleUse;
typedef struct MatchingRuleAssertion MatchingRuleAssertion;
typedef struct OidMacro OidMacro;
typedef struct ObjectClass ObjectClass;
typedef struct AttributeType AttributeType;
typedef struct AttributeDescription AttributeDescription;
typedef struct AttributeName AttributeName;
typedef struct ContentRule ContentRule;

typedef struct AttributeAssertion AttributeAssertion;
typedef struct SubstringsAssertion SubstringsAssertion;
typedef struct Filter Filter;
typedef struct ValuesReturnFilter ValuesReturnFilter;
typedef struct Attribute Attribute;
#ifdef LDAP_COMP_MATCH
typedef struct ComponentData ComponentData;
typedef struct ComponentFilter ComponentFilter;
#endif

typedef struct Entry Entry;
typedef struct Modification Modification;
typedef struct Modifications Modifications;
typedef struct LDAPModList LDAPModList;

typedef struct BackendInfo BackendInfo;		/* per backend type */
typedef struct BackendDB BackendDB;		/* per backend database */

typedef struct Connection Connection;
typedef struct Operation Operation;
typedef struct SlapReply SlapReply;
/* end of forward declarations */

typedef union Sockaddr {
354
355
356
	struct sockaddr sa_addr;
	struct sockaddr_in sa_in_addr;
#ifdef LDAP_PF_INET6
Kurt Zeilenga's avatar
Kurt Zeilenga committed
357
	struct sockaddr_storage sa_storage;
358
359
360
361
362
363
364
	struct sockaddr_in6 sa_in6_addr;
#endif
#ifdef LDAP_PF_LOCAL
	struct sockaddr_un sa_un_addr;
#endif
} Sockaddr;

365
366
367
368
#ifdef LDAP_PF_INET6
extern int slap_inet4or6;
#endif

369
struct OidMacro {
370
	struct berval som_oid;
Howard Chu's avatar
Howard Chu committed
371
372
	BerVarray som_names;
	BerVarray som_subs;
Howard Chu's avatar
Howard Chu committed
373
374
#define	SLAP_OM_HARDCODE	0x10000U	/* This is hardcoded schema */
	int som_flags;
375
376
	LDAP_STAILQ_ENTRY(OidMacro) som_next;
};
Kurt Zeilenga's avatar
Kurt Zeilenga committed
377

378
typedef int slap_syntax_validate_func LDAP_P((
379
	Syntax *syntax,
380
381
	struct berval * in));

Kurt Zeilenga's avatar
Kurt Zeilenga committed
382
typedef int slap_syntax_transform_func LDAP_P((
383
	Syntax *syntax,
384
	struct berval * in,
Howard Chu's avatar
Howard Chu committed
385
386
	struct berval * out,
	void *memctx));
387

388
389
390
391
392
#ifdef LDAP_COMP_MATCH
typedef void* slap_component_transform_func LDAP_P((
	struct berval * in ));
struct ComponentDesc;
#endif
393

394
struct Syntax {
395
	LDAPSyntax			ssyn_syn;
396
397
#define ssyn_oid		ssyn_syn.syn_oid
#define ssyn_desc		ssyn_syn.syn_desc
Kurt Zeilenga's avatar
Kurt Zeilenga committed
398
#define ssyn_extensions	ssyn_syn.syn_extensions
399
400
	/*
	 * Note: the former
401
	ber_len_t	ssyn_oidlen;
402
403
404
405
406
407
408
	 * has been replaced by a struct berval that uses the value
	 * provided by ssyn_syn.syn_oid; a macro that expands to
	 * the bv_len field of the berval is provided for backward
	 * compatibility.  CAUTION: NEVER FREE THE BERVAL
	 */
	struct berval	ssyn_bvoid;
#define	ssyn_oidlen	ssyn_bvoid.bv_len
409

410
	unsigned int ssyn_flags;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
411

412
413
414
415
#define SLAP_SYNTAX_NONE	0x0000U
#define SLAP_SYNTAX_BLOB	0x0001U /* syntax treated as blob (audio) */
#define SLAP_SYNTAX_BINARY	0x0002U /* binary transfer required (certificate) */
#define SLAP_SYNTAX_BER		0x0004U /* stored in BER encoding (certificate) */
416
417
418
#ifdef LDAP_DEVEL
#define SLAP_SYNTAX_HIDE	0x0000U /* publish everything */
#else
419
#define SLAP_SYNTAX_HIDE	0x8000U /* hide (do not publish) */
420
#endif
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
421
#define	SLAP_SYNTAX_HARDCODE	0x10000U	/* This is hardcoded schema */
422

423
424
	Syntax				**ssyn_sups;

425
	slap_syntax_validate_func	*ssyn_validate;
426
	slap_syntax_transform_func	*ssyn_pretty;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
427

428
#ifdef SLAPD_BINARY_CONVERSION
Kurt Zeilenga's avatar
Kurt Zeilenga committed
429
430
431
	/* convert to and from binary */
	slap_syntax_transform_func	*ssyn_ber2str;
	slap_syntax_transform_func	*ssyn_str2ber;
432
#endif
433
434
#ifdef LDAP_COMP_MATCH
	slap_component_transform_func *ssyn_attr2comp;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
435
	struct ComponentDesc* ssync_comp_syntax;
436
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
437

Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
438
	LDAP_STAILQ_ENTRY(Syntax)	ssyn_next;
439
};
440

441
442
443
444
#define slap_syntax_is_flag(s,flag) ((int)((s)->ssyn_flags & (flag)) ? 1 : 0)
#define slap_syntax_is_blob(s)		slap_syntax_is_flag((s),SLAP_SYNTAX_BLOB)
#define slap_syntax_is_binary(s)	slap_syntax_is_flag((s),SLAP_SYNTAX_BINARY)
#define slap_syntax_is_ber(s)		slap_syntax_is_flag((s),SLAP_SYNTAX_BER)
445
#define slap_syntax_is_hidden(s)	slap_syntax_is_flag((s),SLAP_SYNTAX_HIDE)
446

447
448
449
typedef struct slap_syntax_defs_rec {
	char *sd_desc;
	int sd_flags;
450
	char **sd_sups;
451
452
453
454
455
456
457
458
	slap_syntax_validate_func *sd_validate;
	slap_syntax_transform_func *sd_pretty;
#ifdef SLAPD_BINARY_CONVERSION
	slap_syntax_transform_func *sd_ber2str;
	slap_syntax_transform_func *sd_str2ber;
#endif
} slap_syntax_defs_rec;

Kurt Zeilenga's avatar
Kurt Zeilenga committed
459
/* X -> Y Converter */
460
461
typedef int slap_mr_convert_func LDAP_P((
	struct berval * in,
Howard Chu's avatar
Howard Chu committed
462
463
	struct berval * out,
	void *memctx ));
Kurt Zeilenga's avatar
Kurt Zeilenga committed
464
465
466

/* Normalizer */
typedef int slap_mr_normalize_func LDAP_P((
467
	slap_mask_t use,
468
469
470
471
	Syntax *syntax, /* NULL if in is asserted value */
	MatchingRule *mr,
	struct berval *in,
	struct berval *out,
Howard Chu's avatar
Howard Chu committed
472
	void *memctx ));
Kurt Zeilenga's avatar
Kurt Zeilenga committed
473
474

/* Match (compare) function */
475
typedef int slap_mr_match_func LDAP_P((
476
	int *match,
477
	slap_mask_t use,
478
479
480
481
	Syntax *syntax,	/* syntax of stored value */
	MatchingRule *mr,
	struct berval *value,
	void *assertValue ));
482

483
484
/* Index generation function */
typedef int slap_mr_indexer_func LDAP_P((
485
486
	slap_mask_t use,
	slap_mask_t mask,
487
488
	Syntax *syntax,	/* syntax of stored value */
	MatchingRule *mr,
489
	struct berval *prefix,
490
	BerVarray values,
Howard Chu's avatar
Howard Chu committed
491
492
	BerVarray *keys,
	void *memctx ));
493

494
495
/* Filter index function */
typedef int slap_mr_filter_func LDAP_P((
496
497
	slap_mask_t use,
	slap_mask_t mask,
498
499
	Syntax *syntax,	/* syntax of stored value */
	MatchingRule *mr,
500
	struct berval *prefix,
501
	void *assertValue,
Howard Chu's avatar
Howard Chu committed
502
503
	BerVarray *keys,
	void *memctx ));
504

505
struct MatchingRule {
506
	LDAPMatchingRule		smr_mrule;
507
	MatchingRuleUse			*smr_mru;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
508
	/* RFC 4512 string representation */
509
510
511
	struct berval			smr_str;
	/*
	 * Note: the former
512
	 *			ber_len_t	smr_oidlen;
513
514
515
516
517
518
519
520
	 * has been replaced by a struct berval that uses the value
	 * provided by smr_mrule.mr_oid; a macro that expands to
	 * the bv_len field of the berval is provided for backward
	 * compatibility.  CAUTION: NEVER FREE THE BERVAL
	 */
	struct berval			smr_bvoid;
#define	smr_oidlen			smr_bvoid.bv_len

521
	slap_mask_t			smr_usage;
522

523
524
525
#ifdef LDAP_DEVEL
#define SLAP_MR_HIDE			0x0000U
#else
526
#define SLAP_MR_HIDE			0x8000U
527
#endif
528

529
#define SLAP_MR_MUTATION_NORMALIZER	0x4000U
530

Kurt Zeilenga's avatar
Kurt Zeilenga committed
531
#define SLAP_MR_TYPE_MASK		0x0F00U
532
#define SLAP_MR_SUBTYPE_MASK		0x00F0U
Kurt Zeilenga's avatar
Kurt Zeilenga committed
533
#define SLAP_MR_USAGE			0x000FU
534
535

#define SLAP_MR_NONE			0x0000U
Kurt Zeilenga's avatar
Kurt Zeilenga committed
536
537
538
#define SLAP_MR_EQUALITY		0x0100U
#define SLAP_MR_ORDERING		0x0200U
#define SLAP_MR_SUBSTR			0x0400U
539
540
#define SLAP_MR_EXT			0x0800U /* implicitly extensible */
#define	SLAP_MR_ORDERED_INDEX		0x1000U
541
#ifdef LDAP_COMP_MATCH
542
#define SLAP_MR_COMPONENT		0x2000U
543
#endif
544

Kurt Zeilenga's avatar
Kurt Zeilenga committed
545
#define SLAP_MR_EQUALITY_APPROX	( SLAP_MR_EQUALITY | 0x0010U )
546

Kurt Zeilenga's avatar
Kurt Zeilenga committed
547
#define SLAP_MR_SUBSTR_INITIAL	( SLAP_MR_SUBSTR | 0x0010U )
548
#define SLAP_MR_SUBSTR_ANY	( SLAP_MR_SUBSTR | 0x0020U )
Kurt Zeilenga's avatar
Kurt Zeilenga committed
549
#define SLAP_MR_SUBSTR_FINAL	( SLAP_MR_SUBSTR | 0x0040U )
550

Kurt Zeilenga's avatar
Kurt Zeilenga committed
551
552
553
554
555
556
557
558
559
560
561
562
563
564

/*
 * The asserted value, depending on the particular usage,
 * is expected to conform to either the assertion syntax
 * or the attribute syntax.   In some cases, the syntax of
 * the value is known.  If so, these flags indicate which
 * syntax the value is expected to conform to.  If not,
 * neither of these flags is set (until the syntax of the
 * provided value is determined).  If the value is of the
 * attribute syntax, the flag is changed once a value of
 * the assertion syntax is derived from the provided value.
 */
#define SLAP_MR_VALUE_OF_ASSERTION_SYNTAX	0x0001U
#define SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX	0x0002U
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
565
566
#define SLAP_MR_VALUE_OF_SYNTAX			(SLAP_MR_VALUE_OF_ASSERTION_SYNTAX|SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX)
#define SLAP_MR_DENORMALIZE			(SLAP_MR_MUTATION_NORMALIZER)
Kurt Zeilenga's avatar
Kurt Zeilenga committed
567
568
569
570
571

#define SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX( usage ) \
	((usage) & SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX )
#define SLAP_MR_IS_VALUE_OF_ASSERTION_SYNTAX( usage ) \
	((usage) & SLAP_MR_VALUE_OF_ASSERTION_SYNTAX )
572
573
574
575
576
577
#ifdef LDAP_DEBUG
#define SLAP_MR_IS_VALUE_OF_SYNTAX( usage ) \
	((usage) & SLAP_MR_VALUE_OF_SYNTAX)
#else
#define SLAP_MR_IS_VALUE_OF_SYNTAX( usage )	(1)
#endif
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
578
579
#define SLAP_MR_IS_DENORMALIZE( usage ) \
	((usage) & SLAP_MR_DENORMALIZE )
Kurt Zeilenga's avatar
Kurt Zeilenga committed
580

581
582
583
/* either or both the asserted value or attribute value
 * may be provided in normalized form
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
584
585
#define SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH		0x0004U
#define SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH	0x0008U
586
587

#define SLAP_IS_MR_ASSERTION_SYNTAX_MATCH( usage ) \
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
	(!((usage) & SLAP_MR_ATTRIBUTE_SYNTAX_MATCH))
#define SLAP_IS_MR_ATTRIBUTE_SYNTAX_MATCH( usage ) \
	((usage) & SLAP_MR_ATTRIBUTE_SYNTAX_MATCH)

#define SLAP_IS_MR_ATTRIBUTE_SYNTAX_CONVERTED_MATCH( usage ) \
	(((usage) & SLAP_MR_ATTRIBUTE_SYNTAX_CONVERTED_MATCH) \
		== SLAP_MR_ATTRIBUTE_SYNTAX_CONVERTED_MATCH)
#define SLAP_IS_MR_ATTRIBUTE_SYNTAX_NONCONVERTED_MATCH( usage ) \
	(((usage) & SLAP_MR_ATTRIBUTE_SYNTAX_CONVERTED_MATCH) \
		== SLAP_MR_ATTRIBUTE_SYNTAX_MATCH)

#define SLAP_IS_MR_ASSERTED_VALUE_NORMALIZED_MATCH( usage ) \
	((usage) & SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH )
#define SLAP_IS_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH( usage ) \
	((usage) & SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH )
603

604
	Syntax			*smr_syntax;
605
	slap_mr_convert_func	*smr_convert;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
606
	slap_mr_normalize_func	*smr_normalize;
607
	slap_mr_match_func	*smr_match;
608
	slap_mr_indexer_func	*smr_indexer;
609
	slap_mr_filter_func	*smr_filter;
610

611
	/*
612
	 * null terminated array of syntaxes compatible with this syntax
613
	 * note: when MS_EXT is set, this MUST NOT contain the assertion
Kurt Zeilenga's avatar
Kurt Zeilenga committed
614
	 * syntax of the rule.  When MS_EXT is not set, it MAY.
615
	 */
616
	Syntax			**smr_compat_syntaxes;
617

618
619
620
621
	/*
	 * For equality rules, refers to an associated approximate rule.
	 * For non-equality rules, refers to an associated equality rule.
	 */
622
	MatchingRule	*smr_associated;
623

Kurt Zeilenga's avatar
cleanup    
Kurt Zeilenga committed
624
625
#define SLAP_MR_ASSOCIATED(mr,amr)	\
	(((mr) == (amr)) || ((mr)->smr_associated == (amr)))
626

627
	LDAP_SLIST_ENTRY(MatchingRule)	smr_next;
628

629
630
631
#define smr_oid				smr_mrule.mr_oid
#define smr_names			smr_mrule.mr_names
#define smr_desc			smr_mrule.mr_desc
Kurt Zeilenga's avatar
Kurt Zeilenga committed
632
633
#define smr_obsolete		smr_mrule.mr_obsolete
#define smr_syntax_oid		smr_mrule.mr_syntax_oid
634
#define smr_extensions		smr_mrule.mr_extensions
635
};
636

637
struct MatchingRuleUse {
638
639
	LDAPMatchingRuleUse		smru_mruleuse;
	MatchingRule			*smru_mr;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
640
	/* RFC 4512 string representation */
641
642
	struct berval			smru_str;

643
	LDAP_SLIST_ENTRY(MatchingRuleUse) smru_next;
644
645
646
647
648
649
650
651
652
653

#define smru_oid			smru_mruleuse.mru_oid
#define smru_names			smru_mruleuse.mru_names
#define smru_desc			smru_mruleuse.mru_desc
#define smru_obsolete			smru_mruleuse.mru_obsolete
#define smru_applies_oids		smru_mruleuse.mru_applies_oids

#define smru_usage			smru_mr->smr_usage
} /* MatchingRuleUse */ ;

654
655
656
typedef struct slap_mrule_defs_rec {
	char *						mrd_desc;
	slap_mask_t					mrd_usage;
657
	char **						mrd_compat_syntaxes;
658
659
660
661
662
663
	slap_mr_convert_func *		mrd_convert;
	slap_mr_normalize_func *	mrd_normalize;
	slap_mr_match_func *		mrd_match;
	slap_mr_indexer_func *		mrd_indexer;
	slap_mr_filter_func *		mrd_filter;

664
665
	/* For equality rule, this may refer to an associated approximate rule */
	/* For non-equality rule, this may refer to an associated equality rule */
666
667
668
	char *						mrd_associated;
} slap_mrule_defs_rec;

669
typedef int (AttributeTypeSchemaCheckFN)(
670
671
672
	BackendDB *be,
	Entry *e,
	Attribute *attr,
673
674
675
	const char** text,
	char *textbuf, size_t textlen );

676
struct AttributeType {
677
	LDAPAttributeType		sat_atype;
678
	struct berval			sat_cname;
679
680
	AttributeType			*sat_sup;
	AttributeType			**sat_subtypes;
681
	MatchingRule			*sat_equality;
682
	MatchingRule			*sat_approx;
683
684
	MatchingRule			*sat_ordering;
	MatchingRule			*sat_substr;
685
	Syntax				*sat_syntax;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
686

687
	AttributeTypeSchemaCheckFN	*sat_check;
688
689
	char				*sat_oidmacro;	/* attribute OID */
	char				*sat_soidmacro;	/* syntax OID */
690

Kurt Zeilenga's avatar
Kurt Zeilenga committed
691
692
693
#define SLAP_AT_NONE			0x0000U
#define SLAP_AT_ABSTRACT		0x0100U /* cannot be instantiated */
#define SLAP_AT_FINAL			0x0200U /* cannot be subtyped */
694
#ifdef LDAP_DEVEL
Kurt Zeilenga's avatar
Kurt Zeilenga committed
695
#define SLAP_AT_HIDE			0x0000U /* publish everything */
696
#else
Kurt Zeilenga's avatar
Kurt Zeilenga committed
697
#define SLAP_AT_HIDE			0x8000U /* hide attribute */
698
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
699
700
701
#define	SLAP_AT_DYNAMIC			0x0400U	/* dynamically generated */

#define SLAP_AT_MANAGEABLE		0x0800U	/* no-user-mod can be by-passed */
702

703
704
705
706
707
708
709
/* Note: ORDERED values have an ordering specifically set by the
 * user, denoted by the {x} ordering prefix on the values.
 *
 * SORTED values are simply sorted by memcmp. SORTED values can
 * be efficiently located by binary search. ORDERED values have no
 * such advantage. An attribute cannot have both properties.
 */
Howard Chu's avatar
Howard Chu committed
710
711
#define	SLAP_AT_ORDERED_VAL		0x0001U /* values are ordered */
#define	SLAP_AT_ORDERED_SIB		0x0002U /* siblings are ordered */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
712
713
#define	SLAP_AT_ORDERED			0x0003U /* value has order index */

714
715
#define	SLAP_AT_SORTED_VAL		0x0010U	/* values should be sorted */

716
717
#define	SLAP_AT_HARDCODE		0x10000U	/* hardcoded schema */
#define	SLAP_AT_DELETED			0x20000U
Howard Chu's avatar
Howard Chu committed
718

719
	slap_mask_t			sat_flags;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
720

721
	LDAP_STAILQ_ENTRY(AttributeType) sat_next;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
722

723
724
725
#define sat_oid				sat_atype.at_oid
#define sat_names			sat_atype.at_names
#define sat_desc			sat_atype.at_desc
726
#define sat_obsolete			sat_atype.at_obsolete
727
#define sat_sup_oid			sat_atype.at_sup_oid
728
729
730
731
732
733
734
#define sat_equality_oid		sat_atype.at_equality_oid
#define sat_ordering_oid		sat_atype.at_ordering_oid
#define sat_substr_oid			sat_atype.at_substr_oid
#define sat_syntax_oid			sat_atype.at_syntax_oid
#define sat_single_value		sat_atype.at_single_value
#define sat_collective			sat_atype.at_collective
#define sat_no_user_mod			sat_atype.at_no_user_mod
735
#define sat_usage			sat_atype.at_usage
736
#define sat_extensions			sat_atype.at_extensions
Kurt Zeilenga's avatar
Kurt Zeilenga committed
737

738
	AttributeDescription		*sat_ad;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
739
	ldap_pvt_thread_mutex_t		sat_ad_mutex;
740
};
741

742
743
744
#define is_at_operational(at)	((at)->sat_usage)
#define is_at_single_value(at)	((at)->sat_single_value)
#define is_at_collective(at)	((at)->sat_collective)
745
#define is_at_obsolete(at)		((at)->sat_obsolete)
746
747
#define is_at_no_user_mod(at)	((at)->sat_no_user_mod)

748
typedef int (ObjectClassSchemaCheckFN)(
749
750
751
	BackendDB *be,
	Entry *e,
	ObjectClass *oc,
752
753
754
	const char** text,
	char *textbuf, size_t textlen );

755
struct ObjectClass {
756
757
	LDAPObjectClass			soc_oclass;
	struct berval			soc_cname;
758
759
760
	ObjectClass			**soc_sups;
	AttributeType			**soc_required;
	AttributeType			**soc_allowed;
761
	ObjectClassSchemaCheckFN	*soc_check;
762
763
	char				*soc_oidmacro;
	slap_mask_t			soc_flags;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
764
765
766
#define soc_oid				soc_oclass.oc_oid
#define soc_names			soc_oclass.oc_names
#define soc_desc			soc_oclass.oc_desc
767
768
#define soc_obsolete			soc_oclass.oc_obsolete
#define soc_sup_oids			soc_oclass.oc_sup_oids
Kurt Zeilenga's avatar
Kurt Zeilenga committed
769
#define soc_kind			soc_oclass.oc_kind
770
771
772
#define soc_at_oids_must		soc_oclass.oc_at_oids_must
#define soc_at_oids_may			soc_oclass.oc_at_oids_may
#define soc_extensions			soc_oclass.oc_extensions
Kurt Zeilenga's avatar
Kurt Zeilenga committed
773

774
775
	LDAP_STAILQ_ENTRY(ObjectClass)	soc_next;
};
776

777
778
779
780
#define	SLAP_OCF_SET_FLAGS	0x1
#define	SLAP_OCF_CHECK_SUP	0x2
#define	SLAP_OCF_MASK		(SLAP_OCF_SET_FLAGS|SLAP_OCF_CHECK_SUP)

781
782
783
784
785
#define	SLAP_OC_ALIAS		0x0001
#define	SLAP_OC_REFERRAL	0x0002
#define	SLAP_OC_SUBENTRY	0x0004
#define	SLAP_OC_DYNAMICOBJECT	0x0008
#define	SLAP_OC_COLLECTIVEATTRIBUTESUBENTRY	0x0010
786
#define SLAP_OC_GLUE		0x0020
787
788
789
790
#define SLAP_OC_SYNCPROVIDERSUBENTRY		0x0040
#define SLAP_OC_SYNCCONSUMERSUBENTRY		0x0080
#define	SLAP_OC__MASK		0x00FF
#define	SLAP_OC__END		0x0100
791
#define SLAP_OC_OPERATIONAL	0x4000
792
793
794
#ifdef LDAP_DEVEL
#define SLAP_OC_HIDE		0x0000
#else
795
#define SLAP_OC_HIDE		0x8000
796
#endif
Howard Chu's avatar
Howard Chu committed
797
#define	SLAP_OC_HARDCODE	0x10000U	/* This is hardcoded schema */
798
#define	SLAP_OC_DELETED		0x20000U
799

800
801
802
/*
 * DIT content rule
 */
803
struct ContentRule {
804
	LDAPContentRule		scr_crule;
805
806
	ObjectClass		*scr_sclass;
	ObjectClass		**scr_auxiliaries;	/* optional */
807
808
809
	AttributeType		**scr_required;		/* optional */
	AttributeType		**scr_allowed;		/* optional */
	AttributeType		**scr_precluded;	/* optional */
810
811
812
#define scr_oid			scr_crule.cr_oid
#define scr_names		scr_crule.cr_names
#define scr_desc		scr_crule.cr_desc
813
814
815
816
817
818
#define scr_obsolete		scr_crule.cr_obsolete
#define scr_oc_oids_aux		scr_crule.cr_oc_oids_aux
#define scr_at_oids_must	scr_crule.cr_at_oids_must
#define scr_at_oids_may		scr_crule.cr_at_oids_may
#define scr_at_oids_not		scr_crule.cr_at_oids_not

819
820
821
	char			*scr_oidmacro;
#define	SLAP_CR_HARDCODE	0x10000U
	int			scr_flags;
Howard Chu's avatar
Howard Chu committed
822

823
824
	LDAP_STAILQ_ENTRY( ContentRule ) scr_next;
};
825

826
/* Represents a recognized attribute description ( type + options ). */
827
828
829
830
831
struct AttributeDescription {
	AttributeDescription	*ad_next;
	AttributeType		*ad_type;	/* attribute type, must be specified */
	struct berval		ad_cname;	/* canonical name, must be specified */
	struct berval		ad_tags;	/* empty if no tagging options */
832
	unsigned ad_flags;
833
834
835
836
837
#define SLAP_DESC_NONE		0x00U
#define SLAP_DESC_BINARY	0x01U
#define SLAP_DESC_TAG_RANGE	0x80U
#define SLAP_DESC_TEMPORARY	0x1000U
};
838

839
840
841
/* flags to slap_*2undef_ad to register undefined (0, the default)
 * or proxied (SLAP_AD_PROXIED) AttributeDescriptions; the additional
 * SLAP_AD_NOINSERT is to lookup without insert */
842
843
844
845
846
847
848
849
850
851
#define SLAP_AD_UNDEF		0x00U
#define SLAP_AD_PROXIED		0x01U
#define	SLAP_AD_NOINSERT	0x02U

struct AttributeName {
	struct berval		an_name;
	AttributeDescription	*an_desc;
	int			an_oc_exclude;
	ObjectClass		*an_oc;
};
852

853
854
855
#define slap_ad_is_tagged(ad)			( (ad)->ad_tags.bv_len != 0 )
#define slap_ad_is_tag_range(ad)	\
	( ((ad)->ad_flags & SLAP_DESC_TAG_RANGE) ? 1 : 0 )
Kurt Zeilenga's avatar
Kurt Zeilenga committed
856
#define slap_ad_is_binary(ad)		\
857
	( ((ad)->ad_flags & SLAP_DESC_BINARY) ? 1 : 0 )
858

859
860
861
862
/*
 * pointers to schema elements used internally
 */
struct slap_internal_schema {
863
	/* objectClass */
864
	ObjectClass *si_oc_top;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
865
	ObjectClass *si_oc_extensibleObject;
866
867
	ObjectClass *si_oc_alias;
	ObjectClass *si_oc_referral;
868
	ObjectClass *si_oc_rootdse;
869
870
	ObjectClass *si_oc_subentry;
	ObjectClass *si_oc_subschema;
871
	ObjectClass *si_oc_collectiveAttributeSubentry;
872
	ObjectClass *si_oc_dynamicObject;
873

874
875
876
	ObjectClass *si_oc_glue;
	ObjectClass *si_oc_syncConsumerSubentry;
	ObjectClass *si_oc_syncProviderSubentry;
877

878
	/* objectClass attribute descriptions */
879
880
	AttributeDescription *si_ad_objectClass;

881
	/* operational attribute descriptions */
882
	AttributeDescription *si_ad_structuralObjectClass;
883
884
885
886
	AttributeDescription *si_ad_creatorsName;
	AttributeDescription *si_ad_createTimestamp;
	AttributeDescription *si_ad_modifiersName;
	AttributeDescription *si_ad_modifyTimestamp;
887
	AttributeDescription *si_ad_hasSubordinates;
888
	AttributeDescription *si_ad_subschemaSubentry;
889
	AttributeDescription *si_ad_collectiveSubentries;
890
	AttributeDescription *si_ad_collectiveExclusions;
891
	AttributeDescription *si_ad_entryDN;
892
893
	AttributeDescription *si_ad_entryUUID;
	AttributeDescription *si_ad_entryCSN;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
894
	AttributeDescription *si_ad_namingCSN;
895

896
897
	AttributeDescription *si_ad_dseType;
	AttributeDescription *si_ad_syncreplCookie;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
898
	AttributeDescription *si_ad_syncTimestamp;
Jong Hyuk Choi's avatar
Jong Hyuk Choi committed
899
	AttributeDescription *si_ad_contextCSN;
900

901
	/* root DSE attribute descriptions */
902
	AttributeDescription *si_ad_altServer;
903
904
905
906
907
	AttributeDescription *si_ad_namingContexts;
	AttributeDescription *si_ad_supportedControl;
	AttributeDescription *si_ad_supportedExtension;
	AttributeDescription *si_ad_supportedLDAPVersion;
	AttributeDescription *si_ad_supportedSASLMechanisms;
908
	AttributeDescription *si_ad_supportedFeatures;
909
	AttributeDescription *si_ad_monitorContext;
910
911
	AttributeDescription *si_ad_vendorName;
	AttributeDescription *si_ad_vendorVersion;
912
	AttributeDescription *si_ad_configContext;
913
914
915
916

	/* subentry attribute descriptions */
	AttributeDescription *si_ad_administrativeRole;
	AttributeDescription *si_ad_subtreeSpecification;
917

918
	/* subschema subentry attribute descriptions */
919
	AttributeDescription *si_ad_attributeTypes;
920
921
	AttributeDescription *si_ad_ditContentRules;
	AttributeDescription *si_ad_ditStructureRules;
922
923
	AttributeDescription *si_ad_ldapSyntaxes;
	AttributeDescription *si_ad_matchingRules;
924
	AttributeDescription *si_ad_matchingRuleUse;
925
926
	AttributeDescription *si_ad_nameForms;
	AttributeDescription *si_ad_objectClasses;
927
928
929
930
931

	/* Aliases & Referrals */
	AttributeDescription *si_ad_aliasedObjectName;
	AttributeDescription *si_ad_ref;

932
	/* Access Control Internals */
933
934
	AttributeDescription *si_ad_entry;
	AttributeDescription *si_ad_children;
935
936
	AttributeDescription *si_ad_saslAuthzTo;
	AttributeDescription *si_ad_saslAuthzFrom;
937

938
939
940
941
	/* dynamic entries */
	AttributeDescription *si_ad_entryTtl;
	AttributeDescription *si_ad_dynamicSubtrees;

942
	/* Other attributes descriptions */
943
	AttributeDescription *si_ad_distinguishedName;
944
945
	AttributeDescription *si_ad_name;
	AttributeDescription *si_ad_cn;
946
	AttributeDescription *si_ad_uid;
947
948
	AttributeDescription *si_ad_uidNumber;
	AttributeDescription *si_ad_gidNumber;
949
	AttributeDescription *si_ad_userPassword;
Howard Chu's avatar
Howard Chu committed
950
	AttributeDescription *si_ad_labeledURI;
951
#ifdef SLAPD_AUTHPASSWD
952
	AttributeDescription *si_ad_authPassword;
953
	AttributeDescription *si_ad_authPasswordSchemes;
954
#endif
955
956
	AttributeDescription *si_ad_description;
	AttributeDescription *si_ad_seeAlso;
957

958
959
	/* Undefined Attribute Type */
	AttributeType	*si_at_undefined;
960

961
962
963
	/* "Proxied" Attribute Type */
	AttributeType	*si_at_proxied;

964
965
	/* Matching Rules */
	MatchingRule	*si_mr_distinguishedNameMatch;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
966
967
968
969
	MatchingRule	*si_mr_dnSubtreeMatch;
	MatchingRule	*si_mr_dnOneLevelMatch;
	MatchingRule	*si_mr_dnSubordinateMatch;
	MatchingRule	*si_mr_dnSuperiorMatch;
970
971
	MatchingRule    *si_mr_caseExactMatch;
	MatchingRule    *si_mr_caseExactSubstringsMatch;
972
	MatchingRule    *si_mr_caseExactIA5Match;
973
	MatchingRule	*si_mr_integerMatch;
974
	MatchingRule    *si_mr_integerFirstComponentMatch;
975
	MatchingRule    *si_mr_objectIdentifierFirstComponentMatch;
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
976
977
	MatchingRule    *si_mr_caseIgnoreMatch;
	MatchingRule    *si_mr_caseIgnoreListMatch;