X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=42aa19d83557391bd6efd384a09beaa513ab68a0;hb=ecb9c3b3fb3dc595b1b0c572762ae664babeb4db;hp=70edf66b8bcc422745e16d5afac4baaa2c0aebf0;hpb=b76c56ba3f45576b9c418ea9fe7f7b3440052904;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 70edf66b8b..42aa19d835 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -3,21 +3,48 @@ #include "portable.h" #include -#include -#include -#include + +#include +#include + #include "slap.h" +#include "ldap_schema.h" + +static Avlnode *object_classes = NULL; -extern char **str2charray(); -extern void charray_merge(); +int global_schemacheck = 1; /* schemacheck on is default */ -struct objclass *global_oc; -int global_schemacheck; +static void oc_usage_old(void); +static void oc_usage(void); -static void oc_usage(); +static char *err2text[] = { + "", + "Out of memory", + "Objectclass not found", + "Attribute type not found", + "Duplicate objectclass", + "Duplicate attributetype", + "Duplicate syntax", + "Duplicate matchingrule", + "OID or name required", + "Syntax or superior required", + "Matchingrule not found", + "Syntax not found", + "Syntax required" +}; + +char * +scherr2str(int code) +{ + if ( code < 1 || code >= (sizeof(err2text)/sizeof(char *)) ) { + return "Unknown error"; + } else { + return err2text[code]; + } +} void -parse_oc( +parse_oc_old( Backend *be, char *fname, int lineno, @@ -27,20 +54,28 @@ parse_oc( { int i; char last; - struct objclass *oc; - struct objclass **ocp; + LDAP_OBJECT_CLASS *oc; + int code; + const char *err; + char **namep; - oc = (struct objclass *) ch_calloc( 1, sizeof(struct objclass) ); - oc->oc_name = strdup( argv[1] ); + 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" ) ) { + 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_required, - str2charray( argv[i], "," ) ); + charray_merge( &oc->oc_at_oids_must, s ); + charray_free( s ); } } while ( i < argc && last == ',' ); @@ -49,9 +84,11 @@ parse_oc( do { i++; if ( i < argc ) { + char **s = str2charray( argv[i], "," ); last = argv[i][strlen( argv[i] ) - 1]; - charray_merge( &oc->oc_allowed, - str2charray( argv[i], "," ) ); + + charray_merge( &oc->oc_at_oids_may, s ); + charray_free( s ); } } while ( i < argc && last == ',' ); @@ -59,23 +96,150 @@ parse_oc( fprintf( stderr, "%s: line %d: expecting \"requires\" or \"allows\" got \"%s\"\n", fname, lineno, argv[i] ); - oc_usage(); + oc_usage_old(); } } - ocp = &global_oc; - while ( *ocp != NULL ) { - ocp = &(*ocp)->oc_next; + /* + * 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 ) { + namep = oc->oc_at_oids_must; + while ( *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 ); + } + namep++; + } } - *ocp = oc; + if ( oc->oc_at_oids_may ) { + namep = oc->oc_at_oids_may; + while ( *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 ); + } + namep++; + } + } + + 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); +} + +void +parse_oc( + char *fname, + int lineno, + char *line +) +{ + LDAP_OBJECT_CLASS *oc; + int code; + const char *err; + + oc = ldap_str2objectclass(line,&code,&err); + if ( !oc ) { + fprintf( stderr, "%s: line %d: %s before %s\n", + fname, lineno, ldap_scherr2str(code), err ); + oc_usage(); + } + 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); +} + +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 ); } static void -oc_usage() +oc_usage_old( void ) { fprintf( stderr, " ::= objectclass \n" ); fprintf( stderr, " [ requires ]\n" ); fprintf( stderr, " [ allows ]\n" ); - exit( 1 ); + exit( EXIT_FAILURE ); +} + +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 ); } +void +parse_at( + char *fname, + int lineno, + char *line +) +{ + LDAP_ATTRIBUTE_TYPE *at; + int code; + const char *err; + + at = ldap_str2attributetype(line,&code,&err); + if ( !at ) { + fprintf( stderr, "%s: line %d: %s before %s\n", + fname, lineno, ldap_scherr2str(code), err ); + at_usage(); + } + code = at_add(at,&err); + if ( code ) { + fprintf( stderr, "%s: line %d: %s %s\n", + fname, lineno, scherr2str(code), err); + exit( EXIT_FAILURE ); + } + ldap_memfree(at); +}