Fix wireless protected flag and add open network connection support

pull/4/head
Simon Stürz 2019-11-19 13:19:17 +01:00
parent b6fdcc6145
commit f38c47d039
9 changed files with 100 additions and 26 deletions

View File

@ -309,6 +309,7 @@ void WirelessService::commandConnect(const QVariantMap &request)
void WirelessService::commandConnectHidden(const QVariantMap &request)
{
Q_UNUSED(request)
// TODO:
qCWarning(dcNetworkManagerBluetoothServer()) << "Connect to hidden network is not implemented yet.";
}
@ -535,6 +536,7 @@ void WirelessService::processCommand(const QVariantMap &request)
}
// Process method
qCDebug(dcNetworkManagerBluetoothServer()) << "Received command" << static_cast<WirelessServiceCommand>(command);
switch (command) {
case WirelessServiceCommandGetNetworks:
commandGetNetworks(request);

View File

@ -139,5 +139,5 @@ QDebug operator<<(QDebug debug, NetworkConnection *networkConnection)
debug.nospace() << networkConnection->interfaceName() << ", ";
debug.nospace() << networkConnection->type() << ", ";
debug.nospace() << networkConnection->timeStamp().toString("dd.MM.yyyy hh:mm") << ") ";
return debug;
return debug.space();
}

View File

