def decrypt_doc_task(doc_id, doc_rev, content, gen, trans_id, key, secret, idx): """ Decrypt the content of the given document. :param doc_id: The document id. :type doc_id: str :param doc_rev: The document revision. :type doc_rev: str :param content: The encrypted content of the document. :type content: str :param gen: The generation corresponding to the modification of that document. :type gen: int :param trans_id: The transaction id corresponding to the modification of that document. :type trans_id: str :param key: The encryption key. :type key: str :param secret: The Soledad storage secret (used for MAC auth). :type secret: str :param idx: The index of this document in the current sync process. :type idx: int :return: A tuple containing the doc id, revision and encrypted content. :rtype: tuple(str, str, str) """ decrypted_content = decrypt_doc_dict(content, doc_id, doc_rev, key, secret) return doc_id, doc_rev, decrypted_content, gen, trans_id, idx
def decrypt_doc_task(doc_id, doc_rev, content, gen, trans_id, key, secret, idx): """ Decrypt the content of the given document. :param doc_id: The document id. :type doc_id: str :param doc_rev: The document revision. :type doc_rev: str :param content: The encrypted content of the document as JSON dict. :type content: dict :param gen: The generation corresponding to the modification of that document. :type gen: int :param trans_id: The transaction id corresponding to the modification of that document. :type trans_id: str :param key: The encryption key. :type key: str :param secret: The Soledad storage secret (used for MAC auth). :type secret: str :param idx: The index of this document in the current sync process. :type idx: int :return: A tuple containing the doc id, revision and encrypted content. :rtype: tuple(str, str, str) """ decrypted_content = decrypt_doc_dict(content, doc_id, doc_rev, key, secret) return doc_id, doc_rev, decrypted_content, gen, trans_id, idx
def test_sync_propagates_resolution(self): """ Test if synchronization propagates resolution. This test was adapted to decrypt remote content before assert. """ self.db1 = self.create_database('test1', 'both') self.db2 = self.create_database('test2', 'both') doc1 = self.db1.create_doc_from_json('{"a": 1}', doc_id='the-doc') db3 = self.create_database('test3', 'both') self.sync(self.db2, self.db1) self.assertEqual( self.db1._get_generation_info(), self.db2._get_replica_gen_and_trans_id(self.db1._replica_uid)) self.assertEqual( self.db2._get_generation_info(), self.db1._get_replica_gen_and_trans_id(self.db2._replica_uid)) self.sync(db3, self.db1) # update on 2 doc2 = self.make_document('the-doc', doc1.rev, '{"a": 2}') self.db2.put_doc(doc2) self.sync(self.db2, db3) self.assertEqual(db3.get_doc('the-doc').rev, doc2.rev) # update on 1 doc1.set_json('{"a": 3}') self.db1.put_doc(doc1) # conflicts self.sync(self.db2, self.db1) self.sync(db3, self.db1) self.assertTrue(self.db2.get_doc('the-doc').has_conflicts) self.assertTrue(db3.get_doc('the-doc').has_conflicts) # resolve conflicts = self.db2.get_doc_conflicts('the-doc') doc4 = self.make_document('the-doc', None, '{"a": 4}') revs = [doc.rev for doc in conflicts] self.db2.resolve_doc(doc4, revs) doc2 = self.db2.get_doc('the-doc') self.assertEqual(doc4.get_json(), doc2.get_json()) self.assertFalse(doc2.has_conflicts) self.sync(self.db2, db3) doc3 = db3.get_doc('the-doc') if ENC_SCHEME_KEY in doc3.content: _crypto = self._soledad._crypto key = _crypto.doc_passphrase(doc3.doc_id) secret = _crypto.secret doc3.set_json( decrypt_doc_dict(doc3.content, doc3.doc_id, doc3.rev, key, secret)) self.assertEqual(doc4.get_json(), doc3.get_json()) self.assertFalse(doc3.has_conflicts) self.db1.close() self.db2.close() db3.close()
def test_sync_propagates_resolution(self): """ Test if synchronization propagates resolution. This test was adapted to decrypt remote content before assert. """ self.db1 = self.create_database('test1', 'both') self.db2 = self.create_database('test2', 'both') doc1 = self.db1.create_doc_from_json('{"a": 1}', doc_id='the-doc') db3 = self.create_database('test3', 'both') self.sync(self.db2, self.db1) self.assertEqual( self.db1._get_generation_info(), self.db2._get_replica_gen_and_trans_id(self.db1._replica_uid)) self.assertEqual( self.db2._get_generation_info(), self.db1._get_replica_gen_and_trans_id(self.db2._replica_uid)) self.sync(db3, self.db1) # update on 2 doc2 = self.make_document('the-doc', doc1.rev, '{"a": 2}') self.db2.put_doc(doc2) self.sync(self.db2, db3) self.assertEqual(db3.get_doc('the-doc').rev, doc2.rev) # update on 1 doc1.set_json('{"a": 3}') self.db1.put_doc(doc1) # conflicts self.sync(self.db2, self.db1) self.sync(db3, self.db1) self.assertTrue(self.db2.get_doc('the-doc').has_conflicts) self.assertTrue(db3.get_doc('the-doc').has_conflicts) # resolve conflicts = self.db2.get_doc_conflicts('the-doc') doc4 = self.make_document('the-doc', None, '{"a": 4}') revs = [doc.rev for doc in conflicts] self.db2.resolve_doc(doc4, revs) doc2 = self.db2.get_doc('the-doc') self.assertEqual(doc4.get_json(), doc2.get_json()) self.assertFalse(doc2.has_conflicts) self.sync(self.db2, db3) doc3 = db3.get_doc('the-doc') if ENC_SCHEME_KEY in doc3.content: _crypto = self._soledad._crypto key = _crypto.doc_passphrase(doc3.doc_id) secret = _crypto.secret doc3.set_json(decrypt_doc_dict( doc3.content, doc3.doc_id, doc3.rev, key, secret)) self.assertEqual(doc4.get_json(), doc3.get_json()) self.assertFalse(doc3.has_conflicts) self.db1.close() self.db2.close() db3.close()
def assertGetEncryptedDoc( self, db, doc_id, doc_rev, content, has_conflicts): """ Assert that the document in the database looks correct. """ exp_doc = self.make_document(doc_id, doc_rev, content, has_conflicts=has_conflicts) doc = db.get_doc(doc_id) if ENC_SCHEME_KEY in doc.content: # XXX check for SYM_KEY too key = self._soledad._crypto.doc_passphrase(doc.doc_id) secret = self._soledad._crypto.secret decrypted = decrypt_doc_dict( doc.content, doc.doc_id, doc.rev, key, secret) doc.set_json(decrypted) self.assertEqual(exp_doc.doc_id, doc.doc_id) self.assertEqual(exp_doc.rev, doc.rev) self.assertEqual(exp_doc.has_conflicts, doc.has_conflicts) self.assertEqual(exp_doc.content, doc.content)
def assertGetEncryptedDoc(self, db, doc_id, doc_rev, content, has_conflicts): """ Assert that the document in the database looks correct. """ exp_doc = self.make_document(doc_id, doc_rev, content, has_conflicts=has_conflicts) doc = db.get_doc(doc_id) if ENC_SCHEME_KEY in doc.content: # XXX check for SYM_KEY too key = self._soledad._crypto.doc_passphrase(doc.doc_id) secret = self._soledad._crypto.secret decrypted = decrypt_doc_dict(doc.content, doc.doc_id, doc.rev, key, secret) doc.set_json(decrypted) self.assertEqual(exp_doc.doc_id, doc.doc_id) self.assertEqual(exp_doc.rev, doc.rev) self.assertEqual(exp_doc.has_conflicts, doc.has_conflicts) self.assertEqual(exp_doc.content, doc.content)