schema_init.c 19.8 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
	slap_syntax_validate_func *sd_validate;
	slap_syntax_transform_func *sd_ber2str;
	slap_syntax_transform_func *sd_str2ber;
};

struct syntax_defs_rec syntax_defs[] = {
273
274
275
276
277
	{"( 1.3.6.1.4.1.1466.115.121.1.1 DESC 'ACI Item' )",
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.2 DESC 'Access Point' )",
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.3 DESC 'Attribute Type Description' )",
278
		0, NULL, NULL, NULL},
279
	{"( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' )",
280
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
281
	{"( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' )",
282
283
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )",
284
		0, NULL, NULL, NULL},
285
	{"( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
286
		0, NULL, NULL, NULL},
287
	{"( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' )",
288
289
290
291
292
293
294
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' )",
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' )",
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
		0, NULL, NULL, NULL},
295
	{"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'DN' )",
296
		0, NULL, NULL, NULL},
297
	{"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
298
		0, NULL, NULL, NULL},
299
	{"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
300
		0, NULL, NULL, NULL},
301
	{"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
302
		0, UTF8StringValidate, NULL, NULL},
303
	{"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
304
		0, NULL, NULL, NULL},
305
	{"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
306
		0, NULL, NULL, NULL},
307
	{"( 1.3.6.1.4.1.1466.115.121.1.19 DESC 'DSA Quality' )",
308
		0, NULL, NULL, NULL},
309
	{"( 1.3.6.1.4.1.1466.115.121.1.20 DESC 'DSE Type' )",
310
		0, NULL, NULL, NULL},
311
	{"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
312
		0, NULL, NULL, NULL},
313
	{"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
314
		0, NULL, NULL, NULL},
315
316
317
	{"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' )",
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
318
		0, NULL, NULL, NULL},
319
	{"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
320
		0, NULL, NULL, NULL},
321
	{"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
322
		0, IA5StringValidate, NULL, NULL},
323
	{"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
324
		0, NULL, NULL, NULL},
325
	{"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )",
326
327
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
328
		0, NULL, NULL, NULL},
329
	{"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'Matching Rule Description' )",
330
		0, NULL, NULL, NULL},
331
	{"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'Matching Rule Use Description' )",
332
		0, NULL, NULL, NULL},
333
	{"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'Mail Preference' )",
334
		0, NULL, NULL, NULL},
335
	{"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
336
		0, NULL, NULL, NULL},
337
	{"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
338
		0, NULL, NULL, NULL},
339
	{"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
340
		0, NULL, NULL, NULL},
341
342
343
	{"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
		0, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
344
		0, NULL, NULL, NULL},
345
	{"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
346
		0, NULL, NULL, NULL},
347
	{"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
348
		0, NULL, NULL, NULL},
349
	{"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
350
		0, octetStringValidate, NULL, NULL},
351
	{"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
352
		0, NULL, NULL, NULL},
353
	{"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
354
		0, NULL, NULL, NULL},
355
	{"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
356
		0, NULL, NULL, NULL},
357
	{"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
358
		0, NULL, NULL, NULL},
359
	{"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' )",
360
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
361
362
363
364
365
366
367
	{"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
		0, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
		0, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
		0, NULL, NULL, NULL},
	{"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
368
		0, NULL, NULL, NULL},
369
	{"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
370
		0, NULL, NULL, NULL},
371
	{"( 1.3.6.1.4.1.1466.115.121.1.55 DESC 'Modify Rights' )",
372
		0, NULL, NULL, NULL},
373
	{"( 1.3.6.1.4.1.1466.115.121.1.56 DESC 'LDAP Schema Definition' )",
374
		0, NULL, NULL, NULL},
375
	{"( 1.3.6.1.4.1.1466.115.121.1.57 DESC 'LDAP Schema Description' )",
376
		0, NULL, NULL, NULL},
377
	{"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'Substring Assertion' )",
378
		0, NULL, NULL, NULL},
379

380
	/* OpenLDAP Experimental Syntaxes */
381
	{"( " SLAPD_OID_ACI_SYNTAX " DESC 'OpenLDAP Experimental ACI' )",
382
383
		0, NULL, NULL, NULL},

384
	{NULL, 0, NULL, NULL, NULL}
385
386
387
};

struct mrule_defs_rec {
388
	char *						mrd_desc;
389
	unsigned					mrd_usage;
390
391
392
393
394
	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;
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
};

