Mercurial > libervia-backend
diff src/plugins/plugin_misc_register_account.py @ 1037:6e975c6b0faf
core, memory, bridge, plugin misc_register_account: move registerNewAccount to a new plugin:
- the bridge method has been removed, now a plugin takes care of it with XMLUI callback system
- TODO: xmpp.RegisteringAuthenticator still needs to be fixed
author | souliane <souliane@mailoo.org> |
---|---|
date | Fri, 16 May 2014 00:58:20 +0200 |
parents | |
children | 85c110c0be86 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plugins/plugin_misc_register_account.py Fri May 16 00:58:20 2014 +0200 @@ -0,0 +1,121 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# SàT plugin for registering a new XMPP account +# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org) +# Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from sat.core.i18n import _, D_ +from sat.core.log import getLogger +log = getLogger(__name__) +from sat.core.constants import Const as C +from twisted.words.protocols.jabber import jid, xmlstream +from sat.core import xmpp +from sat.memory.memory import Sessions +from twisted.internet import reactor, defer +from sat.tools import xml_tools +from sat.tools.xml_tools import SAT_FORM_PREFIX, SAT_PARAM_SEPARATOR + + +PLUGIN_INFO = { + "name": "Register Account Plugin", + "import_name": "REGISTER-ACCOUNT", + "type": "MISC", + "protocols": [], + "dependencies": [], + "recommendations": [], + "main": "RegisterAccount", + "handler": "no", + "description": _(u"""Register XMPP account""") +} + + +class RegisterAccount(object): + + def __init__(self, host): + log.info(_(u"Plugin Register Account initialization")) + self.host = host + self._sessions = Sessions() + host.registerCallback(self.registerNewAccountCB, with_data=True, force_id="registerNewAccount") + self.__register_account_id = host.registerCallback(self._registerConfirmation, with_data=True) + + def registerNewAccountCB(self, data, profile): + """Called when the use click on the "New account" button.""" + session_data = {} + for param in ('JabberID', 'Password', 'Port', 'Server'): + try: + session_data[param] = data["%s%s%s%s" % (SAT_FORM_PREFIX, "Connection", SAT_PARAM_SEPARATOR, param)] + except KeyError: + if param == 'Port': + session_data[param] = 5222 + + for param in ('JabberID', 'Password', 'Server'): + if not session_data[param]: + form_ui = xml_tools.XMLUI("popup", title=D_("Missing values")) + form_ui.addText(D_("No user, password or server given: can't register new account.")) + return {'xmlui': form_ui.toXml()} + + user = jid.parse(session_data['JabberID'])[0] + session_id, dummy = self._sessions.newSession(session_data, profile) + form_ui = xml_tools.XMLUI("form", title=D_("Register new account"), submit_id=self.__register_account_id, session_id=session_id) + form_ui.addText(D_("Do you want to register a new XMPP account [%(user)s] on server %(server)s ?") % {'user': user, 'server': session_data['Server']}) + return {'xmlui': form_ui.toXml()} + + def _registerConfirmation(self, data, profile): + """Save the related parameters and proceed the registration.""" + session_data = self._sessions.profileGet(data['session_id'], profile) + + self.host.memory.setParam("JabberID", session_data["JabberID"], "Connection", profile_key=profile) + self.host.memory.setParam("Password", session_data["Password"], "Connection", profile_key=profile) + self.host.memory.setParam("Server", session_data["Server"], "Connection", profile_key=profile) + self.host.memory.setParam("Port", session_data["Port"], "Connection", profile_key=profile) + + user = jid.parse(session_data['JabberID'])[0] + return self._registerNewAccount(user, session_data["Password"], None, session_data["Server"], profile_key=profile) + + def _registerNewAccount(self, user, password, email, host, port=5222, profile_key=C.PROF_KEY_NONE): + """Connect to a server and create a new account using in-band registration. + @param user: login of the account + @param password: password of the account + @param email: email of the account + @param host: host of the server to register to + @param port: port of the server to register to + @param profile_key: %(doc_profile_key)s + """ + profile = self.host.memory.getProfileName(profile_key) + + d = defer.Deferred() + serverRegistrer = xmlstream.XmlStreamFactory(xmpp.RegisteringAuthenticator(self, host, user, password, email, d, profile)) + connector = reactor.connectTCP(host, port, serverRegistrer) + serverRegistrer.clientConnectionLost = lambda conn, reason: connector.disconnect() + + def cb(dummy): + xmlui = xml_tools.XMLUI("popup", title=D_("Confirmation")) + xmlui.addText(D_("Registration successful.")) + return ({'xmlui': xmlui.toXml()}) + + def eb(failure): + xmlui = xml_tools.XMLUI("popup", title=D_("Failure")) + xmlui.addText(D_("Registration failed: %s") % failure.getErrorMessage()) + try: + if failure.value.condition == 'conflict': + xmlui.addText(D_("Username already exists, please choose an other one.")) + except AttributeError: + pass + return ({'xmlui': xmlui.toXml()}) + + d.addCallbacks(cb, eb) + return d