Browse Source

Merging in upnp_punch_squashed

sirMackk 9 năm trước cách đây
mục cha
commit
218ceb4bdd

+ 0 - 3
src/Config.py

@@ -19,10 +19,8 @@ class Config(object):
 	def createArguments(self):
 		# Platform specific
 		if sys.platform.startswith("win"):
-			upnpc = "tools\\upnpc\\upnpc-shared.exe"
 			coffeescript = "type %s | tools\\coffee\\coffee.cmd"
 		else:
-			upnpc = None
 			coffeescript = None
 
 		# Create parser
@@ -81,7 +79,6 @@ class Config(object):
 		parser.add_argument('--fileserver_port',help='FileServer bind port', default=15441, type=int, metavar='port')
 
 		parser.add_argument('--ip_external',	help='External ip (tested on start if None)', metavar='ip')
-		parser.add_argument('--upnpc',			help='MiniUPnP binary for open port on router', default=upnpc, metavar='executable_path')
 
 		parser.add_argument('--coffeescript_compiler',	help='Coffeescript compiler for developing', default=coffeescript, metavar='executable_path')
 

+ 11 - 18
src/File/FileServer.py

@@ -6,6 +6,7 @@ from FileRequest import FileRequest
 from Site import SiteManager
 from Debug import Debug
 from Connection import ConnectionServer
+from util import UpnpPunch
 
 
 class FileServer(ConnectionServer):
@@ -44,24 +45,16 @@ class FileServer(ConnectionServer):
 			if self.testOpenport(port)["result"] == True:
 				return True # Port already opened
 
-		if config.upnpc: # If we have upnpc util, try to use it to puch port on our router
-			self.log.info("Try to open port using upnpc...")
-			try:
-				exit = os.system("%s -e ZeroNet -r %s tcp" % (config.upnpc, self.port))
-				if exit == 0: # Success
-					upnpc_success = True
-				else: # Failed
-					exit = os.system("%s -r %s tcp" % (config.upnpc, self.port)) # Try without -e option
-					if exit == 0:
-						upnpc_success = True
-					else:
-						upnpc_success = False
-			except Exception, err:
-				self.log.error("Upnpc run error: %s" % Debug.formatException(err))
-				upnpc_success = False
-
-			if upnpc_success and self.testOpenport(port)["result"] == True:
-				return True
+		self.log.info("Trying to open port using UpnpPunch...")
+		try:
+			upnp_punch = UpnpPunch.open_port(self.port, 'ZeroNet')
+			upnp_punch = True
+		except Exception, err:
+			self.log.error("UpnpPunch run error: %s" % Debug.formatException(err))
+			upnp_punch = False
+
+		if upnp_punch and self.testOpenport(port)["result"] == True:
+			return True
 
 		self.log.info("Upnp mapping failed :( Please forward port %s on your router to your ipaddress" % port)
 		return False

+ 168 - 117
src/util/UpnpPunch.py

@@ -1,7 +1,10 @@
-import socket
-import re
-import urllib2
-import httplib
+import gevent
+from gevent import socket
+from gevent import monkey
+
+monkey.patch_socket()
+
+import re, urllib2, httplib
 from urlparse import urlparse
 from xml.dom.minidom import parseString
 
@@ -9,143 +12,191 @@ from xml.dom.minidom import parseString
 
 # General TODOs:
 # Handle 0 or >1 IGDs
-# Format the SOAP AddPortEntry message correctly (remove spaces/whitespace)
-# Find robust way to find own ip
+
+remove_whitespace = re.compile(r'>\s*<')
 
 
 def _m_search_ssdp():
-    """
-    Broadcast a UDP SSDP M-SEARCH packet and return response.
-    """
-    search_target = "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
+	"""
+	Broadcast a UDP SSDP M-SEARCH packet and return response.
+	"""
+	search_target = "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
 
-    ssdp_request = ''.join(
-        ['M-SEARCH * HTTP/1.1\r\n',
-         'HOST: 239.255.255.250:1900\r\n',
-         'MAN: "ssdp:discover"\r\n',
-         'MX: 2\r\n',
-         'ST: {0}\r\n'.format(search_target),
-         '\r\n']
-    )
+	ssdp_request = ''.join(
+		['M-SEARCH * HTTP/1.1\r\n',
+		'HOST: 239.255.255.250:1900\r\n',
+		'MAN: "ssdp:discover"\r\n',
+		'MX: 2\r\n',
+		'ST: {0}\r\n'.format(search_target),
+		'\r\n']
+	)
 
