public async Task Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint) { if (localAddress == null) { throw new ArgumentNullException("localAddress"); } try { /* For UPnP Port Mapping we need ot find either WANPPPConnection or WANIPConnection. * Any other device type is no good to us for this purpose. See the IGP overview paper * page 5 for an overview of device types and their hierarchy. * http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf */ /* TODO: Currently we are assuming version 1 of the protocol. We should figure out which * version it is and apply the correct URN. */ /* Some routers don't correctly implement the version ID on the URN, so we only search for the type * prefix. */ // We have an internet gateway device now UpnpNatDevice d = new UpnpNatDevice(localAddress, deviceInfo, endpoint, string.Empty, _logger, _httpClient); await d.GetServicesList().ConfigureAwait(false); OnDeviceFound(new DeviceEventArgs(d)); } catch (Exception ex) { _logger.LogError(ex, "Error decoding device response"); } }
public void Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint) { // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. try { /* For UPnP Port Mapping we need ot find either WANPPPConnection or WANIPConnection. * Any other device type is no good to us for this purpose. See the IGP overview paper * page 5 for an overview of device types and their hierarchy. * http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf */ /* TODO: Currently we are assuming version 1 of the protocol. We should figure out which * version it is and apply the correct URN. */ /* Some routers don't correctly implement the version ID on the URN, so we only search for the type * prefix. */ // We have an internet gateway device now UpnpNatDevice d = new UpnpNatDevice(localAddress, deviceInfo, endpoint, string.Empty, _logger, _httpClient); NatUtility.Log("Fetching service list: {0}", d.HostEndPoint); OnDeviceFound(new DeviceEventArgs(d)); } catch (Exception ex) { _logger.ErrorException("Error decoding device response", ex); } }
public void Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint) { // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. try { /* For UPnP Port Mapping we need ot find either WANPPPConnection or WANIPConnection. * Any other device type is no good to us for this purpose. See the IGP overview paper * page 5 for an overview of device types and their hierarchy. * http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf */ /* TODO: Currently we are assuming version 1 of the protocol. We should figure out which * version it is and apply the correct URN. */ /* Some routers don't correctly implement the version ID on the URN, so we only search for the type * prefix. */ // We have an internet gateway device now UpnpNatDevice d = new UpnpNatDevice(localAddress, deviceInfo, endpoint, string.Empty); if (devices.Contains(d)) { // We already have found this device, so we just refresh it to let people know it's // Still alive. If a device doesn't respond to a search, we dump it. devices[devices.IndexOf(d)].LastSeen = DateTime.Now; } else { // If we send 3 requests at a time, ensure we only fetch the services list once // even if three responses are received if (lastFetched.ContainsKey(endpoint.Address)) { DateTime last = lastFetched[endpoint.Address]; if ((DateTime.Now - last) < TimeSpan.FromSeconds(20)) { return; } } lastFetched[endpoint.Address] = DateTime.Now; // Once we've parsed the information we need, we tell the device to retrieve it's service list // Once we successfully receive the service list, the callback provided will be invoked. NatUtility.Log("Fetching service list: {0}", d.HostEndPoint); d.GetServicesList(DeviceSetupComplete); } } catch (Exception ex) { NatUtility.Log("Unhandled exception when trying to decode a device's response Send me the following data: "); NatUtility.Log("ErrorMessage:"); NatUtility.Log(ex.Message); } }
public void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint) { // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. try { UpnpNatDevice d = base.Handle(localAddress, response, endpoint); d.GetServicesList(DeviceSetupComplete); } catch (Exception ex) { Trace.WriteLine("Unhandled exception when trying to decode a device's response Send me the following data: "); Trace.WriteLine("ErrorMessage:"); Trace.WriteLine(ex.Message); Trace.WriteLine("Data string:"); Trace.WriteLine(Encoding.UTF8.GetString(response)); } }
public static MessageBase Decode(UpnpNatDevice device, string message) { XmlNode node; XmlDocument doc = new XmlDocument(); doc.LoadXml(message); XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable); // Error messages should be found under this namespace nsm.AddNamespace("errorNs", "urn:schemas-upnp-org:control-1-0"); nsm.AddNamespace("responseNs", device.ServiceType); // Check to see if we have a fault code message. if ((node = doc.SelectSingleNode("//errorNs:UPnPError", nsm)) != null) { string errorCode = node["errorCode"] != null ? node["errorCode"].InnerText : ""; string errorDescription = node["errorDescription"] != null ? node["errorDescription"].InnerText : ""; return new ErrorMessage(Convert.ToInt32(errorCode, CultureInfo.InvariantCulture), errorDescription); } if ((doc.SelectSingleNode("//responseNs:AddPortMappingResponse", nsm)) != null) return new CreatePortMappingResponseMessage(); if ((doc.SelectSingleNode("//responseNs:DeletePortMappingResponse", nsm)) != null) return new DeletePortMapResponseMessage(); if ((node = doc.SelectSingleNode("//responseNs:GetExternalIPAddressResponse", nsm)) != null) { string newExternalIPAddress = node["NewExternalIPAddress"] != null ? node["NewExternalIPAddress"].InnerText : ""; return new GetExternalIPAddressResponseMessage(newExternalIPAddress); } if ((node = doc.SelectSingleNode("//responseNs:GetGenericPortMappingEntryResponse", nsm)) != null) return new GetGenericPortMappingEntryResponseMessage(node, true); if ((node = doc.SelectSingleNode("//responseNs:GetSpecificPortMappingEntryResponse", nsm)) != null) return new GetGenericPortMappingEntryResponseMessage(node, false); NatUtility.Log("Unknown message returned. Please send me back the following XML:"); NatUtility.Log(message); return null; }
public GetGenericPortMappingEntry(int index, UpnpNatDevice device) :base(device) { this.index = index; }
public void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint) { // Convert it to a string for easy parsing string dataString = null; // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. try { dataString = Encoding.UTF8.GetString(response); if (NatUtility.Verbose) NatUtility.Log("UPnP Response: {0}", dataString); // If this device does not have a WANIPConnection service, then ignore it // Technically i should be checking for WANIPConnection:1 and InternetGatewayDevice:1 // but there are some routers missing the '1'. string log = "UPnP Response: Router advertised a '{0}' service"; StringComparison c = StringComparison.OrdinalIgnoreCase; if (dataString.IndexOf("urn:schemas-upnp-org:service:WANIPConnection:", c) != -1) NatUtility.Log(log, "urn:schemas-upnp-org:service:WANIPConnection:"); else if (dataString.IndexOf("urn:schemas-upnp-org:device:InternetGatewayDevice:", c) != -1) NatUtility.Log(log, "urn:schemas-upnp-org:device:InternetGatewayDevice:"); else if (dataString.IndexOf("urn:schemas-upnp-org:service:WANPPPConnection:", c) != -1) NatUtility.Log(log, "urn:schemas-upnp-org:service:WANPPPConnection:"); else return; // We have an internet gateway device now UpnpNatDevice d = new UpnpNatDevice(localAddress, dataString, WanIPUrn); if (this.devices.Contains(d)) { // We already have found this device, so we just refresh it to let people know it's // Still alive. If a device doesn't respond to a search, we dump it. this.devices[this.devices.IndexOf(d)].LastSeen = DateTime.Now; } else { // If we send 3 requests at a time, ensure we only fetch the services list once // even if three responses are received if (lastFetched.ContainsKey(endpoint.Address)) { DateTime last = lastFetched[endpoint.Address]; if ((DateTime.Now - last) < TimeSpan.FromSeconds(20)) return; } lastFetched[endpoint.Address] = DateTime.Now; // Once we've parsed the information we need, we tell the device to retrieve it's service list // Once we successfully receive the service list, the callback provided will be invoked. NatUtility.Log("Fetching service list: {0}", d.HostEndPoint); d.GetServicesList(new NatDeviceCallback(DeviceSetupComplete)); } } catch (Exception ex) { //Trace.WriteLine("Unhandled exception when trying to decode a device's response Send me the following data: "); //Trace.WriteLine("ErrorMessage:"); //Trace.WriteLine(ex.Message); //Trace.WriteLine("Data string:"); //Trace.WriteLine(dataString); } }
protected MessageBase(UpnpNatDevice device) { this.device = device; }
public GetSpecificPortMappingEntryMessage(Protocol protocol, int externalPort, UpnpNatDevice device) : base(device) { this.protocol = protocol; this.externalPort = externalPort; }
public void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint) { // Convert it to a string for easy parsing string dataString = null; // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. try { string urn; dataString = Encoding.UTF8.GetString(response); if (NatUtility.Verbose) NatUtility.Log("UPnP Response: {0}", dataString); /* For UPnP Port Mapping we need ot find either WANPPPConnection or WANIPConnection. Any other device type is no good to us for this purpose. See the IGP overview paper page 5 for an overview of device types and their hierarchy. http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf */ /* TODO: Currently we are assuming version 1 of the protocol. We should figure out which version it is and apply the correct URN. */ /* Some routers don't correctly implement the version ID on the URN, so we only search for the type prefix. */ string log = "UPnP Response: Router advertised a '{0}' service"; StringComparison c = StringComparison.OrdinalIgnoreCase; if (dataString.IndexOf("urn:schemas-upnp-org:service:WANIPConnection:", c) != -1) { urn = "urn:schemas-upnp-org:service:WANIPConnection:1"; NatUtility.Log(log, "urn:schemas-upnp-org:service:WANIPConnection:1"); } else if (dataString.IndexOf("urn:schemas-upnp-org:service:WANPPPConnection:", c) != -1) { urn = "urn:schemas-upnp-org:service:WANPPPConnection:1"; NatUtility.Log(log, "urn:schemas-upnp-org:service:WANPPPConnection:"); } else return; // We have an internet gateway device now UpnpNatDevice d = new UpnpNatDevice(localAddress, dataString, urn); if (devices.Contains(d)) { // We already have found this device, so we just refresh it to let people know it's // Still alive. If a device doesn't respond to a search, we dump it. devices[devices.IndexOf(d)].LastSeen = DateTime.Now; } else { // If we send 3 requests at a time, ensure we only fetch the services list once // even if three responses are received if (lastFetched.ContainsKey(endpoint.Address)) { DateTime last = lastFetched[endpoint.Address]; if ((DateTime.Now - last) < TimeSpan.FromSeconds(20)) return; } lastFetched[endpoint.Address] = DateTime.Now; // Once we've parsed the information we need, we tell the device to retrieve it's service list // Once we successfully receive the service list, the callback provided will be invoked. NatUtility.Log("Fetching service list: {0}", d.HostEndPoint); d.GetServicesList(DeviceSetupComplete); } } catch (Exception ex) { Trace.WriteLine("Unhandled exception when trying to decode a device's response Send me the following data: "); Trace.WriteLine("ErrorMessage:"); Trace.WriteLine(ex.Message); Trace.WriteLine("Data string:"); Trace.WriteLine(dataString); } }
public void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint) { // Convert it to a string for easy parsing string dataString = null; // No matter what, this method should never throw an exception. If something goes wrong // we should still be in a position to handle the next reply correctly. try { dataString = Encoding.UTF8.GetString(response); if (NatUtility.Verbose) { NatUtility.Log("UPnP Response: {0}", dataString); } // If this device does not have a WANIPConnection service, then ignore it // Technically i should be checking for WANIPConnection:1 and InternetGatewayDevice:1 // but there are some routers missing the '1'. string log = "UPnP Response: Router advertised a '{0}' service"; StringComparison c = StringComparison.OrdinalIgnoreCase; if (dataString.IndexOf("urn:schemas-upnp-org:service:WANIPConnection:", c) != -1) { NatUtility.Log(log, "urn:schemas-upnp-org:service:WANIPConnection:"); } else if (dataString.IndexOf("urn:schemas-upnp-org:device:InternetGatewayDevice:", c) != -1) { NatUtility.Log(log, "urn:schemas-upnp-org:device:InternetGatewayDevice:"); } else if (dataString.IndexOf("urn:schemas-upnp-org:service:WANPPPConnection:", c) != -1) { NatUtility.Log(log, "urn:schemas-upnp-org:service:WANPPPConnection:"); } else { return; } // We have an internet gateway device now UpnpNatDevice d = new UpnpNatDevice(localAddress, dataString, WanIPUrn); if (this.devices.Contains(d)) { // We already have found this device, so we just refresh it to let people know it's // Still alive. If a device doesn't respond to a search, we dump it. this.devices[this.devices.IndexOf(d)].LastSeen = DateTime.Now; } else { // If we send 3 requests at a time, ensure we only fetch the services list once // even if three responses are received if (lastFetched.ContainsKey(endpoint.Address)) { DateTime last = lastFetched[endpoint.Address]; if ((DateTime.Now - last) < TimeSpan.FromSeconds(20)) { return; } } lastFetched[endpoint.Address] = DateTime.Now; // Once we've parsed the information we need, we tell the device to retrieve it's service list // Once we successfully receive the service list, the callback provided will be invoked. NatUtility.Log("Fetching service list: {0}", d.HostEndPoint); d.GetServicesList(new NatDeviceCallback(DeviceSetupComplete)); } } catch (Exception ex) { //Trace.WriteLine("Unhandled exception when trying to decode a device's response Send me the following data: "); //Trace.WriteLine("ErrorMessage:"); //Trace.WriteLine(ex.Message); //Trace.WriteLine("Data string:"); //Trace.WriteLine(dataString); } }
public CreatePortMappingMessage(Mapping mapping, IPAddress localIpAddress, UpnpNatDevice device) : base(device) { this.mapping = mapping; this.localIpAddress = localIpAddress; }
public DeletePortMappingMessage(Mapping mapping, UpnpNatDevice device) : base(device) { this.mapping = mapping; }
public GetExternalIPAddressMessage(UpnpNatDevice device) :base(device) { }
public GetExternalIPAddressMessage(UpnpNatDevice device) : base(device, "GetExternalIPAddress") { }