diff --git a/networkmanagement/wifisettings.cpp b/networkmanagement/wifisettings.cpp index 82a7f3a..aa8498a 100644 --- a/networkmanagement/wifisettings.cpp +++ b/networkmanagement/wifisettings.cpp @@ -1,5 +1,6 @@ /* * Copyright 2018 Martin Kacej + * Copyright 2021 Wang Rui * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -32,9 +33,16 @@ #include #include #include +#include -WifiSettings::WifiSettings(QObject* parent) : QObject(parent) +#include +#include + +WifiSettings::WifiSettings(QObject* parent) + : QObject(parent) { + ::passwd *pw = ::getpwuid(::getuid()); + m_userName = QString::fromLocal8Bit(pw->pw_name); } WifiSettings::~WifiSettings() @@ -287,4 +295,76 @@ QString WifiSettings::getAccessPointConnection() } } return QString(); -} \ No newline at end of file +} + +bool WifiSettings::addOtherConnection(const QString ssid, const QString userName, const QString pwd, const QString type) +{ + NetworkManager::ConnectionSettings::Ptr connectionSettings; + connectionSettings = NetworkManager::ConnectionSettings::Ptr(new NetworkManager::ConnectionSettings(NetworkManager::ConnectionSettings::Wireless)); + connectionSettings->setAutoconnect(true); + connectionSettings->setUuid(NetworkManager::ConnectionSettings::createNewUuid()); + connectionSettings->setId(ssid); + connectionSettings->addToPermissions(m_userName, QString()); + + NMVariantMapMap csMapMap = connectionSettings->toMap();; + NetworkManager::WirelessSetting wirelessSetting; + + wirelessSetting.setSsid(ssid.toUtf8()); + wirelessSetting.setInitialized(true); + wirelessSetting.setMode(NetworkManager::WirelessSetting::Infrastructure); + wirelessSetting.setHidden(true); + + if (type != "None") { + wirelessSetting.setSecurity("802-11-wireless-security"); + } + + NetworkManager::WirelessSecuritySetting wirelessSecuritySetting; + if(type == "None") { + wirelessSecuritySetting.setKeyMgmt(NetworkManager::WirelessSecuritySetting::Unknown); + } else if (type == "WEP") { + wirelessSecuritySetting.setKeyMgmt(NetworkManager::WirelessSecuritySetting::Ieee8021x); + NetworkManager::Security8021xSetting security8021x; + security8021x.setEapMethods(QList() << NetworkManager::Security8021xSetting::EapMethodPwd); + security8021x.setIdentity(userName); + security8021x.setPassword(pwd); + security8021x.setPasswordFlags(NetworkManager::Setting::AgentOwned); + QVariantMap security8021xMap = security8021x.toMap(); + csMapMap.insert(NetworkManager::Setting::typeAsString(NetworkManager::Setting::Security8021x), security8021xMap); + } else if (type == "WPA/WPA2") { + wirelessSecuritySetting.setKeyMgmt(NetworkManager::WirelessSecuritySetting::WpaPsk); + wirelessSecuritySetting.setPsk(pwd); + wirelessSecuritySetting.setPskFlags(NetworkManager::Setting::AgentOwned); + } else if (type == "WPA3") { + wirelessSecuritySetting.setKeyMgmt(NetworkManager::WirelessSecuritySetting::SAE); + wirelessSecuritySetting.setPsk(pwd); + wirelessSecuritySetting.setPskFlags(NetworkManager::Setting::AgentOwned); + } else if (type == "LEAP") { + wirelessSecuritySetting.setKeyMgmt(NetworkManager::WirelessSecuritySetting::Ieee8021x); + wirelessSecuritySetting.setAuthAlg(NetworkManager::WirelessSecuritySetting::Leap); + wirelessSecuritySetting.setLeapUsername(userName); + wirelessSecuritySetting.setLeapPassword(pwd); + wirelessSecuritySetting.setPskFlags(NetworkManager::Setting::AgentOwned); + } else if(type == "WepHex") { + wirelessSecuritySetting.setKeyMgmt(NetworkManager::WirelessSecuritySetting::Wep); + wirelessSecuritySetting.setWepKeyType(NetworkManager::WirelessSecuritySetting::Hex); + wirelessSecuritySetting.setWepTxKeyindex(1); + wirelessSecuritySetting.setWepKey0(pwd); + wirelessSecuritySetting.setAuthAlg(NetworkManager::WirelessSecuritySetting::Open); + } + + NetworkManager::Ipv4Setting ipv4Setting; + ipv4Setting.setMethod(NetworkManager::Ipv4Setting::Automatic); + + QVariantMap wifiSettingMap = wirelessSetting.toMap(); + QVariantMap wifiSecurityMap = wirelessSecuritySetting.toMap(); + QVariantMap ipv4Map = ipv4Setting.toMap(); + + csMapMap.insert(NetworkManager::Setting::typeAsString(NetworkManager::Setting::Wireless), wifiSettingMap); + if(type != "None") { + csMapMap.insert(NetworkManager::Setting::typeAsString(NetworkManager::Setting::WirelessSecurity), wifiSecurityMap); + } + csMapMap.insert(NetworkManager::Setting::typeAsString(NetworkManager::Setting::Ipv4), ipv4Map); + NetworkManager::addConnection(csMapMap); + + return true; +} diff --git a/networkmanagement/wifisettings.h b/networkmanagement/wifisettings.h index 8388ece..3d74f96 100644 --- a/networkmanagement/wifisettings.h +++ b/networkmanagement/wifisettings.h @@ -34,7 +34,14 @@ public: Q_INVOKABLE void updateConnectionFromQML(const QString &path, const QVariantMap &map); Q_INVOKABLE QString getAccessPointDevice(); Q_INVOKABLE QString getAccessPointConnection(); + + Q_INVOKABLE bool addOtherConnection(const QString ssid, const QString userName, + const QString pwd, const QString type); + virtual ~WifiSettings(); + +private: + QString m_userName; }; #endif // WIFISETTINGS_H