ec43021650
Implemented: - OTR encryption - Store OTR keys and known fingerprints to Gajim data directory in SQLite format - Handling OTR errors Todo: - Fingerprints verification - SMP protocol - Presence handling (e.g. close OTR channel when contacts goes offline)
48 lines
2.1 KiB
Python
48 lines
2.1 KiB
Python
# Copyright (C) 2019 Philipp Hörist <philipp AT hoerist.com>
|
|
# Copyright (C) 2019 Pavel R. <pd at narayana dot im>
|
|
|
|
# This file is part of Gajim OTR Plugin.
|
|
#
|
|
# Gajim OTR Plugin is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published
|
|
# by the Free Software Foundation; version 3 only.
|
|
#
|
|
# This software 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 General Public License for more details.
|
|
#
|
|
# You can always obtain full license text at <http://www.gnu.org/licenses/>.
|
|
|
|
import os
|
|
import sqlite3
|
|
from collections import namedtuple
|
|
|
|
class Keystore:
|
|
|
|
__TABLE_LAYOUT__ = '''
|
|
CREATE TABLE IF NOT EXISTS keystore (jid TEXT, privatekey TEXT, fingerprint TEXT, trust INTEGER, timestamp INTEGER, comment TEXT, UNIQUE(privatekey)); CREATE UNIQUE INDEX IF NOT EXISTS jid_fingerprint ON keystore (jid, fingerprint);
|
|
'''
|
|
|
|
def __init__(self, db):
|
|
self._db = sqlite3.connect(db, isolation_level=None)
|
|
self._db.row_factory = lambda cur,row : namedtuple("Row", [col[0] for col in cur.description])(*row)
|
|
self._db.execute("PRAGMA synchronous=FULL;")
|
|
self._db.executescript(self.__TABLE_LAYOUT__)
|
|
|
|
def load(self, item = {'fingerprint IS NOT NULL; --': None}):
|
|
sql = "SELECT * FROM keystore WHERE " + " AND ".join(["%s = '%s'" % (str(key), str(value)) for key,value in item.items()])
|
|
if next(iter(item.values())): return self._db.execute(sql).fetchone() # return fetchone() if `item` arg is set
|
|
return self._db.execute(sql).fetchall() or () # else return fetchall() or empty iterator
|
|
|
|
def save(self, item):
|
|
sql = "REPLACE INTO keystore(%s) VALUES(%s)" % (",".join(item.keys()), ",".join(["'%s'" % x for x in item.values()]) )
|
|
return self._db.execute(sql)
|
|
|
|
def forgot(self, item):
|
|
sql = "DELETE FROM keystore WHERE " + " AND ".join(["%s='%s'" % (str(key),str(value)) for key,value in item.items()])
|
|
return self._db.execute(sql)
|
|
|
|
def close(self):
|
|
self._db.close()
|