diff --git a/ChangeLog b/ChangeLog index d710ce3be5..95d77fe43c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-09-15 Christopher Aillon + + * src/NetworkManagerAP.c: + * src/NetworkManagerAP.h: + * src/NetworkManagerDevice.c: + Set a blacklist for certain common manufacturer default ESSIDs: + APs with these ESSIDs are extremely likely to be completely + different networks: connecting to one should not make NM + auto-connect to every other AP with the same default ESSID. + 2005-09-12 Christopher Aillon * gnome/applet/wireless-applet.glade: diff --git a/src/NetworkManagerAP.c b/src/NetworkManagerAP.c index 367495edb4..43540dd0cd 100644 --- a/src/NetworkManagerAP.c +++ b/src/NetworkManagerAP.c @@ -55,6 +55,16 @@ struct NMAccessPoint GSList *user_addresses; }; +/* This is a controlled list. Want to add to it? Stop. Ask first. */ +static char* default_essid_list[] = +{ + "linksys", + "default", + "belkin54g", + "NETGEAR", + NULL +}; + /* * nm_ap_new * @@ -613,3 +623,19 @@ gboolean nm_is_enc_key_valid (const char *key, NMEncKeyType key_type) return FALSE; } + +gboolean nm_ap_has_manufacturer_default_essid (NMAccessPoint *ap) +{ + int i; + + g_return_val_if_fail (ap != NULL, FALSE); + + for (i = 0; default_essid_list[i] != NULL; i++) + { + char *essid = default_essid_list[i]; + if (strcmp (essid, ap->essid) == 0) + return TRUE; + } + + return FALSE; +} diff --git a/src/NetworkManagerAP.h b/src/NetworkManagerAP.h index 1e95d4e5e9..0ba2a8238a 100644 --- a/src/NetworkManagerAP.h +++ b/src/NetworkManagerAP.h @@ -91,4 +91,11 @@ void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list); gboolean nm_ap_is_enc_key_valid (NMAccessPoint *ap); gboolean nm_is_enc_key_valid (const char *key, NMEncKeyType key_type); +/* + * NOTE: + * This is not intended to return true for all APs with manufacturer defaults. It is intended to return true for + * only the MOST COMMON manufacturing defaults. + */ +gboolean nm_ap_has_manufacturer_default_essid (NMAccessPoint *ap); + #endif diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c index 339f6fb3db..d61378733c 100644 --- a/src/NetworkManagerDevice.c +++ b/src/NetworkManagerDevice.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "autoip.h" #include "NetworkManager.h" @@ -3511,14 +3512,40 @@ NMAccessPoint * nm_device_get_best_ap (NMDevice *dev) { const GTimeVal *curtime = nm_ap_get_timestamp (tmp_ap); - if (nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > trusted_latest_timestamp.tv_sec)) + gboolean blacklisted = nm_ap_has_manufacturer_default_essid (scan_ap); + if (blacklisted) + { + GSList *elt, *user_addrs; + const struct ether_addr *ap_addr; + char char_addr[20]; + + ap_addr = nm_ap_get_address (scan_ap); + user_addrs = nm_ap_get_user_addresses (tmp_ap); + + memset (&char_addr[0], 0, 20); + ether_ntoa_r (ap_addr, &char_addr[0]); + + for (elt = user_addrs; elt; elt = g_slist_next (elt)) + { + if (elt->data && !strcmp (elt->data, &char_addr[0])) + { + blacklisted = FALSE; + break; + } + } + + g_slist_foreach (user_addrs, (GFunc)g_free, NULL); + g_slist_free (user_addrs); + } + + if (!blacklisted && nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > trusted_latest_timestamp.tv_sec)) { trusted_latest_timestamp = *nm_ap_get_timestamp (tmp_ap); trusted_best_ap = scan_ap; /* Merge access point data (mainly to get updated WEP key) */ nm_ap_set_enc_key_source (trusted_best_ap, nm_ap_get_enc_key_source (tmp_ap), nm_ap_get_enc_type (tmp_ap)); } - else if (!nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > untrusted_latest_timestamp.tv_sec)) + else if (!blacklisted && !nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > untrusted_latest_timestamp.tv_sec)) { untrusted_latest_timestamp = *nm_ap_get_timestamp (tmp_ap); untrusted_best_ap = scan_ap;