X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=d9f6b6c106e931ea326709ed13ff520ecc979f78;hb=4aa2a2869219880c9a76d9c0ae163a7ff7a51d4e;hp=d85f33ed6c6f2bf22a5a5150f1a9ee5489aa6b05;hpb=3a6e906194a03634589a8800a8c1d8f388b5f185;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index d85f33ed6c..d9f6b6c106 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -1,7 +1,7 @@ /* schemaparse.c - routines to parse config file objectclass definitions */ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -18,137 +18,57 @@ int global_schemacheck = 1; /* schemacheck on is default */ -#ifndef SLAPD_SCHEMA_NOT_COMPAT -static void oc_usage_old(void) LDAP_GCCATTR((noreturn)); -#endif -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", - "Attribute type not found", - "Duplicate objectclass", - "Duplicate attributetype", - "Duplicate syntax", - "Duplicate matchingrule", + "ObjectClass not found", + "ObjectClass inappropriate SUPerior", + "AttributeType not found", + "AttributeType inappropriate USAGE", + "Duplicate objectClass", + "Duplicate attributeType", + "Duplicate ldapSyntax", + "Duplicate matchingRule", "OID or name required", - "Syntax or superior required", - "Matchingrule not found", + "SYNTAX or SUPerior required", + "MatchingRule not found", "Syntax not found", - "Syntax required" + "Syntax required", + "Qualifier not supported", + "Invalid NAME" }; char * scherr2str(int code) { - if ( code < 1 || code >= (sizeof(err2text)/sizeof(char *)) ) { + if ( code < 0 || code >= (sizeof(err2text)/sizeof(char *)) ) { return "Unknown error"; } else { return err2text[code]; } } -#ifndef SLAPD_SCHEMA_NOT_COMPAT -void -parse_oc_old( - Backend *be, - const char *fname, - int lineno, - int argc, - char **argv -) +/* check schema descr validity */ +int slap_valid_descr( const char *descr ) { - int i; - char last; - LDAP_OBJECT_CLASS *oc; - int code; - const char *err; - char **namep; - - oc = (LDAP_OBJECT_CLASS *) ch_calloc( 1, sizeof(LDAP_OBJECT_CLASS) ); - oc->oc_names = ch_calloc( 2, sizeof(char *) ); - oc->oc_names[0] = ch_strdup( argv[1] ); - oc->oc_names[1] = NULL; - - if ( strcasecmp( oc->oc_names[0], "top" ) ) { - /* - * no way to distinguish "auxiliary" from "structural" - * This may lead to future problems. - */ - oc->oc_kind = LDAP_SCHEMA_STRUCTURAL; - } - for ( i = 2; i < argc; i++ ) { - /* required attributes */ - if ( strcasecmp( argv[i], "requires" ) == 0 ) { - do { - i++; - if ( i < argc ) { - char **s = str2charray( argv[i], "," ); - last = argv[i][strlen( argv[i] ) - 1]; - charray_merge( &oc->oc_at_oids_must, s ); - charray_free( s ); - } - } while ( i < argc && last == ',' ); - - /* optional attributes */ - } else if ( strcasecmp( argv[i], "allows" ) == 0 ) { - do { - i++; - if ( i < argc ) { - char **s = str2charray( argv[i], "," ); - last = argv[i][strlen( argv[i] ) - 1]; - - charray_merge( &oc->oc_at_oids_may, s ); - charray_free( s ); - } - } while ( i < argc && last == ',' ); + int i=0; - } else { - fprintf( stderr, - "%s: line %d: expecting \"requires\" or \"allows\" got \"%s\"\n", - fname, lineno, argv[i] ); - oc_usage_old(); - } + if( !DESC_LEADCHAR( descr[i] ) ) { + return 0; } - /* - * There was no requirement in the old schema that all attributes - * types were defined before use and they would just default to - * SYNTAX_CIS. To support this, we need to make attribute types - * out of thin air. - */ - if ( oc->oc_at_oids_must ) { - for( namep = oc->oc_at_oids_must; *namep ; namep++ ) { - code = at_fake_if_needed( *namep ); - if ( code ) { - fprintf( stderr, "%s: line %d: %s %s\n", - fname, lineno, scherr2str(code), *namep); - exit( EXIT_FAILURE ); - } - } - } - if ( oc->oc_at_oids_may ) { - for( namep = oc->oc_at_oids_may; *namep; namep++ ) { - code = at_fake_if_needed( *namep ); - if ( code ) { - fprintf( stderr, "%s: line %d: %s %s\n", - fname, lineno, scherr2str(code), *namep); - exit( EXIT_FAILURE ); - } + while( descr[++i] ) { + if( !DESC_CHAR( descr[i] ) ) { + return 0; } } - - code = oc_add(oc,&err); - if ( code ) { - fprintf( stderr, "%s: line %d: %s %s\n", - fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); - } - ldap_memfree(oc); + + return 1; } -#endif + /* OID Macros */ @@ -178,34 +98,54 @@ static char * find_oidm(char *oid) { OidMacro *om; - char *new; - int pos, suflen; /* OID macros must start alpha */ - if ( !isdigit( *oid ) ) - { - for (om = om_list; om; om=om->som_next) - { - if ((pos = dscompare(om->som_name, oid, ':'))) - { - suflen = strlen(oid + pos); - new = ch_calloc(1, om->som_oidlen + suflen + 1); - strcpy(new, om->som_oid); - if (suflen) - { - suflen = om->som_oidlen; - new[suflen++] = '.'; - strcpy(new+suflen, oid+pos+1); + 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_malloc( 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 new; } - } - return NULL; } - return oid; + return NULL; } void +oidm_destroy() +{ + OidMacro *om, *n; + + for (om = om_list; om; om = n) { + n = om->som_next; + charray_free(om->som_names); + free(om->som_oid.bv_val); + free(om); + } +} + +int parse_oidm( const char *fname, int lineno, @@ -213,33 +153,49 @@ parse_oidm( char **argv ) { + char *oid; OidMacro *om; if (argc != 3) { -usage: fprintf( stderr, "ObjectIdentifier \n"); - exit( EXIT_FAILURE ); + fprintf( stderr, "%s: line %d: too many arguments\n", + fname, lineno ); +usage: fprintf( stderr, "\tObjectIdentifier \n"); + return 1; + } + + oid = find_oidm( argv[1] ); + if( oid != NULL ) { + fprintf( stderr, + "%s: line %d: " + "ObjectIdentifier \"%s\" previously defined \"%s\"", + fname, lineno, argv[1], oid ); + return 1; } om = (OidMacro *) ch_malloc( sizeof(OidMacro) ); - om->som_name = ch_strdup( argv[1] ); - om->som_oid = find_oidm( argv[2] ); - if (!om->som_oid) { + 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; } - if (om->som_oid == argv[2]) { - om->som_oid = ch_strdup( argv[2] ); + if (om->som_oid.bv_val == argv[2]) { + om->som_oid.bv_val = ch_strdup( argv[2] ); } - om->som_oidlen = strlen( om->som_oid ); + om->som_oid.bv_len = strlen( om->som_oid.bv_val ); om->som_next = om_list; om_list = om; + + return 0; } -void +int parse_oc( const char *fname, int lineno, @@ -247,98 +203,98 @@ parse_oc( char **argv ) { - LDAP_OBJECT_CLASS *oc; + LDAPObjectClass *oc; int code; const char *err; char *oid = NULL; - oc = ldap_str2objectclass(line,&code,&err); + 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 ); oc_usage(); + return 1; } - if ( oc->oc_oid ) { - if ( !isdigit( 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(); + return 1; + } + + 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); + return 1; + } + if ( oid != oc->oc_oid ) { + ldap_memfree( oc->oc_oid ); + oc->oc_oid = oid; } } - /* oc->oc_oid == NULL will be an error someday */ + code = oc_add(oc,&err); if ( code ) { - fprintf( stderr, "%s: line %d: %s %s\n", + fprintf( stderr, "%s: line %d: %s: \"%s\"\n", fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); + return 1; } + ldap_memfree(oc); + return 0; } static void oc_usage( void ) { - fprintf( stderr, "ObjectClassDescription = \"(\" whsp\n"); - fprintf( stderr, " numericoid whsp ; ObjectClass identifier\n"); - fprintf( stderr, " [ \"NAME\" qdescrs ]\n"); - fprintf( stderr, " [ \"DESC\" qdstring ]\n"); - fprintf( stderr, " [ \"OBSOLETE\" whsp ]\n"); - fprintf( stderr, " [ \"SUP\" oids ] ; Superior ObjectClasses\n"); - fprintf( stderr, " [ ( \"ABSTRACT\" / \"STRUCTURAL\" / \"AUXILIARY\" ) whsp ]\n"); - fprintf( stderr, " ; default structural\n"); - fprintf( stderr, " [ \"MUST\" oids ] ; AttributeTypes\n"); - fprintf( stderr, " [ \"MAY\" oids ] ; AttributeTypes\n"); - fprintf( stderr, "whsp \")\"\n"); - exit( EXIT_FAILURE ); + fprintf( stderr, + "ObjectClassDescription = \"(\" whsp\n" + " numericoid whsp ; ObjectClass identifier\n" + " [ \"NAME\" qdescrs ]\n" + " [ \"DESC\" qdstring ]\n" + " [ \"OBSOLETE\" whsp ]\n" + " [ \"SUP\" oids ] ; Superior ObjectClasses\n" + " [ ( \"ABSTRACT\" / \"STRUCTURAL\" / \"AUXILIARY\" ) whsp ]\n" + " ; default structural\n" + " [ \"MUST\" oids ] ; AttributeTypes\n" + " [ \"MAY\" oids ] ; AttributeTypes\n" + " whsp \")\"\n" ); } -#ifndef SLAPD_SCHEMA_NOT_COMPAT -static void -oc_usage_old( void ) -{ - fprintf( stderr, " ::= objectclass \n" ); - fprintf( stderr, " [ requires ]\n" ); - fprintf( stderr, " [ allows ]\n" ); - exit( EXIT_FAILURE ); -} -#endif static void at_usage( void ) { - fprintf( stderr, "AttributeTypeDescription = \"(\" whsp\n"); - fprintf( stderr, " numericoid whsp ; AttributeType identifier\n"); - fprintf( stderr, " [ \"NAME\" qdescrs ] ; name used in AttributeType\n"); - fprintf( stderr, " [ \"DESC\" qdstring ] ; description\n"); - fprintf( stderr, " [ \"OBSOLETE\" whsp ]\n"); - fprintf( stderr, " [ \"SUP\" woid ] ; derived from this other\n"); - fprintf( stderr, " ; AttributeType\n"); - fprintf( stderr, " [ \"EQUALITY\" woid ] ; Matching Rule name\n"); - fprintf( stderr, " [ \"ORDERING\" woid ] ; Matching Rule name\n"); - fprintf( stderr, " [ \"SUBSTR\" woid ] ; Matching Rule name\n"); - fprintf( stderr, " [ \"SYNTAX\" whsp noidlen whsp ] ; see section 4.3\n"); - fprintf( stderr, " [ \"SINGLE-VALUE\" whsp ] ; default multi-valued\n"); - fprintf( stderr, " [ \"COLLECTIVE\" whsp ] ; default not collective\n"); - fprintf( stderr, " [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n"); - fprintf( stderr, " [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n"); - fprintf( stderr, " ; userApplications\n"); - fprintf( stderr, " ; directoryOperation\n"); - fprintf( stderr, " ; distributedOperation\n"); - fprintf( stderr, " ; dSAOperation\n"); - fprintf( stderr, "whsp \")\"\n"); - exit( EXIT_FAILURE ); + fprintf( stderr, + "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" + " [ \"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" + " [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n" + " [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n" + " ; userApplications\n" + " ; directoryOperation\n" + " ; distributedOperation\n" + " ; dSAOperation\n" + " whsp \")\"\n"); } -void +int parse_at( const char *fname, int lineno, @@ -346,70 +302,63 @@ parse_at( char **argv ) { - LDAP_ATTRIBUTE_TYPE *at; + 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++) - { - if (!strcasecmp(argv[3], "syntax") && - !isdigit(*argv[4])) - { - 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); + + 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 ( !isdigit( 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(); + return 1; + } + + 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); + return 1; + } + if ( oid != at->at_oid ) { + ldap_memfree( at->at_oid ); + at->at_oid = oid; } } - /* at->at_oid == NULL will be an error someday */ - if (soid) - { - ldap_memfree(at->at_syntax_oid); - at->at_syntax_oid = soid; + + if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) { + /* Expand OID macros */ + oid = find_oidm( at->at_syntax_oid ); + if ( !oid ) { + fprintf(stderr, + "%s: line %d: OID %s not recognized\n", + fname, lineno, at->at_syntax_oid); + return 1; + } + if ( oid != at->at_syntax_oid ) { + ldap_memfree( at->at_syntax_oid ); + at->at_syntax_oid = oid; + } + } code = at_add(at,&err); if ( code ) { - fprintf( stderr, "%s: line %d: %s %s\n", + fprintf( stderr, "%s: line %d: %s: \"%s\"\n", fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); + return 1; } ldap_memfree(at); + return 0; }