schema_init.c 18.7 KB
Newer Older
1
2
3
/* schema_init.c - init builtin schema */
/* $OpenLDAP$ */
/*
Kurt Zeilenga's avatar
Kurt Zeilenga committed
4
 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
 */

#include "portable.h"

#include <stdio.h>

#include <ac/ctype.h>
#include <ac/string.h>
#include <ac/socket.h>

#include "slap.h"
#include "ldap_pvt.h"

static int
octetStringValidate(
	Syntax *syntax,
	struct berval *in )
{
	/* any value allowed */
	return 0;
}

static int
UTF8StringValidate(
	Syntax *syntax,
	struct berval *in )
{
	ber_len_t count;
	int len;
	unsigned char *u = in->bv_val;

	for( count = in->bv_len; count > 0; count+=len, u+=len ) {
		/* get the length indicated by the first byte */
		len = LDAP_UTF8_CHARLEN( u );

		/* should not be zero */
		if( len == 0 ) return -1;

		/* make sure len corresponds with the offset
			to the next character */
		if( LDAP_UTF8_OFFSET( u ) != len ) return -1;
	}

	if( count != 0 ) return -1;

	return 0;
}

static int
UTF8StringNormalize(
56
	unsigned use,
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
	Syntax *syntax,
	MatchingRule *mr,
	struct berval *val,
	struct berval **normalized )
{
	struct berval *newval;
	char *p, *q, *s;

	newval = ch_malloc( sizeof( struct berval ) );

	p = val->bv_val;

	/* Ignore initial whitespace */
	while ( ldap_utf8_isspace( p ) ) {
		LDAP_UTF8_INCR( p );
	}

	if( *p ) {
		ch_free( newval );
		return 1;
	}

	newval->bv_val = ch_strdup( p );
	p = q = newval->bv_val;
	s = NULL;

	while ( *p ) {
		int len;

		if ( ldap_utf8_isspace( p ) ) {
			len = LDAP_UTF8_COPY(q,p);
			s=q;
			p+=len;
			q+=len;

			/* Ignore the extra whitespace */
			while ( ldap_utf8_isspace( p ) ) {
				LDAP_UTF8_INCR( p );
			}
		} else {
			len = LDAP_UTF8_COPY(q,p);
			s=NULL;
			p+=len;
			q+=len;
		}
	}

	assert( *newval->bv_val );
	assert( newval->bv_val < p );
	assert( p <= q );

	/* cannot start with a space */
	assert( !ldap_utf8_isspace(newval->bv_val) );

	/*
	 * If the string ended in space, backup the pointer one
	 * position.  One is enough because the above loop collapsed
	 * all whitespace to a single space.
	 */

	if ( s != NULL ) {
		q = s;
	}

	/* cannot end with a space */
	assert( !ldap_utf8_isspace( LDAP_UTF8_PREV(q) ) );

	/* null terminate */
	*q = '\0';

	newval->bv_len = q - newval->bv_val;
	normalized = &newval;

	return 0;
}

133
static int
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
IA5StringValidate(
	Syntax *syntax,
	struct berval *val )
{
	ber_len_t i;

	for(i=0; i < val->bv_len; i++) {
		if( !isascii(val->bv_val[i]) ) return -1;
	}

	return 0;
}

static int
IA5StringConvert(
	Syntax *syntax,
	struct berval *in,
	struct berval **out )
{
	ber_len_t i;
	struct berval *bv = ch_malloc( sizeof(struct berval) );
	bv->bv_len = (in->bv_len+1) * sizeof( ldap_unicode_t );
	bv->bv_val = ch_malloc( bv->bv_len );

	for(i=0; i < in->bv_len; i++ ) {
		/*
		 * IA5StringValidate should have been called to ensure
		 * input is limited to IA5.
		 */
		bv->bv_val[i] = in->bv_val[i];
	}

	*out = bv;
	return 0;
}

static int
IA5StringNormalize(
172
	unsigned use,
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
	Syntax *syntax,
	MatchingRule *mr,
	struct berval *val,
	struct berval **normalized )
{
	struct berval *newval;
	char *p, *q;

	newval = ch_malloc( sizeof( struct berval ) );

	p = val->bv_val;

	/* Ignore initial whitespace */
	while ( isspace( *p++ ) ) {
		/* EMPTY */  ;
	}

	if( *p ) {
		ch_free( newval );
		return 1;
	}

	newval->bv_val = ch_strdup( p );
	p = q = newval->bv_val;

