static int autoca_db_init( BackendDB *be, ConfigReply *cr ) { slap_overinst *on = (slap_overinst *) be->bd_info; autoca_info *ai; ai = ch_calloc(1, sizeof(autoca_info)); on->on_bi.bi_private = ai; /* set defaults */ ai->ai_usrclass = oc_find( "person" ); ai->ai_srvclass = oc_find( "ipHost" ); ai->ai_usrkeybits = KEYBITS; ai->ai_srvkeybits = KEYBITS; ai->ai_cakeybits = KEYBITS; ai->ai_usrdays = 365; /* 1 year */ ai->ai_srvdays = 1826; /* 5 years */ ai->ai_cadays = 3652; /* 10 years */ return 0; }
int autoPosixIds_init() { autoPosixIds.on_bi.bi_type = "autoPosixIds"; autoPosixIds.on_bi.bi_op_add = autoPosixIds_add; autoPosixIds.on_bi.bi_db_init = autoPosixIds_db_init; autoPosixIds.on_bi.bi_db_destroy = autoPosixIds_db_destroy; oc_posix_account = oc_find( "posixAccount" ); if( oc_posix_account == NULL ) { Debug( LDAP_DEBUG_ANY, "%s: unable to find default ObjectClass \"posixAccount\".\n", autoPosixIds.on_bi.bi_type, 0, 0 ); return -1; } return ( overlay_register(&autoPosixIds) ); }
static int example_open(BackendDB *be, ConfigReply *cr) { slap_overinst *on = (slap_overinst *)be->bd_info; example_data *ex = on->on_bi.bi_private; ObjectClass *oc_kerberos; ldap_pvt_thread_mutex_init(&ex->examplemutex); // if (krb5_init_context(&ex->context)) return -1; oc_kerberos = oc_find("krbPrincipal"); if (!oc_kerberos) return -1; if (!ex->keytabpath) ex->keytabpath = DEFAULT_KEYTAB_PATH; return 0; }
int limits_parse( Backend *be, const char *fname, int lineno, int argc, char **argv ) { int flags = SLAP_LIMITS_UNDEFINED; char *pattern; struct slap_limits_set limit; int i, rc = 0; ObjectClass *group_oc = NULL; AttributeDescription *group_ad = NULL; assert( be != NULL ); if ( argc < 3 ) { Debug( LDAP_DEBUG_ANY, "%s : line %d: missing arg(s) in " "\"limits <pattern> <limits>\" line.\n%s", fname, lineno, "" ); return( -1 ); } limit = be->be_def_limit; /* * syntax: * * "limits" <pattern> <limit> [ ... ] * * * <pattern>: * * "anonymous" * "users" * [ "dn" [ "." { "this" | "self" } ] [ "." { "exact" | "base" | * "onelevel" | "subtree" | "children" | "regex" | "anonymous" } ] * "=" ] <dn pattern> * * Note: * "this" is the baseobject, "self" (the default) is the bound DN * "exact" and "base" are the same (exact match); * "onelevel" means exactly one rdn below, NOT including pattern * "subtree" means any rdn below, including pattern * "children" means any rdn below, NOT including pattern * * "anonymous" may be deprecated in favour * of the pattern = "anonymous" form * * "group[/objectClass[/attributeType]]" "=" "<dn pattern>" * * <limit>: * * "time" [ "." { "soft" | "hard" } ] "=" <integer> * * "size" [ "." { "soft" | "hard" | "unchecked" } ] "=" <integer> */ pattern = argv[1]; if ( strcmp( pattern, "*" ) == 0) { flags = SLAP_LIMITS_ANY; } else if ( strcasecmp( pattern, "anonymous" ) == 0 ) { flags = SLAP_LIMITS_ANONYMOUS; } else if ( strcasecmp( pattern, "users" ) == 0 ) { flags = SLAP_LIMITS_USERS; } else if ( STRSTART( pattern, "dn" ) ) { pattern += STRLENOF( "dn" ); flags = SLAP_LIMITS_TYPE_SELF; if ( pattern[0] == '.' ) { pattern++; if ( STRSTART( pattern, "this" ) ) { flags = SLAP_LIMITS_TYPE_THIS; pattern += STRLENOF( "this" ); } else if ( STRSTART( pattern, "self" ) ) { pattern += STRLENOF( "self" ); } else { goto got_dn_dot; } } if ( pattern[0] == '.' ) { pattern++; got_dn_dot: if ( STRSTART( pattern, "exact" ) ) { flags |= SLAP_LIMITS_EXACT; pattern += STRLENOF( "exact" ); } else if ( STRSTART( pattern, "base" ) ) { flags |= SLAP_LIMITS_BASE; pattern += STRLENOF( "base" ); } else if ( STRSTART( pattern, "one" ) ) { flags |= SLAP_LIMITS_ONE; pattern += STRLENOF( "one" ); if ( STRSTART( pattern, "level" ) ) { pattern += STRLENOF( "level" ); } else { Debug( LDAP_DEBUG_ANY, "%s : line %d: deprecated \"one\" style " "\"limits <pattern> <limits>\" line; " "use \"onelevel\" instead.\n", fname, lineno, 0 ); } } else if ( STRSTART( pattern, "sub" ) ) { flags |= SLAP_LIMITS_SUBTREE; pattern += STRLENOF( "sub" ); if ( STRSTART( pattern, "tree" ) ) { pattern += STRLENOF( "tree" ); } else { Debug( LDAP_DEBUG_ANY, "%s : line %d: deprecated \"sub\" style " "\"limits <pattern> <limits>\" line; " "use \"subtree\" instead.\n", fname, lineno, 0 ); } } else if ( STRSTART( pattern, "children" ) ) { flags |= SLAP_LIMITS_CHILDREN; pattern += STRLENOF( "children" ); } else if ( STRSTART( pattern, "regex" ) ) { flags |= SLAP_LIMITS_REGEX; pattern += STRLENOF( "regex" ); /* * this could be deprecated in favour * of the pattern = "anonymous" form */ } else if ( STRSTART( pattern, "anonymous" ) && flags == SLAP_LIMITS_TYPE_SELF ) { flags = SLAP_LIMITS_ANONYMOUS; pattern = NULL; } else { /* force error below */ if ( *pattern == '=' ) --pattern; } } /* pre-check the data */ if ( pattern != NULL ) { if ( pattern[0] != '=' ) { Debug( LDAP_DEBUG_ANY, "%s : line %d: %s in " "\"dn[.{this|self}][.{exact|base" "|onelevel|subtree|children|regex" "|anonymous}]=<pattern>\" in " "\"limits <pattern> <limits>\" line.\n", fname, lineno, isalnum( (unsigned char)pattern[0] ) ? "unknown DN modifier" : "missing '='" ); return( -1 ); } /* skip '=' (required) */ pattern++; /* trim obvious cases */ if ( strcmp( pattern, "*" ) == 0 ) { flags = SLAP_LIMITS_ANY; pattern = NULL; } else if ( (flags & SLAP_LIMITS_MASK) == SLAP_LIMITS_REGEX && strcmp( pattern, ".*" ) == 0 ) { flags = SLAP_LIMITS_ANY; pattern = NULL; } } } else if (STRSTART( pattern, "group" ) ) { pattern += STRLENOF( "group" ); if ( pattern[0] == '/' ) { struct berval oc, ad; oc.bv_val = pattern + 1; pattern = strchr( pattern, '=' ); if ( pattern == NULL ) { return -1; } ad.bv_val = strchr( oc.bv_val, '/' ); if ( ad.bv_val != NULL ) { const char *text = NULL; oc.bv_len = ad.bv_val - oc.bv_val; ad.bv_val++; ad.bv_len = pattern - ad.bv_val; rc = slap_bv2ad( &ad, &group_ad, &text ); if ( rc != LDAP_SUCCESS ) { goto no_ad; } } else { oc.bv_len = pattern - oc.bv_val; } group_oc = oc_bvfind( &oc ); if ( group_oc == NULL ) { goto no_oc; } } if ( group_oc == NULL ) { group_oc = oc_find( SLAPD_GROUP_CLASS ); if ( group_oc == NULL ) { no_oc:; return( -1 ); } } if ( group_ad == NULL ) { const char *text = NULL; rc = slap_str2ad( SLAPD_GROUP_ATTR, &group_ad, &text ); if ( rc != LDAP_SUCCESS ) { no_ad:; return( -1 ); } } flags = SLAP_LIMITS_TYPE_GROUP | SLAP_LIMITS_EXACT; if ( pattern[0] != '=' ) { Debug( LDAP_DEBUG_ANY, "%s : line %d: missing '=' in " "\"group[/objectClass[/attributeType]]" "=<pattern>\" in " "\"limits <pattern> <limits>\" line.\n", fname, lineno, 0 ); return( -1 ); } /* skip '=' (required) */ pattern++; } /* get the limits */ for ( i = 2; i < argc; i++ ) { if ( limits_parse_one( argv[i], &limit ) ) { Debug( LDAP_DEBUG_ANY, "%s : line %d: unknown limit values \"%s\" in " "\"limits <pattern> <limits>\" line.\n", fname, lineno, argv[i] ); return( 1 ); } } /* * sanity checks ... * * FIXME: add warnings? */ if ( limit.lms_t_hard > 0 && ( limit.lms_t_hard < limit.lms_t_soft || limit.lms_t_soft == -1 ) ) { limit.lms_t_hard = limit.lms_t_soft; } if ( limit.lms_s_hard > 0 && ( limit.lms_s_hard < limit.lms_s_soft || limit.lms_s_soft == -1 ) ) { limit.lms_s_hard = limit.lms_s_soft; } /* * defaults ... * * lms_t_hard: * -1 => no limits * 0 => same as soft * > 0 => limit (in seconds) * * lms_s_hard: * -1 => no limits * 0 0> same as soft * > 0 => limit (in entries) * * lms_s_pr_total: * -2 => disable the control * -1 => no limits * 0 => same as soft * > 0 => limit (in entries) * * lms_s_pr: * -1 => no limits * 0 => no limits? * > 0 => limit size (in entries) */ if ( limit.lms_s_pr_total > 0 && limit.lms_s_pr > limit.lms_s_pr_total ) { limit.lms_s_pr = limit.lms_s_pr_total; } rc = limits_add( be, flags, pattern, group_oc, group_ad, &limit ); if ( rc ) { Debug( LDAP_DEBUG_ANY, "%s : line %d: unable to add limit in " "\"limits <pattern> <limits>\" line.\n", fname, lineno, 0 ); } return( rc ); }
static int autoca_cf( ConfigArgs *c ) { slap_overinst *on = (slap_overinst *)c->bi; autoca_info *ai = on->on_bi.bi_private; int rc = 0; switch( c->op ) { case SLAP_CONFIG_EMIT: switch( c->type ) { case ACA_USRCLASS: if ( ai->ai_usrclass ) { c->value_string = ch_strdup( ai->ai_usrclass->soc_cname.bv_val ); } else { rc = 1; } break; case ACA_SRVCLASS: if ( ai->ai_srvclass ) { c->value_string = ch_strdup( ai->ai_srvclass->soc_cname.bv_val ); } else { rc = 1; } break; case ACA_USRKEYBITS: c->value_int = ai->ai_usrkeybits; break; case ACA_SRVKEYBITS: c->value_int = ai->ai_srvkeybits; break; case ACA_CAKEYBITS: c->value_int = ai->ai_cakeybits; break; case ACA_USRDAYS: c->value_int = ai->ai_usrdays; break; case ACA_SRVDAYS: c->value_int = ai->ai_srvdays; break; case ACA_CADAYS: c->value_int = ai->ai_cadays; break; case ACA_LOCALDN: if ( !BER_BVISNULL( &ai->ai_localdn )) { rc = value_add_one( &c->rvalue_vals, &ai->ai_localdn ); } else { rc = 1; } break; } break; case LDAP_MOD_DELETE: switch( c->type ) { case ACA_USRCLASS: ai->ai_usrclass = NULL; break; case ACA_SRVCLASS: ai->ai_srvclass = NULL; break; case ACA_LOCALDN: if ( ai->ai_localdn.bv_val ) { ch_free( ai->ai_localdn.bv_val ); ch_free( ai->ai_localndn.bv_val ); BER_BVZERO( &ai->ai_localdn ); BER_BVZERO( &ai->ai_localndn ); } break; /* single-valued attrs, all no-ops */ } break; case SLAP_CONFIG_ADD: case LDAP_MOD_ADD: switch( c->type ) { case ACA_USRCLASS: { ObjectClass *oc = oc_find( c->value_string ); if ( oc ) ai->ai_usrclass = oc; else rc = 1; } break; case ACA_SRVCLASS: { ObjectClass *oc = oc_find( c->value_string ); if ( oc ) ai->ai_srvclass = oc; else rc = 1; } case ACA_USRKEYBITS: if ( c->value_int < MIN_KEYBITS ) rc = 1; else ai->ai_usrkeybits = c->value_int; break; case ACA_SRVKEYBITS: if ( c->value_int < MIN_KEYBITS ) rc = 1; else ai->ai_srvkeybits = c->value_int; break; case ACA_CAKEYBITS: if ( c->value_int < MIN_KEYBITS ) rc = 1; else ai->ai_cakeybits = c->value_int; break; case ACA_USRDAYS: ai->ai_usrdays = c->value_int; break; case ACA_SRVDAYS: ai->ai_srvdays = c->value_int; break; case ACA_CADAYS: ai->ai_cadays = c->value_int; break; case ACA_LOCALDN: if ( c->be->be_nsuffix == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "suffix must be set" ); Debug( LDAP_DEBUG_CONFIG, "autoca_config: %s\n", c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } if ( !dnIsSuffix( &c->value_ndn, c->be->be_nsuffix )) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "DN is not a subordinate of backend" ); Debug( LDAP_DEBUG_CONFIG, "autoca_config: %s\n", c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } if ( ai->ai_localdn.bv_val ) { ch_free( ai->ai_localdn.bv_val ); ch_free( ai->ai_localndn.bv_val ); } ai->ai_localdn = c->value_dn; ai->ai_localndn = c->value_ndn; } } return rc; }
static int dl_cfgen( ConfigArgs *c ) { slap_overinst *on = (slap_overinst *)c->bi; dynlist_info_t *dli = (dynlist_info_t *)on->on_bi.bi_private; int rc = 0, i; if ( c->op == SLAP_CONFIG_EMIT ) { switch( c->type ) { case DL_ATTRSET: for ( i = 0; dli; i++, dli = dli->dli_next ) { struct berval bv; char *ptr = c->cr_msg; dynlist_map_t *dlm; assert( dli->dli_oc != NULL ); assert( dli->dli_ad != NULL ); /* FIXME: check buffer overflow! */ ptr += snprintf( c->cr_msg, sizeof( c->cr_msg ), SLAP_X_ORDERED_FMT "%s", i, dli->dli_oc->soc_cname.bv_val ); if ( !BER_BVISNULL( &dli->dli_uri ) ) { *ptr++ = ' '; *ptr++ = '"'; ptr = lutil_strncopy( ptr, dli->dli_uri.bv_val, dli->dli_uri.bv_len ); *ptr++ = '"'; } *ptr++ = ' '; ptr = lutil_strncopy( ptr, dli->dli_ad->ad_cname.bv_val, dli->dli_ad->ad_cname.bv_len ); for ( dlm = dli->dli_dlm; dlm; dlm = dlm->dlm_next ) { ptr[ 0 ] = ' '; ptr++; if ( dlm->dlm_mapped_ad ) { ptr = lutil_strcopy( ptr, dlm->dlm_mapped_ad->ad_cname.bv_val ); ptr[ 0 ] = ':'; ptr++; } ptr = lutil_strcopy( ptr, dlm->dlm_member_ad->ad_cname.bv_val ); } bv.bv_val = c->cr_msg; bv.bv_len = ptr - bv.bv_val; value_add_one( &c->rvalue_vals, &bv ); } break; case DL_ATTRPAIR_COMPAT: case DL_ATTRPAIR: rc = 1; break; default: rc = 1; break; } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { switch( c->type ) { case DL_ATTRSET: if ( c->valx < 0 ) { dynlist_info_t *dli_next; for ( dli_next = dli; dli_next; dli = dli_next ) { dynlist_map_t *dlm = dli->dli_dlm; dynlist_map_t *dlm_next; dli_next = dli->dli_next; if ( !BER_BVISNULL( &dli->dli_uri ) ) { ch_free( dli->dli_uri.bv_val ); } if ( dli->dli_lud != NULL ) { ldap_free_urldesc( dli->dli_lud ); } if ( !BER_BVISNULL( &dli->dli_uri_nbase ) ) { ber_memfree( dli->dli_uri_nbase.bv_val ); } if ( dli->dli_uri_filter != NULL ) { filter_free( dli->dli_uri_filter ); } ch_free( dli->dli_default_filter.bv_val ); while ( dlm != NULL ) { dlm_next = dlm->dlm_next; ch_free( dlm ); dlm = dlm_next; } ch_free( dli ); } on->on_bi.bi_private = NULL; } else { dynlist_info_t **dlip; dynlist_map_t *dlm; dynlist_map_t *dlm_next; for ( i = 0, dlip = (dynlist_info_t **)&on->on_bi.bi_private; i < c->valx; i++ ) { if ( *dlip == NULL ) { return 1; } dlip = &(*dlip)->dli_next; } dli = *dlip; *dlip = dli->dli_next; if ( !BER_BVISNULL( &dli->dli_uri ) ) { ch_free( dli->dli_uri.bv_val ); } if ( dli->dli_lud != NULL ) { ldap_free_urldesc( dli->dli_lud ); } if ( !BER_BVISNULL( &dli->dli_uri_nbase ) ) { ber_memfree( dli->dli_uri_nbase.bv_val ); } if ( dli->dli_uri_filter != NULL ) { filter_free( dli->dli_uri_filter ); } ch_free( dli->dli_default_filter.bv_val ); dlm = dli->dli_dlm; while ( dlm != NULL ) { dlm_next = dlm->dlm_next; ch_free( dlm ); dlm = dlm_next; } ch_free( dli ); dli = (dynlist_info_t *)on->on_bi.bi_private; } break; case DL_ATTRPAIR_COMPAT: case DL_ATTRPAIR: rc = 1; break; default: rc = 1; break; } return rc; } switch( c->type ) { case DL_ATTRSET: { dynlist_info_t **dlip, *dli_next = NULL; ObjectClass *oc = NULL; AttributeDescription *ad = NULL; int attridx = 2; LDAPURLDesc *lud = NULL; struct berval nbase = BER_BVNULL; Filter *filter = NULL; struct berval uri = BER_BVNULL; dynlist_map_t *dlm = NULL, *dlml = NULL; const char *text; oc = oc_find( c->argv[ 1 ] ); if ( oc == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find ObjectClass \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } if ( strncasecmp( c->argv[ attridx ], "ldap://", STRLENOF("ldap://") ) == 0 ) { if ( ldap_url_parse( c->argv[ attridx ], &lud ) != LDAP_URL_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to parse URI \"%s\"", c->argv[ attridx ] ); rc = 1; goto done_uri; } if ( lud->lud_host != NULL ) { if ( lud->lud_host[0] == '\0' ) { ch_free( lud->lud_host ); lud->lud_host = NULL; } else { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "host not allowed in URI \"%s\"", c->argv[ attridx ] ); rc = 1; goto done_uri; } } if ( lud->lud_attrs != NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "attrs not allowed in URI \"%s\"", c->argv[ attridx ] ); rc = 1; goto done_uri; } if ( lud->lud_exts != NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "extensions not allowed in URI \"%s\"", c->argv[ attridx ] ); rc = 1; goto done_uri; } if ( lud->lud_dn != NULL && lud->lud_dn[ 0 ] != '\0' ) { struct berval dn; ber_str2bv( lud->lud_dn, 0, 0, &dn ); rc = dnNormalize( 0, NULL, NULL, &dn, &nbase, NULL ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "DN normalization failed in URI \"%s\"", c->argv[ attridx ] ); goto done_uri; } } if ( lud->lud_filter != NULL && lud->lud_filter[ 0 ] != '\0' ) { filter = str2filter( lud->lud_filter ); if ( filter == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "filter parsing failed in URI \"%s\"", c->argv[ attridx ] ); rc = 1; goto done_uri; } } ber_str2bv( c->argv[ attridx ], 0, 1, &uri ); done_uri:; if ( rc ) { if ( lud ) { ldap_free_urldesc( lud ); } if ( !BER_BVISNULL( &nbase ) ) { ber_memfree( nbase.bv_val ); } if ( filter != NULL ) { filter_free( filter ); } while ( dlm != NULL ) { dlml = dlm; dlm = dlm->dlm_next; ch_free( dlml ); } Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return rc; } attridx++; } rc = slap_str2ad( c->argv[ attridx ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find AttributeDescription \"%s\"", c->argv[ attridx ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); rc = 1; goto done_uri; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"", c->argv[ attridx ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); rc = 1; goto done_uri; } attridx++; for ( i = attridx; i < c->argc; i++ ) { char *arg; char *cp; AttributeDescription *member_ad = NULL; AttributeDescription *mapped_ad = NULL; dynlist_map_t *dlmp; /* * If no mapped attribute is given, dn is used * for backward compatibility. */ arg = c->argv[i]; if ( ( cp = strchr( arg, ':' ) ) != NULL ) { struct berval bv; ber_str2bv( arg, cp - arg, 0, &bv ); rc = slap_bv2ad( &bv, &mapped_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find mapped AttributeDescription #%d \"%s\"\n", i - 3, c->argv[ i ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); rc = 1; goto done_uri; } arg = cp + 1; } rc = slap_str2ad( arg, &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find AttributeDescription #%d \"%s\"\n", i - 3, c->argv[ i ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); rc = 1; goto done_uri; } dlmp = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) ); if ( dlm == NULL ) { dlm = dlmp; } dlmp->dlm_member_ad = member_ad; dlmp->dlm_mapped_ad = mapped_ad; dlmp->dlm_next = NULL; if ( dlml != NULL ) dlml->dlm_next = dlmp; dlml = dlmp; } if ( c->valx > 0 ) { int i; for ( i = 0, dlip = (dynlist_info_t **)&on->on_bi.bi_private; i < c->valx; i++ ) { if ( *dlip == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "invalid index {%d}\n", c->valx ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); rc = 1; goto done_uri; } dlip = &(*dlip)->dli_next; } dli_next = *dlip; } else { for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) /* goto last */; } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_dlm = dlm; (*dlip)->dli_next = dli_next; (*dlip)->dli_lud = lud; (*dlip)->dli_uri_nbase = nbase; (*dlip)->dli_uri_filter = filter; (*dlip)->dli_uri = uri; rc = dynlist_build_def_filter( *dlip ); } break; case DL_ATTRPAIR_COMPAT: snprintf( c->cr_msg, sizeof( c->cr_msg ), "warning: \"attrpair\" only supported for limited " "backward compatibility with overlay \"dyngroup\"" ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); /* fallthru */ case DL_ATTRPAIR: { dynlist_info_t **dlip; ObjectClass *oc = NULL; AttributeDescription *ad = NULL, *member_ad = NULL; const char *text; oc = oc_find( "groupOfURLs" ); if ( oc == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find default ObjectClass \"groupOfURLs\"" ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 1 ], &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 2 ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"\n", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) { /* * The same URL attribute / member attribute pair * cannot be repeated, but we enforce this only * when the member attribute is unique. Performing * the check for multiple values would require * sorting and comparing the lists, which is left * as a future improvement */ if ( (*dlip)->dli_ad == ad && (*dlip)->dli_dlm->dlm_next == NULL && member_ad == (*dlip)->dli_dlm->dlm_member_ad ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "URL attributeDescription \"%s\" already mapped.\n", ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); #if 0 /* make it a warning... */ return 1; #endif } } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_dlm = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) ); (*dlip)->dli_dlm->dlm_member_ad = member_ad; (*dlip)->dli_dlm->dlm_mapped_ad = NULL; rc = dynlist_build_def_filter( *dlip ); } break; default: rc = 1; break; } return rc; }
static int dynlist_db_open( BackendDB *be, ConfigReply *cr ) { slap_overinst *on = (slap_overinst *) be->bd_info; dynlist_info_t *dli = (dynlist_info_t *)on->on_bi.bi_private; ObjectClass *oc = NULL; AttributeDescription *ad = NULL; const char *text; int rc; if ( dli == NULL ) { dli = ch_calloc( 1, sizeof( dynlist_info_t ) ); on->on_bi.bi_private = (void *)dli; } for ( ; dli; dli = dli->dli_next ) { if ( dli->dli_oc == NULL ) { if ( oc == NULL ) { oc = oc_find( "groupOfURLs" ); if ( oc == NULL ) { snprintf( cr->msg, sizeof( cr->msg), "unable to fetch objectClass \"groupOfURLs\"" ); Debug( LDAP_DEBUG_ANY, "dynlist_db_open: %s.\n", cr->msg, 0, 0 ); return 1; } } dli->dli_oc = oc; } if ( dli->dli_ad == NULL ) { if ( ad == NULL ) { rc = slap_str2ad( "memberURL", &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( cr->msg, sizeof( cr->msg), "unable to fetch attributeDescription \"memberURL\": %d (%s)", rc, text ); Debug( LDAP_DEBUG_ANY, "dynlist_db_open: %s.\n", cr->msg, 0, 0 ); return 1; } } dli->dli_ad = ad; } if ( BER_BVISNULL( &dli->dli_default_filter ) ) { rc = dynlist_build_def_filter( dli ); if ( rc != 0 ) { return rc; } } } if ( ad_dgIdentity == NULL ) { rc = slap_str2ad( "dgIdentity", &ad_dgIdentity, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( cr->msg, sizeof( cr->msg), "unable to fetch attributeDescription \"dgIdentity\": %d (%s)", rc, text ); Debug( LDAP_DEBUG_ANY, "dynlist_db_open: %s\n", cr->msg, 0, 0 ); /* Just a warning */ } } if ( ad_dgAuthz == NULL ) { rc = slap_str2ad( "dgAuthz", &ad_dgAuthz, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( cr->msg, sizeof( cr->msg), "unable to fetch attributeDescription \"dgAuthz\": %d (%s)", rc, text ); Debug( LDAP_DEBUG_ANY, "dynlist_db_open: %s\n", cr->msg, 0, 0 ); /* Just a warning */ } } return 0; }
static int idattr_dynacl_parse( const char *fname, int lineno, const char *opts, slap_style_t style, const char *pattern, void **privp ) { idattr_t *id; int rc; const char *text = NULL; id = ch_calloc( 1, sizeof( idattr_t ) ); id->idattr_style = style; idattr_dynacl_parse_ops(opts, id); switch ( id->idattr_style ) { case ACL_STYLE_BASE: case ACL_STYLE_EXPAND: ber_str2bv( pattern, 0, 1, &id->idattr_pat ); break; default: fprintf( stderr, "%s line %d: idattr ACL: " "unsupported style \"%s\".\n", fname, lineno, style_strings[ id->idattr_style ] ); goto cleanup; } if (strncmp("S-1",pattern, 3) == 0) { id->idattr_type = SID_TYPE; } else if (strcmp("OWNER",pattern) == 0) { id->idattr_type = OWNER_TYPE; } else if (strcmp("USERS",pattern) == 0) { id->idattr_type = USERS_TYPE; } else if (strcmp("SELFWRITE",pattern) == 0) { id->idattr_type = SELFWRITE_TYPE; } if (idattr_posixGroup == NULL) { idattr_posixGroup = oc_find( "posixGroup" ); if ( idattr_posixGroup == NULL ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"posixGroup\" " "objectClass.\n", fname, lineno ); goto cleanup; } } if (idattr_posixAccount == NULL) { idattr_posixAccount = oc_find( "posixAccount" ); if ( idattr_posixGroup == NULL ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"posixAccount\" " "objectClass.\n", fname, lineno ); goto cleanup; } } if (idattr_apple_user == NULL) { idattr_apple_user = oc_find( "apple-user" ); if ( idattr_apple_user == NULL ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"apple-user\" " "objectClass.\n", fname, lineno ); goto cleanup; } } if (idattr_extensible_object == NULL) { idattr_extensible_object = oc_find( "extensibleObject" ); if ( idattr_extensible_object == NULL ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"extensibleObject\" " "objectClass.\n", fname, lineno ); goto cleanup; } } if (idattr_memberUid == NULL) { rc = slap_str2ad( "memberUid", &idattr_memberUid, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"memberUid\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } if (idattr_uidNumber == NULL) { rc = slap_str2ad( "uidNumber", &idattr_uidNumber, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"uidNumber\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } if (idattr_uuid == NULL) { rc = slap_str2ad( "apple-generateduid", &idattr_uuid, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"apple-generateduid\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } if (idattr_owneruuid == NULL) { rc = slap_str2ad( "apple-ownerguid", &idattr_owneruuid, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"apple-ownerguid\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } if (idattr_sid == NULL) { rc = slap_str2ad( "sambaSID", &idattr_sid, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"sambaSID\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } if (idattr_memberships == NULL) { rc = slap_str2ad( "apple-group-memberguid", &idattr_memberships, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"memberships\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } #ifdef USES_EXPANDED_MEMBERSHIPS if (idattr_expandedmemberships == NULL) { rc = slap_str2ad( "apple-group-expandednestedgroup", &idattr_expandedmemberships, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup \"memberships\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } #endif if (id->idattr_type == SELFWRITE_TYPE ) { if (!BER_BVISNULL( &id->idattr_selfattr)) { rc = slap_str2ad( id->idattr_selfattr.bv_val, &id->idattr_selfattrDesc, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup SELFATTR \"%s\" " "attributeDescription (%d: %s).\n", fname, lineno, id->idattr_selfattr.bv_val, rc, text ); goto cleanup; } } else { fprintf( stderr, "%s line %d: idattr ACL: SELFATTR required for SELFWRITE - dynacl/idattr/SELFATTR:<ATTRIBUTE>.exact=SELFWRITE", fname, lineno); goto cleanup; } } if (!BER_BVISNULL( &id->idattr_boolattr)) { rc = slap_str2ad( id->idattr_boolattr.bv_val, &id->idattr_boolattrDesc, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: idattr ACL: " "unable to lookup BOOLATTR \"%s\" " "attributeDescription (%d: %s).\n", fname, lineno, id->idattr_boolattr.bv_val, rc, text ); goto cleanup; } } *privp = (void *)id; return 0; cleanup: (void)idattr_dynacl_destroy( (void *)id ); return 1; }
static int pg_dynacl_parse( const char *fname, int lineno, const char *opts, slap_style_t style, const char *pattern, void **privp ) { pg_t *pg; int rc; const char *text = NULL; struct berval pat; ber_str2bv( pattern, 0, 0, &pat ); pg = ch_calloc( 1, sizeof( pg_t ) ); pg->pg_style = style; switch ( pg->pg_style ) { case ACL_STYLE_BASE: rc = dnNormalize( 0, NULL, NULL, &pat, &pg->pg_pat, NULL ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: posixGroup ACL: " "unable to normalize DN \"%s\".\n", fname, lineno, pattern ); goto cleanup; } break; case ACL_STYLE_EXPAND: ber_dupbv( &pg->pg_pat, &pat ); break; default: fprintf( stderr, "%s line %d: posixGroup ACL: " "unsupported style \"%s\".\n", fname, lineno, style_strings[ pg->pg_style ] ); goto cleanup; } /* TODO: use opts to allow the use of different * group objects and member attributes */ if ( pg_posixGroup == NULL ) { pg_posixGroup = oc_find( "posixGroup" ); if ( pg_posixGroup == NULL ) { fprintf( stderr, "%s line %d: posixGroup ACL: " "unable to lookup \"posixGroup\" " "objectClass.\n", fname, lineno ); goto cleanup; } pg_posixAccount = oc_find( "posixAccount" ); if ( pg_posixGroup == NULL ) { fprintf( stderr, "%s line %d: posixGroup ACL: " "unable to lookup \"posixAccount\" " "objectClass.\n", fname, lineno ); goto cleanup; } rc = slap_str2ad( "memberUid", &pg_memberUid, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: posixGroup ACL: " "unable to lookup \"memberUid\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } rc = slap_str2ad( "uidNumber", &pg_uidNumber, &text ); if ( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s line %d: posixGroup ACL: " "unable to lookup \"uidNumber\" " "attributeDescription (%d: %s).\n", fname, lineno, rc, text ); goto cleanup; } } *privp = (void *)pg; return 0; cleanup: (void)pg_dynacl_destroy( (void *)pg ); return 1; }
static int ag_cfgen( ConfigArgs *c ) { slap_overinst *on = (slap_overinst *)c->bi; autogroup_info_t *agi = (autogroup_info_t *)on->on_bi.bi_private; autogroup_def_t *agd; autogroup_entry_t *age; int rc = 0, i; Debug( LDAP_DEBUG_TRACE, "==> autogroup_cfgen\n", 0, 0, 0); if( agi == NULL ) { agi = (autogroup_info_t*)ch_calloc( 1, sizeof(autogroup_info_t) ); ldap_pvt_thread_mutex_init( &agi->agi_mutex ); agi->agi_def = NULL; agi->agi_entry = NULL; on->on_bi.bi_private = (void *)agi; } agd = agi->agi_def; age = agi->agi_entry; if ( c->op == SLAP_CONFIG_EMIT ) { ldap_pvt_thread_mutex_lock( &agi->agi_mutex ); for ( i = 0 ; agd ; i++, agd = agd->agd_next ) { struct berval bv; char *ptr = c->cr_msg; assert(agd->agd_oc != NULL); assert(agd->agd_member_url_ad != NULL); assert(agd->agd_member_ad != NULL); ptr += snprintf( c->cr_msg, sizeof( c->cr_msg ), SLAP_X_ORDERED_FMT "%s %s %s", i, agd->agd_oc->soc_cname.bv_val, agd->agd_member_url_ad->ad_cname.bv_val, agd->agd_member_ad->ad_cname.bv_val ); bv.bv_val = c->cr_msg; bv.bv_len = ptr - bv.bv_val; value_add_one ( &c->rvalue_vals, &bv ); } ldap_pvt_thread_mutex_unlock( &agi->agi_mutex ); return rc; }else if ( c->op == LDAP_MOD_DELETE ) { if ( c->valx < 0) { autogroup_def_t *agd_next; autogroup_entry_t *age_next; autogroup_filter_t *agf = age->age_filter, *agf_next; ldap_pvt_thread_mutex_lock( &agi->agi_mutex ); for ( agd_next = agd; agd_next; agd = agd_next ) { agd_next = agd->agd_next; ch_free( agd ); } for ( age_next = age ; age_next ; age = age_next ) { age_next = age->age_next; ch_free( age->age_dn.bv_val ); ch_free( age->age_ndn.bv_val ); for( agf_next = agf ; agf_next ; agf = agf_next ){ agf_next = agf->agf_next; filter_free( agf->agf_filter ); ch_free( agf->agf_filterstr.bv_val ); ch_free( agf->agf_dn.bv_val ); ch_free( agf->agf_ndn.bv_val ); } ldap_pvt_thread_mutex_init( &age->age_mutex ); ch_free( age ); } ldap_pvt_thread_mutex_unlock( &agi->agi_mutex ); ldap_pvt_thread_mutex_destroy( &agi->agi_mutex ); ch_free( agi ); on->on_bi.bi_private = NULL; } else { autogroup_def_t **agdp; autogroup_entry_t *age_next, *age_prev; autogroup_filter_t *agf, *agf_next; ldap_pvt_thread_mutex_lock( &agi->agi_mutex ); for ( i = 0, agdp = &agi->agi_def; i < c->valx; i++ ) { if ( *agdp == NULL) { return 1; } agdp = &(*agdp)->agd_next; } agd = *agdp; *agdp = agd->agd_next; for ( age_next = age , age_prev = NULL ; age_next ; age_prev = age, age = age_next ) { age_next = age->age_next; if( age->age_def == agd ) { agf = age->age_filter; ch_free( age->age_dn.bv_val ); ch_free( age->age_ndn.bv_val ); for ( agf_next = agf; agf_next ; agf = agf_next ) { agf_next = agf->agf_next; filter_free( agf->agf_filter ); ch_free( agf->agf_filterstr.bv_val ); ch_free( agf->agf_dn.bv_val ); ch_free( agf->agf_ndn.bv_val ); } ldap_pvt_thread_mutex_destroy( &age->age_mutex ); ch_free( age ); age = age_prev; if( age_prev != NULL ) { age_prev->age_next = age_next; } } } ch_free( agd ); agd = agi->agi_def; ldap_pvt_thread_mutex_unlock( &agi->agi_mutex ); } return rc; } switch(c->type){ case AG_ATTRSET: { autogroup_def_t **agdp, *agd_next = NULL; ObjectClass *oc = NULL; AttributeDescription *member_url_ad = NULL, *member_ad = NULL; const char *text; oc = oc_find( c->argv[ 1 ] ); if( oc == NULL ){ snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"autogroup-attrset <oc> <URL-ad> <member-ad>\": " "unable to find ObjectClass \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 2 ], &member_url_ad, &text ); if( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"autogroup-attrset <oc> <URL-ad> <member-ad>\": " "unable to find AttributeDescription \"%s\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } if( !is_at_subtype( member_url_ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"autogroup-attrset <oc> <URL-ad> <member-ad>\": " "AttributeDescription \"%s\" ", "must be of a subtype \"labeledURI\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[3], &member_ad, &text ); if( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"autogroup-attrset <oc> <URL-ad> <member-ad>\": " "unable to find AttributeDescription \"%s\"", c->argv[ 3 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } ldap_pvt_thread_mutex_lock( &agi->agi_mutex ); for ( agdp = &agi->agi_def ; *agdp ; agdp = &(*agdp)->agd_next ) { /* The same URL attribute / member attribute pair * cannot be repeated */ if ( (*agdp)->agd_member_url_ad == member_url_ad && (*agdp)->agd_member_ad == member_ad ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"autogroup-attrset <oc> <URL-ad> <member-ad>\": " "URL attributeDescription \"%s\" already mapped", member_ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); /* return 1; //warning*/ } } if ( c->valx > 0 ) { int i; for ( i = 0, agdp = &agi->agi_def ; i < c->valx; i++ ) { if ( *agdp == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"autogroup-attrset <oc> <URL-ad> <member-ad>\": " "invalid index {%d}", c->valx ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); ldap_pvt_thread_mutex_unlock( &agi->agi_mutex ); return 1; } agdp = &(*agdp)->agd_next; } agd_next = *agdp; } else { for ( agdp = &agi->agi_def; *agdp; agdp = &(*agdp)->agd_next ) /* goto last */; } *agdp = (autogroup_def_t *)ch_calloc( 1, sizeof(autogroup_info_t)); (*agdp)->agd_oc = oc; (*agdp)->agd_member_url_ad = member_url_ad; (*agdp)->agd_member_ad = member_ad; (*agdp)->agd_next = agd_next; ldap_pvt_thread_mutex_unlock( &agi->agi_mutex ); } break; default: rc = 1; break; } return rc; }
static int cloak_cfgen( ConfigArgs *c ) { slap_overinst *on = (slap_overinst *)c->bi; cloak_info_t *ci = (cloak_info_t *)on->on_bi.bi_private; int rc = 0, i; if ( c->op == SLAP_CONFIG_EMIT ) { switch( c->type ) { case CLOAK_ATTR: for ( i = 0; ci; i++, ci = ci->ci_next ) { struct berval bv; int len; assert( ci->ci_ad != NULL ); if ( ci->ci_oc != NULL ) len = snprintf( c->cr_msg, sizeof( c->cr_msg ), SLAP_X_ORDERED_FMT "%s %s", i, ci->ci_ad->ad_cname.bv_val, ci->ci_oc->soc_cname.bv_val ); else len = snprintf( c->cr_msg, sizeof( c->cr_msg ), SLAP_X_ORDERED_FMT "%s", i, ci->ci_ad->ad_cname.bv_val ); bv.bv_val = c->cr_msg; bv.bv_len = len; value_add_one( &c->rvalue_vals, &bv ); } break; default: rc = 1; break; } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { cloak_info_t *ci_next; switch( c->type ) { case CLOAK_ATTR: for ( ci_next = ci, i = 0; ci_next, c->valx < 0 || i < c->valx; ci = ci_next, i++ ){ ci_next = ci->ci_next; ch_free ( ci->ci_ad ); if ( ci->ci_oc != NULL ) ch_free ( ci->ci_oc ); ch_free( ci ); } ci = (cloak_info_t *)on->on_bi.bi_private; break; default: rc = 1; break; } return rc; } switch( c->type ) { case CLOAK_ATTR: { ObjectClass *oc = NULL; AttributeDescription *ad = NULL; const char *text; cloak_info_t **cip = NULL; cloak_info_t *ci_next = NULL; if ( c->argc == 3 ) { oc = oc_find( c->argv[ 2 ] ); if ( oc == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), CLOAK_USAGE "unable to find ObjectClass \"%s\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } } rc = slap_str2ad( c->argv[ 1 ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), CLOAK_USAGE "unable to find AttributeDescription \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } for ( i = 0, cip = (cloak_info_t **)&on->on_bi.bi_private; c->valx < 0 || i < c->valx, *cip; i++, cip = &(*cip)->ci_next ) { if ( c->valx >= 0 && *cip == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), CLOAK_USAGE "invalid index {%d}\n", c->valx ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } ci_next = *cip; } *cip = (cloak_info_t *)SLAP_CALLOC( 1, sizeof( cloak_info_t ) ); (*cip)->ci_oc = oc; (*cip)->ci_ad = ad; (*cip)->ci_next = ci_next; rc = 0; break; } default: rc = 1; break; } return rc; }
static int dynlist_db_config( BackendDB *be, const char *fname, int lineno, int argc, char **argv ) { slap_overinst *on = (slap_overinst *)be->bd_info; int rc = 0; if ( strcasecmp( argv[0], "dynlist-attrset" ) == 0 ) { dynlist_info_t **dlip; ObjectClass *oc; AttributeDescription *ad = NULL, *member_ad = NULL; dynlist_map_t *dlm = NULL; const char *text; if ( argc < 3 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "invalid arg number #%d.\n", fname, lineno, argc ); return 1; } oc = oc_find( argv[1] ); if ( oc == NULL ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "unable to find ObjectClass \"%s\"\n", fname, lineno, argv[ 1 ] ); return 1; } rc = slap_str2ad( argv[2], &ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "unable to find AttributeDescription \"%s\"\n", fname, lineno, argv[2] ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"\n", fname, lineno, argv[2] ); return 1; } for ( i = 3; i < argc; i++ ) { char *arg; char *cp; AttributeDescription *member_ad = NULL; AttributeDescription *mapped_ad = NULL; dynlist_map_t *dlmp; dynlist_map_t *dlml; /* * If no mapped attribute is given, dn is used * for backward compatibility. */ arg = argv[i]; if ( cp = strchr( arg, (int)':' ) != NULL ) { struct berval bv; ber_str2bv( arg, cp - arg, 0, &bv ); rc = slap_bv2ad( &bv, &mapped_ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "unable to find mapped AttributeDescription \"%s\"\n", fname, lineno, arg ); return 1; } arg = cp + 1; } rc = slap_str2ad( arg, &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "unable to find AttributeDescription \"%s\"\n", fname, lineno, arg ); return 1; } dlmp = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) ); if ( dlm == NULL ) { dlm = dlmp; dlml = NULL; } dlmp->dlm_member_ad = member_ad; dlmp->dlm_mapped_ad = mapped_ad; dlmp->dlm_next = NULL; if ( dlml != NULL ) dlml->dlm_next = dlmp; dlml = dlmp; } for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) { /* * The same URL attribute / member attribute pair * cannot be repeated, but we enforce this only * when the member attribute is unique. Performing * the check for multiple values would require * sorting and comparing the lists, which is left * as a future improvement */ if ( (*dlip)->dli_ad == ad && (*dlip)->dli_dlm->dlm_next == NULL && dlm->dlm_next == NULL && dlm->dlm_member_ad == (*dlip)->dli_dlm->dlm_member_ad && dlm->dlm_mapped_ad == (*dlip)->dli_dlm->dlm_mapped_ad ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " DYNLIST_USAGE "URL attributeDescription \"%s\" already mapped.\n", fname, lineno, ad->ad_cname.bv_val ); #if 0 /* make it a warning... */ return 1; #endif } } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_dlm = dlm; if ( dynlist_build_def_filter( *dlip ) ) { dynlist_map_t *dlm = (*dlip)->ldi_dlm; dynlist_map_t *dlm_next; while ( dlm != NULL ) { dlm_next = dlm->dlm_next; ch_free( dlm ); dlm = dlm_next; } ch_free( *dlip ); *dlip = NULL; return 1; } /* allow dyngroup syntax */ } else if ( strcasecmp( argv[0], "dynlist-attrpair" ) == 0 ) { dynlist_info_t **dlip; ObjectClass *oc; AttributeDescription *ad = NULL, *member_ad = NULL; const char *text; if ( argc != 3 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " "\"dynlist-attrpair <member-ad> <URL-ad>\": " "invalid arg number #%d.\n", fname, lineno, argc ); return 1; } oc = oc_find( "groupOfURLs" ); if ( oc == NULL ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find default ObjectClass \"groupOfURLs\"\n", fname, lineno, 0 ); return 1; } rc = slap_str2ad( argv[1], &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"\n", fname, lineno, argv[1] ); return 1; } rc = slap_str2ad( argv[2], &ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"\n", fname, lineno, argv[2] ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " "\"dynlist-attrpair <member-ad> <URL-ad>\": " "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"\n", fname, lineno, argv[2] ); return 1; } for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) { /* * The same URL attribute / member attribute pair * cannot be repeated, but we enforce this only * when the member attribute is unique. Performing * the check for multiple values would require * sorting and comparing the lists, which is left * as a future improvement */ if ( (*dlip)->dli_ad == ad && (*dlip)->dli_dlm->dlm_next == NULL && member_ad == (*dlip)->dli_dlm->dlm_member_ad ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: " "\"dynlist-attrpair <member-ad> <URL-ad>\": " "URL attributeDescription \"%s\" already mapped.\n", fname, lineno, ad->ad_cname.bv_val ); #if 0 /* make it a warning... */ return 1; #endif } } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_dlm = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) ); (*dlip)->dli_dlm->dlm_member_ad = member_ad; (*dlip)->dli_dlm->dlm_mapped_ad = NULL; if ( dynlist_build_def_filter( *dlip ) ) { ch_free( (*dlip)->dli_dlm ); ch_free( *dlip ); *dlip = NULL; return 1; } } else { rc = SLAP_CONF_UNKNOWN; } return rc; }
static int dl_cfgen( ConfigArgs *c ) { slap_overinst *on = (slap_overinst *)c->bi; dynlist_info_t *dli = (dynlist_info_t *)on->on_bi.bi_private; int rc = 0, i; if ( c->op == SLAP_CONFIG_EMIT ) { switch( c->type ) { case DL_ATTRSET: for ( i = 0; dli; i++, dli = dli->dli_next ) { struct berval bv; char *ptr = c->cr_msg; dynlist_map_t *dlm; assert( dli->dli_oc != NULL ); assert( dli->dli_ad != NULL ); ptr += snprintf( c->cr_msg, sizeof( c->cr_msg ), SLAP_X_ORDERED_FMT "%s %s", i, dli->dli_oc->soc_cname.bv_val, dli->dli_ad->ad_cname.bv_val ); for ( dlm = dli->dli_dlm; dlm; dlm = dlm->dlm_next ) { ptr[ 0 ] = ' '; ptr++; if ( dlm->dlm_mapped_ad ) { ptr = lutil_strcopy( ptr, dlm->dlm_mapped_ad->ad_cname.bv_val ); ptr[ 0 ] = ':'; ptr++; } ptr = lutil_strcopy( ptr, dlm->dlm_member_ad->ad_cname.bv_val ); } bv.bv_val = c->cr_msg; bv.bv_len = ptr - bv.bv_val; value_add_one( &c->rvalue_vals, &bv ); } break; case DL_ATTRPAIR_COMPAT: case DL_ATTRPAIR: rc = 1; break; default: rc = 1; break; } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { switch( c->type ) { case DL_ATTRSET: if ( c->valx < 0 ) { dynlist_info_t *dli_next; for ( dli_next = dli; dli_next; dli = dli_next ) { dynlist_map_t *dlm = dli->dli_dlm; dynlist_map_t *dlm_next; dli_next = dli->dli_next; ch_free( dli->dli_default_filter.bv_val ); while ( dlm != NULL ) { dlm_next = dlm->dlm_next; ch_free( dlm ); dlm = dlm_next; } ch_free( dli ); } on->on_bi.bi_private = NULL; } else { dynlist_info_t **dlip; dynlist_map_t *dlm; dynlist_map_t *dlm_next; for ( i = 0, dlip = (dynlist_info_t **)&on->on_bi.bi_private; i < c->valx; i++ ) { if ( *dlip == NULL ) { return 1; } dlip = &(*dlip)->dli_next; } dli = *dlip; *dlip = dli->dli_next; ch_free( dli->dli_default_filter.bv_val ); dlm = dli->dli_dlm; while ( dlm != NULL ) { dlm_next = dlm->dlm_next; ch_free( dlm ); dlm = dlm_next; } ch_free( dli ); dli = (dynlist_info_t *)on->on_bi.bi_private; } break; case DL_ATTRPAIR_COMPAT: case DL_ATTRPAIR: rc = 1; break; default: rc = 1; break; } return rc; } switch( c->type ) { case DL_ATTRSET: { dynlist_info_t **dlip, *dli_next = NULL; ObjectClass *oc = NULL; AttributeDescription *ad = NULL; dynlist_map_t *dlm = NULL; const char *text; oc = oc_find( c->argv[ 1 ] ); if ( oc == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find ObjectClass \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 2 ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find AttributeDescription \"%s\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } for ( i = 3; i < c->argc; i++ ) { char *arg; char *cp; AttributeDescription *member_ad = NULL; AttributeDescription *mapped_ad = NULL; dynlist_map_t *dlmp; dynlist_map_t *dlml; /* * If no mapped attribute is given, dn is used * for backward compatibility. */ arg = c->argv[i]; if ( ( cp = strchr( arg, ':' ) ) != NULL ) { struct berval bv; ber_str2bv( arg, cp - arg, 0, &bv ); rc = slap_bv2ad( &bv, &mapped_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find mapped AttributeDescription #%d \"%s\"\n", i - 3, c->argv[ i ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } arg = cp + 1; } rc = slap_str2ad( arg, &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "unable to find AttributeDescription #%d \"%s\"\n", i - 3, c->argv[ i ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } dlmp = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) ); if ( dlm == NULL ) { dlm = dlmp; dlml = NULL; } dlmp->dlm_member_ad = member_ad; dlmp->dlm_mapped_ad = mapped_ad; dlmp->dlm_next = NULL; if ( dlml != NULL ) dlml->dlm_next = dlmp; dlml = dlmp; } if ( c->valx > 0 ) { int i; for ( i = 0, dlip = (dynlist_info_t **)&on->on_bi.bi_private; i < c->valx; i++ ) { if ( *dlip == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "invalid index {%d}\n", c->valx ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } dlip = &(*dlip)->dli_next; } dli_next = *dlip; } else { for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) /* goto last */; } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_dlm = dlm; (*dlip)->dli_next = dli_next; rc = dynlist_build_def_filter( *dlip ); } break; case DL_ATTRPAIR_COMPAT: snprintf( c->cr_msg, sizeof( c->cr_msg ), "warning: \"attrpair\" only supported for limited " "backward compatibility with overlay \"dyngroup\"" ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); /* fallthru */ case DL_ATTRPAIR: { dynlist_info_t **dlip; ObjectClass *oc = NULL; AttributeDescription *ad = NULL, *member_ad = NULL; const char *text; oc = oc_find( "groupOfURLs" ); if ( oc == NULL ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find default ObjectClass \"groupOfURLs\"" ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 1 ], &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 2 ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"\n", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return 1; } for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) { /* * The same URL attribute / member attribute pair * cannot be repeated, but we enforce this only * when the member attribute is unique. Performing * the check for multiple values would require * sorting and comparing the lists, which is left * as a future improvement */ if ( (*dlip)->dli_ad == ad && (*dlip)->dli_dlm->dlm_next == NULL && member_ad == (*dlip)->dli_dlm->dlm_member_ad ) { snprintf( c->cr_msg, sizeof( c->cr_msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "URL attributeDescription \"%s\" already mapped.\n", ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); #if 0 /* make it a warning... */ return 1; #endif } } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_dlm = (dynlist_map_t *)ch_calloc( 1, sizeof( dynlist_map_t ) ); (*dlip)->dli_dlm->dlm_member_ad = member_ad; (*dlip)->dli_dlm->dlm_mapped_ad = NULL; rc = dynlist_build_def_filter( *dlip ); } break; default: rc = 1; break; } return rc; }
main() { long pid, status; short rm,ret,i,si,n; unsigned char t; char buf[NUM_PROMPTS][BUF_SIZE]; long order_num=0; short pickline; short all_pl=0; putenv("_=stockout_input"); chdir(getenv("HOME")); open_all(); /* set order length into fld_parms structure */ LORDER = rf->rf_on; /* determine operator status */ rm = 0; si = 1; if (SUPER_OP && !IS_ONE_PICKLINE) {rm = 1; si = 0;} pickline = op_pl; sprintf(buf[0], "%d", pickline); fix(stockout_input); sd_clear_screen(); sd_screen_off(); sd_text(stockout_input); sd_screen_on(); for(i=0;i<NUM_PROMPTS;i++) for(n=0;n<BUF_SIZE;n++) buf[i][n] = 0; for(i = si; i < LAST_PROMPT; i++) sd_prompt(&fld[i],rm); /* display prompts */ i = si; /* main loop to gather input */ while(1) { t = sd_input(&fld[i],rm,&rm,buf[i],0); if(t == EXIT) leave(); else if(t == UP_CURSOR && i > si) i--; else if(t == DOWN_CURSOR || t == TAB) { if(i == (LAST_PROMPT - 1)) i = 0; else i++; } else if (t == RETURN) { /* validate proper pickline */ if (si == 0) /* have pickline input */ { n = pl_lookup(buf[0], pickline); /* numeric of pickline */ if (n <= 0) { eh_post(ERR_CODE,buf[0]); /* invalid pickline */ i=0; continue; } pickline = n; sprintf(buf[0], "%d", pickline); chng_pkln(buf[0]); } /* validate entered order number */ if(!(*buf[1]) && !(*buf[2])) /* nothing entered */ { eh_post(ERR_REQ_ORDER, 0); i=1; continue; } if(*buf[2]) /* if order number entered */ { order_num=atol(buf[2]); ret = oc_find(pickline, order_num); if(!ret) { eh_post(ERR_ORDER,buf[2]); i=2; continue; } } break; } } /* process print request */ for(i=1;i<3;i++) /* fill non-entered with zero */ { if(*buf[i]) ; else strcpy(buf[i],"0"); } sd_prompt(&fld[4],rm); while(1) { t = sd_input(&fld[4],rm,&rm,buf[4],0); switch(sd_early(t, code_to_caps(*buf[4]))) /* F041897 */ { case (0): leave(); case (4): /* print == y */ if(!(*buf[0])) /* no pickline entered */ { strcpy(buf[0], getenv("PICKLINE"));/* set current */ } sd_wait(); close_all(); execlp("stockout_create", "stockout_create", buf[0], buf[1], buf[2], "", "print", 0); krash("main", "stockout_create load", 1); case (5): /* print == n */ sd_wait(); if(!(*buf[0])) /* no pickline entered */ { strcpy(buf[0], getenv("PICKLINE"));/* set current */ } close_all(); execlp("stockout_create", "stockout_create", buf[0], buf[1], buf[2], "", "report", 0); krash("main", "stockout_create load", 1); case (6): eh_post(ERR_YN,0); break; } } }
static int adremap_cf_dnv(ConfigArgs *c) { BackendDB *be = (BackendDB *)c->be; slap_overinst *on = (slap_overinst *)c->bi; adremap_info *ai = on->on_bi.bi_private; adremap_dnv *ad, **a2; int rc = ARG_BAD_CONF; switch(c->op) { case SLAP_CONFIG_EMIT: for (ad = ai->ai_dnv; ad; ad=ad->ad_next) { char *ptr; struct berval bv; bv.bv_len = ad->ad_dnattr->ad_cname.bv_len + ad->ad_deref->ad_cname.bv_len + ad->ad_newattr->ad_cname.bv_len + 2; bv.bv_len += ad->ad_group->soc_cname.bv_len + ad->ad_mapgrp->soc_cname.bv_len + ad->ad_refgrp->soc_cname.bv_len + 3; bv.bv_len += ad->ad_refbase.bv_len + 3; bv.bv_val = ch_malloc(bv.bv_len + 1); ptr = lutil_strcopy(bv.bv_val, ad->ad_dnattr->ad_cname.bv_val); *ptr++ = ' '; ptr = lutil_strcopy(ptr, ad->ad_deref->ad_cname.bv_val); *ptr++ = ' '; ptr = lutil_strcopy(ptr, ad->ad_newattr->ad_cname.bv_val); *ptr++ = ' '; ptr = lutil_strcopy(ptr, ad->ad_group->soc_cname.bv_val); *ptr++ = ' '; ptr = lutil_strcopy(ptr, ad->ad_mapgrp->soc_cname.bv_val); *ptr++ = ' '; ptr = lutil_strcopy(ptr, ad->ad_refgrp->soc_cname.bv_val); *ptr++ = ' '; *ptr++ = '"'; ptr = lutil_strcopy(ptr, ad->ad_refbase.bv_val); *ptr++ = '"'; *ptr = '\0'; ber_bvarray_add(&c->rvalue_vals, &bv); } if (ai->ai_dnv) rc = 0; break; case LDAP_MOD_DELETE: if (c->valx < 0) { for (ad = ai->ai_dnv; ad; ad=ai->ai_dnv) { ai->ai_dnv = ad->ad_next; ch_free(ad); } } else { int i; for (i=0, a2 = &ai->ai_dnv; i<c->valx; i++, a2 = &(*a2)->ad_next); ad = *a2; *a2 = ad->ad_next; ch_free(ad); } rc = 0; break; default: { const char *text; adremap_dnv av = {0}; struct berval dn; rc = slap_str2ad(c->argv[1], &av.ad_dnattr, &text); if (rc) break; if (av.ad_dnattr->ad_type->sat_syntax != slap_schema.si_syn_distinguishedName) { rc = 1; snprintf(c->cr_msg, sizeof(c->cr_msg), "<%s> not a DN-valued attribute", c->argv[0]); Debug(LDAP_DEBUG_ANY, "%s: %s(%s)\n", c->log, c->cr_msg, c->argv[1]); break; } rc = slap_str2ad(c->argv[2], &av.ad_deref, &text); if (rc) break; rc = slap_str2ad(c->argv[3], &av.ad_newattr, &text); if (rc) break; av.ad_group = oc_find(c->argv[4]); if (!av.ad_group) { rc = 1; break; } av.ad_mapgrp = oc_find(c->argv[5]); if (!av.ad_mapgrp) { rc = 1; break; } av.ad_refgrp = oc_find(c->argv[6]); if (!av.ad_refgrp) { rc = 1; break; } ber_str2bv(c->argv[7], 0, 0, &dn); rc = dnNormalize(0, NULL, NULL, &dn, &av.ad_refbase, NULL); if (rc) break; for (a2 = &ai->ai_dnv; *a2; a2 = &(*a2)->ad_next); ad = ch_malloc(sizeof(adremap_dnv)); ad->ad_next = NULL; ad->ad_dnattr = av.ad_dnattr; ad->ad_deref = av.ad_deref; ad->ad_newattr = av.ad_newattr; ad->ad_group = av.ad_group; ad->ad_mapgrp = av.ad_mapgrp; ad->ad_refgrp = av.ad_refgrp; ad->ad_refbase = av.ad_refbase; *a2 = ad; break; } } return rc; }