diff --git a/client/3rd/AdpInfo/netadpinfo.h b/client/3rd/AdpInfo/netadpinfo.h index 8ad5fdec..9b6a8507 100644 --- a/client/3rd/AdpInfo/netadpinfo.h +++ b/client/3rd/AdpInfo/netadpinfo.h @@ -11,20 +11,18 @@ namespace adpinfo{ // {false,""} - no error // {true,"descr"} - error with description using RET_TYPE = std::tuple; - -//using ROUTE_TABLE = std::tuple; - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* * Getting the route table */ typedef struct route_table{ - std::string szDestIp; - std::string szMaskIp; - std::string szGatewayIp; - std::string szInterfaceIp; + std::string szDestIp{}; + std::string szMaskIp{}; + std::string szGatewayIp{}; + std::string szInterfaceIp{}; + unsigned long ulIfIndex{}; }route_table; -std::vector>get_route_table(); +std::vector*/route_table>get_route_table(std::string_view); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* * The object uses for collect the information about active network adapters/interfaces diff --git a/client/3rd/AdpInfo/win_netadpinfo.cc b/client/3rd/AdpInfo/win_netadpinfo.cc index 885585da..79487315 100644 --- a/client/3rd/AdpInfo/win_netadpinfo.cc +++ b/client/3rd/AdpInfo/win_netadpinfo.cc @@ -112,7 +112,7 @@ static std::string get_interface_ip(DWORD index){ break; adapter_iterator = adapter_iterator->Next; }//end while - if (adapter_iterator != nullptr || adapter_iterator != 0x0 || adapter_iterator != NULL) + if ( adapter_iterator != nullptr || adapter_iterator != 0x0 || adapter_iterator != NULL ) _ipaddr = std::string(adapter_iterator->IpAddressList.IpAddress.String, 16); else _ipaddr = "127.0.0.1"; @@ -120,9 +120,11 @@ static std::string get_interface_ip(DWORD index){ } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ namespace adpinfo { -std::vector>get_route_table(){ - std::vector< std::tuple>ret_table{}; +std::vectorget_route_table(std::string_view ipifaddrs){ + + /*std::tuple*/ + std::vectorret_table{}; PMIB_IPFORWARDTABLE p_table{nullptr}; struct in_addr ip_addr{}; DWORD size{}; @@ -155,8 +157,45 @@ std::vector>get_r const auto &ifname = get_interface_ip(p_table->table[i].dwForwardIfIndex); const auto &ifnameSize = ifname.length() + 1; strcpy_s(szInterfaceIp, ifnameSize, ifname.data()); - const auto &mt = std::make_tuple(std::string(szDestIp), std::string(szMaskIp), std::string(szGatewayIp), std::string(szInterfaceIp)); - ret_table.emplace_back(mt); + if (ipifaddrs.length() == 0){ + //std::make_tuple(std::string(szDestIp), std::string(szMaskIp), std::string(szGatewayIp), std::string(szInterfaceIp)); + const route_table &mt = { + std::string(szDestIp), + std::string(szMaskIp), + std::string(szGatewayIp), + std::string(szInterfaceIp), + p_table->table[i].dwForwardIfIndex + }; + ret_table.emplace_back(mt); + }else{ + bool in_not_empty = (ifname.find(ipifaddrs) != std::string::npos); + //bool in_as_destIp = ( std::string(szDestIp).find(ipifaddrs) != std::string::npos); + bool destIp_as_zero = (std::string(szDestIp).find("0.0.0.0") != std::string::npos); + bool mask_as_zero = (std::string(szMaskIp).find("0.0.0.0") != std::string::npos); +// bool ip_the_same = ( +// std::string(szDestIp).find(ipifaddrs) != std::string::npos && +// std::string(szDestIp).find(szGatewayIp) != std::string::npos && +// std::string(szDestIp).find(szInterfaceIp) != std::string::npos +// ); +// bool not_default = (std::string(szDestIp).find("127.0.0.1") == std::string::npos); + + if ( in_not_empty && + // in_as_destIp && + destIp_as_zero && + mask_as_zero//) || ( ip_the_same && not_default ) + ) + { + // finded + const route_table &mt = { + std::string(szDestIp), + std::string(szMaskIp), + std::string(szGatewayIp), + std::string(szInterfaceIp), + p_table->table[i].dwForwardIfIndex + };//std::make_tuple(std::string(szDestIp), std::string(szMaskIp), std::string(szGatewayIp), std::string(szInterfaceIp)); + ret_table.emplace_back(mt); + } + } }//end for }//end if return ret_table; @@ -223,14 +262,14 @@ RET_TYPE NetAdpInfo::collect_adapters_data(){ _tmp->set_description(adapter_iterator->Description); _tmp->set_local_address(adapter_iterator->IpAddressList.IpAddress.String); std::string lgw = adapter_iterator->GatewayList.IpAddress.String; - if (lgw.length() == 0 || lgw.find("0.0.0.0") != std::string::npos) - { - //lgw = get_founded_route("8.8.8.8"); - if (adapter_iterator->DhcpEnabled == 1) - { - lgw = adapter_iterator->DhcpServer.IpAddress.String; - } - } + // if (lgw.length() == 0 || lgw.find("0.0.0.0") != std::string::npos) + // { + // //lgw = get_founded_route("8.8.8.8"); + // if (adapter_iterator->DhcpEnabled == 1) + // { + // lgw = adapter_iterator->DhcpServer.IpAddress.String; + // } + // } _tmp->set_local_gateway(lgw); _tmp->set_route_gateway(get_route_gateway()); _adapters.emplace_back(_tmp); @@ -251,10 +290,7 @@ RET_TYPE NetAdpInfo::get_adapter_info(std::string_view _adapter_name){ for (auto i = 0; i< len; ++i){ auto adap_name = _adapters[i]->get_name(); auto adap_desc = _adapters[i]->get_description(); - qDebug()<<"adap name : "<(ret) == false){ @@ -183,19 +183,23 @@ void Ikev2Protocol::newConnectionStateEventReceived(UINT unMsg, tagRASCONNSTATE qDebug()<<"My ikev2 m_routeGateway "<(itret); - const auto msk = std::get<1>(itret); - const auto gw = std::get<2>(itret); - const auto itf = std::get<3>(itret); - qDebug()<<"IP["<(itret); + const auto msk = itret.szMaskIp;//std::get<1>(itret); + const auto gw = itret.szGatewayIp;//std::get<2>(itret); + const auto itf = itret.szInterfaceIp;//std::get<3>(itret); + const auto itfInd = itret.ulIfIndex; + qDebug()<<"IP["<(itret); - const auto msk = std::get<1>(itret); - const auto gw = std::get<2>(itret); - const auto itf = std::get<3>(itret); - qDebug()<<"IP["<(itret); + const auto msk = itret.szMaskIp;//std::get<1>(itret); + const auto gw = itret.szGatewayIp;//std::get<2>(itret); + const auto itf = itret.szInterfaceIp;//std::get<3>(itret); + const auto itfInd = itret.ulIfIndex; + qDebug()<<"IP["<(ret)); diff --git a/client/protocols/vpnprotocol.h b/client/protocols/vpnprotocol.h index 11fcb7d9..0e3b98de 100644 --- a/client/protocols/vpnprotocol.h +++ b/client/protocols/vpnprotocol.h @@ -50,6 +50,8 @@ signals: void timeoutTimerEvent(); void protocolError(amnezia::ErrorCode e); + void route_avaible(QString ip, QString mask, QString gateway, QString interface_ip, unsigned long interface_index); + public slots: virtual void onTimeout(); // todo: remove? diff --git a/client/protocols/wireguardprotocol.cpp b/client/protocols/wireguardprotocol.cpp index 86532f2c..f563586c 100644 --- a/client/protocols/wireguardprotocol.cpp +++ b/client/protocols/wireguardprotocol.cpp @@ -175,31 +175,38 @@ ErrorCode WireguardProtocol::start() { //TODO:FIXME: without some ugly sleep we have't get a adapter parametrs std::this_thread::sleep_for(std::chrono::seconds(4)); - std::string p1{},p2{};//,p3; + std::string p1{},p2{},p3; const auto &ret = adpInfo.get_adapter_info("WireGuard Tunnel");//serviceName().toStdString());//("AmneziaVPN IKEv2"); if (std::get<0>(ret) == false){ p1 = adpInfo.get_adapter_route_gateway(); p2 = adpInfo.get_adapter_local_address(); - //p3 = adpInfo.get_adapter_local_gateway(); + p3 = adpInfo.get_adapter_local_gateway(); m_routeGateway = QString::fromStdString(p1); m_vpnLocalAddress = QString::fromStdString(p2); - m_vpnGateway = protocols::wireguard::defaultSubnetAddress;//QString::fromStdString(p3); + m_vpnGateway = QString::fromStdString(p3); qDebug()<<"My wireguard m_routeGateway "<(itret); - const auto msk = std::get<1>(itret); - const auto gw = std::get<2>(itret); - const auto itf = std::get<3>(itret); - qDebug()<<"IP["<(itret); + const auto msk = itret.szMaskIp;//std::get<1>(itret); + const auto gw = itret.szGatewayIp;//std::get<2>(itret); + const auto itf = itret.szInterfaceIp;//std::get<3>(itret); + const auto itfInd = itret.ulIfIndex; + qDebug()<<"IP["<(ret));