[gq-commit] gq/src ref-browse.c,1.4,1.5 util.c,1.75,1.76 util.h,1.26,1.27
Status: Beta
Brought to you by:
sur5r
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); |