diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.cpp b/libnymea-networkmanager/bluetooth/wirelessservice.cpp index f1d6345..ae866e7 100644 --- a/libnymea-networkmanager/bluetooth/wirelessservice.cpp +++ b/libnymea-networkmanager/bluetooth/wirelessservice.cpp @@ -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(command); switch (command) { case WirelessServiceCommandGetNetworks: commandGetNetworks(request); diff --git a/libnymea-networkmanager/networkconnection.cpp b/libnymea-networkmanager/networkconnection.cpp index 113d533..fe8e35a 100644 --- a/libnymea-networkmanager/networkconnection.cpp +++ b/libnymea-networkmanager/networkconnection.cpp @@ -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(); } diff --git a/libnymea-networkmanager/networkdevice.cpp b/libnymea-networkmanager/networkdevice.cpp index ca2fe5d..b60200d 100644 --- a/libnymea-networkmanager/networkdevice.cpp +++ b/libnymea-networkmanager/networkdevice.cpp @@ -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(); } diff --git a/libnymea-networkmanager/networkmanager.cpp b/libnymea-networkmanager/networkmanager.cpp index d6b9ac0..c15b3c0 100644 --- a/libnymea-networkmanager/networkmanager.cpp +++ b/libnymea-networkmanager/networkmanager.cpp @@ -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; } diff --git a/libnymea-networkmanager/wirednetworkdevice.cpp b/libnymea-networkmanager/wirednetworkdevice.cpp index 4a9db5c..c0c5973 100644 --- a/libnymea-networkmanager/wirednetworkdevice.cpp +++ b/libnymea-networkmanager/wirednetworkdevice.cpp @@ -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(); } diff --git a/libnymea-networkmanager/wirelessaccesspoint.cpp b/libnymea-networkmanager/wirelessaccesspoint.cpp index 00928f4..0334b3c 100644 --- a/libnymea-networkmanager/wirelessaccesspoint.cpp +++ b/libnymea-networkmanager/wirelessaccesspoint.cpp @@ -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(accessPointInterface.property("Flags").toUInt())); + m_capabilities = static_cast(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(); } diff --git a/libnymea-networkmanager/wirelessaccesspoint.h b/libnymea-networkmanager/wirelessaccesspoint.h index 4980e14..59bc76d 100644 --- a/libnymea-networkmanager/wirelessaccesspoint.h +++ b/libnymea-networkmanager/wirelessaccesspoint.h @@ -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 diff --git a/libnymea-networkmanager/wirelessnetworkdevice.cpp b/libnymea-networkmanager/wirelessnetworkdevice.cpp index 3b2783e..0e7127d 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.cpp +++ b/libnymea-networkmanager/wirelessnetworkdevice.cpp @@ -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(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(); } diff --git a/libnymea-networkmanager/wirelessnetworkdevice.h b/libnymea-networkmanager/wirelessnetworkdevice.h index 15185ce..87b05c1 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.h +++ b/libnymea-networkmanager/wirelessnetworkdevice.h @@ -69,6 +69,7 @@ private: int m_bitRate; QString m_macAddress; Mode m_mode = ModeUnknown; + int m_lastScan = -1; QDBusObjectPath m_activeAccessPointObjectPath; QHash 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: