[gq-commit] gq/src browse-dnd.c,1.18,1.19 browse.c,1.87,1.88 common.h,1.31,1.32 dn-browse.c,1.5,1.6
Status: Beta
Brought to you by:
sur5r
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv17072 Modified Files: browse-dnd.c browse.c common.h dn-browse.c formfill.c input.c ldapops.c ldif.c schema.c server-browse.c tinput.c util.c Log Message: * Fixed many (not all) areas that were not yet fully referral-aware (Also fixed the explicit ldapops warning) * Fixed some LDAP related memory leaks (+ possibly obsolete portability problems in this area) * Fixed some wrong error-handling with respect to ldap_search_ext * Introduced ldap_search_ext in some places where it would not have been strictly necessary Index: browse-dnd.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse-dnd.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** browse-dnd.c 21 Oct 2003 20:58:27 -0000 1.18 --- browse-dnd.c 23 Oct 2003 05:46:23 -0000 1.19 *************** *** 862,873 **** server_by_name(g_hash_table_lookup(selhash, "nickname")); char *dn = g_hash_table_lookup(selhash, "dn"); ! LDAP *ld; int rc; ! LDAPMessage *msg = NULL, *e; GString *out = NULL; gboolean ok = FALSE; int ctx = error_new_context(_("Getting selection string")); --- 862,880 ---- server_by_name(g_hash_table_lookup(selhash, "nickname")); char *dn = g_hash_table_lookup(selhash, "dn"); ! LDAPControl c, *ctrls[2] = { NULL, NULL } ; ! int scope; LDAP *ld; int rc; ! LDAPMessage *e, *res = NULL; GString *out = NULL; gboolean ok = FALSE; + char *attrs[] = { + LDAP_ALL_USER_ATTRIBUTES, + "ref", + NULL + }; + int ctx = error_new_context(_("Getting selection string")); *************** *** 881,885 **** error_push(ctx, _("Cannot find server by its nickname ('%s')"), ! g_hash_table_lookup(selhash, "nickname")); goto done; } --- 888,892 ---- error_push(ctx, _("Cannot find server by its nickname ('%s')"), ! (char*) g_hash_table_lookup(selhash, "nickname")); goto done; } *************** *** 888,929 **** if( (ld = open_connection(server)) == NULL) goto fail; ! rc = ldap_search_s(ld, dn, ! g_hash_table_lookup(selhash, "recursively") ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_BASE, ! "objectClass=*", NULL, 0, &msg); ! if (rc == LDAP_SERVER_DOWN) { ! server->server_down = 1; ! error_push(ctx, ! _("Server '%s' down. Export may be incomplete!"), ! server->name); ! push_ldap_addl_error(ld, ctx); ! ! goto fail; ! } ! if (rc != LDAP_SUCCESS) { ! error_push(ctx, ! _("LDAP error while searching below '%s'. Export may be incomplete!"), ! dn); ! push_ldap_addl_error(ld, ctx); ! ! goto fail; ! } ! out = g_string_new(""); ! for(e = ldap_first_entry(ld, msg); e ; e = ldap_next_entry(ld, e)) { ! ldif_entry_out(out, ld, e, ctx); } - - gtk_selection_data_set(data, - GDK_SELECTION_TYPE_STRING, - 8, /* character data */ - out->str, - out->len - ); - ok = TRUE; - /* I hate to do it like this, but sometimes labels are such - helpful beasts */ - fail: if (!ok) { gtk_selection_data_set(data, --- 895,949 ---- if( (ld = open_connection(server)) == NULL) goto fail; ! /* use ManageDSAit: we want to move/copy refs intact */ ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! c.ldctl_value.bv_val = NULL; ! c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ! ! ctrls[0] = &c; ! scope = g_hash_table_lookup(selhash, "recursively") ? ! LDAP_SCOPE_SUBTREE : LDAP_SCOPE_BASE; ! rc = ldap_search_ext_s(ld, ! dn, /* base */ ! scope, /* search scope */ ! "objectClass=*", /* filter */ ! attrs, /* attrs */ ! 0, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); ! ! if (rc == LDAP_SUCCESS) { ! out = g_string_new(""); ! ! for( e = ldap_first_entry(ld, res) ; e != NULL ; ! e = ldap_next_entry(ld, e) ) { ! ldif_entry_out(out, ld, e, ctx); ! } ! ! gtk_selection_data_set(data, ! GDK_SELECTION_TYPE_STRING, ! 8, /* character data */ ! out->str, ! out->len ! ); ! ok = TRUE; ! } else if (rc == LDAP_SERVER_DOWN) { ! server->server_down++; ! error_push(ctx, ! _("Error searching below '%1$s': %2$s"), ! dn, ldap_err2string(rc)); ! push_ldap_addl_error(ld, ctx); ! } else { ! error_push(ctx, ! _("Error searching below '%1$s': %2$s"), ! dn, ldap_err2string(rc)); ! push_ldap_addl_error(ld, ctx); } if (!ok) { gtk_selection_data_set(data, *************** *** 935,941 **** } if (out) g_string_free(out, TRUE); ! if (msg) ldap_msgfree(msg); ! close_connection(server, FALSE); done: error_flush(ctx); --- 955,963 ---- } + fail: if (out) g_string_free(out, TRUE); ! if (res) ldap_msgfree(res); ! if (ld) close_connection(server, FALSE); ! done: error_flush(ctx); Index: browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.c,v retrieving revision 1.87 retrieving revision 1.88 diff -C2 -d -r1.87 -r1.88 *** browse.c 21 Oct 2003 20:58:27 -0000 1.87 --- browse.c 23 Oct 2003 05:46:23 -0000 1.88 *************** *** 925,953 **** LDAPControl c; LDAPControl *ctrls[2] = { NULL, NULL } ; ! int rc, msg; ! /* int rc = ldap_search_s(ld, s->str, LDAP_SCOPE_BASE, */ ! /* "(objectClass=*)", attrs, 0, &res); */ ! ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; c.ldctl_value.bv_val = NULL; c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ctrls[0] = &c; ! rc = ldap_search_ext(ld, s->str, ! LDAP_SCOPE_BASE, ! "(objectClass=*)", attrs, 0, ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &msg); ! ! ! if (rc == LDAP_SUCCESS) { ! rc = ldap_result(ld, msg, 1, NULL, &res); ! } if (rc == LDAP_SUCCESS) { --- 925,947 ---- LDAPControl c; LDAPControl *ctrls[2] = { NULL, NULL } ; ! int rc; ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; c.ldctl_value.bv_val = NULL; c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ctrls[0] = &c; ! rc = ldap_search_ext_s(ld, s->str, ! LDAP_SCOPE_BASE, ! "(objectClass=*)", ! attrs, ! 0, ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); if (rc == LDAP_SUCCESS) { *************** *** 957,969 **** char *dn = ldap_get_dn(ld, e); found = dn_browse_single_add(dn, tree, node); ! free(dn); node = found; } - ldap_msgfree(res); } else { /* FIXME report error */ } ! close_connection(server, FALSE); } else { --- 951,965 ---- char *dn = ldap_get_dn(ld, e); found = dn_browse_single_add(dn, tree, node); ! if (dn) ldap_memfree(dn); node = found; } } else { /* FIXME report error */ } ! ! if (res) ldap_msgfree(res); ! res = NULL; ! close_connection(server, FALSE); } else { Index: common.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/common.h,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** common.h 20 Oct 2003 08:22:49 -0000 1.31 --- common.h 23 Oct 2003 05:46:23 -0000 1.32 *************** *** 168,171 **** --- 168,176 ---- #endif + #ifndef HAVE_LDAP_MEMFREE + # define ldap_memfree(x) free(x) + #endif + + #endif Index: dn-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dn-browse.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dn-browse.c 23 Oct 2003 05:18:36 -0000 1.5 --- dn-browse.c 23 Oct 2003 05:46:23 -0000 1.6 *************** *** 372,386 **** &msg); ! if (rc != LDAP_SUCCESS) { ! statusbar_msg(_("Searching for '%1$s': %2$s"), ! entry->dn, ! ldap_err2string(msg)); ! close_connection(server, FALSE); ! gtk_clist_thaw(GTK_CLIST(ctree)); ! error_flush(context); ! return; ! } while((rc = ldap_result(ld, msg, 0, --- 372,387 ---- &msg); ! /* FIXME: THIS IS NOT CORRECT */ ! /* if (rc == -1) { */ ! /* statusbar_msg(_("Searching for '%1$s': %2$s"), */ ! /* entry->dn, */ ! /* ldap_err2string(msg)); */ ! /* close_connection(server, FALSE); */ ! /* gtk_clist_thaw(GTK_CLIST(ctree)); */ ! /* error_flush(context); */ ! /* return; */ ! /* } */ while((rc = ldap_result(ld, msg, 0, *************** *** 397,403 **** ref_browse_single_add(vals[i], ctree, node); } } ! ldap_msgfree(res); } if (entry->is_ref) { --- 398,411 ---- ref_browse_single_add(vals[i], ctree, node); } + + if (vals) /* redundant, but... */ + ldap_value_free(vals); } ! if (res) ldap_msgfree(res); ! res = NULL; } + + if (res) ldap_msgfree(res); + res = NULL; if (entry->is_ref) { *************** *** 422,435 **** &msg); ! if(rc != LDAP_SUCCESS) { ! statusbar_msg(_("Error while searching below '%1$s': %2$s"), ! entry->dn, ! ldap_err2string(msg)); ! close_connection(server, FALSE); ! gtk_clist_thaw(GTK_CLIST(ctree)); ! error_flush(context); ! return; ! } num_children = update_counter = 0; --- 430,444 ---- &msg); ! /* FIXME */ ! /* if(rc != LDAP_SUCCESS) { */ ! /* statusbar_msg(_("Error while searching below '%1$s': %2$s"), */ ! /* entry->dn, */ ! /* ldap_err2string(msg)); */ ! /* close_connection(server, FALSE); */ ! /* gtk_clist_thaw(GTK_CLIST(ctree)); */ ! /* error_flush(context); */ ! /* return; */ ! /* } */ num_children = update_counter = 0; *************** *** 442,446 **** char *dn = ldap_get_dn(ld, e); dn_browse_single_add(dn, ctree, node); ! free(dn); num_children++; --- 451,455 ---- char *dn = ldap_get_dn(ld, e); dn_browse_single_add(dn, ctree, node); ! if (dn) ldap_memfree(dn); num_children++; Index: formfill.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/formfill.c,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** formfill.c 18 Oct 2003 08:26:59 -0000 1.40 --- formfill.c 23 Oct 2003 05:46:23 -0000 1.41 *************** *** 166,226 **** } ! GList *formlist_from_entry(struct ldapserver *server, const char *dn, int ocvalues_only) { ! GList *formlist; ! LDAP *ld; LDAPMessage *res, *entry; ! BerElement *ber; ! struct formfill *form; ! int msg, i; char *attr; /* , **vals; */ struct berval **bervals; ! char *attrs[] = { LDAP_ALL_USER_ATTRIBUTES, ! LDAP_ALL_OPERATIONAL_ATTRIBUTES, ! NULL }; ! ! formlist = NULL; ! ! set_busycursor(); ! ! #if GTK_MAJOR >= 2 ! statusbar_msg(_("Fetching %1$s from %2$s"), dn, server->name); ! #else ! { ! char *c = NULL; ! statusbar_msg(_("Fetching %1$s from %2$s"), ! c = decoded_string(dn), server->name); ! if (c) free(c); ! } ! #endif - if( (ld = open_connection(server)) == NULL) { - set_normalcursor(); - return(NULL); - } ! msg = ldap_search_s(ld, dn, LDAP_SCOPE_BASE, "(objectclass=*)", ! server->hide_internal ? NULL : attrs, 0, &res); ! ! if (msg == LDAP_SERVER_DOWN) { server->server_down++; ! } ! ! if(msg != LDAP_SUCCESS) { ! statusbar_msg("%s", ldap_err2string(msg)); ! set_normalcursor(); ! close_connection(server, FALSE); ! return(NULL); ! } ! if (res) { entry = ldap_first_entry(ld, res); if(entry) { char *c; ! for(attr = ldap_first_attribute(ld, entry, &ber); attr ; attr = ldap_next_attribute(ld, entry, ber)) { /* filter out some internal attributes... */ - c = attr_strip(attr); if (server->hide_internal) { --- 166,224 ---- } ! static GList *formlist_from_entry_iteration(LDAP *ld, ! struct ldapserver *server, ! const char *dn, ! int ocvalues_only, ! char **attrs, ! GList *formlist) { ! LDAPControl c; ! LDAPControl *ctrls[2] = { NULL, NULL } ; LDAPMessage *res, *entry; ! int rc, i; char *attr; /* , **vals; */ + struct formfill *form; + BerElement *ber; struct berval **bervals; ! ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! c.ldctl_value.bv_val = NULL; ! c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ! ! ctrls[0] = &c; ! rc = ldap_search_ext_s(ld, ! dn, /* search base */ ! LDAP_SCOPE_BASE, /* scope */ ! "objectClass=*", /* filter */ ! attrs, /* attrs */ ! 0, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); ! ! ! if (rc == LDAP_SERVER_DOWN) { server->server_down++; ! } else if (rc != LDAP_SUCCESS) { ! statusbar_msg("Searching for '%1$s' on '%2$s': %3$s", ! dn, server->name, ! ldap_err2string(rc)); ! return(formlist); ! } ! if (rc == LDAP_SUCCESS) { entry = ldap_first_entry(ld, res); if(entry) { char *c; ! for(attr = ldap_first_attribute(ld, entry, &ber); attr ; attr = ldap_next_attribute(ld, entry, ber)) { + gboolean oc; /* filter out some internal attributes... */ c = attr_strip(attr); if (server->hide_internal) { *************** *** 231,235 **** } } ! if( (form = new_formfill()) == NULL) { ldap_memfree(attr); --- 229,233 ---- } } ! if( (form = new_formfill()) == NULL) { ldap_memfree(attr); *************** *** 237,249 **** break; } ! form->server = server; ldapserver_ref(server); ! strncpy(form->attrname, c, MAX_ATTR_LEN); if (c) g_free(c); ! if(ocvalues_only == 0 || ! !strcasecmp(attr, "objectClass")) { bervals = ldap_get_values_len(ld, res, attr); if(bervals) { --- 235,248 ---- break; } ! form->server = server; ldapserver_ref(server); ! strncpy(form->attrname, c, MAX_ATTR_LEN); if (c) g_free(c); + + oc = strcasecmp(attr, "objectClass") == 0; ! if(ocvalues_only == 0 || oc) { bervals = ldap_get_values_len(ld, res, attr); if(bervals) { *************** *** 256,260 **** gb); } ! form->num_inputfields = i; ldap_value_free_len(bervals); --- 255,259 ---- gb); } ! form->num_inputfields = i; ldap_value_free_len(bervals); *************** *** 274,279 **** #endif } ! ldap_msgfree(res); } close_connection(server, FALSE); --- 273,325 ---- #endif } ! ! if (res) ldap_msgfree(res); ! res = NULL; ! } ! return formlist; ! } ! ! GList *formlist_from_entry(struct ldapserver *server, const char *dn, ! int ocvalues_only) ! { ! GList *formlist; ! LDAP *ld; ! char *attrs[] = { LDAP_ALL_USER_ATTRIBUTES, ! LDAP_ALL_OPERATIONAL_ATTRIBUTES, ! "ref", ! NULL, ! }; ! char *ref_attrs[] = { LDAP_ALL_USER_ATTRIBUTES, ! "ref", ! NULL ! }; ! ! formlist = NULL; ! ! set_busycursor(); ! ! #if GTK_MAJOR >= 2 ! statusbar_msg(_("Fetching %1$s from %2$s"), dn, server->name); ! #else ! { ! char *c = NULL; ! statusbar_msg(_("Fetching %1$s from %2$s"), ! c = decoded_string(dn), server->name); ! if (c) free(c); ! } ! #endif ! ! if( (ld = open_connection(server)) == NULL) { ! set_normalcursor(); ! return(NULL); } + + formlist = + formlist_from_entry_iteration(ld, + server, + dn, + ocvalues_only, + server->hide_internal ? ref_attrs : attrs, + NULL); close_connection(server, FALSE); Index: input.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/input.c,v retrieving revision 1.73 retrieving revision 1.74 diff -C2 -d -r1.73 -r1.74 *** input.c 18 Oct 2003 08:26:59 -0000 1.73 --- input.c 23 Oct 2003 05:46:23 -0000 1.74 *************** *** 1221,1224 **** --- 1221,1232 ---- char *dn; char *parentdn, **rdn; + LDAPControl c, *ctrls[2] = { NULL, NULL } ; + + c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; + c.ldctl_value.bv_val = NULL; + c.ldctl_value.bv_len = 0; + c.ldctl_iscritical = 1; + + ctrls[0] = &c; formlist = iform->formlist; *************** *** 1282,1286 **** mods[cmod] = NULL; ! res = ldap_add_s(ld, dn, mods); ldap_mods_free(mods, 1); --- 1290,1294 ---- mods[cmod] = NULL; ! res = ldap_add_ext_s(ld, dn, mods, ctrls, NULL); ldap_mods_free(mods, 1); *************** *** 1288,1291 **** --- 1296,1302 ---- server->server_down++; } + if (res == LDAP_REFERRAL) { + /* FIXME */ + } if(res != LDAP_SUCCESS) { error_push(add_context, _("Error adding new entry '%1$s': '%2$s'"), *************** *** 1415,1424 **** mods = formdiff_to_ldapmod(oldlist, newlist); if(mods != NULL && mods[0] != NULL) { ! /* close_connection(server, FALSE); */ ! /* g_string_free(message, TRUE); */ ! /* return; */ ! /* } */ /* dump_mods(mods); */ ! res = ldap_modify_s(ld, dn, mods); if (res == LDAP_SERVER_DOWN) { server->server_down++; --- 1426,1440 ---- mods = formdiff_to_ldapmod(oldlist, newlist); if(mods != NULL && mods[0] != NULL) { ! LDAPControl c, *ctrls[2] = { NULL, NULL } ; ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! c.ldctl_value.bv_val = NULL; ! c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ! ! ctrls[0] = &c; ! /* dump_mods(mods); */ ! ! res = ldap_modify_ext_s(ld, dn, mods, ctrls, NULL); if (res == LDAP_SERVER_DOWN) { server->server_down++; *************** *** 1483,1487 **** #endif char *noattrs[] = { LDAP_NO_ATTRS, NULL }; ! LDAPMessage *res; server = iform->server; --- 1499,1503 ---- #endif char *noattrs[] = { LDAP_NO_ATTRS, NULL }; ! LDAPMessage *res = NULL; server = iform->server; *************** *** 1545,1550 **** remove_flag = 1; } - ldap_msgfree(res); } /* printf("oldrdn[0]=%s, remove=%d\n", oldrdn[0], remove_flag); */ --- 1561,1566 ---- remove_flag = 1; } } + if (res) ldap_msgfree(res); /* printf("oldrdn[0]=%s, remove=%d\n", oldrdn[0], remove_flag); */ Index: ldapops.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ldapops.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ldapops.c 21 Oct 2003 21:02:34 -0000 1.18 --- ldapops.c 23 Oct 2003 05:46:23 -0000 1.19 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (ldapops.h) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 62,65 **** --- 60,70 ---- int rc; int err_ctx = -1; + LDAPControl c; + LDAPControl *ctrls[2] = { NULL, NULL } ; + char *attrs[] = { + LDAP_ALL_USER_ATTRIBUTES, + "ref", + NULL + }; if ((source_server != target_server) && *************** *** 75,100 **** err_ctx = error_new_context(_("Moving/copying LDAP objects")); ! rc = ldap_search_s(sld, source_dn, LDAP_SCOPE_BASE, ! "objectClass=*", NULL, 0, ! &res); ! ! if (rc == LDAP_SUCCESS) { ! e = ldap_first_entry(sld, res); ! if (e == NULL) { ! error_push(err_ctx, ! _("Error during base search for '%1$s': %2$s"), ! source_dn, ! ldap_err2string(ldap_result2error(sld, res, 0))); ! push_ldap_addl_error(sld, err_ctx); ! /* ldap_perror(sld, "ldap_first_entry"); */ ! goto fail; /* only sometimes goto makes sense */ ! } ! newdn = move_entry_internal(e, ! source_dn, source_server, sld, ! target_dn, target_server, tld, ! flags, err_ctx, ! progress); ! } else { if (rc == LDAP_SERVER_DOWN) { source_server->server_down++; --- 80,104 ---- err_ctx = error_new_context(_("Moving/copying LDAP objects")); ! /* prepare ManageDSAit: we move referrals, not the referred-to data */ ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! c.ldctl_value.bv_val = NULL; ! c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ! ! ctrls[0] = &c; ! rc = ldap_search_ext_s(sld, ! source_dn, /* search base */ ! LDAP_SCOPE_BASE, /* scope */ ! "objectClass=*", /* filter */ ! attrs, /* attrs */ ! 0, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); ! ! if (rc != LDAP_SUCCESS) { if (rc == LDAP_SERVER_DOWN) { source_server->server_down++; *************** *** 109,112 **** --- 113,133 ---- } + e = ldap_first_entry(sld, res); + if (e == NULL) { + error_push(err_ctx, + _("Error during base search for '%1$s': %2$s"), + source_dn, + ldap_err2string(ldap_result2error(sld, res, 0))); + push_ldap_addl_error(sld, err_ctx); + /* ldap_perror(sld, "ldap_first_entry"); */ + goto fail; /* only sometimes goto makes sense */ + } + + newdn = move_entry_internal(e, + source_dn, source_server, sld, + target_dn, target_server, tld, + flags, err_ctx, + progress); + fail: if (res) ldap_msgfree(res); *************** *** 210,214 **** struct berval **bervals = ldap_get_values_len(sld, e, a); - #warning "FIXME: deal with ref when moving entries" mods[i] = calloc(sizeof(LDAPMod), 1); mods[i]->mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES; --- 231,234 ---- *************** *** 248,251 **** --- 268,279 ---- if (flags & MOVE_RECURSIVELY) { gboolean recheck = TRUE; + /* prepare ManageDSAit: we move referrals, not the + referred-to data */ + char *attrs[] = { + LDAP_ALL_USER_ATTRIBUTES, + "ref", + NULL + }; + if (sdn) gq_exploded_free(sdn); *************** *** 262,283 **** entries ... and copying may continue */ do { recheck = FALSE; /* check for entries below ... */ ! rc = ldap_search_s(sld, source_dn, LDAP_SCOPE_ONELEVEL, ! "objectClass=*", dn_only, 0, ! &res); if (rc == LDAP_SUCCESS) { ! /* have subtree */ ! for (e = ldap_first_entry(sld, res) ; e ; ! e = ldap_next_entry(sld, e) ) { char *dn = ldap_get_dn(sld, e); ! char *ndn = ! move_entry_internal(e, dn, ! source_server, sld, ! newdn, ! target_server, tld, ! flags, error_context, ! progress); if (ndn) { free(ndn); --- 290,328 ---- entries ... and copying may continue */ do { + LDAPMessage *res; + recheck = FALSE; /* check for entries below ... */ ! rc = ldap_search_ext_s(sld, ! source_dn, /* search base */ ! LDAP_SCOPE_ONELEVEL, /* scope */ ! "objectClass=*", /* filter */ ! attrs, /* attrs */ ! 0, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); ! if (rc == LDAP_SUCCESS) { ! for(e = ldap_first_entry(sld, res) ; ! e ; ! e = ldap_next_entry(sld, e)) { char *dn = ldap_get_dn(sld, e); ! char *ndn; ! ! ndn = move_entry_internal(e, ! dn, ! source_server, ! sld, ! newdn, ! target_server, ! tld, ! flags, ! error_context, ! progress); ! if (ndn) { free(ndn); *************** *** 288,294 **** if (dn) ldap_memfree(dn); ! } } else if (rc == LDAP_SERVER_DOWN) { source_server->server_down++; } else { error_push(error_context, --- 333,343 ---- if (dn) ldap_memfree(dn); ! } } else if (rc == LDAP_SERVER_DOWN) { source_server->server_down++; + error_push(error_context, + _("Error searching below '%1$s': %2$s"), + source_dn, + ldap_err2string(rc)); } else { error_push(error_context, *************** *** 297,301 **** push_ldap_addl_error(sld, error_context); } - if (res) { ldap_msgfree(res); --- 346,349 ---- Index: ldif.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ldif.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** ldif.c 17 Oct 2003 10:20:38 -0000 1.16 --- ldif.c 23 Oct 2003 05:46:23 -0000 1.17 *************** *** 91,95 **** ldif_line_out(out, "dn", dn, strlen(dn), error_context); g_string_append(out, "\n"); ! free(dn); for(attr = ldap_first_attribute(ld, msg, &berptr); attr != NULL; --- 91,95 ---- ldif_line_out(out, "dn", dn, strlen(dn), error_context); g_string_append(out, "\n"); ! ldap_memfree(dn); for(attr = ldap_first_attribute(ld, msg, &berptr); attr != NULL; Index: schema.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/schema.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** schema.c 20 Oct 2003 08:01:11 -0000 1.24 --- schema.c 23 Oct 2003 05:46:23 -0000 1.25 *************** *** 131,136 **** statusbar_msg(_("subschemaSubentry search on root DSE on server '%s'"), server->name); ! msg = ldap_search_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", ! subschemasubentry, 0, &res); if(msg != LDAP_SUCCESS) { --- 131,138 ---- statusbar_msg(_("subschemaSubentry search on root DSE on server '%s'"), server->name); ! msg = ldap_search_ext_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", ! subschemasubentry, 0, ! NULL, NULL, NULL, LDAP_NO_LIMIT, ! &res); if(msg != LDAP_SUCCESS) { *************** *** 175,180 **** subschema, server->name); ! msg = ldap_search_s(ld, subschema, LDAP_SCOPE_BASE, ! "(objectclass=*)", schema_attrs, 0, &res); g_free_if(subschema); --- 177,184 ---- subschema, server->name); ! msg = ldap_search_ext_s(ld, subschema, LDAP_SCOPE_BASE, ! "(objectclass=*)", schema_attrs, 0, ! NULL, NULL, NULL, LDAP_NO_LIMIT, ! &res); g_free_if(subschema); Index: server-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/server-browse.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** server-browse.c 23 Oct 2003 05:18:36 -0000 1.4 --- server-browse.c 23 Oct 2003 05:46:23 -0000 1.5 *************** *** 387,392 **** char *attrs[2] = { rootDSEattr[i], NULL }; ! msg = ldap_search_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", ! attrs, 0, &res); if(msg != LDAP_SUCCESS) { if (msg == LDAP_SERVER_DOWN) { --- 387,401 ---- char *attrs[2] = { rootDSEattr[i], NULL }; ! msg = ldap_search_ext_s(ld, "", ! LDAP_SCOPE_BASE, /* scope */ ! "(objectclass=*)", /* filter */ ! attrs, /* attrs */ ! 0, /* attrsonly */ ! NULL, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); ! if(msg != LDAP_SUCCESS) { if (msg == LDAP_SERVER_DOWN) { Index: tinput.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/tinput.c,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** tinput.c 18 Oct 2003 08:27:00 -0000 1.42 --- tinput.c 23 Oct 2003 05:46:23 -0000 1.43 *************** *** 93,97 **** * fetch objectclasses in entry from server and build GList of formfill with it */ ! GList *formfill_from_entry_objectclass(struct ldapserver *server, const char *dn) { GList *formlist, *oclist, *tmplist; --- 93,98 ---- * fetch objectclasses in entry from server and build GList of formfill with it */ ! GList *formfill_from_entry_objectclass(struct ldapserver *server, ! const char *dn) { GList *formlist, *oclist, *tmplist; *************** *** 103,106 **** --- 104,117 ---- char **vals; char *oc_only[] = { "objectClass", NULL }; + LDAPControl c; + LDAPControl *ctrls[2] = { NULL, NULL } ; + + /* ManageDSAit */ + c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; + c.ldctl_value.bv_val = NULL; + c.ldctl_value.bv_len = 0; + c.ldctl_iscritical = 1; + + ctrls[0] = &c; formlist = NULL; *************** *** 113,118 **** } ! msg = ldap_search_s(ld, dn, LDAP_SCOPE_BASE, ! "(objectclass=*)", oc_only, 0, &res); if(msg != LDAP_SUCCESS) { --- 124,137 ---- } ! msg = ldap_search_ext_s(ld, dn, ! LDAP_SCOPE_BASE, ! "(objectclass=*)", ! oc_only, /* attrs */ ! 0, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); if(msg != LDAP_SUCCESS) { Index: util.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.c,v retrieving revision 1.80 retrieving revision 1.81 diff -C2 -d -r1.80 -r1.81 *** util.c 23 Oct 2003 05:26:37 -0000 1.80 --- util.c 23 Oct 2003 05:46:23 -0000 1.81 *************** *** 666,669 **** --- 666,670 ---- LDAPControl c; LDAPControl *ctrls[2] = { NULL, NULL } ; + LDAPMessage *res = NULL, *e; c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; *************** *** 685,700 **** if (recursive) { int something_to_do = 1; - LDAPMessage *res, *e; static char* attrs [] = {"dn", NULL}; while (something_to_do) { something_to_do = 0; ! msg = ldap_search_s (ld, dn, LDAP_SCOPE_ONELEVEL, ! "(objectclass=*)", attrs, 1, &res); if(msg == LDAP_SUCCESS) { for (e = ldap_first_entry(ld, res); e ; e = ldap_next_entry(ld, e)) { ! if (delete_entry_full(server, ldap_get_dn(ld, e), ! TRUE)) { something_to_do = 1; } else { --- 686,712 ---- if (recursive) { int something_to_do = 1; static char* attrs [] = {"dn", NULL}; while (something_to_do) { something_to_do = 0; ! msg = ldap_search_ext_s(ld, dn, ! LDAP_SCOPE_ONELEVEL, ! "(objectclass=*)", ! (char **)attrs, /* attrs */ ! 1, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &res); ! if(msg == LDAP_SUCCESS) { for (e = ldap_first_entry(ld, res); e ; e = ldap_next_entry(ld, e)) { ! char *dn = ldap_get_dn(ld, e); ! gboolean delok = delete_entry_full(server, dn, TRUE); ! if (dn) ldap_memfree(dn); ! ! if (delok) { something_to_do = 1; } else { *************** *** 702,710 **** } } - ldap_msgfree(res); } else if (msg == LDAP_SERVER_DOWN) { server->server_down++; goto done; } } } --- 714,723 ---- } } } else if (msg == LDAP_SERVER_DOWN) { server->server_down++; goto done; } + if (res) ldap_msgfree(res); + res = NULL; } } *************** *** 714,718 **** msg = ldap_delete_ext_s(ld, dn, ctrls, NULL); ! /* msg = ldap_delete_s(ld, dn); /\* FIXME: allow to delete referrals *\/ */ #if HAVE_LDAP_CLIENT_CACHE ldap_uncache_entry(ld, dn); --- 727,731 ---- msg = ldap_delete_ext_s(ld, dn, ctrls, NULL); ! /* msg = ldap_delete_s(ld, dn); */ #if HAVE_LDAP_CLIENT_CACHE ldap_uncache_entry(ld, dn); *************** *** 733,736 **** --- 746,750 ---- done: + if (res) ldap_msgfree(res); set_normalcursor(); close_connection(server, FALSE); *************** *** 1050,1054 **** LDAP *ld; LDAPMessage *res; ! int msg, is_leaf; is_leaf = 0; --- 1064,1082 ---- LDAP *ld; LDAPMessage *res; ! int msg, is_leaf, rc; ! char *attrs[] = { ! LDAP_NO_ATTRS, ! NULL ! }; ! LDAPControl c; ! LDAPControl *ctrls[2] = { NULL, NULL } ; ! ! /* ManageDSAit */ ! c.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! c.ldctl_value.bv_val = NULL; ! c.ldctl_value.bv_len = 0; ! c.ldctl_iscritical = 1; ! ! ctrls[0] = &c; is_leaf = 0; *************** *** 1063,1069 **** statusbar_msg(_("Checking subtree for %s"), dn); ! msg = ldap_search(ld, dn, LDAP_SCOPE_ONELEVEL, "(objectclass=*)", ! NULL, 0); ! if(msg != -1) { if( (ldap_result(ld, msg, 0, NULL, &res) != LDAP_RES_SEARCH_ENTRY)) is_leaf = 1; --- 1091,1104 ---- statusbar_msg(_("Checking subtree for %s"), dn); ! rc = ldap_search_ext(ld, dn, LDAP_SCOPE_ONELEVEL, "(objectclass=*)", ! attrs, /* attrs */ ! 0, /* attrsonly */ ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &msg); ! ! if(rc != -1) { if( (ldap_result(ld, msg, 0, NULL, &res) != LDAP_RES_SEARCH_ENTRY)) is_leaf = 1; |