@ -329,7 +329,7 @@ QString NetworkDevice::deviceStateReasonToString(const NetworkDevice::NetworkDev
void NetworkDevice::onStateChanged(uint newState, uint oldState, uint reason)
{
Q_UNUSED(oldState);
Q_UNUSED(oldState)
qCDebug(dcNetworkManager()) << m_interface << "--> State changed:" << deviceStateToString(NetworkDeviceState(newState)) << ":" << deviceStateReasonToString(NetworkDeviceStateReason(reason));
if (m_deviceState != NetworkDeviceState(newState)) {
m_deviceState = NetworkDeviceState(newState);
@ -341,6 +341,6 @@ void NetworkDevice::onStateChanged(uint newState, uint oldState, uint reason)
QDebug operator<<(QDebug debug, NetworkDevice *device)
{
debug.nospace() << "NetworkDevice(" << device->interface() << " - " << NetworkDevice::deviceTypeToString(device->deviceType()) << ", " << device->deviceStateString() << ")";
return debug;
return debug.space();
}

View File

@ -148,6 +148,8 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i
// Note: https://developer.gnome.org/NetworkManager/stable/ref-settings.html
qCDebug(dcNetworkManager()) << "Start connecting to" << accessPoint << "hidden:" << hidden;
// Create network settings for this wifi
QVariantMap connectionSettings;
connectionSettings.insert("autoconnect", true);
@ -162,8 +164,10 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i
// Note: disable power save mode
wirelessSettings.insert("powersave", 2);
if (hidden)
if (hidden) {
wirelessSettings.insert("hidden", true);
}
QVariantMap wirelessSecuritySettings;
wirelessSecuritySettings.insert("auth-alg", "open");
@ -182,7 +186,9 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i
settings.insert("802-11-wireless", wirelessSettings);
settings.insert("ipv4", ipv4Settings);
settings.insert("ipv6", ipv6Settings);
settings.insert("802-11-wireless-security", wirelessSecuritySettings);
if (accessPoint->isProtected())
settings.insert("802-11-wireless-security", wirelessSecuritySettings);
// Remove old configuration (if there is any)
foreach (NetworkConnection *connection, m_networkSettings->connections()) {
@ -225,7 +231,6 @@ NetworkManager::NetworkManagerError NetworkManager::startAccessPoint(const QStri
if (!wirelessNetworkDevice)
return NetworkManagerErrorInvalidNetworkDeviceType;
// Note: https://developer.gnome.org/NetworkManager/stable/ref-settings.html
// Create network settings for access point
@ -238,7 +243,7 @@ NetworkManager::NetworkManagerError NetworkManager::startAccessPoint(const QStri
QVariantMap wirelessSettings;
wirelessSettings.insert("band", "bg");
wirelessSettings.insert("mode", "ap");
wirelessSettings.insert("ssid", ssid.toUtf8());
wirelessSettings.insert("ssid", ssid.toUtf8());
wirelessSettings.insert("security", "802-11-wireless-security");
// Note: disable power save mode
wirelessSettings.insert("powersave", 2);
@ -382,6 +387,10 @@ bool NetworkManager::init()
setAvailable(true);
qCDebug(dcNetworkManager()) << "Network manager initialized successfully.";
qCDebug(dcNetworkManager()) << "Start initial wireless network scan...";
foreach (WirelessNetworkDevice *wirelessDevice, m_wirelessNetworkDevices.values()) {
wirelessDevice->scanWirelessNetworks();
}
return true;
}

View File

@ -104,5 +104,5 @@ QDebug operator<<(QDebug debug, WiredNetworkDevice *networkDevice)
debug.nospace() << networkDevice->bitRate() << " [Mb/s], ";
debug.nospace() << networkDevice->pluggedIn() << ", ";
debug.nospace() << networkDevice->deviceStateString() << ") ";
return debug;
return debug.space();
}

View File

@ -41,6 +41,7 @@
\value ApSecurityModeGroupCcmp
\value ApSecurityModeKeyMgmtPsk
\value ApSecurityModeKeyMgmt8021X
\value ApSecurityModeKeyMgmtSae
*/
/*! \fn void WirelessAccessPoint::signalStrengthChanged();
@ -66,8 +67,14 @@ WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObj
setMacAddress(accessPointInterface.property("HwAddress").toString());
setFrequency(accessPointInterface.property("Frequency").toDouble() / 1000);
setSignalStrength(accessPointInterface.property("Strength").toInt());
setSecurityFlags(WirelessAccessPoint::ApSecurityModes(accessPointInterface.property("WpaFlags").toUInt()));
setIsProtected(static_cast<bool>(accessPointInterface.property("Flags").toUInt()));
m_capabilities = static_cast<WirelessAccessPoint::ApFlags>(accessPointInterface.property("Flags").toUInt());
setWpaFlags(WirelessAccessPoint::ApSecurityModes(accessPointInterface.property("WpaFlags").toUInt()));
setRsnFlags(WirelessAccessPoint::ApSecurityModes(accessPointInterface.property("RsnFlags").toUInt()));
setIsProtected(m_rsnFlags != 0);
qCDebug(dcNetworkManager()) << ssid() << "WPA flags:" << m_wpaFlags;
qCDebug(dcNetworkManager()) << ssid() << "RSN flags:" << m_rsnFlags;
qCDebug(dcNetworkManager()) << ssid() << "Capabilities:" << m_capabilities;
QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap)));
}
@ -123,6 +130,16 @@ void WirelessAccessPoint::setSignalStrength(int signalStrength)
emit signalStrengthChanged();
}
void WirelessAccessPoint::setWpaFlags(WirelessAccessPoint::ApSecurityModes wpaFlags)
{
m_wpaFlags = wpaFlags;
}
void WirelessAccessPoint::setRsnFlags(WirelessAccessPoint::ApSecurityModes rsnFlags)
{
m_rsnFlags = rsnFlags;
}
void WirelessAccessPoint::setIsProtected(bool isProtected)
{
m_isProtected = isProtected;
@ -134,18 +151,31 @@ bool WirelessAccessPoint::isProtected() const
return m_isProtected;
}
/*! Returns the security flags of this \l{WirelessAccessPoint}.
WirelessAccessPoint::ApFlags WirelessAccessPoint::capabilities() const
{
return m_capabilities;
}
/*! Returns the WPA security flags of this \l{WirelessAccessPoint}.
This flags are describing the access point's capabilities according to WPA (Wifi Protected Access).
\sa WirelessAccessPoint::ApSecurityModes
*/
WirelessAccessPoint::ApSecurityModes WirelessAccessPoint::securityFlags() const
WirelessAccessPoint::ApSecurityModes WirelessAccessPoint::wpaFlags() const
{
return m_securityFlags;
return m_wpaFlags;
}
void WirelessAccessPoint::setSecurityFlags(WirelessAccessPoint::ApSecurityModes securityFlags)
/*! Returns the RSN security flags of this \l{WirelessAccessPoint}.
Flags describing the access point's capabilities according to the RSN (Robust Secure Network) protocol.
\sa WirelessAccessPoint::ApSecurityModes
*/
WirelessAccessPoint::ApSecurityModes WirelessAccessPoint::rsnFlags() const
{
m_securityFlags = securityFlags;
return m_rsnFlags;
}
void WirelessAccessPoint::onPropertiesChanged(const QVariantMap &properties)
@ -157,5 +187,10 @@ void WirelessAccessPoint::onPropertiesChanged(const QVariantMap &properties)
QDebug operator<<(QDebug debug, WirelessAccessPoint *accessPoint)
{
return debug.nospace() << "AccessPoint(" << accessPoint->signalStrength() << "%, " << accessPoint->frequency()<< " GHz, " << accessPoint->ssid() << ", " << (accessPoint->isProtected() ? "protected" : "open" ) << ")";
debug.nospace() << "AccessPoint(" << accessPoint->signalStrength() << "%, "
<< accessPoint->frequency()<< " GHz, "
<< accessPoint->ssid() << ", " <<
(accessPoint->isProtected() ? "protected" : "open" )
<< ")";
return debug.space();
}

View File

@ -34,7 +34,6 @@
class WirelessAccessPoint : public QObject
{
Q_OBJECT
Q_FLAGS(ApSecurityModes)
public:
enum ApSecurityMode {
@ -49,8 +48,21 @@ public:
ApSecurityModeGroupCcmp = 0x080,
ApSecurityModeKeyMgmtPsk = 0x100,
ApSecurityModeKeyMgmt8021X = 0x200,
ApSecurityModeKeyMgmtSae = 0x400
};
Q_DECLARE_FLAGS(ApSecurityModes, ApSecurityMode)
Q_FLAG(ApSecurityModes)
enum ApCapabilities {
ApCapabilitiesNone = 0x00,
ApCapabilitiesPrivacy = 0x01,
ApCapabilitiesWps = 0x02,
ApCapabilitiesWpsPushButton = 0x04,
ApCapabilitiesWpsPin = 0x08
};
Q_DECLARE_FLAGS(ApFlags, ApCapabilities)
Q_FLAG(ApCapabilities)
explicit WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent = nullptr);
@ -62,7 +74,9 @@ public:
int signalStrength() const;
bool isProtected() const;
WirelessAccessPoint::ApSecurityModes securityFlags() const;
WirelessAccessPoint::ApFlags capabilities() const;
WirelessAccessPoint::ApSecurityModes wpaFlags() const;
WirelessAccessPoint::ApSecurityModes rsnFlags() const;
private:
QDBusObjectPath m_objectPath;
@ -71,14 +85,17 @@ private:
double m_frequency;
int m_signalStrength = 0;
bool m_isProtected = false;
WirelessAccessPoint::ApSecurityModes m_securityFlags = ApSecurityModeNone;
WirelessAccessPoint::ApFlags m_capabilities = ApCapabilitiesNone;
WirelessAccessPoint::ApSecurityModes m_wpaFlags = ApSecurityModeNone;
WirelessAccessPoint::ApSecurityModes m_rsnFlags = ApSecurityModeNone;
void setSsid(const QString &ssid);
void setMacAddress(const QString &macAddress);
void setFrequency(double frequency);
void setSignalStrength(int signalStrength);
void setWpaFlags(WirelessAccessPoint::ApSecurityModes wpaFlags);
void setRsnFlags(WirelessAccessPoint::ApSecurityModes rsnFlags);
void setIsProtected(bool isProtected);
void setSecurityFlags(WirelessAccessPoint::ApSecurityModes securityFlags);
signals:
void signalStrengthChanged();
@ -90,4 +107,7 @@ private slots:
QDebug operator<<(QDebug debug, WirelessAccessPoint *accessPoint);
Q_DECLARE_OPERATORS_FOR_FLAGS(WirelessAccessPoint::ApSecurityModes)
Q_DECLARE_OPERATORS_FOR_FLAGS(WirelessAccessPoint::ApFlags)
#endif // WIRELESSACCESSPOINT_H

View File

@ -110,7 +110,7 @@ WirelessAccessPoint *WirelessNetworkDevice::activeAccessPoint()
/*! Perform a wireless network scan on this \l{WirelessNetworkDevice}. */
void WirelessNetworkDevice::scanWirelessNetworks()
{
qCDebug(dcNetworkManager()) << this << "Request scan";
qCDebug(dcNetworkManager()) << "Request scan" << this;
QDBusMessage query = m_wirelessInterface->call("RequestScan", QVariantMap());
if (query.type() != QDBusMessage::ReplyMessage) {
qCWarning(dcNetworkManager()) << "Scan error:" << query.errorName() << query.errorMessage();
@ -132,6 +132,7 @@ WirelessAccessPoint *WirelessNetworkDevice::getAccessPoint(const QString &ssid)
return accessPoint;
}
return nullptr;
}
/*! Returns the \l{WirelessAccessPoint} with the given \a objectPath. If the \l{WirelessAccessPoint} could not be found, return nullptr. */
@ -206,17 +207,17 @@ void WirelessNetworkDevice::accessPointAdded(const QDBusObjectPath &objectPath)
{
QDBusInterface accessPointInterface(NetworkManagerUtils::networkManagerServiceString(), objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), QDBusConnection::systemBus());
if (!accessPointInterface.isValid()) {
qCWarning(dcNetworkManager()) << "WirelessNetworkDevice: Invalid access point dbus interface";
qCWarning(dcNetworkManager()) << this << "Invalid access point dbus interface";
return;
}
if (m_accessPointsTable.keys().contains(objectPath)) {
qCWarning(dcNetworkManager()) << "WirelessNetworkDevice: Access point already added" << objectPath.path();
qCWarning(dcNetworkManager()) << this << "Access point already added" << objectPath.path();
return;
}
WirelessAccessPoint *accessPoint = new WirelessAccessPoint(objectPath, this);
//qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: [+]" << accessPoint;
qCDebug(dcNetworkManager()) << interface() << "[+]" << accessPoint;
m_accessPointsTable.insert(objectPath, accessPoint);
}
@ -229,7 +230,7 @@ void WirelessNetworkDevice::accessPointRemoved(const QDBusObjectPath &objectPath
if (accessPoint == m_activeAccessPoint)
m_activeAccessPoint = nullptr;
//qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: [-]" << accessPoint;
qCDebug(dcNetworkManager()) << interface() << "[-]" << accessPoint;
accessPoint->deleteLater();
}
@ -246,6 +247,11 @@ void WirelessNetworkDevice::propertiesChanged(const QVariantMap &properties)
if (properties.contains("Mode"))
setMode(static_cast<Mode>(m_wirelessInterface->property("Mode").toUInt()));
// Note: available since 1.12 (-1 means never scanned)
if (properties.contains("LastScan"))
setLastScan(m_wirelessInterface->property("LastScan").toInt());
}
/*! Writes the given \a device to the given to \a debug. \sa WirelessNetworkDevice, */
@ -256,5 +262,5 @@ QDebug operator<<(QDebug debug, WirelessNetworkDevice *device)
debug.nospace() << device->mode() << ", ";
debug.nospace() << device->bitRate() << " [Mb/s], ";
debug.nospace() << device->deviceStateString() << ") ";
return debug;
return debug.space();
}

View File

@ -69,6 +69,7 @@ private:
int m_bitRate;
QString m_macAddress;
Mode m_mode = ModeUnknown;
int m_lastScan = -1;
QDBusObjectPath m_activeAccessPointObjectPath;
QHash<QDBusObjectPath, WirelessAccessPoint *> m_accessPointsTable;
@ -78,6 +79,7 @@ private:
void setMacAddress(const QString &macAddress);
void setMode(Mode mode);
void setBitrate(int bitRate);
void setLastScan(int lastScan);
void setActiveAccessPoint(const QDBusObjectPath &activeAccessPointObjectPath);
private slots: