schema_init.c 18.9 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
296
	{"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'DataQuality' )",
		0, NULL, NULL, NULL},
297
	{"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'DeliveryMethod' )",
298
		0, NULL, NULL, NULL},
299
	{"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'DirectoryString' )",
300
		0, UTF8StringValidate, NULL, NULL},
301
	{"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DITContentRuleDescription' )",
302
		0, NULL, NULL, NULL},
303
	{"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DITStructureRuleDescription' )",
304
		0, NULL, NULL, NULL},
305
306
	{"( 1.3.6.1.4.1.1466.115.121.1.19 DESC 'DSAQuality' )",
		0, NULL, NULL, NULL},
307
	{"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'EnhancedGuide' )",
308
		0, NULL, NULL, NULL},
309
	{"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'FacsimileTelephoneNumber' )",
310
		0, NULL, NULL, NULL},
311
312
	{"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' )",
		0, NULL, NULL, NULL},
313
	{"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'GeneralizedTime' )",
314
		0, NULL, NULL, NULL},
315
	{"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
316
		0, NULL, NULL, NULL},
317
	{"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5String' )",
318
		0, IA5StringValidate, NULL, NULL},
319
	{"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
320
		0, NULL, NULL, NULL},
321
	{"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )",
322
		0, NULL, NULL, NULL},
323
	{"( 1.3.6.1.4.1.1466.115.121.1.30 DESC 'MatchingRuleDescription' )",
324
		0, NULL, NULL, NULL},
325
	{"( 1.3.6.1.4.1.1466.115.121.1.31 DESC 'MatchingRuleUseDescription' )",
326
		0, NULL, NULL, NULL},
327
	{"( 1.3.6.1.4.1.1466.115.121.1.32 DESC 'MailPreference' )",
328
		0, NULL, NULL, NULL},
329
	{"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'NameAndOptionalUID' )",
330
		0, NULL, NULL, NULL},
331
	{"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'NameFormDescription' )",
332
		0, NULL, NULL, NULL},
333
	{"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'NumericString' )",
334
		0, NULL, NULL, NULL},
335
	{"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'ObjectClassDescription' )",
336
		0, NULL, NULL, NULL},
337
	{"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
338
		0, NULL, NULL, NULL},
339
	{"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'OtherMailbox' )",
340
		0, NULL, NULL, NULL},
341
	{"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'OctetString' )",
342
		0, octetStringValidate, NULL, NULL},
343
	{"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'PostalAddress' )",
344
		0, NULL, NULL, NULL},
345
	{"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'ProtocolInformation' )",
346
		0, NULL, NULL, NULL},
347
	{"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'PresentationAddress' )",
348
		0, NULL, NULL, NULL},
349
	{"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'PrintableString' )",
350
		0, NULL, NULL, NULL},
351
	{"( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'SupportedAlgorithm' )",
352
		SLAP_SYNTAX_BINARY, NULL, NULL, NULL},
353
	{"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'TelephoneNumber' )",
354
		0, NULL, NULL, NULL},
355
	{"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'TeletexTerminalIdentifier' )",
356
		0, NULL, NULL, NULL},
357
	{"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'TelexNumber' )",
358
		0, NULL, NULL, NULL},
359
	{"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTCTime' )",
360
		0, NULL, NULL, NULL},
361
	{"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAPSyntaxDescription' )",
362
		0, NULL, NULL, NULL},
363
	{"( 1.3.6.1.4.1.1466.115.121.1.58 DESC 'SubstringAssertion' )",
364
		0, NULL, NULL, NULL},
365

366
367
368
369
	/* OpenLDAP Experimental Syntaxes */
	{"( " SLAPD_OID_ACI_SYNTAX " DESC 'OpenLDAPexperimentalACI' )",
		0, NULL, NULL, NULL},

370
	{NULL, 0, NULL, NULL, NULL}
371
372
373
};

struct mrule_defs_rec {
374
	char *						mrd_desc;
375
	unsigned					mrd_usage;
376
377
378
379
380
	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;
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
417
418
419
420
421
422
};