/*
 * 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
437
#define caseIgnoreListSubstringsMatch NULL
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
#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 )",
455
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
456
		NULL, NULL, objectIdentifierMatch, NULL, NULL},
457
458
459

	{"( 2.5.13.1 NAME 'distinguishedNameMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
460
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
461
		NULL, NULL, distinguishedNameMatch, NULL, NULL},
462
463
464

	{"( 2.5.13.2 NAME 'caseIgnoreMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
465
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
466
		NULL, UTF8StringNormalize, caseIgnoreMatch, NULL, NULL},
467
468
469

	{"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
470
		SLAP_MR_ORDERING,
471
		NULL, UTF8StringNormalize, caseIgnoreOrderingMatch, NULL, NULL},
472
473
474

	{"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
475
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
476
		NULL, UTF8StringNormalize, caseIgnoreSubstringsMatch, NULL, NULL},
477
478
479
480

	/* 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 )",
481
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
482
		NULL, UTF8StringNormalize, caseExactMatch, NULL, NULL},
483
484
485

	{"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
486
		SLAP_MR_ORDERING,
487
		NULL, UTF8StringNormalize, caseExactOrderingMatch, NULL, NULL},
488
489
490

	{"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
491
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
492
		NULL, UTF8StringNormalize, caseExactSubstringsMatch, NULL, NULL},
493
494
495

	{"( 2.5.13.8 NAME 'numericStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
496
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
497
		NULL, NULL, numericStringMatch, NULL, NULL},
498
499
500

	{"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
501
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
502
		NULL, NULL, numericStringSubstringsMatch, NULL, NULL},
503
504
505

	{"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
506
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
507
		NULL, NULL, caseIgnoreListMatch, NULL, NULL},
508

Kurt Zeilenga's avatar
Kurt Zeilenga committed
509
510
511
512
513
	{"( 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},

514
515
	{"( 2.5.13.14 NAME 'integerMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
516
		SLAP_MR_NONE | SLAP_MR_EXT,
517
		NULL, NULL, integerMatch, NULL, NULL},
518
519
520

	{"( 2.5.13.16 NAME 'bitStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
521
		SLAP_MR_NONE | SLAP_MR_EXT,
522
		NULL, NULL, bitStringMatch, NULL, NULL},
523
524
525

	{"( 2.5.13.17 NAME 'octetStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
526
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
527
		NULL, NULL, octetStringMatch, NULL, NULL},
528
529
530

	{"( 2.5.13.20 NAME 'telephoneNumberMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
531
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
532
		NULL, NULL, telephoneNumberMatch, NULL, NULL},
533
534
535

	{"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
536
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
537
		NULL, NULL, telephoneNumberSubstringsMatch, NULL, NULL},
538
539
540

	{"( 2.5.13.22 NAME 'presentationAddressMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
541
		SLAP_MR_NONE | SLAP_MR_EXT,
542
		NULL, NULL, presentationAddressMatch, NULL, NULL},
543
544
545

	{"( 2.5.13.23 NAME 'uniqueMemberMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
546
		SLAP_MR_NONE | SLAP_MR_EXT,
547
		NULL, NULL, uniqueMemberMatch, NULL, NULL},
548
549
550

	{"( 2.5.13.24 NAME 'protocolInformationMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
551
		SLAP_MR_NONE | SLAP_MR_EXT,
552
		NULL, NULL, protocolInformationMatch, NULL, NULL},
553
554
555

	{"( 2.5.13.27 NAME 'generalizedTimeMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
556
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
557
		NULL, NULL, generalizedTimeMatch, NULL, NULL},
558
559
560

	{"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
561
		SLAP_MR_ORDERING,
562
		NULL, NULL, generalizedTimeOrderingMatch, NULL, NULL},
563
564
565

	{"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
566
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
567
		NULL, NULL, integerFirstComponentMatch, NULL, NULL},
568
569
570

	{"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
571
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
572
		NULL, NULL, objectIdentifierFirstComponentMatch, NULL, NULL},
573
574
575

	{"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
576
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
577
		NULL, IA5StringNormalize, caseExactIA5Match, NULL, NULL},
578
579
580

	{"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
581
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
582
		NULL, IA5StringNormalize, caseIgnoreIA5Match, NULL, NULL},
583
584
585

	{"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
586
		SLAP_MR_SUBSTR,
587
		NULL, IA5StringNormalize, caseIgnoreIA5SubstringsMatch, NULL, NULL},
588

589
	{NULL, SLAP_MR_NONE, NULL, NULL, NULL}
590
591
};

592
593
static int schema_init_done = 0;

594
595
596
597
598
599
int
schema_init( void )
{
	int		res;
	int		i;

600
601
	/* we should only be called once (from main) */
	assert( schema_init_done == 0 );
602
603
604

	for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
		res = register_syntax( syntax_defs[i].sd_desc,
605
		    syntax_defs[i].sd_flags,
606
607
608
609
610
611
612
		    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 );
613
			return -1;
614
615
616
617
		}
	}

	for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
618
619
620
621
622
623
624
		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;
		}

625
626
		res = register_matching_rule(
			mrule_defs[i].mrd_desc,
627
			mrule_defs[i].mrd_usage,
628
629
			mrule_defs[i].mrd_convert,
			mrule_defs[i].mrd_normalize,
630
631
632
		    mrule_defs[i].mrd_match,
			mrule_defs[i].mrd_indexer,
			mrule_defs[i].mrd_filter );
633
634
635
636
637

		if ( res ) {
			fprintf( stderr,
				"schema_init: Error registering matching rule %s\n",
				 mrule_defs[i].mrd_desc );
638
			return -1;
639
640
641
642
643
		}
	}
	schema_init_done = 1;
	return( 0 );
}
644
645

#ifdef SLAPD_SCHEMA_NOT_COMPAT
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
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) },
663
664
665
666

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

667
668
669
670
671
672
673
674
675
676
677
	{ "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) },

678
679
680
681
682
683
684
685
686
	{ "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) },

687
688
689
690
691
692
693
	{ "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) },
694
	{ NULL, 0 }
695
696
};

697
698
699
700
701
702
#endif

int
schema_prep( void )
{
#ifdef SLAPD_SCHEMA_NOT_COMPAT
703
	int i;
704
705
706
707
708
709
	char *text;
#endif
	/* we should only be called once after schema_init() was called */
	assert( schema_init_done == 1 );

#ifdef SLAPD_SCHEMA_NOT_COMPAT
710
	for( i=0; ad_map[i].ssm_type; i++ ) {
Kurt Zeilenga's avatar
Kurt Zeilenga committed
711
712
713
714
715
716
717
718
		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 );
719

720
721
722
723
724
725
		if( rc != LDAP_SUCCESS ) {
			fprintf( stderr,
				"No attribute \"%s\" defined in schema\n",
				ad_map[i].ssm_type );
			return rc;
		}
726
727
728
729
730
731
	}
#endif

	++schema_init_done;
	return 0;
}