📄 policyview.c
字号:
element = g_object_get_data (G_OBJECT (dialog), "target_selector_host"); data = g_strconcat (data, ", ", gtk_entry_get_text (GTK_ENTRY (element)), NULL); } } element = g_object_get_data (G_OBJECT (dialog), "forward_selector_host"); if (element) { data = g_strconcat (data, ", ", gtk_entry_get_text (GTK_ENTRY (element)), NULL); element = g_object_get_data (G_OBJECT (dialog), "forward_selector_port"); data = g_strconcat (data, ", ", gtk_entry_get_text (GTK_ENTRY (element)), NULL); } element = g_object_get_data (G_OBJECT (dialog), "comment"); if (element) { gchar *text, *buf; text = g_strdup (gtk_entry_get_text (GTK_ENTRY (element))); buf = malloc (strlen (text) * 2); escape_string (text, buf); data = g_strconcat (data, ", ", buf, NULL); g_free (buf); } g_strstrip (data); if (g_str_has_prefix (data, ", ")) { return data+2; } else return data;}static voidrule_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data){ if (response_id == GTK_RESPONSE_ACCEPT) { gchar *data; if (!rule_dialog_validate_data (dialog)) return; data = rule_dialog_extract_data (dialog); if (data != NULL) { gchar *rule_file = g_object_get_data (G_OBJECT (modifying_view), "rule_file"); GtkTreeIter *iter = g_object_steal_data (G_OBJECT (dialog), "editing"); if (iter) { /* Modifying an existing entry */ GtkTreeModel *model; gint *position; model = gtk_tree_view_get_model (GTK_TREE_VIEW (modifying_view)); position = g_object_steal_data (G_OBJECT (dialog), "position"); gtk_list_store_remove (GTK_LIST_STORE (model), iter); /* Remove from the view */ remove_line_from_file (rule_file, (int)position); gtk_tree_iter_free (iter); } append_to_file (rule_file, data, TRUE); if (g_strrstr (rule_file, "inbound")) { if (modifying_view == GTK_TREE_VIEW (in_forward)) modifications_require_restart = TRUE; else modified_inbound = TRUE; } else modified_outbound = TRUE; append_to_view (GTK_TREE_VIEW (modifying_view), NULL, NULL, data); } } gtk_widget_hide (GTK_WIDGET (dialog)); rule_dialog_reset (dialog); modifying_view = NULL; menus_policy_edit_enabled (FALSE); menus_policy_remove_enabled (FALSE);}static voidactivate_dialog_cb (GtkWidget *dialog){ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);}static GtkWidget *create_dialog_header (gchar *title, GtkWidget *dialog){ GtkWidget *vbox, *catbox, *label; vbox = gtk_vbox_new (FALSE, 14); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, FALSE, FALSE, 8); catbox = gtk_vbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (vbox), catbox, FALSE, FALSE, 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), g_strconcat ( "<span weight=\"bold\">", title, "</span>", NULL)); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.0); gtk_box_pack_start (GTK_BOX (catbox), label, FALSE, FALSE, 0); return catbox;}static GtkWidget *create_indented_box (GtkWidget *parent){ GtkWidget *hbox, *vbox, *label, *rowbox; hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (parent), hbox, FALSE, FALSE, 0); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); vbox = gtk_vbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); rowbox = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (vbox), rowbox, FALSE, FALSE, 0); return rowbox;}static voidadd_host_selector (gchar *title, GtkWidget *dialog){ GtkWidget *label; GtkWidget *catbox; GtkWidget *rowbox; GtkWidget *entry; catbox = create_dialog_header (title, dialog); rowbox = create_indented_box (catbox); label = gtk_label_new (_("IP, host or network")); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (rowbox), label, FALSE, FALSE, 0); entry = gtk_entry_new (); g_object_set_data (G_OBJECT (dialog), "host_selector", entry); gtk_widget_set_size_request (entry, 150, -1); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); gtk_box_pack_start (GTK_BOX (rowbox), entry, FALSE, FALSE, 0);}/* Update the port suggestions when the user selects a named service */static voidupdate_ports_from_service (GtkComboBox *combo, GtkWidget *dialog){ GtkTreeIter iter; if (gtk_combo_box_get_active_iter (combo, &iter)) { GtkTreeModel *model; gchar *ports; GtkWidget *entry; model = gtk_combo_box_get_model (combo); gtk_tree_model_get (model, &iter, 1, &ports, -1); /* Update the firewall hosts port range with the ports of the service */ entry = g_object_get_data (G_OBJECT (dialog), "service_selector_port"); gtk_entry_set_text (GTK_ENTRY (entry), ports); /* Update the internal port range with the ports of the service */ entry = g_object_get_data (G_OBJECT (dialog), "forward_selector_port"); if (entry != NULL) gtk_entry_set_text (GTK_ENTRY (entry), ports); }}/* Suggest a service name when the user manually enters a port number */static gbooleanresolve_port_to_service (GtkEntry *entry, GdkEventKey *event, GtkWidget *combo){ const gchar *port; port = gtk_entry_get_text (entry); if (strlen (port) > 1) { gchar *service; GtkWidget *service_entry; service = service_get_name (atoi(port), "tcp"); service_entry = gtk_bin_get_child (GTK_BIN (combo)); gtk_entry_set_text (GTK_ENTRY (service_entry), service); g_free (service); } return FALSE;}static voidadd_service_selector (gchar *title, GtkWidget *dialog){ GtkSizeGroup *sizegroup; GtkWidget *combo; GtkWidget *entry; GtkWidget *label; GtkWidget *catbox, *rowbox; catbox = create_dialog_header (title, dialog); rowbox = create_indented_box (catbox); sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_BOTH); label = gtk_label_new (_("Name")); gtk_size_group_add_widget (sizegroup, label); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (rowbox), label, FALSE, FALSE, 0); combo = gtk_combo_box_entry_new_with_model (GTK_TREE_MODEL (services_get_model ()), 0); gtk_widget_set_size_request (combo, 100, -1); g_object_set_data (G_OBJECT (dialog), "service_selector_service", combo); entry = gtk_bin_get_child (GTK_BIN (combo)); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); gtk_box_pack_start (GTK_BOX (rowbox), combo, FALSE, FALSE, 0); rowbox = create_indented_box (catbox); label = gtk_label_new (_("Port")); gtk_size_group_add_widget (sizegroup, label); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (rowbox), label, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_widget_set_size_request (entry, 100, -1); g_object_set_data (G_OBJECT (dialog), "service_selector_port", entry); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); g_signal_connect (G_OBJECT (entry), "key-release-event", G_CALLBACK (resolve_port_to_service), combo); gtk_box_pack_start (GTK_BOX (rowbox), entry, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK (update_ports_from_service), dialog);}static voidadd_target_selector (gchar *title, TargetMask mask, GtkWidget *dialog){ GtkWidget *catbox, *rowbox; GtkWidget *anyone, *firewall, *lan, *ip; catbox = create_dialog_header (title, dialog); rowbox = create_indented_box (catbox); anyone = gtk_radio_button_new_with_label (NULL, _("Anyone")); g_object_set_data (G_OBJECT (dialog), "target_selector_anyone", anyone); firewall = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (anyone), _("Firewall host")); g_object_set_data (G_OBJECT (dialog), "target_selector_firewall", firewall); lan = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (firewall), _("LAN clients")); g_object_set_data (G_OBJECT (dialog), "target_selector_lan", lan); ip = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (lan), _("IP, host or network")); g_object_set_data (G_OBJECT (dialog), "target_selector_ip", ip); if (mask & TARGET_ANYONE) { gtk_box_pack_start (GTK_BOX (rowbox), anyone, FALSE, FALSE, 0); } if (mask & TARGET_FIREWALL) { gtk_box_pack_start (GTK_BOX (rowbox), firewall, FALSE, FALSE, 0); } if (mask & TARGET_LAN) { gtk_box_pack_start (GTK_BOX (rowbox), lan, FALSE, FALSE, 0); } if (mask & TARGET_HOST) { GtkWidget *entry; rowbox = create_indented_box (catbox); gtk_box_pack_start (GTK_BOX (rowbox), ip, FALSE, FALSE, 0); entry = gtk_entry_new (); g_object_set_data (G_OBJECT (dialog), "target_selector_host", entry); gtk_widget_set_size_request (entry, 120, -1); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); gtk_box_pack_start (GTK_BOX (rowbox), entry, FALSE, FALSE, 0); gtk_widget_set_sensitive (entry, FALSE); gui_widget_sensitivity_sync (GTK_TOGGLE_BUTTON (ip), entry); }}static voidadd_forward_selector (gchar *title, GtkWidget *dialog){ GtkSizeGroup *sizegroup; GtkWidget *entry; GtkWidget *label; GtkWidget *catbox, *rowbox; catbox = create_dialog_header (title, dialog); rowbox = create_indented_box (catbox); sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_BOTH); label = gtk_label_new (_("IP or host")); gtk_size_group_add_widget (sizegroup, label); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (rowbox), label, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_widget_set_size_request (entry, 150, -1); g_object_set_data (G_OBJECT (dialog), "forward_selector_host", entry); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); gtk_box_pack_start (GTK_BOX (rowbox), entry, FALSE, FALSE, 0); rowbox = create_indented_box (catbox); label = gtk_label_new (_("Port")); gtk_size_group_add_widget (sizegroup, label); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (rowbox), label, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_widget_set_size_request (entry, 100, -1); g_object_set_data (G_OBJECT (dialog), "forward_selector_port", entry); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); gtk_box_pack_start (GTK_BOX (rowbox), entry, FALSE, FALSE, 0);}static voidadd_comment_space (gchar *title, GtkWidget *dialog){ GtkWidget *catbox; GtkWidget *rowbox; GtkWidget *entry; GtkWidget *hbox, *vbox; GtkWidget *label; catbox = create_dialog_header (title, dialog); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (catbox), hbox, FALSE, FALSE, 0); label = gtk_label_new (" "); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); vbox = gtk_vbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); rowbox = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (vbox), rowbox, FALSE, FALSE, 0); entry = gtk_entry_new (); g_object_set_data (G_OBJECT (dialog), "comment", entry); g_signal_connect_swapped (G_OBJECT (entry), "activate", G_CALLBACK (activate_dialog_cb), G_OBJECT (dialog)); gtk_box_pack_start (GTK_BOX (rowbox), entry, TRUE, TRUE, 0);}static gbooleanrule_dialog_delete_request_cb (GtkWidget *widget, GdkEvent *event){ return TRUE;}static GtkWidget *create_dialog (gchar *title, ...){ GtkWidget *dialog; va_list ap; dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (Firestarter.window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, /* GTK_STOCK_HELP, GTK_RESPONSE_HELP, */ GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -