changeset 1f50cf60b330 in /home/hg/repos/gajim-plugins
author: lovetox forenjunkie@chello.at branches: details:gajim-plugins?cmd=changeset;node=1f50cf60b330 description: Add delete fingerprint button
diffstat:
omemo/config_dialog.ui | 17 +++ omemo/fpr_dialog.ui | 2 + omemo/omemo/liteaxolotlstore.py | 12 ++ omemo/omemo/liteidentitykeystore.py | 13 +- omemo/omemo/litesessionstore.py | 39 +++---- omemo/ui.py | 198 ++++++++++++++++++++++------------- 6 files changed, 183 insertions(+), 98 deletions(-)
diffs (truncated from 474 to 300 lines):
diff -r da1eb841ff4b -r 1f50cf60b330 omemo/config_dialog.ui --- a/omemo/config_dialog.ui Sun Sep 04 00:46:47 2016 +0200 +++ b/omemo/config_dialog.ui Tue Sep 06 22:50:18 2016 +0200 @@ -24,6 +24,8 @@ <column type="gchararray"/> <!-- column-name fingerprint --> <column type="gchararray"/> + <!-- column-name deviceid --> + <column type="gint"/> </columns> </object> <object class="GtkNotebook" id="notebook1"> @@ -261,6 +263,21 @@ <property name="position">0</property> </packing> </child> + <child> + <object class="GtkButton" id="delfprbutton"> + <property name="label" translatable="yes">Delete Fingerprint</property> + <property name="width_request">200</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="delfpr_button_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> diff -r da1eb841ff4b -r 1f50cf60b330 omemo/fpr_dialog.ui --- a/omemo/fpr_dialog.ui Sun Sep 04 00:46:47 2016 +0200 +++ b/omemo/fpr_dialog.ui Tue Sep 06 22:50:18 2016 +0200 @@ -18,6 +18,8 @@ <column type="gchararray"/> <!-- column-name fingerprint --> <column type="gchararray"/> + <!-- column-name deviceid --> + <column type="gint"/> </columns> </object> <object class="GtkNotebook" id="notebook1"> diff -r da1eb841ff4b -r 1f50cf60b330 omemo/omemo/liteaxolotlstore.py --- a/omemo/omemo/liteaxolotlstore.py Sun Sep 04 00:46:47 2016 +0200 +++ b/omemo/omemo/liteaxolotlstore.py Tue Sep 06 22:50:18 2016 +0200 @@ -83,10 +83,16 @@ def saveIdentity(self, recepientId, identityKey): self.identityKeyStore.saveIdentity(recepientId, identityKey)
+ def deleteIdentity(self, recipientId, identityKey): + self.identityKeyStore.deleteIdentity(recipientId, identityKey) + def isTrustedIdentity(self, recepientId, identityKey): return self.identityKeyStore.isTrustedIdentity(recepientId, identityKey)
+ def setTrust(self, identityKey, trust): + return self.identityKeyStore.setTrust(identityKey, trust) + def getTrustedFingerprints(self, jid): return self.identityKeyStore.getTrustedFingerprints(jid)
@@ -139,6 +145,12 @@ def deleteAllSessions(self, recepientId): self.sessionStore.deleteAllSessions(recepientId)
+ def getSessionsFromJid(self, recipientId): + return self.sessionStore.getSessionsFromJid(recipientId) + + def getAllSessions(self): + return self.sessionStore.getAllSessions() + def loadSignedPreKey(self, signedPreKeyId): return self.signedPreKeyStore.loadSignedPreKey(signedPreKeyId)
diff -r da1eb841ff4b -r 1f50cf60b330 omemo/omemo/liteidentitykeystore.py --- a/omemo/omemo/liteidentitykeystore.py Sun Sep 04 00:46:47 2016 +0200 +++ b/omemo/omemo/liteidentitykeystore.py Tue Sep 06 22:50:18 2016 +0200 @@ -86,6 +86,13 @@
return result is not None
+ def deleteIdentity(self, recipientId, identityKey): + q = "DELETE FROM identities WHERE recipient_id = ? AND public_key = ?" + c = self.dbConn.cursor() + c.execute(q, (recipientId, + identityKey.getPublicKey().serialize())) + self.dbConn.commit() + def isTrustedIdentity(self, recipientId, identityKey): q = "SELECT trust FROM identities WHERE recipient_id = ? " \ "AND public_key = ?" @@ -160,8 +167,8 @@ c.execute(q, fingerprints) self.dbConn.commit()
- def setTrust(self, _id, trust): - q = "UPDATE identities SET trust = ? WHERE _id = ?" + def setTrust(self, identityKey, trust): + q = "UPDATE identities SET trust = ? WHERE public_key = ?" c = self.dbConn.cursor() - c.execute(q, (trust, _id)) + c.execute(q, (trust, identityKey.getPublicKey().serialize())) self.dbConn.commit() diff -r da1eb841ff4b -r 1f50cf60b330 omemo/omemo/litesessionstore.py --- a/omemo/omemo/litesessionstore.py Sun Sep 04 00:46:47 2016 +0200 +++ b/omemo/omemo/litesessionstore.py Tue Sep 06 22:50:18 2016 +0200 @@ -82,6 +82,23 @@ self.dbConn.cursor().execute(q, (recipientId, )) self.dbConn.commit()
+ def getAllSessions(self): + q = "SELECT _id, recipient_id, device_id, record, active from sessions" + c = self.dbConn.cursor() + result = [] + for row in c.execute(q): + result.append((row[0], row[1], row[2], row[3], row[4])) + return result + + def getSessionsFromJid(self, recipientId): + q = "SELECT _id, recipient_id, device_id, record, active from sessions" \ + " WHERE recipient_id = ?" + c = self.dbConn.cursor() + result = [] + for row in c.execute(q, (recipientId,)): + result.append((row[0], row[1], row[2], row[3], row[4])) + return result + def setActiveState(self, deviceList, jid): c = self.dbConn.cursor()
@@ -96,28 +113,6 @@ 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 - def getInactiveSessionsKeys(self, recipientId): q = "SELECT record FROM sessions WHERE active = 0 AND recipient_id = ?" c = self.dbConn.cursor() diff -r da1eb841ff4b -r 1f50cf60b330 omemo/ui.py --- a/omemo/ui.py Sun Sep 04 00:46:47 2016 +0200 +++ b/omemo/ui.py Tue Sep 06 22:50:18 2016 +0200 @@ -28,6 +28,7 @@ import gtkgui_helpers from common import gajim from plugins.gui import GajimPluginConfigDialog +from axolotl.state.sessionrecord import SessionRecord # pylint: enable=import-error
log = logging.getLogger('gajim.plugin_system.omemo') @@ -260,7 +261,8 @@ self.fpr_model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_STRING, - gobject.TYPE_STRING) + gobject.TYPE_STRING, + gobject.TYPE_INT)
self.device_model = gtk.ListStore(gobject.TYPE_STRING)
@@ -290,6 +292,46 @@ def account_combobox_changed_cb(self, box, *args): self.update_context_list()
+ def delfpr_button_clicked(self, button, *args): + active = self.B.get_object('account_combobox').get_active() + account = self.account_store[active][0] + + state = self.plugin.get_omemo_state(account) + + mod, paths = self.fpr_view.get_selection().get_selected_rows() + + for path in paths: + it = mod.get_iter(path) + jid, fpr, deviceid = mod.get(it, 1, 3, 4) + fpr = fpr[31:-12] + + dlg = gtk.Dialog('Delete Fingerprint', self, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + (gtk.STOCK_YES, gtk.RESPONSE_YES, + gtk.STOCK_NO, gtk.RESPONSE_NO)) + l = gtk.Label() + l.set_markup('Do you want to delete the ' + 'fingerprint of <b>%s</b> on your account <b>%s</b>?' + '\n\n<tt>%s</tt>' % (jid, account, fpr)) + l.set_line_wrap(True) + l.set_padding(12, 12) + dlg.vbox.pack_start(l) + dlg.show_all() + + response = dlg.run() + if response == gtk.RESPONSE_YES: + record = state.store.loadSession(jid, deviceid) + identity_key = record.getSessionState().getRemoteIdentityKey() + + state.store.deleteSession(jid, deviceid) + state.store.deleteIdentity(jid, identity_key) + + dlg.destroy() + else: + dlg.destroy() + + self.update_context_list() + def trust_button_clicked_cb(self, button, *args): active = self.B.get_object('account_combobox').get_active() account = self.account_store[active][0] @@ -300,7 +342,7 @@
for path in paths: it = mod.get_iter(path) - _id, user, fpr = mod.get(it, 0, 1, 3) + jid, fpr, deviceid = mod.get(it, 1, 3, 4) fpr = fpr[31:-12] dlg = gtk.Dialog('Trust / Revoke Fingerprint', self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, @@ -309,28 +351,35 @@ l = gtk.Label() l.set_markup('Do you want to trust the ' 'fingerprint of <b>%s</b> on your account <b>%s</b>?' - '\n\n<tt>%s</tt>' % (user, account, fpr)) + '\n\n<tt>%s</tt>' % (jid, account, fpr)) l.set_line_wrap(True) l.set_padding(12, 12) dlg.vbox.pack_start(l) dlg.show_all()
response = dlg.run() + + record = state.store.loadSession(jid, deviceid) + identity_key = record.getSessionState().getRemoteIdentityKey() + if response == gtk.RESPONSE_YES: - state.store.identityKeyStore.setTrust(_id, TRUSTED) + state.store.setTrust(identity_key, TRUSTED) try: if self.plugin.ui_list[account]: - self.plugin.ui_list[account][user].refresh_auth_lock_icon() + self.plugin.ui_list[account][jid]. \ + refresh_auth_lock_icon() except: - dlg.destroy() + log.debug('UI not available') else: if response == gtk.RESPONSE_NO: - state.store.identityKeyStore.setTrust(_id, UNTRUSTED) + state.store.setTrust(identity_key, UNTRUSTED) try: - if user in self.plugin.ui_list[account]: - self.plugin.ui_list[account][user].refresh_auth_lock_icon() + if jid in self.plugin.ui_list[account]: + self.plugin.ui_list[account][jid]. \ + refresh_auth_lock_icon() except: - dlg.destroy() + log.debug('UI not available') + dlg.destroy()
self.update_context_list()
@@ -391,35 +440,33 @@ self.B.get_object('fingerprint_label').set_markup('<tt>%s</tt>' % ownfpr)
- fprDB = state.store.identityKeyStore.getAllFingerprints() - activeSessions = state.store.sessionStore. \ - getAllActiveSessionsKeys() - for item in fprDB: - _id, jid, fpr, tr = item - active = fpr in activeSessions - fpr = binascii.hexlify(fpr) + trust_str = {0: 'False', 1: 'True', 2: 'Undecided'} + session_db = state.store.getAllSessions() + + for item in session_db: