changeset 934:34dd9287dfe5

plugin account: bug fix profile deletion from the database + unsubscribe the contacts
author souliane <souliane@mailoo.org>
date Mon, 24 Mar 2014 16:21:14 +0100
parents 955e5c781a40
children 5b2d2f1f05d0
files src/core/xmpp.py src/memory/sqlite.py src/plugins/plugin_misc_account.py
diffstat 3 files changed, 20 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/xmpp.py	Mon Mar 24 10:16:07 2014 +0100
+++ b/src/core/xmpp.py	Mon Mar 24 16:21:14 2014 +0100
@@ -84,7 +84,7 @@
         self.conn_deferred.callback(None)
 
     def initializationFailed(self, reason):
-        print "initializationFailed: %s" % reason
+        error(_("ERROR: XMPP connection failed for profile '%(profile)s': %(reason)s" % {'profile': self.profile, 'reason': reason}))
         self.host_app.bridge.connectionError("AUTH_ERROR", self.profile)
         try:
             client.XMPPClient.initializationFailed(self, reason)
--- a/src/memory/sqlite.py	Mon Mar 24 10:16:07 2014 +0100
+++ b/src/memory/sqlite.py	Mon Mar 24 16:21:14 2014 +0100
@@ -85,6 +85,9 @@
         self.dbpool = adbapi.ConnectionPool("sqlite3", db_filename, check_same_thread=False)
 
         # init_defer is the initialisation deferred, initialisation is ok when all its callbacks have been done
+        # XXX: foreign_keys activation doesn't seem to work, probably because of the multi-threading
+        # All the requests that need to use this feature should be run with runInteraction instead,
+        # so you can set the PRAGMA as it is done in self.deleteProfile
         init_defer = self.dbpool.runOperation("PRAGMA foreign_keys = ON").addErrback(lambda x: error(_("Can't activate foreign keys")))
 
         def getNewBaseSql():
@@ -162,8 +165,13 @@
             error(_("Can't delete profile [%s]") % name)
             return failure
 
-        del self.profiles[name]
-        d = self.dbpool.runQuery("DELETE FROM profiles WHERE name = ?", (name, ))
+        def delete(txn):
+            del self.profiles[name]
+            txn.execute("PRAGMA foreign_keys = ON")
+            txn.execute("DELETE FROM profiles WHERE name = ?", (name,))
+            return None
+
+        d = self.dbpool.runInteraction(delete)
         d.addCallback(lambda ignore: info(_("Profile [%s] deleted") % name))
         d.addErrback(deletionError)
         return d
--- a/src/plugins/plugin_misc_account.py	Mon Mar 24 10:16:07 2014 +0100
+++ b/src/plugins/plugin_misc_account.py	Mon Mar 24 16:21:14 2014 +0100
@@ -105,6 +105,7 @@
         d = defer.Deferred()
         prosody_reg = ProsodyRegisterProtocol(password, d)
         prosody_exe = join(plugin._prosody_path, plugin.getConfig('prosodyctl'))
+        # TODO delete account which are not on the same host
         reactor.spawnProcess(prosody_reg, prosody_exe, [prosody_exe, command, "%s@%s" % (profile, plugin.getConfig('new_account_domain'))], path=plugin._prosody_path)
         return d
 
@@ -318,6 +319,14 @@
         @param profile
         """
         def userDeleted(result):
+            client = self.host.profiles[profile]
+
+            for jid_ in client.roster._jids:  # empty roster
+                client.presence.unsubscribe(jid_)
+
+            for jid_ in self.host.memory.getWaitingSub(profile):  # delete waiting subscriptions
+                self.host.memory.delWaitingSub(jid_)
+
             self.host.disconnect(profile)
             self.host.memory.asyncDeleteProfile(profile, force=True)
             return defer.succeed({})