X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=f802f1ad59a541ee2cc774fb9746ca62aa435911;hb=5487575086d2060ab05a408543ff07be31b400a8;hp=6b377f608de21e34fa69c83e676c994119e948b2;hpb=66aa425d9211e3acb3b0eb387ec5f1b9c5c5f868;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 6b377f608d..f802f1ad59 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -1,8 +1,17 @@ /* schemaparse.c - routines to parse config file objectclass definitions */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -16,39 +25,68 @@ #include "slap.h" #include "ldap_schema.h" -int global_schemacheck = 1; /* schemacheck on is default */ - -static void oc_usage(void) LDAP_GCCATTR((noreturn)); -static void at_usage(void) LDAP_GCCATTR((noreturn)); +static void oc_usage(void); +static void at_usage(void); static char *const err2text[] = { "Success", "Out of memory", "ObjectClass not found", - "ObjectClass inappropriate SUPerior", + "user-defined ObjectClass includes operational attributes", + "user-defined ObjectClass has inappropriate SUPerior", + "Duplicate objectClass", + "Inconsistent duplicate objectClass", "AttributeType not found", + "AttributeType inappropriate matching rule", "AttributeType inappropriate USAGE", - "Duplicate objectClass", + "AttributeType inappropriate SUPerior", + "AttributeType SYNTAX or SUPerior required", "Duplicate attributeType", - "Duplicate ldapSyntax", - "Duplicate matchingRule", - "OID or name required", - "SYNTAX or SUPerior required", + "Inconsistent duplicate attributeType", "MatchingRule not found", + "MatchingRule incomplete", + "Duplicate matchingRule", "Syntax not found", - "Syntax required" + "Duplicate ldapSyntax", + "OID or name required", + "Qualifier not supported", + "Invalid NAME", + "OID could not be expanded", + "Duplicate Content Rule", + "Content Rule not for STRUCTURAL object class", + "Content Rule AUX contains inappropriate object class", + "Content Rule attribute type list contains duplicate", + NULL }; char * scherr2str(int code) { - if ( code < 0 || code >= (sizeof(err2text)/sizeof(char *)) ) { + if ( code < 0 || SLAP_SCHERR_LAST <= code ) { return "Unknown error"; } else { return err2text[code]; } } +/* check schema descr validity */ +int slap_valid_descr( const char *descr ) +{ + int i=0; + + if( !DESC_LEADCHAR( descr[i] ) ) { + return 0; + } + + while( descr[++i] ) { + if( !DESC_CHAR( descr[i] ) ) { + return 0; + } + } + + return 1; +} + /* OID Macros */ @@ -68,141 +106,116 @@ dscompare(const char *s1, const char *s2, char delim) return 0; } -static OidMacro *om_list = NULL; - -/* Replace an OID Macro invocation with its full numeric OID. - * If the macro is used with "macroname:suffix" append ".suffix" - * to the expansion. - */ -static char * -find_oidm(char *oid) +static void +cr_usage( void ) { - OidMacro *om; - - /* OID macros must start alpha */ - if ( OID_LEADCHAR( *oid ) ) { - return oid; - } - - for (om = om_list; om; om=om->som_next) { - char **names = om->som_names; - - if( names == NULL ) { - continue; - } - - for( ; *names != NULL ; names++ ) { - int pos = dscompare(*names, oid, ':'); - - if( pos ) { - int suflen = strlen(oid + pos); - char *new = ch_calloc(1, - om->som_oid.bv_len + suflen + 1); - strcpy(new, om->som_oid.bv_val); - - if( suflen ) { - suflen = om->som_oid.bv_len; - new[suflen++] = '.'; - strcpy(new+suflen, oid+pos+1); - } - return new; - } - } - } - return NULL; + fprintf( stderr, + "DITContentRuleDescription = \"(\" whsp\n" + " numericoid whsp ; StructuralObjectClass identifier\n" + " [ \"NAME\" qdescrs ]\n" + " [ \"DESC\" qdstring ]\n" + " [ \"OBSOLETE\" whsp ]\n" + " [ \"AUX\" oids ] ; Auxiliary ObjectClasses\n" + " [ \"MUST\" oids ] ; AttributeTypes\n" + " [ \"MAY\" oids ] ; AttributeTypes\n" + " [ \"NOT\" oids ] ; AttributeTypes\n" + " whsp \")\"\n" ); } -void -parse_oidm( - const char *fname, - int lineno, - int argc, - char **argv -) +int +parse_cr( + const char *fname, + int lineno, + char *line, + char **argv, + ContentRule **scr ) { - char *oid; - OidMacro *om; + LDAPContentRule *cr; + int code; + const char *err; - if (argc != 3) { - fprintf( stderr, "%s: line %d: too many arguments\n", - fname, lineno ); -usage: fprintf( stderr, "\tObjectIdentifier \n"); - exit( EXIT_FAILURE ); + cr = ldap_str2contentrule( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); + if ( !cr ) { + fprintf( stderr, "%s: line %d: %s before %s\n", + fname, lineno, ldap_scherr2str(code), err ); + cr_usage(); + return 1; } - oid = find_oidm( argv[1] ); - if( oid != NULL ) { + if ( cr->cr_oid == NULL ) { fprintf( stderr, - "%s: line %d: " - "ObjectIdentifier \"%s\" previously defined \"%s\"", - fname, lineno, argv[1], oid ); - exit( EXIT_FAILURE ); + "%s: line %d: Content rule has no OID\n", + fname, lineno ); + cr_usage(); + code = 1; + goto done; } - om = (OidMacro *) ch_malloc( sizeof(OidMacro) ); - - om->som_names = NULL; - charray_add( &om->som_names, argv[1] ); - om->som_oid.bv_val = find_oidm( argv[2] ); - - if (!om->som_oid.bv_val) { - fprintf( stderr, "%s: line %d: OID %s not recognized\n", - fname, lineno, argv[2] ); - goto usage; + code = cr_add( cr, 1, scr, &err ); + if ( code ) { + fprintf( stderr, "%s: line %d: %s: \"%s\"\n", + fname, lineno, scherr2str( code ), err ); + code = 1; + goto done; } - if (om->som_oid.bv_val == argv[2]) { - om->som_oid.bv_val = ch_strdup( argv[2] ); +done:; + if ( code ) { + ldap_contentrule_free( cr ); + + } else { + ldap_memfree( cr ); } - om->som_oid.bv_len = strlen( om->som_oid.bv_val ); - om->som_next = om_list; - om_list = om; + return code; } -void +int parse_oc( - const char *fname, - int lineno, - char *line, - char **argv -) + const char *fname, + int lineno, + char *line, + char **argv, + ObjectClass **soc ) { LDAPObjectClass *oc; int code; const char *err; - char *oid = NULL; - oc = ldap_str2objectclass(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL); + oc = ldap_str2objectclass(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); if ( !oc ) { fprintf( stderr, "%s: line %d: %s before %s\n", - fname, lineno, ldap_scherr2str(code), err ); + fname, lineno, ldap_scherr2str( code ), err ); oc_usage(); + return 1; } - if ( oc->oc_oid ) { - if ( !OID_LEADCHAR( oc->oc_oid[0] )) { - /* Expand OID macros */ - oid = find_oidm( oc->oc_oid ); - if ( !oid ) { - fprintf(stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, oc->oc_oid); - exit( EXIT_FAILURE ); - } - if ( oid != oc->oc_oid ) { - ldap_memfree( oc->oc_oid ); - oc->oc_oid = oid; - } - } + + if ( oc->oc_oid == NULL ) { + fprintf( stderr, + "%s: line %d: objectclass has no OID\n", + fname, lineno ); + oc_usage(); + code = 1; + goto done; } - /* oc->oc_oid == NULL will be an error someday */ - code = oc_add(oc,&err); + + code = oc_add( oc, 1, soc, &err ); if ( code ) { fprintf( stderr, "%s: line %d: %s: \"%s\"\n", - fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); + fname, lineno, scherr2str( code ), err ); + code = 1; + goto done; + } + +done:; + if ( code ) { + ldap_objectclass_free( oc ); + + } else { + ldap_memfree( oc ); } - ldap_memfree(oc); + + return code; } static void @@ -220,27 +233,25 @@ oc_usage( void ) " [ \"MUST\" oids ] ; AttributeTypes\n" " [ \"MAY\" oids ] ; AttributeTypes\n" " whsp \")\"\n" ); - exit( EXIT_FAILURE ); } - static void at_usage( void ) { - fprintf( stderr, + fprintf( stderr, "%s%s%s", "AttributeTypeDescription = \"(\" whsp\n" " numericoid whsp ; AttributeType identifier\n" " [ \"NAME\" qdescrs ] ; name used in AttributeType\n" " [ \"DESC\" qdstring ] ; description\n" " [ \"OBSOLETE\" whsp ]\n" " [ \"SUP\" woid ] ; derived from this other\n" - " ; AttributeType\n" + " ; AttributeType\n", " [ \"EQUALITY\" woid ] ; Matching Rule name\n" " [ \"ORDERING\" woid ] ; Matching Rule name\n" " [ \"SUBSTR\" woid ] ; Matching Rule name\n" " [ \"SYNTAX\" whsp noidlen whsp ] ; see section 4.3\n" " [ \"SINGLE-VALUE\" whsp ] ; default multi-valued\n" - " [ \"COLLECTIVE\" whsp ] ; default not collective\n" + " [ \"COLLECTIVE\" whsp ] ; default not collective\n", " [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n" " [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n" " ; userApplications\n" @@ -248,81 +259,60 @@ at_usage( void ) " ; distributedOperation\n" " ; dSAOperation\n" " whsp \")\"\n"); - exit( EXIT_FAILURE ); } -void +int parse_at( - const char *fname, - int lineno, - char *line, - char **argv -) + const char *fname, + int lineno, + char *line, + char **argv, + AttributeType **sat ) { LDAPAttributeType *at; int code; const char *err; - char *oid = NULL; - char *soid = NULL; - - /* Kludge for OIDmacros for syntaxes. If the syntax field starts - * nonnumeric, look for and expand a macro. The macro's place in - * the input line will be replaced with a field of '0's to keep - * ldap_str2attributetype happy. The actual oid will be swapped - * into place afterwards. - */ - for (; argv[3]; argv++) - { - /* Allow numeric OIDs to be wrapped in single quotes */ - if (!strcasecmp(argv[3], "syntax") && argv[4] != NULL && - !OID_LEADCHAR(argv[4][argv[4][0] == '\'' ? 1 : 0])) - { - int slen; - Syntax *syn; - syn = syn_find_desc(argv[4], &slen); - if (!syn) - { - fprintf(stderr, "%s: line %d: OID %s not found\n", - fname, lineno, argv[4]); - exit( EXIT_FAILURE ); - } - memset(strstr(line, argv[4]), '0', slen); - soid = ch_strdup(syn->ssyn_syn.syn_oid ); - break; - } - } - at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL); + + at = ldap_str2attributetype( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); if ( !at ) { fprintf( stderr, "%s: line %d: %s before %s\n", fname, lineno, ldap_scherr2str(code), err ); at_usage(); + return 1; } - if ( at->at_oid ) { - if ( !OID_LEADCHAR( at->at_oid[0] )) { - /* Expand OID macros */ - oid = find_oidm( at->at_oid ); - if ( !oid ) { - fprintf(stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, at->at_oid); - exit( EXIT_FAILURE ); - } - if ( oid != at->at_oid ) { - ldap_memfree( at->at_oid ); - at->at_oid = oid; - } - } + + if ( at->at_oid == NULL ) { + fprintf( stderr, + "%s: line %d: attributeType has no OID\n", + fname, lineno ); + at_usage(); + code = 1; + goto done; } - /* at->at_oid == NULL will be an error someday */ - if (soid) { - ldap_memfree(at->at_syntax_oid); - at->at_syntax_oid = soid; + + /* operational attributes should be defined internally */ + if ( at->at_usage ) { + fprintf( stderr, "%s: line %d: attribute type \"%s\" is operational\n", + fname, lineno, at->at_oid ); + code = 1; + goto done; } - code = at_add(at,&err); + + code = at_add( at, 1, sat, &err); if ( code ) { fprintf( stderr, "%s: line %d: %s: \"%s\"\n", fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); + code = 1; + goto done; + } + +done:; + if ( code ) { + ldap_attributetype_free( at ); + + } else { + ldap_memfree( at ); } - ldap_memfree(at); + + return code; }