	while ( *p ) {
		if ( isspace( *p ) ) {
			*q++ = *p++;

			/* Ignore the extra whitespace */
			while ( isspace( *p++ ) ) {
				/* EMPTY */  ;
			}
		} else {
			*q++ = *p++;
		}
	}

	assert( *newval->bv_val );
	assert( newval->bv_val < p );
	assert( p <= q );

	/* cannot start with a space */
	assert( !isspace(*newval->bv_val) );

	/*
	 * If the string ended in space, backup the pointer one
	 * position.  One is enough because the above loop collapsed
	 * all whitespace to a single space.
	 */

	if ( isspace( q[-1] ) ) {
		--q;
	}

	/* cannot end with a space */
	assert( !isspace( q[-1] ) );

	/* null terminate */
	*q = '\0';

	newval->bv_len = q - newval->bv_val;
	normalized = &newval;

	return 0;
}

static int
caseExactIA5Match(
242
	unsigned use,
243
244
245
	Syntax *syntax,
	MatchingRule *mr,
	struct berval *value,
246
	void *assertedValue )
247
{
248
249
	return strcmp( value->bv_val,
		((struct berval *) assertedValue)->bv_val );
250
251
252
253
}

static int
caseIgnoreIA5Match(
254
	unsigned use,
255
256
257
	Syntax *syntax,
	MatchingRule *mr,
	struct berval *value,
258
	void *assertedValue )
259
{
260
261
	return strcasecmp( value->bv_val,
		((struct berval *) assertedValue)->bv_val );
262
263
264
265
}

struct syntax_defs_rec {
	char *sd_desc;
266
	int sd_flags;
267
268
269
270
271
272
273
	slap_syntax_validate_func *sd_validate;
	slap_syntax_transform_func *sd_ber2str;
	slap_syntax_transform_func *sd_str2ber;
};

struct syntax_defs_rec syntax_defs[] = {
	{"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'AttributeTypeDescription' )",
274
		0, NULL, NULL, NULL},
275
	{"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' )",
276
		0, NULL, NULL, NULL},
277
	{"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' )",
278
		SLAP_SYNTAX_BINARY,
279
280
		NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'BitString' )",
281
		0, NULL, NULL, NULL},
282
	{"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
283
		0, NULL, NULL, NULL},
284
	{"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' )",
285
		SLAP_SYNTAX_BINARY,
286
287
		NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'CertificateList' )",
288
		SLAP_SYNTAX_BINARY,
289
290
		NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'CertificatePair' )",
291
		SLAP_SYNTAX_BINARY,
292
293
		NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'DN' )",
294
		0, NULL, NULL, NULL},
295
	{"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'DeliveryMethod' )",
296
		0, NULL, NULL, NULL},
297
	{"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'DirectoryString' )",
298
		0, UTF8StringValidate, NULL, NULL},
299
	{"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DITContentRuleDescription' )",
300
		0, NULL, NULL, NULL},
301
	{"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DITStructureRuleDescription' )",
302
		0, NULL, NULL, NULL},
303
	{"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'EnhancedGuide' )",
304
		0, NULL, NULL, NULL},
305
	{"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'FacsimileTelephoneNumber' )",
306
		0, NULL, NULL, NULL},
307
	{"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'GeneralizedTime' )",
308
		0, NULL, NULL, NULL},
309
	{"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
310
		0, NULL, NULL, NULL},
311
	{"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5String' )",
312
		0, IA5StringValidate, NULL, NULL},
313
	{"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
314
		0, NULL, NULL, NULL},
315
	{"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )",
316
		0, NULL, NULL, NULL},
317
	{"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'MatchingRuleDescription' )",
318
		0, NULL, NULL, NULL},
319
	{"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'MatchingRuleUseDescription' )",
320
		0, NULL, NULL, NULL},
321
	{"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'MailPreference' )",
322
		0, NULL, NULL, NULL},
323
	{"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'NameAndOptionalUID' )",
324
		0, NULL, NULL, NULL},
325
	{"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'NameFormDescription' )",
326
		0, NULL, NULL, NULL},
327
	{"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'NumericString' )",
328
		0, NULL, NULL, NULL},
329
	{"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'ObjectClassDescription' )",
330
		0, NULL, NULL, NULL},
331
	{"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
332
		0, NULL, NULL, NULL},
333
	{"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'OtherMailbox' )",
334
		0, NULL, NULL, NULL},
335
	{"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'OctetString' )",
336
		0, octetStringValidate, NULL, NULL},
337
	{"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'PostalAddress' )",
338
		0, NULL, NULL, NULL},
339
	{"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'ProtocolInformation' )",
340
		0, NULL, NULL, NULL},
