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


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

def parse(b):
    assert type(b) == bytes().__class__
    if len(b) == 1 and b[0] in CONSTS:
        return CONSTS[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