From 63d51b566ea270b45b5b34b1feab37b8faa28232 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 9 May 2004 23:20:43 +0000 Subject: main fieryfilter work git-svn-id: file:///home/lennart/svn/public/fieryfilter/fieryfilter@31 79e6afc9-17da-0310-ae3c-b873bff394f4 --- client/rulewin.c | 249 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 client/rulewin.c (limited to 'client/rulewin.c') diff --git a/client/rulewin.c b/client/rulewin.c new file mode 100644 index 0000000..ff3d9c4 --- /dev/null +++ b/client/rulewin.c @@ -0,0 +1,249 @@ +#include +#include +#include +#include + +#include "rulewin.h" +#include "interface.h" +#include "support.h" +#include "ruleset.h" +#include "format.h" + +void rulewin_fill(GtkWidget *rw, rule_t *r) { + GList *l; + GtkWidget *bc = NULL; + + if (r->description[0]) { + gtk_label_set_label(GTK_LABEL(lookup_widget(rw, "desc_label")), r->description); + gtk_entry_set_text(GTK_ENTRY(lookup_widget(rw, "desc_entry")), r->description); + } else { + gtk_label_set_label(GTK_LABEL(lookup_widget(rw, "desc_label")), "New rule"); + gtk_entry_set_text(GTK_ENTRY(lookup_widget(rw, "desc_entry")), ""); + } + + gtk_option_menu_set_history(GTK_OPTION_MENU(lookup_widget(rw, "rule_optionmenu")), r->verdict); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_direction_checkbutton")), r->match & MATCH_DIRECTION); + gtk_option_menu_set_history(GTK_OPTION_MENU(lookup_widget(rw, "direction_optionmenu")), r->direction); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_interfaces_checkbutton")), r->match & MATCH_INTERFACES); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(rw, "incoming_combo"))->entry), r->device_in); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(lookup_widget(rw, "outgoing_combo"))->entry), r->device_out); + + l = fill_interface_list(); + gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(rw, "incoming_combo")), l); + gtk_combo_set_popdown_strings(GTK_COMBO(lookup_widget(rw, "outgoing_combo")), l); + free_interface_list(l); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_type_checkbutton")), r->match & MATCH_TYPE); + + gtk_option_menu_set_history(GTK_OPTION_MENU(lookup_widget(rw, "protocol_optionmenu")), r->protocol == IPPROTO_UDP ? 0 : (r->protocol == IPPROTO_TCP ? 1 : 2)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(rw, "port_spinbutton")), r->port); + fill_icmp_menu(GTK_OPTION_MENU(lookup_widget(rw, "icmp_optionmenu")), FALSE, r->icmp_type); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_source_checkbutton")), r->match & MATCH_SOURCE); + gtk_entry_set_text(GTK_ENTRY(lookup_widget(rw, "src_ip_entry")), format_ip_address(r->src_ip_address)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(rw, "src_netmask_spinbutton")), r->src_netmask_bits); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "src_netmask_checkbutton")), r->src_netmask_bits < 32); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_destination_checkbutton")), r->match & MATCH_DESTINATION); + gtk_entry_set_text(GTK_ENTRY(lookup_widget(rw, "dst_ip_entry")), format_ip_address(r->dst_ip_address)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(rw, "dst_netmask_spinbutton")), r->dst_netmask_bits); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "dst_netmask_checkbutton")), r->dst_netmask_bits < 32); + + if (r->match & MATCH_BROADCAST) + bc = lookup_widget(rw, "bc_match_broadcast_radiobutton"); + else if (r->match & MATCH_UNICAST) + bc = lookup_widget(rw, "bc_match_unicast_radiobutton"); + else + bc = lookup_widget(rw, "bc_dont_match_radiobutton"); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bc), TRUE); +} + + +void rulewin_update_host_ranges(GtkWidget *rw) { + const gchar *ip; + gint bits; + + ip = gtk_entry_get_text(GTK_ENTRY(lookup_widget(rw, "src_ip_entry"))); + bits = (gint) gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(rw, "src_netmask_spinbutton"))); + gtk_label_set_label(GTK_LABEL(lookup_widget(rw, "src_host_range_value_label")), format_host_range(ip, bits)); + + ip = gtk_entry_get_text(GTK_ENTRY(lookup_widget(rw, "dst_ip_entry"))); + bits = (gint) gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(rw, "dst_netmask_spinbutton"))); + gtk_label_set_label(GTK_LABEL(lookup_widget(rw, "dst_host_range_value_label")), format_host_range(ip, bits)); +} + +void rulewin_set_sensitive(GtkWidget *rw) { + gboolean b; + guint i; + gtk_widget_set_sensitive(lookup_widget(rw, "ok_button"), *gtk_entry_get_text(GTK_ENTRY(lookup_widget(rw, "desc_entry"))) ? TRUE : FALSE); + + b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_direction_checkbutton"))); + + gtk_widget_set_sensitive(lookup_widget(rw, "direction_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "direction_optionmenu"), b); + + gtk_widget_set_sensitive(lookup_widget(rw, "match_interfaces_checkbutton"), b); + b = b && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_interfaces_checkbutton"))); + i = gtk_option_menu_get_history(GTK_OPTION_MENU(lookup_widget(rw, "direction_optionmenu"))); + gtk_widget_set_sensitive(lookup_widget(rw, "incoming_label"), b && i != 1); + gtk_widget_set_sensitive(lookup_widget(rw, "incoming_combo"), b && i != 1); + gtk_widget_set_sensitive(lookup_widget(rw, "outgoing_label"), b && i != 0); + gtk_widget_set_sensitive(lookup_widget(rw, "outgoing_combo"), b && i != 0); + + + b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_type_checkbutton"))); + gtk_widget_set_sensitive(lookup_widget(rw, "protocol_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "protocol_optionmenu"), b); + + i = gtk_option_menu_get_history(GTK_OPTION_MENU(lookup_widget(rw, "protocol_optionmenu"))); + + gtk_widget_set_sensitive(lookup_widget(rw, "port_label"), b && i != 2); + gtk_widget_set_sensitive(lookup_widget(rw, "port_spinbutton"), b && i != 2); + gtk_widget_set_sensitive(lookup_widget(rw, "type_label"), b && i != 2); + + gtk_widget_set_sensitive(lookup_widget(rw, "icmp_label"), b && i == 2); + gtk_widget_set_sensitive(lookup_widget(rw, "icmp_optionmenu"), b && i == 2); + + b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_source_checkbutton"))); + gtk_widget_set_sensitive(lookup_widget(rw, "src_ip_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "src_ip_entry"), b); + + gtk_widget_set_sensitive(lookup_widget(rw, "src_netmask_checkbutton"), b); + b = b && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "src_netmask_checkbutton"))); + gtk_widget_set_sensitive(lookup_widget(rw, "src_netmask_spinbutton"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "src_netmask_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "src_netmask_label_bits"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "src_host_range_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "src_host_range_value_label"), b); + + b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "bc_dont_match_radiobutton"))); + gtk_widget_set_sensitive(lookup_widget(rw, "match_destination_checkbutton"), b); + b = b && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_destination_checkbutton"))); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_ip_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_ip_entry"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_netmask_checkbutton"), b); + + b = b && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "dst_netmask_checkbutton"))); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_netmask_spinbutton"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_netmask_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_netmask_label_bits"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_host_range_label"), b); + gtk_widget_set_sensitive(lookup_widget(rw, "dst_host_range_value_label"), b); +} + +int rulewin_show(rule_t *rule) { + GtkWidget *rw; + GdkColor color; + + if (!rule) + rule = rule_new(); + + if (rule->being_edited) + return -1; + + rule->being_edited = TRUE; + + rw = create_rule_window(); + g_object_set_data(G_OBJECT(rw), "rule", rule); + + gdk_color_parse ("black", &color); + gtk_widget_modify_bg(lookup_widget(rw, "desc_eventbox"), GTK_STATE_NORMAL, &color); + + rulewin_fill(rw, rule); + rulewin_set_sensitive(rw); + gtk_widget_show_all(rw); + + + ruleset_update_ui(); + + return 0; +} + +void rulewin_ok(GtkWidget *rw) { + rule_t *rule; + + rule = (rule_t*) g_object_get_data(G_OBJECT(rw), "rule"); + g_assert(rule); + + g_object_set_data(G_OBJECT(rw), "rule", NULL); + + rule->verdict = gtk_option_menu_get_history(GTK_OPTION_MENU(lookup_widget(rw, "rule_optionmenu"))); + strncpy(rule->description, gtk_entry_get_text(GTK_ENTRY(lookup_widget(rw, "desc_entry"))), sizeof(rule->description)); + + rule->match = 0; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_direction_checkbutton")))) + rule->match |= MATCH_DIRECTION; + + rule->direction = gtk_option_menu_get_history(GTK_OPTION_MENU(lookup_widget(rw, "direction_optionmenu"))); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_interfaces_checkbutton")))) + rule->match |= MATCH_INTERFACES; + + g_strlcpy(rule->device_in, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(rw, "incoming_combo"))->entry)), sizeof(rule->device_in)); + g_strlcpy(rule->device_out, gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(lookup_widget(rw, "outgoing_combo"))->entry)), sizeof(rule->device_out)); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_type_checkbutton")))) + rule->match |= MATCH_TYPE; + + switch (gtk_option_menu_get_history(GTK_OPTION_MENU(lookup_widget(rw, "protocol_optionmenu")))) { + case 0: rule->protocol = IPPROTO_UDP; break; + case 1: rule->protocol = IPPROTO_TCP; break; + default: rule->protocol = IPPROTO_UDP; + } + + rule->port = CLAMP(1, (guint16) gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(rw, "port_spinbutton"))), 0xFFFF); + + // ICMP fehlt + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_source_checkbutton")))) + rule->match |= MATCH_SOURCE; + + inet_aton(gtk_entry_get_text(GTK_ENTRY(lookup_widget(rw, "src_ip_entry"))), (struct in_addr*) &rule->src_ip_address); + rule->src_ip_address = rule->src_ip_address; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "src_netmask_checkbutton")))) + rule->src_netmask_bits = gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(rw, "src_netmask_spinbutton"))); + else + rule->src_netmask_bits = 32; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "match_destination_checkbutton")))) + rule->match |= MATCH_DESTINATION; + + inet_aton(gtk_entry_get_text(GTK_ENTRY(lookup_widget(rw, "dst_ip_entry"))), (struct in_addr*) &rule->dst_ip_address); + rule->dst_ip_address = rule->dst_ip_address; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "dst_netmask_checkbutton")))) + rule->dst_netmask_bits = gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(rw, "dst_netmask_spinbutton"))); + else + rule->dst_netmask_bits = 32; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "bc_match_broadcast_radiobutton")))) + rule->match |= MATCH_BROADCAST; + else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(rw, "bc_match_unicast_radiobutton")))) + rule->match |= MATCH_UNICAST; + + rule->being_edited = FALSE; + + if (rule->realized) + ruleset_update_rule(rule); + else + ruleset_append_rule(rule); +} + +void rulewin_cancel(GtkWidget *rw) { + rule_t *rule; + + rule = (rule_t*) g_object_get_data(G_OBJECT(rw), "rule"); + rule->being_edited = FALSE; + + if (!rule->realized) + rule_free(rule); + + gtk_widget_destroy(rw); + + ruleset_update_ui(); +} -- cgit