341
	{"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'PresentationAddress' )",
342
		0, NULL, NULL, NULL},
343
	{"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'PrintableString' )",
344
		0, NULL, NULL, NULL},
345
	{"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'SupportedAlgorithm' )",
346
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
347
	{"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'TelephoneNumber' )",
348
		0, NULL, NULL, NULL},
349
	{"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'TeletexTerminalIdentifier' )",
350
		0, NULL, NULL, NULL},
351
	{"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'TelexNumber' )",
352
		0, NULL, NULL, NULL},
353
	{"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTCTime' )",
354
		0, NULL, NULL, NULL},
355
	{"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAPSyntaxDescription' )",
356
		0, NULL, NULL, NULL},
357
	{"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'SubstringAssertion' )",
358
		0, NULL, NULL, NULL},
359

360
361
362
363
	/* OpenLDAP Experimental Syntaxes */
	{"( " SLAPD_OID_ACI_SYNTAX " DESC 'OpenLDAPexperimentalACI' )",
		0, NULL, NULL, NULL},

364
	{NULL, 0, NULL, NULL, NULL}
365
366
367
};

struct mrule_defs_rec {
368
	char *						mrd_desc;
369
	unsigned					mrd_usage;
370
371
372
373
374
	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;
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
};

/*
 * Other matching rules in X.520 that we do not use:
 *
 * 2.5.13.9		numericStringOrderingMatch
 * 2.5.13.13	booleanMatch
 * 2.5.13.15	integerOrderingMatch
 * 2.5.13.18	octetStringOrderingMatch
 * 2.5.13.19	octetStringSubstringsMatch
 * 2.5.13.25	uTCTimeMatch
 * 2.5.13.26	uTCTimeOrderingMatch
 * 2.5.13.31	directoryStringFirstComponentMatch
 * 2.5.13.32	wordMatch
 * 2.5.13.33	keywordMatch
 * 2.5.13.34	certificateExactMatch
 * 2.5.13.35	certificateMatch
 * 2.5.13.36	certificatePairExactMatch
 * 2.5.13.37	certificatePairMatch
 * 2.5.13.38	certificateListExactMatch
 * 2.5.13.39	certificateListMatch
 * 2.5.13.40	algorithmIdentifierMatch
 * 2.5.13.41	storedPrefixMatch
 * 2.5.13.42	attributeCertificateMatch
 * 2.5.13.43	readerAndKeyIDMatch
 * 2.5.13.44	attributeIntegrityMatch
 */

/* recycled matching functions */
#define caseIgnoreMatch caseIgnoreIA5Match
#define caseExactMatch caseExactIA5Match

/* unimplemented matching functions */
#define objectIdentifierMatch NULL
#define distinguishedNameMatch NULL
#define caseIgnoreOrderingMatch NULL
#define caseIgnoreSubstringsMatch NULL
#define caseExactOrderingMatch NULL
#define caseExactSubstringsMatch NULL
#define numericStringMatch NULL
#define numericStringSubstringsMatch NULL
#define caseIgnoreListMatch NULL
Kurt Zeilenga's avatar
Kurt Zeilenga committed
417
#define caseIgnoreListSubstringsMatch NULL
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
#define integerMatch NULL
#define bitStringMatch NULL
#define octetStringMatch NULL
#define telephoneNumberMatch NULL
#define telephoneNumberSubstringsMatch NULL
#define presentationAddressMatch NULL
#define uniqueMemberMatch NULL
#define protocolInformationMatch NULL
#define generalizedTimeMatch NULL
#define generalizedTimeOrderingMatch NULL
#define integerFirstComponentMatch NULL
#define objectIdentifierFirstComponentMatch NULL
#define caseIgnoreIA5SubstringsMatch NULL

struct mrule_defs_rec mrule_defs[] = {
	{"( 2.5.13.0 NAME 'objectIdentifierMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
435
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
436
		NULL, NULL, objectIdentifierMatch, NULL, NULL},
437
438
439

	{"( 2.5.13.1 NAME 'distinguishedNameMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
440
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
441
		NULL, NULL, distinguishedNameMatch, NULL, NULL},
442
443
444

	{"( 2.5.13.2 NAME 'caseIgnoreMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
445
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
446
		NULL, UTF8StringNormalize, caseIgnoreMatch, NULL, NULL},
447
448
449

	{"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
450
		SLAP_MR_ORDERING,
451
		NULL, UTF8StringNormalize, caseIgnoreOrderingMatch, NULL, NULL},
452
453
454

