# Copyright (C) 2019 Philipp Hörist # Copyright (C) 2019 Pavel R. # 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 . 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()