changeset 14142266761a in /home/hg/repos/gajim-plugins
author: lovetox <[email protected]>
branches:
details:gajim-plugins?cmd=changeset;node=14142266761a
description: Handle session states (inactive/active) (#68)
* Add DB migration to insert 'active' column
Inserts 'active' column into the sessions table with
a Default value of 1
* Set active/inactiv state of sessions
Every device that we receive via devicelist event will be set
to 'active', every device in our DB that is not in the received
devicelist event will be set to 'inactive'
* Show inactive session fingerprints in grey color
diffstat:
omemo/__init__.py | 4 ++
omemo/omemo/encryption.py | 12 +++++++
omemo/omemo/liteaxolotlstore.py | 4 +-
omemo/omemo/litesessionstore.py | 50 ++++++++++++++++++++++++++++----
omemo/omemo/state.py | 2 +-
omemo/ui.py | 62 ++++++++++++++++++++++++++++++++--------
6 files changed, 111 insertions(+), 23 deletions(-)
diffs (231 lines):
diff -r 0fb67b8ce95d -r 14142266761a omemo/__init__.py
--- a/omemo/__init__.py Thu Jun 30 17:56:42 2016 +0200
+++ b/omemo/__init__.py Sat Jul 16 09:06:16 2016 +0200
@@ -265,6 +265,7 @@
log.info(account_name + ' => Received own device list:' + str(
devices_list))
state.set_own_devices(devices_list)
+ state.store.sessionStore.setActiveState(devices_list, my_jid)
if not state.own_device_id_published() or anydup(
state.own_devices):
@@ -278,6 +279,7 @@
log.info(account_name + ' => Received device list for ' +
contact_jid + ':' + str(devices_list))
state.set_devices(contact_jid, devices_list)
+ state.store.sessionStore.setActiveState(devices_list, contact_jid)
if (account_name in self.ui_list and
contact_jid not in self.ui_list[account_name]):
@@ -517,6 +519,8 @@
contact_jid = stanza.getAttr('from')
if contact_jid == my_jid:
state.set_own_devices(devices_list)
+ state.store.sessionStore.setActiveState(devices_list, my_jid)
+
if not state.own_device_id_published() or anydup(
state.own_devices):
# Our own device_id is not in the list, it could be
diff -r 0fb67b8ce95d -r 14142266761a omemo/omemo/encryption.py
--- a/omemo/omemo/encryption.py Thu Jun 30 17:56:42 2016 +0200
+++ b/omemo/omemo/encryption.py Sat Jul 16 09:06:16 2016 +0200
@@ -121,4 +121,16 @@
END TRANSACTION;
""" % (add_index))
+ if user_version(dbConn) < 4:
+ # Adds column "active" to the sessions table
+ add_active = """ ALTER TABLE sessions
+ ADD COLUMN active INTEGER DEFAULT 1;
+ """
+
+ dbConn.executescript(""" BEGIN TRANSACTION;
+ %s
+ PRAGMA user_version=4;
+ END TRANSACTION;
+ """ % (add_active))
+
return dbConn
diff -r 0fb67b8ce95d -r 14142266761a omemo/omemo/liteaxolotlstore.py
--- a/omemo/omemo/liteaxolotlstore.py Thu Jun 30 17:56:42 2016 +0200
+++ b/omemo/omemo/liteaxolotlstore.py Sat Jul 16 09:06:16 2016 +0200
@@ -94,8 +94,8 @@
def loadSession(self, recepientId, deviceId):
return self.sessionStore.loadSession(recepientId, deviceId)
- def getDeviceTuples(self):
- return self.sessionStore.getDeviceTuples()
+ def getActiveDeviceTuples(self):
+ return self.sessionStore.getActiveDeviceTuples()
def getSubDeviceSessions(self, recepientId):
# TODO Reuse this
diff -r 0fb67b8ce95d -r 14142266761a omemo/omemo/litesessionstore.py
--- a/omemo/omemo/litesessionstore.py Thu Jun 30 17:56:42 2016 +0200
+++ b/omemo/omemo/litesessionstore.py Sat Jul 16 09:06:16 2016 +0200
@@ -53,13 +53,13 @@
deviceIds = [r[0] for r in result]
return deviceIds
- def getDeviceTuples(self):
- q = "SELECT recipient_id, device_id from sessions"
- c = self.dbConn.cursor()
- result = []
- for row in c.execute(q):
- result.append((row[0],row[1]))
- return result
+ def getActiveDeviceTuples(self):
+ q = "SELECT recipient_id, device_id FROM sessions WHERE active = 1"
+ c = self.dbConn.cursor()
+ result = []
+ for row in c.execute(q):
+ result.append((row[0], row[1]))
+ return result
def storeSession(self, recipientId, deviceId, sessionRecord):
self.deleteSession(recipientId, deviceId)
@@ -86,3 +86,39 @@
q = "DELETE FROM sessions WHERE recipient_id = ?"
self.dbConn.cursor().execute(q, (recipientId, ))
self.dbConn.commit()
+
+ def setActiveState(self, deviceList, jid):
+ c = self.dbConn.cursor()
+
+ q = "UPDATE sessions SET active = {} " \
+ "WHERE recipient_id = '{}' AND device_id IN ({})" \
+ .format(1, jid, ', '.join(['?'] * len(deviceList)))
+ c.execute(q, deviceList)
+
+ q = "UPDATE sessions SET active = {} " \
+ "WHERE recipient_id = '{}' AND device_id NOT IN ({})" \
+ .format(0, jid, ', '.join(['?'] * len(deviceList)))
+ c.execute(q, deviceList)
+ self.dbConn.commit()
+
+ def getActiveSessionsKeys(self, recipientId):
+ q = "SELECT record FROM sessions WHERE active = 1 AND recipient_id = ?"
+ c = self.dbConn.cursor()
+ result = []
+ for row in c.execute(q, (recipientId,)):
+ public_key = (SessionRecord(serialized=row[0]).
+ getSessionState().getRemoteIdentityKey().
+ getPublicKey())
+ result.append(public_key.serialize())
+ return result
+
+ def getAllActiveSessionsKeys(self):
+ q = "SELECT record FROM sessions WHERE active = 1"
+ c = self.dbConn.cursor()
+ result = []
+ for row in c.execute(q):
+ public_key = (SessionRecord(serialized=row[0]).
+ getSessionState().getRemoteIdentityKey().
+ getPublicKey())
+ result.append(public_key.serialize())
+ return result
diff -r 0fb67b8ce95d -r 14142266761a omemo/omemo/state.py
--- a/omemo/omemo/state.py Thu Jun 30 17:56:42 2016 +0200
+++ b/omemo/omemo/state.py Sat Jul 16 09:06:16 2016 +0200
@@ -59,7 +59,7 @@
self.own_devices = []
self.store = LiteAxolotlStore(connection)
self.encryption = self.store.encryptionStore
- for jid, device_id in self.store.getDeviceTuples():
+ for jid, device_id in self.store.getActiveDeviceTuples():
if jid != own_jid:
self.add_device(jid, device_id)
else:
diff -r 0fb67b8ce95d -r 14142266761a omemo/ui.py
--- a/omemo/ui.py Thu Jun 30 17:56:42 2016 +0200
+++ b/omemo/ui.py Sat Jul 16 09:06:16 2016 +0200
@@ -284,19 +284,37 @@
% ownfpr)
fprDB = state.store.identityKeyStore.getAllFingerprints()
+ activeSessions = state.store.sessionStore. \
+ getAllActiveSessionsKeys()
for item in fprDB:
_id, jid, fpr, tr = item
+ if fpr in activeSessions:
+ active = True
+ else:
+ active = False
fpr = binascii.hexlify(fpr)
fpr = self.human_hash(fpr[2:])
if tr == UNTRUSTED:
- self.fpr_model.append((_id, jid, 'False',
- '<tt><span
foreground="#FF0040">%s</span></tt>' % fpr))
+ if active:
+ self.fpr_model.append((_id, jid, 'False',
+ '<tt><span
foreground="#FF0040">%s</span></tt>' % fpr))
+ else:
+ self.fpr_model.append((_id, jid, 'False',
+ '<tt><span
foreground="#585858">%s</span></tt>' % fpr))
elif tr == TRUSTED:
- self.fpr_model.append((_id, jid, 'True',
- '<tt><span
foreground="#2EFE2E">%s</span></tt>' % fpr))
+ if active:
+ self.fpr_model.append((_id, jid, 'True',
+ '<tt><span
foreground="#2EFE2E">%s</span></tt>' % fpr))
+ else:
+ self.fpr_model.append((_id, jid, 'True',
+ '<tt><span
foreground="#585858">%s</span></tt>' % fpr))
else:
- self.fpr_model.append((_id, jid, 'Undecided',
- '<tt><span
foreground="#FF8000">%s</span></tt>' % fpr))
+ if active:
+ self.fpr_model.append((_id, jid, 'Undecided',
+ '<tt><span
foreground="#FF8000">%s</span></tt>' % fpr))
+ else:
+ self.fpr_model.append((_id, jid, 'Undecided',
+ '<tt><span
foreground="#585858">%s</span></tt>' % fpr))
for item in state.own_devices:
self.device_model.append([item])
@@ -419,20 +437,38 @@
% ownfpr)
fprDB = state.store.identityKeyStore.getFingerprints(self.contact.jid)
+ activeSessions = state.store.sessionStore. \
+ getActiveSessionsKeys(self.contact.jid)
+
for item in fprDB:
_id, jid, fpr, tr = item
+ if fpr in activeSessions:
+ active = True
+ else:
+ active = False
fpr = binascii.hexlify(fpr)
fpr = self.human_hash(fpr[2:])
if tr == UNTRUSTED:
- self.fpr_model.append((_id, jid, 'False',
- '<tt><span
foreground="#FF0040">%s</span></tt>' % fpr))
+ if active:
+ self.fpr_model.append((_id, jid, 'False',
+ '<tt><span
foreground="#FF0040">%s</span></tt>' % fpr))
+ else:
+ self.fpr_model.append((_id, jid, 'False',
+ '<tt><span
foreground="#585858">%s</span></tt>' % fpr))
elif tr == TRUSTED:
- self.fpr_model.append((_id, jid, 'True',
- '<tt><span
foreground="#2EFE2E">%s</span></tt>' % fpr))
+ if active:
+ self.fpr_model.append((_id, jid, 'True',
+ '<tt><span
foreground="#2EFE2E">%s</span></tt>' % fpr))
+ else:
+ self.fpr_model.append((_id, jid, 'True',
+ '<tt><span
foreground="#585858">%s</span></tt>' % fpr))
else:
- self.fpr_model.append((_id, jid, 'Undecided',
- '<tt><span
foreground="#FF8000">%s</span></tt>' % fpr))
-
+ if active:
+ self.fpr_model.append((_id, jid, 'Undecided',
+ '<tt><span
foreground="#FF8000">%s</span></tt>' % fpr))
+ else:
+ self.fpr_model.append((_id, jid, 'Undecided',
+ '<tt><span
foreground="#585858">%s</span></tt>' % fpr))
def human_hash(self, fpr):
fpr = fpr.upper()
_______________________________________________
Commits mailing list
[email protected]
https://lists.gajim.org/cgi-bin/listinfo/commits