diff options
author | Duda Dornelles <ddornell@thoughtworks.com> | 2014-11-10 15:25:41 -0200 |
---|---|---|
committer | Duda Dornelles <ddornell@thoughtworks.com> | 2014-11-10 17:54:12 -0200 |
commit | 84689864542cb9c6c356b5204f94dd7a0ea7a777 (patch) | |
tree | 268f8914c0e89d653ae46a33952ee6da47b914c1 /service/pixelated/adapter | |
parent | 636bbf638b3b0fbd6de3b194fb91257de4fe5d5b (diff) |
adding encrypted file index to whoosh
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r-- | service/pixelated/adapter/search.py | 12 | ||||
-rw-r--r-- | service/pixelated/adapter/soledad_querier.py | 15 |
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] |