mirror of
https://github.com/gryf/wicd.git
synced 2025-12-20 12:58:07 +01:00
Improved the authentication validation code. Instead of sleeping for an abitrary amount of time, then checking if authentication succeeded, it now repeatedly checks for a longer set amount of time. This way it is less likely to fail because it didn't wait long enough, but will usually finish faster.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
47
wnettools.py
47
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
|
||||
@@ -806,37 +806,44 @@ class WirelessInterface(Interface):
|
||||
if self.wpa_driver == RALINK_DRIVER:
|
||||
return True
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user