Exemple #1
0
        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");
            }
        }
Exemple #2
0
        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));
     }
 }
Exemple #5
0
        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;
 }
Exemple #10
0
        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);
            }
        }
Exemple #11
0
        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")
 {
 }