summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter
diff options
context:
space:
mode:
authorDuda Dornelles <ddornell@thoughtworks.com>2014-11-10 15:25:41 -0200
committerDuda Dornelles <ddornell@thoughtworks.com>2014-11-10 17:54:12 -0200
commit84689864542cb9c6c356b5204f94dd7a0ea7a777 (patch)
tree268f8914c0e89d653ae46a33952ee6da47b914c1 /service/pixelated/adapter
parent636bbf638b3b0fbd6de3b194fb91257de4fe5d5b (diff)
adding encrypted file index to whoosh
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r--service/pixelated/adapter/search.py12
-rw-r--r--service/pixelated/adapter/soledad_querier.py15
2 files changed, 20 insertions, 7 deletions
diff --git a/service/pixelated/adapter/search.py b/service/pixelated/adapter/search.py
index a5897a12..cd900f87 100644
--- a/service/pixelated/adapter/search.py
+++ b/service/pixelated/adapter/search.py
@@ -13,10 +13,11 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+from pixelated.support.encrypted_file_storage import EncryptedFileStorage
import os
from pixelated.adapter.status import Status
-import whoosh.index
+from whoosh.index import FileIndex
from whoosh.fields import *
from whoosh.qparser import QueryParser
from whoosh import sorting
@@ -25,12 +26,11 @@ from pixelated.support.date import milliseconds
class SearchEngine(object):
- __slots__ = '_index'
-
INDEX_FOLDER = os.path.join(os.environ['HOME'], '.leap', 'search_index')
DEFAULT_TAGS = ['inbox', 'sent', 'drafts', 'trash']
- def __init__(self):
+ def __init__(self, soledad_querier):
+ self.soledad_querier = soledad_querier
if not os.path.exists(self.INDEX_FOLDER):
os.makedirs(self.INDEX_FOLDER)
self._index = self._create_index()
@@ -102,7 +102,9 @@ class SearchEngine(object):
raw=TEXT(stored=False))
def _create_index(self):
- return whoosh.index.create_in(self.INDEX_FOLDER, self._mail_schema(), indexname='mails')
+ masterkey = self.soledad_querier.get_index_masterkey
+ storage = EncryptedFileStorage(self.INDEX_FOLDER, masterkey)
+ return FileIndex.create(storage, self._mail_schema(), indexname='mails')
def index_mail(self, mail):
with self._index.writer() as writer:
diff --git a/service/pixelated/adapter/soledad_querier.py b/service/pixelated/adapter/soledad_querier.py
index e36f2e1a..c1e0350e 100644
--- a/service/pixelated/adapter/soledad_querier.py
+++ b/service/pixelated/adapter/soledad_querier.py
@@ -13,17 +13,28 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
-from pixelated.adapter.mail import PixelatedMail
-import re
import base64
import quopri
+from cryptography.fernet import Fernet
+from pixelated.adapter.mail import PixelatedMail
+import re
+
class SoledadQuerier:
def __init__(self, soledad):
self.soledad = soledad
+ @property
+ def get_index_masterkey(self):
+ index_key = self.soledad.get_from_index('by-type', 'index_key')
+ if len(index_key) == 0:
+ index_key = Fernet.generate_key()
+ self.soledad.create_doc(dict(type='index_key', value=index_key))
+ return index_key
+ return str(index_key[0].content['value'])
+
def _remove_many(self, docs):
[self.soledad.delete_doc(doc) for doc in docs]