r5987: Add credentials callback for gtk+. The gtk+ apps now no longer
[samba.git] / source4 / gtk / common / gtk-smb.c
index 7d7de18e767baa8234efffcc438e10e42bb5963a..f4458442f0fa0d7657242f625c88297a930f240d 100644 (file)
@@ -2,7 +2,7 @@
    Unix SMB/CIFS implementation.
    SMB-related GTK+ functions
    
-   Copyright (C) Jelmer Vernooij 2004
+   Copyright (C) Jelmer Vernooij 2004-2005
 
    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
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
 #include "includes.h"
+#include "gtk/common/gtk-smb.h"
+#include "gtk/common/select.h"
 
-void gtk_show_werror(GtkWidget *win, WERROR err) 
+void gtk_show_werror(GtkWidget *win, const char *message, WERROR err) 
 {
        GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
-                GTK_DIALOG_DESTROY_WITH_PARENT,
-         GTK_MESSAGE_ERROR,
-         GTK_BUTTONS_CLOSE,
-                "Windows error: %s\n", win_errstr(err));
+                                                   GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                   GTK_MESSAGE_ERROR,
+                                                   GTK_BUTTONS_CLOSE,
+                                                   "%s: %s\n", message?message: "Windows error",
+                                                   win_errstr(err));
        gtk_dialog_run (GTK_DIALOG (dialog));
        gtk_widget_destroy (dialog);
 }
                    
-void gtk_show_ntstatus(GtkWidget *win, NTSTATUS status) 
+void gtk_show_ntstatus(GtkWidget *win, const char *message, NTSTATUS status) 
 {
        GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
-                GTK_DIALOG_DESTROY_WITH_PARENT,
-         GTK_MESSAGE_ERROR,
-         GTK_BUTTONS_CLOSE,
-                "Windows error: %s\n", nt_errstr(status));
+                                                   GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                   GTK_MESSAGE_ERROR,
+                                                   GTK_BUTTONS_CLOSE,
+                                                   "%s: %s\n", message?message:"Windows error",
+                                                   nt_errstr(status));
        gtk_dialog_run (GTK_DIALOG (dialog));
        gtk_widget_destroy (dialog);
 }
 
-static void gtk_rpc_binding_dialog_class_init (GtkRpcBindingDialogClass *class)
+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);
+       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)));
+       }
+       
+       gtk_widget_destroy(GTK_WIDGET(shd));
+}
+
+static void on_ncalrpc_toggled(GtkToggleButton *tb, GtkRpcBindingDialog *d)
 {
+       gtk_widget_set_sensitive(d->frame_host, !gtk_toggle_button_get_active(tb));
 }
 
 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
@@ -65,22 +69,18 @@ static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_di
        GtkWidget *vbox1;
        GtkWidget *vbox6;
        GtkWidget *frame_transport;
-       GtkWidget *hbox2;
-       GtkWidget *lbl_transport;
        GtkWidget *label1;
-       GtkWidget *frame_host;
        GtkWidget *hbox1;
        GtkWidget *lbl_name;
        GtkWidget *label2;
        GtkWidget *frame_security;
        GtkWidget *vbox2;
        GtkWidget *label3;
-       GtkWidget *frame_credentials;
        GtkWidget *table1;
        GtkWidget *lbl_username;
-       GtkWidget *lbl_password;
+       GtkWidget *lbl_userdomain;
+       GtkWidget *btn_browse;
        GtkWidget *label9;
-       GtkWidget *chk_button;
        GtkWidget *lbl_credentials;
        GtkWidget *dialog_action_area1;
        GtkWidget *btn_cancel;
@@ -88,153 +88,165 @@ static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_di
        GSList *transport_smb_group = NULL;
 
        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;
-       gtk_widget_show (dialog_vbox1);
 
        vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox1);
        gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
 
        frame_transport = gtk_frame_new (NULL);
-       gtk_widget_show (frame_transport);
        gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
 
        vbox6 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox6);
        gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
 
+       gtk_rpc_binding_dialog->transport_ncalrpc = gtk_radio_button_new_with_mnemonic (NULL, "Local Host");
+       gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_ncalrpc, FALSE, FALSE, 0);
+       gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc), transport_smb_group);
+       transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc));
+
+
        gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
