From 7ad507d24ee8c6f38d527c298311159594922658 Mon Sep 17 00:00:00 2001 From: drebs Date: Mon, 24 Dec 2012 12:24:41 -0200 Subject: Enforce need of password for SQLCipherDatabase --- src/leap/soledad/backends/sqlcipher.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index 6fd6e619..ae9ca28a 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -39,7 +39,7 @@ from u1db import ( ) -def open(path, create, document_factory=None, password=None): +def open(path, create, password, document_factory=None): """Open a database at the given location. Will raise u1db.errors.DatabaseDoesNotExist if create=False and the @@ -53,7 +53,7 @@ def open(path, create, document_factory=None, password=None): :return: An instance of Database. """ from u1db.backends import sqlite_backend - return sqlite_backend.SQLCipherDatabase.open_database( + return SQLCipherDatabase.open_database( path, password, create=create, document_factory=document_factory) @@ -68,7 +68,7 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): db_handle.cursor().execute("PRAGMA key = '%s'" % key) def __init__(self, sqlite_file, password, document_factory=None): - """Create a new sqlite file.""" + """Create a new sqlcipher file.""" self._db_handle = dbapi2.connect(sqlite_file) SQLCipherDatabase.set_pragma_key(self._db_handle, password) self._real_replica_uid = None -- cgit v1.2.3 From 3013233ec2b7e9bb2d7d6a2bccbd6e7a0342d8a5 Mon Sep 17 00:00:00 2001 From: drebs Date: Thu, 3 Jan 2013 15:23:11 -0200 Subject: u1db tests run with nose2 --- src/leap/soledad/backends/sqlcipher.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index ae9ca28a..34434cf5 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -27,8 +27,6 @@ import sys import time import uuid -import pkg_resources - from u1db.backends import CommonBackend, CommonSyncTarget from u1db.backends.sqlite_backend import SQLitePartialExpandDatabase from u1db import ( -- cgit v1.2.3 From a59b34f37fb687de77d1a94f41f53a961baad348 Mon Sep 17 00:00:00 2001 From: drebs Date: Tue, 8 Jan 2013 17:25:06 -0200 Subject: SQLCipherBackend passes all relevant u1db tests. --- src/leap/soledad/backends/sqlcipher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index 34434cf5..3b03bc95 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -37,7 +37,7 @@ from u1db import ( ) -def open(path, create, password, document_factory=None): +def open(path, password, create, document_factory=None): """Open a database at the given location. Will raise u1db.errors.DatabaseDoesNotExist if create=False and the -- cgit v1.2.3 From ac2770e4bca995ad40b6b98013c7a11e01a6b46f Mon Sep 17 00:00:00 2001 From: drebs Date: Mon, 14 Jan 2013 13:24:11 -0200 Subject: Cleanup of imports. --- src/leap/soledad/backends/sqlcipher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index 3b03bc95..53758397 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -27,7 +27,7 @@ import sys import time import uuid -from u1db.backends import CommonBackend, CommonSyncTarget +from u1db.backends import CommonBackend from u1db.backends.sqlite_backend import SQLitePartialExpandDatabase from u1db import ( Document, -- cgit v1.2.3 From 69173d511a99126fe6508d87e8a25a60d3f1f927 Mon Sep 17 00:00:00 2001 From: drebs Date: Thu, 17 Jan 2013 19:20:04 -0200 Subject: Add tests for verifying if sqlcipher db is encrypted. --- src/leap/soledad/backends/sqlcipher.py | 38 +++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index 53758397..6711aa86 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -16,25 +16,15 @@ """A U1DB implementation that uses SQLCipher as its persistence layer.""" -import errno import os -try: - import simplejson as json -except ImportError: - import json # noqa -from sqlite3 import dbapi2 -import sys +from sqlite3 import dbapi2, DatabaseError import time -import uuid -from u1db.backends import CommonBackend from u1db.backends.sqlite_backend import SQLitePartialExpandDatabase from u1db import ( Document, errors, - query_parser, - vectorclock, - ) +) def open(path, password, create, document_factory=None): @@ -50,11 +40,17 @@ def open(path, password, create, document_factory=None): parameters as Document.__init__. :return: An instance of Database. """ - from u1db.backends import sqlite_backend return SQLCipherDatabase.open_database( path, password, create=create, document_factory=document_factory) +class DatabaseIsNotEncrypted(Exception): + """ + Exception raised when trying to open non-encrypted databases. + """ + pass + + class SQLCipherDatabase(SQLitePartialExpandDatabase): """A U1DB implementation that uses SQLCipher as its persistence layer.""" @@ -67,12 +63,26 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): def __init__(self, sqlite_file, password, document_factory=None): """Create a new sqlcipher file.""" + self._check_if_db_is_encrypted(sqlite_file) self._db_handle = dbapi2.connect(sqlite_file) SQLCipherDatabase.set_pragma_key(self._db_handle, password) self._real_replica_uid = None self._ensure_schema() self._factory = document_factory or Document + def _check_if_db_is_encrypted(self, sqlite_file): + if not os.path.exists(sqlite_file): + return + else: + try: + # try to open an encrypted database with the regular u1db backend + # should raise a DatabaseError exception. + SQLitePartialExpandDatabase(sqlite_file) + raise DatabaseIsNotEncrypted() + except DatabaseError: + pass + + @classmethod def _open_database(cls, sqlite_file, password, document_factory=None): if not os.path.isfile(sqlite_file): @@ -122,4 +132,4 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): SQLCipherDatabase._sqlite_registry[klass._index_storage_value] = klass -SQLCipherDatabase.register_implementation(SQLCipherDatabase) +SQLCipherDatabase.register_implementation(SQLCipherDatabase) \ No newline at end of file -- cgit v1.2.3 From c1e460cc15523a0138dde1ece9d584554d99c04b Mon Sep 17 00:00:00 2001 From: drebs Date: Sun, 20 Jan 2013 11:56:37 -0200 Subject: Fix SQLCipher implementation registering. --- src/leap/soledad/backends/sqlcipher.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index 6711aa86..f7dc6c0b 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -61,6 +61,7 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): def set_pragma_key(cls, db_handle, key): db_handle.cursor().execute("PRAGMA key = '%s'" % key) + def __init__(self, sqlite_file, password, document_factory=None): """Create a new sqlcipher file.""" self._check_if_db_is_encrypted(sqlite_file) @@ -70,6 +71,7 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): self._ensure_schema() self._factory = document_factory or Document + def _check_if_db_is_encrypted(self, sqlite_file): if not os.path.exists(sqlite_file): return @@ -108,6 +110,7 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): return SQLCipherDatabase._sqlite_registry[v]( sqlite_file, password, document_factory=document_factory) + @classmethod def open_database(cls, sqlite_file, password, create, backend_cls=None, document_factory=None): @@ -123,6 +126,7 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): return backend_cls(sqlite_file, password, document_factory=document_factory) + @staticmethod def register_implementation(klass): """Register that we implement an SQLCipherDatabase. @@ -132,4 +136,5 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): SQLCipherDatabase._sqlite_registry[klass._index_storage_value] = klass -SQLCipherDatabase.register_implementation(SQLCipherDatabase) \ No newline at end of file +SQLiteDatabase.register_implementation(SQLCipherDatabase) + -- cgit v1.2.3 From eae9fd4b5d93845fc708abb722714ebf9d003418 Mon Sep 17 00:00:00 2001 From: drebs Date: Sun, 20 Jan 2013 16:29:53 -0200 Subject: SQLCipher backend syncs using a LeapSyncTarget. --- src/leap/soledad/backends/sqlcipher.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'src/leap/soledad/backends/sqlcipher.py') diff --git a/src/leap/soledad/backends/sqlcipher.py b/src/leap/soledad/backends/sqlcipher.py index f7dc6c0b..3d03449e 100644 --- a/src/leap/soledad/backends/sqlcipher.py +++ b/src/leap/soledad/backends/sqlcipher.py @@ -20,14 +20,17 @@ import os from sqlite3 import dbapi2, DatabaseError import time -from u1db.backends.sqlite_backend import SQLitePartialExpandDatabase +from u1db.backends.sqlite_backend import ( + SQLiteDatabase, + SQLitePartialExpandDatabase, +) from u1db import ( Document, errors, ) -def open(path, password, create, document_factory=None): +def open(path, password, create=True, document_factory=None): """Open a database at the given location. Will raise u1db.errors.DatabaseDoesNotExist if create=False and the @@ -127,13 +130,15 @@ class SQLCipherDatabase(SQLitePartialExpandDatabase): document_factory=document_factory) - @staticmethod - def register_implementation(klass): - """Register that we implement an SQLCipherDatabase. - - The attribute _index_storage_value will be used as the lookup key. + def sync(self, url, creds=None, autocreate=True, soledad=None): + """ + Synchronize encrypted documents with remote replica exposed at url. """ - SQLCipherDatabase._sqlite_registry[klass._index_storage_value] = klass + from u1db.sync import Synchronizer + from leap.soledad.backends.leap_backend import LeapSyncTarget + return Synchronizer(self, LeapSyncTarget(url, creds=creds), + soledad=self._soledad).sync( + autocreate=autocreate) SQLiteDatabase.register_implementation(SQLCipherDatabase) -- cgit v1.2.3