|  |  | @ -1,11 +1,26 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <algorithm> |  |  |  | #include <algorithm> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <set> |  |  |  | #include <set> | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include <stdlib.h> | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include <iostream> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "wifiManager.hpp" |  |  |  | #include "wifiManager.hpp" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include "common/params.h" | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | /**
 |  |  |  | /**
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  * We are using a NetworkManager DBUS API : https://developer.gnome.org/NetworkManager/1.26/spec.html
 |  |  |  |  * We are using a NetworkManager DBUS API : https://developer.gnome.org/NetworkManager/1.26/spec.html
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  * */ |  |  |  |  * */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NM80211ApFlags
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_FLAGS_PRIVACY = 0x00000001; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | // https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NM80211ApSecurityFlags
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_SEC_PAIR_WEP40      = 0x00000001; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_SEC_PAIR_WEP104     = 0x00000002; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_SEC_GROUP_WEP40     = 0x00000010; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_SEC_GROUP_WEP104    = 0x00000020; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_SEC_KEY_MGMT_PSK    = 0x00000100; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | const int NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | QString nm_path                = "/org/freedesktop/NetworkManager"; |  |  |  | QString nm_path                = "/org/freedesktop/NetworkManager"; | 
			
		
	
		
		
			
				
					
					|  |  |  | QString nm_settings_path       = "/org/freedesktop/NetworkManager/Settings"; |  |  |  | QString nm_settings_path       = "/org/freedesktop/NetworkManager/Settings"; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -40,8 +55,10 @@ bool compare_by_strength(const Network &a, const Network &b){ | 
			
		
	
		
		
			
				
					
					|  |  |  |   return a.strength > b.strength; |  |  |  |   return a.strength > b.strength; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | WifiManager::WifiManager(){ |  |  |  | WifiManager::WifiManager(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |   qDBusRegisterMetaType<Connection>(); |  |  |  |   qDBusRegisterMetaType<Connection>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   qDBusRegisterMetaType<IpConfig>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   connecting_to_network = ""; |  |  |  |   connecting_to_network = ""; | 
			
		
	
		
		
			
				
					
					|  |  |  |   adapter = get_adapter(); |  |  |  |   adapter = get_adapter(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   has_adapter = adapter != ""; |  |  |  |   has_adapter = adapter != ""; | 
			
		
	
	
		
		
			
				
					|  |  | @ -54,6 +71,13 @@ WifiManager::WifiManager(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |     raw_adapter_state = get_response<uint>(response); |  |  |  |     raw_adapter_state = get_response<uint>(response); | 
			
		
	
		
		
			
				
					
					|  |  |  |     change(raw_adapter_state, 0, 0); |  |  |  |     change(raw_adapter_state, 0, 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // Compute tethering ssid as "Weedle" + first 4 characters of a dongle id
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   tethering_ssid = "weedle"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   std::string bytes = Params().get("DongleId"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (bytes.length() >= 4){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     tethering_ssid+="-"+QString::fromStdString(bytes.substr(0,4)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void WifiManager::refreshNetworks(){ |  |  |  | void WifiManager::refreshNetworks(){ | 
			
		
	
	
		
		
			
				
					|  |  | @ -116,9 +140,12 @@ SecurityType WifiManager::getSecurityType(QString path){ | 
			
		
	
		
		
			
				
					
					|  |  |  |   int rsnflag = get_property(path, "RsnFlags").toInt(); |  |  |  |   int rsnflag = get_property(path, "RsnFlags").toInt(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   int wpa_props = wpaflag | rsnflag; |  |  |  |   int wpa_props = wpaflag | rsnflag; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // obtained by looking at flags of networks in the office as reported by an Android phone
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   const int supports_wpa = NM_802_11_AP_SEC_PAIR_WEP40 | NM_802_11_AP_SEC_PAIR_WEP104 | NM_802_11_AP_SEC_GROUP_WEP40 | NM_802_11_AP_SEC_GROUP_WEP104 | NM_802_11_AP_SEC_KEY_MGMT_PSK; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (sflag == 0){ |  |  |  |   if (sflag == 0){ | 
			
		
	
		
		
			
				
					
					|  |  |  |     return SecurityType::OPEN; |  |  |  |     return SecurityType::OPEN; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } else if((sflag & 0x1) && (wpa_props & (0x333) && !(wpa_props & 0x200))) { |  |  |  |   } else if ((sflag & NM_802_11_AP_FLAGS_PRIVACY) && (wpa_props & supports_wpa) && !(wpa_props & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     return SecurityType::WPA; |  |  |  |     return SecurityType::WPA; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } else { |  |  |  |   } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |     return SecurityType::UNSUPPORTED; |  |  |  |     return SecurityType::UNSUPPORTED; | 
			
		
	
	
		
		
			
				
					|  |  | @ -135,10 +162,7 @@ void WifiManager::connect(Network n, QString password){ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void WifiManager::connect(Network n, QString username, QString password){ |  |  |  | void WifiManager::connect(Network n, QString username, QString password){ | 
			
		
	
		
		
			
				
					
					|  |  |  |   connecting_to_network = n.ssid; |  |  |  |   connecting_to_network = n.ssid; | 
			
		
	
		
		
			
				
					
					|  |  |  |   QString active_ap = get_active_ap(); |  |  |  |   disconnect(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   if(active_ap!="" && active_ap!="/"){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     deactivate_connections(get_property(active_ap, "Ssid")); //Disconnect from any connected networks 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   clear_connections(n.ssid); //Clear all connections that may already exist to the network we are connecting
 |  |  |  |   clear_connections(n.ssid); //Clear all connections that may already exist to the network we are connecting
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   connect(n.ssid, username, password, n.security_type); |  |  |  |   connect(n.ssid, username, password, n.security_type); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | @ -147,8 +171,8 @@ void WifiManager::connect(QByteArray ssid, QString username, QString password, S | 
			
		
	
		
		
			
				
					
					|  |  |  |   Connection connection; |  |  |  |   Connection connection; | 
			
		
	
		
		
			
				
					
					|  |  |  |   connection["connection"]["type"] = "802-11-wireless"; |  |  |  |   connection["connection"]["type"] = "802-11-wireless"; | 
			
		
	
		
		
			
				
					
					|  |  |  |   connection["connection"]["uuid"] = QUuid::createUuid().toString().remove('{').remove('}'); |  |  |  |   connection["connection"]["uuid"] = QUuid::createUuid().toString().remove('{').remove('}'); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   connection["connection"]["id"] = "OpenPilot connection "+QString::fromStdString(ssid.toStdString()); |  |  |  |   connection["connection"]["id"] = "OpenPilot connection "+QString::fromStdString(ssid.toStdString()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["connection"]["autoconnect-retries"] = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   connection["802-11-wireless"]["ssid"] = ssid; |  |  |  |   connection["802-11-wireless"]["ssid"] = ssid; | 
			
		
	
		
		
			
				
					
					|  |  |  |   connection["802-11-wireless"]["mode"] = "infrastructure"; |  |  |  |   connection["802-11-wireless"]["mode"] = "infrastructure"; | 
			
		
	
	
		
		
			
				
					|  |  | @ -163,7 +187,7 @@ void WifiManager::connect(QByteArray ssid, QString username, QString password, S | 
			
		
	
		
		
			
				
					
					|  |  |  |   connection["ipv6"]["method"] = "ignore"; |  |  |  |   connection["ipv6"]["method"] = "ignore"; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus); |  |  |  |   QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus); | 
			
		
	
		
		
			
				
					
					|  |  |  |   QDBusReply<QDBusObjectPath> result = nm_settings.call("AddConnection", QVariant::fromValue(connection)); |  |  |  |   nm_settings.call("AddConnection", QVariant::fromValue(connection)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void WifiManager::deactivate_connections(QString ssid){ |  |  |  | void WifiManager::deactivate_connections(QString ssid){ | 
			
		
	
	
		
		
			
				
					|  |  | @ -294,3 +318,52 @@ void WifiManager::change(unsigned int new_state,unsigned int previous_state,unsi | 
			
		
	
		
		
			
				
					
					|  |  |  |     connecting_to_network = ""; |  |  |  |     connecting_to_network = ""; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void WifiManager::disconnect(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QString active_ap = get_active_ap(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (active_ap!="" && active_ap!="/"){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     deactivate_connections(get_property(active_ap, "Ssid")); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | //Functions for tethering 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void WifiManager::enableTethering(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   disconnect(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   Connection connection; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["connection"]["id"] = "Hotspot"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["connection"]["uuid"] = QUuid::createUuid().toString().remove('{').remove('}'); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["connection"]["type"] = "802-11-wireless"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["connection"]["interface-name"] = "wlan0"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless"]["band"] = "bg"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless"]["mode"] = "ap"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless"]["ssid"] = tethering_ssid.toUtf8(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless-security"]["group"] = QStringList("ccmp"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless-security"]["key-mgmt"] = "wpa-psk"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless-security"]["pairwise"] = QStringList("ccmp"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless-security"]["proto"] = QStringList("rsn"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["802-11-wireless-security"]["psk"] = "swagswagcomma"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["ipv4"]["method"] = "shared"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QMap<QString,QVariant> adress1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   adress1["address"] = "192.168.43.1"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   adress1["prefix"] = 24u; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["ipv4"]["address-data"] = QVariant::fromValue(IpConfig() << adress1); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["ipv4"]["gateway"] = "192.168.43.1"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   connection["ipv6"]["method"] = "ignore"; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   nm_settings.call("AddConnection", QVariant::fromValue(connection)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void WifiManager::disableTethering(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   clear_connections(tethering_ssid); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | bool WifiManager::tetheringEnabled(){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QString active_ap = get_active_ap(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   return get_property(active_ap, "Ssid") == tethering_ssid; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |