diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/leap/base/auth.py | 87 | ||||
-rwxr-xr-x | src/leap/gui/firstrunwizard.py | 206 |
2 files changed, 164 insertions, 129 deletions
diff --git a/src/leap/base/auth.py b/src/leap/base/auth.py new file mode 100644 index 00000000..c34ad39b --- /dev/null +++ b/src/leap/base/auth.py @@ -0,0 +1,87 @@ +import binascii +import logging + +import requests +import srp + +from leap.base import constants as baseconstants + +logger = logging.getLogger(__name__) + +SIGNUP_TIMEOUT = getattr(baseconstants, 'SIGNUP_TIMEOUT', 5) + + +class LeapSRPRegister(object): + + def __init__(self, + schema="https", + provider=None, + port=None, + register_path="1/users.json", + method="POST", + fetcher=requests, + srp=srp, + hashfun=srp.SHA256, + ng_constant=srp.NG_1024): + + self.schema = schema + self.provider = provider + self.port = port + self.register_path = register_path + self.method = method + self.fetcher = fetcher + self.srp = srp + self.HASHFUN = hashfun + self.NG = ng_constant + + self.init_session() + + def init_session(self): + self.session = self.fetcher.session() + + def get_registration_uri(self): + # XXX assert is https! + # use urlparse + if self.port: + uri = "%s://%s:%s/%s" % ( + self.schema, + self.provider, + self.port, + self.register_path) + else: + uri = "%s://%s/%s" % ( + self.schema, + self.provider, + self.register_path) + + return uri + + def register_user(self, username, password, keep=False): + """ + @rtype: tuple + @rparam: (ok, request) + """ + salt, vkey = self.srp.create_salted_verification_key( + username, + password, + self.HASHFUN, + self.NG) + + user_data = { + 'user[login]': username, + 'user[password_verifier]': binascii.hexlify(vkey), + 'user[password_salt]': binascii.hexlify(salt)} + + uri = self.get_registration_uri() + logger.debug('post to uri: %s' % uri) + + # XXX get self.method + req = self.session.post( + uri, data=user_data, + timeout=SIGNUP_TIMEOUT) + logger.debug(req) + logger.debug('user_data: %s', user_data) + #logger.debug('response: %s', req.text) + # we catch it in the form + #req.raise_for_status() + return (req.ok, req) diff --git a/src/leap/gui/firstrunwizard.py b/src/leap/gui/firstrunwizard.py index 0cf46956..bc36a35f 100755 --- a/src/leap/gui/firstrunwizard.py +++ b/src/leap/gui/firstrunwizard.py @@ -10,6 +10,7 @@ sip.setapi('QVariant', 2) from PyQt4 import QtCore from PyQt4 import QtGui +from leap.base.auth import LeapSRPRegister from leap.crypto import leapkeyring from leap.gui import mainwindow_rc @@ -26,94 +27,6 @@ logger.setLevel(logging.DEBUG) APP_LOGO = ':/images/leap-color-small.png' -# registration ###################### -# move to base/ -import binascii - -import requests -import srp - -from leap.base import constants as baseconstants - -SIGNUP_TIMEOUT = getattr(baseconstants, 'SIGNUP_TIMEOUT', 5) - - -class LeapSRPRegister(object): - - def __init__(self, - schema="https", - provider=None, - port=None, - register_path="1/users.json", - method="POST", - fetcher=requests, - srp=srp, - hashfun=srp.SHA256, - ng_constant=srp.NG_1024): - - self.schema = schema - self.provider = provider - self.port = port - self.register_path = register_path - self.method = method - self.fetcher = fetcher - self.srp = srp - self.HASHFUN = hashfun - self.NG = ng_constant - - self.init_session() - - def init_session(self): - self.session = self.fetcher.session() - - def get_registration_uri(self): - # XXX assert is https! - # use urlparse - if self.port: - uri = "%s://%s:%s/%s" % ( - self.schema, - self.provider, - self.port, - self.register_path) - else: - uri = "%s://%s/%s" % ( - self.schema, - self.provider, - self.register_path) - - return uri - - def register_user(self, username, password, keep=False): - """ - @rtype: tuple - @rparam: (ok, request) - """ - salt, vkey = self.srp.create_salted_verification_key( - username, - password, - self.HASHFUN, - self.NG) - - user_data = { - 'user[login]': username, - 'user[password_verifier]': binascii.hexlify(vkey), - 'user[password_salt]': binascii.hexlify(salt)} - - uri = self.get_registration_uri() - logger.debug('post to uri: %s' % uri) - - # XXX get self.method - req = self.session.post( - uri, data=user_data, - timeout=SIGNUP_TIMEOUT) - logger.debug(req) - logger.debug('user_data: %s', user_data) - #logger.debug('response: %s', req.text) - # we catch it in the form - #req.raise_for_status() - return (req.ok, req) - -###################################### ErrorLabelStyleSheet = """ QLabel { color: red; @@ -125,14 +38,15 @@ class FirstRunWizard(QtGui.QWizard): def __init__( self, parent=None, providers=None, - success_cb=None, is_provider_setup=False): + success_cb=None, is_provider_setup=False, + is_previously_registered=False): super(FirstRunWizard, self).__init__( parent, QtCore.Qt.WindowStaysOnTopHint) # XXX hardcoded for tests - if not providers: - providers = ('springbok',) + #if not providers: + #providers = ('springbok',) self.providers = providers # success callback @@ -141,6 +55,10 @@ class FirstRunWizard(QtGui.QWizard): # is provider setup? self.is_provider_setup = is_provider_setup + # previously registered + # if True, jumps to LogIn page. + self.is_previously_registered = is_previously_registered + # FIXME remove kwargs, we can access # wizard as self.wizard() @@ -182,6 +100,8 @@ class FirstRunWizard(QtGui.QWizard): @type pages_dict: dict """ for name, (page, page_args) in pages_dict.items(): + # XXX check for is_previously registered + # and skip adding the signup branch if so self.addPage(page(**page_args)) self.pages_dict = pages_dict @@ -195,21 +115,6 @@ class FirstRunWizard(QtGui.QWizard): """ return self.pages_dict.keys().index(page_name) - #def get_page(self, page_name): - #""" - #returns a wizard page doing a lookup for - #the page_name in the pages dictionary - #@param page_name: the page name to lookup - #@type page_name: str - #""" - #logger.debug('getting page %s' % page_name) - #page_tuple = self.pages_dict.get(page_name, None) - #if not page_tuple: - #return None - #wizard_page, args = page_tuple - #logger.debug('wizard page %s', wizard_page) - #return wizard_page - def setWindowFlags(self, flags): logger.debug('setting window flags') QtGui.QWizard.setWindowFlags(self, flags) @@ -257,7 +162,7 @@ class FirstRunWizard(QtGui.QWizard): if cb and callable(cb): self.success_cb() - def get_provider(self): + def get_provider_by_index(self): provider = self.field('provider_index') return self.providers[provider] @@ -280,6 +185,10 @@ class IntroPage(QtGui.QWizardPage): #QtGui.QWizard.WatermarkPixmap, #QtGui.QPixmap(':/images/watermark1.png')) + self.setPixmap( + QtGui.QWizard.LogoPixmap, + QtGui.QPixmap(APP_LOGO)) + label = QtGui.QLabel( "Now we will guide you through " "some configuration that is needed before you " @@ -327,7 +236,7 @@ class SelectProviderPage(QtGui.QWizardPage): self.setTitle("Select Provider") self.setSubTitle( - "Please select which provider do you want " + "Please enter the domain of the provider you want " "to use for your connection." ) self.setPixmap( @@ -335,27 +244,47 @@ class SelectProviderPage(QtGui.QWizardPage): QtGui.QPixmap(APP_LOGO)) providerNameLabel = QtGui.QLabel("&Provider:") + providerNameEdit = QtGui.QLineEdit() + providerNameEdit.cursorPositionChanged.connect( + self.reset_validation_status) + providerNameLabel.setBuddy(providerNameEdit) + + # add regex validator + providerDomainRe = QtCore.QRegExp(r"^[a-z\d_-.]+$") + providerNameEdit.setValidator( + QtGui.QRegExpValidator(providerDomainRe, self)) + self.providerNameEdit = providerNameEdit - providercombo = QtGui.QComboBox() - if providers: - for provider in providers: - providercombo.addItem(provider) - providerNameSelect = providercombo + # Eventually we will seed a list of + # well known providers here. - providerNameLabel.setBuddy(providerNameSelect) + #providercombo = QtGui.QComboBox() + #if providers: + #for provider in providers: + #providercombo.addItem(provider) + #providerNameSelect = providercombo - self.registerField('provider_index', providerNameSelect) + self.registerField('provider_domain*', self.providerNameEdit) + #self.registerField('provider_name_index', providerNameSelect) + + validationMsg = QtGui.QLabel("") + validationMsg.setStyleSheet(ErrorLabelStyleSheet) + + self.validationMsg = validationMsg layout = QtGui.QGridLayout() - layout.addWidget(providerNameLabel, 0, 0) - layout.addWidget(providerNameSelect, 0, 1) + layout.addWidget(validationMsg, 0, 0) + layout.addWidget(providerNameLabel, 0, 1) + layout.addWidget(providerNameEdit, 0, 2) self.setLayout(layout) + def reset_validation_status(self): + """ + empty the validation msg + """ + self.validationMsg.setText('') + def validatePage(self): - # XXX just DEBUGGING ..>! - wizard = self.wizard() - if bool(wizard): - logger.debug('current: %s', wizard.currentPage()) return True def nextId(self): @@ -372,6 +301,10 @@ class ProviderInfoPage(QtGui.QWizardPage): self.setTitle("Provider Info") self.setSubTitle("Available information about chosen provider.") + self.setPixmap( + QtGui.QWizard.LogoPixmap, + QtGui.QPixmap(APP_LOGO)) + def nextId(self): wizard = self.wizard() if not wizard: @@ -386,6 +319,10 @@ class ProviderSetupPage(QtGui.QWizardPage): self.setTitle("Provider Setup") self.setSubTitle("Setting up provider.") + self.setPixmap( + QtGui.QWizard.LogoPixmap, + QtGui.QPixmap(APP_LOGO)) + def nextId(self): wizard = self.wizard() if not wizard: @@ -457,7 +394,7 @@ class UserFormMixIn(object): set validation msg to unknown error """ - self.validationMsg.setText("Error during signup") + self.validationMsg.setText("Error during sign up") class LogInPage(QtGui.QWizardPage, UserFormMixIn): @@ -467,6 +404,10 @@ class LogInPage(QtGui.QWizardPage, UserFormMixIn): self.setTitle("Log In") self.setSubTitle("Log in with your credentials.") + self.setPixmap( + QtGui.QWizard.LogoPixmap, + QtGui.QPixmap(APP_LOGO)) + userNameLabel = QtGui.QLabel("User &name:") userNameLineEdit = QtGui.QLineEdit() userNameLineEdit.cursorPositionChanged.connect( @@ -527,13 +468,8 @@ class RegisterUserPage(QtGui.QWizardPage, UserFormMixIn): self.setSigningUpStatus.connect( self.set_status_validating) - wizard = self.wizard() - provider = wizard.get_provider() if wizard else None + self.setTitle("Sign Up") - self.setTitle("User registration") - self.setSubTitle( - "Register a new user with provider %s." % - provider) self.setPixmap( QtGui.QWizard.LogoPixmap, QtGui.QPixmap(APP_LOGO)) @@ -589,6 +525,10 @@ class RegisterUserPage(QtGui.QWizardPage, UserFormMixIn): """ inits wizard page """ + provider = self.field('provider_domain') + self.setSubTitle( + "Register a new user with provider %s." % + provider) self.validationMsg.setText('') def validatePage(self): @@ -679,6 +619,10 @@ class ConnectingPage(QtGui.QWizardPage): self.setTitle("Connecting") self.setSubTitle('Connecting to provider.') + self.setPixmap( + QtGui.QWizard.LogoPixmap, + QtGui.QPixmap(APP_LOGO)) + class LastPage(QtGui.QWizardPage): def __init__(self, parent=None): @@ -686,6 +630,10 @@ class LastPage(QtGui.QWizardPage): self.setTitle("Ready to go!") + self.setPixmap( + QtGui.QWizard.LogoPixmap, + QtGui.QPixmap(APP_LOGO)) + #self.setPixmap( #QtGui.QWizard.WatermarkPixmap, #QtGui.QPixmap(':/images/watermark2.png')) @@ -715,6 +663,6 @@ if __name__ == '__main__': logger.setLevel(logging.DEBUG) app = QtGui.QApplication(sys.argv) - wizard = FirstRunWizard() + wizard = FirstRunWizard(providers=('springbok',)) wizard.show() sys.exit(app.exec_()) |