r5941: Commit this patch much earlier than I would normally prefer, but metze needs...
[nivanova/samba-autobuild/.git] / source4 / gtk / common / gtk-smb.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB-related GTK+ functions
4    
5    Copyright (C) Jelmer Vernooij 2004-2005
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23 #include "gtk/common/select.h"
24 #include "gtk/common/gtk-smb.h"
25
26 void gtk_show_werror(GtkWidget *win, const char *message, WERROR err) 
27 {
28         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
29                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
30                                                     GTK_MESSAGE_ERROR,
31                                                     GTK_BUTTONS_CLOSE,
32                                                     "%s: %s\n", message?message: "Windows error",
33                                                     win_errstr(err));
34         gtk_dialog_run (GTK_DIALOG (dialog));
35         gtk_widget_destroy (dialog);
36 }
37                    
38 void gtk_show_ntstatus(GtkWidget *win, const char *message, NTSTATUS status) 
39 {
40         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
41                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
42                                                     GTK_MESSAGE_ERROR,
43                                                     GTK_BUTTONS_CLOSE,
44                                                     "%s: %s\n", message?message:"Windows error",
45                                                     nt_errstr(status));
46         gtk_dialog_run (GTK_DIALOG (dialog));
47         gtk_widget_destroy (dialog);
48 }
49
50 static void on_browse_activate  (GtkButton     *button,  gpointer         user_data)
51 {
52         GtkRpcBindingDialog *rbd = user_data;
53         GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe, TRUE);
54         if(gtk_dialog_run(GTK_DIALOG(shd)) == GTK_RESPONSE_ACCEPT) {
55                 gtk_entry_set_text(GTK_ENTRY(rbd->entry_host), gtk_select_host_dialog_get_host(GTK_SELECT_HOST_DIALOG(shd)));
56         }
57         
58         gtk_widget_destroy(GTK_WIDGET(shd));
59 }
60
61 static void on_krb5_toggled(GtkToggleButton *togglebutton, GtkRpcBindingDialog *d)
62 {
63         gtk_widget_set_sensitive(d->entry_password, !gtk_toggle_button_get_active(togglebutton));
64 }
65
66 static void on_ncalrpc_toggled(GtkToggleButton *tb, GtkRpcBindingDialog *d)
67 {
68         gtk_widget_set_sensitive(d->frame_host, !gtk_toggle_button_get_active(tb));
69 }
70
71 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
72 {
73         GtkWidget *dialog_vbox1;
74         GtkWidget *vbox1;
75         GtkWidget *vbox6;
76         GtkWidget *frame_transport;
77         GtkWidget *label1;
78         GtkWidget *hbox1;
79         GtkWidget *lbl_name;
80         GtkWidget *label2;
81         GtkWidget *frame_security;
82         GtkWidget *vbox2;
83         GtkWidget *label3;
84         GtkWidget *table1;
85         GtkWidget *lbl_username;
86         GtkWidget *lbl_userdomain;
87         GtkWidget *lbl_password;
88         GtkWidget *btn_browse;
89         GtkWidget *label9;
90         GtkWidget *lbl_credentials;
91         GtkWidget *dialog_action_area1;
92         GtkWidget *btn_cancel;
93         GtkWidget *btn_connect;
94         GSList *transport_smb_group = NULL;
95
96         gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog");
97
98         gtk_rpc_binding_dialog->credentials = cli_credentials_init(gtk_rpc_binding_dialog->mem_ctx);
99
100         cli_credentials_guess(gtk_rpc_binding_dialog->credentials);
101         
102         gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect");
103
104         dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox;
105
106         vbox1 = gtk_vbox_new (FALSE, 0);
107         gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
108
109         frame_transport = gtk_frame_new (NULL);
110         gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
111
112         vbox6 = gtk_vbox_new (FALSE, 0);
113         gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
114
115         gtk_rpc_binding_dialog->transport_ncalrpc = gtk_radio_button_new_with_mnemonic (NULL, "Local Host");
116         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_ncalrpc, FALSE, FALSE, 0);
117         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc), transport_smb_group);
118         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc));
119
120
121         gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
122         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
123         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
124         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
125         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
126
127         gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
128         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
129         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
130         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
131
132
133
134         label1 = gtk_label_new ("Transport");
135         gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
136
137         gtk_rpc_binding_dialog->frame_host = gtk_frame_new (NULL);
138         gtk_box_pack_start (GTK_BOX (vbox1), gtk_rpc_binding_dialog->frame_host, TRUE, TRUE, 0);
139
140         hbox1 = gtk_hbox_new (FALSE, 0);
141         gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_host), hbox1);
142
143         lbl_name = gtk_label_new ("Name");
144         gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
145
146         gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
147         gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
148
149         if(gtk_rpc_binding_dialog->sam_pipe)
150         {
151                 btn_browse = gtk_button_new_with_label ("Browse");
152                 gtk_box_pack_start (GTK_BOX (hbox1), btn_browse, TRUE, TRUE, 0);
153
154                 g_signal_connect ((gpointer) btn_browse, "pressed",
155                                                   G_CALLBACK (on_browse_activate),
156                                                   gtk_rpc_binding_dialog);
157         }
158
159         label2 = gtk_label_new ("Host");
160         gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_host), label2);
161
162         frame_security = gtk_frame_new (NULL);
163         gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
164
165         vbox2 = gtk_vbox_new (FALSE, 0);
166         gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
167
168         gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
169         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
170
171         gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
172         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
173
174         label3 = gtk_label_new ("Security");
175         gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
176
177         gtk_rpc_binding_dialog->frame_credentials = gtk_frame_new (NULL);
178         gtk_box_pack_start (GTK_BOX (dialog_vbox1), gtk_rpc_binding_dialog->frame_credentials, TRUE, TRUE, 0);
179
180         table1 = gtk_table_new (4, 2, FALSE);
181         gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_credentials), table1);
182
183         lbl_username = gtk_label_new ("Username:");
184         gtk_table_attach (GTK_TABLE (table1), lbl_username, 0,1, 0,1,
185                                           (GtkAttachOptions) (GTK_FILL),
186                                           (GtkAttachOptions) (0), 0, 0);
187         gtk_misc_set_alignment (GTK_MISC (lbl_username), 0, 0.5);
188
189         lbl_userdomain= gtk_label_new ("Domain:");
190         gtk_table_attach (GTK_TABLE (table1), lbl_userdomain, 0,1, 1,2,
191                                           (GtkAttachOptions) (GTK_FILL),
192                                           (GtkAttachOptions) (0), 0, 0);
193         gtk_misc_set_alignment (GTK_MISC (lbl_userdomain), 0, 0.5);
194
195         lbl_password = gtk_label_new ("Password:");
196         gtk_table_attach (GTK_TABLE (table1), lbl_password, 0,1, 2,3,
197                                           (GtkAttachOptions) (GTK_FILL),
198                                           (GtkAttachOptions) (0), 0, 0);
199         gtk_misc_set_alignment (GTK_MISC (lbl_password), 0, 0.5);
200
201         label9 = gtk_label_new ("");
202         gtk_table_attach (GTK_TABLE (table1), label9, 0,1, 3,4,
203                                           (GtkAttachOptions) (GTK_FILL),
204                                           (GtkAttachOptions) (0), 0, 0);
205         gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
206
207         gtk_rpc_binding_dialog->entry_username = gtk_entry_new ();
208         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_username, 1,2, 0,1,
209                                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
210                                           (GtkAttachOptions) (0), 0, 0);
211
212         gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_username), 
213                                            cli_credentials_get_username(gtk_rpc_binding_dialog->credentials));
214
215         gtk_rpc_binding_dialog->entry_userdomain = gtk_entry_new ();
216         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_userdomain, 1,2, 1,2,
217                                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
218                                           (GtkAttachOptions) (0), 0, 0);
219
220         gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_userdomain), 
221                                            cli_credentials_get_domain(gtk_rpc_binding_dialog->credentials));
222
223         gtk_rpc_binding_dialog->entry_password = gtk_entry_new ();
224         gtk_entry_set_visibility (GTK_ENTRY (gtk_rpc_binding_dialog->entry_password), FALSE);
225         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_password, 1,2, 2,3,
226                                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
227                                           (GtkAttachOptions) (0), 0, 0);
228
229         gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_password), 
230                                            cli_credentials_get_password(gtk_rpc_binding_dialog->credentials));
231
232         gtk_rpc_binding_dialog->krb5_chk_button = gtk_check_button_new_with_mnemonic ("_Use kerberos");
233         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->krb5_chk_button, 1,2, 3,4,
234                                           (GtkAttachOptions) (GTK_FILL),
235                                           (GtkAttachOptions) (0), 0, 0);
236
237         g_signal_connect ((gpointer) gtk_rpc_binding_dialog->krb5_chk_button, "toggled",
238                                           G_CALLBACK (on_krb5_toggled),
239                                           gtk_rpc_binding_dialog);
240
241         /* Poor man's autodetection */
242         if(getenv("KRB5CCNAME")) {
243                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->krb5_chk_button), TRUE);
244         }
245
246         lbl_credentials = gtk_label_new ("Credentials");
247         gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_credentials), lbl_credentials);
248
249         dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area;
250         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
251
252         btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
253         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
254         GTK_WIDGET_SET_FLAGS (btn_cancel, GTK_CAN_DEFAULT);
255
256         btn_connect = gtk_button_new_with_mnemonic ("_Connect");
257         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
258         gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
259         GTK_WIDGET_SET_FLAGS (btn_connect, GTK_CAN_DEFAULT);
260
261         g_signal_connect ((gpointer) gtk_rpc_binding_dialog->transport_ncalrpc, "toggled",
262                                                   G_CALLBACK (on_ncalrpc_toggled),
263                                                   gtk_rpc_binding_dialog);
264
265
266         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->transport_ncalrpc), TRUE);
267         gtk_widget_show_all(dialog_vbox1);
268
269         gtk_widget_grab_focus (btn_connect);
270         gtk_widget_grab_default (btn_connect);
271 }
272
273 GType gtk_rpc_binding_dialog_get_type (void)
274 {
275   static GType mytype = 0;
276
277   if (!mytype)
278     {
279       static const GTypeInfo myinfo =
280       {
281         sizeof (GtkRpcBindingDialogClass),
282         NULL,
283         NULL,
284         NULL,
285         NULL,
286         NULL,
287         sizeof(GtkRpcBindingDialog),
288         0,
289         (GInstanceInitFunc) gtk_rpc_binding_dialog_init,
290       };
291
292       mytype = g_type_register_static (GTK_TYPE_DIALOG, 
293                 "GtkRpcBindingDialog", &myinfo, 0);
294     }
295
296   return mytype;
297 }
298
299 GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials, struct sam_pipe *sam_pipe)
300 {
301         GtkRpcBindingDialog *d = GTK_RPC_BINDING_DIALOG ( g_object_new (gtk_rpc_binding_dialog_get_type (), NULL));
302         if (nocredentials) {
303                 gtk_widget_hide_all(d->frame_credentials);
304         }
305         d->sam_pipe = sam_pipe;
306         return GTK_WIDGET(d);
307 }
308
309 struct cli_credentials *gtk_rpc_binding_dialog_get_credentials(GtkRpcBindingDialog *d)
310 {
311         cli_credentials_set_username(d->credentials, gtk_entry_get_text(GTK_ENTRY(d->entry_username)), CRED_SPECIFIED);
312         cli_credentials_set_password(d->credentials, gtk_entry_get_text(GTK_ENTRY(d->entry_password)), CRED_SPECIFIED);
313         cli_credentials_set_domain(d->credentials, gtk_entry_get_text(GTK_ENTRY(d->entry_userdomain)), CRED_SPECIFIED);
314         
315         return d->credentials;
316 }
317
318 const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d)
319 {
320         return gtk_entry_get_text(GTK_ENTRY(d->entry_host));
321 }
322
323 struct dcerpc_binding *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
324 {
325         struct dcerpc_binding *binding = talloc(mem_ctx, struct dcerpc_binding);
326
327         ZERO_STRUCT(binding->object);
328
329         /* Format: TRANSPORT:host[\pipe\foo,foo,foo] */
330
331         binding->host = talloc_strdup(mem_ctx, gtk_entry_get_text(GTK_ENTRY(d->entry_host)));
332         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip))) {
333                 binding->transport = NCACN_IP_TCP;
334         } else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_ncalrpc))) {
335                 binding->transport = NCALRPC;
336                 binding->host = NULL;
337         } else {
338                 binding->transport = NCACN_NP;
339         }
340
341         binding->options = NULL;
342         binding->flags = 0;
343         binding->endpoint = NULL;
344
345         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
346                 binding->flags |= DCERPC_SEAL;
347         }
348
349         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
350                 binding->flags |= DCERPC_SIGN;
351         }
352
353         return binding;
354 }
355
356 const char *gtk_rpc_binding_dialog_get_binding_string(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
357 {
358         return dcerpc_binding_string(mem_ctx, gtk_rpc_binding_dialog_get_binding(d, mem_ctx));
359 }
360
361 GtkWidget *create_gtk_samba_about_dialog (const char *appname)
362 {
363         GtkWidget *samba_about_dialog;
364         GtkWidget *dialog_vbox1;
365         GtkWidget *label1;
366         GtkWidget *label2;
367         GtkWidget *label3;
368         GtkWidget *label4;
369         GtkWidget *dialog_action_area1;
370         GtkWidget *okbutton1;
371
372         samba_about_dialog = gtk_dialog_new ();
373         gtk_window_set_title (GTK_WINDOW (samba_about_dialog), "About");
374
375         dialog_vbox1 = GTK_DIALOG (samba_about_dialog)->vbox;
376
377         /* FIXME image1 = create_pixmap (samba_about_dialog, "slmed.png");
378            gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, TRUE, TRUE, 0);*/
379
380         label1 = gtk_label_new (appname);
381         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
382
383         label2 = gtk_label_new (samba_version_string());
384         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, FALSE, FALSE, 0);
385
386         label3 = gtk_label_new_with_mnemonic ("Part of Samba <http://www.samba.org/>");
387         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label3, FALSE, FALSE, 0);
388
389         label4 = gtk_label_new ("\302\251 1992-2005 The Samba Team");
390         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label4, FALSE, FALSE, 0);
391
392         dialog_action_area1 = GTK_DIALOG (samba_about_dialog)->action_area;
393         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
394
395         okbutton1 = gtk_button_new_from_stock ("gtk-ok");
396         gtk_dialog_add_action_widget (GTK_DIALOG (samba_about_dialog), okbutton1, GTK_RESPONSE_OK);
397         GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
398         gtk_widget_show_all(dialog_vbox1);
399
400         return samba_about_dialog;
401 }