-       gtk_widget_show (gtk_rpc_binding_dialog->transport_smb);
        gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
        gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
        transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
 
        gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
-       gtk_widget_show (gtk_rpc_binding_dialog->transport_tcp_ip);
        gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
        gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
        transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
 
+
+
        label1 = gtk_label_new ("Transport");
-       gtk_widget_show (label1);
        gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
 
-       frame_host = gtk_frame_new (NULL);
-       gtk_widget_show (frame_host);
-       gtk_box_pack_start (GTK_BOX (vbox1), frame_host, TRUE, TRUE, 0);
+       gtk_rpc_binding_dialog->frame_host = gtk_frame_new (NULL);
+       gtk_box_pack_start (GTK_BOX (vbox1), gtk_rpc_binding_dialog->frame_host, TRUE, TRUE, 0);
 
        hbox1 = gtk_hbox_new (FALSE, 0);
-       gtk_widget_show (hbox1);
-       gtk_container_add (GTK_CONTAINER (frame_host), hbox1);
+       gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_host), hbox1);
 
        lbl_name = gtk_label_new ("Name");
-       gtk_widget_show (lbl_name);
        gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
 
        gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
-       gtk_widget_show (gtk_rpc_binding_dialog->entry_host);
        gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
 
+       if(gtk_rpc_binding_dialog->sam_pipe)
+       {
+               btn_browse = gtk_button_new_with_label ("Browse");
+               gtk_box_pack_start (GTK_BOX (hbox1), btn_browse, TRUE, TRUE, 0);
+
+               g_signal_connect ((gpointer) btn_browse, "pressed",
+                                                 G_CALLBACK (on_browse_activate),
+                                                 gtk_rpc_binding_dialog);
+       }
+
        label2 = gtk_label_new ("Host");
-       gtk_widget_show (label2);
-       gtk_frame_set_label_widget (GTK_FRAME (frame_host), label2);
+       gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_host), label2);
 
        frame_security = gtk_frame_new (NULL);
-       gtk_widget_show (frame_security);
        gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
 
        vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_widget_show (vbox2);
        gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
 
        gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
-       gtk_widget_show (gtk_rpc_binding_dialog->chk_sign);
        gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
 
        gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
-       gtk_widget_show (gtk_rpc_binding_dialog->chk_seal);
        gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
 
        label3 = gtk_label_new ("Security");
-       gtk_widget_show (label3);
        gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
 
