void nm_wifi_item_remove_ap (NMWifiItem *self, NMAccessPoint *ap) { NMWifiItemPrivate *priv; GSList *iter; g_return_if_fail (NM_IS_WIFI_ITEM (self)); g_return_if_fail (NM_IS_ACCESS_POINT (ap)); priv = GET_PRIVATE (self); for (iter = priv->ap_list; iter; iter = iter->next) { if (ap != iter->data) continue; g_signal_handlers_disconnect_matched (ap, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, update_current_ap, self); priv->ap_list = g_slist_delete_link (priv->ap_list, iter); g_object_unref (ap); if (priv->ap_list) update_current_ap (self); else /* No APs left, die */ nm_list_item_request_remove (NM_LIST_ITEM (self)); break; } }
/** * nm_access_point_get_last_seen: * @ap: a #NMAccessPoint * * Returns the timestamp (in CLOCK_BOOTTIME seconds) for the last time the * access point was found in scan results. A value of -1 means the access * point has not been found in a scan. * * Returns: the last seen time in seconds * * Since: 1.2 **/ gint nm_access_point_get_last_seen (NMAccessPoint *ap) { g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), -1); _nm_object_ensure_inited (NM_OBJECT (ap)); return NM_ACCESS_POINT_GET_PRIVATE (ap)->last_seen; }
/** * nm_access_point_get_strength: * @ap: a #NMAccessPoint * * Gets the current signal strength of the access point. * * Returns: the signal strength **/ guint8 nm_access_point_get_strength (NMAccessPoint *ap) { g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); _nm_object_ensure_inited (NM_OBJECT (ap)); return NM_ACCESS_POINT_GET_PRIVATE (ap)->strength; }
/** * nm_access_point_get_max_bitrate: * @ap: a #NMAccessPoint * * Gets the maximum bit rate of the access point in kbit/s. * * Returns: the maximum bit rate (kbit/s) **/ guint32 nm_access_point_get_max_bitrate (NMAccessPoint *ap) { g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); _nm_object_ensure_inited (NM_OBJECT (ap)); return NM_ACCESS_POINT_GET_PRIVATE (ap)->max_bitrate; }
/** * nm_access_point_get_mode: * @ap: a #NMAccessPoint * * Gets the mode of the access point. * * Returns: the mode **/ NM80211Mode nm_access_point_get_mode (NMAccessPoint *ap) { g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); _nm_object_ensure_inited (NM_OBJECT (ap)); return NM_ACCESS_POINT_GET_PRIVATE (ap)->mode; }
/** * nm_access_point_get_bssid: * @ap: a #NMAccessPoint * * Gets the Basic Service Set ID (BSSID) of the Wi-Fi access point. * * Returns: the BSSID of the access point. This is an internal string and must * not be modified or freed. **/ const char * nm_access_point_get_bssid (NMAccessPoint *ap) { g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NULL); _nm_object_ensure_inited (NM_OBJECT (ap)); return NM_ACCESS_POINT_GET_PRIVATE (ap)->bssid; }
/** * nm_access_point_get_rsn_flags: * @ap: a #NMAccessPoint * * Gets the RSN (Robust Secure Network, ie WPA version 2) flags of the access * point. * * Returns: the RSN flags **/ NM80211ApSecurityFlags nm_access_point_get_rsn_flags (NMAccessPoint *ap) { g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_SEC_NONE); _nm_object_ensure_inited (NM_OBJECT (ap)); return NM_ACCESS_POINT_GET_PRIVATE (ap)->rsn_flags; }
void nm_network_menu_item_add_dupe (NMNetworkMenuItem *item, NMAccessPoint *ap) { const char *path; g_return_if_fail (item != NULL); g_return_if_fail (NM_IS_NETWORK_MENU_ITEM (item)); g_return_if_fail (NM_IS_ACCESS_POINT (ap)); path = nm_object_get_path (NM_OBJECT (ap)); item->dupes = g_slist_prepend (item->dupes, g_strdup (path)); }
gboolean nm_network_menu_item_find_dupe (NMNetworkMenuItem *item, NMAccessPoint *ap) { const char *path; GSList *iter; g_return_val_if_fail (item != NULL, FALSE); g_return_val_if_fail (NM_IS_NETWORK_MENU_ITEM (item), FALSE); g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), FALSE); path = nm_object_get_path (NM_OBJECT (ap)); for (iter = item->dupes; iter; iter = g_slist_next (iter)) { if (!strcmp (path, iter->data)) return TRUE; } return FALSE; }
NMListItem * nm_wifi_item_new (NMClient *client, NMDeviceWifi *device, NMAccessPoint *ap, NMSettingsConnectionInterface *connection) { g_return_val_if_fail (NM_IS_CLIENT (client), NULL); g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NULL); return (NMListItem *) g_object_new (NM_TYPE_WIFI_ITEM, NM_LIST_ITEM_TYPE_NAME, _("WiFi"), NM_CONNECTION_ITEM_CLIENT, client, NM_CONNECTION_ITEM_CONNECTION, connection, NM_DEVICE_ITEM_DEVICE, device, NM_WIFI_ITEM_AP, ap, NULL); }
gboolean nm_wifi_item_add_ap (NMWifiItem *self, NMAccessPoint *ap) { NMWifiItemPrivate *priv; g_return_val_if_fail (NM_IS_WIFI_ITEM (self), FALSE); g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), FALSE); priv = GET_PRIVATE (self); if (priv->current_ap && !utils_access_point_is_compatible (priv->current_ap, ap)) return FALSE; priv->ap_list = g_slist_prepend (priv->ap_list, g_object_ref (ap)); update_current_ap (self); g_signal_connect_swapped (ap, "notify::" NM_ACCESS_POINT_STRENGTH, G_CALLBACK (update_current_ap), self); return TRUE; }
GtkWidget * nma_wireless_dialog_new (NMClient *client, NMConnection *connection, NMDevice *device, NMAccessPoint *ap) { NMAWirelessDialog *self; NMAWirelessDialogPrivate *priv; guint32 dev_caps; g_return_val_if_fail (NM_IS_CLIENT (client), NULL); g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); g_return_val_if_fail (NM_IS_DEVICE (device), NULL); g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NULL); /* Ensure device validity */ dev_caps = nm_device_get_capabilities (device); g_return_val_if_fail (dev_caps & NM_DEVICE_CAP_NM_SUPPORTED, NULL); g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); self = NMA_WIRELESS_DIALOG (g_object_new (NMA_TYPE_WIRELESS_DIALOG, NULL)); if (!self) return NULL; priv = NMA_WIRELESS_DIALOG_GET_PRIVATE (self); priv->client = g_object_ref (client); priv->ap = g_object_ref (ap); if (!internal_init (self, connection, device, TRUE, FALSE)) { nm_warning ("Couldn't create wireless security dialog."); g_object_unref (self); return NULL; } return GTK_WIDGET (self); }
static NMSettingWirelessSecurity * get_security_for_ap (NMAccessPoint *ap, guint32 dev_caps, gboolean *supported, NMSetting8021x **s_8021x) { NMSettingWirelessSecurity *sec; NM80211Mode mode; guint32 flags; guint32 wpa_flags; guint32 rsn_flags; g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NULL); g_return_val_if_fail (supported != NULL, NULL); g_return_val_if_fail (*supported == TRUE, NULL); g_return_val_if_fail (s_8021x != NULL, NULL); g_return_val_if_fail (*s_8021x == NULL, NULL); sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new (); mode = nm_access_point_get_mode (ap); flags = nm_access_point_get_flags (ap); wpa_flags = nm_access_point_get_wpa_flags (ap); rsn_flags = nm_access_point_get_rsn_flags (ap); /* No security */ if ( !(flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpa_flags == NM_802_11_AP_SEC_NONE) && (rsn_flags == NM_802_11_AP_SEC_NONE)) goto none; /* Static WEP, Dynamic WEP, or LEAP */ if (flags & NM_802_11_AP_FLAGS_PRIVACY) { if ((dev_caps & NM_WIFI_DEVICE_CAP_RSN) || (dev_caps & NM_WIFI_DEVICE_CAP_WPA)) { /* If the device can do WPA/RSN but the AP has no WPA/RSN informatoin * elements, it must be LEAP or static/dynamic WEP. */ if ((wpa_flags == NM_802_11_AP_SEC_NONE) && (rsn_flags == NM_802_11_AP_SEC_NONE)) { g_object_set (sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none", NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, 0, NULL); return sec; } /* Otherwise, the AP supports WPA or RSN, which is preferred */ } else { /* Device can't do WPA/RSN, but can at least pass through the * WPA/RSN information elements from a scan. Since Privacy was * advertised, LEAP or static/dynamic WEP must be in use. */ g_object_set (sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none", NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, 0, NULL); return sec; } } /* Stuff after this point requires infrastructure */ if (mode != NM_802_11_MODE_INFRA) { *supported = FALSE; goto none; } /* WPA2 PSK first */ if ( (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) && (dev_caps & NM_WIFI_DEVICE_CAP_RSN)) { g_object_set (sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk", NULL); nm_setting_wireless_security_add_proto (sec, "rsn"); add_ciphers_from_flags (sec, rsn_flags, TRUE); add_ciphers_from_flags (sec, rsn_flags, FALSE); return sec; } /* WPA PSK */ if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) && (dev_caps & NM_WIFI_DEVICE_CAP_WPA)) { g_object_set (sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk", NULL); nm_setting_wireless_security_add_proto (sec, "wpa"); add_ciphers_from_flags (sec, wpa_flags, TRUE); add_ciphers_from_flags (sec, wpa_flags, FALSE); return sec; } /* WPA2 Enterprise */ if ( (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) && (dev_caps & NM_WIFI_DEVICE_CAP_RSN)) { g_object_set (sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-eap", NULL); nm_setting_wireless_security_add_proto (sec, "rsn"); add_ciphers_from_flags (sec, rsn_flags, TRUE); add_ciphers_from_flags (sec, rsn_flags, FALSE); *s_8021x = NM_SETTING_802_1X (nm_setting_802_1x_new ()); nm_setting_802_1x_add_eap_method (*s_8021x, "ttls"); g_object_set (*s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, "mschapv2", NULL); return sec; } /* WPA Enterprise */ if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) && (dev_caps & NM_WIFI_DEVICE_CAP_WPA)) { g_object_set (sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-eap", NULL); nm_setting_wireless_security_add_proto (sec, "wpa"); add_ciphers_from_flags (sec, wpa_flags, TRUE); add_ciphers_from_flags (sec, wpa_flags, FALSE); *s_8021x = NM_SETTING_802_1X (nm_setting_802_1x_new ()); nm_setting_802_1x_add_eap_method (*s_8021x, "ttls"); g_object_set (*s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, "mschapv2", NULL); return sec; } *supported = FALSE; none: g_object_unref (sec); return NULL; }
static void print_access_point_info (NMAccessPoint * ap, gboolean active, guint32 device_capas) { const char * bssid; const GByteArray * ssid; NM80211Mode mode; guint32 frequency; guint32 max_bitrate; guint32 signal_strength; guint32 ap_flags; guint32 wpa_flags; guint32 rsn_flags; char *ssid_str; gboolean is_adhoc; gchar * sec_opts[5]; /* Currently five security options is defined */ gint sec_opts_num, i; g_return_if_fail (NM_IS_ACCESS_POINT (ap)); mode = nm_access_point_get_mode (ap); ap_flags = nm_access_point_get_flags (ap); wpa_flags = nm_access_point_get_wpa_flags (ap); rsn_flags = nm_access_point_get_rsn_flags (ap); is_adhoc = (mode == NM_802_11_MODE_ADHOC); /* Skip access point not compatible with device's capabilities */ if ( !nm_utils_security_valid (NMU_SEC_NONE, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_STATIC_WEP, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_LEAP, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_DYNAMIC_WEP, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_WPA_PSK, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_WPA2_PSK, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_WPA_ENTERPRISE, device_capas,TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags) && !nm_utils_security_valid (NMU_SEC_WPA2_ENTERPRISE, device_capas, TRUE, is_adhoc, ap_flags, wpa_flags, rsn_flags)) return; bssid = nm_access_point_get_hw_address (ap); ssid = nm_access_point_get_ssid (ap); frequency = nm_access_point_get_frequency (ap); max_bitrate = nm_access_point_get_max_bitrate (ap); signal_strength = nm_access_point_get_strength (ap); ssid_str = nm_utils_ssid_to_utf8 ((const char *) ssid->data, ssid->len); sec_opts_num = 0; if ((ap_flags & NM_802_11_AP_FLAGS_PRIVACY) && !wpa_flags && !rsn_flags) sec_opts[sec_opts_num++] = "wep"; if (!is_adhoc) { if (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) sec_opts[sec_opts_num++] = "wpa-psk"; if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) sec_opts[sec_opts_num++] = "wpa2-psk"; if (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) sec_opts[sec_opts_num++] = "wpa-eap"; if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) sec_opts[sec_opts_num++] = "wpa2-eap"; } g_print ("%-9s BSSID:%s Frequency:%dMHz", "", bssid, frequency); if (active) g_print (" <-- ACTIVE"); g_print ("\n"); g_print ("%-15s SSID:%s Mode:%s\n", "", ssid_str, wifi_mode_to_string(mode)); g_print ("%-15s Signal:%d MaxBitrate:%.1fMb/s Security:", "", signal_strength, max_bitrate/1000.0); if (sec_opts_num == 0) { g_print ("none"); } else { for (i = 0; i < sec_opts_num; i++) { g_print ("%s", sec_opts[i]); if (i != sec_opts_num - 1) g_print (" "); } } g_print ("\n"); }