2 Unix SMB/CIFS implementation.
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 "librpc/gen_ndr/ndr_samr_c.h"
24 #include "gtk/common/select.h"
25 #include "gtk/common/gtk-smb.h"
26 #include "auth/credentials/credentials.h"
28 struct policy_handle sam_handle
;
29 struct dcerpc_pipe
*sam_pipe
= NULL
;
30 static struct policy_handle domain_handle
;
33 GtkListStore
*store_users
;
34 GtkListStore
*store_groups
;
35 static GtkWidget
*mnu_disconnect
;
37 static void update_grouplist(void)
43 static void update_userlist(void)
46 struct samr_EnumDomainUsers r
;
47 uint32_t resume_handle
=0;
53 gtk_list_store_clear(store_users
);
55 mem_ctx
= talloc_init("update_userlist");
56 r
.in
.domain_handle
= &domain_handle
;
57 r
.in
.resume_handle
= &resume_handle
;
59 r
.in
.max_size
= (uint32_t)100;
60 r
.out
.resume_handle
= &resume_handle
;
62 status
= dcerpc_samr_EnumDomainUsers(sam_pipe
, mem_ctx
, &r
);
63 if (!NT_STATUS_IS_OK(status
)) {
64 gtk_show_ntstatus(mainwin
, "While enumerating domain users", status
);
69 if (!r
.out
.sam
|| r
.out
.sam
->count
== 0) {
74 for (i
=0;i
<r
.out
.sam
->count
;i
++) {
76 gtk_list_store_append(store_users
, &iter
);
77 gtk_list_store_set (store_users
, &iter
,
78 0, r
.out
.sam
->entries
[i
].name
.string
,
79 1, r
.out
.sam
->entries
[i
].name
.string
,
82 /* FIXME: Query user info */
84 // if (!test_OpenUser(sam_pipe, mem_ctx, &sam_handle, r.out.sam->entries[i].idx)) {
91 static void on_new1_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
96 static void on_select_domain_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
98 GtkSelectDomainDialog
*d
;
100 d
= GTK_SELECT_DOMAIN_DIALOG(gtk_select_domain_dialog_new(sam_pipe
));
101 result
= gtk_dialog_run(GTK_DIALOG(d
));
103 case GTK_RESPONSE_OK
:
106 gtk_widget_destroy(GTK_WIDGET(d
));
109 domain_handle
= gtk_select_domain_dialog_get_handle(d
);
114 gtk_widget_destroy(GTK_WIDGET(d
));
117 static void connect_sam(void)
119 struct samr_Connect r
;
123 mem_ctx
= talloc_init("gwsam_connect");
125 sam_pipe
= gtk_connect_rpc_interface(talloc_autofree_context(), &dcerpc_table_samr
);
130 r
.in
.system_name
= 0;
131 r
.in
.access_mask
= SEC_FLAG_MAXIMUM_ALLOWED
;
132 r
.out
.connect_handle
= &sam_handle
;
134 status
= dcerpc_samr_Connect(sam_pipe
, mem_ctx
, &r
);
135 if (!NT_STATUS_IS_OK(status
)) {
136 gtk_show_ntstatus(mainwin
, "While running connect on SAMR", status
);
138 talloc_free(mem_ctx
);
142 gtk_widget_set_sensitive (seldomain
, TRUE
);
143 gtk_widget_set_sensitive (mnu_disconnect
, TRUE
);
145 sam_pipe
= talloc_reference(talloc_autofree_context(), sam_pipe
);
146 talloc_free(mem_ctx
);
149 static void on_connect_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
152 /* FIXME: Connect to default domain */
155 static void on_disconnect_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
157 gtk_widget_set_sensitive (mnu_disconnect
, FALSE
);
160 static void on_quit_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
162 talloc_free(sam_pipe
);
167 static void on_account_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
173 static void on_user_rights_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
179 static void on_audit_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
185 static void on_trust_relations_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
191 static void on_refresh_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
198 static void on_about_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
200 GtkDialog
*aboutwin
= GTK_DIALOG(create_gtk_samba_about_dialog("gwsam"));
201 gtk_dialog_run(aboutwin
);
202 gtk_widget_destroy(GTK_WIDGET(aboutwin
));
205 static GtkWidget
* create_mainwindow (void)
208 GtkWidget
*mnu_connect
;
210 GtkWidget
*menuitem1
;
211 GtkWidget
*menuitem1_menu
;
213 GtkWidget
*separatormenuitem1
;
215 GtkCellRenderer
*renderer
;
216 GtkTreeViewColumn
*curcol
;
218 GtkWidget
*policies_menu
;
220 GtkWidget
*user_rights
;
222 GtkWidget
*separator1
;
223 GtkWidget
*trust_relations
;
224 GtkWidget
*menuitem3
;
225 GtkWidget
*menuitem3_menu
;
227 GtkWidget
*menuitem4
;
228 GtkWidget
*menuitem4_menu
;
231 GtkWidget
*scrolledwindow1
;
232 GtkWidget
*user_list
;
233 GtkWidget
*scrolledwindow2
;
234 GtkWidget
*group_list
;
235 GtkWidget
*statusbar
;
236 GtkAccelGroup
*accel_group
;
238 accel_group
= gtk_accel_group_new ();
240 mainwin
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
241 gtk_window_set_default_size (GTK_WINDOW (mainwin
), 642, 562);
242 gtk_window_set_title (GTK_WINDOW (mainwin
), "User Manager");
244 vbox1
= gtk_vbox_new (FALSE
, 0);
245 gtk_container_add (GTK_CONTAINER (mainwin
), vbox1
);
247 menubar
= gtk_menu_bar_new ();
248 gtk_box_pack_start (GTK_BOX (vbox1
), menubar
, FALSE
, FALSE
, 0);
250 menuitem1
= gtk_menu_item_new_with_mnemonic ("_File");
251 gtk_container_add (GTK_CONTAINER (menubar
), menuitem1
);
253 menuitem1_menu
= gtk_menu_new ();
254 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1
), menuitem1_menu
);
256 mnu_connect
= gtk_menu_item_new_with_mnemonic ("_Connect");
257 gtk_container_add (GTK_CONTAINER (menuitem1_menu
), mnu_connect
);
259 mnu_disconnect
= gtk_menu_item_new_with_mnemonic ("_Disconnect");
260 gtk_widget_set_sensitive (mnu_disconnect
, FALSE
);
261 gtk_container_add (GTK_CONTAINER (menuitem1_menu
), mnu_disconnect
);
263 seldomain
= gtk_menu_item_new_with_mnemonic("_Select Domain");
264 gtk_widget_set_sensitive (seldomain
, FALSE
);
265 gtk_container_add (GTK_CONTAINER (menuitem1_menu
), seldomain
);
267 separatormenuitem1
= gtk_separator_menu_item_new ();
268 gtk_container_add (GTK_CONTAINER (menuitem1_menu
), separatormenuitem1
);
269 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
271 quit
= gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group
);
272 gtk_container_add (GTK_CONTAINER (menuitem1_menu
), quit
);
274 menuitem1
= gtk_menu_item_new_with_mnemonic ("_User");
275 gtk_container_add (GTK_CONTAINER (menubar
), menuitem1
);
276 gtk_widget_set_sensitive (menuitem1
, FALSE
);
278 menuitem1_menu
= gtk_menu_new ();
279 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1
), menuitem1_menu
);
281 new1
= gtk_image_menu_item_new_from_stock ("gtk-new", accel_group
);
282 gtk_container_add (GTK_CONTAINER (menuitem1_menu
), new1
);
284 policies
= gtk_menu_item_new_with_mnemonic ("_Policies");
285 gtk_container_add (GTK_CONTAINER (menubar
), policies
);
286 gtk_widget_set_sensitive (policies
, FALSE
);
288 policies_menu
= gtk_menu_new ();
289 gtk_menu_item_set_submenu (GTK_MENU_ITEM (policies
), policies_menu
);
291 account
= gtk_menu_item_new_with_mnemonic ("_Account...");
292 gtk_container_add (GTK_CONTAINER (policies_menu
), account
);
294 user_rights
= gtk_menu_item_new_with_mnemonic ("_User Rights...");
295 gtk_container_add (GTK_CONTAINER (policies_menu
), user_rights
);
297 audit
= gtk_menu_item_new_with_mnemonic ("A_udit...");
298 gtk_container_add (GTK_CONTAINER (policies_menu
), audit
);
300 separator1
= gtk_separator_menu_item_new ();
301 gtk_container_add (GTK_CONTAINER (policies_menu
), separator1
);
302 gtk_widget_set_sensitive (separator1
, FALSE
);
304 trust_relations
= gtk_menu_item_new_with_mnemonic ("_Trust relations");
305 gtk_container_add (GTK_CONTAINER (policies_menu
), trust_relations
);
307 menuitem3
= gtk_menu_item_new_with_mnemonic ("_View");
308 gtk_container_add (GTK_CONTAINER (menubar
), menuitem3
);
310 menuitem3_menu
= gtk_menu_new ();
311 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem3
), menuitem3_menu
);
313 refresh
= gtk_image_menu_item_new_from_stock ("gtk-refresh", accel_group
);
314 gtk_container_add (GTK_CONTAINER (menuitem3_menu
), refresh
);
315 gtk_widget_set_sensitive (refresh
, FALSE
);
317 menuitem4
= gtk_menu_item_new_with_mnemonic ("_Help");
318 gtk_container_add (GTK_CONTAINER (menubar
), menuitem4
);
320 menuitem4_menu
= gtk_menu_new ();
321 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4
), menuitem4_menu
);
323 about
= gtk_menu_item_new_with_mnemonic ("_About");
324 gtk_container_add (GTK_CONTAINER (menuitem4_menu
), about
);
326 vpaned
= gtk_vpaned_new ();
327 gtk_box_pack_start (GTK_BOX (vbox1
), vpaned
, TRUE
, TRUE
, 0);
329 scrolledwindow1
= gtk_scrolled_window_new (NULL
, NULL
);
330 gtk_paned_pack1 (GTK_PANED (vpaned
), scrolledwindow1
, FALSE
, TRUE
);
332 user_list
= gtk_tree_view_new ();
333 gtk_container_add (GTK_CONTAINER (scrolledwindow1
), user_list
);
335 curcol
= gtk_tree_view_column_new();
336 gtk_tree_view_column_set_title(curcol
, "Name");
337 renderer
= gtk_cell_renderer_text_new();
338 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
339 gtk_tree_view_append_column(GTK_TREE_VIEW(user_list
), curcol
);
340 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 0);
342 curcol
= gtk_tree_view_column_new();
343 gtk_tree_view_column_set_title(curcol
, "Description");
344 renderer
= gtk_cell_renderer_text_new();
345 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
346 gtk_tree_view_append_column(GTK_TREE_VIEW(user_list
), curcol
);
347 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 1);
349 curcol
= gtk_tree_view_column_new();
350 gtk_tree_view_column_set_title(curcol
, "RID");
351 renderer
= gtk_cell_renderer_text_new();
352 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
353 gtk_tree_view_append_column(GTK_TREE_VIEW(user_list
), curcol
);
354 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 1);
356 store_users
= gtk_list_store_new(3, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_INT
);
357 gtk_tree_view_set_model(GTK_TREE_VIEW(user_list
), GTK_TREE_MODEL(store_users
));
359 scrolledwindow2
= gtk_scrolled_window_new (NULL
, NULL
);
360 gtk_paned_pack2 (GTK_PANED (vpaned
), scrolledwindow2
, TRUE
, TRUE
);
362 group_list
= gtk_tree_view_new ();
363 gtk_container_add (GTK_CONTAINER (scrolledwindow2
), group_list
);
365 curcol
= gtk_tree_view_column_new();
366 gtk_tree_view_column_set_title(curcol
, "Name");
367 renderer
= gtk_cell_renderer_text_new();
368 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
369 gtk_tree_view_append_column(GTK_TREE_VIEW(group_list
), curcol
);
370 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 0);
372 curcol
= gtk_tree_view_column_new();
373 gtk_tree_view_column_set_title(curcol
, "Description");
374 renderer
= gtk_cell_renderer_text_new();
375 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
376 gtk_tree_view_append_column(GTK_TREE_VIEW(group_list
), curcol
);
377 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 1);
379 curcol
= gtk_tree_view_column_new();
380 gtk_tree_view_column_set_title(curcol
, "RID");
381 renderer
= gtk_cell_renderer_text_new();
382 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
383 gtk_tree_view_append_column(GTK_TREE_VIEW(group_list
), curcol
);
384 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 1);
386 store_groups
= gtk_list_store_new(3, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_INT
);
387 gtk_tree_view_set_model(GTK_TREE_VIEW(group_list
), GTK_TREE_MODEL(store_groups
));
389 statusbar
= gtk_statusbar_new ();
390 gtk_box_pack_start (GTK_BOX (vbox1
), statusbar
, FALSE
, FALSE
, 0);
392 g_signal_connect ((gpointer
) new1
, "activate",
393 G_CALLBACK (on_new1_activate
),
395 g_signal_connect ((gpointer
) seldomain
, "activate",
396 G_CALLBACK (on_select_domain_activate
),
398 g_signal_connect ((gpointer
) mnu_connect
, "activate",
399 G_CALLBACK (on_connect_activate
),
401 g_signal_connect ((gpointer
) mnu_disconnect
, "activate",
402 G_CALLBACK (on_disconnect_activate
),
404 g_signal_connect ((gpointer
) quit
, "activate",
405 G_CALLBACK (on_quit_activate
),
407 g_signal_connect ((gpointer
) account
, "activate",
408 G_CALLBACK (on_account_activate
),
410 g_signal_connect ((gpointer
) user_rights
, "activate",
411 G_CALLBACK (on_user_rights_activate
),
413 g_signal_connect ((gpointer
) audit
, "activate",
414 G_CALLBACK (on_audit_activate
),
416 g_signal_connect ((gpointer
) trust_relations
, "activate",
417 G_CALLBACK (on_trust_relations_activate
),
419 g_signal_connect ((gpointer
) refresh
, "activate",
420 G_CALLBACK (on_refresh_activate
),
422 g_signal_connect ((gpointer
) about
, "activate",
423 G_CALLBACK (on_about_activate
),
426 gtk_window_add_accel_group (GTK_WINDOW (mainwin
), accel_group
);
431 int main(int argc
, char **argv
)
434 setup_logging(argv
[0], DEBUG_STDERR
);
438 gtk_init(&argc
, &argv
);
439 mainwin
= create_mainwindow();
440 gtk_widget_show_all(mainwin
);
442 return gtk_event_loop();