-    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    sock.sendto(ssdp_request, ('239.255.255.250', 1900))
+	sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+	sock.sendto(ssdp_request, ('239.255.255.250', 1900))
+	sock.settimeout(5)
 
-    # TODO: add timeout
-    return sock.recv(1024)
+        try:
+            data = sock.recv(2048)
+        except SocketError:
+            # socket has stopped reading on windows
+            pass
+
+        return data
 
 
 def _retrieve_location_from_ssdp(response):
-    """
-    Parse raw HTTP response to retrieve the UPnP location header
-    and return a ParseResult object.
-    """
-    parsed = re.findall(r'(?P<name>.*?): (?P<value>.*?)\r\n', response)
-    location_header = filter(lambda x: x[0].lower() == 'location', parsed)
+	"""
+	Parse raw HTTP response to retrieve the UPnP location header
+	and return a ParseResult object.
+	"""
+	parsed = re.findall(r'(?P<name>.*?): (?P<value>.*?)\r\n', response)
+	location_header = filter(lambda x: x[0].lower() == 'location', parsed)
 
-    if not len(location_header):
-        # no location header returned :(
-        return False
+	if not len(location_header):
+		# no location header returned :(
+		return False
 
-    return urlparse(location_header[0][1])
+	return urlparse(location_header[0][1])
 
 
 def _retrieve_igd_profile(url):
-    """
-    Retrieve the device's UPnP profile.
-    """
-    # TODO: add exception handling
-    return urllib2.urlopen(url.geturl()).read()
+	"""
+	Retrieve the device's UPnP profile.
+	"""
+	return urllib2.urlopen(url.geturl()).read()
 
 
-def __get_node_value(node):
-    """ 
-    Get the text value of the first child text node of a node.
-    """
-    return node.childeNodes[0].data
+def _node_val(node):
+	""" 
+	Get the text value of the first child text node of a node.
+	"""
+	return node.childNodes[0].data
 
 
 def _parse_igd_profile(profile_xml):
-    """
-    Traverse the profile xml DOM looking for either
-    WANIPConnection or WANPPPConnection and return
-    the value found as well as the 'controlURL'.
-    """
-    # TODO: return upnp schema as well
-    dom = parseString(profile_xml)
-
-    service_types = dom.getElementsByTagName('serviceType')
-    for service in service_types:
-        if __get_node_value(service).find('WANIPConnection') > 0 or \
-           __get_node_value(service).find('WANPPPConnection') > 0:
-            control_url = service.parentNode.getElementsByTagName(
-                'controlURL'
-            )[0].childNodes[0].data
-
-    return control_url, upnp_schema
+	"""
+	Traverse the profile xml DOM looking for either
+	WANIPConnection or WANPPPConnection and return
+	the value found as well as the 'controlURL'.
+	"""
+	dom = parseString(profile_xml)
+
+	service_types = dom.getElementsByTagName('serviceType')
+	for service in service_types:
+		if _node_val(service).find('WANIPConnection') > 0 or \
+		   _node_val(service).find('WANPPPConnection') > 0:
+			control_url = service.parentNode.getElementsByTagName(
+				'controlURL'
+			)[0].childNodes[0].data
+			upnp_schema = _node_val(service).split(':')[-2]
+			return control_url, upnp_schema
+
+	return False
+
+
+def _get_local_ip():
+	s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+	s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+	# not using <broadcast> because gevents getaddrinfo doesn't like that
+        # using port 1 as per hobbldygoop's comment about port 0 not working on osx:
+        # https://github.com/sirMackk/ZeroNet/commit/fdcd15cf8df0008a2070647d4d28ffedb503fba2#commitcomment-9863928
+	s.connect(('239.255.255.250', 1))
+	return s.getsockname()[0]
 
 
 def _create_soap_message(port, description="UPnPPunch", protocol="TCP",
-                         upnp_schema='WANIPConnection'):
-    """
-    Build a SOAP AddPortMapping message.
-    """
-    # TODO: get current ip
-    current_ip = '192.168.0.2'
-
-    soap_message = """<?xml version="1.0"?>
+						 upnp_schema='WANIPConnection'):
+	"""
+	Build a SOAP AddPortMapping message.
+	"""
+	current_ip = _get_local_ip()
+
+	soap_message = """<?xml version="1.0"?>
 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
