From eb3b5f28d4686802070a770ef29bb71dd4d82d54 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 3 May 2005 13:46:49 +0000 Subject: r6600: Rework of the GTK credentials system; the credentials information is now in a seperate (optional) dialog rather then in the binding dialog; also supports specifying anonymous connections (which we didn't before). (This used to be commit 8671e1a1fa8ef416c1819f811653eff190d3074a) --- source4/gtk/common/credentials.c | 90 ++++++++++++++++++++++++++++++++-------- source4/gtk/common/gtk-smb.c | 87 ++++---------------------------------- source4/gtk/common/gtk-smb.h | 5 +-- source4/gtk/common/select.c | 2 +- source4/gtk/common/select.h | 2 +- source4/gtk/tools/gepdump.c | 2 +- source4/gtk/tools/gregedit.c | 9 +++- source4/gtk/tools/gwcrontab.c | 9 +++- source4/gtk/tools/gwsam.c | 11 +++-- 9 files changed, 104 insertions(+), 113 deletions(-) (limited to 'source4/gtk') diff --git a/source4/gtk/common/credentials.c b/source4/gtk/common/credentials.c index dce77220fd..ccc9759e8f 100644 --- a/source4/gtk/common/credentials.c +++ b/source4/gtk/common/credentials.c @@ -21,41 +21,65 @@ #include "includes.h" #include "gtk/common/gtk-smb.h" -static const char *gtk_get_userpassword(struct cli_credentials *credentials) +static void gtk_get_credentials(struct cli_credentials *credentials) { - char *prompt; const char *ret; GtkWidget *dialog; - GtkWidget *dialog_vbox1; - GtkWidget *hbox; GtkWidget *label; + GtkWidget *table; + GtkWidget *entry_username; GtkWidget *entry_password; + GtkWidget *entry_domain; GtkWidget *dialog_action_area1; GtkWidget *cancelbutton1; GtkWidget *okbutton1; + GtkWidget *anonymous; dialog = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog), "Enter Password"); + gtk_window_set_title (GTK_WINDOW (dialog), "Credentials"); gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG); - dialog_vbox1 = GTK_DIALOG (dialog)->vbox; + table = gtk_table_new(4, 2, FALSE); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); + + label = gtk_label_new ("Domain:"); + + gtk_table_attach(GTK_TABLE(table),label,0,1,0,1,GTK_FILL,0,0,0); + + entry_domain = gtk_entry_new (); + gtk_table_attach(GTK_TABLE(table), entry_domain, 1,2,0,1, GTK_FILL, 0,0,0); + gtk_entry_set_activates_default (GTK_ENTRY (entry_domain), TRUE); + + if (credentials->domain_obtained != CRED_UNINITIALISED) { + gtk_entry_set_text(GTK_ENTRY(entry_domain), credentials->domain); + } + + label = gtk_label_new ("Username:"); - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox, TRUE, TRUE, 0); + gtk_table_attach(GTK_TABLE(table),label,0,1,1,2,GTK_FILL,0,0,0); - prompt = talloc_asprintf(NULL, "Password for [%s\\%s]:", - cli_credentials_get_domain(credentials), - cli_credentials_get_username(credentials)); + entry_username = gtk_entry_new (); + gtk_table_attach(GTK_TABLE(table),entry_username,1,2,1,2,GTK_FILL,0,0,0); + gtk_entry_set_activates_default (GTK_ENTRY (entry_username), TRUE); + if (credentials->username_obtained != CRED_UNINITIALISED) { + gtk_entry_set_text(GTK_ENTRY(entry_username), credentials->username); + } - label = gtk_label_new (prompt); + label = gtk_label_new ("Password:"); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_table_attach(GTK_TABLE(table),label,0,1,3,4,GTK_FILL,0,0,0); entry_password = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (hbox), entry_password, TRUE, TRUE, 0); + gtk_table_attach(GTK_TABLE(table),entry_password,1,2,3,4,GTK_FILL,0,0,0); gtk_entry_set_visibility (GTK_ENTRY (entry_password), FALSE); gtk_entry_set_activates_default (GTK_ENTRY (entry_password), TRUE); + if (credentials->password_obtained != CRED_UNINITIALISED) { + gtk_entry_set_text(GTK_ENTRY(entry_password), credentials->password); + } + + anonymous = gtk_check_button_new_with_mnemonic("_Anonymous"); + gtk_table_attach(GTK_TABLE(table),anonymous,0,2,4,5,GTK_FILL,0,0,0); dialog_action_area1 = GTK_DIALOG (dialog)->action_area; gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); @@ -72,7 +96,13 @@ static const char *gtk_get_userpassword(struct cli_credentials *credentials) switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_OK: - ret = talloc_strdup(credentials, gtk_entry_get_text(GTK_ENTRY(entry_password))); + cli_credentials_set_username(credentials, gtk_entry_get_text(GTK_ENTRY(entry_username)), CRED_SPECIFIED); + cli_credentials_set_password(credentials, gtk_entry_get_text(GTK_ENTRY(entry_password)), CRED_SPECIFIED); + cli_credentials_set_domain(credentials, gtk_entry_get_text(GTK_ENTRY(entry_domain)), CRED_SPECIFIED); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(anonymous))) { + cli_credentials_set_anonymous(credentials); + } break; default: ret = NULL; @@ -80,10 +110,24 @@ static const char *gtk_get_userpassword(struct cli_credentials *credentials) } gtk_widget_destroy (dialog); +} - talloc_free(prompt); - - return ret; +static const char *gtk_get_username(struct cli_credentials *credentials) +{ + gtk_get_credentials(credentials); + return credentials->username; +} + +static const char *gtk_get_userpassword(struct cli_credentials *credentials) +{ + gtk_get_credentials(credentials); + return credentials->password; +} + +static const char *gtk_get_domain(struct cli_credentials *credentials) +{ + gtk_get_credentials(credentials); + return credentials->domain; } void cli_credentials_set_gtk_callbacks(struct cli_credentials *cred) @@ -92,4 +136,14 @@ void cli_credentials_set_gtk_callbacks(struct cli_credentials *cred) cred->password_cb = gtk_get_userpassword; cred->password_obtained = CRED_CALLBACK; } + + if (cred->username_obtained <= CRED_CALLBACK) { + cred->username_cb = gtk_get_username; + cred->username_obtained = CRED_CALLBACK; + } + + if (cred->domain_obtained <= CRED_CALLBACK) { + cred->domain_cb = gtk_get_domain; + cred->domain_obtained = CRED_CALLBACK; + } } diff --git a/source4/gtk/common/gtk-smb.c b/source4/gtk/common/gtk-smb.c index f4458442f0..57a437ef96 100644 --- a/source4/gtk/common/gtk-smb.c +++ b/source4/gtk/common/gtk-smb.c @@ -50,7 +50,7 @@ void gtk_show_ntstatus(GtkWidget *win, const char *message, NTSTATUS status) static void on_browse_activate (GtkButton *button, gpointer user_data) { GtkRpcBindingDialog *rbd = user_data; - GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe, TRUE); + GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe); if(gtk_dialog_run(GTK_DIALOG(shd)) == GTK_RESPONSE_ACCEPT) { gtk_entry_set_text(GTK_ENTRY(rbd->entry_host), gtk_select_host_dialog_get_host(GTK_SELECT_HOST_DIALOG(shd))); } @@ -73,15 +73,10 @@ static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_di GtkWidget *hbox1; GtkWidget *lbl_name; GtkWidget *label2; + GtkWidget *label3; GtkWidget *frame_security; GtkWidget *vbox2; - GtkWidget *label3; - GtkWidget *table1; - GtkWidget *lbl_username; - GtkWidget *lbl_userdomain; GtkWidget *btn_browse; - GtkWidget *label9; - GtkWidget *lbl_credentials; GtkWidget *dialog_action_area1; GtkWidget *btn_cancel; GtkWidget *btn_connect; @@ -89,11 +84,6 @@ static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_di gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog"); - gtk_rpc_binding_dialog->credentials = cli_credentials_init(gtk_rpc_binding_dialog->mem_ctx); - - cli_credentials_guess(gtk_rpc_binding_dialog->credentials); - cli_credentials_set_gtk_callbacks(gtk_rpc_binding_dialog->credentials); - gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect"); dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox; @@ -155,6 +145,10 @@ static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_di gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_host), label2); frame_security = gtk_frame_new (NULL); + + label3 = gtk_label_new ("Security"); + gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3); + gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0); vbox2 = gtk_vbox_new (FALSE, 0); @@ -166,62 +160,6 @@ static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_di gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal"); gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0); - label3 = gtk_label_new ("Security"); - gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3); - - gtk_rpc_binding_dialog->frame_credentials = gtk_frame_new (NULL); - gtk_box_pack_start (GTK_BOX (dialog_vbox1), gtk_rpc_binding_dialog->frame_credentials, TRUE, TRUE, 0); - - table1 = gtk_table_new (4, 2, FALSE); - gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_credentials), table1); - - lbl_username = gtk_label_new ("Username:"); - gtk_table_attach (GTK_TABLE (table1), lbl_username, 0,1, 0,1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_misc_set_alignment (GTK_MISC (lbl_username), 0, 0.5); - - lbl_userdomain= gtk_label_new ("Domain:"); - gtk_table_attach (GTK_TABLE (table1), lbl_userdomain, 0,1, 1,2, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_misc_set_alignment (GTK_MISC (lbl_userdomain), 0, 0.5); - - label9 = gtk_label_new (""); - gtk_table_attach (GTK_TABLE (table1), label9, 0,1, 3,4, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5); - - gtk_rpc_binding_dialog->entry_username = gtk_entry_new (); - gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_username, 1,2, 0,1, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - - gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_username), - cli_credentials_get_username(gtk_rpc_binding_dialog->credentials)); - - gtk_rpc_binding_dialog->entry_userdomain = gtk_entry_new (); - gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_userdomain, 1,2, 1,2, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - - gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_userdomain), - cli_credentials_get_domain(gtk_rpc_binding_dialog->credentials)); - - gtk_rpc_binding_dialog->krb5_chk_button = gtk_check_button_new_with_mnemonic ("_Use kerberos"); - gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->krb5_chk_button, 1,2, 3,4, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - - /* Poor man's autodetection */ - if(getenv("KRB5CCNAME")) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->krb5_chk_button), TRUE); - } - - lbl_credentials = gtk_label_new ("Credentials"); - gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_credentials), lbl_credentials); - dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area; gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); @@ -272,24 +210,13 @@ GType gtk_rpc_binding_dialog_get_type (void) return mytype; } -GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials, struct dcerpc_pipe *sam_pipe) +GtkWidget *gtk_rpc_binding_dialog_new (struct dcerpc_pipe *sam_pipe) { GtkRpcBindingDialog *d = GTK_RPC_BINDING_DIALOG ( g_object_new (gtk_rpc_binding_dialog_get_type (), NULL)); - if (nocredentials) { - gtk_widget_hide_all(d->frame_credentials); - } d->sam_pipe = sam_pipe; return GTK_WIDGET(d); } -struct cli_credentials *gtk_rpc_binding_dialog_get_credentials(GtkRpcBindingDialog *d) -{ - cli_credentials_set_username(d->credentials, gtk_entry_get_text(GTK_ENTRY(d->entry_username)), CRED_SPECIFIED); - cli_credentials_set_domain(d->credentials, gtk_entry_get_text(GTK_ENTRY(d->entry_userdomain)), CRED_SPECIFIED); - - return d->credentials; -} - const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d) { return gtk_entry_get_text(GTK_ENTRY(d->entry_host)); diff --git a/source4/gtk/common/gtk-smb.h b/source4/gtk/common/gtk-smb.h index 2ff0a3be0c..378e909f5d 100644 --- a/source4/gtk/common/gtk-smb.h +++ b/source4/gtk/common/gtk-smb.h @@ -44,10 +44,8 @@ struct _GtkRpcBindingDialog GtkWidget *entry_userdomain; GtkWidget *entry_password; GtkWidget *krb5_chk_button; - GtkWidget *frame_credentials; TALLOC_CTX *mem_ctx; struct dcerpc_pipe *sam_pipe; - struct cli_credentials *credentials; }; typedef struct _GtkRpcBindingDialogClass GtkRpcBindingDialogClass; @@ -66,12 +64,11 @@ struct _GtkRpcBindingDialogClass /* subsystem prototypes */ GtkWidget *create_gtk_samba_about_dialog (const char *appname); void gtk_show_ntstatus(GtkWidget *win, const char *, NTSTATUS status); -GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials, struct dcerpc_pipe *sam_pipe); +GtkWidget *gtk_rpc_binding_dialog_new (struct dcerpc_pipe *sam_pipe); GType gtk_rpc_binding_dialog_get_type (void); struct dcerpc_binding *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx); void gtk_show_werror(GtkWidget *win, const char *, WERROR err); const char *gtk_rpc_binding_dialog_get_binding_string(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx); -struct cli_credentials *gtk_rpc_binding_dialog_get_credentials(GtkRpcBindingDialog *d); const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d); int gtk_event_loop(void); diff --git a/source4/gtk/common/select.c b/source4/gtk/common/select.c index 2075806f96..6149182b80 100644 --- a/source4/gtk/common/select.c +++ b/source4/gtk/common/select.c @@ -256,7 +256,7 @@ GType gtk_select_host_dialog_get_type (void) return mytype; } -GtkWidget *gtk_select_host_dialog_new (struct dcerpc_pipe *sam_pipe, BOOL nocredentials) +GtkWidget *gtk_select_host_dialog_new (struct dcerpc_pipe *sam_pipe) { return GTK_WIDGET ( g_object_new (gtk_select_host_dialog_get_type (), NULL )); } diff --git a/source4/gtk/common/select.h b/source4/gtk/common/select.h index 4cbeb09b0d..006d228e42 100644 --- a/source4/gtk/common/select.h +++ b/source4/gtk/common/select.h @@ -76,7 +76,7 @@ struct _GtkSelectHostDialogClass GtkWidget *gtk_select_domain_dialog_new (struct dcerpc_pipe *sam_pipe); GType gtk_select_domain_dialog_get_type (void); struct policy_handle gtk_select_domain_dialog_get_handle(GtkSelectDomainDialog *d); -GtkWidget *gtk_select_host_dialog_new (struct dcerpc_pipe *sam_pipe, BOOL nocredentials); +GtkWidget *gtk_select_host_dialog_new (struct dcerpc_pipe *sam_pipe); const char *gtk_select_host_dialog_get_host (GtkSelectHostDialog *d); GType gtk_select_host_dialog_get_type (void); diff --git a/source4/gtk/tools/gepdump.c b/source4/gtk/tools/gepdump.c index 97ba90abfe..33e91e1436 100644 --- a/source4/gtk/tools/gepdump.c +++ b/source4/gtk/tools/gepdump.c @@ -178,7 +178,7 @@ static void on_connect_clicked(GtkButton *btn, gpointer user_data) gint result; struct cli_credentials *credentials; - d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(TRUE, NULL)); + d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(NULL)); result = gtk_dialog_run(GTK_DIALOG(d)); switch(result) { case GTK_RESPONSE_ACCEPT: diff --git a/source4/gtk/tools/gregedit.c b/source4/gtk/tools/gregedit.c index 472a5683ed..5a9994df9c 100644 --- a/source4/gtk/tools/gregedit.c +++ b/source4/gtk/tools/gregedit.c @@ -396,9 +396,10 @@ static void on_open_local_activate(GtkMenuItem *menuitem, gpointer user_data) static void on_open_remote_activate(GtkMenuItem *menuitem, gpointer user_data) { char *tmp; - GtkWidget *rpcwin = GTK_WIDGET(gtk_rpc_binding_dialog_new(FALSE, NULL)); + GtkWidget *rpcwin = GTK_WIDGET(gtk_rpc_binding_dialog_new(NULL)); gint result = gtk_dialog_run(GTK_DIALOG(rpcwin)); WERROR error; + struct cli_credentials *creds; if(result != GTK_RESPONSE_ACCEPT) { @@ -406,8 +407,12 @@ static void on_open_remote_activate(GtkMenuItem *menuitem, gpointer user_data) return; } + creds = cli_credentials_init(mem_ctx); + cli_credentials_guess(creds); + cli_credentials_set_gtk_callbacks(creds); + error = reg_open_remote(®istry, - gtk_rpc_binding_dialog_get_credentials(GTK_RPC_BINDING_DIALOG(rpcwin)), + creds, gtk_rpc_binding_dialog_get_binding_string(GTK_RPC_BINDING_DIALOG(rpcwin), mem_ctx)); if(!W_ERROR_IS_OK(error)) { diff --git a/source4/gtk/tools/gwcrontab.c b/source4/gtk/tools/gwcrontab.c index a1b57225db..2a8ee5049e 100644 --- a/source4/gtk/tools/gwcrontab.c +++ b/source4/gtk/tools/gwcrontab.c @@ -87,10 +87,11 @@ on_connect_activate (GtkMenuItem *menuitem, { GtkRpcBindingDialog *d; NTSTATUS status; + struct cli_credentials *credentials; gint result; TALLOC_CTX *mem_ctx; - d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(FALSE, NULL)); + d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(NULL)); result = gtk_dialog_run(GTK_DIALOG(d)); switch(result) { case GTK_RESPONSE_ACCEPT: @@ -102,12 +103,16 @@ on_connect_activate (GtkMenuItem *menuitem, mem_ctx = talloc_init("gwcrontab_connect"); /* If connected, get list of jobs */ + + credentials = cli_credentials_init(mem_ctx); + cli_credentials_guess(credentials); + cli_credentials_set_gtk_callbacks(credentials); status = dcerpc_pipe_connect_b(mem_ctx, &at_pipe, gtk_rpc_binding_dialog_get_binding(d, mem_ctx), DCERPC_ATSVC_UUID, DCERPC_ATSVC_VERSION, - gtk_rpc_binding_dialog_get_credentials(d)); + credentials); if(!NT_STATUS_IS_OK(status)) { gtk_show_ntstatus(mainwin, "Error while connecting to at service", status); diff --git a/source4/gtk/tools/gwsam.c b/source4/gtk/tools/gwsam.c index 71765424d7..f712d43ba1 100644 --- a/source4/gtk/tools/gwsam.c +++ b/source4/gtk/tools/gwsam.c @@ -113,10 +113,11 @@ static void connect_sam(void) GtkRpcBindingDialog *d; NTSTATUS status; struct samr_Connect r; + struct cli_credentials *cred; TALLOC_CTX *mem_ctx; gint result; - d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(FALSE, NULL)); + d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(NULL)); result = gtk_dialog_run(GTK_DIALOG(d)); switch(result) { case GTK_RESPONSE_ACCEPT: @@ -127,12 +128,14 @@ static void connect_sam(void) } mem_ctx = talloc_init("gwsam_connect"); + cred = cli_credentials_init(mem_ctx); + cli_credentials_guess(cred); + cli_credentials_set_gtk_callbacks(cred); + /* If connected, get list of jobs */ status = dcerpc_pipe_connect_b(mem_ctx, &sam_pipe, gtk_rpc_binding_dialog_get_binding(d, mem_ctx), - DCERPC_SAMR_UUID, DCERPC_SAMR_VERSION, - gtk_rpc_binding_dialog_get_credentials(d) - ); + DCERPC_SAMR_UUID, DCERPC_SAMR_VERSION, cred ); if(!NT_STATUS_IS_OK(status)) { gtk_show_ntstatus(mainwin, "While connecting to SAMR interface", status); -- cgit