# HG changeset patch # User Goffi # Date 1357517397 -3600 # Node ID 6f913f5adca8ac807552a399e2b99f9aa3298373 # Parent 6947450a477be10a1dd8fd60fe0986bcc466993b server side: registration refactoring first draft; main registration code is moved to SàT backend diff -r 6947450a477b -r 6f913f5adca8 libervia.tac --- a/libervia.tac Mon Jan 07 01:04:35 2013 +0100 +++ b/libervia.tac Mon Jan 07 01:09:57 2013 +0100 @@ -19,14 +19,6 @@ along with this program. If not, see . """ -#You need do adapt the following consts to your server -_REG_EMAIL_FROM = "NOREPLY@libervia.org" -_REG_EMAIL_SERVER = "localhost" -_REG_ADMIN_EMAIL = "goffi@goffi.org" -_NEW_ACCOUNT_SERVER = "localhost" -_NEW_ACCOUNT_DOMAIN = "tazar.int" -_NEW_ACCOUNT_RESOURCE = "libervia" - from twisted.application import internet, service from twisted.internet import glib2reactor glib2reactor.install() @@ -388,6 +380,7 @@ - ALREADY WAITING: a request has already be made for this profile - server.NOT_DONE_YET: the profile is being processed, the return value will be given by self._logged or self._logginError """ + try: if request.args['submit_type'][0] == 'login': _login = request.args['login'][0] @@ -396,7 +389,7 @@ _pass = request.args['login_password'][0] elif request.args['submit_type'][0] == 'register': - return self._registerNewAccount(request.args) + return self._registerNewAccount(request) else: raise Exception('Unknown submit type') @@ -449,84 +442,47 @@ self.sat_host.bridge.asyncConnect(profile, lambda: d.callback(None), d.errback) d.addCallback(_connected) - def _registerNewAccount(self, args): + def _registerNewAccount(self, request): """Create a new account, or return error - @param args: dict of args as given by the form + @param request: initial login request @return: "REGISTRATION" in case of success""" #TODO: must be moved in SàT core + try: - profile = login = args['register_login'][0] - password = args['register_password'][0] #FIXME: password is ignored so far - email = args['email'][0] + profile = login = request.args['register_login'][0] + password = request.args['register_password'][0] #FIXME: password is ignored so far + email = request.args['email'][0] except KeyError: return "BAD REQUEST" if not re.match(r'^[a-z0-9_-]+$', login, re.IGNORECASE) or \ not re.match(r'^.+@.+\..+', email, re.IGNORECASE): return "BAD REQUEST" - #_charset = [chr(i) for i in range(0x21,0x7F)] #XXX: this charset seems to have some issues with openfire - _charset = [chr(i) for i in range(0x30,0x3A) + range(0x41,0x5B) + range (0x61,0x7B)] - import random - random.seed() - password = ''.join([random.choice(_charset) for i in range(15)]) - if login in self.sat_host.bridge.getProfilesList(): #FIXME: must use a deferred + create a new profile check method - return "ALREADY EXISTS" - - #we now create the profile - self.sat_host.bridge.createProfile(login) - #FIXME: values must be in a config file instead of hardcoded - self.sat_host.bridge.setParam("JabberID", "%s@%s/%s" % (login, _NEW_ACCOUNT_DOMAIN, _NEW_ACCOUNT_RESOURCE), "Connection", profile) - self.sat_host.bridge.setParam("Server", _NEW_ACCOUNT_SERVER, "Connection", profile) - self.sat_host.bridge.setParam("Password", password, "Connection", profile) - #and the account - action_id = self.sat_host.bridge.registerNewAccount(login, password, email, _NEW_ACCOUNT_DOMAIN, 5222) - self.sat_host.action_handler.waitForId(self._postAccountCreation, action_id, profile) - - #time to send the email - - _email_host = _REG_EMAIL_SERVER - _email_from = _REG_EMAIL_FROM - - def email_ok(ignore): - print ("Account creation email sent to %s" % email) - - def email_ko(ignore): - #TODO: return error code to user - error ("Failed to send email to %s" % email) - - body = (u"""Welcome to Libervia, a Salut à Toi project part - -/!\\ WARNING, THIS IS ONLY A TECHNICAL DEMO, DON'T USE THIS ACCOUNT FOR ANY SERIOUS PURPOSE /!\\ - -Here are your connection informations: -login: %(login)s -password: %(password)s - -Your Jabber ID (JID) is: %(jid)s - -Any feedback welcome - -Cheers -Goffi""" % { 'login': login, 'password': password, 'jid':"%s@%s" % (login, _NEW_ACCOUNT_DOMAIN) }).encode('utf-8') - msg = MIMEText(body, 'plain', 'UTF-8') - msg['Subject'] = 'Libervia account created' - msg['From'] = _email_from - msg['To'] = email - - d = sendmail(_email_host, _email_from, email, msg.as_string()) - d.addCallbacks(email_ok, email_ko) - - #email to the administrator - - body = (u"""New account created: %(login)s [%(email)s]""" % { 'login': login, 'email': email }).encode('utf-8') - msg = MIMEText(body, 'plain', 'UTF-8') - msg['Subject'] = 'Libervia new account created' - msg['From'] = _email_from - msg['To'] = _REG_ADMIN_EMAIL - - d = sendmail(_email_host, _email_from, _REG_ADMIN_EMAIL, msg.as_string()) - d.addCallbacks(email_ok, email_ko) - return "REGISTRATION" + def registered(result): + request.write('REGISTRATION') + request.finish() + #import pudb + #pudb.set_trace() + + def registeringError(failure): + reason = str(failure.value) + if reason == "CONFLICT": + request.write('ALREADY EXISTS') + elif reason == "INTERNAL": + request.write('INTERNAL') + else: + #import pdb + #pdb.set_trace() + + error('Unknown registering error: %s' % (reason,)) + request.write('Unknown error (%s)' % reason) + request.finish() + + d = defer.Deferred() + self.sat_host.bridge.registerSatAccount(email, password, profile, lambda: d.callback(None), d.errback) + d.addCallback(registered) + d.addErrback(registeringError) + return server.NOT_DONE_YET def __cleanWaiting(self, login): """Remove login from waiting queue"""