# HG changeset patch # User souliane # Date 1395674474 -3600 # Node ID 34dd9287dfe58a2faea459569aede9cb29a07788 # Parent 955e5c781a405f088fd084b0b1dfdc680c6ac060 plugin account: bug fix profile deletion from the database + unsubscribe the contacts diff -r 955e5c781a40 -r 34dd9287dfe5 src/core/xmpp.py --- 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) diff -r 955e5c781a40 -r 34dd9287dfe5 src/memory/sqlite.py --- 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 diff -r 955e5c781a40 -r 34dd9287dfe5 src/plugins/plugin_misc_account.py --- 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({})