	{"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
455
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
456
		NULL, UTF8StringNormalize, caseIgnoreSubstringsMatch, NULL, NULL},
457
458
459
460

	/* Next three are not in the RFC's, but are needed for compatibility */
	{"( 2.5.13.5 NAME 'caseExactMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
461
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
462
		NULL, UTF8StringNormalize, caseExactMatch, NULL, NULL},
463
464
465

	{"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
466
		SLAP_MR_ORDERING,
467
		NULL, UTF8StringNormalize, caseExactOrderingMatch, NULL, NULL},
468
469
470

	{"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
471
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
472
		NULL, UTF8StringNormalize, caseExactSubstringsMatch, NULL, NULL},
473
474
475

	{"( 2.5.13.8 NAME 'numericStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
476
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
477
		NULL, NULL, numericStringMatch, NULL, NULL},
478
479
480

	{"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
481
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
482
		NULL, NULL, numericStringSubstringsMatch, NULL, NULL},
483
484
485

	{"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
486
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
487
		NULL, NULL, caseIgnoreListMatch, NULL, NULL},
488

Kurt Zeilenga's avatar
Kurt Zeilenga committed
489
490
491
492
493
	{"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
		NULL, NULL, caseIgnoreListSubstringsMatch, NULL, NULL},

494
495
	{"( 2.5.13.14 NAME 'integerMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
496
		SLAP_MR_NONE | SLAP_MR_EXT,
497
		NULL, NULL, integerMatch, NULL, NULL},
498
499
500

	{"( 2.5.13.16 NAME 'bitStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
501
		SLAP_MR_NONE | SLAP_MR_EXT,
502
		NULL, NULL, bitStringMatch, NULL, NULL},
503
504
505

	{"( 2.5.13.17 NAME 'octetStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
506
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
507
		NULL, NULL, octetStringMatch, NULL, NULL},
508
509
510

	{"( 2.5.13.20 NAME 'telephoneNumberMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
511
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
512
		NULL, NULL, telephoneNumberMatch, NULL, NULL},
513
514
515

	{"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
516
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
517
		NULL, NULL, telephoneNumberSubstringsMatch, NULL, NULL},
518
519
520

	{"( 2.5.13.22 NAME 'presentationAddressMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
521
		SLAP_MR_NONE | SLAP_MR_EXT,
522
		NULL, NULL, presentationAddressMatch, NULL, NULL},
523
524
525

	{"( 2.5.13.23 NAME 'uniqueMemberMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
526
		SLAP_MR_NONE | SLAP_MR_EXT,
527
		NULL, NULL, uniqueMemberMatch, NULL, NULL},
528
529
530

	{"( 2.5.13.24 NAME 'protocolInformationMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
531
		SLAP_MR_NONE | SLAP_MR_EXT,
532
		NULL, NULL, protocolInformationMatch, NULL, NULL},
533
534
535

	{"( 2.5.13.27 NAME 'generalizedTimeMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
536
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
537
		NULL, NULL, generalizedTimeMatch, NULL, NULL},
538
539
540

	{"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
541
		SLAP_MR_ORDERING,
542
		NULL, NULL, generalizedTimeOrderingMatch, NULL, NULL},
543
544
545

	{"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
546
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
547
		NULL, NULL, integerFirstComponentMatch, NULL, NULL},
548
549
550

	{"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
551
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
552
		NULL, NULL, objectIdentifierFirstComponentMatch, NULL, NULL},
553
554
555

	{"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
556
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
557
		NULL, IA5StringNormalize, caseExactIA5Match, NULL, NULL},
558
559
560

	{"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
561
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
562
		NULL, IA5StringNormalize, caseIgnoreIA5Match, NULL, NULL},
563
564
565

	{"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
566
		SLAP_MR_SUBSTR,
567
		NULL, IA5StringNormalize, caseIgnoreIA5SubstringsMatch, NULL, NULL},
568

569
	{NULL, SLAP_MR_NONE, NULL, NULL, NULL}
570
571
};

572
573
static int schema_init_done = 0;

574
575
576
577
578
579
int
schema_init( void )
{
	int		res;
	int		i;

580
581
	/* we should only be called once (from main) */
	assert( schema_init_done == 0 );
582
583
584

	for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
		res = register_syntax( syntax_defs[i].sd_desc,
585
		    syntax_defs[i].sd_flags,
586
587
588
589
590
591
592
		    syntax_defs[i].sd_validate,
		    syntax_defs[i].sd_ber2str,
			syntax_defs[i].sd_str2ber );

		if ( res ) {
			fprintf( stderr, "schema_init: Error registering syntax %s\n",
				 syntax_defs[i].sd_desc );
593
			return -1;
594
595
596
597
		}
	}

	for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
