summaryrefslogtreecommitdiff
path: root/testing/tests/client/test_deprecated_crypto.py
blob: ca1b1558deca5bea8494f2f83456fe4fa1cef007 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import json
import pytest

from leap.soledad.client import crypto as old_crypto
from leap.soledad.common.couch import CouchDatabase
from leap.soledad.common import crypto as common_crypto

from test_soledad.u1db_tests import simple_doc


def deprecate_client_crypto(client):
    secret = client._crypto.secret
    _crypto = old_crypto.SoledadCrypto(secret)
    setattr(client._dbsyncer, '_crypto', _crypto)
    return client


def couch_database(couch_url, uuid):
    db = CouchDatabase(couch_url, "user-%s" % (uuid,))
    return db


@pytest.inlineCallbacks
def test_touch_updates_remote_representation(
        soledad_client, request):

    client = soledad_client()
    deprecated_client = deprecate_client_crypto(soledad_client())

    couch_url = request.config.option.couch_url
    remote = couch_database(couch_url, client._uuid)

    # ensure remote db is empty
    gen, docs = remote.get_all_docs()
    assert gen == 0
    assert len(docs) == 0

    # create a doc with deprecated client and sync
    yield deprecated_client.create_doc(json.loads(simple_doc))
    yield deprecated_client.sync()

    # check for doc in remote db
    gen, docs = remote.get_all_docs()
    assert gen == 1
    assert len(docs) == 1
    doc = docs.pop()
    content = doc.content
    assert common_crypto.ENC_JSON_KEY in content
    assert common_crypto.ENC_SCHEME_KEY in content
    assert common_crypto.ENC_METHOD_KEY in content
    assert common_crypto.ENC_IV_KEY in content
    assert common_crypto.MAC_KEY in content
    assert common_crypto.MAC_METHOD_KEY in content

    # "touch" the document with a newer client and synx
    _, docs = yield client.get_all_docs()
    yield client.put_doc(doc)
    yield client.sync()

    # check for newer representation of doc in remote db
    gen, docs = remote.get_all_docs()
    assert gen == 2
    assert len(docs) == 1
    doc = docs.pop()
    content = doc.content
    assert len(content) == 1
    assert 'raw' in content