gqclient-commit Mailing List for GQ LDAP client (Page 6)
Status: Beta
Brought to you by:
sur5r
You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
(4) |
May
|
Jun
(14) |
Jul
(38) |
Aug
(5) |
Sep
(29) |
Oct
(30) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(30) |
Oct
(217) |
Nov
(24) |
Dec
|
2006 |
Jan
|
Feb
|
Mar
|
Apr
(53) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sta...@us...> - 2003-10-20 12:11:10
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv17583 Modified Files: errorchain.c Log Message: * Message log history * Allow line-wrapping in error-messages (they often get inconveniently long) Index: errorchain.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/errorchain.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** errorchain.c 18 Oct 2003 08:26:59 -0000 1.18 --- errorchain.c 20 Oct 2003 08:30:49 -0000 1.19 *************** *** 36,39 **** --- 36,41 ---- #include "i18n.h" #include "input.h" + #include "encode.h" + #include "mainwin.h" /* message_log_append */ #include "utf8-compat.h" *************** *** 110,113 **** --- 112,117 ---- chain->messages = g_list_append(chain->messages, str->str); + message_log_append(str->str); + g_string_free(str, FALSE); } *************** *** 254,257 **** --- 258,262 ---- #endif gtk_label_set_justify(GTK_LABEL(msg_label), GTK_JUSTIFY_LEFT); + gtk_label_set_line_wrap(GTK_LABEL(msg_label), TRUE); gtk_misc_set_alignment(GTK_MISC(msg_label), 0, 0.5); gtk_widget_show(msg_label); |
From: <sta...@us...> - 2003-10-20 11:33:37
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv16958 Modified Files: ref-browse.c util.c util.h Log Message: * Extended referral chasing - try different strategies to find a proper binddn/pw for a referral - SECURITY: MUST think about security implications. Index: ref-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ref-browse.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ref-browse.c 19 Oct 2003 12:01:31 -0000 1.4 --- ref-browse.c 20 Oct 2003 08:26:55 -0000 1.5 *************** *** 145,148 **** --- 145,186 ---- if (ldap_url_parse(entry->uri, &desc) == 0) { + struct ldapserver *parent = NULL, *newserver = NULL; + const char *labels[] = { desc->lud_dn, NULL }; + char *dummy[] = { "dummy", NULL }; + GtkCTreeNode *new_item, *added = NULL; + browse_entry *new_entry; + + + /* find parent server */ + GtkCTreeRow *row = NULL; + GtkCTreeNode *n; + browse_entry *e; + + n = GTK_CTREE_ROW(node)->parent; + for ( ; n ; n = row->parent ) { + row = GTK_CTREE_ROW(n); + e = (browse_entry *) + gtk_ctree_node_get_row_data(ctree, n); + + /* FIXME: This is not OO */ + if (IS_SERVER_ENTRY(e)) { + parent = ((server_browse_entry*) e)->server; + break; + } + if (IS_REF_ENTRY(e)) { + parent = ((ref_browse_entry*) e)->server; + break; + } + } + + if (!parent) { + return; + } + + newserver = get_referral_server(parent, entry->uri); + + + #if 0 + const char *labels[] = { desc->lud_dn, NULL }; char *dummy[] = { "dummy", NULL }; *************** *** 150,153 **** --- 188,194 ---- GtkCTreeNode *new_item, *added = NULL; browse_entry *new_entry; + + + GString *new_uri = g_string_sized_new(strlen(entry->uri)); *************** *** 203,207 **** g_free_and_dup(newserver->ldaphost, new_uri->str); g_free_and_dup(newserver->basedn, desc->lud_dn); ! canonicalize_ldapserver(newserver); --- 244,249 ---- g_free_and_dup(newserver->ldaphost, new_uri->str); g_free_and_dup(newserver->basedn, desc->lud_dn); ! #endif ! newserver->quiet = 1; canonicalize_ldapserver(newserver); Index: util.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.c,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** util.c 19 Oct 2003 11:51:35 -0000 1.75 --- util.c 20 Oct 2003 08:26:55 -0000 1.76 *************** *** 65,68 **** --- 65,69 ---- #include "mainwin.h" #include "input.h" + #include "mainwin.h" /* message_log_append */ #include "utf8-compat.h" *************** *** 297,300 **** --- 298,302 ---- */ + if (ld && server->show_ref) { LDAPControl c; *************** *** 337,340 **** --- 339,448 ---- } + /** Returns a ldapserver object (either an existing or a newly + created) usable to search below the base_url. + + The server gets looked up in the following way: + + 1) the credentials of the parent server get used with a + newly created ldapserver + + 2) The base_url gets looked up as the canonical name. If a match + is found and the credentials for this server work a copy of the + thus found object gets returned + + 3) An anonymous bind gets attempted. + */ + struct ldapserver *get_referral_server(struct ldapserver *parent, + const char *base_url) + { + LDAPURLDesc *desc = NULL; + struct ldapserver *newserver = NULL, *s; + + assert(parent); + + if (ldap_url_parse(base_url, &desc) == 0) { + GString *new_uri = g_string_sized_new(strlen(base_url)); + g_string_sprintf(new_uri, "%s://%s:%d/", + desc->lud_scheme, + desc->lud_host, + desc->lud_port); + + newserver = new_ldapserver(); + + copy_ldapserver(newserver, parent); + + g_free_and_dup(newserver->name, new_uri->str); + g_free_and_dup(newserver->ldaphost, new_uri->str); + g_free_and_dup(newserver->basedn, desc->lud_dn); + + /* some sensible settings for the "usual" case: + Anonymous bind. Also show referrals */ + newserver->ask_pw = 0; + newserver->show_ref = 1; + newserver->quiet = 1; + + if (open_connection(newserver)) { + close_connection(newserver, FALSE); + + statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, parent->name); + + goto done; + } + + /* check: do we have this server around already??? */ + s = server_by_canon_name(new_uri->str, TRUE); + + if (s) { + copy_ldapserver(newserver, s); + + g_free_and_dup(newserver->name, new_uri->str); + g_free_and_dup(newserver->ldaphost, new_uri->str); + g_free_and_dup(newserver->basedn, desc->lud_dn); + + /* some sensible settings for the "usual" case: + Anonymous bind. Also show referrals */ + newserver->ask_pw = 0; + newserver->show_ref = 1; + newserver->quiet = 1; + + if (open_connection(newserver)) { + close_connection(newserver, FALSE); + statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, s->name); + goto done; + } + } + + /* anonymous */ + copy_ldapserver(newserver, parent); + + g_free_and_dup(newserver->name, new_uri->str); + g_free_and_dup(newserver->ldaphost, new_uri->str); + g_free_and_dup(newserver->basedn, desc->lud_dn); + + g_free_and_dup(newserver->binddn, ""); + g_free_and_dup(newserver->bindpw, ""); + g_free_and_dup(newserver->enteredpw, ""); + + newserver->bindtype = BINDTYPE_SIMPLE; + + if (open_connection(newserver)) { + close_connection(newserver, FALSE); + statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, parent->name); + goto done; + } + /* nothing usable found - retry */ + } + + done: + if (desc) ldap_free_urldesc(desc); + if (newserver) { + newserver->quiet = 0; + canonicalize_ldapserver(newserver); + } + + return newserver; + } + + /* *************** *** 797,801 **** msgid = gtk_statusbar_push(GTK_STATUSBAR(mainwin.statusbar), context, buf); ! g_free(buf); --- 905,909 ---- msgid = gtk_statusbar_push(GTK_STATUSBAR(mainwin.statusbar), context, buf); ! message_log_append(buf); g_free(buf); *************** *** 1613,1617 **** /* try LDAP V3 style config */ ! statusbar_msg(_("Base search on NULL DN")); msg = ldap_search_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", ldapv3_config, 0, &res); --- 1721,1725 ---- /* try LDAP V3 style config */ ! statusbar_msg(_("Base search on NULL DN on server '%s'"), server->name); msg = ldap_search_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", ldapv3_config, 0, &res); Index: util.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** util.h 18 Oct 2003 08:27:00 -0000 1.26 --- util.h 20 Oct 2003 08:26:55 -0000 1.27 *************** *** 85,88 **** --- 85,91 ---- gboolean include_transient); + struct ldapserver *get_referral_server(struct ldapserver *parent, + const char *base_url); + /* returns TRUE if server is NOT in the config ldapserver list */ gboolean is_transient_server(const struct ldapserver *server); |
From: <sta...@us...> - 2003-10-20 11:00:54
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv18526 Modified Files: search.c Log Message: * Obsoleted some preferences settings * Enhanced referral chasing * Enforce recursion depth for referrals (untested for truly recursive referrals) * Fixed some column-resize related mistakes * Fixed performance problem during search * Minor fixes Index: search.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/search.c,v retrieving revision 1.55 retrieving revision 1.56 diff -C2 -d -r1.55 -r1.56 *** search.c 19 Oct 2003 12:06:42 -0000 1.55 --- search.c 20 Oct 2003 08:37:18 -0000 1.56 *************** *** 1288,1324 **** if (ldap_url_parse(referral, &desc) == 0) { ! GString *new_uri = g_string_sized_new(strlen(referral)); ! struct ldapserver *s, *newserver; ! g_string_sprintf(new_uri, "%s://%s:%d/", ! desc->lud_scheme, ! desc->lud_host, ! desc->lud_port); ! newserver = new_ldapserver(); ! /* some sensible settings for the "usual" case: ! Anonymous bind. Also show referrals */ ! newserver->ask_pw = 0; ! newserver->show_ref = 1; ! #warning "ADD CONFIG FOR EXTENDED REFERENCE CHASING" ! /* check: do we have this server around already??? */ ! s = server_by_canon_name(new_uri->str, TRUE); ! if (!s) { ! s = server; ! } ! if (s) { ! copy_ldapserver(newserver, s); ! statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, server->name); ! } else { ! statusbar_msg(_("Created temporary server-definition '%1$s' with no pre-set values."), new_uri->str); ! } - g_free_and_dup(newserver->name, new_uri->str); - g_free_and_dup(newserver->ldaphost, new_uri->str); - g_free_and_dup(newserver->basedn, desc->lud_dn); newserver->quiet = 1; --- 1288,1327 ---- if (ldap_url_parse(referral, &desc) == 0) { ! /* GString *new_uri = g_string_sized_new(strlen(referral)); */ ! struct ldapserver *newserver; ! newserver = get_referral_server(server, referral); ! /* g_string_sprintf(new_uri, "%s://%s:%d/", */ ! /* desc->lud_scheme, */ ! /* desc->lud_host, */ ! /* desc->lud_port); */ ! /* newserver = new_ldapserver(); */ ! /* /\* some sensible settings for the "usual" case: */ ! /* Anonymous bind. Also show referrals *\/ */ ! /* newserver->ask_pw = 0; */ ! /* newserver->show_ref = 1; */ ! /* #warning "ADD CONFIG FOR EXTENDED REFERENCE CHASING" */ ! /* /\* check: do we have this server around already??? *\/ */ ! /* s = server_by_canon_name(new_uri->str, TRUE); */ ! ! /* if (!s) { */ ! /* s = server; */ ! /* } */ ! /* if (s) { */ ! /* copy_ldapserver(newserver, s); */ ! /* statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, server->name); */ ! /* } else { */ ! /* statusbar_msg(_("Created temporary server-definition '%1$s' with no pre-set values."), new_uri->str); */ ! /* } */ ! ! /* g_free_and_dup(newserver->name, new_uri->str); */ ! /* g_free_and_dup(newserver->ldaphost, new_uri->str); */ ! /* g_free_and_dup(newserver->basedn, desc->lud_dn); */ newserver->quiet = 1; *************** *** 1331,1335 **** ldap_free_urldesc(desc); ! g_string_free(new_uri, TRUE); } } --- 1334,1338 ---- ldap_free_urldesc(desc); ! /* g_string_free(new_uri, TRUE); */ } } *************** *** 1340,1343 **** --- 1343,1360 ---- }; + + /* static gint result_compare_func(GtkCList *clist, */ + /* gconstpointer ptr1, */ + /* gconstpointer ptr2) */ + /* { */ + + /* gtk_clist_get_sort_column(clist); */ + + + /* } */ + + + + static void click_column(GtkCList *clist, gint column, *************** *** 1491,1494 **** --- 1508,1512 ---- gtk_clist_set_column_title(GTK_CLIST(new_main_clist), 0, "DN"); gtk_clist_set_column_width(GTK_CLIST(new_main_clist), 0, 260); + gtk_clist_set_column_resizeable(GTK_CLIST(new_main_clist), 0, TRUE); columns_done[0] = 1; } *************** *** 1500,1503 **** --- 1518,1524 ---- gtk_clist_set_column_width(GTK_CLIST(new_main_clist), oc_col, 120); columns_done[oc_col] = 1; + + gtk_clist_set_column_resizeable(GTK_CLIST(new_main_clist), + oc_col, TRUE); /* gtk_clist_set_column_visibility(GTK_CLIST(new_main_clist), */ *************** *** 1508,1521 **** tolist[i] = g_string_sized_new(MAX_DN_LEN); } - - /* do the search */ - if (server->show_ref) { - 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; ! } thislevel = NULL; --- 1529,1540 ---- tolist[i] = g_string_sized_new(MAX_DN_LEN); } ! /* prepare ManageDSAit in case we should show referrals */ ! 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; thislevel = NULL; *************** *** 1530,1536 **** row = 0; - gtk_clist_freeze(GTK_CLIST(new_main_clist)); ! while (thislevel || nextlevel) { if (thislevel == NULL) { --- 1549,1557 ---- row = 0; gtk_clist_freeze(GTK_CLIST(new_main_clist)); ! ! /* do the searching */ ! set_busycursor(); ! while (thislevel || nextlevel) { if (thislevel == NULL) { *************** *** 1539,1542 **** --- 1560,1570 ---- nextlevel = NULL; } + if (level > SEARCHTAB(tab)->max_depth) { + statusbar_msg(_("Reached maximum recursion depth")); + + g_list_foreach(thislevel, (GFunc) free_chasing, NULL); + g_list_free(thislevel); + break; + } ch = thislevel->data; *************** *** 1554,1558 **** (char **)attrs, /* attrs & API bug*/ 0, /* attrsonly */ ! server->show_ref ? ctrls : NULL, /* serverctrls */ NULL, /* clientctrls */ --- 1582,1587 ---- (char **)attrs, /* attrs & API bug*/ 0, /* attrsonly */ ! SEARCHTAB(tab)->chase_ref ? NULL : ctrls, ! /* server->show_ref ? ctrls : NULL, */ /* serverctrls */ NULL, /* clientctrls */ *************** *** 1590,1593 **** --- 1619,1623 ---- row++; + #if 0 /* too many performance problems */ if (row % 16 == 0) { if(config->sort_search) { *************** *** 1597,1601 **** gtk_clist_freeze(GTK_CLIST(new_main_clist)); } ! rc = 1; break; /* OK */ --- 1627,1632 ---- gtk_clist_freeze(GTK_CLIST(new_main_clist)); } ! ! #endif rc = 1; break; /* OK */ *************** *** 1633,1636 **** --- 1664,1669 ---- free_chasing(ch); } + + set_normalcursor(); if (attrs) g_free(attrs); |
From: <sta...@us...> - 2003-10-20 10:29:37
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv16076 Modified Files: common.h configfile.h prefs.c Log Message: * Obsoleted the show objectclass preferences setting * Obsoleted the show referrals preferences setting Index: common.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/common.h,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** common.h 18 Oct 2003 08:26:59 -0000 1.30 --- common.h 20 Oct 2003 08:22:49 -0000 1.31 *************** *** 88,92 **** long local_cache_timeout; int ask_pw; ! int show_ref; int hide_internal; --- 88,92 ---- long local_cache_timeout; int ask_pw; ! int show_ref; /* obsolete - kept for configfile compatibility */ int hide_internal; Index: configfile.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.h,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** configfile.h 18 Oct 2003 08:26:59 -0000 1.32 --- configfile.h 20 Oct 2003 08:22:49 -0000 1.33 *************** *** 98,102 **** int confirm_mod; /* not used yet */ int showdn; ! int showoc; int sort_search; int sort_browse; --- 98,102 ---- int confirm_mod; /* not used yet */ int showdn; ! int showoc; /* obsolete */ int sort_search; int sort_browse; Index: prefs.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/prefs.c,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** prefs.c 19 Oct 2003 12:01:31 -0000 1.46 --- prefs.c 20 Oct 2003 08:22:49 -0000 1.47 *************** *** 303,309 **** --- 303,311 ---- server->hide_internal = GTK_TOGGLE_BUTTON(field)->active ? 1 : 0; + #if 0 /* Show ref */ field = sw->show_ref; server->show_ref = GTK_TOGGLE_BUTTON(field)->active ? 1 : 0; + #endif /* Cache connection */ *************** *** 984,987 **** --- 986,990 ---- ); + #if 0 /* obsolete */ /* Show ref */ button = gq_check_button_new_with_label(_("Show _referrals")); *************** *** 995,1000 **** gtk_table_attach(GTK_TABLE(table3), button, 1, 2, z, z + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - z++; - gtk_tooltips_set_tip(tips, button, --- 998,1001 ---- *************** *** 1002,1005 **** --- 1003,1009 ---- S_("tooltip|") ); + #endif + + z++; /* Enable TLS */ *************** *** 1183,1188 **** --- 1187,1194 ---- CONFIG_TOGGLE_BUTTON(config, pw, showdn); + #if 0 /* Show OC */ CONFIG_TOGGLE_BUTTON(config, pw, showoc); + #endif /* Show RDN only */ *************** *** 1727,1730 **** --- 1733,1737 ---- gtk_box_pack_start(GTK_BOX(vbox_view), dnbutton, FALSE, TRUE, 5); + #if 0 /* obsolete */ /* Show Objectclass checkbox */ ocbutton = gq_check_button_new_with_label(_("Show O_bjectclass")); *************** *** 1737,1740 **** --- 1744,1748 ---- gtk_widget_show(ocbutton); gtk_box_pack_start(GTK_BOX(vbox_view), ocbutton, FALSE, TRUE, 5); + #endif /* Sort in search mode button */ |
From: <sta...@us...> - 2003-10-20 09:50:36
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv14130 Modified Files: mainwin.c mainwin.h Log Message: * Added message log history. Might be removed again if it turns out to be of no use Index: mainwin.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.c,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** mainwin.c 19 Oct 2003 12:01:31 -0000 1.47 --- mainwin.c 20 Oct 2003 08:08:24 -0000 1.48 *************** *** 238,241 **** --- 238,450 ---- } + + static GList *log_list = NULL; + static int log_list_len = 0; + + void clear_message_history() + { + if (log_list) { + g_list_foreach(log_list, (GFunc) g_free, NULL); + g_list_free(log_list); + log_list = NULL; + } + + if (mainwin.ml_text) { + #if GTK_MAJOR >= 2 + GtkTextIter start; + GtkTextIter end; + + gtk_text_buffer_get_start_iter(mainwin.ml_buffer, &start); + gtk_text_buffer_get_end_iter(mainwin.ml_buffer, &end); + + gtk_text_buffer_delete(mainwin.ml_buffer, &start, &end); + #else + gtk_editable_delete_text(GTK_EDITABLE(mainwin.ml_text), 0, -1); + #endif + } + } + + + void message_log_append(const char *buf) + { + log_list = g_list_append(log_list, g_strdup(buf)); + log_list_len++; + + if (mainwin.ml_text) { + #if GTK_MAJOR >= 2 + GtkTextIter iter; + gtk_text_buffer_get_end_iter(mainwin.ml_buffer, &iter); + gtk_text_buffer_insert(mainwin.ml_buffer, &iter, + buf, strlen(buf)); + gtk_text_buffer_insert(mainwin.ml_buffer, &iter, "\n", 1); + + gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(mainwin.ml_text), + gtk_text_buffer_create_mark(mainwin.ml_buffer, + NULL, + &iter, + FALSE), + 0.0, + FALSE, + 0.0, 0.0); + #else + int pos = gtk_text_get_length(GTK_TEXT(mainwin.ml_text)); + gtk_editable_insert_text(GTK_EDITABLE(mainwin.ml_text), buf, + strlen(buf), &pos); + gtk_editable_insert_text(GTK_EDITABLE(mainwin.ml_text), "\n", 1, &pos) + #endif + } + while (log_list_len > MESSAGE_LOG_MAX) { + g_free(log_list->data); + log_list = g_list_remove(log_list, log_list->data); + log_list_len--; + } + } + + static void message_log_destroyed(GtkWidget *window, + struct mainwin_data *win) + { + win->ml_window = NULL; + win->ml_text = NULL; + win->ml_buffer = NULL; + } + + static void clear_clicked(void) + { + clear_message_history(); + } + + static void message_log(struct mainwin_data *win) + { + GtkWidget *window, *vbox0, *scrwin, *text, *bbox, *button; + #if GTK_MAJOR >= 2 + GtkTextBuffer *buffer; + GtkTextIter iter; + #else + int pos = 0; + #endif + GList *I; + + assert(win); + + if (win->ml_window) { + gdk_beep(); /* Is this OK, philosophically? */ + #if GTK_MAJOR >= 2 + gtk_window_present(GTK_WINDOW(win->ml_window)); + #else + gtk_window_activate_focus(GTK_WINDOW(win->ml_window)); + #endif + return; + } + + #if GTK_MAJOR < 2 + window = stateful_gtk_window_new(GTK_WINDOW_DIALOG, + "statusbar-log", 500, 350); + #else + window = stateful_gtk_window_new(GTK_WINDOW_TOPLEVEL, + "statusbar-log", 500, 350); + #endif + win->ml_window = window; + + gtk_widget_realize(window); + + gtk_signal_connect(GTK_OBJECT(window), "destroy", + GTK_SIGNAL_FUNC(message_log_destroyed), win); + + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", + GTK_SIGNAL_FUNC(close_on_esc), + (gpointer) window); + + /* current_search_options_window = window; */ + gtk_window_set_title(GTK_WINDOW(window), _("Message Log")); + gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE); + + vbox0 = gtk_vbox_new(FALSE, 0); + gtk_container_border_width(GTK_CONTAINER(vbox0), + CONTAINER_BORDER_WIDTH); + gtk_widget_show(vbox0); + gtk_container_add(GTK_CONTAINER(window), vbox0); + + /* scrolled window to hold the log */ + scrwin = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrwin); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrwin), + GTK_SHADOW_IN); + gtk_box_pack_start(GTK_BOX(vbox0), scrwin, TRUE, TRUE, 0); + + #if GTK_MAJOR >= 2 + text = gtk_text_view_new(); + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); + win->ml_buffer = buffer; + + gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); + gtk_text_buffer_get_end_iter(buffer, &iter); + #else + text = gtk_text_new(NULL, NULL); + gtk_text_set_editable(GTK_TEXT(inputbox), FALSE); + #endif + + win->ml_text = text; + + gtk_widget_show(text); + gtk_container_add(GTK_CONTAINER(scrwin), text); + + for (I = log_list ; I ; I = g_list_next(I) ) { + #if GTK_MAJOR >= 2 + gtk_text_buffer_insert(buffer, &iter, + I->data, strlen(I->data)); + gtk_text_buffer_insert(buffer, &iter, "\n", 1); + #else + gtk_editable_insert_text(GTK_EDITABLE(text), I->data, + strlen(I->data), &pos); + gtk_editable_insert_text(GTK_EDITABLE(text), "\n", 1, &pos) + #endif + } + + #if GTK_MAJOR >= 2 + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(text), + gtk_text_buffer_create_mark(buffer, NULL, + &iter, FALSE), + 0.0, + FALSE, + 0.0, 0.0); + #endif + + bbox = gtk_hbutton_box_new(); + gtk_widget_show(bbox); + + gtk_box_pack_end(GTK_BOX(vbox0), bbox, FALSE, FALSE, 3); + + #if GTK_MAJOR >= 2 + button = gtk_button_new_from_stock(GTK_STOCK_CLEAR); + #else + button = gq_button_new_with_label(_("_Clear")); + #endif + gtk_widget_show(button); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(clear_clicked), + (gpointer) win); + gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, TRUE, 10); + + #if GTK_MAJOR >= 2 + button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + #else + button = gq_button_new_with_label(_("_Close")); + #endif + gtk_widget_show(button); + gtk_signal_connect_object(GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + (gpointer) window); + gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, TRUE, 10); + + GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); + gtk_widget_grab_default(button); + + gtk_widget_show(window); + } + /* Callback function called when a tab gets removed from the notebook. */ *************** *** 272,276 **** { GtkWidget *outer_vbox, *main_vbox, *menubar, *menuitem, *submenu; ! GtkWidget *File, *menuFile, *New, *Close, *Quit; GtkWidget *Search, *Browse, *Schema; GtkWidget *menuHelp, *Help, *License, *About; --- 481,485 ---- { GtkWidget *outer_vbox, *main_vbox, *menubar, *menuitem, *submenu; ! GtkWidget *File, *menuFile, *New, *Close, *ShowM, *Quit; GtkWidget *Search, *Browse, *Schema; GtkWidget *menuHelp, *Help, *License, *About; *************** *** 401,404 **** --- 610,622 ---- GTK_SIGNAL_FUNC(ctrl_w_hack), (gpointer) Close); + + /* File | Show Message */ + + ShowM = gq_menu_item_new_with_label(_("Show _Message Log")); + gtk_widget_show(ShowM); + gtk_container_add(GTK_CONTAINER(menuFile), ShowM); + gtk_signal_connect_object(GTK_OBJECT(ShowM), "activate", + GTK_SIGNAL_FUNC(message_log), + (gpointer) win); /* File | Quit */ Index: mainwin.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.h,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** mainwin.h 17 Oct 2003 05:47:49 -0000 1.21 --- mainwin.h 20 Oct 2003 08:08:24 -0000 1.22 *************** *** 46,49 **** --- 46,56 ---- GtkWidget *filtermenu; GHashTable *lastofmode; + + /* the message log window */ + GtkWidget *ml_window; + GtkWidget *ml_text; + #if GTK_MAJOR >= 2 + GtkTextBuffer *ml_buffer; + #endif }; *************** *** 95,98 **** --- 102,109 ---- struct tab *mainwin_get_current_tab(GtkWidget *notebook); + void message_log_append(const char *buf); + void clear_message_history(); + + #define MESSAGE_LOG_MAX 1000 #endif |
From: <sta...@us...> - 2003-10-20 09:01:06
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv18037 Modified Files: util.c Log Message: * Fixed a core-dumping bug when looking at schema information for transient servers. Index: util.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.c,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** util.c 20 Oct 2003 08:26:55 -0000 1.76 --- util.c 20 Oct 2003 08:33:38 -0000 1.77 *************** *** 1294,1305 **** GList *find_oc_by_at(struct ldapserver *server, const char *atname) { ! GList *list, *srvlist; LDAPObjectClass *oc; int i, found; list = NULL; ! srvlist = server->ss->oc; ! while(srvlist) { ! oc = (LDAPObjectClass *) srvlist->data; found = 0; --- 1294,1311 ---- GList *find_oc_by_at(struct ldapserver *server, const char *atname) { ! GList *list, *oclist; LDAPObjectClass *oc; int i, found; + struct server_schema *ss = NULL; list = NULL; ! ! if (server == NULL) return NULL; ! ss = get_schema(server); ! if (ss == NULL) return NULL; ! ! oclist = ss->oc; ! while(oclist) { ! oc = (LDAPObjectClass *) oclist->data; found = 0; *************** *** 1333,1337 **** } ! srvlist = srvlist->next; } --- 1339,1343 ---- } ! oclist = oclist->next; } |
From: <sta...@us...> - 2003-10-20 08:45:27
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv14581 Modified Files: mainwin.c Log Message: * Moved status bar in main window to the "correct" position. It now looks more standard Index: mainwin.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.c,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -d -r1.48 -r1.49 *** mainwin.c 20 Oct 2003 08:08:24 -0000 1.48 --- mainwin.c 20 Oct 2003 08:10:29 -0000 1.49 *************** *** 511,519 **** gtk_container_add(GTK_CONTAINER(win->mainwin), outer_vbox); - main_vbox = gtk_vbox_new(FALSE, 2); - gtk_container_border_width(GTK_CONTAINER(main_vbox), 4); - gtk_widget_show(main_vbox); - gtk_box_pack_end(GTK_BOX(outer_vbox), main_vbox, TRUE, TRUE, 1); - accel_group = gtk_accel_group_new(); --- 511,514 ---- *************** *** 714,717 **** --- 709,717 ---- GTK_SIGNAL_FUNC(create_about_window), NULL); + main_vbox = gtk_vbox_new(FALSE, 2); + gtk_container_border_width(GTK_CONTAINER(main_vbox), 4); + gtk_widget_show(main_vbox); + gtk_box_pack_start(GTK_BOX(outer_vbox), main_vbox, TRUE, TRUE, 1); + win->mainbook = gtk_notebook_new(); gtk_widget_show(win->mainbook); *************** *** 721,725 **** win->statusbar = gtk_statusbar_new(); gtk_widget_show(win->statusbar); ! gtk_box_pack_end(GTK_BOX(main_vbox), win->statusbar, FALSE, FALSE, 5); gtk_widget_set_sensitive(win->statusbar, TRUE); --- 721,726 ---- win->statusbar = gtk_statusbar_new(); gtk_widget_show(win->statusbar); ! ! gtk_box_pack_end(GTK_BOX(outer_vbox), win->statusbar, FALSE, FALSE, 0); gtk_widget_set_sensitive(win->statusbar, TRUE); |
From: <sta...@us...> - 2003-10-20 08:22:59
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv13340 Modified Files: schema.c Log Message: * Improved statusbar messages Index: schema.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/schema.c,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** schema.c 17 Oct 2003 10:20:38 -0000 1.23 --- schema.c 20 Oct 2003 08:01:11 -0000 1.24 *************** *** 66,70 **** /* server didn't publish a schema, try the last resort schemaserver */ - int ec = error_new_context(_("Using schema from last-resort schemaserver")); server = server_by_name(config->schemaserver); --- 66,69 ---- *************** *** 86,89 **** --- 85,91 ---- _("Cannot obtain schema from last-resort schema server '%s'"), server->name); + } else { + statusbar_msg(_("Using schema from last-resort schema server '%s'"), + server->name); } done: *************** *** 127,131 **** ss = NULL; server->flags |= SERVER_HAS_NO_SCHEMA; ! statusbar_msg(_("subschemaSubentry search on root DSE")); msg = ldap_search_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", subschemasubentry, 0, &res); --- 129,134 ---- ss = NULL; server->flags |= SERVER_HAS_NO_SCHEMA; ! statusbar_msg(_("subschemaSubentry search on root DSE on server '%s'"), ! server->name); msg = ldap_search_s(ld, "", LDAP_SCOPE_BASE, "(objectclass=*)", subschemasubentry, 0, &res); *************** *** 141,145 **** if(res == NULL) { ! statusbar_msg("%s", _("No schema information found")); close_connection(server, FALSE); return(NULL); --- 144,149 ---- if(res == NULL) { ! statusbar_msg(_("No schema information found on server '%s'"), ! server->name); close_connection(server, FALSE); return(NULL); *************** *** 162,171 **** if(subschema == NULL) { ! statusbar_msg("%s", _("No schema information found")); close_connection(server, FALSE); return(NULL); } ! statusbar_msg(_("Schema search on %s"), subschema); msg = ldap_search_s(ld, subschema, LDAP_SCOPE_BASE, --- 166,177 ---- if(subschema == NULL) { ! statusbar_msg(_("No schema information found on server '%s'"), ! server->name); close_connection(server, FALSE); return(NULL); } ! statusbar_msg(_("Schema search on '%1$s' on server '%2$s'"), ! subschema, server->name); msg = ldap_search_s(ld, subschema, LDAP_SCOPE_BASE, *************** *** 184,188 **** if(res == NULL) { ! statusbar_msg("%s", _("No schema information found")); close_connection(server, FALSE); return(NULL); --- 190,195 ---- if(res == NULL) { ! statusbar_msg(_("No schema information found on server '%s'"), ! server->name); close_connection(server, FALSE); return(NULL); |
From: <sta...@us...> - 2003-10-20 07:17:36
|
Update of /cvsroot/gqclient/gq In directory sc8-pr-cvs1:/tmp/cvs-serv652 Modified Files: ChangeLog Log Message: * Recent changes Index: ChangeLog =================================================================== RCS file: /cvsroot/gqclient/gq/ChangeLog,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** ChangeLog 13 Oct 2003 07:48:15 -0000 1.46 --- ChangeLog 20 Oct 2003 06:40:35 -0000 1.47 *************** *** 1,2 **** --- 1,29 ---- + 2003-10-19 Peter Stamfest <pe...@st...> + * Added statusbar and error-message history - very convenient to + get an insight in what really happens + * Got rid of show_oc (Still to be deleted from the configuration, + though) + * Fixed schema-related core-dumping bug(s) with transient servers + * Implemented Search Options (stateful), still to do: sizelimit, + timelimit (not sure how to do real timelimits in case of multi + server searches) + 2003-10-18 Peter Stamfest <pe...@st...> + * Introduced critically important ldapserver reference counting + mechanism (massive changes all over) - new policy when dealing with + struct ldapserver + * Proper Referral handling for search mode + * Sortable Search results (By clicking on the column labels) + 2003-10-17 Peter Stamfest <pe...@st...> + * I herewith declare SASL support to be broken. In its current + state it is not working (and it cannot be made working by me) + for many SASL mechanisms. + * Split browse.c and did some other assorted cleanups/restructuring + * Improved errormessages and cleaned up status bar message (All start + with an uppercase character now) + * Added the ability to obtain a backtrace with error messages through + a new debugflag (64) + * Made some unchangeable data const + * Improved referral support and transient server initialization + * Added progress-bar window during initial GUI restoration 2003-10-12 Peter Stamfest <pe...@st...> * Fixed color/style handling for gtk2 |
From: <sta...@us...> - 2003-10-20 06:46:14
|
Update of /cvsroot/gqclient/gq In directory sc8-pr-cvs1:/tmp/cvs-serv698 Modified Files: TODO Log Message: * Update Index: TODO =================================================================== RCS file: /cvsroot/gqclient/gq/TODO,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** TODO 13 Oct 2003 07:48:48 -0000 1.39 --- TODO 20 Oct 2003 06:40:57 -0000 1.40 *************** *** 10,13 **** --- 10,23 ---- ---------------- + * [1.0] Search-Mode: Avoid circular reference when chasing referrals, use + maximum recursion depth for chasing. + + * [1.0] Search-Mode: Get rid of sortdn - implement through search options + + * [1.0] Allow to use a "master password" for passwords stored in the .gq + Shouldn't be too hard - implement through the encoding XML element. + + * [1.0] Re-introduce the Export to LDIF functionality for servers + * [1.0] SASL / GSSAPI support is badly broken right now (it seems) - there are several bug reports pending. If this cannot be done for *************** *** 79,87 **** * [1.0] Referral support ! - allow to specify bind dn/pw/method for followed referrals, currently ! only anonymous binds get used ! - Make context menu in browse mode node-type specify. Eg. the ! current context menu does not make sense for referral nodes or ! server nodes. * templates: allow defaults? --- 89,93 ---- * [1.0] Referral support ! - Make search mode referral-aware * templates: allow defaults? *************** *** 114,119 **** browser must remain working. - * [1.0] Improve LDAP error reporting - * [1.x] improve gtk2 support --- 120,123 ---- *************** *** 145,151 **** --- 149,174 ---- ------------------------------------- + * [1.x] Make struct ldapserver a reference counting GObject to make + sure we do not get into trouble due to the handing around of + servers between various modes. Until then: think about willingly + leaking the memory used for transient servers. + + * [1.0] Search-Mode: Get rid of show_oc - implement through attributes to + show for he search result (partly done) + + * [1.0] Search-Mode: Allow to specify the recursion depth when + following referrals, allow to show referrals instead of following then. + + * [1.0] Improve LDAP error reporting - most error messages now indicate what + object (eq. server, LDAP entry) caused the problem. + * [1.0] Referral support - somehow indicate a referral in the browse tree and allow to follow it, maybe through the context menu? Configurable? + - Make context menu in browse mode node-type specific. Eg. the + current context menu does not make sense for referral nodes or + server nodes. + - allow to specify bind dn/pw/method for followed referrals, currently + only anonymous binds get used * search mode: (peter) |
From: <sta...@us...> - 2003-10-19 15:00:31
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv31974 Modified Files: mainwin.c prefs.c prefs.h ref-browse.c server-browse.c Log Message: * Made some windows modal and transient, that is if certain windows are visible, no operations can be done in "parent" windows. This makes a lot of sense for Windows where (global) options can be edited. Otherwise it is not clear which setting is active when. Index: mainwin.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.c,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** mainwin.c 17 Oct 2003 07:19:22 -0000 1.46 --- mainwin.c 19 Oct 2003 12:01:31 -0000 1.47 *************** *** 382,388 **** gtk_widget_show(menuitem); gtk_container_add(GTK_CONTAINER(menuFile), menuitem); ! gtk_signal_connect(GTK_OBJECT(menuitem), "activate", ! GTK_SIGNAL_FUNC(create_prefs_window), ! NULL); gtk_widget_add_accelerator(menuitem, "activate", accel_group, 'P', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); --- 382,388 ---- gtk_widget_show(menuitem); gtk_container_add(GTK_CONTAINER(menuFile), menuitem); ! gtk_signal_connect_object(GTK_OBJECT(menuitem), "activate", ! GTK_SIGNAL_FUNC(create_prefs_window), ! (gpointer) win); gtk_widget_add_accelerator(menuitem, "activate", accel_group, 'P', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); Index: prefs.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/prefs.c,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** prefs.c 18 Oct 2003 08:26:59 -0000 1.45 --- prefs.c 19 Oct 2003 12:01:31 -0000 1.46 *************** *** 404,408 **** ! void create_edit_server_window(struct ldapserver *server) { GtkWidget *editwindow, *notebook; --- 404,409 ---- ! void create_edit_server_window(struct ldapserver *server, ! GtkWidget *modalFor) { GtkWidget *editwindow, *notebook; *************** *** 456,461 **** #endif sw->editwindow = editwindow; - current_edit_server_window = editwindow; gtk_object_set_data_full(GTK_OBJECT(editwindow), "cb_data", --- 457,469 ---- #endif sw->editwindow = editwindow; current_edit_server_window = editwindow; + + if (modalFor) { + assert(GTK_IS_WINDOW(modalFor)); + gtk_window_set_modal(GTK_WINDOW(editwindow), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(editwindow), + GTK_WINDOW(modalFor)); + } + gtk_object_set_data_full(GTK_OBJECT(editwindow), "cb_data", *************** *** 1080,1084 **** void serverstab_newbutton_callback(GtkWidget *widget, struct prefs_windata *pw) { ! create_edit_server_window(NULL); } --- 1088,1092 ---- void serverstab_newbutton_callback(GtkWidget *widget, struct prefs_windata *pw) { ! create_edit_server_window(NULL, pw->prefswindow); } *************** *** 1095,1099 **** row); /* quietly ignore editbutton if no server selected */ ! if(server) create_edit_server_window(server); } } --- 1103,1107 ---- row); /* quietly ignore editbutton if no server selected */ ! if(server) create_edit_server_window(server, pw->prefswindow); } } *************** *** 1101,1105 **** static void server_selected_callback(GtkWidget *clist, gint row, gint column, ! GdkEventButton *event, gpointer data) { struct ldapserver *server; --- 1109,1114 ---- static void server_selected_callback(GtkWidget *clist, gint row, gint column, ! GdkEventButton *event, ! struct prefs_windata *pw) { struct ldapserver *server; *************** *** 1111,1115 **** if(event->type == GDK_2BUTTON_PRESS) { server = gtk_clist_get_row_data(GTK_CLIST(clist), row); ! create_edit_server_window(server); } } --- 1120,1124 ---- if(event->type == GDK_2BUTTON_PRESS) { server = gtk_clist_get_row_data(GTK_CLIST(clist), row); ! create_edit_server_window(server, pw->prefswindow); } } *************** *** 1227,1231 **** ! void create_prefs_window(void) { GtkWidget *label, *vbox2; --- 1236,1240 ---- ! void create_prefs_window(struct mainwin_data *win) { GtkWidget *label, *vbox2; *************** *** 1255,1258 **** --- 1264,1273 ---- pw->prefswindow = prefswindow; + assert(win); + + gtk_window_set_modal(GTK_WINDOW(prefswindow), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(prefswindow), + GTK_WINDOW(win->mainwin)); + gtk_container_border_width(GTK_CONTAINER(prefswindow), CONTAINER_BORDER_WIDTH); *************** *** 1416,1420 **** gtk_signal_connect(GTK_OBJECT(server_clist), "select_row", ! GTK_SIGNAL_FUNC(server_selected_callback), NULL); gtk_signal_connect(GTK_OBJECT(server_clist), "unselect_row", GTK_SIGNAL_FUNC(server_unselected_callback), NULL); --- 1431,1435 ---- gtk_signal_connect(GTK_OBJECT(server_clist), "select_row", ! GTK_SIGNAL_FUNC(server_selected_callback), pw); gtk_signal_connect(GTK_OBJECT(server_clist), "unselect_row", GTK_SIGNAL_FUNC(server_unselected_callback), NULL); Index: prefs.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/prefs.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** prefs.h 17 Oct 2003 07:16:14 -0000 1.8 --- prefs.h 19 Oct 2003 12:01:31 -0000 1.9 *************** *** 31,41 **** #include "common.h" /* fwd decl */ struct prefs_widgets; ! void create_edit_server_window(struct ldapserver *server); void fill_serverlist_serverstab(void); ! void create_prefs_window(void); #endif --- 31,43 ---- #include "common.h" + #include "mainwin.h" /* fwd decl */ struct prefs_widgets; ! void create_edit_server_window(struct ldapserver *server, ! GtkWidget *modalFor); void fill_serverlist_serverstab(void); ! void create_prefs_window(struct mainwin_data *win); #endif Index: ref-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ref-browse.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ref-browse.c 18 Oct 2003 08:26:59 -0000 1.3 --- ref-browse.c 19 Oct 2003 12:01:31 -0000 1.4 *************** *** 311,314 **** --- 311,331 ---- } + + struct edit_server_cb_data { + struct ldapserver *server; + struct tab *tab; + }; + + static void free_edit_server_cb_data(struct edit_server_cb_data *cbd) + { + ldapserver_unref(cbd->server); + g_free(cbd); + } + + static void edit_server_activated(struct edit_server_cb_data *cbd) + { + create_edit_server_window(cbd->server, cbd->tab->win->mainwin); + } + /* popup method for BOTH server AND ref entries (the same for now...) */ static void ref_browse_entry_popup(dn_browse_entry *entry, *************** *** 320,323 **** --- 337,341 ---- GtkWidget *menu_item; struct ldapserver *server; + struct edit_server_cb_data *cbd; assert(IS_REF_ENTRY(entry)); *************** *** 330,336 **** gtk_widget_show(menu_item); gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(create_edit_server_window), ! (gpointer) server); gtk_widget_show(menu_item); --- 348,365 ---- gtk_widget_show(menu_item); + cbd = (struct edit_server_cb_data *) + g_malloc0(sizeof(struct edit_server_cb_data)); + cbd->server = server; + cbd->tab = tab; + + ldapserver_ref(server); /* not strictly necessary, but ... */ + gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(edit_server_activated), ! (gpointer) cbd); ! ! /* explicitly attach cbd to assure call to destructor */ ! gtk_object_set_data_full(GTK_OBJECT(menu_item), "cbd", ! cbd, (GtkDestroyNotify)free_edit_server_cb_data); gtk_widget_show(menu_item); Index: server-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/server-browse.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** server-browse.c 18 Oct 2003 08:27:00 -0000 1.2 --- server-browse.c 19 Oct 2003 12:01:32 -0000 1.3 *************** *** 2,6 **** GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen ! Parts: Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with --- 2,6 ---- GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with *************** *** 495,499 **** --- 495,513 ---- } + struct edit_server_cb_data { + struct ldapserver *server; + struct tab *tab; + }; + static void free_edit_server_cb_data(struct edit_server_cb_data *cbd) + { + ldapserver_unref(cbd->server); + g_free(cbd); + } + + static void edit_server_activated(struct edit_server_cb_data *cbd) + { + create_edit_server_window(cbd->server, cbd->tab->win->mainwin); + } /* popup method for BOTH server AND ref entries (the same for now...) */ *************** *** 506,509 **** --- 520,524 ---- GtkWidget *menu_item; struct ldapserver *server; + struct edit_server_cb_data *cbd; assert(IS_SERVER_ENTRY(entry)); *************** *** 515,522 **** gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); ! gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(create_edit_server_window), ! (gpointer) server); gtk_widget_show(menu_item); --- 530,548 ---- gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); ! ! cbd = (struct edit_server_cb_data *) ! g_malloc0(sizeof(struct edit_server_cb_data)); ! cbd->server = server; ! cbd->tab = tab; ! ! ldapserver_ref(server); /* not strictly necessary, but ... */ ! gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(edit_server_activated), ! (gpointer) cbd); ! ! /* explicitly attach cbd to assure call to destructor */ ! gtk_object_set_data_full(GTK_OBJECT(menu_item), "cbd", ! cbd, (GtkDestroyNotify)free_edit_server_cb_data); gtk_widget_show(menu_item); |
From: <sta...@us...> - 2003-10-19 14:37:00
|
Update of /cvsroot/gqclient/gq In directory sc8-pr-cvs1:/tmp/cvs-serv32552 Modified Files: configure.in Log Message: * Get ready for 1.0alpha3 Index: configure.in =================================================================== RCS file: /cvsroot/gqclient/gq/configure.in,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** configure.in 13 Oct 2003 07:41:50 -0000 1.53 --- configure.in 19 Oct 2003 12:02:43 -0000 1.54 *************** *** 30,34 **** AC_INIT(src/gq.c) ! AM_INIT_AUTOMAKE(gq, 1.0alpha2) LANGPACK_VERSION=1 --- 30,34 ---- AC_INIT(src/gq.c) ! AM_INIT_AUTOMAKE(gq, 1.0alpha3) LANGPACK_VERSION=1 |
From: <sta...@us...> - 2003-10-19 13:59:48
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv341 Modified Files: search.c search.h Log Message: * Added "Search Options" - a Button and popup window in search mode. Currently allows to specify chasing/showing referrals (not fully implemented), search scope and selection of attributes to show in the search result. * Some cleanups (moved local functions out of the published API) * Added code to better deal with column widths automatically Index: search.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/search.c,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** search.c 18 Oct 2003 08:27:00 -0000 1.54 --- search.c 19 Oct 2003 12:06:42 -0000 1.55 *************** *** 46,49 **** --- 46,50 ---- #include "i18n.h" #include "browse.h" + #include "schema.h" #include "state.h" #include "syntax.h" *************** *** 53,56 **** --- 54,66 ---- void add_all_to_browser(struct tab *tab); [...1152 lines suppressed...] + i++ ) { + int opt = gtk_clist_optimal_column_width(GTK_CLIST(new_main_clist), i); + if (opt < 40) { + opt = 40; + } + if (opt > 150) { + opt = 150; + } + gtk_clist_set_column_width(GTK_CLIST(new_main_clist), i, opt); + } ! gtk_clist_thaw(GTK_CLIST(new_main_clist)); free_attrlist(attrlist); add_to_search_history(tab); SEARCHTAB(tab)->search_lock = 0; } static void results_popup_menu(struct tab *tab, GdkEventButton *event, Index: search.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/search.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** search.h 18 Oct 2003 08:27:00 -0000 1.14 --- search.h 19 Oct 2003 12:06:42 -0000 1.15 *************** *** 41,44 **** --- 41,51 ---- struct resultset *set; GList *history; + + int last_options_tab; + + int scope; + int chase_ref; + int max_depth; + GList *attrs; }; *************** *** 57,69 **** }; struct tab *new_searchmode(); void servername_changed_callback(struct tab *tab); - gint searchbase_button_pressed(GtkWidget *widget, GdkEventButton *event, struct tab *tab); - void findbutton_pressed_callback(struct tab *tab); - - int column_by_attr(struct attrs **attrlist, char *attribute); - int new_attr(struct attrs **attrlist, char *attr); - struct attrs *find_attr(struct attrs *attrlist, char *attr); - void free_cur_attrs(struct attrs *attrlist); char *make_filter(struct ldapserver *server, char *querystring); --- 64,71 ---- }; + #define SEARCHBOX_PADDING 2 + struct tab *new_searchmode(); void servername_changed_callback(struct tab *tab); char *make_filter(struct ldapserver *server, char *querystring); |
From: <sta...@us...> - 2003-10-19 13:05:38
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv30790 Modified Files: state.c state.h Log Message: * Added convenience functions for the freeing and copying of GLists of g_malloc'd strings Index: state.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/state.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** state.c 17 Oct 2003 10:20:38 -0000 1.8 --- state.c 19 Oct 2003 11:53:17 -0000 1.9 *************** *** 323,326 **** --- 323,346 ---- } + GList *copy_list_of_strings(const GList *src) + { + GList *l = NULL; + const GList *I; + for (I = src ; I ; I = g_list_next(I) ) { + l = g_list_append(l, g_strdup(I->data)); + } + return l; + } + + GList *free_list_of_strings(GList *l) + { + if (l) { + g_list_foreach(l, (GFunc) g_free, NULL); + g_list_free(l); + } + return NULL; + } + + void state_value_set_list(const char *state_name, const char *value_name, Index: state.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/state.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** state.h 19 Oct 2003 11:48:02 -0000 1.6 --- state.h 19 Oct 2003 11:53:17 -0000 1.7 *************** *** 60,63 **** --- 60,67 ---- const char *value_name); + /* convenience functions for common list manipulations */ + GList *copy_list_of_strings(const GList *src); + GList *free_list_of_strings(GList *l); + /* The list set her MUST be a list of strings - nothing else will work */ void state_value_set_list(const char *state_name, |
From: <sta...@us...> - 2003-10-19 12:48:16
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv1002 Modified Files: dn-browse.c Log Message: * Get rid of yet another compile-time warning Index: dn-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dn-browse.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dn-browse.c 18 Oct 2003 08:26:59 -0000 1.3 --- dn-browse.c 19 Oct 2003 12:08:58 -0000 1.4 *************** *** 51,60 **** #include "errorchain.h" #include "util.h" #include "i18n.h" #include "utf8-compat.h" #include "ldif.h" - - static void tree_row_search_below(GtkMenuItem *menuitem, struct tab *tab) --- 51,59 ---- #include "errorchain.h" #include "util.h" + #include "encode.h" #include "i18n.h" #include "utf8-compat.h" #include "ldif.h" static void tree_row_search_below(GtkMenuItem *menuitem, struct tab *tab) |
From: <sta...@us...> - 2003-10-19 12:31:53
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv30586 Modified Files: util.c Log Message: * Fixed error-handling for quiet open_connection calls Index: util.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.c,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** util.c 18 Oct 2003 08:27:00 -0000 1.74 --- util.c 19 Oct 2003 11:51:35 -0000 1.75 *************** *** 414,419 **** } ! if (!server->quiet) error_flush(open_context); ! #warning "ADD error_clear" if (rc != LDAP_SUCCESS) { if (newpw) server->enteredpw[0] = 0; --- 414,420 ---- } ! if (server->quiet) error_clear(open_context); ! error_flush(open_context); ! if (rc != LDAP_SUCCESS) { if (newpw) server->enteredpw[0] = 0; |
From: <sta...@us...> - 2003-10-19 12:26:48
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv30111 Modified Files: encode.h errorchain.h state.h Log Message: * Made header file self-contained Index: encode.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/encode.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** encode.h 4 Oct 2003 09:52:24 -0000 1.10 --- encode.h 19 Oct 2003 11:48:02 -0000 1.11 *************** *** 1,5 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 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 *************** *** 28,31 **** --- 29,33 ---- #include <glib.h> + #include <stdlib.h> /* size_t */ #include "config.h" Index: errorchain.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/errorchain.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** errorchain.h 9 Oct 2003 05:18:10 -0000 1.8 --- errorchain.h 19 Oct 2003 11:48:02 -0000 1.9 *************** *** 1,5 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 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 *************** *** 27,30 **** --- 28,32 ---- #define GQ_ERRORCHAIN_H_INCLUDED + #include <glib.h> /* G_GNUC_PRINTF */ #include <ldap.h> /* LDAP */ #include "config.h" Index: state.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/state.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** state.h 14 Oct 2003 22:28:39 -0000 1.5 --- state.h 19 Oct 2003 11:48:02 -0000 1.6 *************** *** 28,32 **** #define GQ_STATE_H_INCLUDED ! #include "config.h" --- 28,33 ---- #define GQ_STATE_H_INCLUDED ! #include "config.h" ! #include <gtk/gtk.h> |
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv325 Modified Files: browse.c browse.h common.h configfile.c configfile.h dn-browse.c dt_password.c errorchain.c formfill.c gq-xml.c input.c prefs.c ref-browse.c schemabrowse.c search.c search.h server-browse.c template.c tinput.c util.c util.h Log Message: * A HUGE change: struct ldapserver now uses reference counting. This is required to avoid some core-dumping bugs where servers get deleted and other parts of gq still hold references to such deleted server. There was no other elegant way to solve such problems. This change was also required for the referral support in search mode. The new policy here is: Whenever a ldapserver * gets stored permanently in some other structure ldapserver_ref must be called for this server. When the reference is no longer needed the server must be ldapserver_unref'd. This also includes cases where a ldapserver gets stored as data along with some GtkObject - set the unref call through gtk_object_set_data_full. THIS IS CRITICALLY IMPORTANT. * Referral support in search mode. This support does not use referral chasing in the LDAP library but does it itself. This is required in order to be able to edit and change entries obtained through a referral, because this information might be available only through the referral. * The requirements for browse mode and search mode were incompatible wrt ref handling. Thus the setting of the ManageDSAit control is now done on a per-search basis without much need to have a configuration option (the old show_ref setting). However, in search mode it might be interesting to be able to search from referrals instead of following them - TODO. This required the use for the ldap_search_ext extended search function. * Some cleanups Index: browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.c,v retrieving revision 1.85 retrieving revision 1.86 diff -C2 -d -r1.85 -r1.86 *** browse.c 17 Oct 2003 10:20:36 -0000 1.85 --- browse.c 18 Oct 2003 08:26:59 -0000 1.86 *************** *** 654,658 **** GtkCTreeNode *tree_node_from_server_dn(GtkCTree *ctree, ! const struct ldapserver *server, const char *dn) { --- 654,658 ---- GtkCTreeNode *tree_node_from_server_dn(GtkCTree *ctree, ! struct ldapserver *server, const char *dn) { *************** *** 665,668 **** --- 665,669 ---- sd->found = NULL; + ldapserver_ref(server); gtk_ctree_pre_recursive(ctree, NULL, /* root */ *************** *** 671,674 **** --- 672,676 ---- thenode = sd->found; + ldapserver_unref(server); g_free(sd); *************** *** 677,681 **** ! GtkCTreeNode *server_node_from_server(GtkCTree *ctree, const struct ldapserver *server) { --- 679,683 ---- ! GtkCTreeNode *server_node_from_server(GtkCTree *ctree, struct ldapserver *server) { *************** *** 907,912 **** if ((ld = open_connection(server)) != NULL) { LDAPMessage *res, *e; ! int rc = ldap_search_s(ld, s->str, LDAP_SCOPE_BASE, ! "(objectClass=*)", attrs, 0, &res); if (rc == LDAP_SUCCESS) { e = ldap_first_entry(ld, res); --- 909,940 ---- if ((ld = open_connection(server)) != NULL) { LDAPMessage *res, *e; ! 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) { e = ldap_first_entry(ld, res); *************** *** 920,923 **** --- 948,953 ---- } ldap_msgfree(res); + } else { + /* FIXME report error */ } *************** *** 1091,1094 **** --- 1121,1125 ---- csl->list = g_list_append(csl->list, thisserver); + ldapserver_ref(thisserver); } } *************** *** 1125,1137 **** /* is this server still in the list of configured servers? */ ! struct ldapserver *server; ! GList *I; ! ! for (I = config->servers ; I ; I = g_list_next(I)) { ! server = (struct ldapserver *) I->data; ! if (thisserver == server) { ! found = 1; ! break; ! } } --- 1156,1161 ---- /* is this server still in the list of configured servers? */ ! if (g_list_find(config->servers, thisserver)) { ! found = 1; } *************** *** 1159,1163 **** } } ! if (csl.list) g_list_free(csl.list); } --- 1183,1191 ---- } } ! ! if (csl.list) { ! g_list_foreach(csl.list, (GFunc) ldapserver_unref, NULL); ! g_list_free(csl.list); ! } } Index: browse.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.h,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** browse.h 17 Oct 2003 07:26:25 -0000 1.33 --- browse.h 18 Oct 2003 08:26:59 -0000 1.34 *************** *** 167,171 **** GtkCTreeNode *tree_node_from_server_dn(GtkCTree *ctree, ! const struct ldapserver *server, const char *dn); --- 167,171 ---- GtkCTreeNode *tree_node_from_server_dn(GtkCTree *ctree, ! struct ldapserver *server, const char *dn); Index: common.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/common.h,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** common.h 17 Oct 2003 06:52:39 -0000 1.29 --- common.h 18 Oct 2003 08:26:59 -0000 1.30 *************** *** 71,75 **** char *name; char *ldaphost; ! int ldapport; char *basedn; char *binddn; --- 71,75 ---- char *name; char *ldaphost; ! int ldapport; char *basedn; char *binddn; *************** *** 80,93 **** considerably */ char *enteredpw; ! int bindtype; char *saslmechanism; char *searchattr; ! int maxentries; ! int cacheconn; ! int enabletls; ! long local_cache_timeout; ! int ask_pw; ! int show_ref; ! int hide_internal; /* the canonical name of the host. Essentially this is the --- 80,93 ---- considerably */ char *enteredpw; ! int bindtype; char *saslmechanism; char *searchattr; ! int maxentries; ! int cacheconn; ! int enabletls; ! long local_cache_timeout; ! int ask_pw; ! int show_ref; ! int hide_internal; /* the canonical name of the host. Essentially this is the *************** *** 97,113 **** /* a flag indicating if ldaphost seems to be a URI or not */ ! int is_uri; LDAP *connection; ! int incarnation; /* number of bind operations done so far, ! never decremented - this is a purely ! statistical number */ ! int missing_closes; /* incremented on every open_connection, ! decremented on each close, close_connection ! really closes only if this drops to zero */ struct server_schema *ss; ! int flags; ! int version; /* server_down is a flag set by the SIGPIPE signal handler and in case of an LDAP_SERVER_DOWN error. It indicates that we should --- 97,135 ---- /* a flag indicating if ldaphost seems to be a URI or not */ ! int is_uri; ! ! /* if quiet is non-zero open_connection will not pop-up any error ! or questions */ ! int quiet; ! ! /* reference count. maintained through ldapserver_ref and ! ldapserver_unref. Similar to the reference counting within ! gtk. The last ldapserver_unref will delete the object (when ! refcount becomes <= 0). ! ! Whenever a ldapserver object get stored for a longer period of ! time (that is, whenever a structure holding a pointer to the ! object is not freed within the same function it is create in) ! the object should be ref'd. ! ! Objects are created with a refcount of 0. This means that such ! an object is actually "floating". ! */ ! int refcount; ! ! /* internal data */ LDAP *connection; ! int incarnation; /* number of bind operations done so far, ! never decremented - this is a purely ! statistical number */ ! int missing_closes; /* incremented on every open_connection, ! decremented on each close, ! close_connection really closes only if ! this drops to zero */ struct server_schema *ss; ! int flags; ! int version; /* server_down is a flag set by the SIGPIPE signal handler and in case of an LDAP_SERVER_DOWN error. It indicates that we should *************** *** 119,124 **** pages mention it though) nor is it actually available through ldap.h */ ! int server_down; }; #ifdef USE_G_SNPRINTF --- 141,150 ---- pages mention it though) nor is it actually available through ldap.h */ ! int server_down; }; + + void ldapserver_ref(struct ldapserver *); + void ldapserver_unref(struct ldapserver *); + #ifdef USE_G_SNPRINTF Index: configfile.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.c,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** configfile.c 17 Oct 2003 10:20:37 -0000 1.45 --- configfile.c 18 Oct 2003 08:26:59 -0000 1.46 *************** *** 52,55 **** --- 52,56 ---- struct gq_config *config; + GList *transient_servers = NULL; const struct tokenlist token_searchargument[] = { *************** *** 114,117 **** --- 115,120 ---- newserver->server_down = 0; + newserver->refcount = 0; + return(newserver); } *************** *** 120,123 **** --- 123,129 ---- #define DEEPCOPY(t,s,n) t->n = s->n ? g_strdup(s->n) : NULL #define SHALLOWCOPY(t,s,n) t->n = s->n + + /** NOTE: copy_ldapserver sets the target refcount to 0! */ + void copy_ldapserver(struct ldapserver *target, const struct ldapserver *source) *************** *** 152,155 **** --- 158,163 ---- target->version = LDAP_VERSION2; target->server_down = 0; + + target->refcount = 0; } *************** *** 172,176 **** } ! void free_ldapserver(struct ldapserver *server) { if (server->connection) { --- 180,184 ---- } ! static void free_ldapserver(struct ldapserver *server) { if (server->connection) { *************** *** 193,200 **** --- 201,230 ---- } + + void ldapserver_ref(struct ldapserver *server) + { + if (server) server->refcount++; + } + + void ldapserver_unref(struct ldapserver *server) + { + if (server) { + server->refcount--; + if (server->refcount <= 0) { + /* HACK HACK HACK : FIXME */ + if (is_transient_server(server)) { + transient_remove_server(server); + } + + free_ldapserver(server); + } + } + } + void config_add_server(struct gq_config *config, struct ldapserver *newserver) { config->servers = g_list_append(config->servers, newserver); + ldapserver_ref(newserver); } *************** *** 204,207 **** --- 234,249 ---- { config->servers = g_list_remove(config->servers, server); + ldapserver_unref(server); + } + + /* transient servers are transient by definition. Thus no _ref/_unref */ + void transient_add_server(struct ldapserver *newserver) + { + transient_servers = g_list_append(transient_servers, newserver); + } + + void transient_remove_server(struct ldapserver *server) + { + transient_servers = g_list_remove(transient_servers, server); } *************** *** 650,655 **** } - - config_write(wc, "<defaults>\n"); wc->indent++; --- 692,695 ---- *************** *** 808,813 **** server = (struct ldapserver *) I->data; close_connection(server, TRUE); ! free_ldapserver(server); } /* free templates */ --- 848,854 ---- server = (struct ldapserver *) I->data; close_connection(server, TRUE); ! ldapserver_unref(server); } + g_list_free(cfg->servers); /* free templates */ Index: configfile.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.h,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** configfile.h 17 Oct 2003 06:52:39 -0000 1.31 --- configfile.h 18 Oct 2003 08:26:59 -0000 1.32 *************** *** 152,158 **** struct ldapserver *new_ldapserver(void); void copy_ldapserver(struct ldapserver *target, const struct ldapserver *source); - void free_ldapserver(struct ldapserver *server); /* canonicalize_ldapserver - to be called whenever the server-related --- 152,159 ---- struct ldapserver *new_ldapserver(void); + + /** NOTE: copy_ldapserver sets the target refcount to 0 */ void copy_ldapserver(struct ldapserver *target, const struct ldapserver *source); /* canonicalize_ldapserver - to be called whenever the server-related *************** *** 178,182 **** --- 179,188 ---- void free_config(struct gq_config *cfg); + void transient_add_server(struct ldapserver *newserver); + void transient_remove_server(struct ldapserver *server); + extern struct gq_config *config; + extern GList *transient_servers; + extern const struct tokenlist token_bindtype[]; extern const struct tokenlist token_ldifformat[]; Index: dn-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dn-browse.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dn-browse.c 17 Oct 2003 10:20:37 -0000 1.2 --- dn-browse.c 18 Oct 2003 08:26:59 -0000 1.3 *************** *** 164,167 **** --- 164,168 ---- iform->dn = NULL; iform->server = server; + ldapserver_ref(server); formlist = formfill_from_template(server, template); *************** *** 180,185 **** create_form_content(iform); build_inputform(iform); ! } ! else { free_inputform(iform); } --- 181,185 ---- create_form_content(iform); build_inputform(iform); ! } else { free_inputform(iform); } *************** *** 262,270 **** gmessage = g_string_sized_new(256); for (I = g_list_first(bases) ; I ; I = g_list_next(I)) { statusbar_msg(_("Subtree search on %s"), (char *) I->data); msg = ldap_search_s(ld, (char *) I->data, LDAP_SCOPE_SUBTREE, "(objectclass=*)", NULL, 0, &res); ! if(msg == LDAP_SUCCESS) { for(e = ldap_first_entry(ld, res); e; e = ldap_next_entry(ld, e)) { g_string_truncate(out, 0); --- 262,296 ---- gmessage = g_string_sized_new(256); for (I = g_list_first(bases) ; I ; I = g_list_next(I)) { + LDAPControl ct; + LDAPControl *ctrls[2] = { NULL, NULL } ; + int rc; + statusbar_msg(_("Subtree search on %s"), (char *) I->data); msg = ldap_search_s(ld, (char *) I->data, LDAP_SCOPE_SUBTREE, "(objectclass=*)", NULL, 0, &res); ! ! ct.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! ct.ldctl_value.bv_val = NULL; ! ct.ldctl_value.bv_len = 0; ! ct.ldctl_iscritical = 1; ! ! ctrls[0] = &ct; ! ! rc = ldap_search_ext(ld, (char *) I->data, ! LDAP_SCOPE_SUBTREE, ! "(objectClass=*)", NULL, 0, ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &msg); ! ! ! if (rc != -1) { ! rc = ldap_result(ld, msg, 1, NULL, &res); ! } ! ! if (rc != -1) { for(e = ldap_first_entry(ld, res); e; e = ldap_next_entry(ld, e)) { g_string_truncate(out, 0); *************** *** 286,307 **** } ldap_msgfree(res); ! } else if (msg == LDAP_SERVER_DOWN) { ! server->server_down++; ! ldap_msgfree(res); /* is this correct? */ ! ! error_push(ctx, ! _("Server '%s' down. Export may be incomplete!"), ! server->name); ! push_ldap_addl_error(ld, ctx); ! goto fail; } else { ! /* report error */ ! error_push(ctx, ! _("LDAP error while searching below '%s'. Export may be incomplete!"), ! (char *) I->data); ! push_ldap_addl_error(ld, ctx); ! /* statusbar_msg(ldap_err2string(ldap_result2error(ld, */ ! /* res, 1))); */ ! goto fail; } } --- 312,335 ---- } ldap_msgfree(res); ! rc = LDAP_SUCCESS; } else { ! rc = ldap_result2error(ld, res, TRUE); ! if (msg == LDAP_SERVER_DOWN) { ! server->server_down++; ! ! error_push(ctx, ! _("Server '%s' down. Export may be incomplete!"), ! server->name); ! push_ldap_addl_error(ld, ctx); ! goto fail; ! } else { ! /* report error */ ! error_push(ctx, ! _("LDAP error while searching below '%s'." ! " Export may be incomplete!"), ! (char *) I->data); ! push_ldap_addl_error(ld, ctx); ! goto fail; ! } } } *************** *** 353,357 **** filesel = gtk_file_selection_new(_("Save LDIF")); ! gtk_object_set_data(GTK_OBJECT(filesel), "server", server); gtk_object_set_data(GTK_OBJECT(filesel), "entry", entry); --- 381,388 ---- filesel = gtk_file_selection_new(_("Save LDIF")); ! gtk_object_set_data_full(GTK_OBJECT(filesel), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_object_set_data(GTK_OBJECT(filesel), "entry", entry); *************** *** 476,479 **** --- 507,512 ---- char *c, **refs; int context = error_new_context(_("Expand entry")); + LDAPControl ct; + LDAPControl *ctrls[2] = { NULL, NULL } ; assert(IS_DN_ENTRY(entry)); *************** *** 513,561 **** #endif ! /* check if this is a referral object */ - if (server->show_ref) { - msg = ldap_search(ld, entry->dn, LDAP_SCOPE_BASE, - "objectclass=referral", ref, 0); ! if(msg == -1) { ! statusbar_msg("%s", ldap_err2string(msg)); ! close_connection(server, FALSE); ! gtk_clist_thaw(GTK_CLIST(ctree)); ! ! error_flush(context); ! return; ! } ! while((rc = ldap_result(ld, msg, 0, ! NULL, &res)) == LDAP_RES_SEARCH_ENTRY) { ! for(e = ldap_first_entry(ld, res) ; e != NULL ; ! e = ldap_next_entry(ld, e)) { ! char **vals = ldap_get_values(ld, e, "ref"); ! int i; ! ! if (vals == NULL) continue; ! for(i = 0; vals[i]; i++) { ! entry->is_ref = TRUE; /* now we know for sure */ ! ref_browse_single_add(vals[i], ctree, node); ! } } - ldap_msgfree(res); - } - if (entry->is_ref) { - entry->seen = TRUE; - statusbar_msg(_("Showing referrals")); - gtk_clist_thaw(GTK_CLIST(ctree)); - close_connection(server, FALSE); - return; } } ! msg = ldap_search(ld, entry->dn, LDAP_SCOPE_ONELEVEL, ! "objectclass=*", dummy, 1); ! ! if(msg == -1) { ! statusbar_msg("Error while searching below '%1$s': %2$s", entry->dn, ldap_err2string(msg)); --- 546,619 ---- #endif ! ct.ldctl_oid = LDAP_CONTROL_MANAGEDSAIT; ! ct.ldctl_value.bv_val = NULL; ! ct.ldctl_value.bv_len = 0; ! ct.ldctl_iscritical = 1; ! ! ctrls[0] = &ct; ! /* check if this is a referral object */ ! rc = ldap_search_ext(ld, entry->dn, ! LDAP_SCOPE_BASE, ! "(objectClass=referral)", ref, 0, ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &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, ! NULL, &res)) == LDAP_RES_SEARCH_ENTRY) { ! for(e = ldap_first_entry(ld, res) ; e != NULL ; ! e = ldap_next_entry(ld, e)) { ! char **vals = ldap_get_values(ld, e, "ref"); ! int i; ! ! if (vals == NULL) continue; ! ! for(i = 0; vals[i]; i++) { ! entry->is_ref = TRUE; /* now we know for sure */ ! ref_browse_single_add(vals[i], ctree, node); } } + ldap_msgfree(res); } ! if (entry->is_ref) { ! entry->seen = TRUE; ! statusbar_msg(_("Showing referrals")); ! gtk_clist_thaw(GTK_CLIST(ctree)); ! close_connection(server, FALSE); ! return; ! } ! ! ! ! ! ! rc = ldap_search_ext(ld, entry->dn, ! LDAP_SCOPE_ONELEVEL, ! "(objectClass=*)", dummy, 1, ! ctrls, /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &msg); ! ! if(rc != LDAP_SUCCESS) { ! statusbar_msg(_("Error while searching below '%1$s': %2$s"), entry->dn, ldap_err2string(msg)); *************** *** 708,711 **** --- 766,771 ---- iform->server = server; + ldapserver_ref(server); + iform->edit = 1; *************** *** 746,751 **** create_form_content(iform); build_inputform(iform); ! } ! else { inputform_free(iform); BROWSETAB(tab)->inputform = NULL; --- 806,810 ---- create_form_content(iform); build_inputform(iform); ! } else { inputform_free(iform); BROWSETAB(tab)->inputform = NULL; *************** *** 829,833 **** template = (struct gq_template *) templatelist->data; menu_item = gtk_menu_item_new_with_label(template->name); ! gtk_object_set_data(GTK_OBJECT(menu_item), "server", server); gtk_object_set_data(GTK_OBJECT(menu_item), "entry", entry); gtk_menu_append(GTK_MENU(submenu), menu_item); --- 888,895 ---- template = (struct gq_template *) templatelist->data; menu_item = gtk_menu_item_new_with_label(template->name); ! gtk_object_set_data_full(GTK_OBJECT(menu_item), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_object_set_data(GTK_OBJECT(menu_item), "entry", entry); gtk_menu_append(GTK_MENU(submenu), menu_item); Index: dt_password.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_password.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** dt_password.c 17 Oct 2003 10:07:40 -0000 1.18 --- dt_password.c 18 Oct 2003 08:26:59 -0000 1.19 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_password.c) 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 *************** *** 352,356 **** if (temp > max_width) max_width = temp; ! cryptlist = g_list_append(cryptlist, cryptmap[i].keyword); } gtk_combo_set_popdown_strings(GTK_COMBO(combo), cryptlist); --- 350,354 ---- if (temp > max_width) max_width = temp; ! cryptlist = g_list_append(cryptlist, (char *) cryptmap[i].keyword); } gtk_combo_set_popdown_strings(GTK_COMBO(combo), cryptlist); Index: errorchain.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/errorchain.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** errorchain.c 17 Oct 2003 06:31:16 -0000 1.17 --- errorchain.c 18 Oct 2003 08:26:59 -0000 1.18 *************** *** 83,95 **** struct errchain *chain; GString *str; ! int n, a; a = strlen(fmt) + 50; str = g_string_sized_new(a); /* used for glib1 compatibility */ /* I hope it is ok to repeatadly use ap like this */ - do { n = vsnprintf(str->str, a - 1, fmt, ap); /* await both n==-1 and n > a -1 for not enough free space */ if (n > a - 1) { --- 83,95 ---- struct errchain *chain; GString *str; ! int n, a, retry = 0; a = strlen(fmt) + 50; str = g_string_sized_new(a); /* used for glib1 compatibility */ /* I hope it is ok to repeatadly use ap like this */ do { n = vsnprintf(str->str, a - 1, fmt, ap); + retry = 0; /* await both n==-1 and n > a -1 for not enough free space */ if (n > a - 1) { *************** *** 97,106 **** a = n + 2; str = g_string_sized_new(a); } else if (n == -1) { g_string_free(str, TRUE); a *= 2; str = g_string_sized_new(a); } ! } while (n > (a - 1) || n == -1); /* plug into messagechain */ --- 97,108 ---- a = n + 2; str = g_string_sized_new(a); + retry = 1; } else if (n == -1) { g_string_free(str, TRUE); a *= 2; str = g_string_sized_new(a); + retry = 1; } ! } while (retry); /* plug into messagechain */ Index: formfill.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/formfill.c,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** formfill.c 17 Oct 2003 06:28:59 -0000 1.39 --- formfill.c 18 Oct 2003 08:26:59 -0000 1.40 *************** *** 1,5 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 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 *************** *** 122,125 **** --- 123,127 ---- free_formfill_values(form); if (form->widgetList) g_list_free(form->widgetList); + if (form->server) ldapserver_unref(form->server); g_free(form); } *************** *** 237,240 **** --- 239,244 ---- form->server = server; + ldapserver_ref(server); + strncpy(form->attrname, c, MAX_ATTR_LEN); if (c) g_free(c); *************** *** 294,297 **** --- 298,303 ---- completly NUL inited object */ newform->server = oldform->server; + if (newform->server) ldapserver_ref(newform->server); + strncpy(newform->attrname, oldform->attrname, sizeof(newform->attrname)); Index: gq-xml.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/gq-xml.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** gq-xml.c 17 Oct 2003 07:27:51 -0000 1.7 --- gq-xml.c 18 Oct 2003 08:26:59 -0000 1.8 *************** *** 273,277 **** struct ldapserver *server = new_ldapserver(); e->data = server; ! e->free_data = (free_func) free_ldapserver; } --- 273,277 ---- struct ldapserver *server = new_ldapserver(); e->data = server; ! e->free_data = (free_func) ldapserver_unref; } *************** *** 294,298 **** canonicalize_ldapserver(server); ! c->servers = g_list_append(c->servers, server); e->data = NULL; --- 294,298 ---- canonicalize_ldapserver(server); ! config_add_server(c, server); e->data = NULL; Index: input.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/input.c,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** input.c 17 Oct 2003 10:20:38 -0000 1.72 --- input.c 18 Oct 2003 08:26:59 -0000 1.73 *************** *** 96,99 **** --- 96,103 ---- } + if (iform->server) { + ldapserver_unref(iform->server); + } + g_free(iform); } *************** *** 983,986 **** --- 987,991 ---- iform->close_window = 1; iform->server = server; + ldapserver_ref(server); iform->dn = g_strdup(dn); iform->olddn = g_strdup(dn); *************** *** 1003,1006 **** --- 1008,1012 ---- iform = new_inputform(); iform->server = server; + ldapserver_ref(server); #ifdef HAVE_LDAP_STR2OBJECTCLASS *************** *** 2278,2281 **** --- 2284,2288 ---- if(ff) { ff->server = server; + ldapserver_ref(server); strncpy(ff->attrname, outbuf, MAX_ATTR_LEN); ff->flags |= FLAG_EXTENSIBLE_OBJECT_ATTR; Index: prefs.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/prefs.c,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** prefs.c 17 Oct 2003 07:16:14 -0000 1.44 --- prefs.c 18 Oct 2003 08:26:59 -0000 1.45 *************** *** 157,163 **** if (cb_data->server) { config_remove_server(config, cb_data->server); - free_ldapserver(cb_data->server); } } g_free(cb_data); } --- 157,164 ---- if (cb_data->server) { config_remove_server(config, cb_data->server); } } + if (cb_data->server) + ldapserver_unref(cb_data->server); g_free(cb_data); } *************** *** 346,355 **** update_serverlist(&mainwin); ! if (cb_data->edit_new_server) { ! /* everything ok, take the server out of the cb_data (in case it ! was created anew, this will avoid that the cb_data destroy ! function deletes the ldapserver) */ ! cb_data->server = NULL; ! } gtk_widget_destroy(window); --- 347,356 ---- update_serverlist(&mainwin); ! /* if (cb_data->edit_new_server) { */ ! /* /\* everything ok, take the server out of the cb_data (in case it */ ! /* was created anew, this will avoid that the cb_data destroy */ ! /* function deletes the ldapserver) *\/ */ ! /* cb_data->server = NULL; */ ! /* } */ gtk_widget_destroy(window); *************** *** 445,448 **** --- 446,450 ---- cb_data->server = server; + ldapserver_ref(server); #if GTK_MAJOR < 2 *************** *** 1143,1147 **** serverlist[0] = server->name; gtk_clist_append(GTK_CLIST(clist), serverlist); ! gtk_clist_set_row_data(GTK_CLIST(clist), row, (gpointer) server); row++; } --- 1145,1152 ---- serverlist[0] = server->name; gtk_clist_append(GTK_CLIST(clist), serverlist); ! gtk_clist_set_row_data_full(GTK_CLIST(clist), row, ! (gpointer) server, ! (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); row++; } Index: ref-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ref-browse.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ref-browse.c 17 Oct 2003 10:20:38 -0000 1.2 --- ref-browse.c 18 Oct 2003 08:26:59 -0000 1.3 *************** *** 2,6 **** GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen ! Parts: Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with --- 2,6 ---- GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with *************** *** 31,34 **** --- 31,35 ---- #include <errno.h> #include <string.h> + #include <stdlib.h> /* free */ #include <config.h> *************** *** 46,49 **** --- 47,51 ---- #include "i18n.h" #include "errorchain.h" + #include "encode.h" /**************************************************************************/ *************** *** 58,62 **** g_free_if(entry->uri); if (entry->server) { ! free_ldapserver(entry->server); entry->server = NULL; } --- 60,64 ---- g_free_if(entry->uri); if (entry->server) { ! ldapserver_unref(entry->server); /* removes from transient list as well */ entry->server = NULL; } *************** *** 163,168 **** newserver->show_ref = 1; /* check: do we have this server around already??? */ ! server = server_by_canon_name(new_uri->str); if (!server) { --- 165,171 ---- newserver->show_ref = 1; + #warning "ADD CONFIG FOR EXTENDED REFERENCE CHASING" /* check: do we have this server around already??? */ ! server = server_by_canon_name(new_uri->str, TRUE); if (!server) { *************** *** 203,207 **** --- 206,214 ---- canonicalize_ldapserver(newserver); + transient_add_server(newserver); + entry->server = newserver; + ldapserver_ref(newserver); + entry->expanded = TRUE; Index: schemabrowse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/schemabrowse.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** schemabrowse.c 17 Oct 2003 07:27:51 -0000 1.25 --- schemabrowse.c 18 Oct 2003 08:26:59 -0000 1.26 *************** *** 192,197 **** SCHEMATAB(tab)->treeroot); gtk_object_set_data(GTK_OBJECT(new_item), "tab", tab); ! gtk_object_set_data(GTK_OBJECT(new_item), "server", ! (gpointer) server); gtk_tree_append(GTK_TREE(SCHEMATAB(tab)->treeroot), new_item); --- 192,199 ---- SCHEMATAB(tab)->treeroot); gtk_object_set_data(GTK_OBJECT(new_item), "tab", tab); ! gtk_object_set_data_full(GTK_OBJECT(new_item), "server", ! (gpointer) server, ! (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); gtk_tree_append(GTK_TREE(SCHEMATAB(tab)->treeroot), new_item); *************** *** 245,249 **** new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data(GTK_OBJECT(new_subtree), "server", server); gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); --- 247,255 ---- new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data_full(GTK_OBJECT(new_subtree), "server", ! server, ! (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); *************** *** 279,283 **** new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data(GTK_OBJECT(new_subtree), "server", server); gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); --- 285,293 ---- new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data_full(GTK_OBJECT(new_subtree), "server", ! server, ! (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); *************** *** 313,317 **** new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data(GTK_OBJECT(new_subtree), "server", server); gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); --- 323,331 ---- new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data_full(GTK_OBJECT(new_subtree), "server", ! server, ! (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); *************** *** 347,351 **** new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data(GTK_OBJECT(new_subtree), "server", server); gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); --- 361,369 ---- new_subtree = gtk_tree_new(); GTK_WIDGET_UNSET_FLAGS(new_subtree, GTK_CAN_FOCUS); ! gtk_object_set_data_full(GTK_OBJECT(new_subtree), "server", ! server, ! (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_widget_show(new_subtree); gtk_tree_item_set_subtree(GTK_TREE_ITEM(new_item), new_subtree); *************** *** 895,899 **** /* Required attributes */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_oc_vbox), "required"); ! gtk_object_set_data(GTK_OBJECT(clist), "server", server); gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); --- 913,920 ---- /* Required attributes */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_oc_vbox), "required"); ! gtk_object_set_data_full(GTK_OBJECT(clist), "server", ! server,(GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); *************** *** 909,913 **** /* Allowed attributes */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_oc_vbox), "allowed"); ! gtk_object_set_data(GTK_OBJECT(clist), "server", server); gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); --- 930,937 ---- /* Allowed attributes */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_oc_vbox), "allowed"); ! gtk_object_set_data_full(GTK_OBJECT(clist), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); *************** *** 1306,1310 **** clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedoc"); ! gtk_object_set_data(GTK_OBJECT(clist), "server", server); gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); --- 1330,1337 ---- clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedoc"); ! gtk_object_set_data_full(GTK_OBJECT(clist), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); *************** *** 1527,1531 **** clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedin"); ! gtk_object_set_data(GTK_OBJECT(clist), "server", server); gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); --- 1554,1561 ---- clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedin"); ! gtk_object_set_data_full(GTK_OBJECT(clist), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); *************** *** 1709,1713 **** /* Used in attribute types */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedat"); ! gtk_object_set_data(GTK_OBJECT(clist), "server", server); gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); --- 1739,1746 ---- /* Used in attribute types */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedat"); ! gtk_object_set_data_full(GTK_OBJECT(clist), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); *************** *** 1729,1733 **** /* Used in matching rules */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedmr"); ! gtk_object_set_data(GTK_OBJECT(clist), "server", server); gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); --- 1762,1769 ---- /* Used in matching rules */ clist = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(target_vbox), "usedmr"); ! gtk_object_set_data_full(GTK_OBJECT(clist), "server", ! server, (GtkDestroyNotify) ldapserver_unref); ! ldapserver_ref(server); ! gtk_clist_freeze(GTK_CLIST(clist)); gtk_clist_clear(GTK_CLIST(clist)); Index: search.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/search.c,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** search.c 17 Oct 2003 07:07:07 -0000 1.53 --- search.c 18 Oct 2003 08:27:00 -0000 1.54 *************** *** 322,344 **** ! struct resultset *new_resultset(struct tab *tab) { ! struct resultset *newset, *tmpset; ! newset = g_malloc(sizeof(struct resultset)); ! newset->objectclass = NULL; ! newset->attributes = NULL; ! newset->num_attributes = 0; ! newset->next = NULL; newset->dn = g_strdup(""); ! ! if(SEARCHTAB(tab)->cur_resultset == NULL) { ! SEARCHTAB(tab)->cur_resultset = newset; ! } ! else { ! for(tmpset = SEARCHTAB(tab)->cur_resultset; tmpset->next; tmpset = tmpset->next) ! ; ! tmpset->next = newset; ! } return(newset); --- 322,334 ---- ! struct resultset *new_resultset(struct ldapserver *server) { ! struct resultset *newset; ! newset = g_malloc0(sizeof(struct resultset)); newset->dn = g_strdup(""); ! newset->server = server; ! ! if (server) ldapserver_ref(server); return(newset); *************** *** 348,360 **** void free_resultset(struct resultset *set) { ! struct resultset *nextset; ! ! while(set) { ! nextset = set->next; g_free_if(set->dn); g_free(set); - set = nextset; } - } --- 338,346 ---- void free_resultset(struct resultset *set) { ! if (set) { ! if (set->server) ldapserver_unref(set->server); g_free_if(set->dn); g_free(set); } } *************** *** 498,501 **** --- 484,716 ---- } + static int fill_one_row(struct ldapserver *server, + LDAP *ld, LDAPMessage *e, + GtkWidget *clist, + GString **tolist, + int *columns_done, + struct attrs *attrlist, + struct tab *tab) + { + BerElement *berptr; + int i; + gchar *cl[MAX_NUM_ATTRIBUTES]; + int cur_col; + int row; + char *dn, *attr, **vals; + struct resultset *set; + + #if GTK_MAJOR < 2 + char *decoded_value; + #endif + + /* not every attribute necessarily comes back for + * every entry, so clear this every time */ + for(i = 0; i < MAX_NUM_ATTRIBUTES; i++) { + cl[i] = NULL; + g_string_truncate(tolist[i], 0); + } + + dn = ldap_get_dn(ld, e); + /* store for later reference */ + set = new_resultset(server); + g_free_and_dup(set->dn, dn); + + if(config->showdn) { + #if GTK_MAJOR >= 2 + g_string_append(tolist[0], dn); + #else + decoded_value = decoded_string(dn); + g_string_append(tolist[0], decoded_value); + free(decoded_value); + #endif + cl[0] = tolist[0]->str; + } + #if defined(HAVE_LDAP_MEMFREE) + ldap_memfree(dn); + #else + free(dn); + #endif + + for(attr = ldap_first_attribute(ld, e, &berptr); attr != NULL; + attr = ldap_next_attribute(ld, e, berptr)) { + if (!show_in_search(server, attr)) { + ldap_memfree(attr); + continue; + } + + /* This should now work for ;binary as well */ + cur_col = column_by_attr(&attrlist, attr); + if(cur_col == MAX_NUM_ATTRIBUTES) { + ldap_memfree(attr); + break; + } + + if(!columns_done[cur_col]) { + char *c = attr_strip(attr); + gtk_clist_set_column_title(GTK_CLIST(clist), cur_col, c); + if (c) g_free(c); + gtk_clist_set_column_width(GTK_CLIST(clist), cur_col, 120); + gtk_clist_set_column_resizeable(GTK_CLIST(clist), cur_col, + TRUE); + columns_done[cur_col] = 1; + } + + vals = ldap_get_values(ld, e, attr); + if(vals) { + for(i = 0; vals[i] != NULL; i++) { + #if GTK_MAJOR >= 2 + if(i == 0) { + g_string_assign(tolist[cur_col], vals[i]); + } else { + g_string_append(tolist[cur_col], " "); + g_string_append(tolist[cur_col], vals[i]); + } + #else + decoded_value = decoded_string(vals[i]); + if(i == 0) + g_string_assign(tolist[cur_col], decoded_value); + else { + g_string_append(tolist[cur_col], " "); + g_string_append(tolist[cur_col], decoded_value); + } + free(decoded_value); + #endif + } + ldap_value_free(vals); + #if GTK_MAJOR >= 2 + if (g_utf8_validate(tolist[cur_col]->str, -1, NULL)) { + cl[cur_col] = tolist[cur_col]->str; + } else { + cl[cur_col] = ""; + } + #else + cl[cur_col] = tolist[cur_col]->str; + #endif + } + ldap_memfree(attr); + } + #ifndef HAVE_OPENLDAP12 + if(berptr) + ber_free(berptr, 0); + #endif + + + for(i = MAX_NUM_ATTRIBUTES ; i >= 0 ; i--) { + if (cl[i]) { + for ( ; i >= 0 ; i-- ) { + if (!cl[i]) { + cl[i] = ""; + } + } + break; + } + } + + /* insert row into result window */ + row = gtk_clist_append(GTK_CLIST(clist), cl); + gtk_clist_set_row_data_full(GTK_CLIST(clist), row, set, + (GtkDestroyNotify) free_resultset); + + return row; + } + + + struct chasing { + struct ldapserver *server; + char *base; + }; + + static struct chasing *new_chasing(struct ldapserver *server, + const char *base) + { + struct chasing *n = g_malloc0(sizeof(struct chasing)); + n->server = server; + n->base = g_strdup(base); + if (server) ldapserver_ref(server); + return n; + } + + static void free_chasing(struct chasing *ch) + { + if (ch->server) ldapserver_unref(ch->server); + g_free_if(ch->base); + g_free(ch); + } + + + static void add_referral(struct ldapserver *server, + const char *referral, GList **nextlevel) + { + LDAPURLDesc *desc = NULL; + + if (ldap_url_parse(referral, &desc) == 0) { + GString *new_uri = g_string_sized_new(strlen(referral)); + struct ldapserver *s, *newserver; + + g_string_sprintf(new_uri, "%s://%s:%d/", + desc->lud_scheme, + desc->lud_host, + desc->lud_port); + + newserver = new_ldapserver(); + + /* some sensible settings for the "usual" case: + Anonymous bind. Also show referrals */ + newserver->ask_pw = 0; + newserver->show_ref = 1; + + #warning "ADD CONFIG FOR EXTENDED REFERENCE CHASING" + /* check: do we have this server around already??? */ + s = server_by_canon_name(new_uri->str, TRUE); + + if (!s) { + s = server; + } + + if (s) { + copy_ldapserver(newserver, s); + statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, server->name); + } else { + statusbar_msg(_("Created temporary server-definition '%1$s' with no pre-set values."), new_uri->str); + } + + g_free_and_dup(newserver->name, new_uri->str); + g_free_and_dup(newserver->ldaphost, new_uri->str); + g_free_and_dup(newserver->basedn, desc->lud_dn); + newserver->quiet = 1; + + canonicalize_ldapserver(newserver); + + transient_add_server(newserver); + + *nextlevel = g_list_append(*nextlevel, + new_chasing(newserver, desc->lud_dn)); + + ldap_free_urldesc(desc); + g_string_free(new_uri, TRUE); + } + } + + struct list_click_info { + int last_col; + int last_type; + }; + + static void click_column(GtkCList *clist, + gint column, + struct list_click_info *lci) + { + gtk_clist_set_sort_column(clist, column); + if (lci->last_col != column) { + lci->last_type = GTK_SORT_ASCENDING; + } else { + lci->last_type = (lci->last_type == GTK_SORT_ASCENDING) ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING; + } + lci->last_col = column; + + gtk_clist_set_sort_type(clist, lci->last_type); + gtk_clist_sort(clist); + + } void query(struct tab *tab) *************** *** 503,521 **** LDAP *ld; LDAPMessage *res, *e; - BerElement *berptr; GtkWidget *main_clist, *new_main_clist, *scrwin, *focusbox; GtkWidget *servcombo, *searchbase_combo; struct ldapserver *server; - struct resultset *set, *cur_resultset; - struct attrs *attrlist; gchar *cur_servername, *cur_searchbase, *enc_searchbase, *querystring; GString *tolist[MAX_NUM_ATTRIBUTES]; ! gchar *cl[MAX_NUM_ATTRIBUTES]; ! char *filter, *attr, *dn, **vals, *searchterm; int msg, rc, i, row; ! int cur_col, oc_col, columns_done[MAX_NUM_ATTRIBUTES]; ! #if GTK_MAJOR < 2 ! char *decoded_value; ! #endif if(SEARCHTAB(tab)->search_lock) return; --- 718,739 ---- LDAP *ld; LDAPMessage *res, *e; GtkWidget *main_clist, *new_main_clist, *scrwin, *focusbox; GtkWidget *servcombo, *searchbase_combo; struct ldapserver *server; gchar *cur_servername, *cur_searchbase, *enc_searchbase, *querystring; GString *tolist[MAX_NUM_ATTRIBUTES]; ! char *filter, *searchterm; int msg, rc, i, row; ! int oc_col, columns_done[MAX_NUM_ATTRIBUTES]; ! struct attrs *attrlist; ! LDAPControl c; ! LDAPControl *ctrls[2] = { NULL, NULL } ; ! char *base; ! struct list_click_info *lci; ! ! GList *thislevel = NULL, *nextlevel = NULL; ! int level = 0; ! struct chasing *ch = NULL; ! if(SEARCHTAB(tab)->search_lock) return; *************** *** 526,529 **** --- 744,748 ---- searchterm = gtk_editable_get_chars(GTK_EDITABLE(focusbox), 0, -1); querystring = encoded_string(searchterm); + g_free(searchterm); if(querystring[0] == 0) { *************** *** 537,541 **** servcombo = SEARCHTAB(tab)->serverlist_combo; ! cur_servername = gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(servcombo)->entry), 0, -1); server = server_by_name(cur_servername); if(!server) { --- 756,762 ---- servcombo = SEARCHTAB(tab)->serverlist_combo; ! cur_servername = ! gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(servcombo)->entry), ! 0, -1); server = server_by_name(cur_servername); if(!server) { *************** *** 547,555 **** g_free(cur_servername); - if( (ld = open_connection(server)) == NULL) { - SEARCHTAB(tab)->search_lock = 0; - return; - } - filter = make_filter(server, querystring); free(querystring); --- 768,771 ---- *************** *** 561,595 **** enc_searchbase = encoded_string(cur_searchbase); - - if(config->sort_search) - msg = ldap_search_s(ld, enc_searchbase, LDAP_SCOPE_SUBTREE, - filter, NULL, 0, &res); - else - msg = ldap_search(ld, enc_searchbase, LDAP_SCOPE_SUBTREE, - filter, NULL, 0); g_free(cur_searchbase); - if (enc_searchbase) free(enc_searchbase); - free(filter); - - if((config->sort_search && msg != LDAP_SUCCESS) || msg == -1) { - if (config->sort_search && msg != LDAP_SERVER_DOWN) { - server->server_down++; - } - statusbar_msg("%s", ldap_err2string(msg == -1 ? LDAP_OTHER : msg)); - g_free(searchterm); - close_connection(server, FALSE); - SEARCHTAB(tab)->search_lock = 0; - return; - } - - cur_resultset = SEARCHTAB(tab)->cur_resultset; - if(cur_resultset) { - free_resultset(cur_resultset); - SEARCHTAB(tab)->cur_resultset = NULL; - } - - SEARCHTAB(tab)->cur_resultset_server = server; ! /* build new clist */ new_main_clist = gtk_clist_new(MAX_NUM_ATTRIBUTES); --- 777,783 ---- enc_searchbase = encoded_string(cur_searchbase); g_free(cur_searchbase); ! /* setup GUI - build new clist */ new_main_clist = gtk_clist_new(MAX_NUM_ATTRIBUTES); *************** *** 625,760 **** gtk_clist_set_column_title(GTK_CLIST(new_main_clist), 0, "DN"); gtk_clist_set_column_width(GTK_CLIST(new_main_clist), 0, 260); } oc_col = column_by_attr(&attrlist, "objectClass"); ! gtk_clist_set_column_title(GTK_CLIST(new_main_clist), oc_col, "objectClass"); gtk_clist_set_column_width(GTK_CLIST(new_main_clist), oc_col, 120); columns_done[oc_col] = 1; - if(config->showoc == 0) - gtk_clist_set_column_visibility(GTK_CLIST(new_main_clist), oc_col, 0); ! row = 0; ! if(!config->sort_search) ! rc = (ldap_result(ld, msg, 0, NULL, &res) == LDAP_RES_SEARCH_ENTRY); ! else ! rc = (ldap_sort_entries(ld, &res, NULL, strcasecmp) == LDAP_SUCCESS); for(i = 0; i < MAX_NUM_ATTRIBUTES; i++) { tolist[i] = g_string_sized_new(MAX_DN_LEN); } ! while(rc) { ! for(e = ldap_first_entry(ld, res); e != NULL; ! e = ldap_next_entry(ld, e)) { ! /* not every attribute necessarily comes back for every entry, ! * so clear this every time */ ! for(i = 0; i < MAX_NUM_ATTRIBUTES; i++) { ! cl[i] = NULL; ! g_string_truncate(tolist[i], 0); ! } ! dn = ldap_get_dn(ld, e); ! /* store for later reference */ ! set = new_resultset(tab); ! g_free_and_dup(set->dn, dn); ! if(config->showdn) { ! #if GTK_MAJOR >= 2 ! g_string_append(tolist[0], dn); ! #else ! decoded_value = decoded_string(dn); ! g_string_append(tolist[0], decoded_value); ! free(decoded_value); ! #endif ! cl[0] = tolist[0]->str; ! } ! #if defined(HAVE_LDAP_MEMFREE) ! ldap_memfree(dn); ! #else ! free(dn); ! #endif ! for(attr = ldap_first_attribute(ld, e, &berptr); attr != NULL; ! attr = ldap_next_attribute(ld, e, berptr)) { ! if (!show_in_search(server, attr)) { ! ldap_memfree(attr); ! continue; ! } ! /* This should now work for ;binary as well */ ! cur_col = column_by_attr(&attrlist, attr); ! if(cur_col == MAX_NUM_ATTRIBUTES) { ! ldap_memfree(attr); break; } ! ! if(!columns_done[cur_col]) { ! char *c = attr_strip(attr); ! gtk_clist_set_column_title(GTK_CLIST(new_main_clist), cur_col, c); ! if (c) g_free(c); ! gtk_clist_set_column_width(GTK_CLIST(new_main_clist), cur_col, 120); ! gtk_clist_set_column_resizeable(GTK_CLIST(new_main_clist), cur_col, TRUE); ! columns_done[cur_col] = 1; ! } ! ! vals = ldap_get_values(ld, e, attr); ! if(vals) { ! for(i = 0; vals[i] != NULL; i++) { ! #if GTK_MAJOR >= 2 ! if(i == 0) { ! g_string_assign(tolist[cur_col], vals[i]); ! } else { ! g_string_append(tolist[cur_col], " "); ! g_string_append(tolist[cur_col], vals[i]); } ! #else ! decoded_value = decoded_string(vals[i]); ! if(i == 0) ! g_string_assign(tolist[cur_col], decoded_value); ! else { ! g_string_append(tolist[cur_col], " "); ! g_string_append(tolist[cur_col], decoded_value); } ! free(decoded_value); ! #endif } ! ldap_value_free(vals); ! #if GTK_MAJOR >= 2 ! if (g_utf8_validate(tolist[cur_col]->str, -1, NULL)) { ! cl[cur_col] = tolist[cur_col]->str; ! } else { ! cl[cur_col] = ""; } - #else - cl[cur_col] = tolist[cur_col]->str; - #endif } ! ldap_memfree(attr); } ! #ifndef HAVE_OPENLDAP12 ! if(berptr) ! ber_free(berptr, 0); ! #endif ! ! /* insert row into result window */ ! gtk_clist_append(GTK_CLIST(new_main_clist), cl); ! gtk_clist_set_row_data(GTK_CLIST(new_main_clist), row, set); ! row++; } ! if(config->sort_search) ! rc = 0; ! else ! if(server->maxentries == 0 || row < server->maxentries) { ! ldap_msgfree(res); ! res = NULL; ! rc = (ldap_result(ld, msg, 0, NULL, &res) == LDAP_RES_SEARCH_ENTRY); ! } ! else ! rc = 0; ! } for(i = 0; i < MAX_NUM_ATTRIBUTES; i++) { --- 813,961 ---- gtk_clist_set_column_title(GTK_CLIST(new_main_clist), 0, "DN"); gtk_clist_set_column_width(GTK_CLIST(new_main_clist), 0, 260); + columns_done[0] = 1; } oc_col = column_by_attr(&attrlist, "objectClass"); ! gtk_clist_set_column_title(GTK_CLIST(new_main_clist), oc_col, ! "objectClass"); gtk_clist_set_column_width(GTK_CLIST(new_main_clist), oc_col, 120); columns_done[oc_col] = 1; ! gtk_clist_set_sort_column(GTK_CLIST(new_main_clist), 0); ! ! if(config->showoc == 0) ! gtk_clist_set_column_visibility(GTK_CLIST(new_main_clist), ! oc_col, 0); for(i = 0; i < MAX_NUM_ATTRIBUTES; i++) { tolist[i] = g_string_sized_new(MAX_DN_LEN); } + + /* do the search */ + if (server->show_ref) { + 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; ! } ! thislevel = NULL; ! nextlevel = NULL; ! level = 0; ! ch = new_chasing(server, enc_searchbase); ! thislevel = g_list_append(thislevel, ch); ! if (enc_searchbase) free(enc_searchbase); ! gtk_clist_freeze(GTK_CLIST(new_main_clist)); ! row = 0; ! ! while (thislevel || nextlevel) { ! if (thislevel == NULL) { ! level++; ! thislevel = nextlevel; ! nextlevel = NULL; ! } ! ch = thislevel->data; ! thislevel = g_list_remove(thislevel, ch); ! server = ch->server; ! base = ch->base; ! if( (ld = open_connection(server)) != NULL) { ! statusbar_msg(_("Searching on server '%1$s' below '%2$s'"), ! server->name, base); ! rc = ldap_search_ext(ld, base, LDAP_SCOPE_SUBTREE, ! filter, NULL, 0, ! server->show_ref ? ctrls : NULL, ! /* serverctrls */ ! NULL, /* clientctrls */ ! NULL, /* timeout */ ! LDAP_NO_LIMIT, /* sizelimit */ ! &msg); ! ! if(rc == -1) { ! server->server_down++; ! statusbar_msg(_("Error searching below '%1$s': %2$s"), ! enc_searchbase, ldap_err2string(rc)); ! /* close_connection(server, FALSE); */ ! /* SEARCHTAB(tab)->search_lock = 0; */ ! /* return; */ ! goto cont; ! } ! ! for (rc = 1 ; rc ; ) { ! int code = ldap_result(ld, msg, 0, NULL, &res); ! if (code == -1) { ! /* error */ ! s... [truncated message content] |
From: <sta...@us...> - 2003-10-18 08:17:26
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv32412 Modified Files: dt_oc.c tdefault.c Log Message: * Got rid of const-related compile time warnings (A GList does not take const-pointers) Index: dt_oc.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_oc.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** dt_oc.c 12 Oct 2003 06:14:18 -0000 1.18 --- dt_oc.c 18 Oct 2003 08:13:17 -0000 1.19 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_oc.c) 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 *************** *** 369,372 **** --- 367,372 ---- } form->server = server; + ldapserver_ref(server); + strncpy(form->attrname, oc->oc_at_oids_must[i], MAX_ATTR_LEN); *************** *** 399,402 **** --- 399,404 ---- } form->server = server; + ldapserver_ref(server); + strncpy(form->attrname, oc->oc_at_oids_may[i], MAX_ATTR_LEN); Index: tdefault.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/tdefault.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** tdefault.c 5 Jun 2002 15:27:33 -0000 1.2 --- tdefault.c 18 Oct 2003 08:13:17 -0000 1.3 *************** *** 1,5 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2002 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 *************** *** 180,184 **** while(cryptmap[i].keyword[0]) ! combolist = g_list_append(combolist, cryptmap[i++].keyword); #endif gtk_combo_set_popdown_strings(GTK_COMBO(combo), combolist); --- 181,186 ---- while(cryptmap[i].keyword[0]) ! combolist = g_list_append(combolist, ! (char *) cryptmap[i++].keyword); #endif gtk_combo_set_popdown_strings(GTK_COMBO(combo), combolist); |
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv29329 Modified Files: browse-dnd.c browse.c configfile.c dn-browse.c input.c ldapops.c ldif.c ref-browse.c schema.c state.c Log Message: * Improved error messages, this closes a 1.0 TODO item: Now most error messages in most areas indicate what went wrong my mentioning a server, entry or other object that caused the error Index: browse-dnd.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse-dnd.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** browse-dnd.c 17 Oct 2003 07:26:25 -0000 1.16 --- browse-dnd.c 17 Oct 2003 10:20:34 -0000 1.17 *************** *** 893,897 **** server->server_down = 1; error_push(ctx, ! _("Server down. Export may be incomplete!")); push_ldap_addl_error(ld, ctx); --- 893,898 ---- server->server_down = 1; error_push(ctx, ! _("Server '%s' down. Export may be incomplete!"), ! server->name); push_ldap_addl_error(ld, ctx); *************** *** 900,904 **** if (rc != LDAP_SUCCESS) { error_push(ctx, ! _("LDAP error. Export may be incomplete!")); push_ldap_addl_error(ld, ctx); --- 901,906 ---- if (rc != LDAP_SUCCESS) { error_push(ctx, ! _("LDAP error while searching below '%s'. Export may be incomplete!"), ! dn); push_ldap_addl_error(ld, ctx); Index: browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.c,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** browse.c 17 Oct 2003 07:26:25 -0000 1.84 --- browse.c 17 Oct 2003 10:20:36 -0000 1.85 *************** *** 147,151 **** /* problem with DN */ /* printf("problem dn: %s\n", dn); */ ! error_push(ctx, _("Cannot explode DN. Maybe problems with quoting or special characters. See RFC 2253 for details of DN syntax.")); goto fail; --- 147,151 ---- /* problem with DN */ /* printf("problem dn: %s\n", dn); */ ! error_push(ctx, _("Cannot explode DN '%s'. Maybe problems with quoting or special characters. See RFC 2253 for details of DN syntax."), dn); goto fail; Index: configfile.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.c,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** configfile.c 17 Oct 2003 06:52:39 -0000 1.44 --- configfile.c 17 Oct 2003 10:20:37 -0000 1.45 *************** *** 232,236 **** home = homedir(); if(home == NULL) { ! error_push(context, _("you have no home directory!")); return(NULL); } --- 232,236 ---- home = homedir(); if(home == NULL) { ! error_push(context, _("You have no home directory!")); return(NULL); } Index: dn-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dn-browse.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dn-browse.c 17 Oct 2003 07:26:25 -0000 1.1 --- dn-browse.c 17 Oct 2003 10:20:37 -0000 1.2 *************** *** 231,236 **** if( (outfile = fopen(filename, "w")) == NULL) { ! error_push(ctx, _("Could not open output file: %s"), ! strerror(errno)); goto fail; --- 231,236 ---- if( (outfile = fopen(filename, "w")) == NULL) { ! error_push(ctx, _("Could not open output file '%1$s': %2$s"), ! filename, strerror(errno)); goto fail; *************** *** 247,252 **** if(written != out->len) { error_push(ctx, ! _("Save failed: Only %1$d of %2$d bytes written"), ! written, out->len); goto fail; /* sometimes goto is useful */ } --- 247,252 ---- if(written != out->len) { error_push(ctx, ! _("Save to '%3$s' failed: Only %1$d of %2$d bytes written"), ! written, out->len, filename); goto fail; /* sometimes goto is useful */ } *************** *** 291,295 **** error_push(ctx, ! _("Server down. Export may be incomplete!")); push_ldap_addl_error(ld, ctx); goto fail; --- 291,296 ---- error_push(ctx, ! _("Server '%s' down. Export may be incomplete!"), ! server->name); push_ldap_addl_error(ld, ctx); goto fail; *************** *** 297,301 **** /* report error */ error_push(ctx, ! _("LDAP error. Export may be incomplete!")); push_ldap_addl_error(ld, ctx); /* statusbar_msg(ldap_err2string(ldap_result2error(ld, */ --- 298,303 ---- /* report error */ error_push(ctx, ! _("LDAP error while searching below '%s'. Export may be incomplete!"), ! (char *) I->data); push_ldap_addl_error(ld, ctx); /* statusbar_msg(ldap_err2string(ldap_result2error(ld, */ *************** *** 555,559 **** if(msg == -1) { ! statusbar_msg("%s", ldap_err2string(msg)); close_connection(server, FALSE); gtk_clist_thaw(GTK_CLIST(ctree)); --- 557,563 ---- if(msg == -1) { ! 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)); *************** *** 607,610 **** --- 611,615 ---- if (rc != LDAP_SUCCESS) { + /* FIXME: better error message (but what is the exact cause?)*/ error_push(context, ldap_err2string(rc)); push_ldap_addl_error(ld, context); Index: input.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/input.c,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** input.c 17 Oct 2003 06:28:59 -0000 1.71 --- input.c 17 Oct 2003 10:20:38 -0000 1.72 *************** *** 1,5 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 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 *************** *** 1215,1222 **** char *parentdn, **rdn; add_context = error_new_context(_("Error adding entry")); /* handle impossible errors first - BTW: no need for I18N here*/ - formlist = iform->formlist; if(!formlist) { error_push(add_context, --- 1216,1225 ---- char *parentdn, **rdn; + formlist = iform->formlist; + assert(formlist); + add_context = error_new_context(_("Error adding entry")); /* handle impossible errors first - BTW: no need for I18N here*/ if(!formlist) { error_push(add_context, *************** *** 1227,1230 **** --- 1230,1234 ---- server = iform->server; + assert(server); if(!server) { *************** *** 1279,1283 **** } if(res != LDAP_SUCCESS) { ! error_push(add_context, ldap_err2string(res)); push_ldap_addl_error(ld, add_context); error_flush(add_context); --- 1283,1289 ---- } if(res != LDAP_SUCCESS) { ! error_push(add_context, _("Error adding new entry '%1$s': '%2$s'"), ! dn, ! ldap_err2string(res)); push_ldap_addl_error(ld, add_context); error_flush(add_context); *************** *** 1421,1425 **** iform->oldlist = oldlist; } else { ! error_push(mod_context, ldap_err2string(res)); push_ldap_addl_error(ld, mod_context); } --- 1427,1433 ---- iform->oldlist = oldlist; } else { ! error_push(mod_context, _("Error modifying entry '%1$s': %2$s"), ! dn, ! ldap_err2string(res)); push_ldap_addl_error(ld, mod_context); } *************** *** 1484,1488 **** /* parsing error */ ! error_push(context, _("Cannot explode DN. Maybe problems with quoting or special characters. See RFC 2253 for details of DN syntax.")); error = 1; --- 1492,1497 ---- /* parsing error */ ! error_push(context, _("Cannot explode DN '%s'. Maybe problems with quoting or special characters. See RFC 2253 for details of DN syntax."), ! dn); error = 1; *************** *** 1547,1557 **** server->server_down++; } ! #if defined(HAVE_LDAP_RENAME) ! error_push(context, "ldap_rename_s: %s", ! ldap_err2string(rc)); ! #else ! error_push(context, "ldap_modrdn2_s: %s", ldap_err2string(rc)); - #endif push_ldap_addl_error(ld, context); error = 2; --- 1556,1562 ---- server->server_down++; } ! error_push(context, _("Error renaming entry '%1$s': %2$s"), ! olddn, ldap_err2string(rc)); push_ldap_addl_error(ld, context); error = 2; Index: ldapops.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ldapops.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** ldapops.c 5 Oct 2003 13:43:51 -0000 1.16 --- ldapops.c 17 Oct 2003 10:20:38 -0000 1.17 *************** *** 82,86 **** e = ldap_first_entry(sld, res); if (e == NULL) { ! error_push(err_ctx, ldap_err2string(ldap_result2error(sld, res, 0))); push_ldap_addl_error(sld, err_ctx); /* ldap_perror(sld, "ldap_first_entry"); */ --- 82,89 ---- 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"); */ *************** *** 97,101 **** source_server->server_down++; } ! error_push(err_ctx, ldap_err2string(ldap_result2error(sld, res, 0))); push_ldap_addl_error(sld, err_ctx); /* ldap_perror(sld, "search"); */ --- 100,107 ---- source_server->server_down++; } ! 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, "search"); */ *************** *** 159,163 **** } else if (rc == LDAP_SERVER_DOWN) { source_server->server_down++; ! error_push(error_context, ldap_err2string(rc)); goto done; } else { --- 165,172 ---- } else if (rc == LDAP_SERVER_DOWN) { source_server->server_down++; ! error_push(error_context, ! _("Error renaming entry '%1$s': %2$s"), ! source_dn, ! ldap_err2string(rc)); goto done; } else { *************** *** 212,216 **** ldap_mods_free(mods, 1); ! if (rc == LDAP_SUCCESS) { /* printf("ldap_add %s -> %s rc=%d\n", */ /* source_dn, newdn, rc); */ --- 221,233 ---- ldap_mods_free(mods, 1); ! if (rc != LDAP_SUCCESS) { ! error_push(error_context, ! _("Error adding new entry '%1$s': %2$s"), ! newdn, ! ldap_err2string(rc)); ! push_ldap_addl_error(tld, error_context); ! /* ldap_perror(sld, "ldap_add"); */ ! goto done; ! } else { /* printf("ldap_add %s -> %s rc=%d\n", */ /* source_dn, newdn, rc); */ *************** *** 267,271 **** } else { error_push(error_context, ! "%s: %s", source_dn, ldap_err2string(rc)); push_ldap_addl_error(sld, error_context); } --- 284,289 ---- } else { error_push(error_context, ! _("Error searching below '%1$s': %2$s"), ! source_dn, ldap_err2string(rc)); push_ldap_addl_error(sld, error_context); } *************** *** 296,310 **** } error_push(error_context, ! "%s: %s", source_dn, ldap_err2string(rc)); push_ldap_addl_error(sld, error_context); goto done; } } - - } else { - error_push(error_context, ldap_err2string(rc)); - push_ldap_addl_error(tld, error_context); - /* ldap_perror(sld, "ldap_add"); */ - goto done; } --- 314,323 ---- } error_push(error_context, ! _("Error deleting '%1$s': %2$s"), ! source_dn, ldap_err2string(rc)); push_ldap_addl_error(sld, error_context); goto done; } } } Index: ldif.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ldif.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** ldif.c 17 Oct 2003 06:40:27 -0000 1.15 --- ldif.c 17 Oct 2003 10:20:38 -0000 1.16 *************** *** 84,88 **** /* an error occurred */ ! error_push(error_context, _("Cannot retrieve DN of entry.\n")); push_ldap_addl_error(ld, error_context); return FALSE; --- 84,88 ---- /* an error occurred */ ! error_push(error_context, _("Cannot retrieve DN of entry.")); push_ldap_addl_error(ld, error_context); return FALSE; Index: ref-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/ref-browse.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ref-browse.c 17 Oct 2003 07:26:25 -0000 1.1 --- ref-browse.c 17 Oct 2003 10:20:38 -0000 1.2 *************** *** 295,299 **** int ctx = error_new_context(_("Adding server permanently")); ! error_push(ctx, _("Another server with this name already exists.")); /* popup error */ error_flush(ctx); --- 295,301 ---- int ctx = error_new_context(_("Adding server permanently")); ! error_push(ctx, ! _("Another server with the name '%s' already exists."), ! server->name); /* popup error */ error_flush(ctx); Index: schema.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/schema.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** schema.c 17 Oct 2003 05:46:07 -0000 1.22 --- schema.c 17 Oct 2003 10:20:38 -0000 1.23 *************** *** 1,5 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 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 *************** *** 69,73 **** server = server_by_name(config->schemaserver); if(server == NULL) { ! error_push(ec, _("Cannot find last-resort schema server")); ss = NULL; goto done; --- 70,75 ---- server = server_by_name(config->schemaserver); if(server == NULL) { ! error_push(ec, _("Cannot find last-resort schema server '%s'"), ! config->schemaserver); ss = NULL; goto done; *************** *** 81,85 **** ss = get_server_schema(server); if (ss == NULL) { ! error_push(ec, _("Cannot obtain schema from last-resort schema server")); } done: --- 83,89 ---- ss = get_server_schema(server); if (ss == NULL) { ! error_push(ec, ! _("Cannot obtain schema from last-resort schema server '%s'"), ! server->name); } done: Index: state.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/state.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** state.c 14 Oct 2003 22:28:39 -0000 1.7 --- state.c 17 Oct 2003 10:20:38 -0000 1.8 *************** *** 474,478 **** home = homedir(); if(home == NULL) { ! error_push(context, _("you have no home directory!")); return(NULL); } --- 474,478 ---- home = homedir(); if(home == NULL) { ! error_push(context, _("You have no home directory!")); return(NULL); } *************** *** 578,582 **** if (fd < 0) { error_push(save_context, ! _("Unable to open %1$s for writing:\n%2$s\n"), tmpstatefile, strerror(errno)); --- 578,582 ---- if (fd < 0) { error_push(save_context, ! _("Unable to open '%1$s' for writing: %2$s"), tmpstatefile, strerror(errno)); |
From: <sta...@us...> - 2003-10-17 10:12:39
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv27581 Modified Files: dt_password.c dt_password.h Log Message: * Made the cryptmap tokenlist const Index: dt_password.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_password.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** dt_password.c 12 Oct 2003 06:14:18 -0000 1.17 --- dt_password.c 17 Oct 2003 10:07:40 -0000 1.18 *************** *** 76,80 **** #endif ! struct tokenlist cryptmap[] = { { 0, "Clear", NULL }, #if defined(HAVE_LIBCRYPTO) --- 76,80 ---- #endif ! const struct tokenlist cryptmap[] = { { 0, "Clear", NULL }, #if defined(HAVE_LIBCRYPTO) Index: dt_password.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_password.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dt_password.h 28 Sep 2003 03:26:25 -0000 1.7 --- dt_password.h 17 Oct 2003 10:07:40 -0000 1.8 *************** *** 35,39 **** #include "dt_entry.h" ! extern struct tokenlist cryptmap[]; typedef dt_entry_handler dt_password_handler; --- 35,39 ---- #include "dt_entry.h" ! extern const struct tokenlist cryptmap[]; typedef dt_entry_handler dt_password_handler; |
From: <sta...@us...> - 2003-10-17 07:28:30
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv2713 Modified Files: schemabrowse.c gq-xml.c Log Message: * Cosmetic changes only Index: schemabrowse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/schemabrowse.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** schemabrowse.c 11 Oct 2003 21:35:30 -0000 1.24 --- schemabrowse.c 17 Oct 2003 07:27:51 -0000 1.25 *************** *** 41,49 **** #include <gtk/gtk.h> #include "mainwin.h" #include "configfile.h" #include "common.h" #include "util.h" - #include "schemabrowse.h" #include "schema.h" #include "i18n.h" --- 41,49 ---- #include <gtk/gtk.h> + #include "schemabrowse.h" #include "mainwin.h" #include "configfile.h" #include "common.h" #include "util.h" #include "schema.h" #include "i18n.h" Index: gq-xml.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/gq-xml.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** gq-xml.c 17 Oct 2003 06:52:39 -0000 1.6 --- gq-xml.c 17 Oct 2003 07:27:51 -0000 1.7 *************** *** 26,29 **** --- 26,31 ---- */ + /* $Id$ */ + #include <string.h> #include <gtk/gtk.h> |
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv2319 Modified Files: Makefile.am browse.c browse.h browse-dnd.c Added Files: dn-browse.c dn-browse.h ref-browse.c ref-browse.h server-browse.c server-browse.h Log Message: * Split browse.c into 4 files: browse.c, dn-browse.c, server-browse.c and ref-browse.c (browse.c was > 70K and more than 2k lines) * Added browse-entry specific context menus * Improved referral handling --- NEW FILE: dn-browse.c --- /* GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen Parts: Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: dn-browse.c,v 1.1 2003/10/17 07:26:25 stamfest Exp $ */ #include <glib.h> #include <gtk/gtk.h> #include <string.h> #include <errno.h> /* errno */ #include <stdio.h> /* FILE */ #include <stdlib.h> /* free - MUST get rid of malloc/free */ #include "config.h" #include "common.h" #include "dn-browse.h" #include "ref-browse.h" #include "input.h" /* new_from_entry */ #include "search.h" /* fill_out_search */ #include "template.h" /* struct gq_template */ #include "formfill.h" /* formlist_from_entry */ #include "tinput.h" /* formfill_from_template */ #include "browse-dnd.h" /* copy_entry et al */ #include "configfile.h" /* config */ #include "errorchain.h" #include "util.h" #include "i18n.h" #include "utf8-compat.h" #include "ldif.h" static void tree_row_search_below(GtkMenuItem *menuitem, struct tab *tab) { GtkCTree *ctree; GtkCTreeNode *node; browse_entry *e; struct ldapserver *server; struct tab *search_tab; ctree = BROWSETAB(tab)->ctreeroot; node = BROWSETAB(tab)->tree_row_popped_up; e = (browse_entry *) gtk_ctree_node_get_row_data(ctree, node); assert(IS_DN_ENTRY(e)); server = server_from_node(ctree, node); if (e == NULL || server == NULL) return; search_tab = get_last_of_mode(SEARCH_MODE); if (!search_tab) { new_modetab(&mainwin, SEARCH_MODE); search_tab = get_last_of_mode(SEARCH_MODE); } if (search_tab) { #if GTK_MAJOR >= 2 fill_out_search(search_tab, server, ((dn_browse_entry *)e)->dn); #else char *dn_dec = decoded_string(((dn_browse_entry *)e)->dn); fill_out_search(search_tab, server, dn_dec); if (dn_dec) free(dn_dec); #endif } } static GtkCTreeNode *ref_browse_single_add(const char *uri, GtkCTree *ctree, GtkCTreeNode *node) { const char *labels[] = { NULL, NULL }; char *dummy[] = { "dummy", NULL }; ref_browse_entry *new_entry; GtkCTreeNode *new_item, *added = NULL; new_entry = (ref_browse_entry *) new_ref_browse_entry(uri); labels[0] = uri; added = gtk_ctree_insert_node(ctree, node, NULL, (char**) labels, /* bug in the GTK2 API: should be const */ 0, NULL, NULL, NULL, NULL, FALSE, FALSE); gtk_ctree_node_set_row_data_full(ctree, added, new_entry, (GtkDestroyNotify) destroy_browse_entry); /* add dummy node */ new_item = gtk_ctree_insert_node(ctree, added, NULL, dummy, 0, NULL, NULL, NULL, NULL, TRUE, FALSE); return added; } static void browse_new_from_entry_callback(GtkMenuItem *widget, dn_browse_entry *entry) { if (IS_DN_ENTRY(entry)) { char *dn = entry->dn; struct ldapserver *server = (struct ldapserver *) gtk_object_get_data(GTK_OBJECT(widget), "server"); new_from_entry(server, dn); } } static void browse_new_from_template_callback(GtkWidget *widget, struct gq_template *template) { #ifdef HAVE_LDAP_STR2OBJECTCLASS GList *formlist; struct ldapserver *server; struct inputform *iform; dn_browse_entry *entry; server = (struct ldapserver *) gtk_object_get_data(GTK_OBJECT(widget), "server"); entry = (dn_browse_entry *) gtk_object_get_data(GTK_OBJECT(widget), "entry"); if (!IS_DN_ENTRY(entry)) return; iform = new_inputform(); iform->dn = NULL; iform->server = server; formlist = formfill_from_template(server, template); if(formlist) { iform->formlist = formlist; if (entry && entry->dn) { /* don't need the RDN of the current entry */ char *newdn = g_malloc(strlen(entry->dn) + 2); newdn[0] = ','; newdn[1] = 0; strcat(newdn, entry->dn); iform->dn = newdn; } create_form_window(iform); create_form_content(iform); build_inputform(iform); } else { free_inputform(iform); } #endif /* HAVE_LDAP_STR2OBJECTCLASS */ } static void dump_subtree_ok_callback(GtkWidget *button, GtkWidget *filesel) { LDAPMessage *res = NULL, *e; LDAP *ld = NULL; GList *bases, *I; struct ldapserver *server; browse_entry *entry; int msg, num_entries; const char *filename; FILE *outfile = NULL; GString *out = NULL; GString *gmessage = NULL; /* GString *bigmessage = NULL; */ int written; int ctx; entry = gtk_object_get_data(GTK_OBJECT(filesel), "entry"); server = gtk_object_get_data(GTK_OBJECT(filesel), "server"); out = g_string_sized_new(2048); bases = NULL; /* if (IS_SERVER_ENTRY(entry)) { */ /* bases = get_suffixes(((server_browse_entry *)entry)->server); */ /* } else { */ bases = g_list_append(bases, strdup(((dn_browse_entry *)entry)->dn)); /* } */ ctx = error_new_context(_("Dump subtree")); if(g_list_length(bases) == 0) { error_push(ctx, _("Nothing to dump!")); goto fail; } set_busycursor(); /* obtain filename and open file for reading */ filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel)); if( (outfile = fopen(filename, "w")) == NULL) { error_push(ctx, _("Could not open output file: %s"), strerror(errno)); goto fail; /* error_popup(_("Save failed"), strerror(errno)); */ } else { /* AFAIK, the UMich LDIF format doesn't take comments or a version string */ if (config->ldifformat != LDIF_UMICH) { g_string_truncate(out, 0); prepend_ldif_header(out, server, bases); written = fwrite(out->str, 1, out->len, outfile); if(written != out->len) { error_push(ctx, _("Save failed: Only %1$d of %2$d bytes written"), written, out->len); goto fail; /* sometimes goto is useful */ } } if( (ld = open_connection(server)) == NULL) { /* no extra error, open_connection does error reporting itself... */ goto fail; } num_entries = 0; gmessage = g_string_sized_new(256); for (I = g_list_first(bases) ; I ; I = g_list_next(I)) { statusbar_msg(_("Subtree search on %s"), (char *) I->data); msg = ldap_search_s(ld, (char *) I->data, LDAP_SCOPE_SUBTREE, "(objectclass=*)", NULL, 0, &res); if(msg == LDAP_SUCCESS) { for(e = ldap_first_entry(ld, res); e; e = ldap_next_entry(ld, e)) { g_string_truncate(out, 0); ldif_entry_out(out, ld, e, ctx); num_entries++; written = fwrite(out->str, 1, out->len, outfile); if(written != out->len) { g_string_sprintf(gmessage, _("%1$d of %2$d bytes written"), written, out->len); error_popup(_("Save failed"), gmessage->str); ldap_msgfree(res); close_connection(server, FALSE); goto fail; } } ldap_msgfree(res); } else if (msg == LDAP_SERVER_DOWN) { server->server_down++; ldap_msgfree(res); /* is this correct? */ error_push(ctx, _("Server down. Export may be incomplete!")); push_ldap_addl_error(ld, ctx); goto fail; } else { /* report error */ error_push(ctx, _("LDAP error. Export may be incomplete!")); push_ldap_addl_error(ld, ctx); /* statusbar_msg(ldap_err2string(ldap_result2error(ld, */ /* res, 1))); */ goto fail; } } statusbar_msg(ngettext("One entry exported to %2$s", "%1$d entries exported to %2$s", num_entries), num_entries, filename); } fail: /* labels are only good for cleaning up, really */ if (outfile) fclose(outfile); if (bases) { for (I = g_list_first(bases) ; I ; I = g_list_next(I)) { free(I->data); } g_list_free(bases); } set_normalcursor(); if (out) g_string_free(out, TRUE); if (gmessage) g_string_free(gmessage, TRUE); if (ld) close_connection(server, FALSE); gtk_widget_destroy(filesel); error_flush(ctx); } static void dump_subtree(GtkWidget *widget, struct tab *tab) { GtkWidget *filesel; GtkCTree *ctree; GtkCTreeNode *ctree_node; browse_entry *entry; struct ldapserver *server; ctree = BROWSETAB(tab)->ctreeroot; ctree_node = BROWSETAB(tab)->selected_ctree_node; entry = (browse_entry *) gtk_ctree_node_get_row_data(ctree, ctree_node); if (entry == NULL) return; if ((server = server_from_node(ctree, ctree_node)) == NULL) return; filesel = gtk_file_selection_new(_("Save LDIF")); gtk_object_set_data(GTK_OBJECT(filesel), "server", server); gtk_object_set_data(GTK_OBJECT(filesel), "entry", entry); gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", (GtkSignalFunc) dump_subtree_ok_callback, filesel); gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT(filesel)); gtk_signal_connect_object(GTK_OBJECT(filesel), "key_press_event", (GtkSignalFunc) close_on_esc, (gpointer) filesel); gtk_widget_show(filesel); } static void delete_browse_entry(GtkWidget *widget, struct tab *tab) { GtkCTree *ctree; GtkCTreeNode *node; struct ldapserver *server; dn_browse_entry *entry; int do_delete; ctree = BROWSETAB(tab)->ctreeroot; node = BROWSETAB(tab)->selected_ctree_node; entry = (dn_browse_entry *) gtk_ctree_node_get_row_data(ctree, node); if (entry == NULL) return; if ((server = server_from_node(ctree, node)) == NULL) return; do_delete = 0; gtk_clist_freeze(GTK_CLIST(ctree)); if (!entry->seen) { /* toggle expansion twice to fire the expand callback */ gtk_ctree_toggle_expansion(ctree, node); gtk_ctree_toggle_expansion(ctree, node); } if (entry->leaf) { /* item is a leaf node */ do_delete = 1; } else { /* maybe delete everything in the subtree as well? should do another LDAP_SCOPE_SUBTREE search after each batch of deletes, in case the server is limiting the number of entries returned per search. This could get hairy... For now, just pop up a dialog box with a warning */ do_delete = question_popup(_("Warning"), _("This entry has a subtree!\n" "Do you want to delete every entry under it as well?")); } if (do_delete) { if (delete_entry_full(server, entry->dn, TRUE)) { browse_entry *p_entry; GtkCTreeNode *parent = GTK_CTREE_ROW(node)->parent; gtk_ctree_remove_node(ctree, node); /* the only thing left to do is to refresh the parent node in order to get the leaf flag of that entry right again */ p_entry = (browse_entry *) gtk_ctree_node_get_row_data(ctree, parent); if (p_entry) { assert(p_entry->base_methods); if (p_entry->base_methods->refresh) p_entry->base_methods->refresh(p_entry, ctree, parent, tab); } } } gtk_clist_thaw(GTK_CLIST(ctree)); } /* * Destructor for dn_browse_entry objects */ static void destroy_dn_browse_entry(dn_browse_entry *entry) { if (!entry) return; if (entry->dn) g_free(entry->dn); free(entry); } static void dn_browse_entry_expand(dn_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { LDAP *ld = NULL; LDAPMessage *res = NULL, *e; struct ldapserver *server = NULL; int msg, rc, num_children, update_counter, err; char message[MAX_DN_LEN + 21]; char *dummy[] = { "dummy", NULL }; char *ref[] = { "ref", NULL }; char *c, **refs; int context = error_new_context(_("Expand entry")); assert(IS_DN_ENTRY(entry)); if (!entry->seen) { server = server_from_node(ctree, node); /* printf("server=%08lx host=%s dn=%s\n", (long) server, */ /* server->ldaphost, */ /* entry->dn); */ gtk_clist_freeze(GTK_CLIST(ctree)); while (GTK_CTREE_ROW(node)->children) { gtk_ctree_remove_node(ctree, GTK_CTREE_ROW(node)->children); } if( (ld = open_connection(server)) == NULL) { gtk_clist_thaw(GTK_CLIST(ctree)); error_flush(context); return; } #if HAVE_LDAP_CLIENT_CACHE if (entry->uncache) { ldap_uncache_entry(ld, entry->dn); entry->uncache = FALSE; } #endif #if GTK_MAJOR < 2 statusbar_msg(_("Onelevel search on %s"), c = decoded_string(entry->dn)); if (c) free(c); #else statusbar_msg(_("Onelevel search on %s"), entry->dn); #endif /* check if this is a referral object */ if (server->show_ref) { msg = ldap_search(ld, entry->dn, LDAP_SCOPE_BASE, "objectclass=referral", ref, 0); if(msg == -1) { statusbar_msg("%s", ldap_err2string(msg)); close_connection(server, FALSE); gtk_clist_thaw(GTK_CLIST(ctree)); error_flush(context); return; } while((rc = ldap_result(ld, msg, 0, NULL, &res)) == LDAP_RES_SEARCH_ENTRY) { for(e = ldap_first_entry(ld, res) ; e != NULL ; e = ldap_next_entry(ld, e)) { char **vals = ldap_get_values(ld, e, "ref"); int i; if (vals == NULL) continue; for(i = 0; vals[i]; i++) { entry->is_ref = TRUE; /* now we know for sure */ ref_browse_single_add(vals[i], ctree, node); } } ldap_msgfree(res); } if (entry->is_ref) { entry->seen = TRUE; statusbar_msg(_("Showing referrals")); gtk_clist_thaw(GTK_CLIST(ctree)); close_connection(server, FALSE); return; } } msg = ldap_search(ld, entry->dn, LDAP_SCOPE_ONELEVEL, "objectclass=*", dummy, 1); if(msg == -1) { statusbar_msg("%s", ldap_err2string(msg)); close_connection(server, FALSE); gtk_clist_thaw(GTK_CLIST(ctree)); error_flush(context); return; } num_children = update_counter = 0; while( (rc = ldap_result(ld, msg, 0, NULL, &res)) == LDAP_RES_SEARCH_ENTRY) { for(e = ldap_first_entry(ld, res) ; e != NULL ; e = ldap_next_entry(ld, e)) { char *dn = ldap_get_dn(ld, e); dn_browse_single_add(dn, ctree, node); free(dn); num_children++; update_counter++; if(update_counter >= 100) { statusbar_msg(ngettext("One entry found (running)", "%d entries found (running)", num_children), num_children); update_counter = 0; } } ldap_msgfree(res); } entry->leaf = (num_children == 0); snprintf(message, sizeof(message), ngettext("One entry found (finished)", "%d entries found (finished)", num_children), num_children); ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &rc); if (rc == LDAP_SERVER_DOWN) { server->server_down++; gtk_clist_thaw(GTK_CLIST(ctree)); goto done; } if (res) { rc = ldap_parse_result(ld, res, &err, &c, NULL, &refs, NULL, 0); } if (rc != LDAP_SUCCESS) { error_push(context, ldap_err2string(rc)); push_ldap_addl_error(ld, context); if (rc == LDAP_SERVER_DOWN) { server->server_down++; } } else { if (err == LDAP_SIZELIMIT_EXCEEDED) { int l = strlen(message); snprintf(message + l, sizeof(message) - l, " - %s", _("size limit exceeded")); } else if (err == LDAP_TIMELIMIT_EXCEEDED) { int l = strlen(message); snprintf(message + l, sizeof(message) - l, " - %s", _("time limit exceeded")); } else if (err != LDAP_SUCCESS) { error_push(context, ldap_err2string(err)); push_ldap_addl_error(ld, context); if (c && strlen(c)) { error_push(context, _("Matched DN: %s"), c); } if (refs) { int i; for (i = 0 ; refs[i] ; i++) { error_push(context, _("Referral to: %s"), refs[i]); } } } } statusbar_msg(message); gtk_clist_thaw(GTK_CLIST(ctree)); entry->seen = TRUE; } /* XXX the code that sets this is #if0'ed, so this is dead code... if (g_hash_table_lookup(hash, "expand-all")) { GtkCTreeNode *n; gtk_clist_freeze(GTK_CLIST(ctree)); for (n = GTK_CTREE_ROW(node)->children ; n ; n = GTK_CTREE_NODE_NEXT(n)) { gtk_ctree_expand(ctree, n); } gtk_clist_thaw(GTK_CLIST(ctree)); } */ error_flush(context); done: if (res) ldap_msgfree(res); if (server && ld) close_connection(server, FALSE); } static void browse_edit_from_entry(dn_browse_entry *entry, GtkCTree *ctreeroot, GtkCTreeNode *ctreenode, struct tab *tab) { GList *oldlist, *newlist, *tmplist; GtkWidget *pane2_scrwin, *pane2_vbox; struct ldapserver *server; struct inputform *iform; char *dn; int hidden = 0; assert(IS_DN_ENTRY(entry)); if (ctreenode == NULL) return; if( (server = server_from_node(ctreeroot, ctreenode)) == NULL) return; dn = entry->dn; record_path(tab, (browse_entry *) entry, ctreeroot, ctreenode); ctreeroot = BROWSETAB(tab)->ctreeroot; /* delete old struct inputform (if any) */ iform = BROWSETAB(tab)->inputform; if(iform) { /* but first get current hide status */ hidden = iform->hide_status; inputform_free(iform); } iform = new_inputform(); BROWSETAB(tab)->inputform = iform; iform->server = server; iform->edit = 1; /* pass on "hide" status */ iform->hide_status = hidden; tmplist = NULL; oldlist = formlist_from_entry(server, dn, 0); #ifdef HAVE_LDAP_STR2OBJECTCLASS oldlist = add_schema_attrs(server, oldlist); #endif if(oldlist) { iform->oldlist = oldlist; newlist = dup_formlist(oldlist); iform->formlist = newlist; iform->olddn = g_strdup(dn); iform->dn = g_strdup(dn); if (ctreeroot) { iform->ctreeroot = ctreeroot; iform->ctree_refresh = GTK_CTREE_ROW(ctreenode)->parent; } /* XXX should free etc first */ pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; gtk_container_remove(GTK_CONTAINER(pane2_scrwin), GTK_BIN(pane2_scrwin)->child); pane2_vbox = gtk_vbox_new(FALSE, 2); iform->target_vbox = pane2_vbox; BROWSETAB(tab)->pane2_vbox = pane2_vbox; gtk_widget_show(pane2_vbox); gtk_widget_set_parent_window(pane2_vbox, (mainwin.mainwin->window)); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pane2_scrwin), pane2_vbox); create_form_content(iform); build_inputform(iform); } else { inputform_free(iform); BROWSETAB(tab)->inputform = NULL; } } static void dn_browse_entry_refresh(dn_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { refresh_subtree(ctree, node); entry->base_methods->select((browse_entry *) entry, ctree, node, tab); } static char* dn_browse_entry_get_name(dn_browse_entry *entry, gboolean long_form) { char **exploded_dn; char *g; #if GTK_MAJOR < 2 char *l; #endif assert(IS_DN_ENTRY(entry)); if (long_form) { return g_strdup(entry->dn); } else { exploded_dn = gq_ldap_explode_dn(entry->dn, FALSE); #if GTK_MAJOR >= 2 g = g_strdup(exploded_dn[0]); #else l = decoded_string(exploded_dn[0]); /* impedance match -> malloc to g_malloc */ g = g_strdup(l); free(l); #endif gq_exploded_free(exploded_dn); return g; } } static void dn_browse_entry_popup(dn_browse_entry *entry, GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, struct tab *tab) { GtkWidget *menu_item, *submenu; struct ldapserver *server; int is_dn; #ifdef HAVE_LDAP_STR2OBJECTCLASS GList *templatelist; struct gq_template *template; #endif assert(IS_DN_ENTRY(entry)); is_dn = IS_DN_ENTRY(entry); if ((server = server_from_node(GTK_CTREE(ctreeroot), ctree_node)) == NULL) return; /* New submenu */ menu_item = gtk_menu_item_new_with_label(_("New")); gtk_menu_append(GTK_MENU(menu), menu_item); submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu); gtk_widget_show(menu_item); #ifdef HAVE_LDAP_STR2OBJECTCLASS templatelist = config->templates; while(templatelist) { template = (struct gq_template *) templatelist->data; menu_item = gtk_menu_item_new_with_label(template->name); gtk_object_set_data(GTK_OBJECT(menu_item), "server", server); gtk_object_set_data(GTK_OBJECT(menu_item), "entry", entry); gtk_menu_append(GTK_MENU(submenu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(browse_new_from_template_callback), (gpointer) template); gtk_widget_show(menu_item); templatelist = templatelist->next; } #endif menu_item = gtk_menu_item_new_with_label(_("Use current entry")); gtk_object_set_data(GTK_OBJECT(menu_item), "server", server); gtk_menu_append(GTK_MENU(submenu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(browse_new_from_entry_callback), (gpointer) entry); gtk_widget_show(menu_item); #if 0 /* Expand all */ menu_item = gtk_menu_item_new_with_label(_("Expand all")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(tree_row_expand_all), (gpointer) tab); #endif #if 0 /* moved to server_browse_entry only. Just a clean-up of the menu, no technical reasons, just policy. */ /* Close connection */ menu_item = gtk_menu_item_new_with_label(_("Close Connection")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(tree_row_close_connection), (gpointer) tab); #endif /* Export to LDIF */ menu_item = gtk_menu_item_new_with_label(_("Export to LDIF")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(dump_subtree), (gpointer) tab); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new(); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); /* Search below */ menu_item = gtk_menu_item_new_with_label(_("Search below")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(tree_row_search_below), (gpointer) tab); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new(); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); #ifdef BROWSER_DND /* Copy */ menu_item = gtk_menu_item_new_with_label(_("Copy")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", (GtkSignalFunc) copy_entry, (gpointer) tab); if (!is_dn) { gtk_widget_set_sensitive(menu_item, FALSE); } gtk_widget_show(menu_item); /* Copy all */ menu_item = gtk_menu_item_new_with_label(_("Copy all")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", (GtkSignalFunc) copy_entry_all, (gpointer) tab); if (!is_dn) { gtk_widget_set_sensitive(menu_item, FALSE); } gtk_widget_show(menu_item); /* Paste */ menu_item = gtk_menu_item_new_with_label(_("Paste")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", (GtkSignalFunc) paste_entry, (gpointer) tab); if (!is_dn) { gtk_widget_set_sensitive(menu_item, FALSE); } gtk_widget_show(menu_item); menu_item = gtk_menu_item_new(); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); #endif /* Delete */ menu_item = gtk_menu_item_new_with_label(_("Delete")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", (GtkSignalFunc) delete_browse_entry, (gpointer) tab); if (!is_dn) { gtk_widget_set_sensitive(menu_item, FALSE); } gtk_widget_show(menu_item); } static struct browse_entry_vtab dn_vtab = { (browse_entry_destructor) destroy_dn_browse_entry, /* destroy */ (browse_entry_expand) dn_browse_entry_expand, /* expand */ (browse_entry_select) browse_edit_from_entry, /* select */ (browse_entry_refresh) dn_browse_entry_refresh, /* refresh */ (browse_entry_get_name) dn_browse_entry_get_name, /* get_name */ (browse_entry_popup) dn_browse_entry_popup, /* popup */ }; /* * Constructor for dn_browse_entry objects taking the dn */ browse_entry *new_dn_browse_entry(const char *dn) { dn_browse_entry *e; e = g_malloc0(sizeof(dn_browse_entry)); e->type = DN_BROWSE_ENTRY; e->base_methods = &dn_vtab; if (dn != NULL) e->dn = g_strdup(dn); e->seen = FALSE; e->leaf = FALSE; return (browse_entry *) e; } /* Local Variables: c-basic-offset: 5 End: */ --- NEW FILE: dn-browse.h --- /* 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 the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: dn-browse.h,v 1.1 2003/10/17 07:26:25 stamfest Exp $ */ #ifndef GQ_DN_BROWSE_H_INCLUDED #define GQ_DN_BROWSE_H_INCLUDED #include "config.h" #include "browse.h" /**************************************************************************/ /* * A browse_entry describing a singe DN (eg. a single LDAP object) */ #define DN_BROWSE_ENTRY 1 typedef struct { /* common */ int type; struct browse_entry_vtab *base_methods; /* specific */ char *dn; gboolean seen; gboolean leaf; gboolean uncache; gboolean is_ref; /* set if this entry is a referral and children of it should thus become ref_browse_entry objects */ } dn_browse_entry; #define IS_DN_ENTRY(entry) IS_ENTRY((entry), DN_BROWSE_ENTRY) browse_entry *new_dn_browse_entry(const char *dn); #endif /* Local Variables: c-basic-offset: 5 End: */ --- NEW FILE: ref-browse.c --- /* GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen Parts: Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: ref-browse.c,v 1.1 2003/10/17 07:26:25 stamfest Exp $ */ #include <glib.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> #include <errno.h> #include <string.h> #include <config.h> #include "common.h" #include "dn-browse.h" #include "server-browse.h" #include "ref-browse.h" #include "configfile.h" /* free_ldapserver */ #include "prefs.h" /* create_edit_server_window */ #include "util.h" #include "i18n.h" #include "errorchain.h" /**************************************************************************/ static void free_ref_browse_entry(ref_browse_entry *entry) { if (!entry) return; assert(IS_REF_ENTRY(entry)); g_free_if(entry->uri); if (entry->server) { free_ldapserver(entry->server); entry->server = NULL; } g_free(entry); } /* * a ref browse entry was selected in the tree widget. * * put up some info. */ static void ref_browse_entry_selected(ref_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { GtkWidget *pane2_scrwin, *pane2_vbox, *label, *e; GtkWidget *table; int row = 0; assert(IS_REF_ENTRY(entry)); record_path(tab, (browse_entry *) entry, ctree, node); pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; pane2_vbox = BROWSETAB(tab)->pane2_vbox; /* gtk_widget_destroy(pane2_vbox); */ /* remove the viewport of the scrolled window. This should _really_ destroy the widgets below it. The pane2_scrwin is a GtkBin Object and thus has only one child, use this to obtain the viewport */ gtk_container_remove(GTK_CONTAINER(pane2_scrwin), GTK_BIN(pane2_scrwin)->child); pane2_vbox = gtk_vbox_new(FALSE, 2); BROWSETAB(tab)->pane2_vbox = pane2_vbox; gtk_widget_show(pane2_vbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pane2_scrwin), pane2_vbox); table = gtk_table_new(5, 2, FALSE); gtk_container_border_width(GTK_CONTAINER(table), 5); gtk_widget_show(table); gtk_box_pack_start(GTK_BOX(pane2_vbox), table, FALSE, FALSE, 5); /* URI */ label = gtk_label_new(_("Referral URI")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), entry->uri); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; } static void ref_browse_entry_expand(ref_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { if (!entry->expanded) { LDAPURLDesc *desc = NULL; while (GTK_CTREE_ROW(node)->children) { gtk_ctree_remove_node(ctree, GTK_CTREE_ROW(node)->children); } if (ldap_url_parse(entry->uri, &desc) == 0) { const char *labels[] = { desc->lud_dn, NULL }; char *dummy[] = { "dummy", NULL }; struct ldapserver *server, *newserver; GtkCTreeNode *new_item, *added = NULL; browse_entry *new_entry; GString *new_uri = g_string_sized_new(strlen(entry->uri)); g_string_sprintf(new_uri, "%s://%s:%d/", desc->lud_scheme, desc->lud_host, desc->lud_port); newserver = new_ldapserver(); /* some sensible settings for the "usual" case: Anonymous bind. Also show referrals */ newserver->ask_pw = 0; newserver->show_ref = 1; /* check: do we have this server around already??? */ server = server_by_canon_name(new_uri->str); if (!server) { /* find parent server */ GtkCTreeRow *row = NULL; GtkCTreeNode *n; browse_entry *e; n = GTK_CTREE_ROW(node)->parent; for ( ; n ; n = row->parent ) { row = GTK_CTREE_ROW(n); e = (browse_entry *) gtk_ctree_node_get_row_data(ctree, n); /* FIXME: This is not OO */ if (IS_SERVER_ENTRY(e)) { server = ((server_browse_entry*) e)->server; break; } if (IS_REF_ENTRY(e)) { server = ((ref_browse_entry*) e)->server; break; } } } if (server) { copy_ldapserver(newserver, server); statusbar_msg(_("Initialized temporary server-definition '%1$s' from existing server '%2$s'"), new_uri->str, server->name); } else { statusbar_msg(_("Created temporary server-definition '%1$s' with no pre-set values."), new_uri->str); } g_free_and_dup(newserver->name, new_uri->str); g_free_and_dup(newserver->ldaphost, new_uri->str); g_free_and_dup(newserver->basedn, desc->lud_dn); canonicalize_ldapserver(newserver); entry->server = newserver; entry->expanded = TRUE; gtk_clist_freeze(GTK_CLIST(ctree)); new_entry = new_dn_browse_entry(desc->lud_dn); added = gtk_ctree_insert_node(ctree, node, NULL, (char**) labels, /* bug in the GTK2 API: should be const */ 0, NULL, NULL, NULL, NULL, FALSE, FALSE); gtk_ctree_node_set_row_data_full(ctree, added, new_entry, (GtkDestroyNotify) destroy_browse_entry); /* add dummy node */ new_item = gtk_ctree_insert_node(ctree, added, NULL, dummy, 0, NULL, NULL, NULL, NULL, TRUE, FALSE); gtk_clist_thaw(GTK_CLIST(ctree)); ldap_free_urldesc(desc); } } } char* ref_browse_entry_get_name(ref_browse_entry *entry, gboolean long_form) { char *g; #if GTK_MAJOR < 2 char *l; #endif assert(IS_REF_ENTRY(entry)); #if GTK_MAJOR >= 2 g = g_strdup(entry->uri); #else l = decoded_string(entry->uri); /* impedance match -> malloc to g_malloc */ g = g_strdup(l); free(l); #endif return g; } static void ref_browse_entry_refresh(ref_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { assert(IS_REF_ENTRY(entry)); entry->expanded = 0; gtk_clist_freeze(GTK_CLIST(ctree)); ref_browse_entry_selected(entry, ctree, node, tab); /* toggle expansion twice to fire the expand callback and to return to the current expansion state */ gtk_ctree_toggle_expansion(ctree, node); gtk_ctree_toggle_expansion(ctree, node); /* server_browse_entry_expand(entry, ctree, node, tab); */ gtk_clist_thaw(GTK_CLIST(ctree)); } static void add_to_permanent_servers(struct ldapserver *server) { /* no assertion, it could happen... */ if (is_transient_server(server)) { if (server_by_name(server->name) == NULL) { struct ldapserver *s = new_ldapserver(); copy_ldapserver(s, server); config_add_server(config, s); update_serverlist(&mainwin); save_config(); } else { int ctx = error_new_context(_("Adding server permanently")); error_push(ctx, _("Another server with this name already exists.")); /* popup error */ error_flush(ctx); } } } /* popup method for BOTH server AND ref entries (the same for now...) */ static void ref_browse_entry_popup(dn_browse_entry *entry, GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, struct tab *tab) { GtkWidget *menu_item; struct ldapserver *server; assert(IS_REF_ENTRY(entry)); server = server_from_node(GTK_CTREE(ctreeroot), ctree_node); /* Edit Server settings */ menu_item = gtk_menu_item_new_with_label(_("Edit Server")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(create_edit_server_window), (gpointer) server); gtk_widget_show(menu_item); if (server == NULL) { gtk_widget_set_sensitive(menu_item, FALSE); } /* Add to permanent list of servers */ menu_item = gtk_menu_item_new_with_label(_("Add to permanent list of servers")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(add_to_permanent_servers), (gpointer) server); gtk_widget_show(menu_item); if (server == NULL || !is_transient_server(server)) { gtk_widget_set_sensitive(menu_item, FALSE); } /* Close connection */ menu_item = gtk_menu_item_new_with_label(_("Close Connection")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(tree_row_close_connection), (gpointer) tab); gtk_widget_show(menu_item); if (server == NULL) { gtk_widget_set_sensitive(menu_item, FALSE); } } static struct browse_entry_vtab ref_vtab = { (browse_entry_destructor) free_ref_browse_entry, /* destroy */ (browse_entry_expand) ref_browse_entry_expand, /* expand */ (browse_entry_select) ref_browse_entry_selected, /* select */ (browse_entry_refresh) ref_browse_entry_refresh, /* refresh */ (browse_entry_get_name) ref_browse_entry_get_name, /* get_name */ (browse_entry_popup) ref_browse_entry_popup, /* popup */ }; browse_entry *new_ref_browse_entry(const char *uri) { ref_browse_entry *e; e = g_malloc0(sizeof(ref_browse_entry)); e->type = REF_BROWSE_ENTRY; e->base_methods = &ref_vtab; /* e->server = server; */ e->uri = g_strdup(uri); return (browse_entry *) e; } /* Local Variables: c-basic-offset: 5 End: */ --- NEW FILE: ref-browse.h --- /* 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 the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: ref-browse.h,v 1.1 2003/10/17 07:26:25 stamfest Exp $ */ #ifndef GQ_REF_BROWSE_H_INCLUDED #define GQ_REF_BROWSE_H_INCLUDED #include "config.h" #include "browse.h" /**************************************************************************/ /* * A browse_entry object describing a dynamic LDAP server (referral) */ #define REF_BROWSE_ENTRY 3 typedef struct { /* common */ int type; struct browse_entry_vtab *base_methods; /* specific */ char *uri; struct ldapserver *server; gboolean expanded; } ref_browse_entry; #define IS_REF_ENTRY(entry) IS_ENTRY((entry), REF_BROWSE_ENTRY) browse_entry *new_ref_browse_entry(const char *uri); #endif /* Local Variables: c-basic-offset: 5 End: */ --- NEW FILE: server-browse.c --- /* GQ -- a GTK-based LDAP client Copyright (C) 1998-2003 Bert Vermeulen Parts: Copyright (C) 2002-2003 Peter Stamfest <pe...@st...> This program is released under the Gnu General Public License with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: server-browse.c,v 1.1 2003/10/17 07:26:25 stamfest Exp $ */ #include <glib.h> #include <gtk/gtk.h> #include <errno.h> #include <string.h> #include <stdio.h> /* snprintf */ #include <config.h> #include "server-browse.h" #include "dn-browse.h" #include "prefs.h" /* create_edit_server_window */ #include "util.h" /* get_suffixes */ #include "i18n.h" #ifdef BROWSER_DND #include "browse-dnd.h" #endif /* #include "../icons/warning.xpm" */ /* * Really add a single suffix to the tree */ void add_suffix(server_browse_entry *entry, GtkCTree *ctreeroot, GtkCTreeNode *node, char *suffix) { GtkCTreeNode *new_item; char *labels[] = { suffix, NULL }; browse_entry *new_entry = new_dn_browse_entry(suffix); new_item = gtk_ctree_insert_node(ctreeroot, node, NULL, labels, 0, NULL, NULL, NULL, NULL, FALSE, FALSE); gtk_ctree_node_set_row_data_full(ctreeroot, new_item, new_entry, (GtkDestroyNotify) destroy_browse_entry); /* add dummy node to have something to expand */ labels[0] = "DUMMY"; new_item = gtk_ctree_insert_node(ctreeroot, new_item, NULL, labels, 0, NULL, NULL, NULL, NULL, TRUE, FALSE); } static void server_browse_entry_expand(server_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { GList *suffixes = NULL, *next; assert(IS_SERVER_ENTRY(entry)); if (!entry->once_expanded) { /* printf("expanding %s\n", entry->server->name); */ while (GTK_CTREE_ROW(node)->children) { gtk_ctree_remove_node(ctree, GTK_CTREE_ROW(node)->children); } entry->once_expanded = 1; suffixes = get_suffixes(entry->server); gtk_clist_freeze(GTK_CLIST(ctree)); for (next = suffixes ; next ; next = g_list_next(next) ) { add_suffix(entry, ctree, node, next->data); g_free(next->data); next->data = NULL; } gtk_clist_thaw(GTK_CLIST(ctree)); g_list_free(suffixes); } } /* * a server was selected in the tree widget. * * put up some server info. */ static void server_browse_entry_selected(server_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { GtkWidget *pane2_scrwin, *pane2_vbox, *label, *e; GtkWidget *table; char *server_name; int row = 0; char buf[128]; LDAP *ld; assert(IS_SERVER_ENTRY(entry)); ld = open_connection(entry->server); server_name = entry->server->name; /* dn_by_node(node); */ record_path(tab, (browse_entry *) entry, ctree, node); pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; pane2_vbox = BROWSETAB(tab)->pane2_vbox; /* gtk_widget_destroy(pane2_vbox); */ /* remove the viewport of the scrolled window. This should _really_ destroy the widgets below it. The pane2_scrwin is a GtkBin Object and thus has only one child, use this to obtain the viewport */ gtk_container_remove(GTK_CONTAINER(pane2_scrwin), GTK_BIN(pane2_scrwin)->child); pane2_vbox = gtk_vbox_new(FALSE, 2); BROWSETAB(tab)->pane2_vbox = pane2_vbox; gtk_widget_show(pane2_vbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pane2_scrwin), pane2_vbox); table = gtk_table_new(5, 2, FALSE); gtk_container_border_width(GTK_CONTAINER(table), 5); gtk_widget_show(table); gtk_box_pack_start(GTK_BOX(pane2_vbox), table, FALSE, FALSE, 5); /* Nickname */ label = gtk_label_new(_("Nickname")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), server_name); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; /* Host name */ label = gtk_label_new(_("Hostname")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), entry->server->ldaphost); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; /* Port */ label = gtk_label_new(_("Port")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); snprintf(buf, sizeof(buf), "%d", entry->server->ldapport); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; /* Connection caching */ label = gtk_label_new(_("Connection caching")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); snprintf(buf, sizeof(buf), "%s", entry->server->cacheconn ? _("on") : _("off")); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; /* TLS */ label = gtk_label_new(_("TLS")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); snprintf(buf, sizeof(buf), "%s", entry->server->enabletls ? _("on") : _("off")); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; #if HAVE_LDAP_CLIENT_CACHE label = gtk_label_new(_("Client-side caching")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); snprintf(buf, sizeof(buf), "%s", (entry->server->local_cache_timeout >= 0) ? _("on") : _("off")); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; #endif /* Connections so far */ label = gtk_label_new(_("Connections so far")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); snprintf(buf, sizeof(buf), "%d", entry->server->incarnation); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; if (ld) { int intdata; int rc; /* void *optdata; */ char *rootDSEattr[] = { "vendorName", _("Vendor Name"), /* RFC 3045 */ "vendorVersion", _("Vendor Version"), /* RFC 3045 */ "altServer", _("Alternative Server(s)"), /* RFC 2251 */ "supportedLDAPVersion", _("Supported LDAP Version"), /* RFC 2251 */ "supportedSASLMechanisms", _("Supported SASL Mechanisms"), /* RFC 2251 */ NULL }; LDAPMessage *res, *ee; BerElement *berptr; char *attr; char **vals; int i, msg; rc = ldap_get_option(ld, LDAP_OPT_PROTOCOL_VERSION, &intdata); /* LDAP protocol version */ label = gtk_label_new(_("LDAP protocol version")); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); snprintf(buf, sizeof(buf), "%d", intdata); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; /* read some Information from the root DSE */ for (i = 0 ; rootDSEattr[i] && ld != NULL ; i += 2) { 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) { close_connection(entry->server, FALSE); ld = open_connection(entry->server); } statusbar_msg("%s", ldap_err2string(msg)); } else { if(res == NULL) continue; ee = ldap_first_entry(ld, res); if (ee == NULL) { ldap_msgfree(res); continue; } attr = ldap_first_attribute(ld, res, &berptr); if (attr == NULL) { ldap_msgfree(res); #ifndef HAVE_OPENLDAP_12 if(berptr) ber_free(berptr, 0); #endif continue; } vals = ldap_get_values(ld, res, attr); if (vals) { int j; for (j = 0 ; vals[j] ; j++) ; label = gtk_label_new(rootDSEattr[i + 1]); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+j, GTK_SHRINK, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); for (j = 0 ; vals[j] ; j++) { snprintf(buf, sizeof(buf), "%s", vals[j]); e = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(e), buf); gtk_widget_set_sensitive(e, FALSE); gtk_widget_show(e); gtk_table_attach(GTK_TABLE(table), e, 1, 2, row, row+1, GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); row++; } ldap_value_free(vals); } ldap_memfree(attr); #ifndef HAVE_OPENLDAP_12 if(berptr) ber_free(berptr, 0); #endif ldap_msgfree(res); } } close_connection(entry->server, FALSE); } /* gtk_box_pack_start(GTK_BOX(pane2_vbox), label, FALSE, FALSE, 0); */ } static void server_browse_entry_refresh(server_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { assert(IS_SERVER_ENTRY(entry)); entry->once_expanded = 0; gtk_clist_freeze(GTK_CLIST(ctree)); server_browse_entry_selected(entry, ctree, node, tab); /* toggle expansion twice to fire the expand callback and to return to the current expansion state */ gtk_ctree_toggle_expansion(ctree, node); gtk_ctree_toggle_expansion(ctree, node); /* server_browse_entry_expand(entry, ctree, node, tab); */ gtk_clist_thaw(GTK_CLIST(ctree)); } char* server_browse_entry_get_name(server_browse_entry *entry, gboolean long_form) { assert(IS_SERVER_ENTRY(entry)); return g_strdup(entry->server->name); } /* popup method for BOTH server AND ref entries (the same for now...) */ static void server_browse_entry_popup(dn_browse_entry *entry, GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, struct tab *tab) { GtkWidget *menu_item; struct ldapserver *server; assert(IS_SERVER_ENTRY(entry)); server = server_from_node(GTK_CTREE(ctreeroot), ctree_node); /* Edit Server settings */ menu_item = gtk_menu_item_new_with_label(_("Edit Server")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(create_edit_server_window), (gpointer) server); gtk_widget_show(menu_item); if (server == NULL) { gtk_widget_set_sensitive(menu_item, FALSE); } /* Close connection */ menu_item = gtk_menu_item_new_with_label(_("Close Connection")); gtk_menu_append(GTK_MENU(menu), menu_item); gtk_widget_show(menu_item); gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(tree_row_close_connection), (gpointer) tab); gtk_widget_show(menu_item); if (server == NULL) { gtk_widget_set_sensitive(menu_item, FALSE); } } static struct browse_entry_vtab server_vtab = { (browse_entry_destructor) NULL, /* destroy */ (browse_entry_expand) server_browse_entry_expand, /* expand */ (browse_entry_select) server_browse_entry_selected, /* select */ (browse_entry_refresh) server_browse_entry_refresh, /* refresh */ (browse_entry_get_name) server_browse_entry_get_name, /* get_name */ (browse_entry_popup) server_browse_entry_popup, /* popup */ }; browse_entry *new_server_browse_entry(struct ldapserver *server) { server_browse_entry *e; e = g_malloc0(sizeof(server_browse_entry)); e->type = SERVER_BROWSE_ENTRY; e->base_methods = &server_vtab; e->server = server; return (browse_entry *) e; } /* Local Variables: c-basic-offset: 5 End: */ --- NEW FILE: server-browse.h --- /* 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 the additional exemption that compiling, linking, and/or using OpenSSL is allowed. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: server-browse.h,v 1.1 2003/10/17 07:26:25 stamfest Exp $ */ #ifndef GQ_SERVER_BROWSE_H_INCLUDED #define GQ_SERVER_BROWSE_H_INCLUDED #include "config.h" #include "browse.h" /**************************************************************************/ /* * A browse_entry object describing a LDAP server */ #define SERVER_BROWSE_ENTRY 2 typedef struct { /* common */ int type; struct browse_entry_vtab *base_methods; /* specific */ struct ldapserver *server; int once_expanded; } server_browse_entry; #define IS_SERVER_ENTRY(entry) IS_ENTRY((entry), SERVER_BROWSE_ENTRY) browse_entry *new_server_browse_entry(struct ldapserver *server); #endif /* Local Variables: c-basic-offset: 5 End: */ Index: Makefile.am =================================================================== RCS file: /cvsroot/gqclient/gq/src/Makefile.am,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** Makefile.am 17 Oct 2003 07:10:51 -0000 1.29 --- Makefile.am 17 Oct 2003 07:26:25 -0000 1.30 *************** *** 33,36 **** --- 33,39 ---- mainwin.c \ browse.c \ + dn-browse.c \ + server-browse.c \ + ref-browse.c \ schema.c \ schemabrowse.c \ *************** *** 77,80 **** --- 80,86 ---- mainwin.h \ browse.h \ + dn-browse.h \ + server-browse.h \ + ref-browse.h \ schema.h \ schemabrowse.h \ Index: browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.c,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** browse.c 17 Oct 2003 07:07:05 -0000 1.83 --- browse.c 17 Oct 2003 07:26:25 -0000 1.84 *************** *** 29,33 **** #include <gdk/gdkkeysyms.h> - #include <stdio.h> #include <errno.h> #include <string.h> --- 29,32 ---- *************** *** 38,41 **** --- 37,45 ---- #include "configfile.h" [...1833 lines suppressed...] ! gtk_menu_append(GTK_MENU(menu), menu_item); ! gtk_widget_show(menu_item); ! ! gtk_signal_connect(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(tree_row_refresh), ! (gpointer) tab); ! entry->base_methods->popup((browse_entry*) entry, menu, ! ctreeroot, ctree_node, tab); ! gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, ! event->button, event->time); ! ! gtk_signal_emit_stop_by_name(GTK_OBJECT(ctreeroot), ! "button_press_event"); ! return(TRUE); } } #if GTK_MAJOR... [truncated message content] |
From: <sta...@us...> - 2003-10-17 07:27:22
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv1567 Modified Files: mainwin.c Log Message: * Some cleanups wrt to function names and callbacks Index: mainwin.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.c,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** mainwin.c 17 Oct 2003 07:07:06 -0000 1.45 --- mainwin.c 17 Oct 2003 07:19:22 -0000 1.46 *************** *** 58,69 **** ! struct tab *get_last_of_mode(int mode) { - if(!mainwin.lastofmode) return NULL; ! return g_hash_table_lookup(mainwin.lastofmode, GINT_TO_POINTER(mode)); } --- 58,71 ---- ! static void close_current_tab(struct mainwin_data *win); ! static void mainwin_destroyed(GtkWidget *widget, struct mainwin_data *win); ! static void switchpage_refocus(GtkNotebook *notebook, GtkNotebookPage *page, ! int pagenum, struct mainwin_data *win); struct tab *get_last_of_mode(int mode) { if(!mainwin.lastofmode) return NULL; ! return g_hash_table_lookup(mainwin.lastofmode, GINT_TO_POINTER(mode)); } *************** *** 176,180 **** /* gtk2 checked (multiple destroy callbacks safety), confidence 0.7: cleanup_all_tabs semantics? */ ! void gq_exit(GtkWidget *widget, struct mainwin_data *win) { mainwin_save_snapshot(win); --- 178,182 ---- /* gtk2 checked (multiple destroy callbacks safety), confidence 0.7: cleanup_all_tabs semantics? */ ! static void mainwin_destroyed(GtkWidget *widget, struct mainwin_data *win) { mainwin_save_snapshot(win); *************** *** 288,292 **** gtk_container_border_width(GTK_CONTAINER(win->mainwin), 0); gtk_signal_connect(GTK_OBJECT(win->mainwin), "destroy", ! GTK_SIGNAL_FUNC(gq_exit), win); gtk_window_set_title(GTK_WINDOW(win->mainwin), _("GQ")); --- 290,294 ---- gtk_container_border_width(GTK_CONTAINER(win->mainwin), 0); gtk_signal_connect(GTK_OBJECT(win->mainwin), "destroy", ! GTK_SIGNAL_FUNC(mainwin_destroyed), win); gtk_window_set_title(GTK_WINDOW(win->mainwin), _("GQ")); *************** *** 588,593 **** ! void switchpage_refocus(GtkNotebook *notebook, GtkNotebookPage *page, ! int pagenum, struct mainwin_data *win) { GtkWidget *focusbox; struct tab *tab; --- 590,596 ---- ! static void switchpage_refocus(GtkNotebook *notebook, GtkNotebookPage *page, ! int pagenum, struct mainwin_data *win) ! { GtkWidget *focusbox; struct tab *tab; *************** *** 616,620 **** ! void close_current_tab(struct mainwin_data *win) { int tabnum; --- 619,623 ---- ! static void close_current_tab(struct mainwin_data *win) { int tabnum; *************** *** 691,696 **** vbox1 = GTK_DIALOG(window)->vbox; /* gtk_container_border_width(GTK_CONTAINER(vbox1), 20); */ gtk_widget_show(vbox1); - #if GTK_MAJOR < 2 --- 694,699 ---- vbox1 = GTK_DIALOG(window)->vbox; /* gtk_container_border_width(GTK_CONTAINER(vbox1), 20); */ + gtk_container_border_width(GTK_CONTAINER(vbox1), CONTAINER_BORDER_WIDTH); gtk_widget_show(vbox1); #if GTK_MAJOR < 2 |
From: <sta...@us...> - 2003-10-17 07:18:49
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv917 Modified Files: prefs.c prefs.h Log Message: * Added support to indicate "transient" servers when editing server settings. Transient servers are servers added when dealing with referrals. They are not saved in the configuration and they might get initialized from existing servers through a canonical server name lookup. Index: prefs.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/prefs.c,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** prefs.c 17 Oct 2003 06:52:39 -0000 1.43 --- prefs.c 17 Oct 2003 07:16:14 -0000 1.44 *************** *** 136,139 **** --- 136,141 ---- struct ldapserver *server; int edit_new_server; + /* is the server a dynamically added one */ + gboolean transient; } prefs_callback_data; *************** *** 200,204 **** } ! if (passwdtext && strlen(passwdtext) > 0) { int rc = question_popup(_("Warning: Cleartext password"), --- 202,206 ---- } ! if (passwdtext && strlen(passwdtext) > 0 && !cb_data->transient) { int rc = question_popup(_("Warning: Cleartext password"), *************** *** 334,339 **** } ! /* so the cancel button doesn't really cancel :-) */ ! save_config(); update_serverlist(&mainwin); --- 336,347 ---- } ! /* I do not really like this ad-hoc solution to check if a server ! is a transient server or a configured one, but ... */ ! if (!is_transient_server(server)) { ! /* so the cancel button doesn't really cancel :-) */ ! save_config(); ! } ! ! update_serverlist(&mainwin); *************** *** 429,432 **** --- 437,441 ---- cb_data = new_prefs_callback_data(sw); cb_data->edit_new_server = (server == NULL); + cb_data->transient = is_transient_server(server); if(server == NULL) { *************** *** 454,461 **** title = g_string_sized_new(64); ! if(cb_data->edit_new_server) g_string_sprintf(title, _("New server")); ! else g_string_sprintf(title, _("Server %s"), server->name); gtk_window_set_title(GTK_WINDOW(editwindow), title->str); --- 463,474 ---- title = g_string_sized_new(64); ! if(cb_data->edit_new_server) { g_string_sprintf(title, _("New server")); ! } else { g_string_sprintf(title, _("Server %s"), server->name); + } + if (cb_data->transient) { + g_string_sprintf(title, _("Transient server %s"), server->name); + } gtk_window_set_title(GTK_WINDOW(editwindow), title->str); *************** *** 625,628 **** --- 638,654 ---- gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); #endif + + + /* Add not if the server is transient */ + + + if (cb_data->transient) { + label = gtk_label_new(_("NOTE: This is a transient server definition. It has been added dynamically and it will not be saved to the permanent configuration.")); + + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, FALSE, 0); + gtk_widget_show(label); + } + /* "Details" tab */ Index: prefs.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/prefs.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** prefs.h 9 Oct 2003 05:51:55 -0000 1.7 --- prefs.h 17 Oct 2003 07:16:14 -0000 1.8 *************** *** 38,43 **** void fill_serverlist_serverstab(void); void create_prefs_window(void); - GtkWidget* get_widget(GtkWidget *widget, gchar *widget_name); - #endif --- 38,41 ---- |