598
599
600
601
602
603
604
		if( mrule_defs[i].mrd_usage == SLAP_MR_NONE ) {
			fprintf( stderr,
				"schema_init: Ingoring unusable matching rule %s\n",
				 mrule_defs[i].mrd_desc );
			continue;
		}

605
606
		res = register_matching_rule(
			mrule_defs[i].mrd_desc,
607
			mrule_defs[i].mrd_usage,
608
609
			mrule_defs[i].mrd_convert,
			mrule_defs[i].mrd_normalize,
610
611
612
		    mrule_defs[i].mrd_match,
			mrule_defs[i].mrd_indexer,
			mrule_defs[i].mrd_filter );
613
614
615
616
617

		if ( res ) {
			fprintf( stderr,
				"schema_init: Error registering matching rule %s\n",
				 mrule_defs[i].mrd_desc );
618
			return -1;
619
620
621
622
623
		}
	}
	schema_init_done = 1;
	return( 0 );
}
624
625

#ifdef SLAPD_SCHEMA_NOT_COMPAT
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
struct slap_internal_schema slap_schema;

struct slap_schema_ad_map {
	char *ssm_type;
	size_t ssm_offset;
} ad_map[]  = {
	{ "objectClass",
		offsetof(struct slap_internal_schema, si_ad_objectClass) },

	{ "creatorsName",
		offsetof(struct slap_internal_schema, si_ad_creatorsName) },
	{ "createTimestamp",
		offsetof(struct slap_internal_schema, si_ad_createTimestamp) },
	{ "modifiersName",
		offsetof(struct slap_internal_schema, si_ad_modifiersName) },
	{ "modifyTimestamp",
		offsetof(struct slap_internal_schema, si_ad_modifyTimestamp) },
643
644
645
646

	{ "subschemaSubentry",
		offsetof(struct slap_internal_schema, si_ad_subschemaSubentry) },

647
648
649
650
651
652
653
654
655
656
657
	{ "namingContexts",
		offsetof(struct slap_internal_schema, si_ad_namingContexts) },
	{ "supportedControl",
		offsetof(struct slap_internal_schema, si_ad_supportedControl) },
	{ "supportedExtension",
		offsetof(struct slap_internal_schema, si_ad_supportedExtension) },
	{ "supportedLDAPVersion",
		offsetof(struct slap_internal_schema, si_ad_supportedLDAPVersion) },
	{ "supportedSASLMechanisms",
		offsetof(struct slap_internal_schema, si_ad_supportedSASLMechanisms) },

658
659
660
661
662
663
664
665
666
	{ "attributeTypes",
		offsetof(struct slap_internal_schema, si_ad_attributeTypes) },
	{ "ldapSyntaxes",
		offsetof(struct slap_internal_schema, si_ad_ldapSyntaxes) },
	{ "matchingRules",
		offsetof(struct slap_internal_schema, si_ad_matchingRules) },
	{ "objectClasses",
		offsetof(struct slap_internal_schema, si_ad_objectClasses) },

667
668
669
670
671
672
673
	{ "ref",
		offsetof(struct slap_internal_schema, si_ad_ref) },

	{ "entry",
		offsetof(struct slap_internal_schema, si_ad_entry) },
	{ "children",
		offsetof(struct slap_internal_schema, si_ad_children) },
674
	{ NULL, 0 }
675
676
};

677
678
679
680
681
682
#endif

int
schema_prep( void )
{
#ifdef SLAPD_SCHEMA_NOT_COMPAT
683
	int i;
684
685
686
687
688
689
	char *text;
#endif
	/* we should only be called once after schema_init() was called */
	assert( schema_init_done == 1 );

#ifdef SLAPD_SCHEMA_NOT_COMPAT
690
	for( i=0; ad_map[i].ssm_type; i++ ) {
Kurt Zeilenga's avatar
Kurt Zeilenga committed
691
692
693
694
695
696
697
698
		int rc;

		AttributeDescription ** adp = (AttributeDescription **)
			&(((char *) &slap_schema)[ad_map[i].ssm_offset]);

		*adp = NULL;

		rc = slap_str2ad( ad_map[i].ssm_type, adp, &text );
699

700
701
702
703
704
705
		if( rc != LDAP_SUCCESS ) {
			fprintf( stderr,
				"No attribute \"%s\" defined in schema\n",
				ad_map[i].ssm_type );
			return rc;
		}
706
707
708
709
710
711
	}
#endif

	++schema_init_done;
	return 0;
}