using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Globalization; using System.Xml; using System.Windows.Forms; using System.Text.RegularExpressions; using System.Net; namespace EduNetworkBuilder { [Serializable] public class NB_IPAddress { public UInt32 _ip; public UInt32 _mask; public UInt32 _gw; public IPAddressType myType; //Add in new values for the IP, Netmask, and gateway. Will start migrating to use these. private IPAddress theIP; private IPAddress theNetmask; private IPAddress theGateway; public NB_IPAddress() { } //used for reflection /// /// Duplicate an IP address structure /// /// public NB_IPAddress(NB_IPAddress Orig) { _ip = Orig._ip; _mask = Orig._mask; _gw = Orig._gw; myType = Orig.myType; theIP = Orig.theIP; theNetmask = Orig.theNetmask; theGateway = Orig.theGateway; } public NB_IPAddress(string ip, string mask, IPAddressType WhatType) { myType = WhatType; _ip = ip.ParseIp(); _mask = mask.ParseIp(); } public NB_IPAddress(string ip, string mask, string gw) { myType = IPAddressType.route; _ip = ip.ParseIp(); _mask = mask.ParseIp(); _gw = gw.ParseIp(); } public NB_IPAddress(XmlNode theNode) { foreach (XmlNode Individual in theNode.ChildNodes) { XmlNodeType myNodetype = Individual.NodeType; if (myNodetype == XmlNodeType.Element) { switch (Individual.Name.ToLower()) { case "ip": _ip = Individual.InnerText.ParseIp(); break; case "mask": _mask = Individual.InnerText.ParseIp(); break; case "gateway": _gw = Individual.InnerText.ParseIp(); break; case "type": myType = NB.ParseEnum(Individual.InnerText); break; } } } } public bool Equals(NB_IPAddress CompareWith) { if (_ip != CompareWith._ip) return false; if (_mask != CompareWith._mask) return false; if (_gw != CompareWith._gw) return false; if (myType != CompareWith.myType) return false; return true; } public void Save(XmlWriter writer, string tag) { writer.WriteStartElement(tag); writer.WriteElementString("ip", _ip.ToIpString()); writer.WriteElementString("mask", _mask.ToIpString()); writer.WriteElementString("gateway", _gw.ToIpString()); writer.WriteElementString("type", myType.ToString()); writer.WriteEndElement(); } public void Reparse(string ip, string mask, string gw) { _ip = ip.ParseIp(); _mask = mask.ParseIp(); _gw = gw.ParseIp(); } public void Reparse(string ip, string mask) { _ip = ip.ParseIp(); _mask = mask.ParseIp(); } public IPAddressType GetAddressType { get { return myType; } } public bool IsLocal(NB_IPAddress dest) { if (dest == null) return false; UInt32 answer = dest.GetIP & _mask; if ((dest.GetIP & _mask) == NetworkAddress) return true; return false; } public bool Edit(NetworkDevice FromWhat, Form ParentForm, string message="", bool JustPinging = false) { IPAddressEntry IPe = new IPAddressEntry(this, FromWhat, ParentForm, JustPinging); if (message != "") IPe.Text = message; return IPe.Edit(); } public bool Edit(NetworkDevice FromWhat, NB_IPAddress DHCPif, Form ParentForm, bool JustPinging = false) { IPAddressEntry IPe = new IPAddressEntry(this, FromWhat, ParentForm, JustPinging); return IPe.Edit(FromWhat, DHCPif); } public NB_IPAddress(string ip) { if (ip == null) ip = NB.ZeroIPString; myType = IPAddressType.ip; _ip = ip.ParseIp(); var mySplitVal = ip.Split('/'); if (mySplitVal.Count() < 2) { //We do not have a cidr. We need to guess //For now, use 255.255.255.0 _mask = "255.255.255.0".ParseIp(); mySplitVal = ip.Split('.'); if(mySplitVal.Count() > 0) { //If it is not one of these three, we already use 255.255.255.0 if(mySplitVal[0] == "10") { _mask = "255.0.0.0".ParseIp(); } if (mySplitVal[0] == "172") { _mask = "255.255.0.0".ParseIp(); } if (mySplitVal[0] == "192") { _mask = "255.255.255.0".ParseIp(); } } } else { _mask = MaskNumFromCIDRString(mySplitVal[1]); } } static UInt32 MaskNumFromCIDRString(string cidr) { UInt32 tInt = 0; int cdr; int.TryParse(cidr, out cdr); for (int loop = 0; loop < 32; loop++) { tInt = (tInt << 1); if (loop < cdr) tInt++; } return tInt; } public bool Equals(UInt32 IP) { return IP == _ip; } public bool Equals(UInt32 IP, UInt32 mask) { return (IP == _ip && mask == _mask); } public UInt32 NumberOfHosts { get { return ~_mask + 1; } } public UInt32 GetIP { get { return _ip; } } public string GetIPString { get { return _ip.ToIpString(); } } public string GetBroadcastString { get { return BroadcastAddress.ToIpString(); } } public string GetMaskString { get { return _mask.ToIpString(); } } public UInt32 GetMask { get { return _mask; } } public UInt32 GetGateway { get { return _gw; } } public UInt32 NetworkAddress { get { return _ip & _mask; } } public UInt32 BroadcastAddress { get { return NetworkAddress + ~_mask; } } public IEnumerable Hosts() { for (var host = NetworkAddress + 1; host < BroadcastAddress; host++) { yield return host; } } public string IPFormat() { return IPFormat(_gw.ToIpString()); } public string PadIt(string Addr) { string myaddr = Addr.PadRight(12); return myaddr; } public string IPFormat(string gw) { string tstring = string.Format(NB.Translate("IPA_IPFormatStr"), PadIt(_ip.ToIpString()), PadIt(_mask.ToIpString()), PadIt(gw)); return tstring; } /// /// Return the CIDR number for this address. This is the number of 1s before the first 0 /// /// public int CIDRNumber() { string mask = GetMask.ToBitString(); mask = Regex.Replace(mask, "0", ""); return mask.Length; } /// /// Return true if the subnet mask is really a true CIDR string /8, /16, etc. /// It is false if the subnet mask creates a mask that does not map to CIDR. For /// example, 255.255.255.250 is not a real subnet mask. 252 is. /// /// True if there are no 1s after the first 0 public bool ValidCIDR() { int cidr = CIDRNumber(); UInt32 tMask = MaskNumFromCIDRString(cidr.ToString()); if (tMask == _mask) return true; return false; } #region Break an IP public string GenRandomIPOrMask() { Random rnd = NB.GetRandom(); int mask1 = rnd.Next(256); int mask2 = rnd.Next(256); int mask3 = rnd.Next(256); int mask4 = rnd.Next(256); string answer = mask1 + "." + mask2 + "." + mask3 + "." + mask4; return answer; } public string randomizeOctects(string original) { string[] parts = original.Split('.'); if (original == NB.ZeroIPString) return original; if (parts.Count() == 4 && parts[0] == parts[1] && parts[1] == parts[2] && parts[2] == parts[3]) return original; bool done = false; List toRandomize = new List(parts); List randomized = new List(); string neworder = ""; while (!done) { randomized = NB.Randomize(toRandomize); neworder = string.Join(".", randomized.ToArray()); if(neworder != original) done = true; } return neworder; } public NB_IPAddress BreakIPNetmaskZero() { NB_IPAddress one = new NB_IPAddress(GetIPString, "0.0.0.0", myType); return one; } public NB_IPAddress BreakIPNetmask32() { NB_IPAddress one = new NB_IPAddress(GetIPString, "255.255.255.255", myType); return one; } public NB_IPAddress BreakIPNetmaskRandom() { string randomMask = ""; do { randomMask = GenRandomIPOrMask(); } while (randomMask == GetMaskString); NB_IPAddress one = new NB_IPAddress(GetIPString, randomMask, myType); return one; } public NB_IPAddress BreakIPNetmaskMangle() { string newmask = randomizeOctects(GetMaskString); NB_IPAddress one = new NB_IPAddress(GetIPString, newmask, myType); return one; } public NB_IPAddress BreakIPAddressZero() { NB_IPAddress one = new NB_IPAddress("0.0.0.0", GetIPString, myType); return one; } public NB_IPAddress BreakIPAddress32() { NB_IPAddress one = new NB_IPAddress("255.255.255.255", GetIPString, myType); return one; } public NB_IPAddress BreakIPAddressRandom() { string randomIP = ""; do { randomIP = GenRandomIPOrMask(); } while (randomIP == GetMaskString); NB_IPAddress one = new NB_IPAddress(randomIP, GetMaskString, myType); return one; } public NB_IPAddress BreakIPAddressMangle() { string newip = randomizeOctects(GetMaskString); NB_IPAddress one = new NB_IPAddress(newip, GetMaskString, myType); return one; } #endregion } public static class IpHelpers { public static string ToIpString(this UInt32 value) { var bitmask = 0xff000000; var parts = new string[4]; for (var i = 0; i < 4; i++) { var masked = (value & bitmask) >> ((3 - i) * 8); bitmask >>= 8; parts[i] = masked.ToString(CultureInfo.InvariantCulture); } return String.Join(".", parts); } public static string ToBitString(this UInt32 value) { var item = System.Convert.ToString(value, 2); return (string)item; } public static UInt32 ParseIp(this string ipAddress) { if (ipAddress == null) ipAddress = ""; var gw = ipAddress.Split('/'); //Pull off any cdr var mySplitVal = gw[0].Split('.'); if (mySplitVal.Count() != 4) return 0; UInt32 ip = 0; uint part; if (mySplitVal.Count() == 4) { for (var i = 0; i < 4; i++) { part = 0; UInt32.TryParse(mySplitVal[i], out part); ip = (ip << 8) + part; } } return ip; } } }