1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-12 00:54:20 +02:00

* Updated miniupnp and added blocked devices support to libportfwd.

This commit is contained in:
Christian Muehlhaeuser
2011-09-09 02:26:22 +02:00
parent cc2cc8397e
commit fab69e3cae
85 changed files with 3611 additions and 5076 deletions

View File

@@ -22,147 +22,190 @@
#include "upnpcommands.h"
#ifdef WIN32
#include <winsock2.h>
#include "../include/portfwd/portfwd.h"
#include <winsock2.h>
#endif
Portfwd::Portfwd()
: urls(0), data(0)
: m_urls( 0 )
, m_data( 0 )
{
}
Portfwd::~Portfwd()
{
if(urls) free(urls);
if(data) free(data);
if ( m_urls )
free( m_urls );
if ( m_data )
free( m_data );
}
bool
Portfwd::init(unsigned int timeout)
Portfwd::init( unsigned int timeout )
{
#ifdef WIN32
WSADATA wsaData;
int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if(nResult != NO_ERROR)
int nResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if ( nResult != NO_ERROR )
{
fprintf(stderr, "WSAStartup() failed.\n");
fprintf( stderr, "WSAStartup() failed.\n" );
return -1;
}
#endif
struct UPNPDev * devlist;
struct UPNPDev * dev;
char * descXML;
int descXMLsize = 0;
printf("Portfwd::init()\n");
urls = (UPNPUrls*)malloc(sizeof(struct UPNPUrls));
data = (IGDdatas*)malloc(sizeof(struct IGDdatas));
memset(urls, 0, sizeof(struct UPNPUrls));
memset(data, 0, sizeof(struct IGDdatas));
devlist = upnpDiscover(timeout, NULL, NULL, 0);
if (devlist)
{
dev = devlist;
while (dev)
{
if (strstr (dev->st, "InternetGatewayDevice"))
break;
dev = dev->pNext;
}
if (!dev)
dev = devlist; /* defaulting to first device */
printf("UPnP device :\n"
" desc: %s\n st: %s\n",
dev->descURL, dev->st);
struct UPNPDev* devlist;
struct UPNPDev* dev;
char* descXML;
int descXMLsize = 0;
int error = 0;
descXML = (char*)miniwget(dev->descURL, &descXMLsize);
if (descXML)
printf( "Portfwd::init()\n" );
m_urls = (UPNPUrls*)malloc( sizeof( struct UPNPUrls ) );
m_data = (IGDdatas*)malloc( sizeof( struct IGDdatas ) );
memset( m_urls, 0, sizeof( struct UPNPUrls ) );
memset( m_data, 0, sizeof( struct IGDdatas ) );
devlist = upnpDiscover( timeout, NULL, NULL, 0, 0, &error );
if ( devlist )
{
dev = devlist;
while ( dev )
{
printf( "descurl: %s\n", dev->descURL );
bool blocked = false;
std::list<std::string>::iterator it;
for ( it = m_blockedips.begin(); it != m_blockedips.end(); ++it )
{
printf( "blocked ip: %s\n", it->c_str() );
if ( strstr( dev->descURL, it->c_str() ) )
{
printf( "nope, we blocked this gateway: %s\n", dev->descURL );
blocked = true;
}
}
if ( blocked )
{
dev = dev->pNext;
continue;
}
if ( strstr( dev->st, "InternetGatewayDevice" ) )
break;
dev = dev->pNext;
}
if ( !dev )
dev = devlist; /* defaulting to first device */
printf( "UPnP device :\n"
" desc: %s\n st: %s\n",
dev->descURL, dev->st );
descXML = (char*)miniwget( dev->descURL, &descXMLsize );
if ( descXML )
{
parserootdesc (descXML, descXMLsize, data);
free (descXML); descXML = 0;
GetUPNPUrls (urls, data, dev->descURL);
parserootdesc( descXML, descXMLsize, m_data );
free( descXML );
descXML = 0;
GetUPNPUrls( m_urls, m_data, dev->descURL );
}
else
{
printf("couldn't get the UPnP device description XML (descXML is null)");
freeUPNPDevlist(devlist);
printf( "couldn't get the UPnP device description XML (descXML is null)" );
freeUPNPDevlist( devlist );
return false;
}
// get lan IP:
char lanaddr[16];
int idg_was_found = UPNP_GetValidIGD(devlist, urls, data, (char*)&lanaddr, 16);
printf("UPNP_GetValidIGD returned %d", idg_was_found);
if (!idg_was_found)
int idg_was_found = UPNP_GetValidIGD( devlist, m_urls, m_data, (char*)&lanaddr, 16 );
if ( !idg_was_found )
{
printf("NO IGD was found (function UPNP_GetValidIGD())");
freeUPNPDevlist(devlist);
printf( "NO IGD was found (function UPNP_GetValidIGD())" );
freeUPNPDevlist( devlist );
return false;
}
m_lanip = std::string(lanaddr);
m_lanip = std::string( lanaddr );
freeUPNPDevlist(devlist);
freeUPNPDevlist( devlist );
get_status();
return true;
}
return false;
}
void
Portfwd::get_status()
{
// Q_ASSERT(urls->controlURL_CIF != NULL);
// get connection speed
UPNP_GetLinkLayerMaxBitRates(
urls->controlURL_CIF, data->CIF.servicetype, &m_downbps, &m_upbps);
UPNP_GetLinkLayerMaxBitRates( m_urls->controlURL_CIF, m_data->CIF.servicetype, &m_downbps, &m_upbps );
// get external IP adress
char ip[16];
if( 0 != UPNP_GetExternalIPAddress( urls->controlURL,
data->CIF.servicetype,
(char*)&ip ) )
if ( 0 != UPNP_GetExternalIPAddress( m_urls->controlURL, m_data->CIF.servicetype, (char*)&ip ) )
{
m_externalip = ""; //failed
}else{
m_externalip = std::string(ip);
}
else
{
m_externalip = std::string( ip );
}
}
bool
Portfwd::add( unsigned short port, unsigned short internal_port )
{
char port_str[16], port_str_internal[16];
int r;
printf("Portfwd::add (%s, %d)\n", m_lanip.c_str(), port);
if(urls->controlURL[0] == '\0')
{
printf("Portfwd - the init was not done !\n");
return false;
}
sprintf(port_str, "%d", port);
sprintf(port_str_internal, "%d", internal_port);
char port_str[16], port_str_internal[16];
int r;
printf( "Portfwd::add (%s, %d)\n", m_lanip.c_str(), port );
if ( m_urls->controlURL[0] == '\0' )
{
printf( "Portfwd - the init was not done!\n" );
return false;
}
r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype,
port_str, port_str_internal, m_lanip.c_str(), "tomahawk", "TCP", NULL);
if(r!=0)
{
printf("AddPortMapping(%s, %s, %s) failed, code %d\n", port_str, port_str, m_lanip.c_str(), r);
return false;
}
return true;
sprintf( port_str, "%d", port );
sprintf( port_str_internal, "%d", internal_port );
r = UPNP_AddPortMapping( m_urls->controlURL, m_data->first.servicetype, port_str, port_str_internal, m_lanip.c_str(), "tomahawk", "TCP", NULL, NULL );
if ( r != 0 )
{
printf( "AddPortMapping(%s, %s, %s) failed, code %d\n", port_str, port_str, m_lanip.c_str(), r );
return false;
}
return true;
}
bool
Portfwd::remove( unsigned short port )
{
char port_str[16];
printf("Portfwd::remove(%d)\n", port);
if(urls->controlURL[0] == '\0')
printf( "Portfwd::remove(%d)\n", port );
if ( m_urls->controlURL[0] == '\0' )
{
printf("Portfwd - the init was not done !\n");
printf( "Portfwd - the init was not done!\n" );
return false;
}
sprintf(port_str, "%d", port);
int r = UPNP_DeletePortMapping(urls->controlURL, data->first.servicetype, port_str, "TCP", NULL);
sprintf( port_str, "%d", port );
int r = UPNP_DeletePortMapping( m_urls->controlURL, m_data->first.servicetype, port_str, "TCP", NULL );
return r == 0;
}
void
Portfwd::addBlockedDevice( const std::string& ip )
{
printf( "adding blocked: %s\n", ip.c_str() );
m_blockedips.push_back( ip );
}