f14977599689df3e1fbe7eba2ce1b0e897b46ccc
[samba.git] / source / gtk / common / gtk-smb.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB-related GTK+ functions
4    
5    Copyright (C) Jelmer Vernooij 2004
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-smb.h"
24
25 void gtk_show_werror(GtkWidget *win, WERROR err) 
26 {
27         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
28                  GTK_DIALOG_DESTROY_WITH_PARENT,
29          GTK_MESSAGE_ERROR,
30          GTK_BUTTONS_CLOSE,
31                  "Windows error: %s\n", win_errstr(err));
32         gtk_dialog_run (GTK_DIALOG (dialog));
33         gtk_widget_destroy (dialog);
34 }
35                    
36 void gtk_show_ntstatus(GtkWidget *win, NTSTATUS status) 
37 {
38         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
39                  GTK_DIALOG_DESTROY_WITH_PARENT,
40          GTK_MESSAGE_ERROR,
41          GTK_BUTTONS_CLOSE,
42                  "Windows error: %s\n", nt_errstr(status));
43         gtk_dialog_run (GTK_DIALOG (dialog));
44         gtk_widget_destroy (dialog);
45 }
46
47 static void on_browse_activate  (GtkButton     *button,  gpointer         user_data)
48 {
49         GtkRpcBindingDialog *rbd = user_data;
50         GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe, TRUE);
51         if(gtk_dialog_run(GTK_DIALOG(shd)) == GTK_RESPONSE_ACCEPT) {
52                 gtk_entry_set_text(GTK_ENTRY(rbd->entry_host), gtk_select_host_dialog_get_host(GTK_SELECT_HOST_DIALOG(shd)));
53         }
54         
55         gtk_widget_destroy(GTK_WIDGET(shd));
56 }
57
58 static void on_krb5_toggled(GtkToggleButton *togglebutton, GtkRpcBindingDialog *d)
59 {
60         gtk_widget_set_sensitive(d->entry_password, !gtk_toggle_button_get_active(togglebutton));
61 }
62
63 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
64 {
65         GtkWidget *dialog_vbox1;
66         GtkWidget *vbox1;
67         GtkWidget *vbox6;
68         GtkWidget *frame_transport;
69         GtkWidget *label1;
70         GtkWidget *frame_host;
71         GtkWidget *hbox1;
72         GtkWidget *lbl_name;
73         GtkWidget *label2;
74         GtkWidget *frame_security;
75         GtkWidget *vbox2;
76         GtkWidget *label3;
77         GtkWidget *frame_credentials;
78         GtkWidget *table1;
79         GtkWidget *lbl_username;
80         GtkWidget *lbl_password;
81         GtkWidget *btn_browse;
82         GtkWidget *label9;
83         GtkWidget *lbl_credentials;
84         GtkWidget *dialog_action_area1;
85         GtkWidget *btn_cancel;
86         GtkWidget *btn_connect;
87         GSList *transport_smb_group = NULL;
88
89         gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog");
90         
91         gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect");
92
93         dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox;
94         gtk_widget_show (dialog_vbox1);
95
96         vbox1 = gtk_vbox_new (FALSE, 0);
97         gtk_widget_show (vbox1);
98         gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
99
100         frame_transport = gtk_frame_new (NULL);
101         gtk_widget_show (frame_transport);
102         gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
103
104         vbox6 = gtk_vbox_new (FALSE, 0);
105         gtk_widget_show (vbox6);
106         gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
107
108         gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
109         gtk_widget_show (gtk_rpc_binding_dialog->transport_smb);
110         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
111         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
112         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
113         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
114
115         gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
116         gtk_widget_show (gtk_rpc_binding_dialog->transport_tcp_ip);
117         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
118         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
119         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
120
121         label1 = gtk_label_new ("Transport");
122         gtk_widget_show (label1);
123         gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
124
125         frame_host = gtk_frame_new (NULL);
126         gtk_widget_show (frame_host);
127         gtk_box_pack_start (GTK_BOX (vbox1), frame_host, TRUE, TRUE, 0);
128
129         hbox1 = gtk_hbox_new (FALSE, 0);
130         gtk_widget_show (hbox1);
131         gtk_container_add (GTK_CONTAINER (frame_host), hbox1);
132
133         lbl_name = gtk_label_new ("Name");
134         gtk_widget_show (lbl_name);
135         gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
136
137         gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
138         gtk_widget_show (gtk_rpc_binding_dialog->entry_host);
139         gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
140
141         if(gtk_rpc_binding_dialog->sam_pipe)
142         {
143                 btn_browse = gtk_button_new_with_label ("Browse");
144                 gtk_widget_show (btn_browse);
145                 gtk_box_pack_start (GTK_BOX (hbox1), btn_browse, TRUE, TRUE, 0);
146
147                 g_signal_connect ((gpointer) btn_browse, "pressed",
148                                                   G_CALLBACK (on_browse_activate),
149                                                   gtk_rpc_binding_dialog);
150         }
151
152         label2 = gtk_label_new ("Host");
153         gtk_widget_show (label2);
154         gtk_frame_set_label_widget (GTK_FRAME (frame_host), label2);
155
156         frame_security = gtk_frame_new (NULL);
157         gtk_widget_show (frame_security);
158         gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
159
160         vbox2 = gtk_vbox_new (FALSE, 0);
161         gtk_widget_show (vbox2);
162         gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
163
164         gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
165         gtk_widget_show (gtk_rpc_binding_dialog->chk_sign);
166         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
167
168         gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
169         gtk_widget_show (gtk_rpc_binding_dialog->chk_seal);
170         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
171
172         label3 = gtk_label_new ("Security");
173         gtk_widget_show (label3);
174         gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
175
176         frame_credentials = gtk_frame_new (NULL);
177         gtk_widget_show (frame_credentials);
178         gtk_box_pack_start (GTK_BOX (dialog_vbox1), frame_credentials, TRUE, TRUE, 0);
179
180         table1 = gtk_table_new (3, 2, FALSE);
181         gtk_widget_show (table1);
182         gtk_container_add (GTK_CONTAINER (frame_credentials), table1);
183
184         lbl_username = gtk_label_new ("Username:");
185         gtk_widget_show (lbl_username);
186         gtk_table_attach (GTK_TABLE (table1), lbl_username, 0, 1, 0, 1,
187                         (GtkAttachOptions) (GTK_FILL),
188                         (GtkAttachOptions) (0), 0, 0);
189         gtk_misc_set_alignment (GTK_MISC (lbl_username), 0, 0.5);
190
191         lbl_password = gtk_label_new ("Password:");
192         gtk_widget_show (lbl_password);
193         gtk_table_attach (GTK_TABLE (table1), lbl_password, 0, 1, 1, 2,
194                         (GtkAttachOptions) (GTK_FILL),
195                         (GtkAttachOptions) (0), 0, 0);
196         gtk_misc_set_alignment (GTK_MISC (lbl_password), 0, 0.5);
197
198         label9 = gtk_label_new ("");
199         gtk_widget_show (label9);
200         gtk_table_attach (GTK_TABLE (table1), label9, 0, 1, 2, 3,
201                         (GtkAttachOptions) (GTK_FILL),
202                         (GtkAttachOptions) (0), 0, 0);
203         gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
204
205         gtk_rpc_binding_dialog->entry_password = gtk_entry_new ();
206         gtk_entry_set_visibility (GTK_ENTRY (gtk_rpc_binding_dialog->entry_password), FALSE);
207         gtk_widget_show (gtk_rpc_binding_dialog->entry_password);
208         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_password, 1, 2, 1, 2,
209                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
210                         (GtkAttachOptions) (0), 0, 0);
211
212         gtk_rpc_binding_dialog->entry_username = gtk_entry_new ();
213         gtk_widget_show (gtk_rpc_binding_dialog->entry_username);
214         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_username, 1, 2, 0, 1,
215                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
216                         (GtkAttachOptions) (0), 0, 0);
217
218         gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_username), getenv("LOGNAME"));
219
220         gtk_rpc_binding_dialog->krb5_chk_button = gtk_check_button_new_with_mnemonic ("_Use kerberos");
221         gtk_widget_show (gtk_rpc_binding_dialog->krb5_chk_button);
222         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->krb5_chk_button, 1, 2, 2, 3,
223                         (GtkAttachOptions) (GTK_FILL),
224                         (GtkAttachOptions) (0), 0, 0);
225
226     g_signal_connect ((gpointer) gtk_rpc_binding_dialog->krb5_chk_button, "toggled",
227                G_CALLBACK (on_krb5_toggled),
228                gtk_rpc_binding_dialog);
229
230         /* Poor man's autodetection */
231         if(getenv("KRB5CCNAME")) {
232                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->krb5_chk_button), TRUE);
233         }
234
235         lbl_credentials = gtk_label_new ("Credentials");
236         gtk_widget_show (lbl_credentials);
237         gtk_frame_set_label_widget (GTK_FRAME (frame_credentials), lbl_credentials);
238
239         dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area;
240         gtk_widget_show (dialog_action_area1);
241         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
242
243         btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
244         gtk_widget_show (btn_cancel);
245         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
246         GTK_WIDGET_SET_FLAGS (btn_cancel, GTK_CAN_DEFAULT);
247
248         btn_connect = gtk_button_new_with_mnemonic ("_Connect");
249         gtk_widget_show (btn_connect);
250         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
251         gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
252         GTK_WIDGET_SET_FLAGS (btn_connect, GTK_CAN_DEFAULT);
253
254         gtk_widget_grab_focus (btn_connect);
255         gtk_widget_grab_default (btn_connect);
256 }
257
258 GType gtk_rpc_binding_dialog_get_type (void)
259 {
260   static GType mytype = 0;
261
262   if (!mytype)
263     {
264       static const GTypeInfo myinfo =
265       {
266         sizeof (GtkRpcBindingDialogClass),
267         NULL,
268         NULL,
269         NULL,
270         NULL,
271         NULL,
272         sizeof(GtkRpcBindingDialog),
273         0,
274         (GInstanceInitFunc) gtk_rpc_binding_dialog_init,
275       };
276
277       mytype = g_type_register_static (GTK_TYPE_DIALOG, 
278                 "GtkRpcBindingDialog", &myinfo, 0);
279     }
280
281   return mytype;
282 }
283
284 GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials, struct sam_pipe *sam_pipe)
285 {
286         GtkRpcBindingDialog *d = GTK_RPC_BINDING_DIALOG ( gtk_type_new (gtk_rpc_binding_dialog_get_type ()));
287         d->sam_pipe = sam_pipe;
288         return GTK_WIDGET(d);
289 }
290
291 const char *gtk_rpc_binding_dialog_get_username(GtkRpcBindingDialog *d)
292 {
293         return gtk_entry_get_text(GTK_ENTRY(d->entry_username));
294 }
295
296 const char *gtk_rpc_binding_dialog_get_password(GtkRpcBindingDialog *d)
297 {
298         return gtk_entry_get_text(GTK_ENTRY(d->entry_password));
299 }
300
301 const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d)
302 {
303         return gtk_entry_get_text(GTK_ENTRY(d->entry_host));
304 }
305
306 const char *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, const char *pipe_name)
307 {
308         const char *transport;
309         const char *host;
310         char *options = NULL;
311
312         /* Format: TRANSPORT:host:[\pipe\foo,foo,foo] */
313
314         host = gtk_entry_get_text(GTK_ENTRY(d->entry_host));
315         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip)))
316                 transport = "ncacn_tcp";
317         else 
318                 transport = "ncacn_np";
319
320         if(pipe_name != NULL) {
321                 options = talloc_asprintf(d->mem_ctx, "\\pipe\\%s", pipe_name);
322         }
323         
324         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
325                 options = talloc_asprintf_append(options, ",seal");
326         }
327
328         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
329                 options = talloc_asprintf_append(options, ",sign");
330         }
331
332         if(options) {
333                 return talloc_asprintf(d->mem_ctx, "%s:%s:[%s]", transport, host, options);
334         } else {
335                 return talloc_asprintf(d->mem_ctx, "%s:%s", transport, host);
336         }
337 }
338
339 GtkWidget *create_gtk_samba_about_dialog (const char *appname)
340 {
341   GtkWidget *samba_about_dialog;
342   GtkWidget *dialog_vbox1;
343   GtkWidget *label1;
344   GtkWidget *label3;
345   GtkWidget *label2;
346   GtkWidget *dialog_action_area1;
347   GtkWidget *okbutton1;
348
349   samba_about_dialog = gtk_dialog_new ();
350   gtk_window_set_title (GTK_WINDOW (samba_about_dialog), "About");
351
352   dialog_vbox1 = GTK_DIALOG (samba_about_dialog)->vbox;
353   gtk_widget_show (dialog_vbox1);
354
355 /* FIXME image1 = create_pixmap (samba_about_dialog, "slmed.png");
356   gtk_widget_show (image1);
357   gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, TRUE, TRUE, 0);*/
358
359   label1 = gtk_label_new (appname);
360   gtk_widget_show (label1);
361   gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
362
363   label3 = gtk_label_new_with_mnemonic ("Part of Samba <http://www.samba.org/>");
364   gtk_widget_show (label3);
365   gtk_box_pack_start (GTK_BOX (dialog_vbox1), label3, FALSE, FALSE, 0);
366
367   label2 = gtk_label_new ("\302\251 1992-2004 The Samba Team");
368   gtk_widget_show (label2);
369   gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, FALSE, FALSE, 0);
370
371   dialog_action_area1 = GTK_DIALOG (samba_about_dialog)->action_area;
372   gtk_widget_show (dialog_action_area1);
373   gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
374
375   okbutton1 = gtk_button_new_from_stock ("gtk-ok");
376   gtk_widget_show (okbutton1);
377   gtk_dialog_add_action_widget (GTK_DIALOG (samba_about_dialog), okbutton1, GTK_RESPONSE_OK);
378   GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
379
380   return samba_about_dialog;
381 }