summaryrefslogtreecommitdiff
path: root/src/leap/crypto
diff options
context:
space:
mode:
authorTomás Touceda <chiiph@leap.se>2013-03-07 19:05:11 -0300
committerTomás Touceda <chiiph@leap.se>2013-03-07 19:05:11 -0300
commit751638b4eb8208e1eaa1beaaed284da6b412bca7 (patch)
tree58a517d1f22a45a581fcca3ff2766663974de3fa /src/leap/crypto
parent6d6600a495ef48e0f04cb78bedca8fb913bada2a (diff)
Change asserts for a custom leap_assert method
Also: - Make SRPAuth and the Bootstrappers be a QObject instead of a QThread so we can use them inside another more generic thread - Add a generic CheckerThread that runs checks or whatever operation as long as it returns a boolean value - Closes the whole application if the wizard is rejected at the first run - Do not fail when the config directory doesn't exist - Set the wizard pixmap logo as LEAP's logo - Improve wizard checks - Make SRPRegister play nice with the CheckerThread
Diffstat (limited to 'src/leap/crypto')
-rw-r--r--src/leap/crypto/srpauth.py108
-rw-r--r--src/leap/crypto/srpregister.py17
2 files changed, 77 insertions, 48 deletions
diff --git a/src/leap/crypto/srpauth.py b/src/leap/crypto/srpauth.py
index dbcc95cb..28e4f037 100644
--- a/src/leap/crypto/srpauth.py
+++ b/src/leap/crypto/srpauth.py
@@ -20,9 +20,11 @@ import srp
import binascii
import logging
-from PySide import QtCore
+from PySide import QtCore, QtGui
from leap.config.providerconfig import ProviderConfig
+from leap.util.check import leap_assert
+from leap.util.checkerthread import CheckerThread
logger = logging.getLogger(__name__)
@@ -34,7 +36,7 @@ class SRPAuthenticationError(Exception):
pass
-class SRPAuth(QtCore.QThread):
+class SRPAuth(QtCore.QObject):
"""
SRPAuth singleton
"""
@@ -55,7 +57,8 @@ class SRPAuth(QtCore.QThread):
@param server: Server to which we will authenticate
@type server: str
"""
- assert provider_config, "We need a provider config to authenticate"
+ leap_assert(provider_config,
+ "We need a provider config to authenticate")
self._provider_config = provider_config
@@ -277,15 +280,15 @@ class SRPAuth(QtCore.QThread):
@param password: password for this user
@type password: str
"""
- assert self.get_session_id() is None, "Already logged in"
+ leap_assert(self.get_session_id() is None, "Already logged in")
self._authentication_preprocessing(username, password)
salt, B = self._start_authentication(username, password)
M2 = self._process_challenge(salt, B, username)
self._verify_session(M2)
- assert self.get_session_id(), "Something went wrong because" + \
- " we don't have the auth cookie afterwards"
+ leap_assert(self.get_session_id(), "Something went wrong because"
+ " we don't have the auth cookie afterwards")
def logout(self):
"""
@@ -294,7 +297,8 @@ class SRPAuth(QtCore.QThread):
"""
logger.debug("Starting logout...")
- assert self.get_session_id(), "Cannot logout an unexisting session"
+ leap_assert(self.get_session_id(),
+ "Cannot logout an unexisting session")
logout_url = "%s/%s/%s/" % (self._provider_config.get_api_uri(),
self._provider_config.
@@ -344,7 +348,7 @@ class SRPAuth(QtCore.QThread):
"""
Creates a singleton instance if needed
"""
- QtCore.QThread.__init__(self)
+ QtCore.QObject.__init__(self)
# Check whether we already have an instance
if SRPAuth.__instance is None:
@@ -371,47 +375,47 @@ class SRPAuth(QtCore.QThread):
@type password: str
"""
- with QtCore.QMutexLocker(self._should_login_lock):
- self._should_login = self.DO_LOGIN
- self._username = username
- self._password = password
- # Detach the start call to Qt's event loop
- QtCore.QTimer.singleShot(0, self.start)
-
- def logout(self):
- """
- Logs out the current session.
- Expects a session_id to exists, might raise AssertionError
- """
- QtCore.QMutexLocker(self._should_login_lock)
- self._should_login = self.DO_LOGOUT
- # Detach the start call to Qt's event loop
- QtCore.QTimer.singleShot(0, self.start)
-
- def _runLogin(self, username, password):
try:
self.__instance.authenticate(username, password)
+
+ logger.debug("Successful login!")
self.authentication_finished.emit(True, "Succeeded")
+ return True
except Exception as e:
+ logger.error("Error logging in %s" % (e,))
self.authentication_finished.emit(False, "%s" % (e,))
+ return False
- def _runLogout(self):
+ def logout(self):
+ """
+ Logs out the current session.
+ Expects a session_id to exists, might raise AssertionError
+ """
try:
self.__instance.logout()
self.logout_finished.emit(True, "Succeeded")
+ return True
except Exception as e:
self.logout_finished.emit(False, "%s" % (e,))
-
- def run(self):
- QtCore.QMutexLocker(self._should_login_lock)
- if self._should_login == self.DO_LOGIN:
- self._runLogin(self._username, self._password)
- elif self._should_login == self.DO_LOGOUT:
- self._runLogout()
- self._should_login = self.DO_NOTHING
+ return False
if __name__ == "__main__":
+ import sys
+ from functools import partial
+ app = QtGui.QApplication(sys.argv)
+
+ import signal
+
+ def sigint_handler(*args, **kwargs):
+ logger.debug('SIGINT catched. shutting down...')
+ checker = args[0]
+ checker.set_should_quit()
+ QtGui.QApplication.quit()
+
+ def signal_tester(d):
+ print d
+
logger = logging.getLogger(name='leap')
logger.setLevel(logging.DEBUG)
console = logging.StreamHandler()
@@ -422,8 +426,23 @@ if __name__ == "__main__":
console.setFormatter(formatter)
logger.addHandler(console)
- provider = ProviderConfig()
+ checker = CheckerThread()
+
+ sigint = partial(sigint_handler, checker)
+ signal.signal(signal.SIGINT, sigint)
+ timer = QtCore.QTimer()
+ timer.start(500)
+ timer.timeout.connect(lambda: None)
+ app.connect(app, QtCore.SIGNAL("aboutToQuit()"),
+ checker.set_should_quit)
+ w = QtGui.QWidget()
+ w.resize(100, 100)
+ w.show()
+
+ checker.start()
+
+ provider = ProviderConfig()
if provider.load("leap/providers/bitmask.net/provider.json"):
# url = "%s/tickets" % (provider.get_api_uri(),)
# print url
@@ -431,9 +450,14 @@ if __name__ == "__main__":
# print res.content
# res.raise_for_status()
auth = SRPAuth(provider)
- auth.start()
- auth.authenticate("test2", "sarasaaaa")
- res = requests.session().get("%s/cert" % (provider.get_api_uri(),),
- verify=provider.get_ca_cert_path())
- print res.content
- auth.logout()
+ auth_instantiated = partial(auth.authenticate, "test2", "sarasaaaa")
+
+ checker.add_checks([auth_instantiated, auth.logout])
+
+ #auth.authenticate("test2", "sarasaaaa")
+ #res = requests.session().get("%s/cert" % (provider.get_api_uri(),),
+ #verify=provider.get_ca_cert_path())
+ #print res.content
+ #auth.logout()
+
+ sys.exit(app.exec_())
diff --git a/src/leap/crypto/srpregister.py b/src/leap/crypto/srpregister.py
index d9b2b22b..cf673e35 100644
--- a/src/leap/crypto/srpregister.py
+++ b/src/leap/crypto/srpregister.py
@@ -20,15 +20,17 @@ import binascii
import srp
import logging
+from PySide import QtCore
from urlparse import urlparse
from leap.config.providerconfig import ProviderConfig
from leap.crypto.constants import SIGNUP_TIMEOUT
+from leap.util.check import leap_assert, leap_assert_type
logger = logging.getLogger(__name__)
-class SRPRegister(object):
+class SRPRegister(QtCore.QObject):
"""
Registers a user to a specific provider using SRP
"""
@@ -37,6 +39,8 @@ class SRPRegister(object):
USER_VERIFIER_KEY = 'user[password_verifier]'
USER_SALT_KEY = 'user[password_salt]'
+ registration_finished = QtCore.Signal(bool, object)
+
def __init__(self,
provider_config=None,
register_path="users"):
@@ -49,10 +53,9 @@ class SRPRegister(object):
@param register_path: webapp path for registering users
@type register_path; str
"""
-
- assert provider_config, "Please provider a provider"
- assert isinstance(provider_config, ProviderConfig), \
- "We need a ProviderConfig instead of %r" % (provider_config,)
+ QtCore.QObject.__init__(self)
+ leap_assert(provider_config, "Please provider a provider")
+ leap_assert_type(provider_config, ProviderConfig)
self._provider_config = provider_config
@@ -131,7 +134,9 @@ class SRPRegister(object):
verify=self._provider_config.
get_ca_cert_path())
- return (req.ok, req)
+ self.registration_finished.emit(req.ok, req)
+
+ return req.ok
if __name__ == "__main__":