Jason Tang jtang@tresys.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Definition in file toplevel.h.
#include "progress.h"
#include "seaudit.h"
#include <apol/policy-path.h>
#include <gtk/gtk.h>
#include <seaudit/message.h>
#include "progress.h"
Go to the source code of this file.
Typedefs | |
| typedef toplevel | toplevel_t |
Functions | |
| toplevel_t * | toplevel_create (seaudit_t *s) |
| Allocate and return an instance of the toplevel window object. | |
| void | toplevel_destroy (toplevel_t **top) |
| Destroy the toplevel window. | |
| void | toplevel_open_log (toplevel_t *top, const char *filename) |
| Open a log file, destroying any existing logs and views first. | |
| int | toplevel_open_policy (toplevel_t *top, apol_policy_path_t *path) |
| Open a policy file, destroying any existing policies upon success. | |
| void | toplevel_update_status_bar (toplevel_t *top) |
| Update the status bar to show the current policy, number of log messages in the current view, range of messages in current view, and monitor status. | |
| void | toplevel_update_selection_menu_item (toplevel_t *top) |
| Update the menu items whenever a message is selected/deselected. | |
| void | toplevel_update_tabs (toplevel_t *top) |
| Update the tab names for all views. | |
| preferences_t * | toplevel_get_prefs (toplevel_t *top) |
| Return the current preferences object for the toplevel object. | |
| seaudit_log_t * | toplevel_get_log (toplevel_t *top) |
| Return a seaudit_log_t object used for error reporting by libseaudit. | |
| apol_vector_t * | toplevel_get_log_users (toplevel_t *top) |
| Return a vector of strings corresponding to all users found within the current log file. | |
| apol_vector_t * | toplevel_get_log_roles (toplevel_t *top) |
| Return a vector of strings corresponding to all roles found within the current log file. | |
| apol_vector_t * | toplevel_get_log_types (toplevel_t *top) |
| Return a vector of strings corresponding to all types found within the current log file. | |
| apol_vector_t * | toplevel_get_log_classes (toplevel_t *top) |
| Return a vector of strings corresponding to all object classes found within the current log file. | |
| apol_policy_t * | toplevel_get_policy (toplevel_t *top) |
| Return the currently loaded policy. | |
| char * | toplevel_get_glade_xml (toplevel_t *top) |
| Return the filename containing seaudit's glade file. | |
| progress_t * | toplevel_get_progress (toplevel_t *top) |
| Return the progress object, so that sub-windows may also show the threaded progress object. | |
| GtkWindow * | toplevel_get_window (toplevel_t *top) |
| Return the main application window. | |
| void | toplevel_find_terules (toplevel_t *top, seaudit_message_t *message) |
| (Re)open a dialog that allows the user to search for TE rules in the currently opened policy. | |
| void | toplevel_ERR (toplevel_t *top, const char *format,...) __attribute__((format(printf |
| Pop-up an error dialog with a line of text and wait for the user to dismiss the dialog. | |
| void | toplevel_WARN (toplevel_t *top, const char *format,...) __attribute__((format(printf |
| Pop-up a warning dialog with a line of text and wait for the user to dismiss the dialog. | |
|
|
|
Allocate and return an instance of the toplevel window object. This will create the window, set up the menus and icons, create an empty notebook, then display the window.
Definition at line 419 of file toplevel.c. References apol_file_find_path(), apol_vector_create(), init_icons(), message_view_free(), policy_view_create(), progress_create(), toplevel::s, seaudit_t, toplevel_add_new_model(), toplevel_destroy(), toplevel_on_notebook_switch_page(), toplevel_set_recent_logs_submenu(), toplevel_set_recent_policies_submenu(), and toplevel_t. 00420 {
00421 toplevel_t *top;
00422 GtkWidget *vbox;
00423 int error = 0;
00424
00425 if ((top = calloc(1, sizeof(*top))) == NULL || (top->views = apol_vector_create(message_view_free)) == NULL) {
00426 error = errno;
00427 goto cleanup;
00428 }
00429 top->s = s;
00430 top->next_model_number = 1;
00431
00432 if ((top->xml_filename = apol_file_find_path("seaudit.glade")) == NULL ||
00433 (top->xml = glade_xml_new(top->xml_filename, "TopLevel", NULL)) == NULL) {
00434 fprintf(stderr, "Could not open seaudit.glade.\n");
00435 error = EIO;
00436 goto cleanup;
00437 }
00438 top->w = GTK_WINDOW(glade_xml_get_widget(top->xml, "TopLevel"));
00439 g_object_set_data(G_OBJECT(top->w), "toplevel", top);
00440 init_icons(top);
00441 top->notebook = GTK_NOTEBOOK(gtk_notebook_new());
00442 g_signal_connect_after(G_OBJECT(top->notebook), "switch-page", G_CALLBACK(toplevel_on_notebook_switch_page), top);
00443 vbox = glade_xml_get_widget(top->xml, "NotebookVBox");
00444 gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(top->notebook));
00445 gtk_widget_show(GTK_WIDGET(top->notebook));
00446 gtk_widget_show(GTK_WIDGET(top->w));
00447 toplevel_set_recent_logs_submenu(top);
00448 toplevel_set_recent_policies_submenu(top);
00449
00450 glade_xml_signal_autoconnect(top->xml);
00451
00452 /* create initial blank tab for the notebook */
00453 toplevel_add_new_model(top);
00454
00455 /* initialize sub-windows, now that glade XML file has been
00456 * read */
00457 if ((top->pv = policy_view_create(top)) == NULL || (top->progress = progress_create(top)) == NULL) {
00458 error = errno;
00459 goto cleanup;
00460 }
00461 cleanup:
00462 if (error != 0) {
00463 toplevel_destroy(&top);
00464 errno = error;
00465 return NULL;
00466 }
00467 return top;
00468 }
|
|
|
Destroy the toplevel window. This function will recursively destroy all other windows. This does nothing if the pointer is set to NULL.
Definition at line 470 of file toplevel.c. 00471 {
00472 if (top != NULL && *top != NULL) {
00473 if ((*top)->monitor_id > 0) {
00474 g_source_remove((*top)->monitor_id);
00475 }
00476 policy_view_destroy(&(*top)->pv);
00477 apol_vector_destroy(&(*top)->views);
00478 free((*top)->xml_filename);
00479 g_free((*top)->view_filename);
00480 progress_destroy(&(*top)->progress);
00481 if ((*top)->w != NULL) {
00482 gtk_widget_destroy(GTK_WIDGET((*top)->w));
00483 }
00484 free(*top);
00485 *top = NULL;
00486 }
00487 }
|
|
||||||||||||
|
Open a log file, destroying any existing logs and views first. Afterwards, create a new view for the log.
Definition at line 630 of file toplevel.c. References toplevel::do_monitor_log, FALSE, log_run_datum::file, log_run_datum::log, toplevel::next_model_number, preferences_get_real_time_at_startup(), toplevel::progress, progress_hide(), progress_show(), progress_wait(), log_run_datum::result, toplevel::s, seaudit_set_log(), toplevel_add_new_model(), toplevel_destroy_views(), toplevel_enable_log_items(), toplevel_get_prefs(), toplevel_monitor_log(), toplevel_open_log_runner(), toplevel_set_recent_logs_submenu(), toplevel_t, toplevel_update_selection_menu_item(), toplevel_update_status_bar(), toplevel_update_title_bar(), TRUE, util_cursor_clear(), util_cursor_wait(), toplevel::w, and toplevel::xml. Referenced by delayed_main(), toplevel_on_open_log_activate(), and toplevel_on_open_recent_log_activate(). 00631 {
00632 struct log_run_datum run = { top, NULL, filename, NULL, 0 };
00633 int was_monitor_running;
00634 GtkCheckMenuItem *w;
00635
00636 /* disable monitoring during the threaded part of this code */
00637 was_monitor_running = top->do_monitor_log;
00638 top->do_monitor_log = 0;
00639 toplevel_monitor_log(top);
00640
00641 util_cursor_wait(GTK_WIDGET(top->w));
00642 progress_show(top->progress, "Opening Log");
00643 g_thread_create(toplevel_open_log_runner, &run, FALSE, NULL);
00644 progress_wait(top->progress);
00645 progress_hide(top->progress);
00646 util_cursor_clear(GTK_WIDGET(top->w));
00647
00648 if (run.result < 0) {
00649 top->do_monitor_log = was_monitor_running;
00650 toplevel_monitor_log(top);
00651 return;
00652 }
00653
00654 toplevel_destroy_views(top);
00655 top->next_model_number = 1;
00656 seaudit_set_log(top->s, run.log, run.file, filename);
00657 toplevel_set_recent_logs_submenu(top);
00658 toplevel_enable_log_items(top, TRUE);
00659 toplevel_add_new_model(top);
00660 toplevel_update_title_bar(top);
00661 toplevel_update_status_bar(top);
00662 toplevel_update_selection_menu_item(top);
00663 top->do_monitor_log = preferences_get_real_time_at_startup(toplevel_get_prefs(top));
00664
00665 w = GTK_CHECK_MENU_ITEM(glade_xml_get_widget(top->xml, "MonitorLog"));
00666
00667 gtk_check_menu_item_set_active(w, top->do_monitor_log);
00668 /* call this again because the check item could have already
00669 * been active, thus its handler would not run */
00670 toplevel_monitor_log(top);
00671 }
|
|
||||||||||||
|
|
Update the status bar to show the current policy, number of log messages in the current view, range of messages in current view, and monitor status.
Definition at line 728 of file toplevel.c. References apol_policy_get_version_type_mls_str(), apol_policy_t, message_view_get_num_log_messages(), message_view_t, toplevel::s, seaudit_get_log_first(), seaudit_get_log_last(), seaudit_get_num_log_messages(), seaudit_get_policy(), seaudit_log_t, toplevel_ERR(), toplevel_get_current_view(), toplevel_get_log(), toplevel_t, and toplevel::xml. Referenced by message_view_modify(), modify_view_run(), toplevel_on_notebook_switch_page(), toplevel_open_log(), and toplevel_open_policy(). 00729 {
00730 apol_policy_t *policy = seaudit_get_policy(top->s);
00731 GtkLabel *policy_version = (GtkLabel *) glade_xml_get_widget(top->xml, "PolicyVersionLabel");
00732 GtkLabel *log_num = (GtkLabel *) glade_xml_get_widget(top->xml, "LogNumLabel");
00733 GtkLabel *log_dates = (GtkLabel *) glade_xml_get_widget(top->xml, "LogDateLabel");
00734 seaudit_log_t *log = toplevel_get_log(top);
00735
00736 if (policy == NULL) {
00737 gtk_label_set_text(policy_version, "Policy: No policy");
00738 } else {
00739 char *policy_str = apol_policy_get_version_type_mls_str(policy);
00740 if (policy_str == NULL) {
00741 toplevel_ERR(top, "%s", strerror(errno));
00742 } else {
00743 char *s;
00744 if (asprintf(&s, "Policy: %s", policy_str) < 0) {
00745 toplevel_ERR(top, "%s", strerror(errno));
00746 } else {
00747 gtk_label_set_text(policy_version, s);
00748 free(s);
00749 }
00750 free(policy_str);
00751 }
00752 }
00753
00754 if (log == NULL) {
00755 gtk_label_set_text(log_num, "Log Messages: No log");
00756 gtk_label_set_text(log_dates, "Dates: No log");
00757 } else {
00758 message_view_t *view = toplevel_get_current_view(top);
00759 size_t num_messages = seaudit_get_num_log_messages(top->s);
00760 size_t num_view_messages;
00761 const struct tm *first = seaudit_get_log_first(top->s);
00762 const struct tm *last = seaudit_get_log_last(top->s);
00763 assert(view != NULL);
00764 num_view_messages = message_view_get_num_log_messages(view);
00765 char *s, t1[256], t2[256];
00766 if (asprintf(&s, "Log Messages: %zd/%zd", num_view_messages, num_messages) < 0) {
00767 toplevel_ERR(top, "%s", strerror(errno));
00768 } else {
00769 gtk_label_set_text(log_num, s);
00770 free(s);
00771 }
00772 if (first == NULL || last == NULL) {
00773 gtk_label_set_text(log_dates, "Dates: No messages");
00774 } else {
00775 strftime(t1, 256, "%b %d %H:%M:%S", first);
00776 strftime(t2, 256, "%b %d %H:%M:%S", last);
00777 if (asprintf(&s, "Dates: %s - %s", t1, t2) < 0) {
00778 toplevel_ERR(top, "%s", strerror(errno));
00779 } else {
00780 gtk_label_set_text(log_dates, s);
00781 free(s);
00782 }
00783 }
00784 }
00785 }
|
|
|
Update the menu items whenever a message is selected/deselected. Certain commands are legal only when one or more messages are selected.
Definition at line 802 of file toplevel.c. References message_view_is_message_selected(), message_view_t, toplevel_get_current_view(), toplevel_t, and toplevel::xml. Referenced by message_view_delayed_selection_menu_item(), message_view_on_row_activate(), toplevel_on_notebook_switch_page(), and toplevel_open_log(). 00803 {
00804 static const char *items[] = {
00805 "ExportSelected", "ViewMessage",
00806 NULL
00807 };
00808 message_view_t *view = toplevel_get_current_view(top);
00809 gboolean sens = FALSE;
00810 size_t i;
00811 const char *s;
00812 if (view != NULL) {
00813 sens = message_view_is_message_selected(view);
00814 }
00815 for (i = 0, s = items[0]; s != NULL; s = items[++i]) {
00816 GtkWidget *w = glade_xml_get_widget(top->xml, s);
00817 assert(s != NULL);
00818 gtk_widget_set_sensitive(w, sens);
00819 }
00820 }
|
|
|
Update the tab names for all views.
Definition at line 787 of file toplevel.c. References message_view_get_model(), message_view_t, toplevel::notebook, seaudit_model_get_name(), seaudit_model_t, and toplevel_t. Referenced by message_view_set_model(). 00788 {
00789 gint i = gtk_notebook_get_n_pages(top->notebook) - 1;
00790 while (i >= 0) {
00791 GtkWidget *child = gtk_notebook_get_nth_page(top->notebook, i);
00792 GtkWidget *tab = gtk_notebook_get_tab_label(top->notebook, child);
00793 GtkWidget *label = g_object_get_data(G_OBJECT(tab), "label");
00794 message_view_t *v = g_object_get_data(G_OBJECT(tab), "view-object");
00795 seaudit_model_t *model = message_view_get_model(v);
00796 const char *name = seaudit_model_get_name(model);
00797 gtk_label_set_text(GTK_LABEL(label), name);
00798 i--;
00799 }
00800 }
|
|
|
Return the current preferences object for the toplevel object.
Definition at line 822 of file toplevel.c. References preferences_t, toplevel::s, seaudit_get_prefs(), and toplevel_t. Referenced by message_view_update_visible_columns(), preferences_view_run(), report_window_copy_prefs(), toplevel_monitor_log(), toplevel_monitor_log_timer(), toplevel_open_log(), toplevel_set_recent_logs_submenu(), and toplevel_set_recent_policies_submenu(). 00823 {
00824 return seaudit_get_prefs(top->s);
00825 }
|
|
|
Return a seaudit_log_t object used for error reporting by libseaudit.
Definition at line 827 of file toplevel.c. References toplevel::s, seaudit_get_log(), seaudit_log_t, and toplevel_t. Referenced by message_view_update_rows(), report_window_run(), and toplevel_update_status_bar(). 00828 {
00829 return seaudit_get_log(top->s);
00830 }
|
|
|
Return a vector of strings corresponding to all users found within the current log file. The vector will be sorted alphabetically.
Definition at line 832 of file toplevel.c. References apol_vector_t, toplevel::s, seaudit_get_log_users(), and toplevel_t. Referenced by filter_view_on_suser_context_click(), and filter_view_on_tuser_context_click(). 00833 {
00834 return seaudit_get_log_users(top->s);
00835 }
|
|
|
Return a vector of strings corresponding to all roles found within the current log file. The vector will be sorted alphabetically.
Definition at line 837 of file toplevel.c. References apol_vector_t, toplevel::s, seaudit_get_log_roles(), and toplevel_t. Referenced by filter_view_on_srole_context_click(), and filter_view_on_trole_context_click(). 00838 {
00839 return seaudit_get_log_roles(top->s);
00840 }
|
|
|
Return a vector of strings corresponding to all types found within the current log file. The vector will be sorted alphabetically.
Definition at line 842 of file toplevel.c. References apol_vector_t, toplevel::s, seaudit_get_log_types(), and toplevel_t. Referenced by filter_view_on_stype_context_click(), and filter_view_on_ttype_context_click(). 00843 {
00844 return seaudit_get_log_types(top->s);
00845 }
|
|
|
Return a vector of strings corresponding to all object classes found within the current log file. The vector will be sorted alphabetically.
Definition at line 847 of file toplevel.c. References apol_vector_t, toplevel::s, seaudit_get_log_classes(), and toplevel_t. Referenced by filter_view_on_class_context_click(). 00848 {
00849 return seaudit_get_log_classes(top->s);
00850 }
|
|
|
Return the currently loaded policy.
Definition at line 852 of file toplevel.c. References apol_policy_t, toplevel::s, seaudit_get_policy(), and toplevel_t. Referenced by filter_view_get_policy_classes(), filter_view_get_policy_roles(), filter_view_get_policy_types(), filter_view_get_policy_users(), message_view_popup_menu(), policy_view_display_avrule_results(), policy_view_load_policy_source(), policy_view_on_find_terules_click(), and policy_view_populate_combo_boxes(). 00853 {
00854 return seaudit_get_policy(top->s);
00855 }
|
|
|
Return the filename containing seaudit's glade file.
Definition at line 857 of file toplevel.c. 00858 {
00859 return top->xml_filename;
00860 }
|
|
|
Return the progress object, so that sub-windows may also show the threaded progress object.
Definition at line 862 of file toplevel.c. 00863 {
00864 return top->progress;
00865 }
|
|
|
Return the main application window. Sub-windows should be set transient to this window.
Definition at line 867 of file toplevel.c. 00868 {
00869 return top->w;
00870 }
|
|
||||||||||||
|
(Re)open a dialog that allows the user to search for TE rules in the currently opened policy. If message is not NULL then set the query's initial parameters to the message's source type, target type, and object class.
Definition at line 872 of file toplevel.c. References message, policy_view_find_terules(), toplevel::pv, seaudit_message_t, and toplevel_t. Referenced by message_view_popup_on_find_terules_activate(), toplevel_on_find_terules_activate(), and toplevel_on_find_terules_click(). 00873 {
00874 policy_view_find_terules(top->pv, message);
00875 }
|
|
||||||||||||||||
|
Pop-up an error dialog with a line of text and wait for the user to dismiss the dialog.
|
|
||||||||||||||||
|
Pop-up a warning dialog with a line of text and wait for the user to dismiss the dialog.
|