def test_plain_datakey_json():
    auth = Authentication(PlainCoder(), PlainCryptor(), DataKeyVerifier(JsonCoder(), 'session'), PlainCoder(), TestSessionHandler(), 'SECRET')

    data = '{"field": "value", "session": "1"}'
    context = auth.get_context(data)
    assert context.data == {'field': 'value', 'session': '1'}
    assert context.session == {'id': '1'}
def test_base64_aes_timehash_json():
    data = {'field': 'value'}
    auth = Authentication(Base64Coder(), AESCryptor(256), TimeHashVerifier(now=lambda: 1000000000), JsonCoder(), handler1, 'SECRET')

    d = auth.build_first_data(data, 'v')
    assert d == 'wJ8UaQ0+pQm3V9Rpj+ZnmS9K9vFi9G5Lrr5Mv7oS/PvgxZSSKmu02Had5Z4CQ5AgpMR3qJ6GFshPRAjIB5v/B3eP6ILSDlyjrcgA51wlzzrVEi5uAQPHB9X742xD11lR'

    c = auth.get_first_context(d)
    assert data == c.data

    d = auth.build_data(data, handler1.session_from_public_key('v'))
    assert d == 'sTZkvpTfADtge51D9Mwprs8zSzmHAx8PDk/VoX6+pI+Gb47o393wxShTdlJV4oT26XE6sBwcNXPzWkR+I9wuiD/9lBUKo8LLiZbNBiCvWhYTpeIN45aZDUXWVDijMFMH'
    c = auth.get_context(d)
    assert data == c.data 
def test_timehash_json():
    data = {'field':'value'}
    auth = Authentication(PlainCoder(), PlainCryptor(), TimeHashVerifier(now=lambda: 1000000000), JsonCoder(), handler1, 'SECRET')

    d = auth.build_first_data(data, 'v')
    assert d == 'v$3b9aca008d34b0ce271d8d499ed4f44678db1175ae547b95${"field":"value"}'

    c = auth.get_first_context(d)
    assert data == c.data

    d = auth.build_data(data, handler1.session_from_public_key('v'))
    assert d == 'v$3b9aca00741e96c093a4a5c230d3ea592adcabf3e055df4a${"field":"value"}'
    c = auth.get_context(d)
    assert data == c.data
def test_authentication(cryptor, verifier, coder, sessionhandler, secret='SECRET'):
    """Round-trip test"""
    authentication = Authentication(Base64Coder(), cryptor, verifier, coder, sessionhandler, secret)
    i = {'f1':'v1'}
    
    d = authentication.build_first_data(i, '1')
    c = authentication.get_first_context(d)
    
    assert i == c.data
    
    d = authentication.build_data(i, c.session)
    c = authentication.get_context(d)
    
    assert i == c.data
def test_plain_bypass_urlquery():
    auth = Authentication(PlainCoder(), PlainCryptor(), BypassVerifier(), URLQueryCoder(), TestSessionHandler(), 'SECRET')

    data = ''
    context = auth.get_context(data)
    assert context.data == {}

    data = 'field=value'
    context = auth.get_context(data)
    assert context.data == {'field': ['value']}

    data = 'field=value&field=value'
    context = auth.get_context(data)
    assert context.data == {'field': ['value', 'value']}
def test_session():
    private_key = ('private_key' + '!' * 40)[:40]
    public_key = ('public_key' + '!' * 40)[:40]
    class KeyCheckSessionHandler(SessionHandler):
        def session_from_public_key(a_public_key, secret_key):
            assert a_public_key == public_key
            return session

        def get_private_key(session, secret_key):
            return private_key

    verifier = TimeHashVerifier()
    auth = Authentication(PlainCoder(), PlainCryptor(), verifier, SimpleURLQueryCoder(), TestSessionHandler(), 'SECRET')

    data = {'field': 'value'}
    encrypted = auth.build_data(data, session_zero)
    assert encrypted.startswith('public_key')
    assert '$' in encrypted

    context = auth.get_context(encrypted)
    assert context.data == data