-       frame_credentials = gtk_frame_new (NULL);
-       gtk_widget_show (frame_credentials);
-       gtk_box_pack_start (GTK_BOX (dialog_vbox1), frame_credentials, TRUE, TRUE, 0);
+       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 (3, 2, FALSE);
-       gtk_widget_show (table1);
-       gtk_container_add (GTK_CONTAINER (frame_credentials), table1);
+       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_widget_show (lbl_username);
-       gtk_table_attach (GTK_TABLE (table1), lbl_username, 0, 1, 0, 1,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
+       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_password = gtk_label_new ("Password:");
-       gtk_widget_show (lbl_password);
-       gtk_table_attach (GTK_TABLE (table1), lbl_password, 0, 1, 1, 2,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
-       gtk_misc_set_alignment (GTK_MISC (lbl_password), 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_widget_show (label9);
-       gtk_table_attach (GTK_TABLE (table1), label9, 0, 1, 2, 3,
-                       (GtkAttachOptions) (GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
+       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_password = gtk_entry_new ();
-       gtk_entry_set_visibility (GTK_ENTRY (gtk_rpc_binding_dialog->entry_password), FALSE);
-       gtk_widget_show (gtk_rpc_binding_dialog->entry_password);
-       gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_password, 1, 2, 1, 2,
-                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                       (GtkAttachOptions) (0), 0, 0);
-
        gtk_rpc_binding_dialog->entry_username = gtk_entry_new ();
-       gtk_widget_show (gtk_rpc_binding_dialog->entry_username);
-       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_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);
 
-       chk_button = gtk_check_button_new_with_mnemonic ("_Use kerberos");
-       gtk_widget_show (chk_button);
-       gtk_table_attach (GTK_TABLE (table1), chk_button, 1, 2, 2, 3,
-                       (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_widget_show (lbl_credentials);
-       gtk_frame_set_label_widget (GTK_FRAME (frame_credentials), lbl_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_widget_show (dialog_action_area1);
        gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
 
        btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
-       gtk_widget_show (btn_cancel);
        gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
        GTK_WIDGET_SET_FLAGS (btn_cancel, GTK_CAN_DEFAULT);
 
        btn_connect = gtk_button_new_with_mnemonic ("_Connect");
-       gtk_widget_show (btn_connect);
        gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
        gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
        GTK_WIDGET_SET_FLAGS (btn_connect, GTK_CAN_DEFAULT);
 
+       g_signal_connect ((gpointer) gtk_rpc_binding_dialog->transport_ncalrpc, "toggled",
+                                                 G_CALLBACK (on_ncalrpc_toggled),
+                                                 gtk_rpc_binding_dialog);
+
+
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->transport_ncalrpc), TRUE);
+       gtk_widget_show_all(dialog_vbox1);
+
        gtk_widget_grab_focus (btn_connect);
        gtk_widget_grab_default (btn_connect);
 }
 
-GType gtk_rpc_binding_dialog_get_type ()
+GType gtk_rpc_binding_dialog_get_type (void)
 {
   static GType mytype = 0;
 
@@ -245,7 +257,7 @@ GType gtk_rpc_binding_dialog_get_type ()
        sizeof (GtkRpcBindingDialogClass),
        NULL,
        NULL,
-       (GClassInitFunc) gtk_rpc_binding_dialog_class_init,
+       NULL,
        NULL,
        NULL,
        sizeof(GtkRpcBindingDialog),
@@ -260,93 +272,105 @@ GType gtk_rpc_binding_dialog_get_type ()
   return mytype;
 }
 
-GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials)
+GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials, struct dcerpc_pipe *sam_pipe)
 {
-       return GTK_WIDGET ( gtk_type_new (gtk_rpc_binding_dialog_get_type ()));
+       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);
 }
 
-const char *gtk_rpc_binding_dialog_get_username(GtkRpcBindingDialog *d)
+struct cli_credentials *gtk_rpc_binding_dialog_get_credentials(GtkRpcBindingDialog *d)
 {
-       return gtk_entry_get_text(GTK_ENTRY(d->entry_username));
+       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_password(GtkRpcBindingDialog *d)
+const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d)
 {
-       return gtk_entry_get_text(GTK_ENTRY(d->entry_password));
+       return gtk_entry_get_text(GTK_ENTRY(d->entry_host));
 }
 
-const char *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, char *pipe)
+struct dcerpc_binding *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
 {
-       const char *transport;
-       const char *host;
-       char *options = NULL;
-       char *binding = NULL;
-
-       host = gtk_entry_get_text(GTK_ENTRY(d->entry_host));
-       if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip)))
-               transport = "ncacn_tcp";
-       else 
-               transport = "ncacn_np";
-       // Format: TRANSPORT:host:[\pipe\foo,foo,foo]
-       if(pipe != NULL) {
-               options = talloc_asprintf(d->mem_ctx, "\\pipe\\%s", pipe);
+       struct dcerpc_binding *binding = talloc(mem_ctx, struct dcerpc_binding);
+
+       ZERO_STRUCT(binding->object);
+
+       /* Format: TRANSPORT:host[\pipe\foo,foo,foo] */
+
+       binding->host = talloc_strdup(mem_ctx, gtk_entry_get_text(GTK_ENTRY(d->entry_host)));
+       if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip))) {
+               binding->transport = NCACN_IP_TCP;
+       } else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_ncalrpc))) {
+               binding->transport = NCALRPC;
+               binding->host = NULL;
+       } else {
+               binding->transport = NCACN_NP;
        }
-       
+
+       binding->options = NULL;
+       binding->flags = 0;
+       binding->endpoint = NULL;
+
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
-               options = talloc_asprintf_append(d->mem_ctx, options, ",seal");
+               binding->flags |= DCERPC_SEAL;
        }
 
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
-               options = talloc_asprintf_append(d->mem_ctx, options, ",sign");
+               binding->flags |= DCERPC_SIGN;
        }
 
