1 1.3 christos /* $NetBSD: schema_prep.c,v 1.4 2025/09/05 21:16:25 christos Exp $ */ 2 1.2 christos 3 1.1 lukem /* schema_prep.c - load builtin schema */ 4 1.2 christos /* $OpenLDAP$ */ 5 1.1 lukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 1.1 lukem * 7 1.4 christos * Copyright 1998-2024 The OpenLDAP Foundation. 8 1.1 lukem * All rights reserved. 9 1.1 lukem * 10 1.1 lukem * Redistribution and use in source and binary forms, with or without 11 1.1 lukem * modification, are permitted only as authorized by the OpenLDAP 12 1.1 lukem * Public License. 13 1.1 lukem * 14 1.1 lukem * A copy of this license is available in the file LICENSE in the 15 1.1 lukem * top-level directory of the distribution or, alternatively, at 16 1.1 lukem * <http://www.OpenLDAP.org/license.html>. 17 1.1 lukem */ 18 1.1 lukem 19 1.2 christos #include <sys/cdefs.h> 20 1.3 christos __RCSID("$NetBSD: schema_prep.c,v 1.4 2025/09/05 21:16:25 christos Exp $"); 21 1.2 christos 22 1.1 lukem #include "portable.h" 23 1.1 lukem 24 1.1 lukem #include <stdio.h> 25 1.1 lukem 26 1.1 lukem #include <ac/ctype.h> 27 1.1 lukem #include <ac/string.h> 28 1.1 lukem #include <ac/socket.h> 29 1.1 lukem 30 1.1 lukem #include "slap.h" 31 1.1 lukem 32 1.1 lukem #define OCDEBUG 0 33 1.1 lukem 34 1.1 lukem int schema_init_done = 0; 35 1.1 lukem 36 1.1 lukem struct slap_internal_schema slap_schema; 37 1.1 lukem 38 1.1 lukem static int 39 1.1 lukem oidValidate( 40 1.1 lukem Syntax *syntax, 41 1.1 lukem struct berval *in ) 42 1.1 lukem { 43 1.1 lukem struct berval val = *in; 44 1.1 lukem 45 1.1 lukem if( val.bv_len == 0 ) { 46 1.1 lukem /* disallow empty strings */ 47 1.1 lukem return LDAP_INVALID_SYNTAX; 48 1.1 lukem } 49 1.1 lukem 50 1.1 lukem if( DESC_LEADCHAR( val.bv_val[0] ) ) { 51 1.1 lukem val.bv_val++; 52 1.1 lukem val.bv_len--; 53 1.1 lukem if ( val.bv_len == 0 ) return LDAP_SUCCESS; 54 1.1 lukem 55 1.1 lukem while( DESC_CHAR( val.bv_val[0] ) ) { 56 1.1 lukem val.bv_val++; 57 1.1 lukem val.bv_len--; 58 1.1 lukem 59 1.1 lukem if ( val.bv_len == 0 ) return LDAP_SUCCESS; 60 1.1 lukem } 61 1.1 lukem 62 1.1 lukem } else { 63 1.1 lukem int sep = 0; 64 1.1 lukem while( OID_LEADCHAR( val.bv_val[0] ) ) { 65 1.1 lukem val.bv_val++; 66 1.1 lukem val.bv_len--; 67 1.1 lukem 68 1.1 lukem if ( val.bv_val[-1] != '0' ) { 69 1.1 lukem while ( OID_LEADCHAR( val.bv_val[0] )) { 70 1.1 lukem val.bv_val++; 71 1.1 lukem val.bv_len--; 72 1.1 lukem } 73 1.1 lukem } 74 1.1 lukem 75 1.1 lukem if( val.bv_len == 0 ) { 76 1.1 lukem if( sep == 0 ) break; 77 1.1 lukem return LDAP_SUCCESS; 78 1.1 lukem } 79 1.1 lukem 80 1.1 lukem if( !OID_SEPARATOR( val.bv_val[0] )) break; 81 1.1 lukem 82 1.1 lukem sep++; 83 1.1 lukem val.bv_val++; 84 1.1 lukem val.bv_len--; 85 1.1 lukem } 86 1.1 lukem } 87 1.1 lukem 88 1.1 lukem return LDAP_INVALID_SYNTAX; 89 1.1 lukem } 90 1.1 lukem 91 1.1 lukem 92 1.1 lukem static int objectClassPretty( 93 1.1 lukem Syntax *syntax, 94 1.1 lukem struct berval *in, 95 1.1 lukem struct berval *out, 96 1.1 lukem void *ctx ) 97 1.1 lukem { 98 1.1 lukem ObjectClass *oc; 99 1.1 lukem 100 1.1 lukem if( oidValidate( NULL, in )) return LDAP_INVALID_SYNTAX; 101 1.1 lukem 102 1.1 lukem oc = oc_bvfind( in ); 103 1.1 lukem if( oc == NULL ) return LDAP_INVALID_SYNTAX; 104 1.1 lukem 105 1.1 lukem ber_dupbv_x( out, &oc->soc_cname, ctx ); 106 1.1 lukem return LDAP_SUCCESS; 107 1.1 lukem } 108 1.1 lukem 109 1.1 lukem static int 110 1.1 lukem attributeTypeMatch( 111 1.1 lukem int *matchp, 112 1.1 lukem slap_mask_t flags, 113 1.1 lukem Syntax *syntax, 114 1.1 lukem MatchingRule *mr, 115 1.1 lukem struct berval *value, 116 1.1 lukem void *assertedValue ) 117 1.1 lukem { 118 1.1 lukem struct berval *a = (struct berval *) assertedValue; 119 1.1 lukem AttributeType *at = at_bvfind( value ); 120 1.1 lukem AttributeType *asserted = at_bvfind( a ); 121 1.1 lukem 122 1.1 lukem if( asserted == NULL ) { 123 1.1 lukem if( OID_LEADCHAR( *a->bv_val ) ) { 124 1.1 lukem /* OID form, return FALSE */ 125 1.1 lukem *matchp = 1; 126 1.1 lukem return LDAP_SUCCESS; 127 1.1 lukem } 128 1.1 lukem 129 1.1 lukem /* desc form, return undefined */ 130 1.1 lukem return LDAP_INVALID_SYNTAX; 131 1.1 lukem } 132 1.1 lukem 133 1.1 lukem if ( at == NULL ) { 134 1.1 lukem /* unrecognized stored value */ 135 1.1 lukem return LDAP_INVALID_SYNTAX; 136 1.1 lukem } 137 1.1 lukem 138 1.1 lukem *matchp = ( asserted != at ); 139 1.1 lukem return LDAP_SUCCESS; 140 1.1 lukem } 141 1.1 lukem 142 1.1 lukem static int 143 1.1 lukem matchingRuleMatch( 144 1.1 lukem int *matchp, 145 1.1 lukem slap_mask_t flags, 146 1.1 lukem Syntax *syntax, 147 1.1 lukem MatchingRule *mr, 148 1.1 lukem struct berval *value, 149 1.1 lukem void *assertedValue ) 150 1.1 lukem { 151 1.1 lukem struct berval *a = (struct berval *) assertedValue; 152 1.1 lukem MatchingRule *mrv = mr_bvfind( value ); 153 1.1 lukem MatchingRule *asserted = mr_bvfind( a ); 154 1.1 lukem 155 1.1 lukem if( asserted == NULL ) { 156 1.1 lukem if( OID_LEADCHAR( *a->bv_val ) ) { 157 1.1 lukem /* OID form, return FALSE */ 158 1.1 lukem *matchp = 1; 159 1.1 lukem return LDAP_SUCCESS; 160 1.1 lukem } 161 1.1 lukem 162 1.1 lukem /* desc form, return undefined */ 163 1.1 lukem return LDAP_INVALID_SYNTAX; 164 1.1 lukem } 165 1.1 lukem 166 1.1 lukem if ( mrv == NULL ) { 167 1.1 lukem /* unrecognized stored value */ 168 1.1 lukem return LDAP_INVALID_SYNTAX; 169 1.1 lukem } 170 1.1 lukem 171 1.1 lukem *matchp = ( asserted != mrv ); 172 1.1 lukem return LDAP_SUCCESS; 173 1.1 lukem } 174 1.1 lukem 175 1.1 lukem static int 176 1.1 lukem objectClassMatch( 177 1.1 lukem int *matchp, 178 1.1 lukem slap_mask_t flags, 179 1.1 lukem Syntax *syntax, 180 1.1 lukem MatchingRule *mr, 181 1.1 lukem struct berval *value, 182 1.1 lukem void *assertedValue ) 183 1.1 lukem { 184 1.1 lukem struct berval *a = (struct berval *) assertedValue; 185 1.1 lukem ObjectClass *oc = oc_bvfind( value ); 186 1.1 lukem ObjectClass *asserted = oc_bvfind( a ); 187 1.1 lukem 188 1.1 lukem if( asserted == NULL ) { 189 1.1 lukem if( OID_LEADCHAR( *a->bv_val ) ) { 190 1.1 lukem /* OID form, return FALSE */ 191 1.1 lukem *matchp = 1; 192 1.1 lukem return LDAP_SUCCESS; 193 1.1 lukem } 194 1.1 lukem 195 1.1 lukem /* desc form, return undefined */ 196 1.1 lukem return LDAP_INVALID_SYNTAX; 197 1.1 lukem } 198 1.1 lukem 199 1.1 lukem if ( oc == NULL ) { 200 1.1 lukem /* unrecognized stored value */ 201 1.1 lukem return LDAP_INVALID_SYNTAX; 202 1.1 lukem } 203 1.1 lukem 204 1.1 lukem *matchp = ( asserted != oc ); 205 1.1 lukem return LDAP_SUCCESS; 206 1.1 lukem } 207 1.1 lukem 208 1.1 lukem static int 209 1.1 lukem objectSubClassMatch( 210 1.1 lukem int *matchp, 211 1.1 lukem slap_mask_t flags, 212 1.1 lukem Syntax *syntax, 213 1.1 lukem MatchingRule *mr, 214 1.1 lukem struct berval *value, 215 1.1 lukem void *assertedValue ) 216 1.1 lukem { 217 1.1 lukem struct berval *a = (struct berval *) assertedValue; 218 1.1 lukem ObjectClass *oc = oc_bvfind( value ); 219 1.1 lukem ObjectClass *asserted = oc_bvfind( a ); 220 1.1 lukem 221 1.1 lukem if( asserted == NULL ) { 222 1.1 lukem if( OID_LEADCHAR( *a->bv_val ) ) { 223 1.1 lukem /* OID form, return FALSE */ 224 1.1 lukem *matchp = 1; 225 1.1 lukem return LDAP_SUCCESS; 226 1.1 lukem } 227 1.1 lukem 228 1.1 lukem /* desc form, return undefined */ 229 1.1 lukem return LDAP_INVALID_SYNTAX; 230 1.1 lukem } 231 1.1 lukem 232 1.1 lukem if ( oc == NULL ) { 233 1.1 lukem /* unrecognized stored value */ 234 1.1 lukem return LDAP_INVALID_SYNTAX; 235 1.1 lukem } 236 1.1 lukem 237 1.1 lukem if( SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX( flags ) ) { 238 1.1 lukem *matchp = ( asserted != oc ); 239 1.1 lukem } else { 240 1.1 lukem *matchp = !is_object_subclass( asserted, oc ); 241 1.1 lukem } 242 1.1 lukem 243 1.1 lukem return LDAP_SUCCESS; 244 1.1 lukem } 245 1.1 lukem 246 1.1 lukem static int objectSubClassIndexer( 247 1.1 lukem slap_mask_t use, 248 1.1 lukem slap_mask_t mask, 249 1.1 lukem Syntax *syntax, 250 1.1 lukem MatchingRule *mr, 251 1.1 lukem struct berval *prefix, 252 1.1 lukem BerVarray values, 253 1.1 lukem BerVarray *keysp, 254 1.1 lukem void *ctx ) 255 1.1 lukem { 256 1.1 lukem int rc, noc, i; 257 1.1 lukem BerVarray ocvalues; 258 1.1 lukem ObjectClass **socs; 259 1.1 lukem 260 1.1 lukem for( noc=0; values[noc].bv_val != NULL; noc++ ) { 261 1.1 lukem /* just count em */; 262 1.1 lukem } 263 1.1 lukem 264 1.1 lukem /* over allocate */ 265 1.1 lukem socs = slap_sl_malloc( (noc+16) * sizeof( ObjectClass * ), ctx ); 266 1.1 lukem 267 1.1 lukem /* initialize */ 268 1.1 lukem for( i=0; i<noc; i++ ) { 269 1.1 lukem socs[i] = oc_bvfind( &values[i] ); 270 1.1 lukem } 271 1.1 lukem 272 1.1 lukem /* expand values */ 273 1.1 lukem for( i=0; i<noc; i++ ) { 274 1.1 lukem int j; 275 1.1 lukem ObjectClass *oc = socs[i]; 276 1.1 lukem if( oc == NULL || oc->soc_sups == NULL ) continue; 277 1.1 lukem 278 1.1 lukem for( j=0; oc->soc_sups[j] != NULL; j++ ) { 279 1.1 lukem int found = 0; 280 1.1 lukem ObjectClass *sup = oc->soc_sups[j]; 281 1.1 lukem int k; 282 1.1 lukem 283 1.1 lukem for( k=0; k<noc; k++ ) { 284 1.1 lukem if( sup == socs[k] ) { 285 1.1 lukem found++; 286 1.1 lukem break; 287 1.1 lukem } 288 1.1 lukem } 289 1.1 lukem 290 1.1 lukem if( !found ) { 291 1.1 lukem socs = slap_sl_realloc( socs, 292 1.1 lukem sizeof( ObjectClass * ) * (noc+2), ctx ); 293 1.1 lukem 294 1.1 lukem assert( k == noc ); 295 1.1 lukem socs[noc++] = sup; 296 1.1 lukem } 297 1.1 lukem } 298 1.1 lukem } 299 1.1 lukem 300 1.1 lukem ocvalues = slap_sl_malloc( sizeof( struct berval ) * (noc+1), ctx ); 301 1.1 lukem /* copy values */ 302 1.1 lukem for( i=0; i<noc; i++ ) { 303 1.1 lukem if ( socs[i] ) 304 1.1 lukem ocvalues[i] = socs[i]->soc_cname; 305 1.1 lukem else 306 1.1 lukem ocvalues[i] = values[i]; 307 1.1 lukem } 308 1.1 lukem BER_BVZERO( &ocvalues[i] ); 309 1.1 lukem 310 1.1 lukem rc = octetStringIndexer( use, mask, syntax, mr, 311 1.1 lukem prefix, ocvalues, keysp, ctx ); 312 1.1 lukem 313 1.1 lukem slap_sl_free( ocvalues, ctx ); 314 1.1 lukem slap_sl_free( socs, ctx ); 315 1.1 lukem return rc; 316 1.1 lukem } 317 1.1 lukem 318 1.1 lukem #define objectSubClassFilter octetStringFilter 319 1.1 lukem 320 1.1 lukem static ObjectClassSchemaCheckFN rootDseObjectClass; 321 1.1 lukem static ObjectClassSchemaCheckFN aliasObjectClass; 322 1.1 lukem static ObjectClassSchemaCheckFN referralObjectClass; 323 1.1 lukem static ObjectClassSchemaCheckFN subentryObjectClass; 324 1.1 lukem #ifdef LDAP_DYNAMIC_OBJECTS 325 1.1 lukem static ObjectClassSchemaCheckFN dynamicObjectClass; 326 1.1 lukem #endif 327 1.1 lukem 328 1.1 lukem static struct slap_schema_oc_map { 329 1.1 lukem char *ssom_name; 330 1.1 lukem char *ssom_defn; 331 1.1 lukem ObjectClassSchemaCheckFN *ssom_check; 332 1.1 lukem slap_mask_t ssom_flags; 333 1.1 lukem size_t ssom_offset; 334 1.1 lukem } oc_map[] = { 335 1.1 lukem { "top", "( 2.5.6.0 NAME 'top' " 336 1.1 lukem "DESC 'top of the superclass chain' " 337 1.1 lukem "ABSTRACT MUST objectClass )", 338 1.1 lukem 0, 0, offsetof(struct slap_internal_schema, si_oc_top) }, 339 1.1 lukem { "extensibleObject", "( 1.3.6.1.4.1.1466.101.120.111 " 340 1.1 lukem "NAME 'extensibleObject' " 341 1.1 lukem "DESC 'RFC4512: extensible object' " 342 1.1 lukem "SUP top AUXILIARY )", 343 1.1 lukem 0, SLAP_OC_OPERATIONAL, 344 1.1 lukem offsetof(struct slap_internal_schema, si_oc_extensibleObject) }, 345 1.1 lukem { "alias", "( 2.5.6.1 NAME 'alias' " 346 1.1 lukem "DESC 'RFC4512: an alias' " 347 1.1 lukem "SUP top STRUCTURAL " 348 1.1 lukem "MUST aliasedObjectName )", 349 1.1 lukem aliasObjectClass, SLAP_OC_ALIAS|SLAP_OC_OPERATIONAL, 350 1.1 lukem offsetof(struct slap_internal_schema, si_oc_alias) }, 351 1.1 lukem { "referral", "( 2.16.840.1.113730.3.2.6 NAME 'referral' " 352 1.1 lukem "DESC 'namedref: named subordinate referral' " 353 1.1 lukem "SUP top STRUCTURAL MUST ref )", 354 1.1 lukem referralObjectClass, SLAP_OC_REFERRAL|SLAP_OC_OPERATIONAL, 355 1.1 lukem offsetof(struct slap_internal_schema, si_oc_referral) }, 356 1.1 lukem { "LDAProotDSE", "( 1.3.6.1.4.1.4203.1.4.1 " 357 1.1 lukem "NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) " 358 1.1 lukem "DESC 'OpenLDAP Root DSE object' " 359 1.1 lukem "SUP top STRUCTURAL MAY cn )", 360 1.1 lukem rootDseObjectClass, SLAP_OC_OPERATIONAL, 361 1.1 lukem offsetof(struct slap_internal_schema, si_oc_rootdse) }, 362 1.1 lukem { "subentry", "( 2.5.17.0 NAME 'subentry' " 363 1.1 lukem "DESC 'RFC3672: subentry' " 364 1.1 lukem "SUP top STRUCTURAL " 365 1.1 lukem "MUST ( cn $ subtreeSpecification ) )", 366 1.1 lukem subentryObjectClass, SLAP_OC_SUBENTRY|SLAP_OC_OPERATIONAL, 367 1.1 lukem offsetof(struct slap_internal_schema, si_oc_subentry) }, 368 1.1 lukem { "subschema", "( 2.5.20.1 NAME 'subschema' " 369 1.1 lukem "DESC 'RFC4512: controlling subschema (sub)entry' " 370 1.1 lukem "AUXILIARY " 371 1.1 lukem "MAY ( dITStructureRules $ nameForms $ dITContentRules $ " 372 1.1 lukem "objectClasses $ attributeTypes $ matchingRules $ " 373 1.1 lukem "matchingRuleUse ) )", 374 1.1 lukem subentryObjectClass, SLAP_OC_OPERATIONAL, 375 1.1 lukem offsetof(struct slap_internal_schema, si_oc_subschema) }, 376 1.1 lukem #ifdef LDAP_COLLECTIVE_ATTRIBUTES 377 1.1 lukem { "collectiveAttributeSubentry", "( 2.5.17.2 " 378 1.1 lukem "NAME 'collectiveAttributeSubentry' " 379 1.1 lukem "DESC 'RFC3671: collective attribute subentry' " 380 1.1 lukem "AUXILIARY )", 381 1.1 lukem subentryObjectClass, 382 1.1 lukem SLAP_OC_COLLECTIVEATTRIBUTESUBENTRY|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE, 383 1.1 lukem offsetof( struct slap_internal_schema, 384 1.1 lukem si_oc_collectiveAttributeSubentry) }, 385 1.1 lukem #endif 386 1.1 lukem #ifdef LDAP_DYNAMIC_OBJECTS 387 1.1 lukem { "dynamicObject", "( 1.3.6.1.4.1.1466.101.119.2 " 388 1.1 lukem "NAME 'dynamicObject' " 389 1.1 lukem "DESC 'RFC2589: Dynamic Object' " 390 1.1 lukem "SUP top AUXILIARY )", 391 1.1 lukem dynamicObjectClass, SLAP_OC_DYNAMICOBJECT, 392 1.1 lukem offsetof(struct slap_internal_schema, si_oc_dynamicObject) }, 393 1.1 lukem #endif 394 1.1 lukem { "glue", "( 1.3.6.1.4.1.4203.666.3.4 " 395 1.1 lukem "NAME 'glue' " 396 1.1 lukem "DESC 'Glue Entry' " 397 1.1 lukem "SUP top STRUCTURAL )", 398 1.1 lukem 0, SLAP_OC_GLUE|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE, 399 1.1 lukem offsetof(struct slap_internal_schema, si_oc_glue) }, 400 1.1 lukem { "syncConsumerSubentry", "( 1.3.6.1.4.1.4203.666.3.5 " 401 1.1 lukem "NAME 'syncConsumerSubentry' " 402 1.1 lukem "DESC 'Persistent Info for SyncRepl Consumer' " 403 1.1 lukem "AUXILIARY " 404 1.1 lukem "MAY syncreplCookie )", 405 1.1 lukem 0, SLAP_OC_SYNCCONSUMERSUBENTRY|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE, 406 1.1 lukem offsetof(struct slap_internal_schema, si_oc_syncConsumerSubentry) }, 407 1.1 lukem { "syncProviderSubentry", "( 1.3.6.1.4.1.4203.666.3.6 " 408 1.1 lukem "NAME 'syncProviderSubentry' " 409 1.1 lukem "DESC 'Persistent Info for SyncRepl Producer' " 410 1.1 lukem "AUXILIARY " 411 1.1 lukem "MAY contextCSN )", 412 1.1 lukem 0, SLAP_OC_SYNCPROVIDERSUBENTRY|SLAP_OC_OPERATIONAL|SLAP_OC_HIDE, 413 1.1 lukem offsetof(struct slap_internal_schema, si_oc_syncProviderSubentry) }, 414 1.1 lukem 415 1.1 lukem { NULL, NULL, NULL, 0, 0 } 416 1.1 lukem }; 417 1.1 lukem 418 1.1 lukem static AttributeTypeSchemaCheckFN rootDseAttribute; 419 1.1 lukem static AttributeTypeSchemaCheckFN aliasAttribute; 420 1.1 lukem static AttributeTypeSchemaCheckFN referralAttribute; 421 1.1 lukem static AttributeTypeSchemaCheckFN subentryAttribute; 422 1.1 lukem static AttributeTypeSchemaCheckFN administrativeRoleAttribute; 423 1.1 lukem #ifdef LDAP_DYNAMIC_OBJECTS 424 1.1 lukem static AttributeTypeSchemaCheckFN dynamicAttribute; 425 1.1 lukem #endif 426 1.1 lukem 427 1.1 lukem static struct slap_schema_ad_map { 428 1.1 lukem char *ssam_name; 429 1.1 lukem char *ssam_defn; 430 1.1 lukem AttributeTypeSchemaCheckFN *ssam_check; 431 1.1 lukem slap_mask_t ssam_flags; 432 1.1 lukem slap_syntax_validate_func *ssam_syn_validate; 433 1.1 lukem slap_syntax_transform_func *ssam_syn_pretty; 434 1.1 lukem slap_mr_convert_func *ssam_mr_convert; 435 1.1 lukem slap_mr_normalize_func *ssam_mr_normalize; 436 1.1 lukem slap_mr_match_func *ssam_mr_match; 437 1.1 lukem slap_mr_indexer_func *ssam_mr_indexer; 438 1.1 lukem slap_mr_filter_func *ssam_mr_filter; 439 1.1 lukem size_t ssam_offset; 440 1.1 lukem } ad_map[] = { 441 1.1 lukem { "objectClass", "( 2.5.4.0 NAME 'objectClass' " 442 1.1 lukem "DESC 'RFC4512: object classes of the entity' " 443 1.1 lukem "EQUALITY objectIdentifierMatch " 444 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", 445 1.1 lukem NULL, SLAP_AT_FINAL, 446 1.1 lukem oidValidate, objectClassPretty, 447 1.1 lukem NULL, NULL, objectSubClassMatch, 448 1.1 lukem objectSubClassIndexer, objectSubClassFilter, 449 1.1 lukem offsetof(struct slap_internal_schema, si_ad_objectClass) }, 450 1.1 lukem 451 1.1 lukem /* user entry operational attributes */ 452 1.1 lukem { "structuralObjectClass", "( 2.5.21.9 NAME 'structuralObjectClass' " 453 1.1 lukem "DESC 'RFC4512: structural object class of entry' " 454 1.1 lukem "EQUALITY objectIdentifierMatch " 455 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 " 456 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 457 1.2 christos NULL, 0, 458 1.1 lukem oidValidate, objectClassPretty, 459 1.1 lukem NULL, NULL, objectSubClassMatch, 460 1.1 lukem objectSubClassIndexer, objectSubClassFilter, 461 1.1 lukem offsetof(struct slap_internal_schema, si_ad_structuralObjectClass) }, 462 1.1 lukem { "createTimestamp", "( 2.5.18.1 NAME 'createTimestamp' " 463 1.1 lukem "DESC 'RFC4512: time which object was created' " 464 1.1 lukem "EQUALITY generalizedTimeMatch " 465 1.1 lukem "ORDERING generalizedTimeOrderingMatch " 466 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 " 467 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 468 1.1 lukem NULL, SLAP_AT_MANAGEABLE, 469 1.1 lukem NULL, NULL, 470 1.1 lukem NULL, NULL, NULL, NULL, NULL, 471 1.1 lukem offsetof(struct slap_internal_schema, si_ad_createTimestamp) }, 472 1.1 lukem { "modifyTimestamp", "( 2.5.18.2 NAME 'modifyTimestamp' " 473 1.1 lukem "DESC 'RFC4512: time which object was last modified' " 474 1.1 lukem "EQUALITY generalizedTimeMatch " 475 1.1 lukem "ORDERING generalizedTimeOrderingMatch " 476 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 " 477 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 478 1.1 lukem NULL, SLAP_AT_MANAGEABLE, 479 1.1 lukem NULL, NULL, 480 1.1 lukem NULL, NULL, NULL, NULL, NULL, 481 1.1 lukem offsetof(struct slap_internal_schema, si_ad_modifyTimestamp) }, 482 1.1 lukem { "creatorsName", "( 2.5.18.3 NAME 'creatorsName' " 483 1.1 lukem "DESC 'RFC4512: name of creator' " 484 1.1 lukem "EQUALITY distinguishedNameMatch " 485 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " 486 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 487 1.1 lukem NULL, SLAP_AT_MANAGEABLE, 488 1.1 lukem NULL, NULL, 489 1.1 lukem NULL, NULL, NULL, NULL, NULL, 490 1.1 lukem offsetof(struct slap_internal_schema, si_ad_creatorsName) }, 491 1.1 lukem { "modifiersName", "( 2.5.18.4 NAME 'modifiersName' " 492 1.1 lukem "DESC 'RFC4512: name of last modifier' " 493 1.1 lukem "EQUALITY distinguishedNameMatch " 494 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " 495 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 496 1.1 lukem NULL, SLAP_AT_MANAGEABLE, 497 1.1 lukem NULL, NULL, 498 1.1 lukem NULL, NULL, NULL, NULL, NULL, 499 1.1 lukem offsetof(struct slap_internal_schema, si_ad_modifiersName) }, 500 1.1 lukem { "hasSubordinates", "( 2.5.18.9 NAME 'hasSubordinates' " 501 1.1 lukem "DESC 'X.501: entry has children' " 502 1.1 lukem "EQUALITY booleanMatch " 503 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 " 504 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 505 1.1 lukem NULL, SLAP_AT_DYNAMIC, 506 1.1 lukem NULL, NULL, 507 1.1 lukem NULL, NULL, NULL, NULL, NULL, 508 1.1 lukem offsetof(struct slap_internal_schema, si_ad_hasSubordinates) }, 509 1.1 lukem { "subschemaSubentry", "( 2.5.18.10 NAME 'subschemaSubentry' " 510 1.1 lukem "DESC 'RFC4512: name of controlling subschema entry' " 511 1.1 lukem "EQUALITY distinguishedNameMatch " 512 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE " 513 1.1 lukem "NO-USER-MODIFICATION USAGE directoryOperation )", 514 1.1 lukem NULL, SLAP_AT_DYNAMIC, 515 1.1 lukem NULL, NULL, 516 1.1 lukem NULL, NULL, NULL, NULL, NULL, 517 1.1 lukem offsetof(struct slap_internal_schema, si_ad_subschemaSubentry) }, 518 1.1 lukem #ifdef LDAP_COLLECTIVE_ATTRIBUTES 519 1.1 lukem { "collectiveAttributeSubentries", "( 2.5.18.12 " 520 1.1 lukem "NAME 'collectiveAttributeSubentries' " 521 1.1 lukem "DESC 'RFC3671: collective attribute subentries' " 522 1.1 lukem "EQUALITY distinguishedNameMatch " 523 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " 524 1.1 lukem "NO-USER-MODIFICATION USAGE directoryOperation )", 525 1.1 lukem NULL, SLAP_AT_HIDE, 526 1.1 lukem NULL, NULL, 527 1.1 lukem NULL, NULL, NULL, NULL, NULL, 528 1.1 lukem offsetof(struct slap_internal_schema, si_ad_collectiveSubentries) }, 529 1.1 lukem { "collectiveExclusions", "( 2.5.18.7 NAME 'collectiveExclusions' " 530 1.1 lukem "DESC 'RFC3671: collective attribute exclusions' " 531 1.1 lukem "EQUALITY objectIdentifierMatch " 532 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 " 533 1.1 lukem "USAGE directoryOperation )", 534 1.1 lukem NULL, SLAP_AT_HIDE, 535 1.1 lukem NULL, NULL, 536 1.1 lukem NULL, NULL, NULL, NULL, NULL, 537 1.1 lukem offsetof(struct slap_internal_schema, si_ad_collectiveExclusions) }, 538 1.1 lukem #endif 539 1.1 lukem 540 1.1 lukem { "entryDN", "( 1.3.6.1.1.20 NAME 'entryDN' " 541 1.1 lukem "DESC 'DN of the entry' " 542 1.1 lukem "EQUALITY distinguishedNameMatch " 543 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " 544 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 545 1.1 lukem NULL, SLAP_AT_DYNAMIC, 546 1.1 lukem NULL, NULL, 547 1.1 lukem NULL, NULL, NULL, NULL, NULL, 548 1.1 lukem offsetof(struct slap_internal_schema, si_ad_entryDN) }, 549 1.1 lukem { "entryUUID", "( 1.3.6.1.1.16.4 NAME 'entryUUID' " 550 1.1 lukem "DESC 'UUID of the entry' " 551 1.1 lukem "EQUALITY UUIDMatch " 552 1.1 lukem "ORDERING UUIDOrderingMatch " 553 1.1 lukem "SYNTAX 1.3.6.1.1.16.1 " 554 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 555 1.1 lukem NULL, SLAP_AT_MANAGEABLE, 556 1.1 lukem NULL, NULL, 557 1.1 lukem NULL, NULL, NULL, NULL, NULL, 558 1.1 lukem offsetof(struct slap_internal_schema, si_ad_entryUUID) }, 559 1.1 lukem { "entryCSN", "( 1.3.6.1.4.1.4203.666.1.7 NAME 'entryCSN' " 560 1.1 lukem "DESC 'change sequence number of the entry content' " 561 1.1 lukem "EQUALITY CSNMatch " 562 1.1 lukem "ORDERING CSNOrderingMatch " 563 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.666.11.2.1{64} " 564 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 565 1.3 christos NULL, 0, 566 1.1 lukem NULL, NULL, 567 1.1 lukem NULL, NULL, NULL, NULL, NULL, 568 1.1 lukem offsetof(struct slap_internal_schema, si_ad_entryCSN) }, 569 1.1 lukem { "namingCSN", "( 1.3.6.1.4.1.4203.666.1.13 NAME 'namingCSN' " 570 1.1 lukem "DESC 'change sequence number of the entry naming (RDN)' " 571 1.1 lukem "EQUALITY CSNMatch " 572 1.1 lukem "ORDERING CSNOrderingMatch " 573 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.666.11.2.1{64} " 574 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 575 1.1 lukem NULL, SLAP_AT_HIDE, 576 1.1 lukem NULL, NULL, 577 1.1 lukem NULL, NULL, NULL, NULL, NULL, 578 1.1 lukem offsetof(struct slap_internal_schema, si_ad_namingCSN) }, 579 1.1 lukem 580 1.1 lukem #ifdef LDAP_SUPERIOR_UUID 581 1.1 lukem { "superiorUUID", "( 1.3.6.1.4.1.4203.666.1.11 NAME 'superiorUUID' " 582 1.1 lukem "DESC 'UUID of the superior entry' " 583 1.1 lukem "EQUALITY UUIDMatch " 584 1.1 lukem "ORDERING UUIDOrderingMatch " 585 1.1 lukem "SYNTAX 1.3.6.1.1.16.1 " 586 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", 587 1.1 lukem NULL, SLAP_AT_HIDE, 588 1.1 lukem NULL, NULL, 589 1.1 lukem NULL, NULL, NULL, NULL, NULL, 590 1.1 lukem offsetof(struct slap_internal_schema, si_ad_superiorUUID) }, 591 1.1 lukem #endif 592 1.1 lukem 593 1.1 lukem { "syncreplCookie", "( 1.3.6.1.4.1.4203.666.1.23 " 594 1.1 lukem "NAME 'syncreplCookie' " 595 1.1 lukem "DESC 'syncrepl Cookie for shadow copy' " 596 1.1 lukem "EQUALITY octetStringMatch " 597 1.1 lukem "ORDERING octetStringOrderingMatch " 598 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 " 599 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", 600 1.1 lukem NULL, SLAP_AT_HIDE, 601 1.1 lukem NULL, NULL, 602 1.1 lukem NULL, NULL, NULL, NULL, NULL, 603 1.1 lukem offsetof(struct slap_internal_schema, si_ad_syncreplCookie) }, 604 1.1 lukem 605 1.1 lukem { "contextCSN", "( 1.3.6.1.4.1.4203.666.1.25 " 606 1.1 lukem "NAME 'contextCSN' " 607 1.1 lukem "DESC 'the largest committed CSN of a context' " 608 1.1 lukem "EQUALITY CSNMatch " 609 1.1 lukem "ORDERING CSNOrderingMatch " 610 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.666.11.2.1{64} " 611 1.1 lukem "NO-USER-MODIFICATION USAGE dSAOperation )", 612 1.3 christos NULL, 0, 613 1.1 lukem NULL, NULL, 614 1.1 lukem NULL, NULL, NULL, NULL, NULL, 615 1.1 lukem offsetof(struct slap_internal_schema, si_ad_contextCSN) }, 616 1.1 lukem 617 1.1 lukem #ifdef LDAP_SYNC_TIMESTAMP 618 1.1 lukem { "syncTimestamp", "( 1.3.6.1.4.1.4203.666.1.26 NAME 'syncTimestamp' " 619 1.1 lukem "DESC 'Time which object was replicated' " 620 1.1 lukem "EQUALITY generalizedTimeMatch " 621 1.1 lukem "ORDERING generalizedTimeOrderingMatch " 622 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 " 623 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", 624 1.1 lukem NULL, 0, 625 1.1 lukem NULL, NULL, 626 1.1 lukem NULL, NULL, NULL, NULL, NULL, 627 1.1 lukem offsetof(struct slap_internal_schema, si_ad_syncTimestamp) }, 628 1.1 lukem #endif 629 1.1 lukem 630 1.1 lukem /* root DSE attributes */ 631 1.1 lukem { "altServer", "( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' " 632 1.1 lukem "DESC 'RFC4512: alternative servers' " 633 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation )", 634 1.1 lukem rootDseAttribute, 0, 635 1.1 lukem NULL, NULL, 636 1.1 lukem NULL, NULL, NULL, NULL, NULL, 637 1.1 lukem offsetof(struct slap_internal_schema, si_ad_altServer) }, 638 1.1 lukem { "namingContexts", "( 1.3.6.1.4.1.1466.101.120.5 " 639 1.1 lukem "NAME 'namingContexts' " 640 1.1 lukem "DESC 'RFC4512: naming contexts' " 641 1.3 christos "EQUALITY distinguishedNameMatch " 642 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation )", 643 1.1 lukem rootDseAttribute, 0, 644 1.1 lukem NULL, NULL, 645 1.1 lukem NULL, NULL, NULL, NULL, NULL, 646 1.1 lukem offsetof(struct slap_internal_schema, si_ad_namingContexts) }, 647 1.1 lukem { "supportedControl", "( 1.3.6.1.4.1.1466.101.120.13 " 648 1.1 lukem "NAME 'supportedControl' " 649 1.1 lukem "DESC 'RFC4512: supported controls' " 650 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", 651 1.1 lukem rootDseAttribute, 0, 652 1.1 lukem NULL, NULL, 653 1.1 lukem NULL, NULL, NULL, NULL, NULL, 654 1.1 lukem offsetof(struct slap_internal_schema, si_ad_supportedControl) }, 655 1.1 lukem { "supportedExtension", "( 1.3.6.1.4.1.1466.101.120.7 " 656 1.1 lukem "NAME 'supportedExtension' " 657 1.1 lukem "DESC 'RFC4512: supported extended operations' " 658 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", 659 1.1 lukem rootDseAttribute, 0, 660 1.1 lukem NULL, NULL, 661 1.1 lukem NULL, NULL, NULL, NULL, NULL, 662 1.1 lukem offsetof(struct slap_internal_schema, si_ad_supportedExtension) }, 663 1.1 lukem { "supportedLDAPVersion", "( 1.3.6.1.4.1.1466.101.120.15 " 664 1.1 lukem "NAME 'supportedLDAPVersion' " 665 1.1 lukem "DESC 'RFC4512: supported LDAP versions' " 666 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation )", 667 1.1 lukem rootDseAttribute, 0, 668 1.1 lukem NULL, NULL, 669 1.1 lukem NULL, NULL, NULL, NULL, NULL, 670 1.1 lukem offsetof(struct slap_internal_schema, si_ad_supportedLDAPVersion) }, 671 1.1 lukem { "supportedSASLMechanisms", "( 1.3.6.1.4.1.1466.101.120.14 " 672 1.1 lukem "NAME 'supportedSASLMechanisms' " 673 1.1 lukem "DESC 'RFC4512: supported SASL mechanisms'" 674 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation )", 675 1.1 lukem rootDseAttribute, 0, 676 1.1 lukem NULL, NULL, 677 1.1 lukem NULL, NULL, NULL, NULL, NULL, 678 1.1 lukem offsetof(struct slap_internal_schema, si_ad_supportedSASLMechanisms) }, 679 1.1 lukem { "supportedFeatures", "( 1.3.6.1.4.1.4203.1.3.5 " 680 1.1 lukem "NAME 'supportedFeatures' " 681 1.1 lukem "DESC 'RFC4512: features supported by the server' " 682 1.1 lukem "EQUALITY objectIdentifierMatch " 683 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 " 684 1.1 lukem "USAGE dSAOperation )", 685 1.1 lukem rootDseAttribute, 0, 686 1.1 lukem NULL, NULL, 687 1.1 lukem NULL, NULL, NULL, NULL, NULL, 688 1.1 lukem offsetof(struct slap_internal_schema, si_ad_supportedFeatures) }, 689 1.1 lukem { "monitorContext", "( 1.3.6.1.4.1.4203.666.1.10 " 690 1.1 lukem "NAME 'monitorContext' " 691 1.1 lukem "DESC 'monitor context' " 692 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " 693 1.2 christos "EQUALITY distinguishedNameMatch " 694 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION " 695 1.1 lukem "USAGE dSAOperation )", 696 1.1 lukem rootDseAttribute, SLAP_AT_HIDE, 697 1.1 lukem NULL, NULL, 698 1.1 lukem NULL, NULL, NULL, NULL, NULL, 699 1.1 lukem offsetof(struct slap_internal_schema, si_ad_monitorContext) }, 700 1.2 christos { "configContext", "( 1.3.6.1.4.1.4203.1.12.2.1 " 701 1.1 lukem "NAME 'configContext' " 702 1.1 lukem "DESC 'config context' " 703 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " 704 1.2 christos "EQUALITY distinguishedNameMatch " 705 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION " 706 1.1 lukem "USAGE dSAOperation )", 707 1.1 lukem rootDseAttribute, SLAP_AT_HIDE, 708 1.1 lukem NULL, NULL, 709 1.1 lukem NULL, NULL, NULL, NULL, NULL, 710 1.1 lukem offsetof(struct slap_internal_schema, si_ad_configContext) }, 711 1.1 lukem { "vendorName", "( 1.3.6.1.1.4 NAME 'vendorName' " 712 1.1 lukem "DESC 'RFC3045: name of implementation vendor' " 713 1.1 lukem "EQUALITY caseExactMatch " 714 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 " 715 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION " 716 1.1 lukem "USAGE dSAOperation )", 717 1.1 lukem rootDseAttribute, 0, 718 1.1 lukem NULL, NULL, 719 1.1 lukem NULL, NULL, NULL, NULL, NULL, 720 1.1 lukem offsetof(struct slap_internal_schema, si_ad_vendorName) }, 721 1.1 lukem { "vendorVersion", "( 1.3.6.1.1.5 NAME 'vendorVersion' " 722 1.1 lukem "DESC 'RFC3045: version of implementation' " 723 1.1 lukem "EQUALITY caseExactMatch " 724 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 " 725 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION " 726 1.1 lukem "USAGE dSAOperation )", 727 1.1 lukem rootDseAttribute, 0, 728 1.1 lukem NULL, NULL, 729 1.1 lukem NULL, NULL, NULL, NULL, NULL, 730 1.1 lukem offsetof(struct slap_internal_schema, si_ad_vendorVersion) }, 731 1.1 lukem 732 1.1 lukem /* subentry attributes */ 733 1.1 lukem { "administrativeRole", "( 2.5.18.5 NAME 'administrativeRole' " 734 1.1 lukem "DESC 'RFC3672: administrative role' " 735 1.1 lukem "EQUALITY objectIdentifierMatch " 736 1.1 lukem "USAGE directoryOperation " 737 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", 738 1.1 lukem administrativeRoleAttribute, SLAP_AT_HIDE, 739 1.1 lukem NULL, NULL, 740 1.1 lukem NULL, NULL, NULL, NULL, NULL, 741 1.1 lukem offsetof(struct slap_internal_schema, si_ad_administrativeRole) }, 742 1.1 lukem { "subtreeSpecification", "( 2.5.18.6 NAME 'subtreeSpecification' " 743 1.1 lukem "DESC 'RFC3672: subtree specification' " 744 1.1 lukem "SINGLE-VALUE " 745 1.1 lukem "USAGE directoryOperation " 746 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.45 )", 747 1.1 lukem subentryAttribute, SLAP_AT_HIDE, 748 1.1 lukem NULL, NULL, 749 1.1 lukem NULL, NULL, NULL, NULL, NULL, 750 1.1 lukem offsetof(struct slap_internal_schema, si_ad_subtreeSpecification) }, 751 1.1 lukem 752 1.1 lukem /* subschema subentry attributes */ 753 1.1 lukem { "dITStructureRules", "( 2.5.21.1 NAME 'dITStructureRules' " 754 1.1 lukem "DESC 'RFC4512: DIT structure rules' " 755 1.1 lukem "EQUALITY integerFirstComponentMatch " 756 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.17 " 757 1.1 lukem "USAGE directoryOperation ) ", 758 1.1 lukem subentryAttribute, SLAP_AT_HIDE, 759 1.1 lukem NULL, NULL, 760 1.1 lukem NULL, NULL, NULL, NULL, NULL, 761 1.1 lukem offsetof(struct slap_internal_schema, si_ad_ditStructureRules) }, 762 1.1 lukem { "dITContentRules", "( 2.5.21.2 NAME 'dITContentRules' " 763 1.1 lukem "DESC 'RFC4512: DIT content rules' " 764 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 765 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.16 USAGE directoryOperation )", 766 1.1 lukem subentryAttribute, SLAP_AT_HIDE, 767 1.1 lukem oidValidate, NULL, 768 1.1 lukem NULL, NULL, objectClassMatch, NULL, NULL, 769 1.1 lukem offsetof(struct slap_internal_schema, si_ad_ditContentRules) }, 770 1.1 lukem { "matchingRules", "( 2.5.21.4 NAME 'matchingRules' " 771 1.1 lukem "DESC 'RFC4512: matching rules' " 772 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 773 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.30 USAGE directoryOperation )", 774 1.1 lukem subentryAttribute, 0, 775 1.1 lukem oidValidate, NULL, 776 1.1 lukem NULL, NULL, matchingRuleMatch, NULL, NULL, 777 1.1 lukem offsetof(struct slap_internal_schema, si_ad_matchingRules) }, 778 1.1 lukem { "attributeTypes", "( 2.5.21.5 NAME 'attributeTypes' " 779 1.1 lukem "DESC 'RFC4512: attribute types' " 780 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 781 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", 782 1.1 lukem subentryAttribute, 0, 783 1.1 lukem oidValidate, NULL, 784 1.1 lukem NULL, NULL, attributeTypeMatch, NULL, NULL, 785 1.1 lukem offsetof(struct slap_internal_schema, si_ad_attributeTypes) }, 786 1.1 lukem { "objectClasses", "( 2.5.21.6 NAME 'objectClasses' " 787 1.1 lukem "DESC 'RFC4512: object classes' " 788 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 789 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", 790 1.1 lukem subentryAttribute, 0, 791 1.1 lukem oidValidate, NULL, 792 1.1 lukem NULL, NULL, objectClassMatch, NULL, NULL, 793 1.1 lukem offsetof(struct slap_internal_schema, si_ad_objectClasses) }, 794 1.1 lukem { "nameForms", "( 2.5.21.7 NAME 'nameForms' " 795 1.1 lukem "DESC 'RFC4512: name forms ' " 796 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 797 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.35 USAGE directoryOperation )", 798 1.1 lukem subentryAttribute, SLAP_AT_HIDE, 799 1.1 lukem NULL, NULL, 800 1.1 lukem NULL, NULL, NULL, NULL, NULL, 801 1.1 lukem offsetof(struct slap_internal_schema, si_ad_nameForms) }, 802 1.1 lukem { "matchingRuleUse", "( 2.5.21.8 NAME 'matchingRuleUse' " 803 1.1 lukem "DESC 'RFC4512: matching rule uses' " 804 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 805 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.31 USAGE directoryOperation )", 806 1.1 lukem subentryAttribute, 0, 807 1.1 lukem oidValidate, NULL, 808 1.1 lukem NULL, NULL, matchingRuleMatch, NULL, NULL, 809 1.1 lukem offsetof(struct slap_internal_schema, si_ad_matchingRuleUse) }, 810 1.1 lukem 811 1.1 lukem { "ldapSyntaxes", "( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' " 812 1.1 lukem "DESC 'RFC4512: LDAP syntaxes' " 813 1.1 lukem "EQUALITY objectIdentifierFirstComponentMatch " 814 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.54 USAGE directoryOperation )", 815 1.1 lukem subentryAttribute, 0, 816 1.1 lukem NULL, NULL, 817 1.1 lukem NULL, NULL, NULL, NULL, NULL, 818 1.1 lukem offsetof(struct slap_internal_schema, si_ad_ldapSyntaxes) }, 819 1.1 lukem 820 1.1 lukem /* knowledge information */ 821 1.1 lukem { "aliasedObjectName", "( 2.5.4.1 " 822 1.1 lukem "NAME ( 'aliasedObjectName' 'aliasedEntryName' ) " 823 1.1 lukem "DESC 'RFC4512: name of aliased object' " 824 1.1 lukem "EQUALITY distinguishedNameMatch " 825 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", 826 1.1 lukem aliasAttribute, SLAP_AT_FINAL, 827 1.1 lukem NULL, NULL, 828 1.1 lukem NULL, NULL, NULL, NULL, NULL, 829 1.1 lukem offsetof(struct slap_internal_schema, si_ad_aliasedObjectName) }, 830 1.1 lukem { "ref", "( 2.16.840.1.113730.3.1.34 NAME 'ref' " 831 1.1 lukem "DESC 'RFC3296: subordinate referral URL' " 832 1.1 lukem "EQUALITY caseExactMatch " 833 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 " 834 1.1 lukem "USAGE distributedOperation )", 835 1.1 lukem referralAttribute, 0, 836 1.1 lukem NULL, NULL, 837 1.1 lukem NULL, NULL, NULL, NULL, NULL, 838 1.1 lukem offsetof(struct slap_internal_schema, si_ad_ref) }, 839 1.1 lukem 840 1.1 lukem /* access control internals */ 841 1.1 lukem { "entry", "( 1.3.6.1.4.1.4203.1.3.1 " 842 1.1 lukem "NAME 'entry' " 843 1.1 lukem "DESC 'OpenLDAP ACL entry pseudo-attribute' " 844 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.1.1.1 " 845 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", 846 1.1 lukem NULL, SLAP_AT_HIDE, 847 1.1 lukem NULL, NULL, 848 1.1 lukem NULL, NULL, NULL, NULL, NULL, 849 1.1 lukem offsetof(struct slap_internal_schema, si_ad_entry) }, 850 1.1 lukem { "children", "( 1.3.6.1.4.1.4203.1.3.2 " 851 1.1 lukem "NAME 'children' " 852 1.1 lukem "DESC 'OpenLDAP ACL children pseudo-attribute' " 853 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.1.1.1 " 854 1.1 lukem "SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", 855 1.1 lukem NULL, SLAP_AT_HIDE, 856 1.1 lukem NULL, NULL, 857 1.1 lukem NULL, NULL, NULL, NULL, NULL, 858 1.1 lukem offsetof(struct slap_internal_schema, si_ad_children) }, 859 1.1 lukem 860 1.1 lukem /* access control externals */ 861 1.1 lukem { "authzTo", "( 1.3.6.1.4.1.4203.666.1.8 " 862 1.1 lukem "NAME ( 'authzTo' 'saslAuthzTo' ) " 863 1.1 lukem "DESC 'proxy authorization targets' " 864 1.1 lukem "EQUALITY authzMatch " 865 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.666.2.7 " 866 1.1 lukem "X-ORDERED 'VALUES' " 867 1.1 lukem "USAGE distributedOperation )", 868 1.1 lukem NULL, SLAP_AT_HIDE, 869 1.1 lukem NULL, NULL, 870 1.1 lukem NULL, NULL, NULL, NULL, NULL, 871 1.1 lukem offsetof(struct slap_internal_schema, si_ad_saslAuthzTo) }, 872 1.1 lukem { "authzFrom", "( 1.3.6.1.4.1.4203.666.1.9 " 873 1.1 lukem "NAME ( 'authzFrom' 'saslAuthzFrom' ) " 874 1.1 lukem "DESC 'proxy authorization sources' " 875 1.1 lukem "EQUALITY authzMatch " 876 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.666.2.7 " 877 1.1 lukem "X-ORDERED 'VALUES' " 878 1.1 lukem "USAGE distributedOperation )", 879 1.1 lukem NULL, SLAP_AT_HIDE, 880 1.1 lukem NULL, NULL, 881 1.1 lukem NULL, NULL, NULL, NULL, NULL, 882 1.1 lukem offsetof(struct slap_internal_schema, si_ad_saslAuthzFrom) }, 883 1.1 lukem 884 1.1 lukem #ifdef LDAP_DYNAMIC_OBJECTS 885 1.1 lukem { "entryTtl", "( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTtl' " 886 1.1 lukem "DESC 'RFC2589: entry time-to-live' " 887 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE " 888 1.1 lukem "NO-USER-MODIFICATION USAGE dSAOperation )", 889 1.1 lukem dynamicAttribute, SLAP_AT_MANAGEABLE, 890 1.1 lukem NULL, NULL, 891 1.1 lukem NULL, NULL, NULL, NULL, NULL, 892 1.1 lukem offsetof(struct slap_internal_schema, si_ad_entryTtl) }, 893 1.1 lukem { "dynamicSubtrees", "( 1.3.6.1.4.1.1466.101.119.4 " 894 1.1 lukem "NAME 'dynamicSubtrees' " 895 1.1 lukem "DESC 'RFC2589: dynamic subtrees' " 896 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION " 897 1.1 lukem "USAGE dSAOperation )", 898 1.1 lukem rootDseAttribute, 0, 899 1.1 lukem NULL, NULL, 900 1.1 lukem NULL, NULL, NULL, NULL, NULL, 901 1.1 lukem offsetof(struct slap_internal_schema, si_ad_dynamicSubtrees) }, 902 1.1 lukem #endif 903 1.1 lukem 904 1.1 lukem /* userApplication attributes (which system schema depends upon) */ 905 1.1 lukem { "distinguishedName", "( 2.5.4.49 NAME 'distinguishedName' " 906 1.1 lukem "DESC 'RFC4519: common supertype of DN attributes' " 907 1.1 lukem "EQUALITY distinguishedNameMatch " 908 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", 909 1.1 lukem NULL, SLAP_AT_ABSTRACT, 910 1.1 lukem NULL, NULL, 911 1.1 lukem NULL, NULL, NULL, NULL, NULL, 912 1.1 lukem offsetof(struct slap_internal_schema, si_ad_distinguishedName) }, 913 1.1 lukem { "name", "( 2.5.4.41 NAME 'name' " 914 1.1 lukem "DESC 'RFC4519: common supertype of name attributes' " 915 1.1 lukem "EQUALITY caseIgnoreMatch " 916 1.1 lukem "SUBSTR caseIgnoreSubstringsMatch " 917 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", 918 1.1 lukem NULL, SLAP_AT_ABSTRACT, 919 1.1 lukem NULL, NULL, 920 1.1 lukem NULL, NULL, NULL, NULL, NULL, 921 1.1 lukem offsetof(struct slap_internal_schema, si_ad_name) }, 922 1.1 lukem { "cn", "( 2.5.4.3 NAME ( 'cn' 'commonName' ) " 923 1.1 lukem "DESC 'RFC4519: common name(s) for which the entity is known by' " 924 1.1 lukem "SUP name )", 925 1.1 lukem NULL, 0, 926 1.1 lukem NULL, NULL, 927 1.1 lukem NULL, NULL, NULL, NULL, NULL, 928 1.1 lukem offsetof(struct slap_internal_schema, si_ad_cn) }, 929 1.1 lukem { "uid", "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) " 930 1.1 lukem "DESC 'RFC4519: user identifier' " 931 1.1 lukem "EQUALITY caseIgnoreMatch " 932 1.1 lukem "SUBSTR caseIgnoreSubstringsMatch " 933 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", 934 1.1 lukem NULL, 0, 935 1.1 lukem NULL, NULL, 936 1.1 lukem NULL, NULL, NULL, NULL, NULL, 937 1.1 lukem offsetof(struct slap_internal_schema, si_ad_uid) }, 938 1.1 lukem { "uidNumber", /* for ldapi:// */ 939 1.1 lukem "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' " 940 1.1 lukem "DESC 'RFC2307: An integer uniquely identifying a user " 941 1.1 lukem "in an administrative domain' " 942 1.1 lukem "EQUALITY integerMatch " 943 1.2 christos "ORDERING integerOrderingMatch " 944 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", 945 1.1 lukem NULL, 0, 946 1.1 lukem NULL, NULL, 947 1.1 lukem NULL, NULL, NULL, NULL, NULL, 948 1.1 lukem offsetof(struct slap_internal_schema, si_ad_uidNumber) }, 949 1.1 lukem { "gidNumber", /* for ldapi:// */ 950 1.1 lukem "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' " 951 1.1 lukem "DESC 'RFC2307: An integer uniquely identifying a group " 952 1.1 lukem "in an administrative domain' " 953 1.1 lukem "EQUALITY integerMatch " 954 1.2 christos "ORDERING integerOrderingMatch " 955 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", 956 1.1 lukem NULL, 0, 957 1.1 lukem NULL, NULL, 958 1.1 lukem NULL, NULL, NULL, NULL, NULL, 959 1.1 lukem offsetof(struct slap_internal_schema, si_ad_gidNumber) }, 960 1.1 lukem { "userPassword", "( 2.5.4.35 NAME 'userPassword' " 961 1.1 lukem "DESC 'RFC4519/2307: password of user' " 962 1.1 lukem "EQUALITY octetStringMatch " 963 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )", 964 1.1 lukem NULL, 0, 965 1.1 lukem NULL, NULL, 966 1.1 lukem NULL, NULL, NULL, NULL, NULL, 967 1.1 lukem offsetof(struct slap_internal_schema, si_ad_userPassword) }, 968 1.1 lukem 969 1.1 lukem { "labeledURI", "( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' " 970 1.1 lukem "DESC 'RFC2079: Uniform Resource Identifier with optional label' " 971 1.1 lukem "EQUALITY caseExactMatch " 972 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", 973 1.1 lukem NULL, 0, 974 1.1 lukem NULL, NULL, 975 1.1 lukem NULL, NULL, NULL, NULL, NULL, 976 1.1 lukem offsetof(struct slap_internal_schema, si_ad_labeledURI) }, 977 1.1 lukem 978 1.1 lukem #ifdef SLAPD_AUTHPASSWD 979 1.1 lukem { "authPassword", "( 1.3.6.1.4.1.4203.1.3.4 " 980 1.1 lukem "NAME 'authPassword' " 981 1.1 lukem "DESC 'RFC3112: authentication password attribute' " 982 1.1 lukem "EQUALITY 1.3.6.1.4.1.4203.1.2.2 " 983 1.1 lukem "SYNTAX 1.3.6.1.4.1.4203.1.1.2 )", 984 1.1 lukem NULL, 0, 985 1.1 lukem NULL, NULL, 986 1.1 lukem NULL, NULL, NULL, NULL, NULL, 987 1.1 lukem offsetof(struct slap_internal_schema, si_ad_authPassword) }, 988 1.1 lukem { "supportedAuthPasswordSchemes", "( 1.3.6.1.4.1.4203.1.3.3 " 989 1.1 lukem "NAME 'supportedAuthPasswordSchemes' " 990 1.1 lukem "DESC 'RFC3112: supported authPassword schemes' " 991 1.1 lukem "EQUALITY caseExactIA5Match " 992 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} " 993 1.1 lukem "USAGE dSAOperation )", 994 1.1 lukem subschemaAttribute, 0, 995 1.1 lukem NULL, NULL, 996 1.1 lukem NULL, NULL, NULL, NULL, NULL, 997 1.1 lukem offsetof(struct slap_internal_schema, si_ad_authPasswordSchemes) }, 998 1.1 lukem #endif 999 1.1 lukem 1000 1.1 lukem { "description", "( 2.5.4.13 NAME 'description' " 1001 1.1 lukem "DESC 'RFC4519: descriptive information' " 1002 1.1 lukem "EQUALITY caseIgnoreMatch " 1003 1.1 lukem "SUBSTR caseIgnoreSubstringsMatch " 1004 1.1 lukem "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} )", 1005 1.1 lukem NULL, 0, 1006 1.1 lukem NULL, NULL, 1007 1.1 lukem NULL, NULL, NULL, NULL, NULL, 1008 1.1 lukem offsetof(struct slap_internal_schema, si_ad_description) }, 1009 1.1 lukem 1010 1.1 lukem { "seeAlso", "( 2.5.4.34 NAME 'seeAlso' " 1011 1.1 lukem "DESC 'RFC4519: DN of related object' " 1012 1.1 lukem "SUP distinguishedName )", 1013 1.1 lukem NULL, 0, 1014 1.1 lukem NULL, NULL, 1015 1.1 lukem NULL, NULL, NULL, NULL, NULL, 1016 1.1 lukem offsetof(struct slap_internal_schema, si_ad_seeAlso) }, 1017 1.1 lukem 1018 1.3 christos { "pKCS8PrivateKey", "( 1.3.6.1.4.1.4203.666.1.60 " 1019 1.3 christos "NAME 'pKCS8PrivateKey' " 1020 1.3 christos "DESC 'PKCS#8 PrivateKeyInfo, use ;binary' " 1021 1.3 christos "EQUALITY privateKeyMatch " 1022 1.3 christos "SYNTAX 1.2.840.113549.1.8.1.1 )", 1023 1.3 christos NULL, 0, 1024 1.3 christos NULL, NULL, 1025 1.3 christos NULL, NULL, NULL, NULL, NULL, 1026 1.3 christos offsetof(struct slap_internal_schema, si_ad_pKCS8PrivateKey) }, 1027 1.3 christos 1028 1.3 christos { "pwdLastSuccess", "( 1.3.6.1.4.1.42.2.27.8.1.29 NAME 'pwdLastSuccess' " 1029 1.3 christos "DESC 'The timestamp of the last successful authentication' " 1030 1.3 christos "EQUALITY generalizedTimeMatch " 1031 1.3 christos "ORDERING generalizedTimeOrderingMatch " 1032 1.3 christos "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 " 1033 1.3 christos "SINGLE-VALUE " 1034 1.3 christos "NO-USER-MODIFICATION " 1035 1.3 christos "USAGE directoryOperation )", 1036 1.4 christos NULL, SLAP_AT_MANAGEABLE, 1037 1.3 christos NULL, NULL, 1038 1.3 christos NULL, NULL, NULL, NULL, NULL, 1039 1.3 christos offsetof(struct slap_internal_schema, si_ad_pwdLastSuccess) }, 1040 1.3 christos 1041 1.1 lukem { NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 } 1042 1.1 lukem }; 1043 1.1 lukem 1044 1.1 lukem static AttributeType slap_at_undefined = { 1045 1.1 lukem { "1.1.1", NULL, "Catchall for undefined attribute types", 1, NULL, 1046 1.1 lukem NULL, NULL, NULL, NULL, 1047 1.1 lukem 0, 0, 0, 1, LDAP_SCHEMA_DSA_OPERATION, NULL }, /* LDAPAttributeType */ 1048 1.1 lukem BER_BVC("UNDEFINED"), /* cname */ 1049 1.1 lukem NULL, /* sup */ 1050 1.1 lukem NULL, /* subtypes */ 1051 1.1 lukem NULL, NULL, NULL, NULL, /* matching rules routines */ 1052 1.1 lukem NULL, /* syntax (will be set later to "octetString") */ 1053 1.1 lukem NULL, /* schema check function */ 1054 1.1 lukem NULL, /* oidmacro */ 1055 1.2 christos NULL, /* soidmacro */ 1056 1.1 lukem SLAP_AT_ABSTRACT|SLAP_AT_FINAL, /* mask */ 1057 1.1 lukem { NULL }, /* next */ 1058 1.1 lukem NULL /* attribute description */ 1059 1.1 lukem /* mutex (don't know how to initialize it :) */ 1060 1.1 lukem }; 1061 1.1 lukem 1062 1.1 lukem static AttributeType slap_at_proxied = { 1063 1.1 lukem { "1.1.1", NULL, "Catchall for undefined proxied attribute types", 1, NULL, 1064 1.1 lukem NULL, NULL, NULL, NULL, 1065 1.1 lukem 0, 0, 0, 0, LDAP_SCHEMA_USER_APPLICATIONS, NULL }, /* LDAPAttributeType */ 1066 1.1 lukem BER_BVC("PROXIED"), /* cname */ 1067 1.1 lukem NULL, /* sup */ 1068 1.1 lukem NULL, /* subtypes */ 1069 1.1 lukem NULL, NULL, NULL, NULL, /* matching rules routines (will be set later) */ 1070 1.1 lukem NULL, /* syntax (will be set later to "octetString") */ 1071 1.1 lukem NULL, /* schema check function */ 1072 1.1 lukem NULL, /* oidmacro */ 1073 1.2 christos NULL, /* soidmacro */ 1074 1.1 lukem SLAP_AT_ABSTRACT|SLAP_AT_FINAL, /* mask */ 1075 1.1 lukem { NULL }, /* next */ 1076 1.1 lukem NULL /* attribute description */ 1077 1.1 lukem /* mutex (don't know how to initialize it :) */ 1078 1.1 lukem }; 1079 1.1 lukem 1080 1.1 lukem static struct slap_schema_mr_map { 1081 1.1 lukem char *ssmm_name; 1082 1.1 lukem size_t ssmm_offset; 1083 1.1 lukem } mr_map[] = { 1084 1.1 lukem { "caseExactIA5Match", 1085 1.1 lukem offsetof(struct slap_internal_schema, si_mr_caseExactIA5Match) }, 1086 1.1 lukem { "caseExactMatch", 1087 1.1 lukem offsetof(struct slap_internal_schema, si_mr_caseExactMatch) }, 1088 1.1 lukem { "caseExactSubstringsMatch", 1089 1.1 lukem offsetof(struct slap_internal_schema, si_mr_caseExactSubstringsMatch) }, 1090 1.1 lukem { "distinguishedNameMatch", 1091 1.1 lukem offsetof(struct slap_internal_schema, si_mr_distinguishedNameMatch) }, 1092 1.1 lukem { "dnSubtreeMatch", 1093 1.1 lukem offsetof(struct slap_internal_schema, si_mr_dnSubtreeMatch) }, 1094 1.1 lukem { "dnOneLevelMatch", 1095 1.1 lukem offsetof(struct slap_internal_schema, si_mr_dnOneLevelMatch) }, 1096 1.1 lukem { "dnSubordinateMatch", 1097 1.1 lukem offsetof(struct slap_internal_schema, si_mr_dnSubordinateMatch) }, 1098 1.1 lukem { "dnSuperiorMatch", 1099 1.1 lukem offsetof(struct slap_internal_schema, si_mr_dnSuperiorMatch) }, 1100 1.1 lukem { "integerMatch", 1101 1.1 lukem offsetof(struct slap_internal_schema, si_mr_integerMatch) }, 1102 1.1 lukem { "integerFirstComponentMatch", 1103 1.1 lukem offsetof(struct slap_internal_schema, 1104 1.1 lukem si_mr_integerFirstComponentMatch) }, 1105 1.1 lukem { "objectIdentifierFirstComponentMatch", 1106 1.1 lukem offsetof(struct slap_internal_schema, 1107 1.1 lukem si_mr_objectIdentifierFirstComponentMatch) }, 1108 1.2 christos { "caseIgnoreMatch", 1109 1.2 christos offsetof(struct slap_internal_schema, si_mr_caseIgnoreMatch) }, 1110 1.2 christos { "caseIgnoreListMatch", 1111 1.2 christos offsetof(struct slap_internal_schema, si_mr_caseIgnoreListMatch) }, 1112 1.1 lukem { NULL, 0 } 1113 1.1 lukem }; 1114 1.1 lukem 1115 1.1 lukem static struct slap_schema_syn_map { 1116 1.1 lukem char *sssm_name; 1117 1.1 lukem size_t sssm_offset; 1118 1.1 lukem } syn_map[] = { 1119 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.15", 1120 1.1 lukem offsetof(struct slap_internal_schema, si_syn_directoryString) }, 1121 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.12", 1122 1.1 lukem offsetof(struct slap_internal_schema, si_syn_distinguishedName) }, 1123 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.27", 1124 1.1 lukem offsetof(struct slap_internal_schema, si_syn_integer) }, 1125 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.40", 1126 1.1 lukem offsetof(struct slap_internal_schema, si_syn_octetString) }, 1127 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.3", 1128 1.1 lukem offsetof(struct slap_internal_schema, si_syn_attributeTypeDesc) }, 1129 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.16", 1130 1.1 lukem offsetof(struct slap_internal_schema, si_syn_ditContentRuleDesc) }, 1131 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.54", 1132 1.1 lukem offsetof(struct slap_internal_schema, si_syn_ldapSyntaxDesc) }, 1133 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.30", 1134 1.1 lukem offsetof(struct slap_internal_schema, si_syn_matchingRuleDesc) }, 1135 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.31", 1136 1.1 lukem offsetof(struct slap_internal_schema, si_syn_matchingRuleUseDesc) }, 1137 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.35", 1138 1.1 lukem offsetof(struct slap_internal_schema, si_syn_nameFormDesc) }, 1139 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.37", 1140 1.1 lukem offsetof(struct slap_internal_schema, si_syn_objectClassDesc) }, 1141 1.1 lukem { "1.3.6.1.4.1.1466.115.121.1.17", 1142 1.1 lukem offsetof(struct slap_internal_schema, si_syn_ditStructureRuleDesc) }, 1143 1.1 lukem { NULL, 0 } 1144 1.1 lukem }; 1145 1.1 lukem 1146 1.1 lukem int 1147 1.1 lukem slap_schema_load( void ) 1148 1.1 lukem { 1149 1.1 lukem int i; 1150 1.1 lukem 1151 1.1 lukem for( i=0; syn_map[i].sssm_name; i++ ) { 1152 1.1 lukem Syntax ** synp = (Syntax **) 1153 1.1 lukem &(((char *) &slap_schema)[syn_map[i].sssm_offset]); 1154 1.1 lukem 1155 1.1 lukem assert( *synp == NULL ); 1156 1.1 lukem 1157 1.1 lukem *synp = syn_find( syn_map[i].sssm_name ); 1158 1.1 lukem 1159 1.1 lukem if( *synp == NULL ) { 1160 1.1 lukem fprintf( stderr, "slap_schema_load: Syntax: " 1161 1.1 lukem "No syntax \"%s\" defined in schema\n", 1162 1.1 lukem syn_map[i].sssm_name ); 1163 1.1 lukem return LDAP_INVALID_SYNTAX; 1164 1.1 lukem } 1165 1.1 lukem } 1166 1.1 lukem 1167 1.1 lukem for( i=0; mr_map[i].ssmm_name; i++ ) { 1168 1.1 lukem MatchingRule ** mrp = (MatchingRule **) 1169 1.1 lukem &(((char *) &slap_schema)[mr_map[i].ssmm_offset]); 1170 1.1 lukem 1171 1.1 lukem assert( *mrp == NULL ); 1172 1.1 lukem 1173 1.1 lukem *mrp = mr_find( mr_map[i].ssmm_name ); 1174 1.1 lukem 1175 1.1 lukem if( *mrp == NULL ) { 1176 1.1 lukem fprintf( stderr, "slap_schema_load: MatchingRule: " 1177 1.1 lukem "No matching rule \"%s\" defined in schema\n", 1178 1.1 lukem mr_map[i].ssmm_name ); 1179 1.1 lukem return LDAP_INAPPROPRIATE_MATCHING; 1180 1.1 lukem } 1181 1.1 lukem } 1182 1.1 lukem 1183 1.1 lukem slap_at_undefined.sat_syntax = slap_schema.si_syn_octetString; 1184 1.1 lukem slap_schema.si_at_undefined = &slap_at_undefined; 1185 1.1 lukem 1186 1.1 lukem slap_at_proxied.sat_equality = mr_find( "octetStringMatch" ); 1187 1.1 lukem slap_at_proxied.sat_approx = mr_find( "octetStringMatch" ); 1188 1.1 lukem slap_at_proxied.sat_ordering = mr_find( "octetStringOrderingMatch" ); 1189 1.1 lukem slap_at_proxied.sat_substr = mr_find( "octetStringSubstringsMatch" ); 1190 1.1 lukem slap_at_proxied.sat_syntax = slap_schema.si_syn_octetString; 1191 1.1 lukem slap_schema.si_at_proxied = &slap_at_proxied; 1192 1.1 lukem 1193 1.2 christos ldap_pvt_thread_mutex_init( &ad_index_mutex ); 1194 1.1 lukem ldap_pvt_thread_mutex_init( &ad_undef_mutex ); 1195 1.1 lukem ldap_pvt_thread_mutex_init( &oc_undef_mutex ); 1196 1.1 lukem 1197 1.1 lukem for( i=0; ad_map[i].ssam_name; i++ ) { 1198 1.1 lukem assert( ad_map[i].ssam_defn != NULL ); 1199 1.1 lukem { 1200 1.1 lukem LDAPAttributeType *at; 1201 1.1 lukem int code; 1202 1.1 lukem const char *err; 1203 1.1 lukem 1204 1.1 lukem at = ldap_str2attributetype( ad_map[i].ssam_defn, 1205 1.1 lukem &code, &err, LDAP_SCHEMA_ALLOW_ALL ); 1206 1.1 lukem if ( !at ) { 1207 1.1 lukem fprintf( stderr, 1208 1.1 lukem "slap_schema_load: AttributeType \"%s\": %s before %s\n", 1209 1.1 lukem ad_map[i].ssam_name, ldap_scherr2str(code), err ); 1210 1.1 lukem return code; 1211 1.1 lukem } 1212 1.1 lukem 1213 1.1 lukem if ( at->at_oid == NULL ) { 1214 1.1 lukem fprintf( stderr, "slap_schema_load: " 1215 1.1 lukem "AttributeType \"%s\": no OID\n", 1216 1.1 lukem ad_map[i].ssam_name ); 1217 1.1 lukem ldap_attributetype_free( at ); 1218 1.1 lukem return LDAP_OTHER; 1219 1.1 lukem } 1220 1.1 lukem 1221 1.1 lukem code = at_add( at, 0, NULL, NULL, &err ); 1222 1.1 lukem if ( code ) { 1223 1.1 lukem ldap_attributetype_free( at ); 1224 1.1 lukem fprintf( stderr, "slap_schema_load: AttributeType " 1225 1.1 lukem "\"%s\": %s: \"%s\"\n", 1226 1.1 lukem ad_map[i].ssam_name, scherr2str(code), err ); 1227 1.1 lukem return code; 1228 1.1 lukem } 1229 1.1 lukem ldap_memfree( at ); 1230 1.1 lukem } 1231 1.1 lukem { 1232 1.1 lukem int rc; 1233 1.1 lukem const char *text; 1234 1.1 lukem Syntax *syntax = NULL; 1235 1.1 lukem 1236 1.1 lukem AttributeDescription ** adp = (AttributeDescription **) 1237 1.1 lukem &(((char *) &slap_schema)[ad_map[i].ssam_offset]); 1238 1.1 lukem 1239 1.1 lukem assert( *adp == NULL ); 1240 1.1 lukem 1241 1.1 lukem rc = slap_str2ad( ad_map[i].ssam_name, adp, &text ); 1242 1.1 lukem if( rc != LDAP_SUCCESS ) { 1243 1.1 lukem fprintf( stderr, "slap_schema_load: AttributeType \"%s\": " 1244 1.1 lukem "not defined in schema\n", 1245 1.1 lukem ad_map[i].ssam_name ); 1246 1.1 lukem return rc; 1247 1.1 lukem } 1248 1.1 lukem 1249 1.1 lukem if( ad_map[i].ssam_check ) { 1250 1.1 lukem /* install check routine */ 1251 1.1 lukem (*adp)->ad_type->sat_check = ad_map[i].ssam_check; 1252 1.1 lukem } 1253 1.1 lukem /* install flags */ 1254 1.1 lukem (*adp)->ad_type->sat_flags |= ad_map[i].ssam_flags; 1255 1.1 lukem 1256 1.1 lukem /* install custom syntax routines */ 1257 1.1 lukem if( ad_map[i].ssam_syn_validate || 1258 1.1 lukem ad_map[i].ssam_syn_pretty ) 1259 1.1 lukem { 1260 1.1 lukem Syntax *syn; 1261 1.1 lukem 1262 1.1 lukem syntax = (*adp)->ad_type->sat_syntax; 1263 1.1 lukem 1264 1.1 lukem syn = ch_malloc( sizeof( Syntax ) ); 1265 1.1 lukem *syn = *syntax; 1266 1.1 lukem 1267 1.1 lukem if( ad_map[i].ssam_syn_validate ) { 1268 1.1 lukem syn->ssyn_validate = ad_map[i].ssam_syn_validate; 1269 1.1 lukem } 1270 1.1 lukem if( ad_map[i].ssam_syn_pretty ) { 1271 1.1 lukem syn->ssyn_pretty = ad_map[i].ssam_syn_pretty; 1272 1.1 lukem } 1273 1.1 lukem 1274 1.1 lukem (*adp)->ad_type->sat_syntax = syn; 1275 1.1 lukem } 1276 1.1 lukem 1277 1.1 lukem /* install custom rule routines */ 1278 1.1 lukem if( syntax != NULL || 1279 1.1 lukem ad_map[i].ssam_mr_convert || 1280 1.1 lukem ad_map[i].ssam_mr_normalize || 1281 1.1 lukem ad_map[i].ssam_mr_match || 1282 1.1 lukem ad_map[i].ssam_mr_indexer || 1283 1.1 lukem ad_map[i].ssam_mr_filter ) 1284 1.1 lukem { 1285 1.1 lukem MatchingRule *mr = ch_malloc( sizeof( MatchingRule ) ); 1286 1.1 lukem *mr = *(*adp)->ad_type->sat_equality; 1287 1.1 lukem 1288 1.1 lukem if ( syntax != NULL ) { 1289 1.1 lukem mr->smr_syntax = (*adp)->ad_type->sat_syntax; 1290 1.1 lukem } 1291 1.1 lukem if ( ad_map[i].ssam_mr_convert ) { 1292 1.1 lukem mr->smr_convert = ad_map[i].ssam_mr_convert; 1293 1.1 lukem } 1294 1.1 lukem if ( ad_map[i].ssam_mr_normalize ) { 1295 1.1 lukem mr->smr_normalize = ad_map[i].ssam_mr_normalize; 1296 1.1 lukem } 1297 1.1 lukem if ( ad_map[i].ssam_mr_match ) { 1298 1.1 lukem mr->smr_match = ad_map[i].ssam_mr_match; 1299 1.1 lukem } 1300 1.1 lukem if ( ad_map[i].ssam_mr_indexer ) { 1301 1.1 lukem mr->smr_indexer = ad_map[i].ssam_mr_indexer; 1302 1.1 lukem } 1303 1.1 lukem if ( ad_map[i].ssam_mr_filter ) { 1304 1.1 lukem mr->smr_filter = ad_map[i].ssam_mr_filter; 1305 1.1 lukem } 1306 1.1 lukem 1307 1.1 lukem (*adp)->ad_type->sat_equality = mr; 1308 1.1 lukem } 1309 1.1 lukem } 1310 1.1 lukem } 1311 1.1 lukem 1312 1.1 lukem for( i=0; oc_map[i].ssom_name; i++ ) { 1313 1.1 lukem assert( oc_map[i].ssom_defn != NULL ); 1314 1.1 lukem { 1315 1.1 lukem LDAPObjectClass *oc; 1316 1.1 lukem int code; 1317 1.1 lukem const char *err; 1318 1.1 lukem 1319 1.1 lukem oc = ldap_str2objectclass( oc_map[i].ssom_defn, &code, &err, 1320 1.1 lukem LDAP_SCHEMA_ALLOW_ALL ); 1321 1.1 lukem if ( !oc ) { 1322 1.1 lukem fprintf( stderr, "slap_schema_load: ObjectClass " 1323 1.1 lukem "\"%s\": %s before %s\n", 1324 1.1 lukem oc_map[i].ssom_name, ldap_scherr2str(code), err ); 1325 1.1 lukem return code; 1326 1.1 lukem } 1327 1.1 lukem 1328 1.1 lukem if ( oc->oc_oid == NULL ) { 1329 1.1 lukem fprintf( stderr, "slap_schema_load: ObjectClass " 1330 1.1 lukem "\"%s\": no OID\n", 1331 1.1 lukem oc_map[i].ssom_name ); 1332 1.1 lukem ldap_objectclass_free( oc ); 1333 1.1 lukem return LDAP_OTHER; 1334 1.1 lukem } 1335 1.1 lukem 1336 1.1 lukem code = oc_add(oc,0,NULL,NULL,&err); 1337 1.1 lukem if ( code ) { 1338 1.1 lukem ldap_objectclass_free( oc ); 1339 1.1 lukem fprintf( stderr, "slap_schema_load: ObjectClass " 1340 1.1 lukem "\"%s\": %s: \"%s\"\n", 1341 1.1 lukem oc_map[i].ssom_name, scherr2str(code), err); 1342 1.1 lukem return code; 1343 1.1 lukem } 1344 1.1 lukem ldap_memfree(oc); 1345 1.1 lukem 1346 1.1 lukem } 1347 1.1 lukem { 1348 1.1 lukem ObjectClass ** ocp = (ObjectClass **) 1349 1.1 lukem &(((char *) &slap_schema)[oc_map[i].ssom_offset]); 1350 1.1 lukem 1351 1.1 lukem assert( *ocp == NULL ); 1352 1.1 lukem 1353 1.1 lukem *ocp = oc_find( oc_map[i].ssom_name ); 1354 1.1 lukem if( *ocp == NULL ) { 1355 1.1 lukem fprintf( stderr, "slap_schema_load: " 1356 1.1 lukem "ObjectClass \"%s\": not defined in schema\n", 1357 1.1 lukem oc_map[i].ssom_name ); 1358 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1359 1.1 lukem } 1360 1.1 lukem 1361 1.1 lukem if( oc_map[i].ssom_check ) { 1362 1.1 lukem /* install check routine */ 1363 1.1 lukem (*ocp)->soc_check = oc_map[i].ssom_check; 1364 1.1 lukem } 1365 1.1 lukem /* install flags */ 1366 1.1 lukem (*ocp)->soc_flags |= oc_map[i].ssom_flags; 1367 1.1 lukem } 1368 1.1 lukem } 1369 1.1 lukem 1370 1.1 lukem return LDAP_SUCCESS; 1371 1.1 lukem } 1372 1.1 lukem 1373 1.1 lukem int 1374 1.1 lukem slap_schema_check( void ) 1375 1.1 lukem { 1376 1.1 lukem /* we should only be called once after schema_init() was called */ 1377 1.1 lukem assert( schema_init_done == 1 ); 1378 1.1 lukem 1379 1.1 lukem /* 1380 1.1 lukem * cycle thru attributeTypes to build matchingRuleUse 1381 1.1 lukem */ 1382 1.1 lukem if ( matching_rule_use_init() ) { 1383 1.1 lukem return LDAP_OTHER; 1384 1.1 lukem } 1385 1.1 lukem 1386 1.1 lukem ++schema_init_done; 1387 1.1 lukem return LDAP_SUCCESS; 1388 1.1 lukem } 1389 1.1 lukem 1390 1.1 lukem static int rootDseObjectClass ( 1391 1.1 lukem Backend *be, 1392 1.1 lukem Entry *e, 1393 1.1 lukem ObjectClass *oc, 1394 1.1 lukem const char** text, 1395 1.1 lukem char *textbuf, size_t textlen ) 1396 1.1 lukem { 1397 1.1 lukem *text = textbuf; 1398 1.1 lukem 1399 1.1 lukem if( e->e_nname.bv_len ) { 1400 1.1 lukem snprintf( textbuf, textlen, 1401 1.1 lukem "objectClass \"%s\" only allowed in the root DSE", 1402 1.1 lukem oc->soc_oid ); 1403 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1404 1.1 lukem } 1405 1.1 lukem 1406 1.1 lukem /* we should not be called for the root DSE */ 1407 1.1 lukem assert( 0 ); 1408 1.1 lukem return LDAP_SUCCESS; 1409 1.1 lukem } 1410 1.1 lukem 1411 1.1 lukem static int aliasObjectClass ( 1412 1.1 lukem Backend *be, 1413 1.1 lukem Entry *e, 1414 1.1 lukem ObjectClass *oc, 1415 1.1 lukem const char** text, 1416 1.1 lukem char *textbuf, size_t textlen ) 1417 1.1 lukem { 1418 1.1 lukem *text = textbuf; 1419 1.1 lukem 1420 1.1 lukem if( !SLAP_ALIASES(be) ) { 1421 1.1 lukem snprintf( textbuf, textlen, 1422 1.1 lukem "objectClass \"%s\" not supported in context", 1423 1.1 lukem oc->soc_oid ); 1424 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1425 1.1 lukem } 1426 1.1 lukem 1427 1.1 lukem return LDAP_SUCCESS; 1428 1.1 lukem } 1429 1.1 lukem 1430 1.1 lukem static int referralObjectClass ( 1431 1.1 lukem Backend *be, 1432 1.1 lukem Entry *e, 1433 1.1 lukem ObjectClass *oc, 1434 1.1 lukem const char** text, 1435 1.1 lukem char *textbuf, size_t textlen ) 1436 1.1 lukem { 1437 1.1 lukem *text = textbuf; 1438 1.1 lukem 1439 1.1 lukem if( !SLAP_REFERRALS(be) ) { 1440 1.1 lukem snprintf( textbuf, textlen, 1441 1.1 lukem "objectClass \"%s\" not supported in context", 1442 1.1 lukem oc->soc_oid ); 1443 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1444 1.1 lukem } 1445 1.1 lukem 1446 1.1 lukem return LDAP_SUCCESS; 1447 1.1 lukem } 1448 1.1 lukem 1449 1.1 lukem static int subentryObjectClass ( 1450 1.1 lukem Backend *be, 1451 1.1 lukem Entry *e, 1452 1.1 lukem ObjectClass *oc, 1453 1.1 lukem const char** text, 1454 1.1 lukem char *textbuf, size_t textlen ) 1455 1.1 lukem { 1456 1.1 lukem *text = textbuf; 1457 1.1 lukem 1458 1.1 lukem if( !SLAP_SUBENTRIES(be) ) { 1459 1.1 lukem snprintf( textbuf, textlen, 1460 1.1 lukem "objectClass \"%s\" not supported in context", 1461 1.1 lukem oc->soc_oid ); 1462 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1463 1.1 lukem } 1464 1.1 lukem 1465 1.1 lukem if( oc != slap_schema.si_oc_subentry && !is_entry_subentry( e ) ) { 1466 1.1 lukem snprintf( textbuf, textlen, 1467 1.1 lukem "objectClass \"%s\" only allowed in subentries", 1468 1.1 lukem oc->soc_oid ); 1469 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1470 1.1 lukem } 1471 1.1 lukem 1472 1.1 lukem return LDAP_SUCCESS; 1473 1.1 lukem } 1474 1.1 lukem 1475 1.1 lukem #ifdef LDAP_DYNAMIC_OBJECTS 1476 1.1 lukem static int dynamicObjectClass ( 1477 1.1 lukem Backend *be, 1478 1.1 lukem Entry *e, 1479 1.1 lukem ObjectClass *oc, 1480 1.1 lukem const char** text, 1481 1.1 lukem char *textbuf, size_t textlen ) 1482 1.1 lukem { 1483 1.1 lukem *text = textbuf; 1484 1.1 lukem 1485 1.1 lukem if( !SLAP_DYNAMIC(be) ) { 1486 1.1 lukem snprintf( textbuf, textlen, 1487 1.1 lukem "objectClass \"%s\" not supported in context", 1488 1.1 lukem oc->soc_oid ); 1489 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1490 1.1 lukem } 1491 1.1 lukem 1492 1.1 lukem return LDAP_SUCCESS; 1493 1.1 lukem } 1494 1.1 lukem #endif /* LDAP_DYNAMIC_OBJECTS */ 1495 1.1 lukem 1496 1.1 lukem static int rootDseAttribute ( 1497 1.1 lukem Backend *be, 1498 1.1 lukem Entry *e, 1499 1.1 lukem Attribute *attr, 1500 1.1 lukem const char** text, 1501 1.1 lukem char *textbuf, size_t textlen ) 1502 1.1 lukem { 1503 1.1 lukem *text = textbuf; 1504 1.1 lukem 1505 1.1 lukem if( e->e_nname.bv_len ) { 1506 1.1 lukem snprintf( textbuf, textlen, 1507 1.1 lukem "attribute \"%s\" only allowed in the root DSE", 1508 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1509 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1510 1.1 lukem } 1511 1.1 lukem 1512 1.1 lukem /* we should not be called for the root DSE */ 1513 1.1 lukem assert( 0 ); 1514 1.1 lukem return LDAP_SUCCESS; 1515 1.1 lukem } 1516 1.1 lukem 1517 1.1 lukem static int aliasAttribute ( 1518 1.1 lukem Backend *be, 1519 1.1 lukem Entry *e, 1520 1.1 lukem Attribute *attr, 1521 1.1 lukem const char** text, 1522 1.1 lukem char *textbuf, size_t textlen ) 1523 1.1 lukem { 1524 1.1 lukem *text = textbuf; 1525 1.1 lukem 1526 1.1 lukem if( !SLAP_ALIASES(be) ) { 1527 1.1 lukem snprintf( textbuf, textlen, 1528 1.1 lukem "attribute \"%s\" not supported in context", 1529 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1530 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1531 1.1 lukem } 1532 1.1 lukem 1533 1.1 lukem if( !is_entry_alias( e ) ) { 1534 1.1 lukem snprintf( textbuf, textlen, 1535 1.1 lukem "attribute \"%s\" only allowed in the alias", 1536 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1537 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1538 1.1 lukem } 1539 1.1 lukem 1540 1.1 lukem return LDAP_SUCCESS; 1541 1.1 lukem } 1542 1.1 lukem 1543 1.1 lukem static int referralAttribute ( 1544 1.1 lukem Backend *be, 1545 1.1 lukem Entry *e, 1546 1.1 lukem Attribute *attr, 1547 1.1 lukem const char** text, 1548 1.1 lukem char *textbuf, size_t textlen ) 1549 1.1 lukem { 1550 1.1 lukem *text = textbuf; 1551 1.1 lukem 1552 1.1 lukem if( !SLAP_REFERRALS(be) ) { 1553 1.1 lukem snprintf( textbuf, textlen, 1554 1.1 lukem "attribute \"%s\" not supported in context", 1555 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1556 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1557 1.1 lukem } 1558 1.1 lukem 1559 1.1 lukem if( !is_entry_referral( e ) ) { 1560 1.1 lukem snprintf( textbuf, textlen, 1561 1.1 lukem "attribute \"%s\" only allowed in the referral", 1562 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1563 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1564 1.1 lukem } 1565 1.1 lukem 1566 1.1 lukem return LDAP_SUCCESS; 1567 1.1 lukem } 1568 1.1 lukem 1569 1.1 lukem static int subentryAttribute ( 1570 1.1 lukem Backend *be, 1571 1.1 lukem Entry *e, 1572 1.1 lukem Attribute *attr, 1573 1.1 lukem const char** text, 1574 1.1 lukem char *textbuf, size_t textlen ) 1575 1.1 lukem { 1576 1.1 lukem *text = textbuf; 1577 1.1 lukem 1578 1.1 lukem if( !SLAP_SUBENTRIES(be) ) { 1579 1.1 lukem snprintf( textbuf, textlen, 1580 1.1 lukem "attribute \"%s\" not supported in context", 1581 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1582 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1583 1.1 lukem } 1584 1.1 lukem 1585 1.1 lukem if( !is_entry_subentry( e ) ) { 1586 1.1 lukem snprintf( textbuf, textlen, 1587 1.1 lukem "attribute \"%s\" only allowed in the subentry", 1588 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1589 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1590 1.1 lukem } 1591 1.1 lukem 1592 1.1 lukem return LDAP_SUCCESS; 1593 1.1 lukem } 1594 1.1 lukem 1595 1.1 lukem static int administrativeRoleAttribute ( 1596 1.1 lukem Backend *be, 1597 1.1 lukem Entry *e, 1598 1.1 lukem Attribute *attr, 1599 1.1 lukem const char** text, 1600 1.1 lukem char *textbuf, size_t textlen ) 1601 1.1 lukem { 1602 1.1 lukem *text = textbuf; 1603 1.1 lukem 1604 1.1 lukem if( !SLAP_SUBENTRIES(be) ) { 1605 1.1 lukem snprintf( textbuf, textlen, 1606 1.1 lukem "attribute \"%s\" not supported in context", 1607 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1608 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1609 1.1 lukem } 1610 1.1 lukem 1611 1.1 lukem snprintf( textbuf, textlen, 1612 1.1 lukem "attribute \"%s\" not supported!", 1613 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1614 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1615 1.1 lukem } 1616 1.1 lukem 1617 1.1 lukem #ifdef LDAP_DYNAMIC_OBJECTS 1618 1.1 lukem static int dynamicAttribute ( 1619 1.1 lukem Backend *be, 1620 1.1 lukem Entry *e, 1621 1.1 lukem Attribute *attr, 1622 1.1 lukem const char** text, 1623 1.1 lukem char *textbuf, size_t textlen ) 1624 1.1 lukem { 1625 1.1 lukem *text = textbuf; 1626 1.1 lukem 1627 1.1 lukem if( !SLAP_DYNAMIC(be) ) { 1628 1.1 lukem snprintf( textbuf, textlen, 1629 1.1 lukem "attribute \"%s\" not supported in context", 1630 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1631 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1632 1.1 lukem } 1633 1.1 lukem 1634 1.1 lukem if( !is_entry_dynamicObject( e ) ) { 1635 1.1 lukem snprintf( textbuf, textlen, 1636 1.1 lukem "attribute \"%s\" only allowed in dynamic object", 1637 1.1 lukem attr->a_desc->ad_cname.bv_val ); 1638 1.1 lukem return LDAP_OBJECT_CLASS_VIOLATION; 1639 1.1 lukem } 1640 1.1 lukem 1641 1.1 lukem return LDAP_SUCCESS; 1642 1.1 lukem } 1643 1.1 lukem #endif /* LDAP_DYNAMIC_OBJECTS */ 1644