mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-20 13:53:21 -05:00
Another round of operational attribute changes... more to follow.
This commit is contained in:
parent
91644affd9
commit
6ed15e3350
6 changed files with 200 additions and 147 deletions
|
|
@ -274,7 +274,35 @@ at_add(
|
|||
MatchingRule *mr;
|
||||
Syntax *syn;
|
||||
int code;
|
||||
char *cname;
|
||||
char *cname;
|
||||
char *oid;
|
||||
|
||||
if ( !OID_LEADCHAR( at->at_oid[0] )) {
|
||||
/* Expand OID macros */
|
||||
oid = oidm_find( at->at_oid );
|
||||
if ( !oid ) {
|
||||
*err = at->at_oid;
|
||||
return SLAP_SCHERR_OIDM;
|
||||
}
|
||||
if ( oid != at->at_oid ) {
|
||||
ldap_memfree( at->at_oid );
|
||||
at->at_oid = oid;
|
||||
}
|
||||
}
|
||||
|
||||
if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) {
|
||||
/* Expand OID macros */
|
||||
oid = oidm_find( at->at_syntax_oid );
|
||||
if ( !oid ) {
|
||||
*err = at->at_syntax_oid;
|
||||
return SLAP_SCHERR_OIDM;
|
||||
}
|
||||
if ( oid != at->at_syntax_oid ) {
|
||||
ldap_memfree( at->at_syntax_oid );
|
||||
at->at_syntax_oid = oid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( at->at_names && at->at_names[0] ) {
|
||||
int i;
|
||||
|
|
|
|||
122
servers/slapd/oidm.c
Normal file
122
servers/slapd/oidm.c
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
/* schemaparse.c - routines to parse config file objectclass definitions */
|
||||
/* $OpenLDAP$ */
|
||||
/*
|
||||
* Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
|
||||
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
|
||||
*/
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ac/ctype.h>
|
||||
#include <ac/string.h>
|
||||
#include <ac/socket.h>
|
||||
|
||||
#include "slap.h"
|
||||
|
||||
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.
|
||||
*/
|
||||
char *
|
||||
oidm_find(char *oid)
|
||||
{
|
||||
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 *tmp = ch_malloc( om->som_oid.bv_len
|
||||
+ suflen + 1);
|
||||
strcpy(tmp, om->som_oid.bv_val);
|
||||
if( suflen ) {
|
||||
suflen = om->som_oid.bv_len;
|
||||
tmp[suflen++] = '.';
|
||||
strcpy(tmp+suflen, oid+pos+1);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
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,
|
||||
int argc,
|
||||
char **argv
|
||||
)
|
||||
{
|
||||
char *oid;
|
||||
OidMacro *om;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf( stderr, "%s: line %d: too many arguments\n",
|
||||
fname, lineno );
|
||||
usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
oid = oidm_find( 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_names = NULL;
|
||||
charray_add( &om->som_names, argv[1] );
|
||||
om->som_oid.bv_val = oidm_find( 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.bv_val == argv[2]) {
|
||||
om->som_oid.bv_val = ch_strdup( argv[2] );
|
||||
}
|
||||
|
||||
om->som_oid.bv_len = strlen( om->som_oid.bv_val );
|
||||
om->som_next = om_list;
|
||||
om_list = om;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -571,6 +571,14 @@ LDAP_SLAPD_F (void) mra_free LDAP_P((
|
|||
MatchingRuleAssertion *mra,
|
||||
int freeit ));
|
||||
|
||||
/*
|
||||
* oidm.c
|
||||
*/
|
||||
LDAP_SLAPD_F(char *) oidm_find(char *oid);
|
||||
LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void ));
|
||||
LDAP_SLAPD_F (int) parse_oidm LDAP_P((
|
||||
const char *fname, int lineno, int argc, char **argv ));
|
||||
|
||||
/*
|
||||
* operation.c
|
||||
*/
|
||||
|
|
@ -718,7 +726,6 @@ LDAP_SLAPD_F (int) syn_schema_info( Entry *e );
|
|||
*/
|
||||
|
||||
LDAP_SLAPD_F (void) oc_destroy LDAP_P(( void ));
|
||||
LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void ));
|
||||
LDAP_SLAPD_F (void) at_destroy LDAP_P(( void ));
|
||||
LDAP_SLAPD_F (void) ad_destroy LDAP_P(( AttributeDescription * ));
|
||||
LDAP_SLAPD_F (void) mr_destroy LDAP_P(( void ));
|
||||
|
|
@ -851,8 +858,6 @@ LDAP_SLAPD_F (int) parse_oc LDAP_P((
|
|||
const char *fname, int lineno, char *line, char **argv ));
|
||||
LDAP_SLAPD_F (int) parse_at LDAP_P((
|
||||
const char *fname, int lineno, char *line, char **argv ));
|
||||
LDAP_SLAPD_F (int) parse_oidm LDAP_P((
|
||||
const char *fname, int lineno, int argc, char **argv ));
|
||||
LDAP_SLAPD_F (char *) scherr2str LDAP_P((int code)) LDAP_GCCATTR((const));
|
||||
LDAP_SLAPD_F (int) dscompare LDAP_P(( const char *s1, const char *s2del,
|
||||
char delim ));
|
||||
|
|
|
|||
|
|
@ -408,6 +408,39 @@ static struct slap_schema_syn_map {
|
|||
int
|
||||
slap_schema_load( void )
|
||||
{
|
||||
int i;
|
||||
for( i=0; ad_map[i].ssam_name; i++ ) {
|
||||
if( ad_map[i].ssam_defn != NULL ) {
|
||||
LDAPAttributeType *at;
|
||||
int code;
|
||||
const char *err;
|
||||
|
||||
at = ldap_str2attributetype( ad_map[i].ssam_defn,
|
||||
&code, &err, LDAP_SCHEMA_ALLOW_ALL );
|
||||
if ( !at ) {
|
||||
fprintf( stderr,
|
||||
"slap_schema_load: %s: %s before %s\n",
|
||||
ad_map[i].ssam_name, ldap_scherr2str(code), err );
|
||||
return code;
|
||||
}
|
||||
|
||||
if ( at->at_oid == NULL ) {
|
||||
fprintf( stderr, "slap_schema_load: "
|
||||
"attributeType \"%s\" has no OID\n",
|
||||
ad_map[i].ssam_name );
|
||||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
code = at_add( at, &err );
|
||||
if ( code ) {
|
||||
fprintf( stderr, "slap_schema_load: "
|
||||
"%s: %s: \"%s\"\n",
|
||||
ad_map[i].ssam_name, scherr2str(code), err );
|
||||
return code;
|
||||
}
|
||||
ldap_memfree( at );
|
||||
}
|
||||
}
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ int global_schemacheck = 1; /* schemacheck ON is default */
|
|||
static void oc_usage(void);
|
||||
static void at_usage(void);
|
||||
|
||||
static char *const err2text[] = {
|
||||
static char *const err2text[SLAP_SCHERR_LAST+1] = {
|
||||
"Success",
|
||||
"Out of memory",
|
||||
"ObjectClass not found",
|
||||
|
|
@ -38,7 +38,8 @@ static char *const err2text[] = {
|
|||
"Syntax not found",
|
||||
"Syntax required",
|
||||
"Qualifier not supported",
|
||||
"Invalid NAME"
|
||||
"Invalid NAME",
|
||||
"OID could not be expanded"
|
||||
};
|
||||
|
||||
char *
|
||||
|
|
@ -88,111 +89,6 @@ 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)
|
||||
{
|
||||
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 *tmp = ch_malloc( om->som_oid.bv_len
|
||||
+ suflen + 1);
|
||||
strcpy(tmp, om->som_oid.bv_val);
|
||||
if( suflen ) {
|
||||
suflen = om->som_oid.bv_len;
|
||||
tmp[suflen++] = '.';
|
||||
strcpy(tmp+suflen, oid+pos+1);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
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,
|
||||
int argc,
|
||||
char **argv
|
||||
)
|
||||
{
|
||||
char *oid;
|
||||
OidMacro *om;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf( stderr, "%s: line %d: too many arguments\n",
|
||||
fname, lineno );
|
||||
usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\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_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.bv_val == argv[2]) {
|
||||
om->som_oid.bv_val = ch_strdup( argv[2] );
|
||||
}
|
||||
|
||||
om->som_oid.bv_len = strlen( om->som_oid.bv_val );
|
||||
om->som_next = om_list;
|
||||
om_list = om;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
parse_oc(
|
||||
|
|
@ -225,7 +121,7 @@ parse_oc(
|
|||
|
||||
if ( !OID_LEADCHAR( oc->oc_oid[0] )) {
|
||||
/* Expand OID macros */
|
||||
oid = find_oidm( oc->oc_oid );
|
||||
oid = oidm_find( oc->oc_oid );
|
||||
if ( !oid ) {
|
||||
fprintf( stderr,
|
||||
"%s: line %d: OID %s not recognized\n",
|
||||
|
|
@ -306,7 +202,7 @@ parse_at(
|
|||
const char *err;
|
||||
char *oid = NULL;
|
||||
|
||||
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 );
|
||||
|
|
@ -322,45 +218,12 @@ parse_at(
|
|||
return 1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* 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;
|
||||
}
|
||||
#endif
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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 ) {
|
||||
|
|
|
|||
|
|
@ -234,7 +234,9 @@ typedef struct slap_ssf_set {
|
|||
#define SLAP_SCHERR_SYN_NOT_FOUND 13
|
||||
#define SLAP_SCHERR_MR_INCOMPLETE 14
|
||||
#define SLAP_SCHERR_NOT_SUPPORTED 15
|
||||
#define SLAP_SCHERR_BAD_DESCR 16
|
||||
#define SLAP_SCHERR_BAD_DESCR 16
|
||||
#define SLAP_SCHERR_OIDM 17
|
||||
#define SLAP_SCHERR_LAST SLAP_SCHERR_OIDM
|
||||
|
||||
typedef union slap_sockaddr {
|
||||
struct sockaddr sa_addr;
|
||||
|
|
|
|||
Loading…
Reference in a new issue