-       if(options) {
-               return talloc_asprintf(d->mem_ctx, "%s:%s:[%s]", transport, host, options);
-       } else {
-               return talloc_asprintf(d->mem_ctx, "%s:%s", transport, host);
-       }
+       return binding;
 }
 
-GtkWidget* create_gtk_samba_about_dialog (char *appname)
+const char *gtk_rpc_binding_dialog_get_binding_string(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
 {
-  GtkWidget *dialog_vbox1;
-  GtkWidget *image1;
-  GtkWidget *label1;
-  GtkWidget *label2;
-  GtkWidget *dialog_action_area1;
-  GtkWidget *closebutton1;
-  GtkWidget *aboutwin;
-
-  aboutwin = gtk_dialog_new ();
-  gtk_window_set_title (GTK_WINDOW (aboutwin), "About");
-  gtk_window_set_resizable (GTK_WINDOW (aboutwin), FALSE);
-
-  dialog_vbox1 = GTK_DIALOG (aboutwin)->vbox;
-  gtk_widget_show (dialog_vbox1);
-
-  /* FIXME: Samba logo ? 
-  image1 = create_pixmap (aboutwin, "samba.png");
-  gtk_widget_show (image1);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, FALSE, TRUE, 0); */
-
-  label1 = gtk_label_new (appname);
-  gtk_widget_show (label1);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
-  gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
-
-  label2 = gtk_label_new_with_mnemonic ("(C) 2004 Jelmer Vernooij <jelmer@samba.org>\nPart of Samba\nhttp://www.samba.org/\n");
-  gtk_widget_show (label2);
-  gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, TRUE, FALSE, 0);
-  gtk_label_set_use_markup (GTK_LABEL (label2), TRUE);
-
-  dialog_action_area1 = GTK_DIALOG (aboutwin)->action_area;
-  gtk_widget_show (dialog_action_area1);
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
-
-  closebutton1 = gtk_button_new_from_stock ("gtk-close");
-  gtk_widget_show (closebutton1);
-  gtk_dialog_add_action_widget (GTK_DIALOG (aboutwin), closebutton1, GTK_RESPONSE_CLOSE);
-  GTK_WIDGET_SET_FLAGS (closebutton1, GTK_CAN_DEFAULT);
-
-  return aboutwin;
+       return dcerpc_binding_string(mem_ctx, gtk_rpc_binding_dialog_get_binding(d, mem_ctx));
+}
+
+GtkWidget *create_gtk_samba_about_dialog (const char *appname)
+{
+       GtkWidget *samba_about_dialog;
+       GtkWidget *dialog_vbox1;
+       GtkWidget *label1;
+       GtkWidget *label2;
+       GtkWidget *label3;
+       GtkWidget *label4;
+       GtkWidget *dialog_action_area1;
+       GtkWidget *okbutton1;
+
+       samba_about_dialog = gtk_dialog_new ();
+       gtk_window_set_title (GTK_WINDOW (samba_about_dialog), "About");
+
+       dialog_vbox1 = GTK_DIALOG (samba_about_dialog)->vbox;
+
+       /* FIXME image1 = create_pixmap (samba_about_dialog, "slmed.png");
+          gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, TRUE, TRUE, 0);*/
+
+       label1 = gtk_label_new (appname);
+       gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
+
+       label2 = gtk_label_new (samba_version_string());
+       gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, FALSE, FALSE, 0);
+
+       label3 = gtk_label_new_with_mnemonic ("Part of Samba <http://www.samba.org/>");
+       gtk_box_pack_start (GTK_BOX (dialog_vbox1), label3, FALSE, FALSE, 0);
+
+       label4 = gtk_label_new ("\302\251 1992-2005 The Samba Team");
+       gtk_box_pack_start (GTK_BOX (dialog_vbox1), label4, FALSE, FALSE, 0);
+
+       dialog_action_area1 = GTK_DIALOG (samba_about_dialog)->action_area;
+       gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
+
+       okbutton1 = gtk_button_new_from_stock ("gtk-ok");
+       gtk_dialog_add_action_widget (GTK_DIALOG (samba_about_dialog), okbutton1, GTK_RESPONSE_OK);
+       GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
+       gtk_widget_show_all(dialog_vbox1);
+
+       return samba_about_dialog;
 }