X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=5f85a888584c34e46ecf450af59779c9de6c1fab;hb=3c7bbd05cf91687913147b617ee36226e6e7ebf2;hp=6a621937f3eca4d02e3c977e255b190e0195bed4;hpb=7a97f37bd47d632fac1b6206065926b1fa9c6dbb;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 6a621937f3..5f85a88858 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-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2013 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" @@ -15,9 +24,7 @@ #include "slap.h" #include "ldap_schema.h" - -int global_schemacheck = 1; /* schemacheck ON is default */ -int global_add_rdn_values = 0; /* bail out if rdn values do not match entry values is default */ +#include "config.h" static void oc_usage(void); static void at_usage(void); @@ -29,25 +36,31 @@ static char *const err2text[] = { "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", "AttributeType inappropriate SUPerior", "AttributeType SYNTAX or SUPerior required", "Duplicate attributeType", + "Inconsistent duplicate attributeType", "MatchingRule not found", "MatchingRule incomplete", "Duplicate matchingRule", "Syntax not found", "Duplicate ldapSyntax", + "Superior syntax not found", + "Substitute syntax not specified", + "Substitute syntax not found", "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 non-AUXILIARY object class" - "Content Rule attribute type list contains duplicate" + "Content Rule AUX contains inappropriate object class", + "Content Rule attribute type list contains duplicate", + NULL }; char * @@ -97,8 +110,6 @@ dscompare(const char *s1, const char *s2, char delim) return 0; } -#ifdef SLAP_EXTENDED_SCHEMA - static void cr_usage( void ) { @@ -117,82 +128,105 @@ cr_usage( void ) int parse_cr( - const char *fname, - int lineno, - char *line, - char **argv -) + struct config_args_s *c, + ContentRule **scr ) { LDAPContentRule *cr; int code; const char *err; + char *line = strchr( c->line, '(' ); - cr = ldap_str2contentrule(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); + 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 ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s", + c->argv[0], ldap_scherr2str( code ), err ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); cr_usage(); return 1; } if ( cr->cr_oid == NULL ) { - fprintf( stderr, - "%s: line %d: Content rule has no OID\n", - fname, lineno ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing", + c->argv[0] ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); cr_usage(); - return 1; + code = 1; + goto done; } - code = cr_add(cr,1,&err); + code = cr_add( cr, 1, scr, &err ); if ( code ) { - fprintf( stderr, "%s: line %d: %s: \"%s\"\n", - fname, lineno, scherr2str(code), err); - return 1; + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"", + c->argv[0], scherr2str(code), err); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + code = 1; + goto done; } - ldap_memfree(cr); - return 0; -} +done:; + if ( code ) { + ldap_contentrule_free( cr ); -#endif + } else { + ldap_memfree( cr ); + } + + return code; +} int parse_oc( - const char *fname, - int lineno, - char *line, - char **argv -) + struct config_args_s *c, + ObjectClass **soc, + ObjectClass *prev ) { LDAPObjectClass *oc; int code; const char *err; + char *line = strchr( c->line, '(' ); 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 ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s", + c->argv[0], ldap_scherr2str( code ), err ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); oc_usage(); return 1; } if ( oc->oc_oid == NULL ) { - fprintf( stderr, - "%s: line %d: objectclass has no OID\n", - fname, lineno ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing", + c->argv[0] ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); oc_usage(); - return 1; + code = 1; + goto done; } - code = oc_add(oc,1,&err); + code = oc_add( oc, 1, soc, prev, &err ); if ( code ) { - fprintf( stderr, "%s: line %d: %s: \"%s\"\n", - fname, lineno, scherr2str(code), err); - return 1; + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"", + c->argv[0], scherr2str(code), err); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + code = 1; + goto done; } - ldap_memfree(oc); - return 0; +done:; + if ( code ) { + ldap_objectclass_free( oc ); + + } else { + ldap_memfree( oc ); + } + + return code; } static void @@ -215,20 +249,20 @@ oc_usage( void ) 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" @@ -240,45 +274,127 @@ at_usage( void ) int parse_at( - const char *fname, - int lineno, - char *line, - char **argv -) + struct config_args_s *c, + AttributeType **sat, + AttributeType *prev ) { LDAPAttributeType *at; int code; const char *err; + char *line = strchr( c->line, '(' ); 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 ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s", + c->argv[0], ldap_scherr2str(code), err ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); at_usage(); return 1; } if ( at->at_oid == NULL ) { - fprintf( stderr, - "%s: line %d: attributeType has no OID\n", - fname, lineno ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing", + c->argv[0] ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); at_usage(); - return 1; + code = 1; + goto done; } /* 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 ); - return 1; + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: \"%s\" is operational", + c->argv[0], at->at_oid ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + code = 1; + goto done; + } + + code = at_add( at, 1, sat, prev, &err); + if ( code ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"", + c->argv[0], scherr2str(code), err); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + code = 1; + goto done; } - code = at_add(at,&err); +done:; if ( code ) { - fprintf( stderr, "%s: line %d: %s: \"%s\"\n", - fname, lineno, scherr2str(code), err); + ldap_attributetype_free( at ); + + } else { + ldap_memfree( at ); + } + + return code; +} + +static void +syn_usage( void ) +{ + fprintf( stderr, "%s", + "SyntaxDescription = \"(\" whsp\n" + " numericoid whsp ; object identifier\n" + " [ whsp \"DESC\" whsp qdstring ] ; description\n" + " extensions whsp \")\" ; extensions\n" + " whsp \")\"\n"); +} + +int +parse_syn( + struct config_args_s *c, + Syntax **ssyn, + Syntax *prev ) +{ + LDAPSyntax *syn; + slap_syntax_defs_rec def = { 0 }; + int code; + const char *err; + char *line = strchr( c->line, '(' ); + + syn = ldap_str2syntax( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); + if ( !syn ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s", + c->argv[0], ldap_scherr2str(code), err ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + syn_usage(); return 1; } - ldap_memfree(at); - return 0; + + if ( syn->syn_oid == NULL ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing", + c->argv[0] ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + syn_usage(); + code = 1; + goto done; + } + + code = syn_add( syn, 1, &def, ssyn, prev, &err ); + if ( code ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"", + c->argv[0], scherr2str(code), err); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + code = 1; + goto done; + } + +done:; + if ( code ) { + ldap_syntax_free( syn ); + + } else { + ldap_memfree( syn ); + } + + return code; } +