/*
 * 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
423
#define caseIgnoreListSubstringsMatch NULL
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
#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 )",
441
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
442
		NULL, NULL, objectIdentifierMatch, NULL, NULL},
443
444
445

	{"( 2.5.13.1 NAME 'distinguishedNameMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
446
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
447
		NULL, NULL, distinguishedNameMatch, NULL, NULL},
448
449
450

	{"( 2.5.13.2 NAME 'caseIgnoreMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
451
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
452
		NULL, UTF8StringNormalize, caseIgnoreMatch, NULL, NULL},
453
454
455

	{"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
456
		SLAP_MR_ORDERING,
457
		NULL, UTF8StringNormalize, caseIgnoreOrderingMatch, NULL, NULL},
458
459
460

	{"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
461
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
462
		NULL, UTF8StringNormalize, caseIgnoreSubstringsMatch, NULL, NULL},
463
464
465
466

	/* 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 )",
467
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
468
		NULL, UTF8StringNormalize, caseExactMatch, NULL, NULL},
469
470
471

	{"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
472
		SLAP_MR_ORDERING,
473
		NULL, UTF8StringNormalize, caseExactOrderingMatch, NULL, NULL},
474
475
476

	{"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
477
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
478
		NULL, UTF8StringNormalize, caseExactSubstringsMatch, NULL, NULL},
479
480
481

	{"( 2.5.13.8 NAME 'numericStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
482
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
483
		NULL, NULL, numericStringMatch, NULL, NULL},
484
485
486

	{"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
487
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
488
		NULL, NULL, numericStringSubstringsMatch, NULL, NULL},
489
490
491

	{"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
492
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
493
		NULL, NULL, caseIgnoreListMatch, NULL, NULL},
494

Kurt Zeilenga's avatar
Kurt Zeilenga committed
495
496
497
498
499
	{"( 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},

500
501
	{"( 2.5.13.14 NAME 'integerMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
502
		SLAP_MR_NONE | SLAP_MR_EXT,
503
		NULL, NULL, integerMatch, NULL, NULL},
504
505
506

	{"( 2.5.13.16 NAME 'bitStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
507
		SLAP_MR_NONE | SLAP_MR_EXT,
508
		NULL, NULL, bitStringMatch, NULL, NULL},
509
510
511

	{"( 2.5.13.17 NAME 'octetStringMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
512
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
513
		NULL, NULL, octetStringMatch, NULL, NULL},
514
515
516

	{"( 2.5.13.20 NAME 'telephoneNumberMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
517
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
518
		NULL, NULL, telephoneNumberMatch, NULL, NULL},
519
520
521

	{"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
522
		SLAP_MR_SUBSTR | SLAP_MR_EXT,
523
		NULL, NULL, telephoneNumberSubstringsMatch, NULL, NULL},
524
525
526

	{"( 2.5.13.22 NAME 'presentationAddressMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )",
527
		SLAP_MR_NONE | SLAP_MR_EXT,
528
		NULL, NULL, presentationAddressMatch, NULL, NULL},
529
530
531

	{"( 2.5.13.23 NAME 'uniqueMemberMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
532
		SLAP_MR_NONE | SLAP_MR_EXT,
533
		NULL, NULL, uniqueMemberMatch, NULL, NULL},
534
535
536

	{"( 2.5.13.24 NAME 'protocolInformationMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
537
		SLAP_MR_NONE | SLAP_MR_EXT,
538
		NULL, NULL, protocolInformationMatch, NULL, NULL},
539
540
541

	{"( 2.5.13.27 NAME 'generalizedTimeMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
542
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
543
		NULL, NULL, generalizedTimeMatch, NULL, NULL},
544
545
546

	{"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
547
		SLAP_MR_ORDERING,
548
		NULL, NULL, generalizedTimeOrderingMatch, NULL, NULL},
549
550
551

	{"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
552
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
553
		NULL, NULL, integerFirstComponentMatch, NULL, NULL},
554
555
556

	{"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
557
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
558
		NULL, NULL, objectIdentifierFirstComponentMatch, NULL, NULL},
559
560
561

	{"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
562
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
563
		NULL, IA5StringNormalize, caseExactIA5Match, NULL, NULL},
564
565
566

	{"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
567
		SLAP_MR_EQUALITY | SLAP_MR_EXT,
568
		NULL, IA5StringNormalize, caseIgnoreIA5Match, NULL, NULL},
569
570
571

	{"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
		"SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
572
		SLAP_MR_SUBSTR,
573
		NULL, IA5StringNormalize, caseIgnoreIA5SubstringsMatch, NULL, NULL},
574

575
	{NULL, SLAP_MR_NONE, NULL, NULL, NULL}
576
577
};

578
579
static int schema_init_done = 0;

580
581
582
583
584
585
int
schema_init( void )
{
	int		res;
	int		i;

586
587
	/* we should only be called once (from main) */
	assert( schema_init_done == 0 );
588
589
590

	for ( i=0; syntax_defs[i].sd_desc != NULL; i++ ) {
		res = register_syntax( syntax_defs[i].sd_desc,
591
		    syntax_defs[i].sd_flags,
592
593
594
595
596
597
598
		    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 );
599
			return -1;
600
601
602
603
		}
	}

	for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
604
605
606
607
608
609
610
		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;
		}

611
612
		res = register_matching_rule(
			mrule_defs[i].mrd_desc,
613
			mrule_defs[i].mrd_usage,
614
615
			mrule_defs[i].mrd_convert,
			mrule_defs[i].mrd_normalize,
616
617
618
		    mrule_defs[i].mrd_match,
			mrule_defs[i].mrd_indexer,
			mrule_defs[i].mrd_filter );
619
620
621
622
623

		if ( res ) {
			fprintf( stderr,
				"schema_init: Error registering matching rule %s\n",
				 mrule_defs[i].mrd_desc );
624
			return -1;
625
626
627
628
629
		}
	}
	schema_init_done = 1;
	return( 0 );
}
630
631

#ifdef SLAPD_SCHEMA_NOT_COMPAT
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
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) },
649
650
651
652

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

653
654
655
656
657
658
659
660
661
662
663
	{ "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) },

664
665
666
667
668
669
670
671
672
	{ "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) },

673
674
675
676
677
678
679
	{ "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) },
680
	{ NULL, 0 }
681
682
};

683
684
685
686
687
688
#endif

int
schema_prep( void )
{
#ifdef SLAPD_SCHEMA_NOT_COMPAT
689
	int i;
690
691
692
693
694
695
	char *text;
#endif
	/* we should only be called once after schema_init() was called */
	assert( schema_init_done == 1 );

#ifdef SLAPD_SCHEMA_NOT_COMPAT
696
	for( i=0; ad_map[i].ssm_type; i++ ) {
Kurt Zeilenga's avatar
Kurt Zeilenga committed
697
698
699
700
701
702
703
704
		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 );
705

706
707
708
709
710
711
		if( rc != LDAP_SUCCESS ) {
			fprintf( stderr,
				"No attribute \"%s\" defined in schema\n",
				ad_map[i].ssm_type );
			return rc;
		}
712
713
714
715
716
717
	}
#endif

	++schema_init_done;
	return 0;
}