2 Unix SMB/CIFS implementation.
3 GTK+ Endpoint Mapper frontend
5 Copyright (C) Jelmer Vernooij 2004
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.
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.
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.
23 #include "dynconfig.h"
24 #include "librpc/gen_ndr/ndr_epmapper.h"
25 #include "gtk/common/select.h"
26 #include "gtk/common/gtk-smb.h"
31 * - Available interfaces
32 * - Per interface: available endpoints
33 * - Per interface auth details
36 static GtkWidget *mainwin;
37 static GtkWidget *entry_binding;
38 static GtkTreeStore *store_eps;
40 static void on_quit1_activate (GtkMenuItem *menuitem, gpointer user_data)
46 static void on_about1_activate (GtkMenuItem *menuitem, gpointer user_data)
48 GtkDialog *aboutwin = GTK_DIALOG(create_gtk_samba_about_dialog("gepdump"));
49 gtk_dialog_run(aboutwin);
50 gtk_widget_destroy(GTK_WIDGET(aboutwin));
53 static const char *get_protocol_name(enum epm_protocols protocol)
56 case EPM_PROTOCOL_UUID: return "UUID";
57 case EPM_PROTOCOL_NCACN: return "NCACN";
58 case EPM_PROTOCOL_NCALRPC: return "NCALRPC";
59 case EPM_PROTOCOL_NCADG: return "NCADG";
60 case EPM_PROTOCOL_IP: return "IP";
61 case EPM_PROTOCOL_TCP: return "TCP";
62 case EPM_PROTOCOL_NETBIOS: return "NetBIOS";
63 case EPM_PROTOCOL_SMB: return "SMB";
64 case EPM_PROTOCOL_PIPE: return "PIPE";
65 case EPM_PROTOCOL_UNIX_DS: return "Unix";
66 default: return "Unknown";
70 static void add_epm_entry(TALLOC_CTX *mem_ctx, const char *annotation, struct epm_tower *t)
72 struct dcerpc_binding bd;
75 GtkTreeIter toweriter;
77 status = dcerpc_binding_from_tower(mem_ctx, t, &bd);
78 if (!NT_STATUS_IS_OK(status)) {
79 gtk_show_ntstatus(mainwin, status);
83 /* Don't show UUID's */
84 ZERO_STRUCT(bd.object);
86 gtk_tree_store_append(store_eps, &toweriter, NULL);
87 gtk_tree_store_set(store_eps, &toweriter, 0, strdup(annotation), 1, strdup(dcerpc_binding_string(mem_ctx, &bd)), -1);
89 for (i = 0; i < t->num_floors; i++) {
92 gtk_tree_store_append(store_eps, &iter, &toweriter);
94 if (t->floors[i].lhs.protocol == EPM_PROTOCOL_UUID) {
95 data = GUID_string(mem_ctx, &t->floors[i].lhs.info.uuid.uuid);
97 data = dcerpc_floor_get_rhs_data(mem_ctx, &t->floors[i]);
100 gtk_tree_store_set(store_eps, &iter, 0, get_protocol_name(t->floors[i].lhs.protocol), 1, data, -1);
104 static void on_dump_clicked (GtkButton *btn, gpointer user_data)
109 struct rpc_if_id_t iface;
110 struct policy_handle handle;
111 struct dcerpc_pipe *p;
112 TALLOC_CTX *mem_ctx = talloc_init("dump");
114 status = dcerpc_pipe_connect(&p, gtk_entry_get_text(GTK_ENTRY(entry_binding)), DCERPC_EPMAPPER_UUID, DCERPC_EPMAPPER_VERSION, lp_workgroup(), "", "");
116 if (NT_STATUS_IS_ERR(status)) {
117 gtk_show_ntstatus(mainwin, status);
118 talloc_destroy(mem_ctx);
126 r.in.inquiry_type = 0;
128 r.in.interface_id = &iface;
129 r.in.vers_option = 0;
130 r.in.entry_handle = &handle;
131 r.out.entry_handle = &handle;
134 gtk_tree_store_clear(store_eps);
138 status = dcerpc_epm_Lookup(p, mem_ctx, &r);
139 if (!NT_STATUS_IS_OK(status) || r.out.result != 0) {
142 for (i=0;i<r.out.num_ents;i++) {
143 add_epm_entry(mem_ctx, r.out.entries[i].annotation, &r.out.entries[i].tower->tower);
145 } while (NT_STATUS_IS_OK(status) &&
147 r.out.num_ents == r.in.max_ents);
149 if (!NT_STATUS_IS_OK(status)) {
150 gtk_show_ntstatus(mainwin, status);
151 talloc_destroy(mem_ctx);
154 talloc_destroy(mem_ctx);
157 static void on_select_target_clicked(GtkButton *btn, gpointer user_data)
159 GtkRpcBindingDialog *d;
161 struct dcerpc_binding *bd;
164 d = GTK_RPC_BINDING_DIALOG(gtk_rpc_binding_dialog_new(TRUE, NULL));
165 result = gtk_dialog_run(GTK_DIALOG(d));
167 case GTK_RESPONSE_ACCEPT:
170 gtk_widget_destroy(GTK_WIDGET(d));
174 mem_ctx = talloc_init("select_target");
175 bd = gtk_rpc_binding_dialog_get_binding (d, mem_ctx),
176 gtk_entry_set_text(GTK_ENTRY(entry_binding), dcerpc_binding_string(mem_ctx, bd));
177 talloc_destroy(mem_ctx);
178 gtk_widget_destroy(GTK_WIDGET(d));
181 static GtkWidget* create_mainwindow (void)
183 GtkWidget *mainwindow;
187 GtkWidget *menuitem1;
188 GtkWidget *menuitem1_menu;
190 GtkWidget *menuitem4;
191 GtkWidget *menuitem4_menu;
193 GtkWidget *handlebox1;
197 GtkWidget *btn_select_target;
199 GtkWidget *scrolledwindow1;
202 GtkTreeViewColumn *curcol;
203 GtkCellRenderer *renderer;
204 GtkWidget *statusbar;
205 GtkAccelGroup *accel_group;
207 accel_group = gtk_accel_group_new ();
209 mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
210 gtk_window_set_title (GTK_WINDOW (mainwindow), "Gtk+ Endpoint Mapper Viewer");
212 vbox1 = gtk_vbox_new (FALSE, 0);
213 gtk_widget_show (vbox1);
214 gtk_container_add (GTK_CONTAINER (mainwindow), vbox1);
216 menubar1 = gtk_menu_bar_new ();
217 gtk_widget_show (menubar1);
218 gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
220 menuitem1 = gtk_menu_item_new_with_mnemonic ("_File");
221 gtk_widget_show (menuitem1);
222 gtk_container_add (GTK_CONTAINER (menubar1), menuitem1);
224 menuitem1_menu = gtk_menu_new ();
225 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1), menuitem1_menu);
227 quit1 = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
228 gtk_container_add (GTK_CONTAINER (menuitem1_menu), quit1);
230 menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help");
231 gtk_container_add (GTK_CONTAINER (menubar1), menuitem4);
233 menuitem4_menu = gtk_menu_new ();
234 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu);
236 about1 = gtk_menu_item_new_with_mnemonic ("_About");
237 gtk_container_add (GTK_CONTAINER (menuitem4_menu), about1);
239 handlebox1 = gtk_handle_box_new ();
240 gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0);
242 hbox1 = gtk_hbox_new (FALSE, 0);
243 gtk_container_add (GTK_CONTAINER (handlebox1), hbox1);
245 label1 = gtk_label_new ("Location:");
246 gtk_box_pack_start (GTK_BOX (hbox1), label1, FALSE, FALSE, 0);
248 entry_binding = gtk_entry_new ();
249 gtk_entry_set_text(GTK_ENTRY(entry_binding), "ncalrpc:");
250 gtk_box_pack_start (GTK_BOX (hbox1), entry_binding, FALSE, FALSE, 0);
252 btn_select_target = gtk_button_new_with_mnemonic ("_Select Target");
253 gtk_box_pack_start (GTK_BOX (hbox1), btn_select_target, FALSE, FALSE, 0);
255 btn_dump = gtk_button_new_with_mnemonic ("_Dump");
256 gtk_box_pack_start (GTK_BOX (hbox1), btn_dump, FALSE, FALSE, 0);
258 hbox2 = gtk_hbox_new (FALSE, 0);
259 gtk_container_add (GTK_CONTAINER (vbox1), hbox2);
261 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
262 gtk_box_pack_start (GTK_BOX(hbox2), scrolledwindow1, TRUE, TRUE, 0);
264 tree_eps = gtk_tree_view_new ();
266 curcol = gtk_tree_view_column_new ();
267 gtk_tree_view_column_set_title(curcol, "Name");
268 renderer = gtk_cell_renderer_text_new();
269 gtk_tree_view_column_pack_start(curcol, renderer, True);
271 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
272 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 0);
274 curcol = gtk_tree_view_column_new ();
275 gtk_tree_view_column_set_title(curcol, "Binding String");
276 renderer = gtk_cell_renderer_text_new();
277 gtk_tree_view_column_pack_start(curcol, renderer, True);
278 gtk_tree_view_column_add_attribute(curcol, renderer, "text", 1);
281 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_eps), curcol);
283 store_eps = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
284 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_eps), GTK_TREE_MODEL(store_eps));
285 g_object_unref(store_eps);
287 gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree_eps);
289 vbox2 = gtk_vbox_new (FALSE, 0);
290 gtk_container_add (GTK_CONTAINER (hbox2), vbox2);
292 frame1 = gtk_frame_new("Interface");
293 gtk_container_add (GTK_CONTAINER(vbox2), frame1);
295 frame1 = gtk_frame_new("Statistics");
296 gtk_container_add (GTK_CONTAINER(vbox2), frame1);
298 frame1 = gtk_frame_new("Authentication");
299 gtk_container_add (GTK_CONTAINER(vbox2), frame1);
301 statusbar = gtk_statusbar_new ();
302 gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
304 g_signal_connect ((gpointer) quit1, "activate",
305 G_CALLBACK (on_quit1_activate),
307 g_signal_connect ((gpointer) about1, "activate",
308 G_CALLBACK (on_about1_activate),
310 g_signal_connect ((gpointer) btn_select_target, "clicked",
311 G_CALLBACK (on_select_target_clicked),
313 g_signal_connect ((gpointer) btn_dump, "clicked",
314 G_CALLBACK (on_dump_clicked),
317 gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
323 int main(int argc, char **argv)
325 gtk_init(&argc, &argv);
326 lp_load(dyn_CONFIGFILE,True,False,False);
328 setup_logging("gepdump", True);
329 mainwin = create_mainwindow();
330 gtk_widget_show_all(mainwin);