1
/* Copyright 2004 IBM Corporation
3
* Redisribution and use in source and binary forms, with or without
4
* modification, are permitted only as authorizd by the OpenLADP
8
* This work originally developed by Sang Seok Lim
9
* 2004/06/18 03:20:00 slim@OpenLDAP.org
13
#include <ac/string.h>
14
#include <ac/socket.h>
19
#include "component.h"
21
#include "componentlib.h"
27
#ifndef SLAPD_COMP_MATCH
28
#define SLAPD_COMP_MATCH SLAPD_MOD_DYNAMIC
32
* Attribute and MatchingRule aliasing table
34
AttributeAliasing aa_table [ MAX_ALIASING_ENTRY ];
35
MatchingRuleAliasing mra_table [ MAX_ALIASING_ENTRY ];
37
OD_entry* gOD_table = NULL;
38
AsnTypetoMatchingRuleTable* gATMR_table = NULL;
41
load_derived_matching_rule ( char* cfg_path ){
45
comp_is_aliased_attribute( void *in )
47
AttributeAliasing* curr_aa;
49
AttributeDescription *ad = (AttributeDescription*)in;
51
for ( i = 0; aa_table[i].aa_aliasing_ad && i < MAX_ALIASING_ENTRY; i++ ) {
52
if ( strncmp(aa_table[i].aa_aliasing_ad->ad_cname.bv_val , ad->ad_cname.bv_val, ad->ad_cname.bv_len) == 0 )
59
add_aa_entry( int index, char* aliasing_at_name, char* aliased_at_name, char* mr_name, char* component_filter )
65
/* get and store aliasing AttributeDescription */
66
type.bv_val = aliasing_at_name;
67
type.bv_len = strlen ( aliasing_at_name );
68
rc = slap_bv2ad ( &type, &aa_table[index].aa_aliasing_ad,(const char**)text );
69
if ( rc != LDAP_SUCCESS ) return rc;
71
/* get and store aliased AttributeDescription */
72
type.bv_val = aliased_at_name;
73
type.bv_len = strlen ( aliased_at_name );
74
rc = slap_bv2ad ( &type, &aa_table[index].aa_aliased_ad,(const char**)text );
75
if ( rc != LDAP_SUCCESS ) return rc;
77
/* get and store componentFilterMatch */
78
type.bv_val = mr_name;
79
type.bv_len = strlen ( mr_name);
80
aa_table[index].aa_mr = mr_bvfind ( &type );
82
/* get and store a component filter */
83
type.bv_val = component_filter;
84
type.bv_len = strlen ( component_filter );
85
rc = get_comp_filter( NULL, &type, &aa_table[index].aa_cf,(const char**)text);
87
aa_table[index].aa_cf_str = component_filter;
93
* Initialize attribute aliasing table when this module is loaded
94
* add_aa_entry ( index for the global table,
95
* name of the aliasing attribute,
96
* component filter with filling value parts "xxx"
98
* "xxx" will be replaced with effective values later.
99
* See RFC3687 to understand the content of a component filter.
101
char* pre_processed_comp_filter[] = {
102
/*1*/"item:{ component \"toBeSigned.issuer.rdnSequence\", rule distinguishedNameMatch, value xxx }",
103
/*2*/"item:{ component \"toBeSigned.serialNumber\", rule integerMatch, value xxx }",
104
/*3*/"and:{ item:{ component \"toBeSigned.serialNumber\", rule integerMatch, value xxx }, item:{ component \"toBeSigned.issuer.rdnSequence\", rule distinguishedNameMatch, value xxx } }"
108
init_attribute_aliasing_table ()
113
rc = add_aa_entry ( index, "x509CertificateIssuer", "userCertificate","componentFilterMatch", pre_processed_comp_filter[index] );
114
if ( rc != LDAP_SUCCESS ) return LDAP_PARAM_ERROR;
117
rc = add_aa_entry ( index, "x509CertificateSerial","userCertificate", "componentFilterMatch", pre_processed_comp_filter[index] );
118
if ( rc != LDAP_SUCCESS ) return LDAP_PARAM_ERROR;
121
rc = add_aa_entry ( index, "x509CertificateSerialAndIssuer", "userCertificate", "componentFilterMatch", pre_processed_comp_filter[index] );
122
if ( rc != LDAP_SUCCESS ) return LDAP_PARAM_ERROR;
129
init_component_description_table () {
132
AsnTypetoSyntax* asn_to_syn;
135
for ( id = BASICTYPE_BOOLEAN; id != ASNTYPE_END ; id++ ) {
136
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_subtypes = NULL;
137
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_syntax = NULL;
139
/* Equality Matching Rule */
140
if ( asntype_to_compMR_mapping_tbl[id].atc_equality ) {
141
mr.bv_val = asntype_to_compMR_mapping_tbl[id].atc_equality;
142
mr.bv_len = strlen(asntype_to_compMR_mapping_tbl[id].atc_equality);
143
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_equality = mr_bvfind( &mr );
145
/* Approx Matching Rule */
146
if ( asntype_to_compMR_mapping_tbl[id].atc_approx ) {
147
mr.bv_val = asntype_to_compMR_mapping_tbl[id].atc_approx;
148
mr.bv_len = strlen(asntype_to_compMR_mapping_tbl[id].atc_approx);
149
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_approx = mr_bvfind( &mr );
152
/* Ordering Matching Rule */
153
if ( asntype_to_compMR_mapping_tbl[id].atc_ordering ) {
154
mr.bv_val = asntype_to_compMR_mapping_tbl[id].atc_ordering;
155
mr.bv_len = strlen(asntype_to_compMR_mapping_tbl[id].atc_ordering);
156
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_ordering= mr_bvfind( &mr );
159
/* Substr Matching Rule */
160
if ( asntype_to_compMR_mapping_tbl[id].atc_substr ) {
161
mr.bv_val = asntype_to_compMR_mapping_tbl[id].atc_substr;
162
mr.bv_len = strlen(asntype_to_compMR_mapping_tbl[id].atc_substr);
163
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_substr = mr_bvfind( &mr );
167
asn_to_syn = &asn_to_syntax_mapping_tbl[ id ];
168
if ( asn_to_syn->ats_syn_oid )
169
syn = syn_find ( asn_to_syn->ats_syn_oid );
172
asntype_to_compType_mapping_tbl[id].ac_comp_type.ct_syntax = syn;
174
/* Initialize Component Descriptions of primitive ASN.1 types */
175
asntype_to_compdesc_mapping_tbl[id].atcd_cd.cd_comp_type = (AttributeType*)&asntype_to_compType_mapping_tbl[id].ac_comp_type;
180
retrieve_matching_rule( char* mr_oid, AsnTypeId type ) {
182
struct berval mr_name = BER_BVNULL;
183
AsnTypetoMatchingRuleTable* atmr;
185
for ( atmr = gATMR_table ; atmr ; atmr = atmr->atmr_table_next ) {
186
if ( strcmp( atmr->atmr_oid, mr_oid ) == 0 ) {
187
tmp = atmr->atmr_table[type].atmr_mr_name;
189
mr_name.bv_val = tmp;
190
mr_name.bv_len = strlen( tmp );
191
return mr_bvfind ( &mr_name );
195
return (MatchingRule*)NULL;
199
comp_convert_attr_to_comp LDAP_P (( Attribute* a, Syntax *syn, struct berval* bv ))
202
int mode, bytesDecoded, size, rc;
204
char* oid = a->a_desc->ad_type->sat_atype.at_oid ;
207
OidDecoderMapping* odm;
209
/* look for the decoder registered for the given attribute */
210
odm = RetrieveOidDecoderMappingbyOid( oid, strlen(oid) );
212
if ( !odm || (!odm->BER_Decode && !odm->GSER_Decode) )
215
buf = ExpBufAllocBuf();
216
ExpBuftoGenBuf( buf, &b );
217
ExpBufInstallDataInBuf ( buf, bv->bv_val, bv->bv_len );
218
BufResetInReadMode( b );
220
mode = DEC_ALLOC_MODE_2;
222
* How can we decide which decoder will be called, GSER or BER?
223
* Currently BER decoder is called for a certificate.
224
* The flag of Attribute will say something about it in the future
226
if ( syn && slap_syntax_is_ber ( syn ) ) {
228
rc =BDecComponentTop(odm->BER_Decode, a->a_comp_data->cd_mem_op, b, 0,0, &component,&bytesDecoded,mode ) ;
230
rc = odm->BER_Decode ( a->a_comp_data->cd_mem_op, b, (ComponentSyntaxInfo*)&component, &bytesDecoded, mode );
233
rc = odm->GSER_Decode( a->a_comp_data->cd_mem_op, b, (ComponentSyntaxInfo**)component, &bytesDecoded, mode);
236
ExpBufFreeBuf( buf );
240
ShutdownNibbleMemLocal ( a->a_comp_data->cd_mem_op );
241
free ( a->a_comp_data );
242
a->a_comp_data = NULL;
251
#include <nibble-alloc.h>
253
comp_free_component ( void* mem_op ) {
254
ShutdownNibbleMemLocal( (NibbleMem*)mem_op );
259
comp_convert_assert_to_comp (
261
ComponentSyntaxInfo *csi_attr,
263
ComponentSyntaxInfo** csi, int* len, int mode )
268
gser_decoder_func *decoder = csi_attr->csi_comp_desc->cd_gser_decoder;
270
buf = ExpBufAllocBuf();
271
ExpBuftoGenBuf( buf, &genBuf );
272
ExpBufInstallDataInBuf ( buf, bv->bv_val, bv->bv_len );
273
BufResetInReadMode( genBuf );
275
if ( csi_attr->csi_comp_desc->cd_type_id == BASICTYPE_ANY )
276
decoder = ((ComponentAny*)csi_attr)->cai->GSER_Decode;
278
rc = (*decoder)( mem_op, genBuf, csi, len, mode );
279
ExpBufFreeBuf ( buf );
280
GenBufFreeBuf( genBuf );
283
int intToAscii( int value, char* buf ) {
285
int total_num_digits;
298
/* How many digits */
299
for ( temp = value, total_num_digits=0 ; temp ; total_num_digits++ )
302
total_num_digits += minus;
304
for ( i = minus ; value ; i++ ) {
305
buf[ total_num_digits - i - 1 ]= (char)(value%10 + '0');
312
comp_convert_asn_to_ldap ( MatchingRule* mr, ComponentSyntaxInfo* csi, struct berval* bv, int *allocated )
315
struct berval prettied;
318
AsnTypetoSyntax* asn_to_syn =
319
&asn_to_syntax_mapping_tbl[csi->csi_comp_desc->cd_type_id];
320
if ( asn_to_syn->ats_syn_oid )
321
csi->csi_syntax = syn_find ( asn_to_syn->ats_syn_oid );
323
csi->csi_syntax = NULL;
326
switch ( csi->csi_comp_desc->cd_type_id ) {
327
case BASICTYPE_BOOLEAN :
328
bv->bv_val = (char*)malloc( 5 );
331
if ( ((ComponentBool*)csi)->value > 0 ) {
332
strcpy ( bv->bv_val , "TRUE" );
336
strcpy ( bv->bv_val , "FALSE" );
340
case BASICTYPE_NULL :
343
case BASICTYPE_INTEGER :
344
bv->bv_val = (char*)malloc( INITIAL_ATTR_SIZE );
346
bv->bv_len = INITIAL_ATTR_SIZE;
347
bv->bv_len = intToAscii(((ComponentInt*)csi)->value, bv->bv_val );
348
if ( bv->bv_len <= 0 )
349
return LDAP_INVALID_SYNTAX;
351
case BASICTYPE_REAL :
352
return LDAP_INVALID_SYNTAX;
353
case BASICTYPE_ENUMERATED :
354
bv->bv_val = (char*)malloc( INITIAL_ATTR_SIZE );
356
bv->bv_len = INITIAL_ATTR_SIZE;
357
bv->bv_len = intToAscii(((ComponentEnum*)csi)->value, bv->bv_val );
358
if ( bv->bv_len <= 0 )
359
return LDAP_INVALID_SYNTAX;
362
case BASICTYPE_OCTETSTRING :
363
case BASICTYPE_BITSTRING :
364
case BASICTYPE_NUMERIC_STR :
365
case BASICTYPE_PRINTABLE_STR :
366
case BASICTYPE_UNIVERSAL_STR :
367
case BASICTYPE_IA5_STR :
368
case BASICTYPE_BMP_STR :
369
case BASICTYPE_UTF8_STR :
370
case BASICTYPE_UTCTIME :
371
case BASICTYPE_GENERALIZEDTIME :
372
case BASICTYPE_GRAPHIC_STR :
373
case BASICTYPE_VISIBLE_STR :
374
case BASICTYPE_GENERAL_STR :
375
case BASICTYPE_OBJECTDESCRIPTOR :
376
case BASICTYPE_VIDEOTEX_STR :
377
case BASICTYPE_T61_STR :
378
case BASICTYPE_OCTETCONTAINING :
379
case BASICTYPE_BITCONTAINING :
380
case BASICTYPE_RELATIVE_OID :
381
bv->bv_val = ((ComponentOcts*)csi)->value.octs;
382
bv->bv_len = ((ComponentOcts*)csi)->value.octetLen;
385
csi = ((ComponentAny*)csi)->value;
386
if ( csi->csi_comp_desc->cd_type != ASN_BASIC ||
387
csi->csi_comp_desc->cd_type_id == BASICTYPE_ANY )
388
return LDAP_INVALID_SYNTAX;
389
return comp_convert_asn_to_ldap( mr, csi, bv, allocated );
390
case COMPOSITE_ASN1_TYPE :
394
if( strncmp( mr->smr_mrule.mr_oid, DN_MATCH_OID, strlen(DN_MATCH_OID) ) != 0 )
395
return LDAP_INVALID_SYNTAX;
397
rc = ConvertRDNSequence2RFC2253( (irRDNSequence*)csi, bv );
398
if ( rc != LDAP_SUCCESS ) return rc;
400
case RelativeDistinguishedName :
402
if( strncmp( mr->smr_mrule.mr_oid, RDN_MATCH_OID, strlen(RDN_MATCH_OID) ) != 0 )
403
return LDAP_INVALID_SYNTAX;
405
rc = ConvertRDN2RFC2253((irRelativeDistinguishedName*)csi,bv);
406
if ( rc != LDAP_SUCCESS ) return rc;
408
case TelephoneNumber :
409
case FacsimileTelephoneNumber__telephoneNumber :
411
case DirectoryString :
412
return LDAP_INVALID_SYNTAX;
413
case ASN_COMP_CERTIFICATE :
417
/*Only ASN Basic Type can be converted into LDAP string*/
418
return LDAP_INVALID_SYNTAX;
421
if ( csi->csi_syntax ) {
422
if ( csi->csi_syntax->ssyn_validate ) {
423
rc = csi->csi_syntax->ssyn_validate(csi->csi_syntax, bv);
424
if ( rc != LDAP_SUCCESS )
425
return LDAP_INVALID_SYNTAX;
427
if ( csi->csi_syntax->ssyn_pretty ) {
428
rc = csi->csi_syntax->ssyn_pretty(csi->csi_syntax, bv, &prettied , NULL );
429
if ( rc != LDAP_SUCCESS )
430
return LDAP_INVALID_SYNTAX;
432
free ( bv->bv_val );/*potential memory leak?*/
434
bv->bv_val = prettied.bv_val;
435
bv->bv_len = prettied.bv_len;
443
* If <all> type component referenced is used
444
* more than one component will be tested
446
#define IS_TERMINAL_COMPREF(cr) (cr->cr_curr->ci_next == NULL)
448
comp_test_all_components (
451
ComponentSyntaxInfo *csi_attr,
452
ComponentAssertion* ca )
455
ComponentSyntaxInfo *csi_temp = NULL, *csi_assert = NULL, *comp_elmt = NULL;
456
ComponentReference *cr = ca->ca_comp_ref;
457
struct berval *ca_val = &ca->ca_ma_value;
459
switch ( cr->cr_curr->ci_type ) {
460
case LDAP_COMPREF_ALL:
461
if ( IS_TERMINAL_COMPREF(cr) ) {
462
FOR_EACH_LIST_ELMT( comp_elmt, &((ComponentList*)csi_attr)->comp_list )
464
rc = comp_test_one_component( attr_mem_op, assert_mem_op, comp_elmt, ca );
465
if ( rc == LDAP_COMPARE_TRUE ) {
470
ComponentId *start_compid = ca->ca_comp_ref->cr_curr->ci_next;
471
FOR_EACH_LIST_ELMT( comp_elmt, &((ComponentList*)csi_attr)->comp_list )
473
cr->cr_curr = start_compid;
474
rc = comp_test_components ( attr_mem_op, assert_mem_op, comp_elmt, ca );
475
if ( rc != LDAP_COMPARE_FALSE ) {
479
if ( rc == LDAP_COMPARE_TRUE ) {
486
case LDAP_COMPREF_CONTENT:
487
case LDAP_COMPREF_SELECT:
488
case LDAP_COMPREF_DEFINED:
489
case LDAP_COMPREF_UNDEFINED:
490
case LDAP_COMPREF_IDENTIFIER:
491
case LDAP_COMPREF_FROM_BEGINNING:
492
case LDAP_COMPREF_FROM_END:
493
case LDAP_COMPREF_COUNT:
494
rc = LDAP_OPERATIONS_ERROR;
497
rc = LDAP_OPERATIONS_ERROR;
503
eat_bv_whsp ( struct berval* in )
505
char* end = in->bv_val + in->bv_len;
506
for ( ; ( *in->bv_val == ' ' ) && ( in->bv_val < end ) ; ) {
512
* Perform matching one referenced component against assertion
513
* If the matching rule in a component filter is allComponentsMatch
514
* or its derivatives the extracted component's ASN.1 specification
515
* is applied to the assertion value as its syntax
516
* Otherwise, the matching rule's syntax is applied to the assertion value
520
comp_test_one_component (
523
ComponentSyntaxInfo *csi_attr,
524
ComponentAssertion *ca )
527
ComponentSyntaxInfo *csi_assert = NULL;
529
MatchingRule* mr = ca->ca_ma_rule;
531
if ( mr->smr_usage & SLAP_MR_COMPONENT ) {
532
/* If allComponentsMatch or its derivatives */
533
if ( !ca->ca_comp_data.cd_tree ) {
534
comp_convert_assert_to_comp( assert_mem_op, csi_attr, &ca->ca_ma_value, &csi_assert, &len, DEC_ALLOC_MODE_0 );
535
ca->ca_comp_data.cd_tree = (void*)csi_assert;
537
csi_assert = ca->ca_comp_data.cd_tree;
541
return LDAP_PROTOCOL_ERROR;
543
if ( strcmp( mr->smr_mrule.mr_oid, OID_ALL_COMP_MATCH ) != 0 )
545
/* allComponentMatch's derivatives */
546
oid = mr->smr_mrule.mr_oid;
548
return csi_attr->csi_comp_desc->cd_all_match(
549
oid, csi_attr, csi_assert );
552
/* LDAP existing matching rules */
553
struct berval attr_bv = BER_BVNULL;
554
struct berval n_attr_bv = BER_BVNULL;
555
struct berval* assert_bv = &ca->ca_ma_value;
557
/*Attribute is converted to compatible LDAP encodings*/
558
if ( comp_convert_asn_to_ldap( mr, csi_attr, &attr_bv, &allocated ) != LDAP_SUCCESS )
559
return LDAP_INAPPROPRIATE_MATCHING;
560
/* extracted component value is not normalized */
561
if ( ca->ca_ma_rule->smr_normalize ) {
562
rc = ca->ca_ma_rule->smr_normalize (
563
SLAP_MR_VALUE_OF_ASSERTION_SYNTAX,
564
NULL, ca->ca_ma_rule,
565
&attr_bv, &n_attr_bv, NULL );
566
if ( rc != LDAP_SUCCESS )
568
if ( allocated && attr_bv.bv_val )
569
free (attr_bv.bv_val);
574
/*Assertion value is validated by MR's syntax*/
575
if ( !ca->ca_comp_data.cd_tree ) {
576
ca->ca_comp_data.cd_tree = assert_bv;
579
assert_bv = ca->ca_comp_data.cd_tree;
582
if ( !n_attr_bv.bv_val )
583
return LDAP_COMPARE_FALSE;
584
rc = csi_value_match( mr, &n_attr_bv, assert_bv );
585
if ( n_attr_bv.bv_val )
586
free ( n_attr_bv.bv_val );
592
comp_test_components( void* attr_nm, void* assert_nm, ComponentSyntaxInfo* csi_attr, ComponentAssertion* ca) {
594
int mode, bytesDecoded = 0, rc;
597
OidDecoderMapping* odm;
599
char oid[MAX_OID_LEN];
600
void* contained_comp, *anytype_comp;
601
ComponentReference* cr = ca->ca_comp_ref;
604
return comp_test_one_component ( attr_nm, assert_nm, csi_attr, ca );
605
/* Extracting the component refrenced by ca->ca_comp_ref */
606
csi_attr = (ComponentSyntaxInfo*)csi_attr->csi_comp_desc->cd_extract_i( attr_nm, cr, csi_attr );
607
if ( !csi_attr ) return LDAP_INVALID_SYNTAX;
608
/* perform matching, considering the type of a Component Reference(CR)*/
609
switch( cr->cr_curr->ci_type ) {
610
case LDAP_COMPREF_IDENTIFIER:
611
case LDAP_COMPREF_FROM_BEGINNING:
612
case LDAP_COMPREF_FROM_END:
613
case LDAP_COMPREF_COUNT:
615
* Exactly one component is referenced
616
* Fast Path for matching for this case
618
rc = comp_test_one_component ( attr_nm, assert_nm, csi_attr, ca );
620
case LDAP_COMPREF_ALL:
622
* If <all> type CR is used
623
* more than one component will be tested
625
rc = comp_test_all_components ( attr_nm, assert_nm, csi_attr, ca );
628
case LDAP_COMPREF_CONTENT:
630
* <content> type CR is used
631
* check if it is followed by <select> type CR.
632
* 1) If so, look up the corresponding decoder in the mapping
633
* table(OID to decoder) by <select>
634
* and then decode the OCTET/BIT STRING with the decoder
635
* Finially, extreact the target component with the remaining CR.
636
* 2) If not, just return the current component, It SHOULD not be
637
* extracted further, because the component MUST be BIT/OCTET
641
cr->cr_curr = cr->cr_curr->ci_next;
642
if ( !cr->cr_curr ) {
643
/* case 2) in above description */
644
rc = comp_test_one_component ( attr_nm, assert_nm, csi_attr, ca );
648
if ( cr->cr_curr->ci_type == LDAP_COMPREF_SELECT ) {
649
/* Look up OID mapping table */
650
odm = RetrieveOidDecoderMappingbyBV( &cr->cr_curr->ci_val.ci_select_value );
652
if ( !odm || !odm->BER_Decode )
653
return LDAP_PROTOCOL_ERROR;
655
/* current componet MUST be either BIT or OCTET STRING */
656
if ( csi_attr->csi_comp_desc->cd_type_id != BASICTYPE_BITSTRING ) {
657
bv.bv_val = ((ComponentBits*)csi_attr)->value.bits;
658
bv.bv_len = ((ComponentBits*)csi_attr)->value.bitLen;
660
else if ( csi_attr->csi_comp_desc->cd_type_id != BASICTYPE_BITSTRING ) {
661
bv.bv_val = ((ComponentOcts*)csi_attr)->value.octs;
662
bv.bv_len = ((ComponentOcts*)csi_attr)->value.octetLen;
665
return LDAP_PROTOCOL_ERROR;
667
buf = ExpBufAllocBuf();
668
ExpBuftoGenBuf( buf, &b );
669
ExpBufInstallDataInBuf ( buf, bv.bv_val, bv.bv_len );
670
BufResetInReadMode( b );
671
mode = DEC_ALLOC_MODE_2;
673
/* Try to decode with BER/DER decoder */
674
rc = odm->BER_Decode ( attr_nm, b, (ComponentSyntaxInfo*)&contained_comp, &bytesDecoded, mode );
676
ExpBufFreeBuf( buf );
679
if ( rc != LDAP_SUCCESS ) return LDAP_PROTOCOL_ERROR;
681
/* xxx.content.(x.xy.xyz).rfc822Name */
682
/* In the aboe Ex. move CR to the right to (x.xy.xyz)*/
683
cr->cr_curr = cr->cr_curr->ci_next;
685
rc = comp_test_one_component ( attr_nm, assert_nm, csi_attr, ca );
687
rc = comp_test_components( attr_nm, assert_nm, contained_comp, ca );
690
/* Ivalid Component reference */
691
rc = LDAP_PROTOCOL_ERROR;
694
case LDAP_COMPREF_SELECT:
695
if (csi_attr->csi_comp_desc->cd_type_id != BASICTYPE_ANY )
696
return LDAP_INVALID_SYNTAX;
697
rc = CheckSelectTypeCorrect( attr_nm, ((ComponentAny*)csi_attr)->cai, &cr->cr_curr->ci_val.ci_select_value );
698
if ( rc < 0 ) return LDAP_INVALID_SYNTAX;
700
/* point to the real component, not any type component */
701
csi_attr = ((ComponentAny*)csi_attr)->value;
702
cr->cr_curr = cr->cr_curr->ci_next;
704
rc = comp_test_components( attr_nm, assert_nm, csi_attr, ca);
706
rc = comp_test_one_component( attr_nm, assert_nm, csi_attr, ca);
709
rc = LDAP_INVALID_SYNTAX;
716
comp_nibble_memory_allocator ( int init_mem, int inc_mem ) {
718
nm = (void*)InitNibbleMemLocal( (unsigned long)init_mem, (unsigned long)inc_mem );
719
if ( !nm ) return NULL;
720
else return (void*)nm;
724
comp_nibble_memory_free ( void* nm ) {
725
ShutdownNibbleMemLocal( nm );
729
comp_get_component_description ( int id ) {
730
if ( asntype_to_compdesc_mapping_tbl[id].atcd_typeId == id )
731
return &asntype_to_compdesc_mapping_tbl[id].atcd_cd;
737
comp_component_encoder ( void* mem_op, ComponentSyntaxInfo* csi , struct berval* nval ) {
743
buf = ExpBufAllocBufAndData();
744
ExpBufResetInWriteRvsMode(buf);
745
ExpBuftoGenBuf( buf, &b );
747
if ( !csi->csi_comp_desc->cd_gser_encoder && !csi->csi_comp_desc->cd_ldap_encoder )
751
* if an LDAP specific encoder is provided :
752
* dn and rdn have their LDAP specific encoder
754
if ( csi->csi_comp_desc->cd_ldap_encoder ) {
755
rc = csi->csi_comp_desc->cd_ldap_encoder( csi, &bv );
756
if ( rc != LDAP_SUCCESS )
759
nval->bv_val = CompAlloc( mem_op, bv.bv_len );
761
nval->bv_val = malloc( size );
762
memcpy( nval->bv_val, bv.bv_val, bv.bv_len );
763
nval->bv_len = bv.bv_len;
765
* This free will be eliminated by making ldap_encoder
766
* use nibble memory in it
774
rc = csi->csi_comp_desc->cd_gser_encoder( b, csi );
781
size = ExpBufDataSize( buf );
784
nval->bv_val = CompAlloc ( mem_op, size );
786
nval->bv_val = malloc( size );
788
BufResetInReadMode(b);
789
BufCopy( nval->bv_val, b, size );
791
ExpBufFreeBuf( buf );
797
#if SLAPD_COMP_MATCH == SLAPD_MOD_DYNAMIC
799
#include "certificate.h"
801
extern convert_attr_to_comp_func* attr_converter;
802
extern convert_assert_to_comp_func* assert_converter;
803
extern convert_asn_to_ldap_func* csi_converter;
804
extern free_component_func* component_destructor;
805
extern test_component_func* test_components;
806
extern alloc_nibble_func* nibble_mem_allocator;
807
extern free_nibble_func* nibble_mem_free;
808
extern test_membership_func* is_aliased_attribute;
809
extern get_component_info_func* get_component_description;
810
extern component_encoder_func* component_encoder;
813
int init_module(int argc, char *argv[]) {
815
* Initialize function pointers in slapd
817
attr_converter = (convert_attr_to_comp_func*)comp_convert_attr_to_comp;
818
assert_converter = (convert_assert_to_comp_func*)comp_convert_assert_to_comp;
819
component_destructor = (free_component_func*)comp_free_component;
820
test_components = (test_component_func*)comp_test_components;
821
nibble_mem_allocator = (free_nibble_func*)comp_nibble_memory_allocator;
822
nibble_mem_free = (free_nibble_func*)comp_nibble_memory_free;
823
is_aliased_attribute = (test_membership_func*)comp_is_aliased_attribute;
824
get_component_description = (get_component_info_func*)comp_get_component_description;
825
component_encoder = (component_encoder_func*)comp_component_encoder;
827
/* file path needs to be */
828
load_derived_matching_rule ("derived_mr.cfg");
830
/* the initialization for example X.509 certificate */
831
init_module_AuthenticationFramework();
832
init_module_AuthorityKeyIdentifierDefinition();
833
init_module_CertificateRevokationList();
834
init_attribute_aliasing_table ();
835
init_component_description_table ();
839
#endif /* SLAPD_PASSWD */