r3213: Make credentials in a binding dialog optional
[samba.git] / source4 / gtk / tools / gepdump.c
1 /* 
2    Unix SMB/CIFS implementation.
3    GTK+ Endpoint Mapper frontend
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/common/gtk-smb.h"
24
25 static GtkWidget *mainwin;
26 static GtkWidget *entry_binding;
27 static GtkTreeStore *store_eps;
28
29 static void on_quit1_activate (GtkMenuItem *menuitem, gpointer user_data)
30 {
31         gtk_main_quit();
32 }
33
34
35 static void on_about1_activate (GtkMenuItem *menuitem, gpointer user_data)
36 {
37         GtkDialog *aboutwin = GTK_DIALOG(create_gtk_samba_about_dialog("gepdump"));
38         gtk_dialog_run(aboutwin);
39         gtk_widget_destroy(GTK_WIDGET(aboutwin));
40 }
41
42 static const char *get_protocol_name(enum epm_protocols protocol)
43 {
44         switch (protocol) {
45         case EPM_PROTOCOL_UUID: return "UUID";
46         case EPM_PROTOCOL_NCACN: return "NCACN";
47         case EPM_PROTOCOL_NCALRPC: return "NCALRPC";
48         case EPM_PROTOCOL_NCADG: return "NCADG";
49         case EPM_PROTOCOL_IP: return "IP";
50         case EPM_PROTOCOL_TCP: return "TCP";
51         case EPM_PROTOCOL_NETBIOS: return "NetBIOS";
52         case EPM_PROTOCOL_SMB: return "SMB";
53         case EPM_PROTOCOL_PIPE: return "PIPE";
54         case EPM_PROTOCOL_UNIX_DS: return "Unix";
55         default: return "Unknown";
56         }
57 }
58
59 static void add_epm_entry(TALLOC_CTX *mem_ctx, const char *annotation, struct epm_tower *t)
60 {
61         struct dcerpc_binding bd;
62         int i;
63         NTSTATUS status;
64         GtkTreeIter toweriter;
65
66         status = dcerpc_binding_from_tower(mem_ctx, t, &bd);
67         if (!NT_STATUS_IS_OK(status)) {
68                 gtk_show_ntstatus(mainwin, status);
69                 return;
70         }
71         
72         /* Don't show UUID's */
73         ZERO_STRUCT(bd.object);
74
75         gtk_tree_store_append(store_eps, &toweriter, NULL);
76         gtk_tree_store_set(store_eps, &toweriter, 0, strdup(annotation), 1, strdup(dcerpc_binding_string(mem_ctx, &bd)), -1);
77
78         for (i = 0; i < t->num_floors; i++) {
79                 const char *data;
80                 GtkTreeIter iter;
81                 gtk_tree_store_append(store_eps, &iter, &toweriter);
82
83                 if (t->floors[i].lhs.protocol == EPM_PROTOCOL_UUID) {
84                         data = GUID_string(mem_ctx, &t->floors[i].lhs.info.uuid.uuid);
85                 } else {
86                         data = dcerpc_floor_get_rhs_data(mem_ctx, &t->floors[i]);
87                 }
88                 
89                 gtk_tree_store_set(store_eps, &iter, 0, get_protocol_name(t->floors[i].lhs.protocol), 1, data, -1);
90         }
91 }
92
93 static void on_dump_clicked (GtkButton *btn, gpointer user_data)
94 {
95         NTSTATUS status;
96         struct epm_Lookup r;
97         struct GUID uuid;
98         struct rpc_if_id_t iface;
99         struct policy_handle handle;
100         struct dcerpc_pipe *p;
101         TALLOC_CTX *mem_ctx = talloc_init("dump");
102
103         status = dcerpc_pipe_connect(&p, gtk_entry_get_text(GTK_ENTRY(entry_binding)), DCERPC_EPMAPPER_UUID, DCERPC_EPMAPPER_VERSION, lp_workgroup(), NULL, NULL);
104
105         if (NT_STATUS_IS_ERR(status)) {
106                 gtk_show_ntstatus(mainwin, status);
107                 talloc_destroy(mem_ctx);
108                 return;
109         }
110
111         ZERO_STRUCT(uuid);
112         ZERO_STRUCT(iface);
113         ZERO_STRUCT(handle);
114
115         r.in.inquiry_type = 0;
116         r.in.object = &uuid;
117         r.in.interface_id = &iface;
118         r.in.vers_option = 0;
119         r.in.entry_handle = &handle;
120         r.out.entry_handle = &handle;
121         r.in.max_ents = 10;
122
123         gtk_tree_store_clear(store_eps);
124
125         do {
126                 int i;
127                 status = dcerpc_epm_Lookup(p, mem_ctx, &r);
128                 if (!NT_STATUS_IS_OK(status) || r.out.result != 0) {
129                         break;
130                 }
131                 for (i=0;i<r.out.num_ents;i++) {
132                         add_epm_entry(mem_ctx, r.out.entries[i].annotation, &r.out.entries[i].tower->tower);
133                 }
134         } while (NT_STATUS_IS_OK(status) && 
135                  r.out.result == 0 && 
136                  r.out.num_ents == r.in.max_ents);
137
138         if (!NT_STATUS_IS_OK(status)) {
139                 gtk_show_ntstatus(mainwin, status);
140                 talloc_destroy(mem_ctx);
141                 return;
142         }
143         talloc_destroy(mem_ctx);
144 }
145
146 static void on_select_target_clicked(GtkButton *btn, gpointer         user_data)
147 {
148         GtkRpcBindingDialog *d;
149         TALLOC_CTX *mem_ctx;
150         struct dcerpc_binding *bd;
151         gint result;
152
153         d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(TRUE, NULL));
154         result = gtk_dialog_run(GTK_DIALOG(d));
155         switch(result) {
156         case GTK_RESPONSE_ACCEPT:
157                 break;
158         default:
159                 gtk_widget_destroy(GTK_WIDGET(d));
160                 return;
161         }
162
163         mem_ctx = talloc_init("select_target");
164         bd = gtk_rpc_binding_dialog_get_binding (d, mem_ctx),
165         gtk_entry_set_text(GTK_ENTRY(entry_binding), dcerpc_binding_string(mem_ctx, bd));
166         talloc_destroy(mem_ctx);
167         gtk_widget_destroy(GTK_WIDGET(d));
168 }
169
170 static GtkWidget* create_mainwindow (void)
171 {
172   GtkWidget *mainwindow;
173   GtkWidget *vbox1;
174   GtkWidget *menubar1;
175   GtkWidget *menuitem1;
176   GtkWidget *menuitem1_menu;
177   GtkWidget *quit1;
178   GtkWidget *menuitem4;
179   GtkWidget *menuitem4_menu;
180   GtkWidget *about1;
181   GtkWidget *handlebox1;
182   GtkWidget *hbox1;
183   GtkWidget *label1;
184   GtkWidget *btn_select_target;
185   GtkWidget *btn_dump;
186   GtkWidget *scrolledwindow1;
187   GtkWidget *tree_eps;
188   GtkTreeViewColumn *curcol;
189   GtkCellRenderer *renderer;
190   GtkWidget *statusbar;
191   GtkAccelGroup *accel_group;
192
193   accel_group = gtk_accel_group_new ();
194
195   mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
196   gtk_window_set_title (GTK_WINDOW (mainwindow), "Gtk+ Endpoint Mapper Viewer");
197
198   vbox1 = gtk_vbox_new (FALSE, 0);
199   gtk_widget_show (vbox1);
200   gtk_container_add (GTK_CONTAINER (mainwindow), vbox1);
201
202   menubar1 = gtk_menu_bar_new ();
203   gtk_widget_show (menubar1);
204   gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
205
206   menuitem1 = gtk_menu_item_new_with_mnemonic ("_File");
207   gtk_widget_show (menuitem1);
208   gtk_container_add (GTK_CONTAINER (menubar1), menuitem1);
209
210   menuitem1_menu = gtk_menu_new ();
211   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1), menuitem1_menu);
212
213   quit1 = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
214   gtk_widget_show (quit1);
215   gtk_container_add (GTK_CONTAINER (menuitem1_menu), quit1);
216
217   menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help");
218   gtk_widget_show (menuitem4);
219   gtk_container_add (GTK_CONTAINER (menubar1), menuitem4);
220
221   menuitem4_menu = gtk_menu_new ();
222   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu);
223
224   about1 = gtk_menu_item_new_with_mnemonic ("_About");
225   gtk_widget_show (about1);
226   gtk_container_add (GTK_CONTAINER (menuitem4_menu), about1);
227
228   handlebox1 = gtk_handle_box_new ();
229   gtk_widget_show (handlebox1);
230   gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0);
231
232   hbox1 = gtk_hbox_new (FALSE, 0);
233   gtk_widget_show (hbox1);
234   gtk_container_add (GTK_CONTAINER (handlebox1), hbox1);
235
236   label1 = gtk_label_new ("Location:");
237   gtk_widget_show (label1);
238   gtk_box_pack_start (GTK_BOX (hbox1), label1, FALSE, FALSE, 0);
239
240   entry_binding = gtk_entry_new ();
241   gtk_entry_set_text(GTK_ENTRY(entry_binding), "ncalrpc:");
242   gtk_widget_show (entry_binding);
243   gtk_box_pack_start (GTK_BOX (hbox1), entry_binding, FALSE, FALSE, 0);
244
245   btn_select_target = gtk_button_new_with_mnemonic ("_Select Target");
246   gtk_widget_show (btn_select_target);
247   gtk_box_pack_start (GTK_BOX (hbox1), btn_select_target, FALSE, FALSE, 0);
248
249   btn_dump = gtk_button_new_with_mnemonic ("_Dump");
250   gtk_widget_show (btn_dump);
251   gtk_box_pack_start (GTK_BOX (hbox1), btn_dump, FALSE, FALSE, 0);
252
253   scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
254   gtk_widget_show (scrolledwindow1);
255   gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
256
257   tree_eps = gtk_tree_view_new ();
258
259   curcol = gtk_tree_view_column_new ();
260   gtk_tree_view_column_set_title(curcol, "Name");
261   renderer = gtk_cell_renderer_text_new();
262   gtk_tree_view_column_pack_start(curcol, renderer, True);
263
264   gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
265   gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
266
267   curcol = gtk_tree_view_column_new ();
268   gtk_tree_view_column_set_title(curcol, "Binding String");
269   renderer = gtk_cell_renderer_text_new();
270   gtk_tree_view_column_pack_start(curcol, renderer, True);
271   gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1);
272
273
274   gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
275
276   store_eps = gtk_tree_store_new(2, GTK_TYPE_STRING, GTK_TYPE_STRING);
277   gtk_tree_view_set_model(GTK_TREE_VIEW(tree_eps), GTK_TREE_MODEL(store_eps));
278   g_object_unref(store_eps);
279   
280   gtk_widget_show (tree_eps);
281   gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_eps);
282
283   statusbar = gtk_statusbar_new ();
284   gtk_widget_show (statusbar);
285   gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
286
287   g_signal_connect ((gpointer) quit1, "activate",
288                     G_CALLBACK (on_quit1_activate),
289                     NULL);
290   g_signal_connect ((gpointer) about1, "activate",
291                     G_CALLBACK (on_about1_activate),
292                     NULL);
293   g_signal_connect ((gpointer) btn_select_target, "clicked",
294                     G_CALLBACK (on_select_target_clicked),
295                     NULL);
296   g_signal_connect ((gpointer) btn_dump, "clicked",
297                     G_CALLBACK (on_dump_clicked),
298                     NULL);
299
300   gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
301
302   return mainwindow;
303 }
304
305
306  int main(int argc, char **argv)
307 {
308         gtk_init(&argc, &argv);
309         mainwin = create_mainwindow();
310         gtk_widget_show(mainwin);
311         gtk_main();
312         return 0;
313 }