summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFolker Bernitt <fbernitt@thoughtworks.com>2015-09-02 17:55:36 +0200
committerFolker Bernitt <fbernitt@thoughtworks.com>2015-09-02 17:56:25 +0200
commit1999a0c396619694edefba7513cb488681c21d3b (patch)
tree1be294fd536200c4e93991a291ffe784c35a2423
parente5d718f982e0cd3fc85da00d3abdccce1907e488 (diff)
Move index key to SearchIndexStorageKey
- Issue #449 - next step: replace querier in services with this implementation
-rw-r--r--service/pixelated/adapter/search/index_storage_key.py42
-rw-r--r--service/test/unit/adapter/search/test_index_storage_key.py52
2 files changed, 94 insertions, 0 deletions
diff --git a/service/pixelated/adapter/search/index_storage_key.py b/service/pixelated/adapter/search/index_storage_key.py
new file mode 100644
index 00000000..b2761849
--- /dev/null
+++ b/service/pixelated/adapter/search/index_storage_key.py
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2015 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+import base64
+from twisted.internet import defer
+import os
+
+
+class SearchIndexStorageKey(object):
+ __slots__ = '_soledad'
+
+ def __init__(self, soledad):
+ self._soledad = soledad
+
+ @defer.inlineCallbacks
+ def get_or_create_key(self):
+ docs = yield self._soledad.get_from_index('by-type', 'index_key')
+
+ if len(docs):
+ key = docs[0].content['value']
+ else:
+ key = self._new_index_key()
+ yield self._store_key_in_soledad(key)
+ defer.returnValue(key)
+
+ def _new_index_key(self):
+ return os.urandom(64) # 32 for encryption, 32 for hmac
+
+ def _store_key_in_soledad(self, index_key):
+ return self._soledad.create_doc(dict(type='index_key', value=base64.encodestring(index_key)))
diff --git a/service/test/unit/adapter/search/test_index_storage_key.py b/service/test/unit/adapter/search/test_index_storage_key.py
new file mode 100644
index 00000000..e60c69ef
--- /dev/null
+++ b/service/test/unit/adapter/search/test_index_storage_key.py
@@ -0,0 +1,52 @@
+#
+# Copyright (c) 2015 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated 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 Affero General Public License for more details.
+#
+# 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 leap.soledad.common.document import SoledadDocument
+from mockito import mock, when, unstub, verify
+from twisted.internet import defer
+from twisted.trial import unittest
+from pixelated.adapter.search.index_storage_key import SearchIndexStorageKey
+import os
+
+
+class TestSearchIndexStorageKey(unittest.TestCase):
+
+ def tearDown(self):
+ unstub()
+
+ @defer.inlineCallbacks
+ def test_get_or_create_key_returns_key(self):
+ soledad = mock()
+
+ when(soledad).get_from_index('by-type', 'index_key').thenReturn([SoledadDocument(json='{"value": "somekey"}')])
+
+ key = yield SearchIndexStorageKey(soledad).get_or_create_key()
+
+ self.assertEqual('somekey', key)
+
+ @defer.inlineCallbacks
+ def test_get_or_create_creates_key_if_not_exists(self):
+ expected_key = '\x8brN\xa3\xe5-\x828 \x95\x8d\n\xc6\x0c\x82\n\xd7!\xa9\xb0.\xcc\\h\xa9\x98\xe9V\xc1*<\xfe\xbb\x8f\xcd\x7f\x8c#\xff\xf9\x840\xdf{}\x97\xebS-*\xe2f\xf9B\xa9\xb1\x0c\x1d-C)\xc5\xa0B'
+ base64_encoded_key = 'i3JOo+UtgjgglY0KxgyCCtchqbAuzFxoqZjpVsEqPP67j81/jCP/+YQw33t9l+tTLSriZvlCqbEM\nHS1DKcWgQg==\n'
+ soledad = mock()
+
+ when(soledad).get_from_index('by-type', 'index_key').thenReturn([])
+ when(os).urandom(64).thenReturn(expected_key)
+
+ key = yield SearchIndexStorageKey(soledad).get_or_create_key()
+
+ self.assertEqual(expected_key, key)
+
+ verify(soledad).create_doc(dict(type='index_key', value=base64_encoded_key))