You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2521 lines
100 KiB
2521 lines
100 KiB
/* This file is part of the TDE libraries
|
|
Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "network-manager.h"
|
|
#include "network-manager_p.h"
|
|
|
|
#define PRINT_ERROR(x) printf("[TDE NM Backend ERROR] %s\n\r", x.ascii());
|
|
#define UPDATE_STRING_SETTING_IF_VALID(string, key, settingsMap) if (!string.isNull()) settingsMap[key] = convertDBUSDataToVariantData(TQT_DBusData::fromString(string)); \
|
|
else settingsMap.remove(key);
|
|
|
|
#define NM_ASYNC_TIMEOUT_MS 1000
|
|
|
|
#define DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
|
|
TQ_UINT32 reverseIPV4ByteOrder(TQ_UINT32 address) {
|
|
TQ_UINT32 ret;
|
|
unsigned char valuearray[4];
|
|
valuearray[0] = (address & 0xff000000) >> 24;
|
|
valuearray[1] = (address & 0x00ff0000) >> 16;
|
|
valuearray[2] = (address & 0x0000ff00) >> 8;
|
|
valuearray[3] = (address & 0x000000ff) >> 0;
|
|
ret = 0;
|
|
ret = ret | (valuearray[0] << 0);
|
|
ret = ret | (valuearray[1] << 8);
|
|
ret = ret | (valuearray[2] << 16);
|
|
ret = ret | (valuearray[3] << 24);
|
|
return ret;
|
|
}
|
|
|
|
TQT_DBusData convertDBUSDataToVariantData(TQT_DBusData object) {
|
|
TQT_DBusVariant variant;
|
|
variant.value = object;
|
|
variant.signature = variant.value.buildDBusSignature();
|
|
return TQT_DBusData::fromVariant(variant);
|
|
}
|
|
|
|
void printDBUSObjectStructure(TQT_DBusData object, int level=0) {
|
|
int i;
|
|
TQString levelIndent = "";
|
|
for (i=0; i<level; i++) {
|
|
levelIndent = levelIndent + " ";
|
|
}
|
|
TQCString signature = object.buildDBusSignature();
|
|
printf("%s%s\n\r", levelIndent.ascii(), signature.data()); fflush(stdout);
|
|
|
|
if (object.type() == TQT_DBusData::Map) {
|
|
// HACK
|
|
// NetworkManager currently uses string key maps exclusively as far as I can tell, so this should be adequate for the time being
|
|
TQMap<TQString, TQT_DBusData> outerMap = object.toStringKeyMap().toTQMap();
|
|
TQMap<TQString, TQT_DBusData>::const_iterator it;
|
|
for (it = outerMap.begin(); it != outerMap.end(); ++it) {
|
|
printDBUSObjectStructure(*it, level+1);
|
|
}
|
|
}
|
|
if (object.type() == TQT_DBusData::List) {
|
|
TQT_DBusDataValueList valueList = object.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it;
|
|
for (it = valueList.begin(); it != valueList.end(); ++it) {
|
|
printDBUSObjectStructure(*it, level+1);
|
|
}
|
|
}
|
|
else if (object.type() == TQT_DBusData::Variant) {
|
|
TQT_DBusVariant dataValueVariant = object.toVariant();
|
|
TQT_DBusData dataValue = dataValueVariant.value;
|
|
printDBUSObjectStructure(dataValue, level+1);
|
|
}
|
|
}
|
|
|
|
TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags nmGlobalStateToTDEGlobalState(TQ_UINT32 nmType) {
|
|
TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags ret = TDENetworkGlobalManagerFlags::Unknown;
|
|
|
|
if (nmType == NM_STATE_UNKNOWN) {
|
|
ret |= TDENetworkGlobalManagerFlags::Unknown;
|
|
}
|
|
else if (nmType == NM_STATE_ASLEEP) {
|
|
ret |= TDENetworkGlobalManagerFlags::Disconnected;
|
|
ret |= TDENetworkGlobalManagerFlags::Sleeping;
|
|
}
|
|
else if (nmType == NM_STATE_DISCONNECTED) {
|
|
ret |= TDENetworkGlobalManagerFlags::Disconnected;
|
|
}
|
|
else if (nmType == NM_STATE_DISCONNECTING) {
|
|
ret |= TDENetworkGlobalManagerFlags::Connected;
|
|
ret |= TDENetworkGlobalManagerFlags::DeactivatingLink;
|
|
}
|
|
else if (nmType == NM_STATE_CONNECTING) {
|
|
ret |= TDENetworkGlobalManagerFlags::Disconnected;
|
|
ret |= TDENetworkGlobalManagerFlags::EstablishingLink;
|
|
}
|
|
else if (nmType == NM_STATE_CONNECTED_LOCAL) {
|
|
ret |= TDENetworkGlobalManagerFlags::Connected;
|
|
ret |= TDENetworkGlobalManagerFlags::LinkLocalAccess;
|
|
}
|
|
else if (nmType == NM_STATE_CONNECTED_SITE) {
|
|
ret |= TDENetworkGlobalManagerFlags::Connected;
|
|
ret |= TDENetworkGlobalManagerFlags::SiteLocalAccess;
|
|
}
|
|
else if (nmType == NM_STATE_CONNECTED_GLOBAL) {
|
|
ret |= TDENetworkGlobalManagerFlags::Connected;
|
|
ret |= TDENetworkGlobalManagerFlags::GlobalAccess;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus nmDeviceStateToTDEDeviceState(TQ_UINT32 nmType) {
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus ret = TDENetworkConnectionStatus::Invalid;
|
|
|
|
if (nmType == NM_DEVICE_STATE_UNKNOWN) {
|
|
ret |= TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_UNMANAGED) {
|
|
ret |= TDENetworkConnectionStatus::UnManaged;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_UNAVAILABLE) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::LinkUnavailable;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_DISCONNECTED) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_PREPARE) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::EstablishingLink;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_CONFIG) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::EstablishingLink;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_NEED_AUTH) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::NeedAuthorization;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_IP_CONFIG) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::ConfiguringProtocols;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_IP_CHECK) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::VerifyingProtocols;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_SECONDARIES) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::DependencyWait;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_ACTIVATED) {
|
|
ret |= TDENetworkConnectionStatus::Connected;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_DEACTIVATING) {
|
|
ret |= TDENetworkConnectionStatus::Connected;
|
|
ret |= TDENetworkConnectionStatus::DeactivatingLink;
|
|
}
|
|
else if (nmType == NM_DEVICE_STATE_FAILED) {
|
|
ret |= TDENetworkConnectionStatus::Disconnected;
|
|
ret |= TDENetworkConnectionStatus::Failed;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkConnectionType::TDENetworkConnectionType TDENetworkConnectionManager_BackendNM::nmDeviceTypeToTDEDeviceType(TQ_UINT32 nmType) {
|
|
TDENetworkConnectionType::TDENetworkConnectionType ret = TDENetworkConnectionType::Other;
|
|
|
|
if (nmType == NM_DEVICE_TYPE_UNKNOWN) {
|
|
ret = TDENetworkConnectionType::Other;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_ETHERNET) {
|
|
ret = TDENetworkConnectionType::WiredEthernet;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_WIFI) {
|
|
ret = TDENetworkConnectionType::WiFi;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_UNUSED1) {
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_UNUSED2) {
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_BT) {
|
|
ret = TDENetworkConnectionType::Bluetooth;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_OLPC_MESH) {
|
|
ret = TDENetworkConnectionType::OLPCMesh;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_WIMAX) {
|
|
ret = TDENetworkConnectionType::WiMax;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_MODEM) {
|
|
ret = TDENetworkConnectionType::Modem;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_INFINIBAND) {
|
|
ret = TDENetworkConnectionType::Infiniband;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_BOND) {
|
|
ret = TDENetworkConnectionType::Bond;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_VLAN) {
|
|
ret = TDENetworkConnectionType::VLAN;
|
|
}
|
|
else if (nmType == NM_DEVICE_TYPE_ADSL) {
|
|
ret = TDENetworkConnectionType::ADSL;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkIEEE8021xType::TDENetworkIEEE8021xType nmEAPTypeToTDEEAPType(TQString nm) {
|
|
TDENetworkIEEE8021xType::TDENetworkIEEE8021xType ret = TDENetworkIEEE8021xType::None;
|
|
|
|
if (nm.lower() == "") {
|
|
ret = TDENetworkIEEE8021xType::None;
|
|
}
|
|
else if (nm.lower() == "leap") {
|
|
ret = TDENetworkIEEE8021xType::LEAP;
|
|
}
|
|
else if (nm.lower() == "md5") {
|
|
ret = TDENetworkIEEE8021xType::MD5;
|
|
}
|
|
else if (nm.lower() == "pap") {
|
|
ret = TDENetworkIEEE8021xType::PAP;
|
|
}
|
|
else if (nm.lower() == "chap") {
|
|
ret = TDENetworkIEEE8021xType::CHAP;
|
|
}
|
|
else if (nm.lower() == "mschap") {
|
|
ret = TDENetworkIEEE8021xType::MSCHAP;
|
|
}
|
|
else if (nm.lower() == "mschapv2") {
|
|
ret = TDENetworkIEEE8021xType::MSCHAPV2;
|
|
}
|
|
else if (nm.lower() == "fast") {
|
|
ret = TDENetworkIEEE8021xType::Fast;
|
|
}
|
|
else if (nm.lower() == "psk") {
|
|
ret = TDENetworkIEEE8021xType::PSK;
|
|
}
|
|
else if (nm.lower() == "pax") {
|
|
ret = TDENetworkIEEE8021xType::PAX;
|
|
}
|
|
else if (nm.lower() == "sake") {
|
|
ret = TDENetworkIEEE8021xType::SAKE;
|
|
}
|
|
else if (nm.lower() == "gpsk") {
|
|
ret = TDENetworkIEEE8021xType::GPSK;
|
|
}
|
|
else if (nm.lower() == "tls") {
|
|
ret = TDENetworkIEEE8021xType::TLS;
|
|
}
|
|
else if (nm.lower() == "peap") {
|
|
ret = TDENetworkIEEE8021xType::PEAP;
|
|
}
|
|
else if (nm.lower() == "ttls") {
|
|
ret = TDENetworkIEEE8021xType::TTLS;
|
|
}
|
|
else if (nm.lower() == "sim") {
|
|
ret = TDENetworkIEEE8021xType::SIM;
|
|
}
|
|
else if (nm.lower() == "gtc") {
|
|
ret = TDENetworkIEEE8021xType::GTC;
|
|
}
|
|
else if (nm.lower() == "otp") {
|
|
ret = TDENetworkIEEE8021xType::OTP;
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("unknown EAP type %s requested in existing connection").arg(nm.lower()))
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TQString tdeEAPTypeToNMEAPType(TDENetworkIEEE8021xType::TDENetworkIEEE8021xType eaptype) {
|
|
TQString ret = "";
|
|
|
|
if (eaptype == TDENetworkIEEE8021xType::None) {
|
|
ret = "";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::LEAP) {
|
|
ret = "leap";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::MD5) {
|
|
ret = "md5";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::PAP) {
|
|
ret = "pap";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::CHAP) {
|
|
ret = "chap";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::MSCHAP) {
|
|
ret = "mschap";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::MSCHAPV2) {
|
|
ret = "mschapv2";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::Fast) {
|
|
ret = "fast";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::PSK) {
|
|
ret = "psk";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::PAX) {
|
|
ret = "pax";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::SAKE) {
|
|
ret = "sake";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::GPSK) {
|
|
ret = "gpsk";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::TLS) {
|
|
ret = "tls";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::PEAP) {
|
|
ret = "peap";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::TTLS) {
|
|
ret = "ttls";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::SIM) {
|
|
ret = "sim";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::GTC) {
|
|
ret = "gtc";
|
|
}
|
|
else if (eaptype == TDENetworkIEEE8021xType::OTP) {
|
|
ret = "otp";
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("unknown TDE EAP type %d requested in new or updated connection").arg(eaptype))
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkIEEE8021xFastFlags::TDENetworkIEEE8021xFastFlags nmEAPFastFlagsToTDEEAPFastFlags(TQString nm) {
|
|
TDENetworkIEEE8021xFastFlags::TDENetworkIEEE8021xFastFlags ret = TDENetworkIEEE8021xFastFlags::AllowUnauthenticated | TDENetworkIEEE8021xFastFlags::AllowAuthenticated;
|
|
|
|
unsigned int nm_int = nm.toUInt();
|
|
if (nm_int == NM_EAP_FAST_PROVISIONING_DISABLED) {
|
|
ret = TDENetworkIEEE8021xFastFlags::None;
|
|
}
|
|
else if (nm_int == NM_EAP_FAST_PROVISIONING_UNAUTHONLY) {
|
|
ret = TDENetworkIEEE8021xFastFlags::AllowUnauthenticated;
|
|
}
|
|
else if (nm_int == NM_EAP_FAST_PROVISIONING_AUTHONLY) {
|
|
ret = TDENetworkIEEE8021xFastFlags::AllowAuthenticated;
|
|
}
|
|
else if (nm_int == NM_EAP_FAST_PROVISIONING_BOTH) {
|
|
ret = TDENetworkIEEE8021xFastFlags::AllowUnauthenticated | TDENetworkIEEE8021xFastFlags::AllowAuthenticated;
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("unknown EAP fast flag %s requested in existing connection").arg(nm.lower()))
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TQString tdeEAPFastFlagsToNMEAPFastFlags(TDENetworkIEEE8021xFastFlags::TDENetworkIEEE8021xFastFlags eaptype) {
|
|
TQString ret = "";
|
|
|
|
if ((eaptype & TDENetworkIEEE8021xFastFlags::AllowUnauthenticated) && (eaptype & TDENetworkIEEE8021xFastFlags::AllowAuthenticated)) {
|
|
ret = TQString("%1").arg(NM_EAP_FAST_PROVISIONING_BOTH);
|
|
}
|
|
else if (eaptype & TDENetworkIEEE8021xFastFlags::AllowAuthenticated) {
|
|
ret = TQString("%1").arg(NM_EAP_FAST_PROVISIONING_AUTHONLY);
|
|
}
|
|
else if (eaptype & TDENetworkIEEE8021xFastFlags::AllowUnauthenticated) {
|
|
ret = TQString("%1").arg(NM_EAP_FAST_PROVISIONING_UNAUTHONLY);
|
|
}
|
|
else {
|
|
ret = TQString("%1").arg(NM_EAP_FAST_PROVISIONING_DISABLED);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkPasswordHandlingFlags::TDENetworkPasswordHandlingFlags nmPasswordFlagsToTDEPasswordFlags(unsigned int nm) {
|
|
TDENetworkPasswordHandlingFlags::TDENetworkPasswordHandlingFlags ret = TDENetworkPasswordHandlingFlags::None;
|
|
|
|
if (nm & NM_PASSWORD_SECRET_AGENTOWNED) {
|
|
ret |= TDENetworkPasswordHandlingFlags::ExternalStorage;
|
|
}
|
|
if (nm & NM_PASSWORD_SECRET_NOTSAVED) {
|
|
ret |= TDENetworkPasswordHandlingFlags::NoSave;
|
|
}
|
|
if (nm & NM_PASSWORD_SECRET_NOTREQUIRED) {
|
|
ret |= TDENetworkPasswordHandlingFlags::NoPrompt;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
unsigned int tdePasswordFlagsToNMPasswordFlags(TDENetworkPasswordHandlingFlags::TDENetworkPasswordHandlingFlags flags) {
|
|
unsigned int ret = 0;
|
|
|
|
if (flags & TDENetworkPasswordHandlingFlags::ExternalStorage) {
|
|
ret |= NM_PASSWORD_SECRET_AGENTOWNED;
|
|
}
|
|
if (flags & TDENetworkPasswordHandlingFlags::NoSave) {
|
|
ret |= NM_PASSWORD_SECRET_NOTSAVED;
|
|
}
|
|
if (flags & TDENetworkPasswordHandlingFlags::NoPrompt) {
|
|
ret |= NM_PASSWORD_SECRET_NOTREQUIRED;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkDeviceCapabilityFlags::TDENetworkDeviceCapabilityFlags nmCapabilityFlagsToTDECapabilityFlags(unsigned int nm) {
|
|
TDENetworkDeviceCapabilityFlags::TDENetworkDeviceCapabilityFlags ret = TDENetworkDeviceCapabilityFlags::None;
|
|
|
|
if (nm & NM_DEVICE_CAP_NM_SUPPORTED) {
|
|
ret |= TDENetworkDeviceCapabilityFlags::Supported;
|
|
}
|
|
if (nm & NM_DEVICE_CAP_CARRIER_DETECT) {
|
|
ret |= TDENetworkDeviceCapabilityFlags::CanDetectLink;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
unsigned int tdeCapabilityFlagsToNMCapabilityFlags(TDENetworkDeviceCapabilityFlags::TDENetworkDeviceCapabilityFlags flags) {
|
|
unsigned int ret = 0;
|
|
|
|
if (flags & TDENetworkDeviceCapabilityFlags::Supported) {
|
|
ret |= NM_DEVICE_CAP_NM_SUPPORTED;
|
|
}
|
|
if (flags & TDENetworkDeviceCapabilityFlags::CanDetectLink) {
|
|
ret |= NM_DEVICE_CAP_CARRIER_DETECT;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TDENetworkWiFiAPFlags::TDENetworkWiFiAPFlags nmAPSecFlagsToTDEAPSecFlags(unsigned int genflags, unsigned int nm) {
|
|
TDENetworkWiFiAPFlags::TDENetworkWiFiAPFlags ret = TDENetworkWiFiAPFlags::None;
|
|
|
|
if (genflags & NM_ACCESS_POINT_CAP_PRIVACY) {
|
|
ret |= TDENetworkWiFiAPFlags::PrivacySupport;
|
|
}
|
|
|
|
if (nm & NM_ACCESS_POINT_SEC_PAIR_WEP40) {
|
|
ret |= TDENetworkWiFiAPFlags::PairWEP40;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_PAIR_WEP104) {
|
|
ret |= TDENetworkWiFiAPFlags::PairWEP104;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_PAIR_TKIP) {
|
|
ret |= TDENetworkWiFiAPFlags::PairTKIP;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_PAIR_CCMP) {
|
|
ret |= TDENetworkWiFiAPFlags::PairCCMP;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_GROUP_WEP40) {
|
|
ret |= TDENetworkWiFiAPFlags::GroupWEP40;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_GROUP_WEP104) {
|
|
ret |= TDENetworkWiFiAPFlags::GroupWEP104;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_GROUP_TKIP) {
|
|
ret |= TDENetworkWiFiAPFlags::GroupTKIP;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_GROUP_CCMP) {
|
|
ret |= TDENetworkWiFiAPFlags::GroupCCMP;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_KEY_MGMT_PSK) {
|
|
ret |= TDENetworkWiFiAPFlags::KeyManagementPSK;
|
|
}
|
|
if (nm & NM_ACCESS_POINT_SEC_KEY_MGMT_802_1X) {
|
|
ret |= TDENetworkWiFiAPFlags::KeyManagement80211;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
unsigned int tdeAPSecFlagsToNMAPGenSecFlags(TDENetworkWiFiAPFlags::TDENetworkWiFiAPFlags flags) {
|
|
unsigned int ret = 0;
|
|
|
|
if (flags & TDENetworkWiFiAPFlags::PrivacySupport) {
|
|
ret |= NM_ACCESS_POINT_CAP_PRIVACY;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
unsigned int tdeAPSecFlagsToNMAPSecFlags(TDENetworkWiFiAPFlags::TDENetworkWiFiAPFlags flags) {
|
|
unsigned int ret = 0;
|
|
|
|
if (flags & TDENetworkWiFiAPFlags::PairWEP40) {
|
|
ret |= NM_ACCESS_POINT_SEC_PAIR_WEP40;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::PairWEP104) {
|
|
ret |= NM_ACCESS_POINT_SEC_PAIR_WEP104;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::PairTKIP) {
|
|
ret |= NM_ACCESS_POINT_SEC_PAIR_TKIP;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::PairCCMP) {
|
|
ret |= NM_ACCESS_POINT_SEC_PAIR_CCMP;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::GroupWEP40) {
|
|
ret |= NM_ACCESS_POINT_SEC_GROUP_WEP40;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::GroupWEP104) {
|
|
ret |= NM_ACCESS_POINT_SEC_GROUP_WEP104;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::GroupTKIP) {
|
|
ret |= NM_ACCESS_POINT_SEC_GROUP_TKIP;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::GroupCCMP) {
|
|
ret |= NM_ACCESS_POINT_SEC_GROUP_CCMP;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::KeyManagementPSK) {
|
|
ret |= NM_ACCESS_POINT_SEC_KEY_MGMT_PSK;
|
|
}
|
|
if (flags & TDENetworkWiFiAPFlags::KeyManagement80211) {
|
|
ret |= NM_ACCESS_POINT_SEC_KEY_MGMT_802_1X;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TQString TDENetworkConnectionManager_BackendNM::deviceInterfaceString(TQString macAddress) {
|
|
if (d->m_networkManagerProxy) {
|
|
TQT_DBusObjectPathList devices;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
ret = d->m_networkManagerProxy->GetDevices(devices, error);
|
|
if (ret) {
|
|
TQT_DBusObjectPathList::iterator it;
|
|
for (it = devices.begin(); it != devices.end(); ++it) {
|
|
DBus::DeviceProxy genericDevice(NM_DBUS_SERVICE, (*it));
|
|
genericDevice.setConnection(TQT_DBusConnection::systemBus());
|
|
TDENetworkConnectionType::TDENetworkConnectionType deviceType = nmDeviceTypeToTDEDeviceType(genericDevice.getDeviceType(error));
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
break;
|
|
}
|
|
else if (deviceType == TDENetworkConnectionType::WiredEthernet) {
|
|
DBus::EthernetDeviceProxy ethernetDevice(NM_DBUS_SERVICE, (*it));
|
|
ethernetDevice.setConnection(TQT_DBusConnection::systemBus());
|
|
TQString candidateMACAddress = ethernetDevice.getPermHwAddress(error);
|
|
if (!error.isValid()) {
|
|
if (candidateMACAddress.lower() == macAddress.lower()) {
|
|
return (*it);
|
|
}
|
|
}
|
|
}
|
|
else if (deviceType == TDENetworkConnectionType::WiFi) {
|
|
DBus::WiFiDeviceProxy wiFiDevice(NM_DBUS_SERVICE, (*it));
|
|
wiFiDevice.setConnection(TQT_DBusConnection::systemBus());
|
|
TQString candidateMACAddress = wiFiDevice.getPermHwAddress(error);
|
|
if (!error.isValid()) {
|
|
if (candidateMACAddress.lower() == macAddress.lower()) {
|
|
return (*it);
|
|
}
|
|
}
|
|
}
|
|
// FIXME
|
|
// Add other supported device types here
|
|
}
|
|
return "";
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return "";
|
|
}
|
|
}
|
|
else {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
TDENetworkConnectionManager_BackendNM::TDENetworkConnectionManager_BackendNM(TQString macAddress) : TDENetworkConnectionManager(macAddress) {
|
|
d = new TDENetworkConnectionManager_BackendNMPrivate();
|
|
|
|
// Set up proxy interfaces
|
|
d->m_networkManagerProxy = new DBus::NetworkManagerProxy(NM_DBUS_SERVICE, NM_DBUS_PATH);
|
|
d->m_networkManagerProxy->setConnection(TQT_DBusConnection::systemBus());
|
|
d->m_networkManagerSettings = new DBus::SettingsInterface(NM_DBUS_SERVICE, NM_DBUS_PATH_SETTINGS);
|
|
d->m_networkManagerSettings->setConnection(TQT_DBusConnection::systemBus());
|
|
|
|
TQString dbusDeviceString = deviceInterfaceString(macAddress);
|
|
if (dbusDeviceString != "") {
|
|
d->m_networkDeviceProxy = new DBus::DeviceProxy(NM_DBUS_SERVICE, dbusDeviceString);
|
|
d->m_networkDeviceProxy->setConnection(TQT_DBusConnection::systemBus());
|
|
}
|
|
|
|
// Connect global signals
|
|
connect(d->m_networkManagerProxy, SIGNAL(StateChanged(TQ_UINT32)), this, SLOT(internalProcessGlobalStateChanged(TQ_UINT32)));
|
|
|
|
// Connect local signals
|
|
if (d->m_networkDeviceProxy) {
|
|
connect(d->m_networkDeviceProxy, SIGNAL(StateChanged(TQ_UINT32, TQ_UINT32, TQ_UINT32)), this, SLOT(internalProcessDeviceStateChanged(TQ_UINT32, TQ_UINT32, TQ_UINT32)));
|
|
}
|
|
|
|
// Create public lists
|
|
m_connectionList = new TDENetworkConnectionList;
|
|
m_hwNeighborList = new TDENetworkHWNeighborList;
|
|
}
|
|
|
|
TDENetworkConnectionManager_BackendNM::~TDENetworkConnectionManager_BackendNM() {
|
|
// Destroy public lists
|
|
clearTDENetworkConnectionList();
|
|
delete m_connectionList;
|
|
clearTDENetworkHWNeighborList();
|
|
delete m_hwNeighborList;
|
|
|
|
// Tear down proxy interfaces
|
|
if (d->m_networkManagerProxy) delete d->m_networkManagerProxy;
|
|
if (d->m_networkManagerSettings) delete d->m_networkManagerSettings;
|
|
if (d->m_networkDeviceProxy) delete d->m_networkDeviceProxy;
|
|
|
|
delete d;
|
|
}
|
|
|
|
void TDENetworkConnectionManager_BackendNM::internalProcessGlobalStateChanged(TQ_UINT32 state) {
|
|
internalNetworkConnectionStateChanged(nmGlobalStateToTDEGlobalState(state));
|
|
}
|
|
|
|
void TDENetworkConnectionManager_BackendNM::internalProcessDeviceStateChanged(TQ_UINT32 newState, TQ_UINT32 oldState, TQ_UINT32 reason) {
|
|
Q_UNUSED(oldState)
|
|
Q_UNUSED(reason)
|
|
internalNetworkDeviceStateChanged(nmDeviceStateToTDEDeviceState(newState), m_macAddress);
|
|
}
|
|
|
|
TDENetworkConnectionType::TDENetworkConnectionType TDENetworkConnectionManager_BackendNM::connectionType() {
|
|
if (m_macAddress == "") {
|
|
return TDENetworkConnectionType::BackendOnly;
|
|
}
|
|
else {
|
|
// Query NM for the device type
|
|
TQT_DBusError error;
|
|
TQString dbusDeviceString = deviceInterfaceString(m_macAddress);
|
|
DBus::DeviceProxy genericDevice(NM_DBUS_SERVICE, dbusDeviceString);
|
|
genericDevice.setConnection(TQT_DBusConnection::systemBus());
|
|
TDENetworkConnectionType::TDENetworkConnectionType ret = nmDeviceTypeToTDEDeviceType(genericDevice.getDeviceType(error));
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return TDENetworkConnectionType::Other;
|
|
}
|
|
else {
|
|
return ret;
|
|
}
|
|
}
|
|
}
|
|
|
|
TDENetworkGlobalManagerFlags::TDENetworkGlobalManagerFlags TDENetworkConnectionManager_BackendNM::backendStatus() {
|
|
if (d->m_networkManagerProxy) {
|
|
TQ_UINT32 ret;
|
|
TQT_DBusError error;
|
|
ret = d->m_networkManagerProxy->getState(error);
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return TDENetworkGlobalManagerFlags::Unknown;
|
|
}
|
|
else {
|
|
return nmGlobalStateToTDEGlobalState(ret);
|
|
}
|
|
}
|
|
else {
|
|
return TDENetworkGlobalManagerFlags::Unknown;
|
|
}
|
|
}
|
|
|
|
TDENetworkDeviceInformation TDENetworkConnectionManager_BackendNM::deviceInformation() {
|
|
TQT_DBusError error;
|
|
TDENetworkDeviceInformation ret;
|
|
|
|
if (d->m_networkDeviceProxy) {
|
|
ret.statusFlags = nmDeviceStateToTDEDeviceState(d->m_networkDeviceProxy->getState(error));
|
|
ret.UUID = d->m_networkDeviceProxy->getUdi(error);
|
|
ret.backendDriver = d->m_networkDeviceProxy->getDriver(error);
|
|
ret.backendDriverVersion = d->m_networkDeviceProxy->getDriverVersion(error);
|
|
ret.firmwareVersion = d->m_networkDeviceProxy->getFirmwareVersion(error);
|
|
ret.capabilityFlags = nmCapabilityFlagsToTDECapabilityFlags(d->m_networkDeviceProxy->getCapabilities(error));
|
|
// ipConfiguration is not filled in, as the TDE HW library provides complementary functionality and is more reliable/easier to use and maintain
|
|
ret.managed = d->m_networkDeviceProxy->getManaged(error);
|
|
ret.autoConnect = d->m_networkDeviceProxy->getAutoconnect(error);
|
|
ret.firmwareMissing = d->m_networkDeviceProxy->getFirmwareMissing(error);
|
|
ret.deviceType = nmDeviceTypeToTDEDeviceType(d->m_networkDeviceProxy->getDeviceType(error));
|
|
// FIXME wiFiInfo is not filled in
|
|
ret.valid = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void TDENetworkConnectionManager_BackendNMPrivate::processConnectionSettingsAsyncReply(int asyncCallId, const TQT_DBusDataMap<TQString>& settings) {
|
|
nmConnectionSettingsAsyncCallWaiting[asyncCallId] = false;
|
|
nmConnectionSettingsAsyncSettingsResponse[asyncCallId] = settings;
|
|
}
|
|
|
|
void TDENetworkConnectionManager_BackendNMPrivate::processConnectionSettingsUpdateAsyncReply(int asyncCallId) {
|
|
nmConnectionSettingsAsyncCallWaiting[asyncCallId] = false;
|
|
}
|
|
|
|
void TDENetworkConnectionManager_BackendNMPrivate::processAddConnectionAsyncReply(int asyncCallId, const TQT_DBusObjectPath& path) {
|
|
nmConnectionSettingsAsyncCallWaiting[asyncCallId] = false;
|
|
nmAddConnectionAsyncResponse[asyncCallId] = path;
|
|
}
|
|
|
|
void TDENetworkConnectionManager_BackendNM::loadConnectionInformation() {
|
|
TDEMACAddress deviceMACAddress;
|
|
deviceMACAddress.fromString(m_macAddress);
|
|
|
|
if (d->m_networkManagerSettings) {
|
|
clearTDENetworkConnectionList();
|
|
TQT_DBusObjectPathList connections;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
int state;
|
|
ret = d->m_networkManagerSettings->ListConnections(connections, error);
|
|
if (ret) {
|
|
TQT_DBusObjectPathList::iterator it;
|
|
for (it = connections.begin(); it != connections.end(); ++it) {
|
|
TDENetworkConnection* connection;
|
|
TDEWiredEthernetConnection* ethernetConnection = NULL;
|
|
TDEWiFiConnection* wiFiConnection = NULL;
|
|
TDENetworkConnectionType::TDENetworkConnectionType connType = connectionType();
|
|
if (connType == TDENetworkConnectionType::WiredEthernet) {
|
|
connection = ethernetConnection = new TDEWiredEthernetConnection;
|
|
}
|
|
if (connType == TDENetworkConnectionType::WiFi) {
|
|
connection = wiFiConnection = new TDEWiFiConnection;
|
|
}
|
|
else {
|
|
connection = new TDENetworkConnection;
|
|
}
|
|
// Set up defaults
|
|
connection->ipConfig.connectionFlags = TDENetworkIPConfigurationFlags::IPV4DHCPIP | \
|
|
TDENetworkIPConfigurationFlags::IPV4DHCPDNS | \
|
|
TDENetworkIPConfigurationFlags::IPV4DHCPRoutes | \
|
|
TDENetworkIPConfigurationFlags::IPV4MayUseAsDefaultRoute | \
|
|
TDENetworkIPConfigurationFlags::IPV6DHCPIP | \
|
|
TDENetworkIPConfigurationFlags::IPV6DHCPDNS | \
|
|
TDENetworkIPConfigurationFlags::IPV6DHCPRoutes | \
|
|
TDENetworkIPConfigurationFlags::IPV6MayUseAsDefaultRoute;
|
|
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] %s\n\r", (*it).data()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
|
|
// Obtain connection settings from the path specified
|
|
DBus::ConnectionSettingsInterface connectionSettings(NM_DBUS_SERVICE, (*it));
|
|
connectionSettings.setConnection(TQT_DBusConnection::systemBus());
|
|
connect(&connectionSettings, SIGNAL(GetSettingsAsyncReply(int, const TQT_DBusDataMap<TQString>&)), d, SLOT(processConnectionSettingsAsyncReply(int, const TQT_DBusDataMap<TQString>&)));
|
|
int asyncCallID;
|
|
ret = connectionSettings.GetSettingsAsync(asyncCallID, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
tqApp->processEvents();
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
}
|
|
TQT_DBusTQStringDataMap connectionSettingsMap = d->nmConnectionSettingsAsyncSettingsResponse[asyncCallID];
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
d->nmConnectionSettingsAsyncSettingsResponse.remove(asyncCallID);
|
|
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] received DBUS object structure map follows:\n\r"); fflush(stdout);
|
|
printDBUSObjectStructure(TQT_DBusData::fromStringKeyMap(connectionSettingsMap));
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
|
|
// Parse settings
|
|
TQT_DBusTQStringDataMap::const_iterator it2;
|
|
for (it2 = connectionSettingsMap.begin(); it2 != connectionSettingsMap.end(); ++it2) {
|
|
TQString outerKeyValue = it2.key();
|
|
TQT_DBusData dataValue = it2.data();
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] [%s]\n\r", outerKeyValue.ascii()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
TQT_DBusTQStringDataMap nestedConnectionSettingsMap = dataValue.toStringKeyMap();
|
|
TQT_DBusTQStringDataMap::const_iterator it3;
|
|
for (it3 = nestedConnectionSettingsMap.begin(); it3 != nestedConnectionSettingsMap.end(); ++it3) {
|
|
TQString keyValue = it3.key();
|
|
TQT_DBusData dataValue = it3.data();
|
|
if (dataValue.type() != TQT_DBusData::Variant) {
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] %s = %s (type %d(%s))\n\r", keyValue.ascii(), dataValue.toString().ascii(), dataValue.type(), dataValue.typeName()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
// No NM settings are known which use this style
|
|
}
|
|
else {
|
|
TQT_DBusVariant dataValueVariant = dataValue.toVariant();
|
|
TQT_DBusData dataValue2 = dataValueVariant.value;
|
|
if (dataValue2.type() != TQT_DBusData::Variant) {
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] %s = %s (type %d(%s), signature %s)\n\r", keyValue.ascii(), dataValue2.toString().ascii(), dataValue2.type(), dataValue2.typeName(), dataValueVariant.signature.ascii()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
// Most NM settings use this style
|
|
if (outerKeyValue.lower() == "connection") {
|
|
if (keyValue.lower() == "id") {
|
|
connection->friendlyName = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "uuid") {
|
|
connection->UUID = dataValue2.toString().lower();
|
|
}
|
|
}
|
|
else if (outerKeyValue.lower() == "802-1x") {
|
|
// FIXME
|
|
// Implement load+save of the remaining settings in this group!
|
|
if (keyValue.lower() == "eap") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
state = 0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
if (state == 0) {
|
|
// EAP type
|
|
connection->eapConfig.type = nmEAPTypeToTDEEAPType(innerDataValue.toString());
|
|
}
|
|
state++;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "identity") {
|
|
connection->eapConfig.userName = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "anonymous-identity") {
|
|
connection->eapConfig.anonymousUserName = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "pac-file") {
|
|
connection->eapConfig.pacFileName = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "ca-cert") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.caCertificate.resize(count+1);
|
|
connection->eapConfig.caCertificate[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "ca-path") {
|
|
connection->eapConfig.additionalCAFilesPath = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "subject-match") {
|
|
connection->eapConfig.authServerCertSubjectMatch = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "altsubject-matches") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
connection->eapConfig.alternateAuthServerCertSubjectMatch.append(innerDataValue.toString());
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "client-cert") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.clientCertificate.resize(count+1);
|
|
connection->eapConfig.clientCertificate[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "phase1-peapver") {
|
|
connection->eapConfig.forcePEAPVersion = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "phase1-peaplabel") {
|
|
connection->eapConfig.forcePEAPLabel = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "phase1-fast-provisioning") {
|
|
connection->eapConfig.fastProvisioningFlags = nmEAPFastFlagsToTDEEAPFastFlags(dataValue2.toString());
|
|
}
|
|
else if (keyValue.lower() == "phase2-auth") {
|
|
connection->eapConfig.phase2NonEAPAuthMethod = nmEAPTypeToTDEEAPType(dataValue2.toString());
|
|
}
|
|
else if (keyValue.lower() == "phase2-autheap") {
|
|
connection->eapConfig.phase2EAPAuthMethod = nmEAPTypeToTDEEAPType(dataValue2.toString());
|
|
}
|
|
else if (keyValue.lower() == "phase2-ca-cert") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.phase2CaCertificate.resize(count+1);
|
|
connection->eapConfig.phase2CaCertificate[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "phase2-ca-path") {
|
|
connection->eapConfig.phase2CaFilesPath = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "phase2-subject-match") {
|
|
connection->eapConfig.phase2AuthServerCertSubjectMatch = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "phase2-altsubject-matches") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
connection->eapConfig.phase2AlternateAuthServerCertSubjectMatch.append(innerDataValue.toString());
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "phase2-client-cert") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.phase2ClientCertificate.resize(count+1);
|
|
connection->eapConfig.phase2ClientCertificate[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "password-flags") {
|
|
connection->eapConfig.passwordFlags = nmPasswordFlagsToTDEPasswordFlags(dataValue2.toUInt32());
|
|
}
|
|
else if (keyValue.lower() == "password-raw-flags") {
|
|
connection->eapConfig.binaryPasswordFlags = nmPasswordFlagsToTDEPasswordFlags(dataValue2.toUInt32());
|
|
}
|
|
else if (keyValue.lower() == "private-key") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.privateKey.resize(count+1);
|
|
connection->eapConfig.privateKey[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "private-key-password-flags") {
|
|
connection->eapConfig.privateKeyPasswordFlags = nmPasswordFlagsToTDEPasswordFlags(dataValue2.toUInt32());
|
|
}
|
|
else if (keyValue.lower() == "phase2-private-key") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.phase2PrivateKey.resize(count+1);
|
|
connection->eapConfig.phase2PrivateKey[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "phase2-private-key-password-flags") {
|
|
connection->eapConfig.phase2PrivateKeyPasswordFlags = nmPasswordFlagsToTDEPasswordFlags(dataValue2.toUInt32());
|
|
}
|
|
else if (keyValue.lower() == "system-ca-certs") {
|
|
connection->eapConfig.forceSystemCaCertificates = dataValue2.toBool();
|
|
}
|
|
connection->eapConfig.valid = true;
|
|
}
|
|
else if (outerKeyValue.lower() == "802-3-ethernet") {
|
|
if (keyValue.lower() == "duplex") {
|
|
connection->fullDuplex = (dataValue2.toString().lower() == "full")?true:false;
|
|
}
|
|
else if (keyValue.lower() == "mac-address") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
TDENetworkByteList macAddress;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
macAddress.append(innerDataValue.toByte());
|
|
}
|
|
connection->lockedHWAddress.setAddress(macAddress);
|
|
}
|
|
else if (keyValue.lower() == "cloned-mac-address") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
TDENetworkByteList macAddress;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
macAddress.append(innerDataValue.toByte());
|
|
}
|
|
connection->manualHWAddress.setAddress(macAddress);
|
|
}
|
|
else if (keyValue.lower() == "mtu") {
|
|
connection->mtu = dataValue2.toUInt32();
|
|
}
|
|
}
|
|
else if (outerKeyValue.lower() == "ipv4") {
|
|
if (keyValue.lower() == "addresses") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
state = 0;
|
|
TDENetworkSingleIPConfiguration ipConfig;
|
|
for (it5 = innerValueList.begin(); it5 != innerValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (state == 0) {
|
|
// Address
|
|
ipConfig.ipAddress = TQHostAddress(reverseIPV4ByteOrder(innerMostDataValue.toUInt32()));
|
|
}
|
|
else if (state == 1) {
|
|
// Network mask
|
|
ipConfig.networkMask.fromCIDRMask(innerMostDataValue.toUInt32());
|
|
}
|
|
else if (state == 2) {
|
|
// Gateway
|
|
ipConfig.gateway = TQHostAddress(reverseIPV4ByteOrder(innerMostDataValue.toUInt32()));
|
|
}
|
|
state++;
|
|
}
|
|
ipConfig.valid = true;
|
|
connection->ipConfig.ipConfigurations.append(ipConfig);
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "dhcp-client-id") {
|
|
connection->ipConfig.dhcpClientIdentifier = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "dns") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
connection->ipConfig.resolvers.append(TQHostAddress(reverseIPV4ByteOrder(innerDataValue.toUInt32())));
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "dns-search") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
connection->ipConfig.searchDomains.append(TDENetworkSearchDomain(innerDataValue.toString(), false));
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "ignore-auto-dns") {
|
|
bool nm_static_dns = dataValue2.toBool();
|
|
if (nm_static_dns) {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4DHCPDNS;
|
|
}
|
|
else {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV4DHCPDNS;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "may-fail") {
|
|
bool nm_may_fail = dataValue2.toBool();
|
|
connection->requireIPV4 = !nm_may_fail;
|
|
}
|
|
else if (keyValue.lower() == "method") {
|
|
TQString nm_method = dataValue2.toString().lower();
|
|
if (nm_method == "auto") {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV4DHCPIP;
|
|
}
|
|
else if (nm_method == "manual") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4DHCPIP;
|
|
}
|
|
else if (nm_method == "link-local") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4LocalOnly;
|
|
}
|
|
else if (nm_method == "shared") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4StartConnectionSharingServer;
|
|
}
|
|
else if (nm_method == "disabled") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4Disabled;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "ignore-auto-routes") {
|
|
bool nm_static_routes = dataValue2.toBool();
|
|
if (nm_static_routes) {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4DHCPRoutes;
|
|
}
|
|
else {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV4DHCPRoutes;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "never-default") {
|
|
bool nm_can_default_route = !dataValue2.toBool();
|
|
if (nm_can_default_route) {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV4MayUseAsDefaultRoute;
|
|
}
|
|
else {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4MayUseAsDefaultRoute;
|
|
}
|
|
}
|
|
if (keyValue.lower() == "routes") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
state = 0;
|
|
TDENetworkSingleRouteConfiguration routeConfig;
|
|
for (it5 = innerValueList.begin(); it5 != innerValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (state == 0) {
|
|
// Address
|
|
routeConfig.ipAddress = TQHostAddress(reverseIPV4ByteOrder(innerMostDataValue.toUInt32()));
|
|
}
|
|
else if (state == 1) {
|
|
// Network mask
|
|
routeConfig.networkMask.fromCIDRMask(innerMostDataValue.toUInt32());
|
|
}
|
|
else if (state == 2) {
|
|
// Gateway
|
|
routeConfig.gateway = TQHostAddress(reverseIPV4ByteOrder(innerMostDataValue.toUInt32()));
|
|
}
|
|
else if (state == 3) {
|
|
// Metric
|
|
routeConfig.metric = innerMostDataValue.toUInt32();
|
|
}
|
|
state++;
|
|
}
|
|
routeConfig.valid = true;
|
|
connection->ipConfig.routeConfigurations.append(routeConfig);
|
|
}
|
|
}
|
|
}
|
|
else if (outerKeyValue.lower() == "ipv6") {
|
|
if (keyValue.lower() == "addresses") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toStruct();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
TDENetworkSingleIPConfiguration ipConfig;
|
|
// Address
|
|
TQT_DBusDataValueList innerMostValueList;
|
|
innerMostValueList = innerValueList[0].toTQValueList();
|
|
TQ_UINT8 nm_v6address[16];
|
|
unsigned char nm_addr_ptr = 0;
|
|
memset(nm_v6address, 0, sizeof(TQ_UINT8)*16);
|
|
for (it5 = innerMostValueList.begin(); it5 != innerMostValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (nm_addr_ptr < 16) {
|
|
nm_v6address[nm_addr_ptr] = innerMostDataValue.toByte();
|
|
nm_addr_ptr++;
|
|
}
|
|
}
|
|
ipConfig.ipAddress = TQHostAddress(nm_v6address);
|
|
|
|
// Netmask
|
|
ipConfig.networkMask.fromCIDRMask(innerValueList[1].toUInt32(), true);
|
|
|
|
// Gateway
|
|
memset(nm_v6address, 0, sizeof(TQ_UINT8)*16);
|
|
for (it5 = innerMostValueList.begin(); it5 != innerMostValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (nm_addr_ptr < 16) {
|
|
nm_v6address[nm_addr_ptr] = innerMostDataValue.toByte();
|
|
nm_addr_ptr++;
|
|
}
|
|
}
|
|
ipConfig.gateway = TQHostAddress(nm_v6address);
|
|
|
|
ipConfig.valid = true;
|
|
connection->ipConfig.ipConfigurations.append(ipConfig);
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "dns") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
TQ_UINT8 nm_v6address[16];
|
|
unsigned char nm_addr_ptr = 0;
|
|
memset(nm_v6address, 0, sizeof(TQ_UINT8)*16);
|
|
for (it5 = innerValueList.begin(); it5 != innerValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (nm_addr_ptr < 16) {
|
|
nm_v6address[nm_addr_ptr] = innerMostDataValue.toByte();
|
|
nm_addr_ptr++;
|
|
}
|
|
}
|
|
connection->ipConfig.resolvers.append(TQHostAddress(nm_v6address));
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "dns-search") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
connection->ipConfig.searchDomains.append(TDENetworkSearchDomain(innerDataValue.toString(), true));
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "ignore-auto-dns") {
|
|
bool nm_static_dns = dataValue2.toBool();
|
|
if (nm_static_dns) {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV4DHCPDNS;
|
|
}
|
|
else {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV4DHCPDNS;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "may-fail") {
|
|
bool nm_may_fail = dataValue2.toBool();
|
|
connection->requireIPV6 = !nm_may_fail;
|
|
}
|
|
else if (keyValue.lower() == "method") {
|
|
TQString nm_method = dataValue2.toString().lower();
|
|
if (nm_method == "auto") {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV6DHCPIP;
|
|
}
|
|
else if (nm_method == "manual") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV6DHCPIP;
|
|
}
|
|
else if (nm_method == "link-local") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV6LocalOnly;
|
|
}
|
|
else if (nm_method == "shared") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV6StartConnectionSharingServer;
|
|
}
|
|
else if (nm_method == "ignore") {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV6Disabled;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "ignore-auto-routes") {
|
|
bool nm_static_routes = dataValue2.toBool();
|
|
if (nm_static_routes) {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV6DHCPRoutes;
|
|
}
|
|
else {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV6DHCPRoutes;
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "never-default") {
|
|
bool nm_can_default_route = !dataValue2.toBool();
|
|
if (nm_can_default_route) {
|
|
connection->ipConfig.connectionFlags |= TDENetworkIPConfigurationFlags::IPV6MayUseAsDefaultRoute;
|
|
}
|
|
else {
|
|
connection->ipConfig.connectionFlags &= ~TDENetworkIPConfigurationFlags::IPV6MayUseAsDefaultRoute;
|
|
}
|
|
}
|
|
if (keyValue.lower() == "routes") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
TQT_DBusDataValueList innerValueList = innerDataValue.toStruct();
|
|
TQT_DBusDataValueList::const_iterator it5;
|
|
TDENetworkSingleRouteConfiguration routeConfig;
|
|
// Address
|
|
TQT_DBusDataValueList innerMostValueList;
|
|
innerMostValueList = innerValueList[0].toTQValueList();
|
|
TQ_UINT8 nm_v6address[16];
|
|
unsigned char nm_addr_ptr = 0;
|
|
memset(nm_v6address, 0, sizeof(TQ_UINT8)*16);
|
|
for (it5 = innerMostValueList.begin(); it5 != innerMostValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (nm_addr_ptr < 16) {
|
|
nm_v6address[nm_addr_ptr] = innerMostDataValue.toByte();
|
|
nm_addr_ptr++;
|
|
}
|
|
}
|
|
routeConfig.ipAddress = TQHostAddress(nm_v6address);
|
|
|
|
// Netmask
|
|
routeConfig.networkMask.fromCIDRMask(innerValueList[1].toUInt32(), true);
|
|
|
|
// Gateway
|
|
innerMostValueList = innerValueList[2].toTQValueList();
|
|
nm_addr_ptr = 0;
|
|
memset(nm_v6address, 0, sizeof(TQ_UINT8)*16);
|
|
for (it5 = innerMostValueList.begin(); it5 != innerMostValueList.end(); ++it5) {
|
|
TQT_DBusData innerMostDataValue = *it5;
|
|
if (nm_addr_ptr < 16) {
|
|
nm_v6address[nm_addr_ptr] = innerMostDataValue.toByte();
|
|
nm_addr_ptr++;
|
|
}
|
|
}
|
|
routeConfig.gateway = TQHostAddress(nm_v6address);
|
|
|
|
// Metric
|
|
routeConfig.metric = innerValueList[3].toUInt32();
|
|
|
|
routeConfig.valid = true;
|
|
connection->ipConfig.routeConfigurations.append(routeConfig);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// FIXME
|
|
// There are several advanced properties which appear to use string maps
|
|
// For example, s390-options
|
|
// Support should eventually be added for these, e.g. in a backend-specific Advanced tab somewhere
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// If the connection's MAC matches my MAC, or if the connection is not locked to any MAC address,
|
|
// or if this manager object is not locked to a device, then add this connection to the list
|
|
if ((deviceMACAddress == connection->lockedHWAddress) || (!connection->lockedHWAddress.isValid()) || (!deviceMACAddress.isValid())) {
|
|
connection->ipConfig.valid = true;
|
|
m_connectionList->append(connection);
|
|
}
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
}
|
|
}
|
|
|
|
// NOTE
|
|
// While this separate separate routine is needed to get the secrets, note that secrets must
|
|
// be saved using the same connection map save routine that all other settings use above.
|
|
bool TDENetworkConnectionManager_BackendNM::loadConnectionSecrets(TQString uuid) {
|
|
bool ret = TRUE;
|
|
ret = ret && loadConnectionSecretsForGroup(uuid, "802-1x");
|
|
return ret;
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::loadConnectionSecretsForGroup(TQString uuid, TQString group) {
|
|
TDENetworkConnection* connection = findConnectionByUUID(uuid);
|
|
if (!connection) {
|
|
PRINT_ERROR(TQString("Unable to locate connection with uuid '%1' in local database. Did you run loadConnectionInformation() first?"));
|
|
return FALSE;
|
|
}
|
|
TQT_DBusObjectPath existingConnection;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
TQT_DBusTQStringDataMap connectionSecretsMap(TQT_DBusData::String);
|
|
ret = d->m_networkManagerSettings->GetConnectionByUuid(uuid, existingConnection, error);
|
|
if (ret) {
|
|
// Obtain connection secrets from the path specified
|
|
DBus::ConnectionSettingsInterface connectionSettings(NM_DBUS_SERVICE, existingConnection);
|
|
connectionSettings.setConnection(TQT_DBusConnection::systemBus());
|
|
connect(&connectionSettings, SIGNAL(GetSecretsAsyncReply(int, const TQT_DBusDataMap<TQString>&)), d, SLOT(processConnectionSettingsAsyncReply(int, const TQT_DBusDataMap<TQString>&)));
|
|
int asyncCallID;
|
|
ret = connectionSettings.GetSecretsAsync(asyncCallID, group, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
tqApp->processEvents();
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
}
|
|
connectionSecretsMap = d->nmConnectionSettingsAsyncSettingsResponse[asyncCallID];
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
d->nmConnectionSettingsAsyncSettingsResponse.remove(asyncCallID);
|
|
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] received DBUS object structure map follows:\n\r"); fflush(stdout);
|
|
printDBUSObjectStructure(TQT_DBusData::fromStringKeyMap(connectionSecretsMap));
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
|
|
// Parse settings
|
|
TQT_DBusTQStringDataMap::const_iterator it2;
|
|
for (it2 = connectionSecretsMap.begin(); it2 != connectionSecretsMap.end(); ++it2) {
|
|
TQString outerKeyValue = it2.key();
|
|
TQT_DBusData dataValue = it2.data();
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] [%s]\n\r", outerKeyValue.ascii()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
TQT_DBusTQStringDataMap nestedConnectionSettingsMap = dataValue.toStringKeyMap();
|
|
TQT_DBusTQStringDataMap::const_iterator it3;
|
|
for (it3 = nestedConnectionSettingsMap.begin(); it3 != nestedConnectionSettingsMap.end(); ++it3) {
|
|
TQString keyValue = it3.key();
|
|
TQT_DBusData dataValue = it3.data();
|
|
if (dataValue.type() != TQT_DBusData::Variant) {
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] %s = %s (type %d(%s))\n\r", keyValue.ascii(), dataValue.toString().ascii(), dataValue.type(), dataValue.typeName()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
// No NM settings are known which use this style
|
|
}
|
|
else {
|
|
TQT_DBusVariant dataValueVariant = dataValue.toVariant();
|
|
TQT_DBusData dataValue2 = dataValueVariant.value;
|
|
if (dataValue2.type() != TQT_DBusData::Variant) {
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] %s = %s (type %d(%s), signature %s)\n\r", keyValue.ascii(), dataValue2.toString().ascii(), dataValue2.type(), dataValue2.typeName(), dataValueVariant.signature.ascii()); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
// Most NM settings use this style
|
|
if (outerKeyValue.lower() == "802-1x") {
|
|
if (keyValue.lower() == "password") {
|
|
connection->eapConfig.password = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "password-raw") {
|
|
TQT_DBusDataValueList valueList = dataValue2.toTQValueList();
|
|
TQT_DBusDataValueList::const_iterator it4;
|
|
int count=0;
|
|
for (it4 = valueList.begin(); it4 != valueList.end(); ++it4) {
|
|
TQT_DBusData innerDataValue = *it4;
|
|
count++;
|
|
connection->eapConfig.binaryPassword.resize(count+1);
|
|
connection->eapConfig.binaryPassword[count] = innerDataValue.toByte();
|
|
}
|
|
}
|
|
else if (keyValue.lower() == "private-key-password") {
|
|
connection->eapConfig.privateKeyPassword = dataValue2.toString();
|
|
}
|
|
else if (keyValue.lower() == "phase2-private-key-password") {
|
|
connection->eapConfig.phase2PrivateKeyPassword = dataValue2.toString();
|
|
}
|
|
connection->eapConfig.secretsValid = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("Unable to load secrets for connection with uuid '%1'").arg(uuid))
|
|
return FALSE;
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("connection for provided uuid '%1' was not found").arg(uuid));
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::saveConnection(TDENetworkConnection* connection) {
|
|
// Find path for connection with specified UUID, if it exists
|
|
// This is so that any settings that we are not aware of can be loaded now and preserved through the update operation
|
|
if (!connection) {
|
|
PRINT_ERROR(TQString("connection cannot be NULL!"));
|
|
return FALSE;
|
|
}
|
|
TQT_DBusObjectPath existingConnection;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
bool existing;
|
|
TQT_DBusTQStringDataMap connectionSettingsMap(TQT_DBusData::String);
|
|
existing = false;
|
|
ret = d->m_networkManagerSettings->GetConnectionByUuid(connection->UUID, existingConnection, error);
|
|
if (ret) {
|
|
// Obtain connection settings from the path specified
|
|
DBus::ConnectionSettingsInterface connectionSettings(NM_DBUS_SERVICE, existingConnection);
|
|
connectionSettings.setConnection(TQT_DBusConnection::systemBus());
|
|
connect(&connectionSettings, SIGNAL(GetSettingsAsyncReply(int, const TQT_DBusDataMap<TQString>&)), d, SLOT(processConnectionSettingsAsyncReply(int, const TQT_DBusDataMap<TQString>&)));
|
|
int asyncCallID;
|
|
ret = connectionSettings.GetSettingsAsync(asyncCallID, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
tqApp->processEvents();
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
}
|
|
connectionSettingsMap = d->nmConnectionSettingsAsyncSettingsResponse[asyncCallID];
|
|
existing = true;
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
d->nmConnectionSettingsAsyncSettingsResponse.remove(asyncCallID);
|
|
}
|
|
}
|
|
|
|
// Create and/or update settings map from provided connection information
|
|
// We start at the outermost layer and work our way inwards, in a structure which should match the parser in loadConnectionInformation() very closely
|
|
bool groupValid;
|
|
TQT_DBusData dbusData;
|
|
TQT_DBusData innerDbusData;
|
|
TQMap<TQString, TQT_DBusData> outerMap = connectionSettingsMap.toTQMap();
|
|
{
|
|
dbusData = outerMap["connection"];
|
|
{
|
|
TQMap<TQString, TQT_DBusData> settingsMap = dbusData.toStringKeyMap().toTQMap();
|
|
{
|
|
settingsMap["id"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(connection->friendlyName));
|
|
{
|
|
TQString type;
|
|
if (dynamic_cast<TDEWiredEthernetConnection*>(connection)) type = "802-3-ethernet";
|
|
else if (dynamic_cast<TDEWiFiConnection*>(connection)) type = "802-11-wireless";
|
|
if (!type.isNull()) settingsMap["type"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(type));
|
|
}
|
|
settingsMap["uuid"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(connection->UUID));
|
|
}
|
|
dbusData = TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(settingsMap));
|
|
groupValid = (settingsMap.count() > 0);
|
|
}
|
|
if (groupValid) outerMap.insert("connection", dbusData, TRUE); else outerMap.remove("connection");
|
|
|
|
dbusData = outerMap["802-1x"];
|
|
{
|
|
TQMap<TQString, TQT_DBusData> settingsMap = dbusData.toStringKeyMap().toTQMap();
|
|
{
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// EAP type
|
|
valueList.append(TQT_DBusData::fromString(tdeEAPTypeToNMEAPType(connection->eapConfig.type)));
|
|
}
|
|
settingsMap["eap"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
else {
|
|
settingsMap.remove("eap");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.userName, "identity", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.anonymousUserName, "anonymous-identity", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.pacFileName, "pac-file", settingsMap)
|
|
}
|
|
else {
|
|
settingsMap.remove("identity");
|
|
settingsMap.remove("anonymous-identity");
|
|
settingsMap.remove("pac-file");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.caCertificate.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.caCertificate[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["ca-cert"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("ca-cert");
|
|
}
|
|
else {
|
|
settingsMap.remove("ca-cert");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.additionalCAFilesPath, "ca-path", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.authServerCertSubjectMatch, "subject-match", settingsMap)
|
|
}
|
|
else {
|
|
settingsMap.remove("ca-path");
|
|
settingsMap.remove("subject-match");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
for (TQStringList::Iterator it = connection->eapConfig.alternateAuthServerCertSubjectMatch.begin(); it != connection->eapConfig.alternateAuthServerCertSubjectMatch.end(); ++it) {
|
|
valueList.append(TQT_DBusData::fromString(*it));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["altsubject-matches"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("altsubject-matches");
|
|
}
|
|
else {
|
|
settingsMap.remove("altsubject-matches");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.clientCertificate.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.clientCertificate[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["client-cert"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("client-cert");
|
|
}
|
|
else {
|
|
settingsMap.remove("client-cert");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.forcePEAPVersion, "phase1-peapver", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.forcePEAPLabel, "phase1-peaplabel", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(tdeEAPFastFlagsToNMEAPFastFlags(connection->eapConfig.fastProvisioningFlags), "phase1-fast-provisioning", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.phase2NonEAPAuthMethod, "phase2-auth", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.phase2EAPAuthMethod, "phase2-autheap", settingsMap)
|
|
}
|
|
else {
|
|
settingsMap.remove("phase1-peapver");
|
|
settingsMap.remove("phase1-peaplabel");
|
|
settingsMap.remove("phase1-fast-provisioning");
|
|
settingsMap.remove("phase2-auth");
|
|
settingsMap.remove("phase2-autheap");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.phase2CaCertificate.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.phase2CaCertificate[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["phase2-ca-cert"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("phase2-ca-cert");
|
|
}
|
|
else {
|
|
settingsMap.remove("phase2-ca-cert");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.phase2CaFilesPath, "phase2-ca-path", settingsMap)
|
|
UPDATE_STRING_SETTING_IF_VALID(connection->eapConfig.phase2AuthServerCertSubjectMatch, "phase2-subject-match", settingsMap)
|
|
}
|
|
else {
|
|
settingsMap.remove("phase2-ca-path");
|
|
settingsMap.remove("phase2-subject-match");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
for (TQStringList::Iterator it = connection->eapConfig.phase2AlternateAuthServerCertSubjectMatch.begin(); it != connection->eapConfig.phase2AlternateAuthServerCertSubjectMatch.end(); ++it) {
|
|
valueList.append(TQT_DBusData::fromString(*it));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["phase2-altsubject-matches"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("phase2-altsubject-matches");
|
|
}
|
|
else {
|
|
settingsMap.remove("phase2-altsubject-matches");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.phase2ClientCertificate.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.phase2ClientCertificate[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["phase2-client-cert"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("phase2-client-cert");
|
|
}
|
|
else {
|
|
settingsMap.remove("phase2-client-cert");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
settingsMap["password-flags"] = convertDBUSDataToVariantData(TQT_DBusData::fromUInt32(tdePasswordFlagsToNMPasswordFlags(connection->eapConfig.passwordFlags)));
|
|
settingsMap["password-raw-flags"] = convertDBUSDataToVariantData(TQT_DBusData::fromUInt32(tdePasswordFlagsToNMPasswordFlags(connection->eapConfig.binaryPasswordFlags)));
|
|
}
|
|
else {
|
|
settingsMap.remove("password-flags");
|
|
settingsMap.remove("password-raw-flags");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.privateKey.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.privateKey[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["private-key"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("private-key");
|
|
}
|
|
else {
|
|
settingsMap.remove("private-key");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
settingsMap["private-key-password-flags"] = convertDBUSDataToVariantData(TQT_DBusData::fromUInt32(tdePasswordFlagsToNMPasswordFlags(connection->eapConfig.privateKeyPasswordFlags)));
|
|
}
|
|
else {
|
|
settingsMap.remove("private-key-password-flags");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.phase2PrivateKey.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.phase2PrivateKey[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["phase2-private-key"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("phase2-private-key");
|
|
}
|
|
else {
|
|
settingsMap.remove("phase2-private-key");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
settingsMap["phase2-private-key-password-flags"] = convertDBUSDataToVariantData(TQT_DBusData::fromUInt32(tdePasswordFlagsToNMPasswordFlags(connection->eapConfig.phase2PrivateKeyPasswordFlags)));
|
|
}
|
|
else {
|
|
settingsMap.remove("phase2-private-key-password-flags");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
settingsMap["system-ca-certs"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(connection->eapConfig.forceSystemCaCertificates));
|
|
}
|
|
else {
|
|
settingsMap.remove("system-ca-certs");
|
|
}
|
|
if (connection->eapConfig.secretsValid) {
|
|
settingsMap["password"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(connection->eapConfig.password));
|
|
}
|
|
else {
|
|
settingsMap.remove("password");
|
|
}
|
|
if (connection->eapConfig.valid) {
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
{
|
|
unsigned int count;
|
|
for (count=0; count<connection->eapConfig.binaryPassword.count(); count++) {
|
|
valueList.append(TQT_DBusData::fromByte(connection->eapConfig.binaryPassword[count]));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["password-raw"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
else settingsMap.remove("password-raw");
|
|
}
|
|
else {
|
|
settingsMap.remove("password-raw");
|
|
}
|
|
if (connection->eapConfig.secretsValid) {
|
|
settingsMap["private-key-password"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(connection->eapConfig.privateKeyPassword));
|
|
settingsMap["phase2-private-key-password"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(connection->eapConfig.phase2PrivateKeyPassword));
|
|
}
|
|
else {
|
|
settingsMap.remove("private-key-password");
|
|
settingsMap.remove("phase2-private-key-password");
|
|
}
|
|
}
|
|
dbusData = TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(settingsMap));
|
|
groupValid = (settingsMap.count() > 0);
|
|
}
|
|
if (groupValid) outerMap.insert("802-1x", dbusData, TRUE); else outerMap.remove("802-1x");
|
|
|
|
dbusData = outerMap["802-3-ethernet"];
|
|
{
|
|
TQMap<TQString, TQT_DBusData> settingsMap = dbusData.toStringKeyMap().toTQMap();
|
|
{
|
|
settingsMap["duplex"] = convertDBUSDataToVariantData(TQT_DBusData::fromString((connection->fullDuplex)?"full":"half"));
|
|
if (connection->lockedHWAddress.isValid()) {
|
|
TDENetworkByteList address = connection->lockedHWAddress.address();
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkByteList::iterator it;
|
|
for (it = address.begin(); it != address.end(); ++it) {
|
|
TQT_DBusData innerDataValue = TQT_DBusData::fromByte(*it);
|
|
valueList.append(innerDataValue);
|
|
}
|
|
TQT_DBusData nmHWAddress = TQT_DBusData::fromTQValueList(valueList);
|
|
settingsMap["mac-address"] = convertDBUSDataToVariantData(nmHWAddress);
|
|
}
|
|
else {
|
|
settingsMap.remove("mac-address");
|
|
}
|
|
if (connection->manualHWAddress.isValid()) {
|
|
TDENetworkByteList address = connection->manualHWAddress.address();
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkByteList::iterator it;
|
|
for (it = address.begin(); it != address.end(); ++it) {
|
|
TQT_DBusData innerDataValue = TQT_DBusData::fromByte(*it);
|
|
valueList.append(innerDataValue);
|
|
}
|
|
TQT_DBusData nmHWAddress = TQT_DBusData::fromTQValueList(valueList);
|
|
settingsMap["cloned-mac-address"] = convertDBUSDataToVariantData(nmHWAddress);
|
|
}
|
|
else {
|
|
settingsMap.remove("mac-address");
|
|
}
|
|
if (connection->mtu > 0) {
|
|
settingsMap["mtu"] = convertDBUSDataToVariantData(TQT_DBusData::fromUInt32(connection->mtu));
|
|
}
|
|
else {
|
|
settingsMap.remove("mtu");
|
|
}
|
|
}
|
|
dbusData = TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(settingsMap));
|
|
groupValid = (settingsMap.count() > 0);
|
|
}
|
|
if (groupValid) outerMap.insert("802-3-ethernet", dbusData, TRUE); else outerMap.remove("802-3-ethernet");
|
|
|
|
dbusData = outerMap["ipv4"];
|
|
{
|
|
TQMap<TQString, TQT_DBusData> settingsMap = dbusData.toStringKeyMap().toTQMap();
|
|
{
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
for (it = connection->ipConfig.ipConfigurations.begin(); it != connection->ipConfig.ipConfigurations.end(); ++it) {
|
|
if ((*it).isIPv4()) {
|
|
TQT_DBusDataValueList innerValueList;
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// Address
|
|
innerValueList.append(TQT_DBusData::fromUInt32(reverseIPV4ByteOrder((*it).ipAddress.toIPv4Address())));
|
|
// Netmask
|
|
innerValueList.append(TQT_DBusData::fromUInt32((*it).networkMask.toCIDRMask()));
|
|
// Gateway
|
|
innerValueList.append(TQT_DBusData::fromUInt32(reverseIPV4ByteOrder((*it).gateway.toIPv4Address())));
|
|
valueList.append(TQT_DBusData::fromTQValueList(innerValueList));
|
|
}
|
|
}
|
|
if (valueList.count() <= 0) {
|
|
// Create an empty list with the correct DBUS type structure
|
|
TQT_DBusData valueList;
|
|
valueList = TQT_DBusData::fromList(TQT_DBusDataList(TQT_DBusData::UInt32));
|
|
settingsMap["addresses"] = convertDBUSDataToVariantData(TQT_DBusData::fromList(TQT_DBusDataList(valueList)));
|
|
}
|
|
else {
|
|
settingsMap["addresses"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
}
|
|
{
|
|
if (!connection->ipConfig.dhcpClientIdentifier.isNull()) {
|
|
settingsMap["dhcp-client-id"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(connection->ipConfig.dhcpClientIdentifier));
|
|
}
|
|
}
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkAddressList::iterator it;
|
|
for (it = connection->ipConfig.resolvers.begin(); it != connection->ipConfig.resolvers.end(); ++it) {
|
|
if ((*it).isIPv4Address()) {
|
|
valueList.append(TQT_DBusData::fromUInt32(reverseIPV4ByteOrder((*it).toIPv4Address())));
|
|
}
|
|
}
|
|
if (valueList.count() <= 0) {
|
|
// Create an empty list with the correct DBUS type structure
|
|
settingsMap["dns"] = convertDBUSDataToVariantData(TQT_DBusData::fromList(TQT_DBusDataList(TQT_DBusData::UInt32)));
|
|
}
|
|
else {
|
|
settingsMap["dns"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
}
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSearchDomainList::iterator it;
|
|
for (it = connection->ipConfig.searchDomains.begin(); it != connection->ipConfig.searchDomains.end(); ++it) {
|
|
if ((*it).isIPv4()) {
|
|
valueList.append(TQT_DBusData::fromString((*it).searchDomain()));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["dns-search"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
{
|
|
settingsMap["ignore-auto-dns"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!(connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4DHCPDNS)));
|
|
}
|
|
{
|
|
settingsMap["may-fail"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!connection->requireIPV4));
|
|
}
|
|
{
|
|
TQString method;
|
|
if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4DHCPIP) {
|
|
method = "auto";
|
|
}
|
|
else if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4LocalOnly) {
|
|
method = "link-local";
|
|
}
|
|
else if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4StartConnectionSharingServer) {
|
|
method = "shared";
|
|
}
|
|
else if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4Disabled) {
|
|
method = "disabled";
|
|
}
|
|
else {
|
|
method = "manual";
|
|
}
|
|
if (!method.isNull())
|
|
settingsMap["method"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(method));
|
|
}
|
|
{
|
|
settingsMap["ignore-auto-routes"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!(connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4DHCPRoutes)));
|
|
}
|
|
{
|
|
settingsMap["never-default"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!(connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4MayUseAsDefaultRoute)));
|
|
}
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleRouteConfigurationList::iterator it;
|
|
for (it = connection->ipConfig.routeConfigurations.begin(); it != connection->ipConfig.routeConfigurations.end(); ++it) {
|
|
if ((*it).isIPv4()) {
|
|
TQT_DBusDataValueList innerValueList;
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// Address
|
|
innerValueList.append(TQT_DBusData::fromUInt32(reverseIPV4ByteOrder((*it).ipAddress.toIPv4Address())));
|
|
// Netmask
|
|
innerValueList.append(TQT_DBusData::fromUInt32((*it).networkMask.toCIDRMask()));
|
|
// Gateway
|
|
innerValueList.append(TQT_DBusData::fromUInt32(reverseIPV4ByteOrder((*it).gateway.toIPv4Address())));
|
|
// Metric
|
|
innerValueList.append(TQT_DBusData::fromUInt32((*it).metric));
|
|
valueList.append(TQT_DBusData::fromTQValueList(innerValueList));
|
|
}
|
|
}
|
|
if (valueList.count() <= 0) {
|
|
// Create an empty list with the correct DBUS type structure
|
|
TQT_DBusData valueList;
|
|
valueList = TQT_DBusData::fromList(TQT_DBusDataList(TQT_DBusData::UInt32));
|
|
settingsMap["routes"] = convertDBUSDataToVariantData(TQT_DBusData::fromList(TQT_DBusDataList(valueList)));
|
|
}
|
|
else {
|
|
settingsMap["routes"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
}
|
|
}
|
|
dbusData = TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(settingsMap));
|
|
groupValid = (settingsMap.count() > 0);
|
|
}
|
|
if (groupValid) outerMap.insert("ipv4", dbusData, TRUE); else outerMap.remove("ipv4");
|
|
|
|
dbusData = outerMap["ipv6"];
|
|
{
|
|
TQMap<TQString, TQT_DBusData> settingsMap = dbusData.toStringKeyMap().toTQMap();
|
|
{
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleIPConfigurationList::iterator it;
|
|
for (it = connection->ipConfig.ipConfigurations.begin(); it != connection->ipConfig.ipConfigurations.end(); ++it) {
|
|
if ((*it).isIPv6()) {
|
|
int i;
|
|
Q_IPV6ADDR v6address;
|
|
TQT_DBusDataValueList innerValueList;
|
|
TQT_DBusDataValueList innerMostValueList;
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// Address
|
|
innerMostValueList.clear();
|
|
v6address = (*it).ipAddress.toIPv6Address();
|
|
for (i=0; i<16; i++) {
|
|
innerMostValueList.append(TQT_DBusData::fromByte(v6address.c[i]));
|
|
}
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
// Netmask
|
|
innerValueList.append(TQT_DBusData::fromUInt32((*it).networkMask.toCIDRMask()));
|
|
// Gateway
|
|
innerMostValueList.clear();
|
|
v6address = (*it).gateway.toIPv6Address();
|
|
for (i=0; i<16; i++) {
|
|
innerMostValueList.append(TQT_DBusData::fromByte(v6address.c[i]));
|
|
}
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
valueList.append(TQT_DBusData::fromStruct(innerValueList));
|
|
}
|
|
}
|
|
if (valueList.count() <= 0) {
|
|
// Create an empty list with the correct DBUS type structure
|
|
TQT_DBusDataValueList innerValueList;
|
|
TQT_DBusDataValueList innerMostValueList;
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// Address
|
|
innerMostValueList.clear();
|
|
innerMostValueList.append(TQT_DBusData::fromByte(0));
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
// Netmask
|
|
innerValueList.append(TQT_DBusData::fromUInt32(0));
|
|
// Gateway
|
|
innerMostValueList.clear();
|
|
innerMostValueList.append(TQT_DBusData::fromByte(0));
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
settingsMap["addresses"] = convertDBUSDataToVariantData(TQT_DBusData::fromList(TQT_DBusDataList(TQT_DBusData::fromStruct(innerValueList))));
|
|
}
|
|
else {
|
|
settingsMap["addresses"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
}
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkAddressList::iterator it;
|
|
for (it = connection->ipConfig.resolvers.begin(); it != connection->ipConfig.resolvers.end(); ++it) {
|
|
if ((*it).isIPv6Address()) {
|
|
int i;
|
|
Q_IPV6ADDR v6address;
|
|
TQT_DBusDataValueList innerValueList;
|
|
v6address = (*it).toIPv6Address();
|
|
for (i=0; i<16; i++) {
|
|
innerValueList.append(TQT_DBusData::fromByte(v6address.c[i]));
|
|
}
|
|
valueList.append(TQT_DBusData::fromTQValueList(innerValueList));
|
|
}
|
|
}
|
|
if (valueList.count() <= 0) {
|
|
// Create an empty list with the correct DBUS type structure
|
|
TQT_DBusData valueList;
|
|
valueList = TQT_DBusData::fromList(TQT_DBusDataList(TQT_DBusData::Byte));
|
|
settingsMap["dns"] = convertDBUSDataToVariantData(TQT_DBusData::fromList(TQT_DBusDataList(valueList)));
|
|
}
|
|
else {
|
|
settingsMap["dns"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
}
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSearchDomainList::iterator it;
|
|
for (it = connection->ipConfig.searchDomains.begin(); it != connection->ipConfig.searchDomains.end(); ++it) {
|
|
if ((*it).isIPv6()) {
|
|
valueList.append(TQT_DBusData::fromString((*it).searchDomain()));
|
|
}
|
|
}
|
|
if (valueList.count() > 0) settingsMap["dns-search"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
{
|
|
settingsMap["ignore-auto-dns"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!(connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV4DHCPDNS)));
|
|
}
|
|
{
|
|
settingsMap["may-fail"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!connection->requireIPV6));
|
|
}
|
|
{
|
|
TQString method;
|
|
if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV6DHCPIP) {
|
|
method = "auto";
|
|
}
|
|
else if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV6LocalOnly) {
|
|
method = "link-local";
|
|
}
|
|
else if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV6StartConnectionSharingServer) {
|
|
method = "shared";
|
|
}
|
|
else if (connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV6Disabled) {
|
|
method = "ignore";
|
|
}
|
|
else {
|
|
method = "manual";
|
|
}
|
|
if (!method.isNull())
|
|
settingsMap["method"] = convertDBUSDataToVariantData(TQT_DBusData::fromString(method));
|
|
}
|
|
{
|
|
settingsMap["ignore-auto-routes"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!(connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV6DHCPRoutes)));
|
|
}
|
|
{
|
|
settingsMap["never-default"] = convertDBUSDataToVariantData(TQT_DBusData::fromBool(!(connection->ipConfig.connectionFlags & TDENetworkIPConfigurationFlags::IPV6MayUseAsDefaultRoute)));
|
|
}
|
|
{
|
|
TQT_DBusDataValueList valueList;
|
|
TDENetworkSingleRouteConfigurationList::iterator it;
|
|
for (it = connection->ipConfig.routeConfigurations.begin(); it != connection->ipConfig.routeConfigurations.end(); ++it) {
|
|
if ((*it).isIPv6()) {
|
|
int i;
|
|
Q_IPV6ADDR v6address;
|
|
TQT_DBusDataValueList innerValueList;
|
|
TQT_DBusDataValueList innerMostValueList;
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// Address
|
|
innerMostValueList.clear();
|
|
v6address = (*it).ipAddress.toIPv6Address();
|
|
for (i=0; i<16; i++) {
|
|
innerMostValueList.append(TQT_DBusData::fromByte(v6address.c[i]));
|
|
}
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
// Netmask
|
|
innerValueList.append(TQT_DBusData::fromUInt32((*it).networkMask.toCIDRMask()));
|
|
// Gateway
|
|
innerMostValueList.clear();
|
|
v6address = (*it).gateway.toIPv6Address();
|
|
for (i=0; i<16; i++) {
|
|
innerMostValueList.append(TQT_DBusData::fromByte(v6address.c[i]));
|
|
}
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
// Metric
|
|
innerValueList.append(TQT_DBusData::fromUInt32((*it).metric));
|
|
valueList.append(TQT_DBusData::fromStruct(innerValueList));
|
|
}
|
|
}
|
|
if (valueList.count() <= 0) {
|
|
// Create an empty list with the correct DBUS type structure
|
|
TQT_DBusDataValueList innerValueList;
|
|
TQT_DBusDataValueList innerMostValueList;
|
|
// WARNING: The exact order of the data in the list is critical, therefore extreme caution should be exercised when modifying the code below!
|
|
// Address
|
|
innerMostValueList.clear();
|
|
innerMostValueList.append(TQT_DBusData::fromByte(0));
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
// Netmask
|
|
innerValueList.append(TQT_DBusData::fromUInt32(0));
|
|
// Gateway
|
|
innerMostValueList.clear();
|
|
innerMostValueList.append(TQT_DBusData::fromByte(0));
|
|
innerValueList.append(TQT_DBusData::fromTQValueList(innerMostValueList));
|
|
// Metric
|
|
innerValueList.append(TQT_DBusData::fromUInt32(0));
|
|
settingsMap["routes"] = convertDBUSDataToVariantData(TQT_DBusData::fromList(TQT_DBusDataList(TQT_DBusData::fromStruct(innerValueList))));
|
|
}
|
|
else {
|
|
settingsMap["routes"] = convertDBUSDataToVariantData(TQT_DBusData::fromTQValueList(valueList));
|
|
}
|
|
}
|
|
}
|
|
dbusData = TQT_DBusData::fromStringKeyMap(TQT_DBusDataMap<TQString>(settingsMap));
|
|
groupValid = (settingsMap.count() > 0);
|
|
}
|
|
if (groupValid) outerMap.insert("ipv6", dbusData, TRUE); else outerMap.remove("ipv6");
|
|
}
|
|
connectionSettingsMap = TQT_DBusDataMap<TQString>(outerMap);
|
|
|
|
// If existing==true, a connection already existed and simply needs to be updated
|
|
// If existing==false, a new connection must be created
|
|
// To update: Use 'DBus::ConnectionSettingsInterface' with the connection path 'existingConnection' and call 'virtual bool UpdateAsync(int& asyncCallId, const TQT_DBusDataMap<TQString>& properties, TQT_DBusError& error);'
|
|
// To create new: Use 'd->m_networkManagerSettings' and call 'virtual bool AddConnectionAsync(int& asyncCallId, const TQT_DBusDataMap<TQString>& connection, TQT_DBusError& error);'
|
|
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] uploaded DBUS object structure map follows:\n\r"); fflush(stdout);
|
|
printDBUSObjectStructure(TQT_DBusData::fromStringKeyMap(connectionSettingsMap));
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
|
|
if (existing) {
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] Updating existing connection\n\r"); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
// Save connection settings to the path specified
|
|
DBus::ConnectionSettingsInterface connectionSettings(NM_DBUS_SERVICE, existingConnection);
|
|
connectionSettings.setConnection(TQT_DBusConnection::systemBus());
|
|
connect(&connectionSettings, SIGNAL(UpdateAsyncReply(int)), d, SLOT(processConnectionSettingsUpdateAsyncReply(int)));
|
|
int asyncCallID;
|
|
ret = connectionSettings.UpdateAsync(asyncCallID, connectionSettingsMap, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
tqApp->processEvents();
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
}
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
return TRUE;
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return FALSE;
|
|
}
|
|
}
|
|
else {
|
|
#ifdef DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
printf("[network-manager comm debug] Creating new connection\n\r"); fflush(stdout);
|
|
#endif // DEBUG_NETWORK_MANAGER_COMMUNICATIONS
|
|
// Create new connection
|
|
connect(d->m_networkManagerSettings, SIGNAL(AddConnectionAsyncReply(int, const TQT_DBusObjectPath&)), d, SLOT(processAddConnectionAsyncReply(int, const TQT_DBusObjectPath&)));
|
|
int asyncCallID;
|
|
ret = d->m_networkManagerSettings->AddConnectionAsync(asyncCallID, connectionSettingsMap, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
tqApp->processEvents();
|
|
}
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
d->nmAddConnectionAsyncResponse.remove(asyncCallID);
|
|
return TRUE;
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::deleteConnection(TQString uuid) {
|
|
TQT_DBusObjectPath existingConnection;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
if (d->m_networkManagerSettings) {
|
|
ret = d->m_networkManagerSettings->GetConnectionByUuid(uuid, existingConnection, error);
|
|
if (ret) {
|
|
// Obtain connection secrets from the path specified
|
|
DBus::ConnectionSettingsInterface connectionSettings(NM_DBUS_SERVICE, existingConnection);
|
|
connectionSettings.setConnection(TQT_DBusConnection::systemBus());
|
|
connect(&connectionSettings, SIGNAL(DeleteAsyncReply(int)), d, SLOT(processConnectionSettingsUpdateAsyncReply(int)));
|
|
int asyncCallID;
|
|
ret = connectionSettings.DeleteAsync(asyncCallID, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
tqApp->processEvents();
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
}
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
return TRUE;
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("Unable to remove connection with uuid '%1'").arg(uuid))
|
|
return FALSE;
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("connection for provided uuid '%1' was not found").arg(uuid));
|
|
return FALSE;
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("invalid internal network-manager settings proxy object").arg(uuid));
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus TDENetworkConnectionManager_BackendNM::initiateConnection(TQString uuid) {
|
|
TQT_DBusObjectPath existingConnection;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
if ((d->m_networkManagerSettings) && (d->m_networkManagerProxy)) {
|
|
ret = d->m_networkManagerSettings->GetConnectionByUuid(uuid, existingConnection, error);
|
|
if (ret) {
|
|
TQString dbusDeviceString;
|
|
if (m_macAddress == "") {
|
|
dbusDeviceString = "/";
|
|
}
|
|
else {
|
|
dbusDeviceString = deviceInterfaceString(m_macAddress);
|
|
}
|
|
connect(d->m_networkManagerProxy, SIGNAL(ActivateConnectionAsyncReply(int, const TQT_DBusObjectPath&)), d, SLOT(processAddConnectionAsyncReply(int, const TQT_DBusObjectPath&)));
|
|
int asyncCallID;
|
|
ret = d->m_networkManagerProxy->ActivateConnectionAsync(asyncCallID, existingConnection, TQT_DBusObjectPath(dbusDeviceString.ascii()), TQT_DBusObjectPath("/"), error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
tqApp->processEvents();
|
|
}
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
d->nmAddConnectionAsyncResponse.remove(asyncCallID);
|
|
return checkConnectionStatus(uuid);
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return checkConnectionStatus(uuid);
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("connection for provided uuid '%1' was not found").arg(uuid));
|
|
return TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("invalid internal network-manager settings proxy object").arg(uuid));
|
|
return TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
}
|
|
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus TDENetworkConnectionManager_BackendNM::checkConnectionStatus(TQString uuid) {
|
|
TQT_DBusObjectPath existingConnection;
|
|
TQT_DBusError error;
|
|
if (d->m_networkManagerProxy) {
|
|
TQT_DBusObjectPathList activeConnections = d->m_networkManagerProxy->getActiveConnections(error);
|
|
TQT_DBusObjectPathList::iterator it;
|
|
for (it = activeConnections.begin(); it != activeConnections.end(); ++it) {
|
|
DBus::ActiveConnectionProxy activeConnection(NM_DBUS_SERVICE, (*it));
|
|
activeConnection.setConnection(TQT_DBusConnection::systemBus());
|
|
if (activeConnection.getUuid(error) == uuid) {
|
|
return nmDeviceStateToTDEDeviceState(activeConnection.getState(error));
|
|
}
|
|
}
|
|
PRINT_ERROR(TQString("active connection for provided uuid '%1' was not found").arg(uuid));
|
|
return TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("invalid internal network-manager settings proxy object").arg(uuid));
|
|
return TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
}
|
|
|
|
TDENetworkConnectionStatus::TDENetworkConnectionStatus TDENetworkConnectionManager_BackendNM::deactivateConnection(TQString uuid) {
|
|
TQT_DBusObjectPath existingConnection;
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
if ((d->m_networkManagerSettings) && (d->m_networkManagerProxy)) {
|
|
ret = d->m_networkManagerSettings->GetConnectionByUuid(uuid, existingConnection, error);
|
|
if (ret) {
|
|
TQString dbusDeviceString;
|
|
if (m_macAddress == "") {
|
|
dbusDeviceString = "/";
|
|
}
|
|
else {
|
|
dbusDeviceString = deviceInterfaceString(m_macAddress);
|
|
}
|
|
connect(d->m_networkManagerProxy, SIGNAL(DeactivateConnectionAsyncReply(int)), d, SLOT(processConnectionSettingsUpdateAsyncReply(int)));
|
|
int asyncCallID;
|
|
ret = d->m_networkManagerProxy->DeactivateConnectionAsync(asyncCallID, existingConnection, error);
|
|
if (ret && error.isValid()) {
|
|
ret = 0;
|
|
PRINT_ERROR(error.name())
|
|
}
|
|
if (ret) {
|
|
// Wait for the asynchronous call to return...
|
|
d->nmConnectionSettingsAsyncCallWaiting[asyncCallID] = true;
|
|
TQTimer nmCallTimeoutTimer;
|
|
nmCallTimeoutTimer.start(NM_ASYNC_TIMEOUT_MS, TRUE);
|
|
while (d->nmConnectionSettingsAsyncCallWaiting[asyncCallID]) {
|
|
if (!nmCallTimeoutTimer.isActive()) {
|
|
PRINT_ERROR(TQString("DBUS asynchronous call timed out!"))
|
|
break;
|
|
}
|
|
tqApp->processEvents();
|
|
}
|
|
d->nmConnectionSettingsAsyncCallWaiting.remove(asyncCallID);
|
|
return checkConnectionStatus(uuid);
|
|
}
|
|
else {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return checkConnectionStatus(uuid);
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("connection for provided uuid '%1' was not found").arg(uuid));
|
|
return TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
}
|
|
else {
|
|
PRINT_ERROR(TQString("invalid internal network-manager settings proxy object").arg(uuid));
|
|
return TDENetworkConnectionStatus::Invalid;
|
|
}
|
|
}
|
|
|
|
TDENetworkWiFiAPInfo* TDENetworkConnectionManager_BackendNM::getAccessPointDetails(TQString dbusPath) {
|
|
TDENetworkWiFiAPInfo* apInfo = new TDENetworkWiFiAPInfo;
|
|
TQT_DBusError error;
|
|
unsigned int index;
|
|
DBus::AccessPointProxy accessPoint(NM_DBUS_SERVICE, dbusPath);
|
|
accessPoint.setConnection(TQT_DBusConnection::systemBus());
|
|
|
|
TQValueList<TQ_UINT8> nmSSID = accessPoint.getSsid(error);
|
|
if (error.isValid()) {
|
|
delete apInfo;
|
|
return NULL;
|
|
}
|
|
TQValueList<TQ_UINT8>::iterator it;
|
|
index = 0;
|
|
for (it = nmSSID.begin(); it != nmSSID.end(); ++it) {
|
|
apInfo->SSID.resize(index+1);
|
|
apInfo->SSID[index] = (*it);
|
|
index++;
|
|
}
|
|
|
|
apInfo->wpaFlags = nmAPSecFlagsToTDEAPSecFlags(accessPoint.getFlags(error), accessPoint.getWpaFlags(error));
|
|
apInfo->rsnFlags = nmAPSecFlagsToTDEAPSecFlags(accessPoint.getFlags(error), accessPoint.getRsnFlags(error));
|
|
apInfo->frequency = accessPoint.getFrequency(error);
|
|
apInfo->BSSID = accessPoint.getHwAddress(error);
|
|
apInfo->maxBitrate = accessPoint.getMaxBitrate(error);
|
|
apInfo->signalQuality = (accessPoint.getStrength(error)/100.0);
|
|
|
|
apInfo->valid = true;
|
|
|
|
return apInfo;
|
|
}
|
|
|
|
TDENetworkHWNeighborList* TDENetworkConnectionManager_BackendNM::siteSurvey() {
|
|
// FIXME
|
|
// Implement this!
|
|
// WiFiDeviceProxy(const TQString& service, const TQString& path, TQObject* parent = 0, const char* name = 0);
|
|
// virtual bool GetAccessPoints(TQValueList<TQT_DBusObjectPath>& access_points, TQT_DBusError& error);
|
|
// deviceInterfaceString
|
|
|
|
TQT_DBusError error;
|
|
bool ret;
|
|
|
|
TDENetworkConnectionType::TDENetworkConnectionType deviceType = connectionType();
|
|
TQString dbusDeviceString = deviceInterfaceString(m_macAddress);
|
|
clearTDENetworkHWNeighborList();
|
|
|
|
if (deviceType == TDENetworkConnectionType::WiFi) {
|
|
DBus::WiFiDeviceProxy wiFiDevice(NM_DBUS_SERVICE, dbusDeviceString);
|
|
wiFiDevice.setConnection(TQT_DBusConnection::systemBus());
|
|
// FIXME
|
|
// Should call wiFiDevice.RequestScanAsync first to rescan all access points
|
|
TQT_DBusObjectPathList accessPoints;
|
|
ret = wiFiDevice.GetAccessPoints(accessPoints, error);
|
|
if (ret) {
|
|
TQT_DBusObjectPathList::iterator it;
|
|
for (it = accessPoints.begin(); it != accessPoints.end(); ++it) {
|
|
TDENetworkWiFiAPInfo* apInfo = getAccessPointDetails(TQString(*it));
|
|
if (apInfo) {
|
|
m_hwNeighborList->append(apInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return m_hwNeighborList;
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::networkingEnabled() {
|
|
if (d->m_networkManagerProxy) {
|
|
bool ret;
|
|
TQT_DBusError error;
|
|
ret = d->m_networkManagerProxy->getNetworkingEnabled(error);
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return FALSE;
|
|
}
|
|
else {
|
|
return ret;
|
|
}
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::wiFiHardwareEnabled() {
|
|
if (d->m_networkManagerProxy) {
|
|
bool ret;
|
|
TQT_DBusError error;
|
|
ret = d->m_networkManagerProxy->getWirelessHardwareEnabled(error);
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return FALSE;
|
|
}
|
|
else {
|
|
return ret;
|
|
}
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::enableWiFi(bool enable) {
|
|
if (d->m_networkManagerProxy) {
|
|
TQT_DBusError error;
|
|
d->m_networkManagerProxy->setWirelessEnabled(enable, error);
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return FALSE;
|
|
}
|
|
else {
|
|
return TRUE;
|
|
}
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
bool TDENetworkConnectionManager_BackendNM::wiFiEnabled() {
|
|
if (d->m_networkManagerProxy) {
|
|
bool ret;
|
|
TQT_DBusError error;
|
|
ret = d->m_networkManagerProxy->getWirelessEnabled(error);
|
|
if (error.isValid()) {
|
|
// Error!
|
|
PRINT_ERROR(error.name())
|
|
return FALSE;
|
|
}
|
|
else {
|
|
return ret;
|
|
}
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
#include "network-manager.moc"
|
|
#include "network-manager_p.moc" |