-    <s:Body>
-        <u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:{upnp_schema}:1">
-            <NewRemoteHost></NewRemoteHost>
-            <NewExternalPort>{port}</NewExternalPort>
-            <NewProtocol>{protocol}</NewProtocol>
-            <NewInternalPort>{port}</NewInternalPort>
-            <NewInternalClient>{host_ip}</NewInternalClient>
-            <NewEnabled>1</NewEnabled>
-            <NewPortMappingDescription>{description}</NewPortMappingDescription>
-            <NewLeaseDuration>0</NewLeaseDuration>
-        </u:AddPortMapping>
-    </s:Body>
+	<s:Body>
+		<u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:{upnp_schema}:1">
+			<NewRemoteHost></NewRemoteHost>
+			<NewExternalPort>{port}</NewExternalPort>
+			<NewProtocol>{protocol}</NewProtocol>
+			<NewInternalPort>{port}</NewInternalPort>
+			<NewInternalClient>{host_ip}</NewInternalClient>
+			<NewEnabled>1</NewEnabled>
+			<NewPortMappingDescription>{description}</NewPortMappingDescription>
+			<NewLeaseDuration>0</NewLeaseDuration>
+		</u:AddPortMapping>
+	</s:Body>
 </s:Envelope>""".format(port=port,
-                        protocol=protocol,
-                        host_ip=current_ip,
-                        description=description,
-                        upnp_schema=upnp_schema)
-
-    return soap_message
+						protocol=protocol,
+						host_ip=current_ip,
+						description=description,
+						upnp_schema=upnp_schema)
+	return remove_whitespace.sub('><', soap_message)
+
+
+def _parse_for_errors(soap_response):
+	if soap_response.status == 500:
+		err_dom = parseString(soap_response.read())
+		err_code = _node_val(err_dom.getElementsByTagName('errorCode')[0])
+		err_msg = _node_val(
+			err_dom.getElementsByTagName('errorDescription')[0]
+		)
+		raise Exception(
+			'SOAP request error: {0} - {1}'.format(err_code, err_msg)
+		)
+		return False
+	else:
+		return True
 
 
 def _send_soap_request(location, upnp_schema, control_url, soap_message):
-    """
-    Send out SOAP request to UPnP device and return a response.
-    """
-    headers = {
-        'SOAPAction': (
-            '"urn:schemas-upnp-org:service:{schema}:'
-            '1#AddPortMapping"'.format(schema=upnp_schema)
-        ),
-        'Content-Type': 'text/xml'
-    }
-    conn = httplib.HTTPConnection(location.hostname, location.port)
-    conn.request('POST', control_url, soap_message, headers)
-
-    response_body = conn.getresponse().read()
-
-    return response_body
-
-
-def open_port(port=15441):
-    """
-    Attempt to forward a port using UPnP.
-    """
-    location = _retrieve_location_from_ssdp(_m_search_ssdp())
-    control_url, upnp_schema = _parse_igd_profile(
-        _retrieve_igd_profile(location)
-    )
-
-    for protocol in ["TCP", "UDP"]:
-        message = _create_soap_message(port, protocol, upnp_schema)
-        # TODO: gevent this
-        _send_soap_request(location, upnp_schema, control_url, message)
-        # TODO: handle error code in response
+	"""
+	Send out SOAP request to UPnP device and return a response.
+	"""
+	headers = {
+		'SOAPAction': (
+			'"urn:schemas-upnp-org:service:{schema}:'
+			'1#AddPortMapping"'.format(schema=upnp_schema)
+		),
+		'Content-Type': 'text/xml'
+	}
+	conn = httplib.HTTPConnection(location.hostname, location.port)
+	conn.request('POST', control_url, soap_message, headers)
+
+	response = conn.getresponse()
+	conn.close()
+
+	return _parse_for_errors(response)
+
+
+def open_port(port=15441, desc="UpnpPunch"):
+	"""
+	Attempt to forward a port using UPnP.
+	"""
+
+	location = _retrieve_location_from_ssdp(_m_search_ssdp())
+
+	if not location:
+		return False
+
+	parsed = _parse_igd_profile(
+		_retrieve_igd_profile(location)
+	)
+
+	if not parsed:
+		return False
+
+	control_url, upnp_schema = parsed
+
+	soap_messages = [_create_soap_message(port, desc, proto, upnp_schema)
+					 for proto in ['TCP', 'UDP']]
+
+	requests = [gevent.spawn(
+		_send_soap_request, location, upnp_schema, control_url, message
+	) for message in soap_messages]
+
+	gevent.joinall(requests, timeout=3)
+
+	if all(requests):
+		return True
+	else:
+		return False

+ 0 - 585
tools/upnpc/Changelog.txt

@@ -1,585 +0,0 @@
-$Id: Changelog.txt,v 1.193 2014/02/05 17:26:45 nanard Exp $
-miniUPnP client Changelog.
-
-2014/02/05:
-  handle EINPROGRESS after connect()
-
-2014/02/03:
-  minixml now handle XML comments
-
-VERSION 1.9 : released 2014/01/31
-
-2014/01/31:
-  added argument remoteHost to UPNP_GetSpecificPortMappingEntry()
-  increment API_VERSION to 10
-
-2013/12/09:
-  --help and -h arguments in upnpc.c
-
-2013/10/07:
-  fixed potential buffer overrun in miniwget.c
-  Modified UPNP_GetValidIGD() to check for ExternalIpAddress
-
-2013/08/01:
-  define MAXHOSTNAMELEN if not already done
-
-2013/06/06:
-  update upnpreplyparse to allow larger values (128 chars instead of 64)
-
-2013/05/14:
-  Update upnpreplyparse to take into account "empty" elements
-  validate upnpreplyparse.c code with "make check"
-
-2013/05/03:
-  Fix Solaris build thanks to Maciej Małecki
-
-2013/04/27:
-  Fix testminiwget.sh for BSD
-
-2013/03/23:
-  Fixed Makefile for *BSD
-
-2013/03/11:
-  Update Makefile to use JNAerator version 0.11
-
-2013/02/11:
-  Fix testminiwget.sh for use with dash
-  Use $(DESTDIR) in Makefile
-
-VERSION 1.8 : released 2013/02/06
-
-2012/10/16:
-  fix testminiwget with no IPv6 support
-
-2012/09/27:
-  Rename all include guards to not clash with C99
-  (7.1.3 Reserved identifiers).
-
-2012/08/30:
-  Added -e option to upnpc program (set description for port mappings)
-
-2012/08/29:
-  Python 3 support (thanks to Christopher Foo)
-
-2012/08/11:
-  Fix a memory link in UPNP_GetValidIGD()
-  Try to handle scope id in link local IPv6 URL under MS Windows
-
-2012/07/20:
-  Disable HAS_IP_MREQN on DragonFly BSD
-
-2012/06/28:
-  GetUPNPUrls() now inserts scope into link-local IPv6 addresses
-
-2012/06/23:
-  More error return checks in upnpc.c
-  #define MINIUPNPC_GET_SRC_ADDR enables receivedata() to get scope_id
-  parseURL() now parses IPv6 addresses scope
-  new parameter for miniwget() : IPv6 address scope
-  increment API_VERSION to 9
-
-2012/06/20:
-  fixed CMakeLists.txt
-
-2012/05/29
-  Improvements in testminiwget.sh
-
-VERSION 1.7 : released 2012/05/24
-
-2012/05/01:
-  Cleanup settings of CFLAGS in Makefile
-  Fix signed/unsigned integer comparaisons
-
-2012/04/20:
-  Allow to specify protocol with TCP or UDP for -A option
-
-2012/04/09:
-  Only try to fetch XML description once in UPNP_GetValidIGD()
-  Added -ansi flag to compilation, and fixed C++ comments to ANSI C comments.
-
-2012/04/05:
-  minor improvements to minihttptestserver.c
-
-2012/03/15:
-  upnperrors.c returns valid error string for unrecognized error codes
-
-2012/03/08:
-  make minihttptestserver listen on loopback interface instead of 0.0.0.0
-
-2012/01/25:
-  Maven installation thanks to Alexey Kuznetsov
-
-2012/01/21:
-  Replace WIN32 macro by _WIN32
-
-2012/01/19:
-  Fixes in java wrappers thanks to Alexey Kuznetsov :
-    https://github.com/axet/miniupnp/tree/fix-javatest/miniupnpc
-  Make and install .deb packages (python) thanks to Alexey Kuznetsov :
-    https://github.com/axet/miniupnp/tree/feature-debbuild/miniupnpc
-
-2012/01/07:
-  The multicast interface can now be specified by name with IPv4.
-
-2012/01/02:
-  Install man page
-
-2011/11/25:
-  added header to Port Mappings list in upnpc.c
-
-2011/10/09:
-  Makefile : make clean now removes jnaerator generated files.
-  MINIUPNPC_VERSION in miniupnpc.h (updated by make)
-
-2011/09/12:
-  added rootdescURL to UPNPUrls structure.
-
-VERSION 1.6 : released 2011/07/25
-
-2011/07/25:
-  Update doc for version 1.6 release
-
-2011/06/18:
-  Fix for windows in miniwget.c
-
-2011/06/04:
-  display remote host in port mapping listing
-
-2011/06/03:
-  Fix in make install : there were missing headers
-
-2011/05/26:
-  Fix the socket leak in miniwget thanks to Richard Marsh.
-  Permit to add leaseduration in -a command. Display lease duration.
-
-2011/05/15:
-  Try both LinkLocal and SiteLocal multicast address for SSDP in IPv6
-
-2011/05/09:
-  add a test in testminiwget.sh.
-  more error checking in miniwget.c
-
-2011/05/06:
-  Adding some tool to test and validate miniwget.c
-  simplified and debugged miniwget.c
-
-2011/04/11:
-  moving ReceiveData() to a receivedata.c file.
-  parsing presentation url
-  adding IGD v2 WANIPv6FirewallControl commands
-
-2011/04/10:
-  update of miniupnpcmodule.c
-  comments in miniwget.c, update in testminiwget
-  Adding errors codes from IGD v2
-  new functions in upnpc.c for IGD v2
-
-2011/04/09:
-  Support for litteral ip v6 address in miniwget
-
-2011/04/08:
-  Adding support for urn:schemas-upnp-org:service:WANIPv6FirewallControl:1
-  Updating APIVERSION
-  Supporting IPV6 in upnpDiscover()
-  Adding a -6 option to upnpc command line tool
-
-2011/03/18:
-  miniwget/parseURL() : return an error when url param is null.
-  fixing GetListOfPortMappings()
-
-2011/03/14:
-  upnpDiscover() now reporting an error code.
-  improvements in comments.
-
-2011/03/11:
-  adding miniupnpcstrings.h.cmake and CMakeLists.txt files.
-
-2011/02/15:
-  Implementation of GetListOfPortMappings()
-
-2011/02/07:
-  updates to minixml to support character data starting with spaces
-  minixml now support CDATA
-  upnpreplyparse treats <NewPortListing> specificaly
-  change in simpleUPnPcommand to return the buffer (simplification)
-
-2011/02/06:
-  Added leaseDuration argument to AddPortMapping()
-  Starting to implement GetListOfPortMappings()
-
-2011/01/11:
-  updating wingenminiupnpcstrings.c
-
-2011/01/04:
-  improving updateminiupnpcstrings.sh
-
-VERSION 1.5 : released 2011/01/01
-
-2010/12/21:
-  use NO_GETADDRINFO macro to disable the use of getaddrinfo/freeaddrinfo
-
-2010/12/11:
-  Improvements on getHTTPResponse() code.
-
-2010/12/09:
-  new code for miniwget that handle Chunked transfer encoding
-  using getHTTPResponse() in SOAP call code
-  Adding MANIFEST.in for 'python setup.py bdist_rpm'
-
-2010/11/25:
-  changes to minissdpc.c to compile under Win32.
-  see http://miniupnp.tuxfamily.org/forum/viewtopic.php?t=729
-
-2010/09/17:
-  Various improvement to Makefile from Michał Górny
-
-2010/08/05:
-  Adding the script "external-ip.sh" from Reuben Hawkins
-
-2010/06/09:
-  update to python module to match modification made on 2010/04/05
-  update to Java test code to match modification made on 2010/04/05
-  all UPNP_* function now return an error if the SOAP request failed
-  at HTTP level.
-
-2010/04/17:
-  Using GetBestRoute() under win32 in order to find the
-  right interface to use.
-
-2010/04/12:
-  Retrying with HTTP/1.1 if HTTP/1.0 failed. see
-  http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1703
-
-2010/04/07:
-  avoid returning duplicates in upnpDiscover()
-
-2010/04/05:
-  Create a connecthostport.h/.c with connecthostport() function
-  and use it in miniwget and miniupnpc.
-  Use getnameinfo() instead of inet_ntop or inet_ntoa
-  Work to make miniupnpc IPV6 compatible...
-  Add java test code.
-  Big changes in order to support device having both WANIPConnection
-  and WANPPPConnection.
-
-2010/04/04:
-  Use getaddrinfo() instead of gethostbyname() in miniwget.
-
-2010/01/06:
-  #define _DARWIN_C_SOURCE for Mac OS X
-
-2009/12/19:
-  Improve MinGW32 build
-
-2009/12/11:
-  adding a MSVC9 project to build the static library and executable
-
-2009/12/10:
-  Fixing some compilation stuff for Windows/MinGW
-
-2009/12/07:
-  adaptations in Makefile and updateminiupnpcstring.sh for AmigaOS
-  some fixes for Windows when using virtual ethernet adapters (it is the
-  case with VMWare installed).
-
-2009/12/04:
-  some fixes for AmigaOS compilation
-  Changed HTTP version to HTTP/1.0 for Soap too (to prevent chunked
-  transfer encoding)
-
-2009/12/03:
-  updating printIDG and testigddescparse.c for debug.
-  modifications to compile under AmigaOS
-  adding a testminiwget program
-  Changed miniwget to advertise itself as HTTP/1.0 to prevent chunked
-  transfer encoding
-
-2009/11/26:
-  fixing updateminiupnpcstrings.sh to take into account
-  which command that does not return an error code.
-
-VERSION 1.4 : released 2009/10/30
-
-2009/10/16:
-  using Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS in python module.
-
-2009/10/10:
-  Some fixes for compilation under Solaris
-  compilation fixes : http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1464
-
-2009/09/21:
-  fixing the code to ignore EINTR during connect() calls.
-
-2009/08/07:
-  Set socket timeout for connect()
-  Some cleanup in miniwget.c
-
-2009/08/04:
-  remove multiple redirections with -d in upnpc.c
-  Print textual error code in upnpc.c
-  Ignore EINTR during the connect() and poll() calls.
-
-2009/07/29:
-  fix in updateminiupnpcstrings.sh if OS name contains "/"
-  Sending a correct value for MX: field in SSDP request
-
-2009/07/20:
-  Change the Makefile to compile under Mac OS X
-  Fixed a stackoverflow in getDevicesFromMiniSSDPD()
-
-2009/07/09:
-  Compile under Haiku
-  generate miniupnpcstrings.h.in from miniupnpcstrings.h
-
-2009/06/04:
-  patching to compile under CygWin and cross compile for minGW
-
-VERSION 1.3 :
-
-2009/04/17:
-  updating python module
-  Use strtoull() when using C99
-
-2009/02/28:
-  Fixed miniwget.c for compiling under sun
-
-2008/12/18:
-  cleanup in Makefile (thanks to Paul de Weerd)
-  minissdpc.c : win32 compatibility
-  miniupnpc.c : changed xmlns prefix from 'm' to 'u'
-  Removed NDEBUG (using DEBUG)
-
-2008/10/14:
-  Added the ExternalHost argument to DeletePortMapping()
-
-2008/10/11:
-  Added the ExternalHost argument to AddPortMapping()
-  Put a correct User-Agent: header in HTTP requests.
-
-VERSION 1.2 :
-
-2008/10/07:
-  Update docs
-
-2008/09/25:
-  Integrated sameport patch from Dario Meloni : Added a "sameport"
-  argument to upnpDiscover().
-
-2008/07/18:
-  small modif to make Clang happy :)
-
-2008/07/17:
-  #define SOAPPREFIX "s" in miniupnpc.c in order to remove SOAP-ENV...
-
-2008/07/14:
-  include declspec.h in installation (to /usr/include/miniupnpc)
-
-VERSION 1.1 :
-
-2008/07/04:
-  standard options for install/ln instead of gnu-specific stuff.
-
-2008/07/03:
-  now builds a .dll and .lib with win32. (mingw32)
-
-2008/04/28:
-  make install now install the binary of the upnpc tool
-
-2008/04/27:
-  added testupnpigd.py
-  added error strings for miniupnpc "internal" errors
-  improved python module error/exception reporting.
-
-2008/04/23:
-  Completely rewrite igd_desc_parse.c in order to be compatible with
-  Linksys WAG200G
-  Added testigddescparse
-  updated python module
-
-VERSION 1.0 :
-
-2008/02/21:
-  put some #ifdef DEBUG around DisplayNameValueList()
-
-2008/02/18:
-  Improved error reporting in upnpcommands.c
-  UPNP_GetStatusInfo() returns LastConnectionError
-
-2008/02/16:
-  better error handling in minisoap.c
-  improving display of "valid IGD found" in upnpc.c
-
-2008/02/03:
-  Fixing UPNP_GetValidIGD()
-  improved make install :)
-
-2007/12/22:
-  Adding upnperrors.c/h to provide a strupnperror() function
-  used to translate UPnP error codes to string.
-
-2007/12/19:
-  Fixing getDevicesFromMiniSSDPD()
-  improved error reporting of UPnP functions
-
-2007/12/18:
-  It is now possible to specify a different location for MiniSSDPd socket.
-  working with MiniSSDPd is now more efficient.
-  python module improved.
-
-2007/12/16:
-  improving error reporting
-
-2007/12/13:
-  Try to improve compatibility by using HTTP/1.0 instead of 1.1 and
-  XML a bit different for SOAP.
-
-2007/11/25:
-  fixed select() call for linux
-
-2007/11/15:
-  Added -fPIC to CFLAG for better shared library code.
-
-2007/11/02:
-  Fixed a potential socket leak in miniwget2()
-
-2007/10/16:
-  added a parameter to upnpDiscover() in order to allow the use of another
-  interface than the default multicast interface.
-
-2007/10/12:
-  Fixed the creation of symbolic link in Makefile
-
-2007/10/08:
-  Added man page
-
-2007/10/02:
-  fixed memory bug in GetUPNPUrls()
-
-2007/10/01:
-  fixes in the Makefile
-  Added UPNP_GetIGDFromUrl() and adapted the sample program accordingly.
-  Added SONAME in the shared library to please debian :)
-  fixed MS Windows compilation (minissdpd is not available under MS Windows).
-
-2007/09/25:
-  small change to Makefile to be able to install in a different location
-  (default is /usr)
-
-2007/09/24:
-  now compiling both shared and static library
-
-2007/09/19:
-  Cosmetic changes on upnpc.c
-
-2007/09/02:
-  adapting to new miniSSDPd (release version ?)
-
-2007/08/31:
-  Usage of miniSSDPd to skip discovery process.
-
-2007/08/27:
-  fixed python module to allow compilation with Python older than Python 2.4
-
-2007/06/12:
-  Added a python module.
-
-2007/05/19:
-  Fixed compilation under MinGW
-
-2007/05/15:
-  fixed a memory leak in AddPortMapping()
-  Added testupnpreplyparse executable to check the parsing of
-  upnp soap messages
-  minixml now ignore namespace prefixes.
-
-2007/04/26:
-  upnpc now displays external ip address with -s or -l
-
-2007/04/11:
-  changed MINIUPNPC_URL_MAXSIZE to 128 to accomodate the "BT Voyager 210"
-
-2007/03/19:
-  cleanup in miniwget.c
-
-2007/03/01:
-  Small typo fix...
-
-2007/01/30:
-  Now parsing the HTTP header from SOAP responses in order to
-  get content-length value.
-
-2007/01/29:
-  Fixed the Soap Query to speedup the HTTP request.
-  added some Win32 DLL stuff...
-
-2007/01/27:
-  Fixed some WIN32 compatibility issues
-
-2006/12/14:
-  Added UPNPIGD_IsConnected() function in miniupnp.c/.h
-  Added UPNP_GetValidIGD() in miniupnp.c/.h
-  cleaned upnpc.c main(). now using UPNP_GetValidIGD()
-
-2006/12/07:
-  Version 1.0-RC1 released
-
-2006/12/03:
-  Minor changes to compile under SunOS/Solaris
-
-2006/11/30:
-  made a minixml parser validator program
-  updated minixml to handle attributes correctly
-
-2006/11/22:
-  Added a -r option to the upnpc sample thanks to Alexander Hubmann.
-
-2006/11/19:
-  Cleanup code to make it more ANSI C compliant
-
-2006/11/10:
-  detect and display local lan address.
-
-2006/11/04:
-  Packets and Bytes Sent/Received are now unsigned int.
-
-2006/11/01:
-  Bug fix thanks to Giuseppe D'Angelo
-
-2006/10/31:
-  C++ compatibility for .h files.
-  Added a way to get ip Address on the LAN used to reach the IGD.
-
-2006/10/25:
-  Added M-SEARCH to the services in the discovery process.
-
-2006/10/22:
-  updated the Makefile to use makedepend, added a "make install"
-  update Makefile
-
-2006/10/20:
-  fixing the description url parsing thanks to patch sent by
-  Wayne Dawe.
-  Fixed/translated some comments.
-  Implemented a better discover process, first looking
-  for IGD then for root devices (as some devices only reply to
-  M-SEARCH for root devices).
-
-2006/09/02:
-  added freeUPNPDevlist() function.
-
-2006/08/04:
-  More command line arguments checking
-
-2006/08/01:
-  Added the .bat file to compile under Win32 with minGW32
-
-2006/07/31:
-  Fixed the rootdesc parser (igd_desc_parse.c)
-
-2006/07/20:
-  parseMSEARCHReply() is now returning the ST: line as well
-  starting changes to detect several UPnP devices on the network
-
-2006/07/19:
-  using GetCommonLinkProperties to get down/upload bitrate
-

+ 0 - 27
tools/upnpc/LICENSE

@@ -1,27 +0,0 @@
-MiniUPnPc
-Copyright (c) 2005-2011, Thomas BERNARD
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-    * The name of the author may not be used to endorse or promote products
-	  derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-

+ 0 - 66
tools/upnpc/README

@@ -1,66 +0,0 @@
-Project: miniupnp
-Project web page: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
-github: https://github.com/miniupnp/miniupnp
-freecode: http://freecode.com/projects/miniupnp
-Author: Thomas Bernard
-Copyright (c) 2005-2012 Thomas Bernard
-This software is subject to the conditions detailed in the
-LICENSE file provided within this distribution.
-
-
-For the comfort of Win32 users, bsdqueue.h is included in the distribution.
-Its licence is included in the header of the file.
-bsdqueue.h is a copy of the sys/queue.h of an OpenBSD system.
-
-
-* miniUPnP Client - miniUPnPc *
-
-To compile, simply run 'gmake' (could be 'make' on your system).
-Under win32, to compile with MinGW, type "mingw32make.bat".
-MS Visual C solution and project files are supplied in the msvc/ subdirectory.
-
-The compilation is known to work under linux, FreeBSD,
-OpenBSD, MacOS X, AmigaOS and cygwin.
-The official AmigaOS4.1 SDK was used for AmigaOS4 and GeekGadgets for AmigaOS3.
-upx (http://upx.sourceforge.net) is used to compress the win32 .exe files.
-
-To install the library and headers on the system use :
-> su
-> make install
-> exit
-
-alternatively, to install into a specific location, use :
-> INSTALLPREFIX=/usr/local make install
-
-upnpc.c is a sample client using the libminiupnpc.
-To use the libminiupnpc in your application, link it with
-libminiupnpc.a (or .so) and use the following functions found in miniupnpc.h,
-upnpcommands.h and miniwget.h :
-- upnpDiscover()
-- miniwget()
-- parserootdesc()
-- GetUPNPUrls()
-- UPNP_* (calling UPNP methods)
-
-Note : use #include <miniupnpc/miniupnpc.h> etc... for the includes
-and -lminiupnpc for the link
-
-Discovery process is speeded up when MiniSSDPd is running on the machine.
-
-
-* Python module *
-
-you can build a python module with 'make pythonmodule'
-and install it with 'make installpythonmodule'.
-setup.py (and setupmingw32.py) are included in the distribution.
-
-
-Feel free to contact me if you have any problem :
-e-mail : miniupnp@free.fr
-
-If you are using libminiupnpc in your application, please
-send me an email !
-
-For any question, you can use the web forum :
-http://miniupnp.tuxfamily.org/forum/
-

BIN
tools/upnpc/libminiupnpc.a


+ 0 - 43
tools/upnpc/miniupnpc.def

@@ -1,43 +0,0 @@
-LIBRARY
-; miniupnpc library
-   miniupnpc
-
-EXPORTS
-; miniupnpc
-   upnpDiscover
-   freeUPNPDevlist
-   parserootdesc
-   UPNP_GetValidIGD
-   UPNP_GetIGDFromUrl
-   GetUPNPUrls
-   FreeUPNPUrls
-; miniwget
-   miniwget
-   miniwget_getaddr
-; upnpcommands
-   UPNP_GetTotalBytesSent
-   UPNP_GetTotalBytesReceived
-   UPNP_GetTotalPacketsSent
-   UPNP_GetTotalPacketsReceived
-   UPNP_GetStatusInfo
-   UPNP_GetConnectionTypeInfo
-   UPNP_GetExternalIPAddress
-   UPNP_GetLinkLayerMaxBitRates
-   UPNP_AddPortMapping
-   UPNP_DeletePortMapping
-   UPNP_GetPortMappingNumberOfEntries
-   UPNP_GetSpecificPortMappingEntry
-   UPNP_GetGenericPortMappingEntry
-   UPNP_GetListOfPortMappings
-   UPNP_AddPinhole
-   UPNP_CheckPinholeWorking
-   UPNP_UpdatePinhole
-   UPNP_GetPinholePackets
-   UPNP_DeletePinhole
-   UPNP_GetFirewallStatus
-   UPNP_GetOutboundPinholeTimeout
-; upnperrors
-   strupnperror
-; portlistingparse
-   ParsePortListing
-   FreePortListing

BIN
tools/upnpc/miniupnpc.dll


BIN
tools/upnpc/miniupnpc.lib


BIN
tools/upnpc/upnpc-shared.exe