Move gepdump to bin/
[samba-gtk.git] / 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 3 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 #ifndef _GNU_SOURCE
23 #define _GNU_SOURCE
24 #endif
25 #include <stdint.h>
26 #include <stdbool.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <samba/version.h>
30 #include "common/gtk-smb.h"
31 #include "common/select.h"
32 #include <dcerpc.h>
33 #include <credentials.h>
34 #include <charset.h>
35
36 /** 
37  * Dialog error showing a WERROR
38  */
39 void gtk_show_werror(GtkWidget *win, const char *message, WERROR err) 
40 {
41         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
42                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
43                                                     GTK_MESSAGE_ERROR,
44                                                     GTK_BUTTONS_CLOSE,
45                                                     "%s: %s\n", message?message: "Windows error",
46                                                     win_errstr(err));
47         gtk_dialog_run (GTK_DIALOG (dialog));
48         gtk_widget_destroy (dialog);
49 }
50                    
51 /** 
52  * GTK+ dialog showing a NTSTATUS error
53  */
54 void gtk_show_ntstatus(GtkWidget *win, const char *message, NTSTATUS status) 
55 {
56         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
57                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
58                                                     GTK_MESSAGE_ERROR,
59                                                     GTK_BUTTONS_CLOSE,
60                                                     "%s: %s\n", message?message:"Windows error",
61                                                     nt_errstr(status));
62         gtk_dialog_run (GTK_DIALOG (dialog));
63         gtk_widget_destroy (dialog);
64 }
65
66 static void on_browse_activate (GtkButton *button, gpointer user_data)
67 {
68         GtkRpcBindingDialog *rbd = user_data;
69         GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe);
70         if(gtk_dialog_run(GTK_DIALOG(shd)) == GTK_RESPONSE_ACCEPT) {
71                 gtk_entry_set_text(GTK_ENTRY(rbd->entry_host), gtk_select_host_dialog_get_host(GTK_SELECT_HOST_DIALOG(shd)));
72         }
73         
74         gtk_widget_destroy(GTK_WIDGET(shd));
75 }
76
77 static void on_ncalrpc_toggled(GtkToggleButton *tb, GtkRpcBindingDialog *d)
78 {
79         gtk_widget_set_sensitive(d->frame_host, !gtk_toggle_button_get_active(tb));
80 }
81
82 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
83 {
84         GtkWidget *dialog_vbox1;
85         GtkWidget *vbox1;
86         GtkWidget *vbox6;
87         GtkWidget *frame_transport;
88         GtkWidget *label1;
89         GtkWidget *hbox1;
90         GtkWidget *lbl_name;
91         GtkWidget *label2;
92         GtkWidget *label3;
93         GtkWidget *frame_security;
94         GtkWidget *vbox2;
95         GtkWidget *btn_browse;
96         GtkWidget *dialog_action_area1;
97         GtkWidget *btn_cancel;
98         GtkWidget *btn_connect;
99         GSList *transport_smb_group = NULL;
100
101         gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog");
102
103         gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect");
104
105         dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox;
106
107         vbox1 = gtk_vbox_new (FALSE, 0);
108         gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
109
110         frame_transport = gtk_frame_new (NULL);
111         gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
112
113         vbox6 = gtk_vbox_new (FALSE, 0);
114         gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
115
116         gtk_rpc_binding_dialog->transport_ncalrpc = gtk_radio_button_new_with_mnemonic (NULL, "Local Host");
117         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_ncalrpc, FALSE, FALSE, 0);
118         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc), transport_smb_group);
119         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc));
120
121
122         gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
123         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
124         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
125         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
126         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
127
128         gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
129         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
130         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
131         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
132
133         label1 = gtk_label_new ("Transport");
134         gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
135
136         gtk_rpc_binding_dialog->frame_host = gtk_frame_new (NULL);
137         gtk_box_pack_start (GTK_BOX (vbox1), gtk_rpc_binding_dialog->frame_host, TRUE, TRUE, 0);
138
139         hbox1 = gtk_hbox_new (FALSE, 0);
140         gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_host), hbox1);
141
142         lbl_name = gtk_label_new ("Name");
143         gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
144
145         gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
146         gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
147
148         if(gtk_rpc_binding_dialog->sam_pipe)
149         {
150                 btn_browse = gtk_button_new_with_label ("Browse");
151                 gtk_box_pack_start (GTK_BOX (hbox1), btn_browse, TRUE, TRUE, 0);
152
153                 g_signal_connect ((gpointer) btn_browse, "pressed",
154                                                   G_CALLBACK (on_browse_activate),
155                                                   gtk_rpc_binding_dialog);
156         }
157
158         label2 = gtk_label_new ("Host");
159         gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_host), label2);
160
161         frame_security = gtk_frame_new (NULL);
162
163         label3 = gtk_label_new ("Security");
164         gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
165
166         gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
167
168         vbox2 = gtk_vbox_new (FALSE, 0);
169         gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
170
171         gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
172         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
173
174         gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
175         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
176
177         dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area;
178         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
179
180         btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
181         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
182         gtk_widget_set_can_default(btn_cancel, TRUE);
183
184         btn_connect = gtk_button_new_with_mnemonic ("C_onnect");
185         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
186         gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
187         gtk_widget_set_can_default(btn_connect, TRUE);
188
189         g_signal_connect ((gpointer) gtk_rpc_binding_dialog->transport_ncalrpc, "toggled",
190                                                   G_CALLBACK (on_ncalrpc_toggled),
191                                                   gtk_rpc_binding_dialog);
192
193
194         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->transport_ncalrpc), TRUE);
195         gtk_widget_show_all(dialog_vbox1);
196
197         gtk_widget_grab_focus (btn_connect);
198         gtk_widget_grab_default (btn_connect);
199 }
200
201 GType gtk_rpc_binding_dialog_get_type (void)
202 {
203   static GType mytype = 0;
204
205   if (!mytype)
206     {
207       static const GTypeInfo myinfo =
208       {
209         sizeof (GtkRpcBindingDialogClass),
210         NULL,
211         NULL,
212         NULL,
213         NULL,
214         NULL,
215         sizeof(GtkRpcBindingDialog),
216         0,
217         (GInstanceInitFunc) gtk_rpc_binding_dialog_init,
218       };
219
220       mytype = g_type_register_static (GTK_TYPE_DIALOG, 
221                 "GtkRpcBindingDialog", &myinfo, 0);
222     }
223
224   return mytype;
225 }
226
227 /**
228  * Create a new GTK+ dialog asking for binding information for 
229  * DCE/RPC
230  *
231  * Optionally gets a sam pipe that will be used to look up users
232  */
233 GtkWidget *gtk_rpc_binding_dialog_new (struct dcerpc_binding_handle *sam_pipe)
234 {
235         GtkRpcBindingDialog *d = SAMBAGTK_RPC_BINDING_DIALOG ( g_object_new (gtk_rpc_binding_dialog_get_type (), NULL));
236         d->sam_pipe = sam_pipe;
237         return GTK_WIDGET(d);
238 }
239
240 const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d)
241 {
242         return gtk_entry_get_text(GTK_ENTRY(d->entry_host));
243 }
244
245 struct dcerpc_binding *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
246 {
247         struct dcerpc_binding *binding = talloc(mem_ctx, struct dcerpc_binding);
248
249         ZERO_STRUCT(binding->object);
250
251         /* Format: TRANSPORT:host[\pipe\foo,foo,foo] */
252
253         binding->host = talloc_strdup(mem_ctx, gtk_entry_get_text(GTK_ENTRY(d->entry_host)));
254         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip))) {
255                 binding->transport = NCACN_IP_TCP;
256         } else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_ncalrpc))) {
257                 binding->transport = NCALRPC;
258                 binding->host = NULL;
259         } else {
260                 binding->transport = NCACN_NP;
261         }
262
263         binding->options = NULL;
264         binding->flags = 0;
265         binding->endpoint = NULL;
266
267         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
268                 binding->flags |= DCERPC_SEAL;
269         }
270
271         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
272                 binding->flags |= DCERPC_SIGN;
273         }
274
275         return binding;
276 }
277
278 const char *gtk_rpc_binding_dialog_get_binding_string(GtkRpcBindingDialog *d)
279 {
280         char *talloc_ret;
281         char *ret;
282         TALLOC_CTX *mem_ctx = talloc_new(NULL);
283         talloc_ret = dcerpc_binding_string(mem_ctx, gtk_rpc_binding_dialog_get_binding(d, mem_ctx));
284         ret = g_strdup(talloc_ret);
285         talloc_free(mem_ctx);
286         return ret;
287 }
288
289 GtkWidget *create_gtk_samba_about_dialog (const char *appname)
290 {
291         GtkWidget *samba_about_dialog;
292         GtkWidget *dialog_vbox1;
293         GtkWidget *label1;
294         GtkWidget *label2;
295         GtkWidget *label3;
296         GtkWidget *label4;
297         GtkWidget *dialog_action_area1;
298         GtkWidget *okbutton1;
299
300         samba_about_dialog = gtk_dialog_new ();
301         gtk_window_set_title (GTK_WINDOW (samba_about_dialog), "About");
302
303         dialog_vbox1 = GTK_DIALOG (samba_about_dialog)->vbox;
304
305         /* FIXME image1 = create_pixmap (samba_about_dialog, "slmed.png");
306            gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, TRUE, TRUE, 0);*/
307
308         label1 = gtk_label_new (appname);
309         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
310
311         label2 = gtk_label_new (SAMBA_VERSION_STRING);
312         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, FALSE, FALSE, 0);
313
314         label3 = gtk_label_new_with_mnemonic ("Part of Samba-GTK <http://wiki.samba.org/index.php/SambaGtk>");
315         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label3, FALSE, FALSE, 0);
316
317         label4 = gtk_label_new ("\302\251 2004-2007 Jelmer Vernooij");
318         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label4, FALSE, FALSE, 0);
319
320         dialog_action_area1 = GTK_DIALOG (samba_about_dialog)->action_area;
321         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
322
323         okbutton1 = gtk_button_new_from_stock ("gtk-ok");
324         gtk_dialog_add_action_widget (GTK_DIALOG (samba_about_dialog), okbutton1, GTK_RESPONSE_OK);
325         gtk_widget_set_can_default(okbutton1, TRUE);
326         gtk_widget_show_all(dialog_vbox1);
327
328         return samba_about_dialog;
329 }