summaryrefslogtreecommitdiff
path: root/viewstate.py
blob: b75cd37d30f2702c1f38f9eb29fde3319022c2a5 (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
from base64 import b64decode, b64encode


CONSTS = {
    100: {},
    101: '',
    102: 0,
    103: True,
    104: False
}

def parse_const(b):
    return CONSTS.get(b, None)

def parse(b):
    assert type(b) == bytes().__class__
    if len(b) == 1:
        return parse_const(b[0])
    return None


class ViewState(object):

    def __init__(self, base64=''):
        self.base64 = base64
        self.raw = b64decode(self.base64)
        self.decoded = None

    @property
    def preamble(self):
        return self.raw[:2]

    @property
    def body(self):
        return self.raw[2:]

    def is_valid(self):
        format_marker = b'\xff'
        version_marker = b'\x01'
        preamble = format_marker + version_marker
        return self.preamble == preamble

    def decode(self):
        if not self.is_valid():
            raise Exception('Cannot decode invalid viewstate, bad preamble')
        self.decoded = parse(self.body)
        return self.decoded