summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2018-03-13 21:47:50 +0200
committerYuval Adam <_@yuv.al>2018-03-13 21:47:50 +0200
commit46901c04955ea94c746ae96d09734143af63c51d (patch)
treed39162f9ea6777e641868db8d2d99f04de749e1d
parent2f3a1e2fa48c39a190997fd60fce99ed1f9b7bca (diff)
Add skeleton support for RGBA, datetime and unit parsingv0.3.0
-rw-r--r--tests/samples/misim.sample1
-rw-r--r--tests/test_parse.py13
-rw-r--r--viewstate/parse.py25
3 files changed, 38 insertions, 1 deletions
diff --git a/tests/samples/misim.sample b/tests/samples/misim.sample
new file mode 100644
index 0000000..0c7d7d0
--- /dev/null
+++ b/tests/samples/misim.sample
@@ -0,0 +1 @@
+/wEPDwUKLTUzMjA4OTkwMA9kFgJmD2QWAgIBD2QWBgIBDxYCHglpbm5lcmh0bWwFKdeq15HXmdei15Qg157Xp9eV15XXoNeqIC0g16DXltenINeZ16nXmdeoZAIDDw8WAh4HVmlzaWJsZWhkZAIFD2QWBAIDDw8WDB4HTWF4RGF0ZQYAMFBvm4fViB4MU2VsZWN0ZWREYXRlZB4RX3NraXBNTVZhbGlkYXRpb25oHhVFbmFibGVFbWJlZGRlZFNjcmlwdHNnHhxFbmFibGVFbWJlZGRlZEJhc2VTdHlsZXNoZWV0Zx4SUmVzb2x2ZWRSZW5kZXJNb2RlCylzVGVsZXJpay5XZWIuVUkuUmVuZGVyTW9kZSwgVGVsZXJpay5XZWIuVUksIFZlcnNpb249MjAxNS4zLjExMTEuNDAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MTIxZmFlNzgxNjViYTNkNAFkFgRmDxQrAAgPFhIeDUxhYmVsQ3NzQ2xhc3MFB3JpTGFiZWweBFRleHRkHwZnHwIGADBQb5uH1YgeBFNraW4FDk9mZmljZTIwMTBCbHVlHwcLKwQBHhdFbmFibGVBamF4U2tpblJlbmRlcmluZ2gfBWceEUVuYWJsZUFyaWFTdXBwb3J0aGQWCB4FV2lkdGgbAAAAAAAAWUAHAAAAHgpSZXNpemVNb2RlCylzVGVsZXJpay5XZWIuVUkuUmVzaXplTW9kZSwgVGVsZXJpay5XZWIuVUksIFZlcnNpb249MjAxNS4zLjExMTEuNDAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MTIxZmFlNzgxNjViYTNkNAAeCENzc0NsYXNzBRFyaVRleHRCb3ggcmlIb3Zlch4EXyFTQgKCAhYIHw0bAAAAAAAAWUAHAAAAHw4LKwUAHw8FEXJpVGV4dEJveCByaUVycm9yHxACggIWCB8NGwAAAAAAAFlABwAAAB8OCysFAB8PBRNyaVRleHRCb3ggcmlGb2N1c2VkHxACggIWBh8NGwAAAAAAAFlABwAAAB8PBRNyaVRleHRCb3ggcmlFbmFibGVkHxACggIWCB8NGwAAAAAAAFlABwAAAB8OCysFAB8PBRRyaVRleHRCb3ggcmlEaXNhYmxlZB8QAoICFggfDRsAAAAAAABZQAcAAAAfDgsrBQAfDwURcmlUZXh0Qm94IHJpRW1wdHkfEAKCAhYIHw0bAAAAAAAAWUAHAAAAHw4LKwUAHw8FEHJpVGV4dEJveCByaVJlYWQfEAKCAmQCAg8UKwANDxYYBQNFUlNoBQ1DdWx0dXJlSW5mb0lEKCltU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQVoZS1JTAUETWF4RAYAMFBvm4fViAUNU2VsZWN0ZWREYXRlcw8FkAFUZWxlcmlrLldlYi5VSS5DYWxlbmRhci5Db2xsZWN0aW9ucy5EYXRlVGltZUNvbGxlY3Rpb24sIFRlbGVyaWsuV2ViLlVJLCBWZXJzaW9uPTIwMTUuMy4xMTExLjQwLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTEyMWZhZTc4MTY1YmEzZDQUKwAABRZGYXN0TmF2aWdhdGlvblByZXZUZXh0BQI8PAULU3BlY2lhbERheXMPBZMBVGVsZXJpay5XZWIuVUkuQ2FsZW5kYXIuQ29sbGVjdGlvbnMuQ2FsZW5kYXJEYXlDb2xsZWN0aW9uLCBUZWxlcmlrLldlYi5VSSwgVmVyc2lvbj0yMDE1LjMuMTExMS40MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xMjFmYWU3ODE2NWJhM2Q0FCsAARYEBQNJU1ILKYEBVGVsZXJpay5XZWIuVUkuQ2FsZW5kYXIuUmVjdXJyaW5nRXZlbnRzLCBUZWxlcmlrLldlYi5VSSwgVmVyc2lvbj0yMDE1LjMuMTExMS40MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xMjFmYWU3ODE2NWJhM2Q0EAUJSXRlbVN0eWxlDwV3U3lzdGVtLldlYi5VSS5XZWJDb250cm9scy5UYWJsZUl0ZW1TdHlsZSwgU3lzdGVtLldlYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EWBB4JQmFja0NvbG9yCe/Es/8fEAIIBQ9SZW5kZXJJbnZpc2libGVnBQ1DdWx0dXJlTmFtZUlEBQVoZS1JTAULVGl0bGVGb3JtYXQFCXl5eXlNTU1NIAUJQ3VsdHVyZUlEAo0IBRZGYXN0TmF2aWdhdGlvbk5leHRUZXh0BQI+PgURRW5hYmxlTXVsdGlTZWxlY3RoDxYMHwVnHwZnHwcLKwQBHwoFDk9mZmljZTIwMTBCbHVlHwtoHwxoZGQWBB8PBQtyY01haW5UYWJsZR8QAgIWBB8PBQxyY090aGVyTW9udGgfEAICZBYEHw8FCnJjU2VsZWN0ZWQfEAICZBYEHw8FCnJjRGlzYWJsZWQfEAICFgQfDwUMcmNPdXRPZlJhbmdlHxACAhYEHw8FCXJjV2Vla2VuZB8QAgIWBB8PBQdyY0hvdmVyHxACAhYEHw8FOFJhZENhbGVuZGFyTW9udGhWaWV3IFJhZENhbGVuZGFyTW9udGhWaWV3X09mZmljZTIwMTBCbHVlHxACAhYEHw8FCXJjVmlld1NlbB8QAgJkAgUPDxYGHwVnHwZnHwcLKwQBZBYEZg8UKwAIDxYQHwgFB3JpTGFiZWwfCWQfBmcfBwsrBAEfCgUOT2ZmaWNlMjAxMEJsdWUfC2gfBWcfDGhkFggfDRsAAAAAAABZQAcAAAAfDgsrBQAfDwURcmlUZXh0Qm94IHJpSG92ZXIfEAKCAhYIHw0bAAAAAAAAWUAHAAAAHw4LKwUAHw8FEXJpVGV4dEJveCByaUVycm9yHxACggIWCB8NGwAAAAAAAFlABwAAAB8OCysFAB8PBRNyaVRleHRCb3ggcmlGb2N1c2VkHxACggIWBh8NGwAAAAAAAFlABwAAAB8PBRNyaVRleHRCb3ggcmlFbmFibGVkHxACggIWCB8NGwAAAAAAAFlABwAAAB8OCysFAB8PBRRyaVRleHRCb3ggcmlEaXNhYmxlZB8QAoICFggfDRsAAAAAAABZQAcAAAAfDgsrBQAfDwURcmlUZXh0Qm94IHJpRW1wdHkfEAKCAhYIHw0bAAAAAAAAWUAHAAAAHw4LKwUAHw8FEHJpVGV4dEJveCByaVJlYWQfEAKCAmQCAg8UKwANDxYWBQNFUlNoBQ1DdWx0dXJlSW5mb0lEKCsGBWhlLUlMBQ1TZWxlY3RlZERhdGVzDwWQAVRlbGVyaWsuV2ViLlVJLkNhbGVuZGFyLkNvbGxlY3Rpb25zLkRhdGVUaW1lQ29sbGVjdGlvbiwgVGVsZXJpay5XZWIuVUksIFZlcnNpb249MjAxNS4zLjExMTEuNDAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MTIxZmFlNzgxNjViYTNkNBQrAAAFFkZhc3ROYXZpZ2F0aW9uUHJldlRleHQFAjw8BQtTcGVjaWFsRGF5cw8FkwFUZWxlcmlrLldlYi5VSS5DYWxlbmRhci5Db2xsZWN0aW9ucy5DYWxlbmRhckRheUNvbGxlY3Rpb24sIFRlbGVyaWsuV2ViLlVJLCBWZXJzaW9uPTIwMTUuMy4xMTExLjQwLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTEyMWZhZTc4MTY1YmEzZDQUKwABFgQFA0lTUgsrBxAFCUl0ZW1TdHlsZQ8Fd1N5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMuVGFibGVJdGVtU3R5bGUsIFN5c3RlbS5XZWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhFgQfEQnvxLP/HxACCAUPUmVuZGVySW52aXNpYmxlZwUNQ3VsdHVyZU5hbWVJRAUFaGUtSUwFC1RpdGxlRm9ybWF0BQl5eXl5TU1NTSAFCUN1bHR1cmVJRAKNCAUWRmFzdE5hdmlnYXRpb25OZXh0VGV4dAUCPj4FEUVuYWJsZU11bHRpU2VsZWN0aA8WDB8FZx8GZx8HCysEAR8KBQ5PZmZpY2UyMDEwQmx1ZR8LaB8MaGRkFgQfDwULcmNNYWluVGFibGUfEAICFgQfDwUMcmNPdGhlck1vbnRoHxACAmQWBB8PBQpyY1NlbGVjdGVkHxACAmQWBB8PBQpyY0Rpc2FibGVkHxACAhYEHw8FDHJjT3V0T2ZSYW5nZR8QAgIWBB8PBQlyY1dlZWtlbmQfEAICFgQfDwUHcmNIb3Zlch8QAgIWBB8PBThSYWRDYWxlbmRhck1vbnRoVmlldyBSYWRDYWxlbmRhck1vbnRoVmlld19PZmZpY2UyMDEwQmx1ZR8QAgIWBB8PBQlyY1ZpZXdTZWwfEAICZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WBgUtY3RsMDAkQ29udGVudFVzZXJzUGFnZSRDYWxlbmRhckRhdGVIYW5wYWthdFRaBTZjdGwwMCRDb250ZW50VXNlcnNQYWdlJENhbGVuZGFyRGF0ZUhhbnBha2F0VFokY2FsZW5kYXIFNmN0bDAwJENvbnRlbnRVc2Vyc1BhZ2UkQ2FsZW5kYXJEYXRlSGFucGFrYXRUWiRjYWxlbmRhcgUvY3RsMDAkQ29udGVudFVzZXJzUGFnZSRDYWxlbmRhckRhdGVIb3phYXREYXJrb24FOGN0bDAwJENvbnRlbnRVc2Vyc1BhZ2UkQ2FsZW5kYXJEYXRlSG96YWF0RGFya29uJGNhbGVuZGFyBThjdGwwMCRDb250ZW50VXNlcnNQYWdlJENhbGVuZGFyRGF0ZUhvemFhdERhcmtvbiRjYWxlbmRhcmsBxKDm+mQUwIO5UbPwRlbxedWN
diff --git a/tests/test_parse.py b/tests/test_parse.py
index cb0a354..56f36c9 100644
--- a/tests/test_parse.py
+++ b/tests/test_parse.py
@@ -1,5 +1,6 @@
import pytest
+from datetime import datetime
from os import walk
from os.path import join
from viewstate import *
@@ -40,6 +41,10 @@ class TestParse(object):
vs = ViewState(raw=b'\xff\x01\n\x01\x02')
assert vs.decode() == 'Color: unknown' # all colors are unknown for now
+ def test_rgba(self):
+ vs = ViewState(raw=b'\xff\x01\x09\x10\x20\x30\x40')
+ assert vs.decode() == 'RGBA(16,32,48,64)'
+
def test_formatted_string(self):
vs = ViewState()
s1 = 'System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
@@ -47,6 +52,14 @@ class TestParse(object):
vs.raw = b'\xff\x01()' + bytes([len(s1)]) + s1.encode() + bytes([len(s2)]) + s2.encode()
assert vs.decode() == 'Formatted string: {} {}'.format(s2, s1)
+ @pytest.mark.skip(reason='Datetime parsing not yet supported')
+ def test_datetime(self):
+ vs = ViewState()
+ vs.raw = b'\xff\x01\x06\x000Po\x9b\x87\xd5\x88'
+ assert vs.decode() == datetime(2018, 3, 11, 22)
+ vs.raw = b'\xff\x01\x06\x00\xf0\xb9\x99d\x88\xd5\x88'
+ assert vs.decode() == datetime(2018, 3, 12, 22)
+
def test_complex_pair(self):
vs = ViewState()
vs.raw = b'\xff\x01\x0f\x67\x0f\x68\x66'
diff --git a/viewstate/parse.py b/viewstate/parse.py
index 03749f7..99110f1 100644
--- a/viewstate/parse.py
+++ b/viewstate/parse.py
@@ -1,5 +1,8 @@
+from datetime import datetime
+
from .exceptions import ViewStateException
+
CONSTS = {
100: None,
101: '',
@@ -56,6 +59,17 @@ def parse_triplet(b):
third, remain = parse(remain)
return (first, second, third), remain
+def parse_datetime(b):
+ print([x for x in b[:8]])
+ return datetime(2000, 1, 1), b[8:]
+
+def parse_unit(b):
+ print([x for x in b[:12]])
+ return 'Unit: ', b[12:]
+
+def parse_rgba(b):
+ return 'RGBA({},{},{},{})'.format(*b[:4]), b[4:]
+
def parse_str_array(b):
n, remain = parse_int(b)
l = []
@@ -84,10 +98,13 @@ def parse_formatted_string(b):
s1, remain = parse_string(b[1:])
s2, remain = parse_string(remain)
return 'Formatted string: {} {}'.format(s2, s1), remain
+ elif b[0] == 0x2b:
+ i, remain = parse_int(b[1:])
+ s, remain = parse_string(remain)
+ return 'Formatted string: {} type ref {}'.format(s, i), remain
else:
raise ViewStateException('Unknown formatted string type marker {}'.format(b[:20]))
-
def parse_sparse_array(b):
type, remain = parse_type(b)
length, remain = parse_int(remain)
@@ -138,6 +155,10 @@ def parse(b):
return parse_int(b[1:])
elif b[0] in (0x05, 0x1e):
return parse_string(b[1:])
+ elif b[0] == 0x06:
+ return parse_datetime(b[1:])
+ elif b[0] == 0x09:
+ return parse_rgba(b[1:])
elif b[0] == 0x10:
return parse_triplet(b[1:])
elif b[0] == 0x0a:
@@ -154,6 +175,8 @@ def parse(b):
return parse_array(b[1:])
elif b[0] == 0x18:
return parse_dict(b[1:])
+ elif b[0] == 0x1b:
+ return parse_unit(b[1:])
elif b[0] == 0x1f:
return parse_stringref(b[1:])
elif b[0] == 0x28: