From 6f240bc31165d0e31354c2ab48053a5d60dcec60 Mon Sep 17 00:00:00 2001 From: Tim Young Date: Mon, 7 Nov 2016 10:50:56 -0600 Subject: [PATCH] Working on the firewall --- EduNetworkBuilder/DeviceConfig.Designer.cs | 17 +- EduNetworkBuilder/DeviceConfig.cs | 17 +- EduNetworkBuilder/EduNetworkBuilder.csproj | 1 - EduNetworkBuilder/FirewallEditor.cs | 38 +- EduNetworkBuilder/NB.cs | 48 ++ EduNetworkBuilder/NetTestEditor.cs | 580 +++++++++++------- EduNetworkBuilder/NetworkDevice.cs | 10 +- EduNetworkBuilder/OptionsWindow.cs | 3 +- .../Resources/languages/edustrings.resx | 12 + 9 files changed, 493 insertions(+), 233 deletions(-) diff --git a/EduNetworkBuilder/DeviceConfig.Designer.cs b/EduNetworkBuilder/DeviceConfig.Designer.cs index 6f0c864..55b0bb1 100644 --- a/EduNetworkBuilder/DeviceConfig.Designer.cs +++ b/EduNetworkBuilder/DeviceConfig.Designer.cs @@ -47,6 +47,7 @@ this.cbDHCP = new System.Windows.Forms.CheckBox(); this.btnDHCP = new System.Windows.Forms.Button(); this.btnVLAN = new System.Windows.Forms.Button(); + this.btnFirewall = new System.Windows.Forms.Button(); this.SuspendLayout(); // // tbHostname @@ -229,14 +230,24 @@ // // btnVLAN // - this.btnVLAN.Location = new System.Drawing.Point(182, 80); + this.btnVLAN.Location = new System.Drawing.Point(365, 55); this.btnVLAN.Name = "btnVLAN"; - this.btnVLAN.Size = new System.Drawing.Size(75, 23); + this.btnVLAN.Size = new System.Drawing.Size(94, 23); this.btnVLAN.TabIndex = 21; this.btnVLAN.Text = "VLANs"; this.btnVLAN.UseVisualStyleBackColor = true; this.btnVLAN.Click += new System.EventHandler(this.btnVLAN_Click); // + // btnFirewall + // + this.btnFirewall.Location = new System.Drawing.Point(251, 55); + this.btnFirewall.Name = "btnFirewall"; + this.btnFirewall.Size = new System.Drawing.Size(113, 23); + this.btnFirewall.TabIndex = 22; + this.btnFirewall.Text = "Firewall"; + this.btnFirewall.UseVisualStyleBackColor = true; + this.btnFirewall.Click += new System.EventHandler(this.btnFirewall_Click); + // // DeviceConfig // this.AcceptButton = this.btnOK; @@ -244,6 +255,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnCancel; this.ClientSize = new System.Drawing.Size(471, 365); + this.Controls.Add(this.btnFirewall); this.Controls.Add(this.btnVLAN); this.Controls.Add(this.btnDHCP); this.Controls.Add(this.cbDHCP); @@ -292,5 +304,6 @@ private System.Windows.Forms.CheckBox cbDHCP; private System.Windows.Forms.Button btnDHCP; private System.Windows.Forms.Button btnVLAN; + private System.Windows.Forms.Button btnFirewall; } } \ No newline at end of file diff --git a/EduNetworkBuilder/DeviceConfig.cs b/EduNetworkBuilder/DeviceConfig.cs index 8d63d35..e293ffb 100644 --- a/EduNetworkBuilder/DeviceConfig.cs +++ b/EduNetworkBuilder/DeviceConfig.cs @@ -56,7 +56,8 @@ namespace EduNetworkBuilder btnRoutes.Text = NB.Translate("DC_btnRoutes"); cbDHCP.Text = NB.Translate("DC_cbDHCP"); btnDHCP.Text = NB.Translate("_DHCP"); - btnVLAN.Text = NB.Translate("DC_btnVLAN"); + btnVLAN.Text = NB.Translate("DC_btnVLAN"); + btnFirewall.Text = NB.Translate("DC_btnFirewall"); Text = NB.Translate("DC_Form"); } @@ -95,6 +96,10 @@ namespace EduNetworkBuilder nicLocked = true; interfacesLocked = true; } + if (theNet.FirewallEnabled && ndCLonedItem.DoesFirewall()) + btnFirewall.Visible = true; + else + btnFirewall.Visible = false; if (lbNics.SelectedIndex != -1) { string nic_name = StripNicName(lbNics.SelectedItem.ToString()); @@ -512,5 +517,15 @@ namespace EduNetworkBuilder VLANConfig VLC = new VLANConfig((NetworkDevice)ClonedItem); VLC.ShowDialog(); } + + private void btnFirewall_Click(object sender, EventArgs e) + { + //Open a firewall editing window. + if (ClonedItem is NetworkDevice) + { + FirewallEditor FEditor = new FirewallEditor((NetworkDevice)ClonedItem); + FEditor.ShowDialog(); + } + } } } diff --git a/EduNetworkBuilder/EduNetworkBuilder.csproj b/EduNetworkBuilder/EduNetworkBuilder.csproj index 483fe8b..039eac2 100644 --- a/EduNetworkBuilder/EduNetworkBuilder.csproj +++ b/EduNetworkBuilder/EduNetworkBuilder.csproj @@ -244,7 +244,6 @@ - diff --git a/EduNetworkBuilder/FirewallEditor.cs b/EduNetworkBuilder/FirewallEditor.cs index 10ea049..6556264 100644 --- a/EduNetworkBuilder/FirewallEditor.cs +++ b/EduNetworkBuilder/FirewallEditor.cs @@ -7,23 +7,20 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using System.Xml; namespace EduNetworkBuilder { - public class FirewallRule - { - public string Source; - public string Destination; - public FirewallRuleType Action; - } - public partial class FirewallEditor : Form { - public FirewallEditor() + NetworkDevice FirewallDevice = null; + public FirewallEditor(NetworkDevice WhatToEdit) { InitializeComponent(); + FirewallDevice = WhatToEdit; UpdateForm(); + Icon = Properties.Resources.NBIco; } void UpdateForm() @@ -32,11 +29,32 @@ namespace EduNetworkBuilder btnDel.Visible = true; else btnDel.Visible = false; + int selected = lbRules.SelectedIndex; + lbRules.Items.Clear(); + foreach (FirewallRule FW in FirewallDevice.FirewallRules) + { + string OneLine = FW.Action.ToString() + " " + FW.Source + " -> " + FW.Destination; + lbRules.Items.Add(OneLine); + } + if (selected >= 0 && selected < lbRules.Items.Count) + lbRules.SelectedIndex = selected; + else + { + if (lbRules.Items.Count > 0) + lbRules.SelectedIndex = 0; + } } private void btnNew_Click(object sender, EventArgs e) { - + FirewallRule FW = new FirewallRule("","",FirewallRuleType.Drop); + NetTestEditor NTE = new NetTestEditor(FW,FirewallDevice); + NTE.ShowDialog(); + if(FW.Source!="" && FW.Destination != "") + { + FirewallDevice.FirewallRules.Add(FW); + } + UpdateForm(); } private void btnDel_Click(object sender, EventArgs e) @@ -46,7 +64,7 @@ namespace EduNetworkBuilder private void btnDone_Click(object sender, EventArgs e) { - + Close(); } } } diff --git a/EduNetworkBuilder/NB.cs b/EduNetworkBuilder/NB.cs index a953e05..b749900 100644 --- a/EduNetworkBuilder/NB.cs +++ b/EduNetworkBuilder/NB.cs @@ -230,6 +230,54 @@ namespace EduNetworkBuilder } } + [Serializable] + public class FirewallRule + { + public string Source; + public string Destination; + public FirewallRuleType Action; + + public FirewallRule(string source, string dest, FirewallRuleType action) + { + Source = source; + Destination = dest; + Action = action; + } + + public FirewallRule(XmlNode theNode) + { + foreach (XmlNode Individual in theNode.ChildNodes) + { + XmlNodeType myNodetype = Individual.NodeType; + if (myNodetype == XmlNodeType.Element) + { + switch (Individual.Name.ToLower()) + { + case "source": + Source = Individual.InnerText; + break; + case "destination": + Destination = Individual.InnerText; + break; + case "action": + Action = NB.ParseEnum(Individual.InnerText); + break; + } + } + } + } + + public void Save(XmlWriter writer, string tag) + { + writer.WriteStartElement(tag); + writer.WriteElementString("source", Source); + writer.WriteElementString("destination", Destination); + writer.WriteElementString("action", Action.ToString()); + writer.WriteEndElement(); + } + } + + class NB { diff --git a/EduNetworkBuilder/NetTestEditor.cs b/EduNetworkBuilder/NetTestEditor.cs index 65da075..1e93605 100644 --- a/EduNetworkBuilder/NetTestEditor.cs +++ b/EduNetworkBuilder/NetTestEditor.cs @@ -21,12 +21,18 @@ namespace EduNetworkBuilder List HostNames = new List(); List Networks = new List(); List Broadcasts = new List(); + List Interfaces = new List(); bool processing = false; + FirewallRule RuleToEdit; + FirewallRule OrigRule; + NetworkDevice FirewallDevice = null; + bool EditingFirewallRule = false; public NetTestEditor(NetTest WhatToEdit) { + EditingFirewallRule = false; InitializeComponent(); - LanguagifyComponents(); + LanguagifyTestComponents(); OrigTest = WhatToEdit; ToEdit = new NetTest(OrigTest); @@ -37,23 +43,65 @@ namespace EduNetworkBuilder UpdateForm(); } - private void LanguagifyComponents() + public NetTestEditor(FirewallRule WhatToEdit, NetworkDevice DeviceWorkingOn) { - Text = NB.Translate("NTE_lblSource"); - Text = NB.Translate("NTE_lblTest"); - Text = NB.Translate("NTE_lblDest"); - Text = NB.Translate("_Done"); - Text = NB.Translate("_Cancel"); + EditingFirewallRule = true; + InitializeComponent(); + LanguagifyFWComponents(); + OrigRule = WhatToEdit; + FirewallDevice = DeviceWorkingOn; + RuleToEdit = new FirewallRule(OrigRule.Source, OrigRule.Destination, OrigRule.Action); + // Make a list of all interfaces on this device + foreach (string nname in DeviceWorkingOn.NICNames()) + { + NetworkCard nic = DeviceWorkingOn.NicFromName(nname); + for (int i = 0; i < nic.IFCount; i++) + { + NetworkInterface nif = nic.GetInterface(i); + Interfaces.Add(nif.nic_name); + } + } + if (Interfaces.Count < 2) + { + //we cannot do firewalling on a device that has one or zero interfaces. + Close(); + } + UpdateForm(); + } + + private void LanguagifyTestComponents() + { + lblSource.Text = NB.Translate("NTE_lblSource"); + lblTest.Text = NB.Translate("NTE_lblTest"); + lblDest.Text = NB.Translate("NTE_lblDest"); + btnOK.Text = NB.Translate("_Done"); + btnCancel.Text = NB.Translate("_Cancel"); Text = NB.Translate("NTE_Form"); } + private void LanguagifyFWComponents() + { + LanguagifyTestComponents(); + lblTest.Text = NB.Translate("NTE_lblTestFW"); + } + private void btnOK_Click(object sender, EventArgs e) { - OrigTest.UpdateValuesFromAnother(ToEdit); - OrigTest.TaskWasDone = false; //We edited it. Set it to false - OrigTest.SetInitialDoneState(); //Set some of them to true (locked. etc) - Close(); + if (EditingFirewallRule) + { + OrigRule.Destination = RuleToEdit.Destination; + OrigRule.Source = RuleToEdit.Source; + OrigRule.Action = RuleToEdit.Action; + Close(); + } + else + { + OrigTest.UpdateValuesFromAnother(ToEdit); + OrigTest.TaskWasDone = false; //We edited it. Set it to false + OrigTest.SetInitialDoneState(); //Set some of them to true (locked. etc) + Close(); + } } private void btnCancel_Click(object sender, EventArgs e) @@ -65,202 +113,256 @@ namespace EduNetworkBuilder { NetworkDevice sItem; processing = true; + List tList = new List(); + Network theNet = NB.GetNetwork(); //We add all the hostnames as source - cbSource.Items.Clear(); - foreach(string host in HostNames) - { - cbSource.Items.Add(host); - } - - //The tests are just the list of available tests. - cbTest.Items.Clear(); - List tList = new List(); - foreach (string test in Enum.GetNames(typeof(NetTestType))) - { - tList.Add(test); - } - tList.Sort(); //Sort them alphabetically. Just to make things easier - foreach (string test in tList) - { - cbTest.Items.Add(test); - } - - cbDest.Items.Clear(); - if (ToEdit.TheTest == NetTestType.NeedsRouteToNet) - { //List all the networks - foreach (string subnet in Networks) - { - cbDest.Items.Add(subnet); - } - } - else if (ToEdit.TheTest == NetTestType.DHCPServerEnabled) - { - cbDest.Items.Add(true.ToString()); - cbDest.Items.Add(false.ToString()); - } - else if (ToEdit.TheTest == NetTestType.HelpRequest) - { - foreach (string HelpLevel in Enum.GetNames(typeof(NetTestVerbosity))) - { - cbDest.Items.Add(HelpLevel); - } - cbDest.Items.Add("?Button"); - cbDest.Items.Add("ViewButton"); - } - else if (ToEdit.TheTest == NetTestType.ReadContextHelp) + if (EditingFirewallRule) { cbSource.Items.Clear(); - List theNames = new List(); - theNames.AddRange(Enum.GetNames(typeof(HelpTopics))); - theNames.Sort(); - theNames.Remove("None"); - foreach (string ContextHelp in theNames) + cbDest.Items.Clear(); + cbTest.Items.Clear(); + + foreach (string one in Interfaces) { - cbSource.Items.Add(ContextHelp); + if (one != RuleToEdit.Destination) + cbSource.Items.Add(one); //We add all of them except the selected destination + if (one != RuleToEdit.Source) + cbDest.Items.Add(one); //We add all of them except the selected source } - cbDest.Items.Add(NB.Translate("_Read")); - } - else if (ToEdit.TheTest == NetTestType.LockAll || ToEdit.TheTest == NetTestType.LockGateway) - { - cbDest.Items.Add(NB.Translate("_All")); - } - else if (ToEdit.TheTest == NetTestType.LockDHCP) - { - //return all the dhcp ranges - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach(string ip in sItem.DHCPStrings(false)) + foreach (string test in Enum.GetNames(typeof(FirewallRuleType))) { - cbDest.Items.Add(ip); + tList.Add(test); } - } - else if (ToEdit.TheTest == NetTestType.LockIP) - { - //return all the dhcp ranges - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach (IPAddress ip in sItem.IPAddressList()) + tList.Sort(); //Sort them alphabetically. Just to make things easier + foreach (string test in tList) { - cbDest.Items.Add(ip.GetIPString); + cbTest.Items.Add(test); } - } - else if (ToEdit.TheTest == NetTestType.LockRoute) - { - //return all the dhcp ranges - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach (IPAddress ip in sItem.ListRoutes()) + //select the current stuff + if (cbSource.Items.Contains(RuleToEdit.Source)) { - cbDest.Items.Add(ip.GetIPString); + cbSource.SelectedItem = RuleToEdit.Source; } - } - else if (ToEdit.TheTest == NetTestType.LockNic) - { - //return all the dhcp ranges - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach (string nname in sItem.NICNames()) + else { - cbDest.Items.Add(nname); + if (cbSource.Items.Count > 0) + cbSource.SelectedIndex = 0; //select the first item } - } - else if(ToEdit.TheTest == NetTestType.LockVLANNames) - { - //No items for lockvlannames - cbDest.Items.Add(NB.Translate("_All")); - cbSource.Items.Clear(); - cbSource.Items.Add(NB.Translate("_All")); - } - else if (ToEdit.TheTest == NetTestType.LockNicVLAN) - { - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach (string nname in sItem.NICNames()) + + if (cbDest.Items.Contains(RuleToEdit.Source)) { - NetworkCard nic = sItem.NicFromName(nname); - if (!nic.NicCanDoVLANs()) continue; - cbDest.Items.Add(nic.NicName()); + cbDest.SelectedItem = RuleToEdit.Source; } - } - else if (ToEdit.TheTest == NetTestType.LockVLANsOnHost) - { - //No items for lockvlannames - cbDest.Items.Add(NB.Translate("_All")); - } - else if (ToEdit.TheTest == NetTestType.LockInterfaceVLAN) - { - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach (string nname in sItem.NICNames()) + else { - NetworkCard nic = sItem.NicFromName(nname); - if (!nic.NicCanDoVLANs()) continue; - for (int i = 0; i < nic.IFCount; i++) - { - NetworkInterface nif = nic.GetInterface(i); - cbDest.Items.Add(nif.nic_name); - } + if (cbDest.Items.Count > 0) + cbDest.SelectedIndex = 0; //select the first item } - } - else if (ToEdit.TheTest == NetTestType.NeedsForbiddenVLAN || - ToEdit.TheTest == NetTestType.NeedsTaggedVLAN || - ToEdit.TheTest == NetTestType.NeedsUntaggedVLAN ) - { - sItem = theNet.GetDeviceFromName(ToEdit.sHost); - foreach (string nname in sItem.NICNames()) + + if (cbTest.Items.Contains(RuleToEdit.Action.ToString())) { - NetworkCard nic = sItem.NicFromName(nname); - if (!nic.NicCanDoVLANs()) continue; - for (int i = 0; i < nic.IFCount; i++) - { - NetworkInterface nif = nic.GetInterface(i); - foreach (VLANName vn in theNet.VlanNames) - { - cbDest.Items.Add(nif.nic_name + " - " + vn.ID.ToString()); - } - } + cbTest.SelectedItem = RuleToEdit.Action.ToString(); } + else + cbTest.SelectedIndex = 0;//select first item } else - { //List all the hosts + { + cbSource.Items.Clear(); foreach (string host in HostNames) { - cbDest.Items.Add(host); + cbSource.Items.Add(host); } - if (ToEdit.TheTest == NetTestType.SuccessfullyPings) - { //List all the network broadcasts - foreach (string subnet in Broadcasts) + //The tests are just the list of available tests. + cbTest.Items.Clear(); + foreach (string test in Enum.GetNames(typeof(NetTestType))) + { + tList.Add(test); + } + tList.Sort(); //Sort them alphabetically. Just to make things easier + foreach (string test in tList) + { + cbTest.Items.Add(test); + } + + cbDest.Items.Clear(); + if (ToEdit.TheTest == NetTestType.NeedsRouteToNet) + { //List all the networks + foreach (string subnet in Networks) { cbDest.Items.Add(subnet); } } - } + else if (ToEdit.TheTest == NetTestType.DHCPServerEnabled) + { + cbDest.Items.Add(true.ToString()); + cbDest.Items.Add(false.ToString()); + } + else if (ToEdit.TheTest == NetTestType.HelpRequest) + { + foreach (string HelpLevel in Enum.GetNames(typeof(NetTestVerbosity))) + { + cbDest.Items.Add(HelpLevel); + } + cbDest.Items.Add("?Button"); + cbDest.Items.Add("ViewButton"); + } + else if (ToEdit.TheTest == NetTestType.ReadContextHelp) + { + cbSource.Items.Clear(); + List theNames = new List(); + theNames.AddRange(Enum.GetNames(typeof(HelpTopics))); + theNames.Sort(); + theNames.Remove("None"); + foreach (string ContextHelp in theNames) + { + cbSource.Items.Add(ContextHelp); + } + cbDest.Items.Add(NB.Translate("_Read")); + } + else if (ToEdit.TheTest == NetTestType.LockAll || ToEdit.TheTest == NetTestType.LockGateway) + { + cbDest.Items.Add(NB.Translate("_All")); + } + else if (ToEdit.TheTest == NetTestType.LockDHCP) + { + //return all the dhcp ranges + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (string ip in sItem.DHCPStrings(false)) + { + cbDest.Items.Add(ip); + } + } + else if (ToEdit.TheTest == NetTestType.LockIP) + { + //return all the dhcp ranges + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (IPAddress ip in sItem.IPAddressList()) + { + cbDest.Items.Add(ip.GetIPString); + } + } + else if (ToEdit.TheTest == NetTestType.LockRoute) + { + //return all the dhcp ranges + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (IPAddress ip in sItem.ListRoutes()) + { + cbDest.Items.Add(ip.GetIPString); + } + } + else if (ToEdit.TheTest == NetTestType.LockNic) + { + //return all the dhcp ranges + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (string nname in sItem.NICNames()) + { + cbDest.Items.Add(nname); + } + } + else if (ToEdit.TheTest == NetTestType.LockVLANNames) + { + //No items for lockvlannames + cbDest.Items.Add(NB.Translate("_All")); + cbSource.Items.Clear(); + cbSource.Items.Add(NB.Translate("_All")); + } + else if (ToEdit.TheTest == NetTestType.LockNicVLAN) + { + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (string nname in sItem.NICNames()) + { + NetworkCard nic = sItem.NicFromName(nname); + if (!nic.NicCanDoVLANs()) continue; + cbDest.Items.Add(nic.NicName()); + } + } + else if (ToEdit.TheTest == NetTestType.LockVLANsOnHost) + { + //No items for lockvlannames + cbDest.Items.Add(NB.Translate("_All")); + } + else if (ToEdit.TheTest == NetTestType.LockInterfaceVLAN) + { + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (string nname in sItem.NICNames()) + { + NetworkCard nic = sItem.NicFromName(nname); + if (!nic.NicCanDoVLANs()) continue; + for (int i = 0; i < nic.IFCount; i++) + { + NetworkInterface nif = nic.GetInterface(i); + cbDest.Items.Add(nif.nic_name); + } + } + } + else if (ToEdit.TheTest == NetTestType.NeedsForbiddenVLAN || + ToEdit.TheTest == NetTestType.NeedsTaggedVLAN || + ToEdit.TheTest == NetTestType.NeedsUntaggedVLAN) + { + sItem = theNet.GetDeviceFromName(ToEdit.sHost); + foreach (string nname in sItem.NICNames()) + { + NetworkCard nic = sItem.NicFromName(nname); + if (!nic.NicCanDoVLANs()) continue; + for (int i = 0; i < nic.IFCount; i++) + { + NetworkInterface nif = nic.GetInterface(i); + foreach (VLANName vn in theNet.VlanNames) + { + cbDest.Items.Add(nif.nic_name + " - " + vn.ID.ToString()); + } + } + } + } + else + { //List all the hosts + foreach (string host in HostNames) + { + cbDest.Items.Add(host); + } - //Now we select all the appropriate items. - if(cbSource.Items.Contains(ToEdit.sHost)) - { - cbSource.SelectedItem = ToEdit.sHost; - } - else - { - if(cbSource.Items.Count > 0) - cbSource.SelectedIndex = 0; //select the first item - } + if (ToEdit.TheTest == NetTestType.SuccessfullyPings) + { //List all the network broadcasts + foreach (string subnet in Broadcasts) + { + cbDest.Items.Add(subnet); + } + } + } - if (cbDest.Items.Contains(ToEdit.dHost)) - { - cbDest.SelectedItem = ToEdit.dHost; - } - else - { - if (cbDest.Items.Count > 0) - cbDest.SelectedIndex = 0; //select the first item - } + //Now we select all the appropriate items. + if (cbSource.Items.Contains(ToEdit.sHost)) + { + cbSource.SelectedItem = ToEdit.sHost; + } + else + { + if (cbSource.Items.Count > 0) + cbSource.SelectedIndex = 0; //select the first item + } - if (cbTest.Items.Contains(ToEdit.TheTest.ToString())) - { - cbTest.SelectedItem = ToEdit.TheTest.ToString(); - } - else - { - if (cbTest.Items.Count > 0) - cbTest.SelectedIndex = 0; //select the first item + if (cbDest.Items.Contains(ToEdit.dHost)) + { + cbDest.SelectedItem = ToEdit.dHost; + } + else + { + if (cbDest.Items.Count > 0) + cbDest.SelectedIndex = 0; //select the first item + } + + if (cbTest.Items.Contains(ToEdit.TheTest.ToString())) + { + cbTest.SelectedItem = ToEdit.TheTest.ToString(); + } + else + { + if (cbTest.Items.Count > 0) + cbTest.SelectedIndex = 0; //select the first item + } } processing = false; } @@ -274,77 +376,121 @@ namespace EduNetworkBuilder { if (processing) return true; //If we are processing, we are all OK. Network theNet = NB.GetNetwork(); - NetTestType ntt = NB.ParseEnum(cbTest.SelectedItem.ToString()); - if (ntt == NetTestType.ReadContextHelp) return true; - if (ntt == NetTestType.DHCPServerEnabled) return true; - if (cbSource.SelectedItem.ToString() == cbDest.SelectedItem.ToString() && ntt != NetTestType.HelpRequest) - return false; //Source cannot equal dest - if (theNet.GetDeviceFromName(cbSource.SelectedItem.ToString()) == null) - return false; //This should never happen with a drop-down list, but just in case... - if (ntt == NetTestType.LockAll || ntt == NetTestType.LockDHCP || ntt == NetTestType.LockIP || - ntt == NetTestType.LockNic || ntt == NetTestType.LockRoute) + if (EditingFirewallRule) + { + //The source cannot be the dest. + //The values need to exist return true; - if (ntt == NetTestType.NeedsRouteToNet) - { - //We should have a network, not a host. - } - else if (ntt == NetTestType.HelpRequest) - { - //This uses a verbosity - } - else if (ntt == NetTestType.LockInterfaceVLAN || ntt == NetTestType.LockNicVLAN || - ntt == NetTestType.LockVLANNames || ntt == NetTestType.LockVLANsOnHost) - { - return true; - } - else if (ntt == NetTestType.NeedsUntaggedVLAN || ntt == NetTestType.NeedsTaggedVLAN || - ntt == NetTestType.NeedsForbiddenVLAN) - { - //We have an interface and a network ID. Verify they exist - if (cbDest.SelectedIndex < 0) return false; - Match result = Regex.Match(cbDest.SelectedItem.ToString(), @"(?[A-z:0-9]+) - (?\d+)"); - if (result.Groups["interface"] != null && result.Groups["id"] != null) - return true; - return false; } else { - if (ntt == NetTestType.SuccessfullyPings) return true; - if (theNet.GetDeviceFromName(cbDest.SelectedItem.ToString()) == null) + NetTestType ntt = NB.ParseEnum(cbTest.SelectedItem.ToString()); + if (ntt == NetTestType.ReadContextHelp) return true; + if (ntt == NetTestType.DHCPServerEnabled) return true; + if (cbSource.SelectedItem.ToString() == cbDest.SelectedItem.ToString() && ntt != NetTestType.HelpRequest) + return false; //Source cannot equal dest + if (theNet.GetDeviceFromName(cbSource.SelectedItem.ToString()) == null) return false; //This should never happen with a drop-down list, but just in case... + if (ntt == NetTestType.LockAll || ntt == NetTestType.LockDHCP || ntt == NetTestType.LockIP || + ntt == NetTestType.LockNic || ntt == NetTestType.LockRoute) + return true; + if (ntt == NetTestType.NeedsRouteToNet) + { + //We should have a network, not a host. + } + else if (ntt == NetTestType.HelpRequest) + { + //This uses a verbosity + } + else if (ntt == NetTestType.LockInterfaceVLAN || ntt == NetTestType.LockNicVLAN || + ntt == NetTestType.LockVLANNames || ntt == NetTestType.LockVLANsOnHost) + { + return true; + } + else if (ntt == NetTestType.NeedsUntaggedVLAN || ntt == NetTestType.NeedsTaggedVLAN || + ntt == NetTestType.NeedsForbiddenVLAN) + { + //We have an interface and a network ID. Verify they exist + if (cbDest.SelectedIndex < 0) return false; + Match result = Regex.Match(cbDest.SelectedItem.ToString(), @"(?[A-z:0-9]+) - (?\d+)"); + if (result.Groups["interface"] != null && result.Groups["id"] != null) + return true; + return false; + } + else + { + if (ntt == NetTestType.SuccessfullyPings) return true; + if (theNet.GetDeviceFromName(cbDest.SelectedItem.ToString()) == null) + return false; //This should never happen with a drop-down list, but just in case... + } } return true; } private void cbTest_SelectedValueChanged(object sender, EventArgs e) { - + if (EditingFirewallRule) + { + RuleToEdit.Action = NB.ParseEnum(cbTest.SelectedItem.ToString()); + if (!processing) + UpdateForm(); + } + else + { ToEdit.TheTest = NB.ParseEnum(cbTest.SelectedItem.ToString()); - if (!processing) - UpdateForm(); - + if (!processing) + UpdateForm(); + } } private void cbSource_SelectedValueChanged(object sender, EventArgs e) { - if (validate_choices()) + if (EditingFirewallRule) { - ToEdit.sHost = cbSource.SelectedItem.ToString(); + if (validate_choices()) + { + RuleToEdit.Source = cbSource.SelectedItem.ToString(); + if (!processing) UpdateForm(); + } + else + if (!processing) + UpdateForm(); } else - if (!processing) + { + if (validate_choices()) + { + ToEdit.sHost = cbSource.SelectedItem.ToString(); + } + else + if (!processing) UpdateForm(); + } } private void cbDest_SelectedValueChanged(object sender, EventArgs e) { - if (validate_choices()) + if (EditingFirewallRule) { - ToEdit.dHost = cbDest.SelectedItem.ToString(); + if (validate_choices()) + { + RuleToEdit.Destination = cbDest.SelectedItem.ToString(); + if (!processing) UpdateForm(); + } + else + if (!processing) + UpdateForm(); } else - if (!processing) + { + if (validate_choices()) + { + ToEdit.dHost = cbDest.SelectedItem.ToString(); + } + else + if (!processing) UpdateForm(); + } } } } diff --git a/EduNetworkBuilder/NetworkDevice.cs b/EduNetworkBuilder/NetworkDevice.cs index 09c74f6..9b9e5d3 100644 --- a/EduNetworkBuilder/NetworkDevice.cs +++ b/EduNetworkBuilder/NetworkDevice.cs @@ -33,7 +33,7 @@ namespace EduNetworkBuilder public bool CanAddNics = false; public Color BackgroundColor = Color.Empty; protected Color MorphColor = Color.Empty; - protected List FirewallRules = new List(); + public List FirewallRules = new List(); public NetworkDevice(NetworkComponentType what, string tHostname, Point tLocation, NicType firstNic = NicType.eth) { @@ -373,6 +373,10 @@ namespace EduNetworkBuilder IPAddress dhcpip = new IPAddress(Individual); DHCPRanges.Add(dhcpip); break; + case "firwallrule": + FirewallRule fwr = new FirewallRule(Individual); + FirewallRules.Add(fwr); + break; case "morphcolor": MorphColor = Color.FromName(Individual.InnerText); break; @@ -407,6 +411,10 @@ namespace EduNetworkBuilder { dhcp.Save(writer, "dhcprange"); } + foreach (FirewallRule fwr in FirewallRules) + { + fwr.Save(writer, "firewallrule"); + } writer.WriteEndElement(); } diff --git a/EduNetworkBuilder/OptionsWindow.cs b/EduNetworkBuilder/OptionsWindow.cs index b51030d..a353caf 100644 --- a/EduNetworkBuilder/OptionsWindow.cs +++ b/EduNetworkBuilder/OptionsWindow.cs @@ -65,6 +65,7 @@ namespace EduNetworkBuilder lblStartingHelp.Text = NB.Translate("OW_lblStartingHelp"); cbVLANs.Text = NB.Translate("OW_cbVLANs"); cb_ColoredPackets.Text = NB.Translate("OW_OWVLANColoredPackets"); + cbFirewallEnabled.Text = NB.Translate("OW_cbFirewallEnabled"); Text = NB.Translate("OW_Form"); } @@ -105,7 +106,7 @@ namespace EduNetworkBuilder cbStartingHelpLevel.Items.Add(helplevel); } cbStartingHelpLevel.SelectedItem = myNet.StartingHelpLevel.ToString(); - + cbVLANs_CheckedChanged(this, EventArgs.Empty); } private void SaveValuesToNetwork() diff --git a/EduNetworkBuilder/Resources/languages/edustrings.resx b/EduNetworkBuilder/Resources/languages/edustrings.resx index c336a40..651ee14 100644 --- a/EduNetworkBuilder/Resources/languages/edustrings.resx +++ b/EduNetworkBuilder/Resources/languages/edustrings.resx @@ -1609,6 +1609,10 @@ When packets are passing across a VLAN link, color the packets so we can visualize them better. OW_OWVLANColoredPacketsTT = When packets are passing across a VLAN link, color the packets so we can visualize them better. + + Firewall + DC_btnFirewall = Firewall + Locked Out. Cannot determine settings for this device. NB_LockedOut = Locked Out. Cannot determine settings for this device. @@ -1621,4 +1625,12 @@ ERROR: Packet forbidden by Management Interface VLAN ND_PrepPackVLANErr = ERROR: Packet forbidden by Management Interface VLAN + + Action + NTE_lblTestFW = Action + + + Adv. Firewall Enabled + OW_cbFirewallEnabled = Adv. Firewall Enabled + \ No newline at end of file