diff --git a/networking.py b/networking.py index c762a7b..04bf7fd 100644 --- a/networking.py +++ b/networking.py @@ -483,7 +483,6 @@ class WirelessConnectThread(ConnectThread): self.SetStatus('generating_wpa_config') print 'Attempting to authenticate...' wiface.Authenticate(self.network) - auth_time = time.time() if self.should_die: wiface.Up() @@ -512,19 +511,9 @@ class WirelessConnectThread(ConnectThread): self.network['bssid']) if self.network.get('enctype') is not None: - # Allow some time for wpa_supplicant to associate. - # Hopefully 3 sec is enough. If it proves to be inconsistent, - # we might have to try to monitor wpa_supplicant more closely, - # so we can tell exactly when it fails/succeeds. self.SetStatus('validating_authentication') - elapsed = time.time() - auth_time - if elapsed < 3 and elapsed >= 0: - if self.debug: - print 'sleeping for ' + str(3 - elapsed) - time.sleep(3 - elapsed) - # Make sure wpa_supplicant was able to associate. - if not wiface.ValidateAuthentication(): + if not wiface.ValidateAuthentication(time.time()): self.connect_aborted('bad_pass') return diff --git a/wnettools.py b/wnettools.py index b7677f9..f8fd95b 100644 --- a/wnettools.py +++ b/wnettools.py @@ -791,7 +791,7 @@ class WirelessInterface(Interface): if self.verbose: print cmd misc.Run(cmd) - def ValidateAuthentication(self): + def ValidateAuthentication(self, auth_time): """ Validate WPA authentication. Validate that the wpa_supplicant authentication @@ -805,38 +805,45 @@ class WirelessInterface(Interface): # Right now there's no way to do this for these drivers if self.wpa_driver == RALINK_DRIVER: return True + + MAX_TIME = 5 + MAX_DISCONNECTED_TIME = 3 + while (time.time() - auth_time) < MAX_TIME: + cmd = 'wpa_cli -i ' + self.iface + ' status' + output = misc.Run(cmd) + result = misc.RunRegex(auth_pattern, output) + if self.verbose: + print 'WPA_CLI RESULT IS', result + + if not result: + return False + if result == "COMPLETED": + return True + elif result == "DISCONNECTED" and \ + (time.time() - auth_time) > MAX_DISCONNECTED_TIME: + # Force a rescan to get wpa_supplicant moving again. + self._ForceSupplicantScan() + MAX_TIME += 5 + time.sleep(1) + + print 'wpa_supplicant authentication may have failed.' + return False - cmd = 'wpa_cli -i ' + self.iface + ' status' - if self.verbose: print cmd - output = misc.Run(cmd) - result = misc.RunRegex(auth_pattern, output) - if result == "COMPLETED": - return True - elif result == "DISCONNECTED": - # Force a rescan to get wpa_supplicant moving again. - self._ForceSupplicantScan() - return self.ValidateAuthentication() - else: - print 'wpa_supplicant authentication may have failed.' - return False - pass def _ForceSupplicantScan(self): """ Force wpa_supplicant to rescan available networks. - This function forces wpa_supplicant to rescan, then sleeps - to allow the scan to finish and reassociation to take place. + This function forces wpa_supplicant to rescan. This works around authentication validation sometimes failing for wpa_supplicant because it remains in a DISCONNECTED state for quite a while, after which a rescan is required, and then - attempting to authenticate. + attempting to authenticate. This whole process takes a long + time, so we manually speed it up if we see it happening. """ print 'wpa_supplicant rescan forced...' cmd = 'wpa_cli -i' + self.iface + ' scan' misc.Run(cmd) - time.sleep(5) - print 'Trying to validate authentication again' def _AuthenticateRalinkLegacy(self, network): """ Authenticate with the specified wireless network.