summaryrefslogtreecommitdiff
path: root/client/src/leap/soledad
diff options
context:
space:
mode:
authordrebs <drebs@leap.se>2013-11-07 20:37:10 -0200
committerdrebs <drebs@leap.se>2013-11-07 20:37:10 -0200
commitb79d7f0ef6bc8bb52a6f73d97b64c383e895ebc7 (patch)
tree65e9cbf348f83f00549d49de390e1a61f74d28e7 /client/src/leap/soledad
parent1c70ba143c5360ec46c09f323dd7831ecea4b862 (diff)
parent4b800e2035da2bcd643274f314d62e650d39edc5 (diff)
Merge remote-tracking branch 'kalikaneko/bug/open-db-in-autocommit-mode' into develop
Diffstat (limited to 'client/src/leap/soledad')
-rw-r--r--client/src/leap/soledad/client/sqlcipher.py12
1 files changed, 12 insertions, 0 deletions
diff --git a/client/src/leap/soledad/client/sqlcipher.py b/client/src/leap/soledad/client/sqlcipher.py
index 3e01a4fb..894c6f97 100644
--- a/client/src/leap/soledad/client/sqlcipher.py
+++ b/client/src/leap/soledad/client/sqlcipher.py
@@ -70,6 +70,14 @@ sqlite_backend.dbapi2 = dbapi2
SQLITE_CHECK_SAME_THREAD = False
+# We set isolation_level to None to setup autocommit mode.
+# See: http://docs.python.org/2/library/sqlite3.html#controlling-transactions
+# This avoids problems with sequential operations using the same soledad object
+# trying to open new transactions
+# (The error was:
+# OperationalError:cannot start a transaction within a transaction.)
+SQLITE_ISOLATION_LEVEL = None
+
def open(path, password, create=True, document_factory=None, crypto=None,
raw_key=False, cipher='aes-256-cbc', kdf_iter=4000,
@@ -172,6 +180,7 @@ class SQLCipherDatabase(sqlite_backend.SQLitePartialExpandDatabase):
with self.k_lock:
self._db_handle = dbapi2.connect(
sqlcipher_file,
+ isolation_level=SQLITE_ISOLATION_LEVEL,
check_same_thread=SQLITE_CHECK_SAME_THREAD)
# set SQLCipher cryptographic parameters
self._set_crypto_pragmas(
@@ -436,6 +445,7 @@ class SQLCipherDatabase(sqlite_backend.SQLitePartialExpandDatabase):
with cls.k_lock:
db_handle = dbapi2.connect(
sqlcipher_file,
+ isolation_level=SQLITE_ISOLATION_LEVEL,
check_same_thread=SQLITE_CHECK_SAME_THREAD)
cls._set_crypto_pragmas(
db_handle, key, raw_key, cipher,
@@ -645,6 +655,7 @@ class SQLCipherDatabase(sqlite_backend.SQLitePartialExpandDatabase):
passphrase that should be hashed to obtain the encyrption key.
:type raw_key: bool
"""
+ # XXX change key param!
if raw_key:
cls._pragma_rekey_raw(db_handle, key)
else:
@@ -683,6 +694,7 @@ class SQLCipherDatabase(sqlite_backend.SQLitePartialExpandDatabase):
"""
if not all(c in string.hexdigits for c in key):
raise NotAnHexString(key)
+ # XXX change passphrase param!
db_handle.cursor().execute('PRAGMA rekey = "x\'%s"' % passphrase)
def __del__(self):