r9772: Make credentials callbacks more consistant with the abstraction
[samba.git] / source / gtk / common / credentials.c
index dce77220fdcbabe6a9206401d2e081fa69b13e25..01132ec6bd6cb8353e46ce04c4f6231e9c69eeb1 100644 (file)
 #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);
 
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox, TRUE, TRUE, 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);
 
-       prompt = talloc_asprintf(NULL, "Password for [%s\\%s]:", 
-                                                        cli_credentials_get_domain(credentials),
-                                                        cli_credentials_get_username(credentials));
+       if (credentials->domain_obtained != CRED_UNINITIALISED) {
+               gtk_entry_set_text(GTK_ENTRY(entry_domain), credentials->domain);
+       }
+
+       label = gtk_label_new ("Username:");
 
-       label = gtk_label_new (prompt);
+       gtk_table_attach(GTK_TABLE(table),label,0,1,1,2,GTK_FILL,0,0,0);
 
-       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+       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 ("Password:");
+
+       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,16 +110,29 @@ static const char *gtk_get_userpassword(struct cli_credentials *credentials)
        }
 
        gtk_widget_destroy (dialog);
+}
+
+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;
+}
 
-       talloc_free(prompt);
-       
-       return ret;
+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)
 {
-       if (cred->password_obtained <= CRED_CALLBACK) {
-               cred->password_cb = gtk_get_userpassword;
-               cred->password_obtained = CRED_CALLBACK;
-       }
+       cli_credentials_set_username_callback(cred, gtk_get_username);
+       cli_credentials_set_domain_callback(cred, gtk_get_domain);
+       cli_credentials_set_password_callback(cred, gtk_get_userpassword);
 }