summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2018-02-27 00:35:27 +0200
committerYuval Adam <_@yuv.al>2018-02-27 00:55:20 +0200
commit882449576edce1945946227b045cebb88bfab9aa (patch)
tree41c6c29dad91021044b5ad6bf1d01bedcf9db71b
parenta90faf1abc6927e20f4ed27dfc3f36f6c73a009c (diff)
Improved parsing WIP
-rw-r--r--.gitignore1
-rw-r--r--setup.py2
-rw-r--r--tests/samples/ecom.sample1
-rw-r--r--tests/test_viewstate.py2
-rw-r--r--viewstate/parse.py30
5 files changed, 29 insertions, 7 deletions
diff --git a/.gitignore b/.gitignore
index af56758..eaf75f3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ __pycache__
.pytest_cache
build/
dist/
+*.egg-info/
diff --git a/setup.py b/setup.py
index a8b0316..58754fe 100644
--- a/setup.py
+++ b/setup.py
@@ -7,9 +7,9 @@ with open(str(Path(__file__).resolve().parents[0] / 'README.rst'), encoding='utf
setup(
name='viewstate',
- version='0.1.2',
author='Yuval Adam',
author_email='_@yuv.al',
+ version='0.2.0',
description='.NET viewstate decoder',
long_description=long_description,
url='https://github.com/yuvadm/viewstate',
diff --git a/tests/samples/ecom.sample b/tests/samples/ecom.sample
new file mode 100644
index 0000000..89c2f9a
--- /dev/null
+++ b/tests/samples/ecom.sample
@@ -0,0 +1 @@
+/wEPDwUJNDA0MzUzMzI5DxYCHg9fX0FudGlYc3JmVG9rZW4FIDIzNzNjNWM5ZDRiZDRiOTI5ZGE0MDRkYzdlYWU2MWNiFgZmDxUBA3J0bGQCAQ8VDDZodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL0NvbW1vbi5jc3NBaHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0Rlc2lnbi9Db3VydEZpbmVzQ29sbGVjdGlvbi9TdHlsZS5jc3MzaHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0Rlc2lnbi9Wb3VjaGVycy9pbWFnZXMvM2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzLzNodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL2ltYWdlcy8zaHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0Rlc2lnbi9Wb3VjaGVycy9pbWFnZXMvM2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzLwJoZTNodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL2ltYWdlcy8CaGUzaHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0Rlc2lnbi9Wb3VjaGVycy9pbWFnZXMvAmhlZAICDxYCHgZvbkxvYWQFIGphdmFzY3JpcHQ6IFByZWxvYWRJbWcoKTtsb2FkKCk7FgICAQ9kFhpmDxUBA3J0bGQCAQ9kFiJmDxUCA3J0bEFodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL0NvdXJ0RmluZXNDb2xsZWN0aW9uL2ltYWdlcy9oZWQCAQ8VAUFodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL0NvdXJ0RmluZXNDb2xsZWN0aW9uL2ltYWdlcy9oZWQCAg8VDAs2MiwzLDQ3MCwzMCBodHRwOi8vd3d3Lmdvdi5pbC9maXJzdGdvdi9lY29tLxLXnNeQ16rXqCDXqdeV15Qi150S15zXkNeq16gg16nXldeUItedCjAsMyw2NDAsNDAWaHR0cDovL3d3dy5lY2EuZ292LmlsLyTXqNep15XXqiDXlNeQ15vXmdek15Qg15XXlNeS15HXmdeZ15Qk16jXqdeV16og15TXkNeb15nXpNeUINeV15TXkteR15nXmdeUCzAsMzUsNjQwLDYwFmh0dHA6Ly93d3cuZWNhLmdvdi5pbC8k16jXqdeV16og15TXkNeb15nXpNeUINeV15TXkteR15nXmdeUJNeo16nXldeqINeU15DXm9eZ16TXlCDXldeU15LXkdeZ15nXlGQCAw8VDAs2MiwzLDQ3MCwzMCBodHRwOi8vd3d3Lmdvdi5pbC9maXJzdGdvdi9lY29tLxLXnNeQ16rXqCDXqdeV15Qi150S15zXkNeq16gg16nXldeUItedCjAsMyw2NDAsNDAWaHR0cDovL3d3dy5lY2EuZ292LmlsLyTXqNep15XXqiDXlNeQ15vXmdek15Qg15XXlNeS15HXmdeZ15Qk16jXqdeV16og15TXkNeb15nXpNeUINeV15TXkteR15nXmdeUCzAsMzUsNjQwLDYwFmh0dHA6Ly93d3cuZWNhLmdvdi5pbC8k16jXqdeV16og15TXkNeb15nXpNeUINeV15TXkteR15nXmdeUJNeo16nXldeqINeU15DXm9eZ16TXlCDXldeU15LXkdeZ15nXlGQCBA8VAxZodHRwOi8vd3d3LmVjYS5nb3YuaWwvE9ep16LXqCDXlNep15nXqNeV16oT16nXoteoINeU16nXmdeo15XXqmQCBQ8VAxNodHRwczovL3d3dy5nb3YuaWwvM9ec15DXqteoINec16nXmdeo15XXqteZ150g15XXnNee15nXk9eiINee157Xqdec16rXmTPXnNeQ16rXqCDXnNep15nXqNeV16rXmdedINeV15zXnteZ15PXoiDXntee16nXnNeq15lkAgYPFQEAZAIHDxYEHgRocmVmBUxodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvU2VjdXJlRm9sZGVyL0xvZ2luUGFnZS5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wHglpbm5lcmh0bWwF6gI8YSBpZD0ibWVtYmVyIiBvbm1vdXNlb3Zlcj0ic3RhdHVzPScnOyByZXR1cm4gdHJ1ZTsiIG5hbWU9Im1lbWJlciIgaHJlZj0jIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvU2VjdXJlRm9sZGVyL0xvZ2luUGFnZS5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wJywnbWVtYmVyJywnaGVpZ2h0PTI4MCx3aWR0aD0yNTAsdG9wPTEwMCxsZWZ0PTIwMCxzY3JvbGxiYXJzPW5vLHN0YXR1cz0xLHJlc2l6YWJsZT1ubycpIiBydW5hdD0ic2VydmVyIiBjbGFzcz10b29sYmFyPjxhc3A6TGFiZWwgSUQ9Im1lbWJlcnR4dCIgUnVuYXQ9c2VydmVyPtec16fXldeXINeo16nXldedPC9hc3A6TGFiZWw+PC9hPmQCCA8UKwICZGRkAgkPFQNJaHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL1JlY2VpcHRSZXByb2R1Y3Rpb24uYXNweD92aWQ9MzE4JmxuZz1oZSZlcnI9MB7XlNei16rXpyDXkNeZ16nXldeoINeq16nXnNeV150e15TXoteq16cg15DXmdep15XXqCDXqtep15zXldedZAIKDxUDU2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9TZWN1cmVGb2xkZXIvQ2hlY2tPcmRlclN0YXR1cy5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wG9eq16nXnNeV157XmdedINep15HXldem16LXlRvXqtep15zXldee15nXnSDXqdeR15XXptei15VkAgsPFQM0L1ZvdWNoZXIvSW5wdXRQYWdlLmFzcHg/dmlkPTMxOCZsbmc9aGUmY2xlYXJiYXNrZXQ9MRPXqdei16gg15TXqdeZ16jXldeqE9ep16LXqCDXlNep15nXqNeV16pkAgwPFQMTaHR0cHM6Ly93d3cuZ292LmlsLzPXnNeQ16rXqCDXnNep15nXqNeV16rXmdedINeV15zXnteZ15PXoiDXntee16nXnNeq15kz15zXkNeq16gg15zXqdeZ16jXldeq15nXnSDXldec157XmdeT16Ig157Xntep15zXqteZZAINDxQrAgFkZAIODxUDOWh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9JbnB1dFBhZ2UuYXNweD92aWQ9MzE4JmxuZz1oZQEwATBkAg8PFQM5aHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0lucHV0UGFnZS5hc3B4P3ZpZD0zMTgmbG5nPWVuATABMGQCEA8VAzlodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvSW5wdXRQYWdlLmFzcHg/dmlkPTMxOCZsbmc9YXIBMAEwZAICD2QWBGYPFQEb16jXqdeZ157XqiDXlNep15nXqNeV16rXmdedZAIBDzwrAAkBAA8WBB4IRGF0YUtleXMWAB4LXyFJdGVtQ291bnQCAWQWAmYPZBYCZg8VAjlodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvSW5wdXRQYWdlLmFzcHg/dmlkPTMxOCZsbmc9aGUP16rXmdenINee16jXm9eWZAIDDxUDM2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzLzNodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL2ltYWdlcy8DcnRsZAIEDxUCM2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzLwJoZWQCBQ8PFgIeBFRleHQFHNeU15bXoNeqINek16jXmNeZINeU15fXmdeZ15FkZAIGDxUCM2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzLzNodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL2ltYWdlcy9kAgkPZBYCZg9kFhhmDxUCBWN0bDAwATZkAgEPFgIeBXN0eWxlBQx2aXNpYmxlOnRydWVkAgIPZBYCZg8WAh8HBQxkaXNwbGF5Om5vbmUWAmYPZBYCAgEPDxYEHhFDb250cm9sVG9WYWxpZGF0ZQUNdHh0UmFkaW9DaGVjax4MRXJyb3JNZXNzYWdlBSbXkNeg15Ag15HXl9eoINeQ16og16HXldeSINeU16nXmdeo15XXqmRkAgMPZBYCZg8VARPXlNeW16DXqiDXpNeo15jXmdedZAIFDxUBDGRpc3BsYXk6bm9uZWQCBw8VAQxkaXNwbGF5Om5vbmVkAgkPDxYCHglNYXhMZW5ndGhmZGQCCg8PFgIeB0VuYWJsZWRoZGQCCw8PFgIfC2hkZAIMDw8WAh8LaGRkAg4PZBYCZg8WAh4IZGlzYWJsZWRkZAIPDw8WBB4ISW1hZ2VVcmwFTGh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzL2J1dHRvbnMvaGVfYnV0X2FjY2VwdC5naWYeDUFsdGVybmF0ZVRleHQFCteQ15nXqdeV16gWCh4FdGl0bGUFCteQ15nXqdeV16geA2FsdAUK15DXmdep15XXqB4Lb25tb3VzZW92ZXIFZWphdmFzY3JpcHQ6dGhpcy5zcmM9J2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzL2J1dHRvbnMvaGVfYnV0X2FjY2VwdF9vbi5naWYnHgpvbm1vdXNlb3V0BWJqYXZhc2NyaXB0OnRoaXMuc3JjPSdodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL2ltYWdlcy9idXR0b25zL2hlX2J1dF9hY2NlcHQuZ2lmJx4Lb25tb3VzZWRvd24FamphdmFzY3JpcHQ6dGhpcy5zcmM9J2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vVm91Y2hlcnMvaW1hZ2VzL2J1dHRvbnMvaGVfYnV0X2FjY2VwdF9vbmNsaWNrLmdpZidkAgoPFQEzaHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0Rlc2lnbi9Wb3VjaGVycy9pbWFnZXMvZAIMDxUCP2h0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9EZXNpZ24vQ291cnRGaW5lc0NvbGxlY3Rpb24vaW1hZ2VzLzNodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvRGVzaWduL1ZvdWNoZXJzL2ltYWdlcy9kAg4PZBYIZg8WBB4FY2xhc3MFEGhlX3Byb2dyZXNzXzFfb24eBVRpdGxlBRPXlNeW16DXqiDXpNeo15jXmdedZAIBDxYEHxQFFWhlX3Byb2dyZXNzXzJfZGlzYWJsZR8VBRPXpNeo15jXmSDXqtep15zXldedZAICDxYEHxQFFWhlX3Byb2dyZXNzXzNfZGlzYWJsZR8VBQrXqtep15zXldedZAIDDxYEHxQFFWhlX3Byb2dyZXNzXzRfZGlzYWJsZR8VBQrXkNeZ16nXldeoZAIPD2QWDGYPFQES15fXqdeV15Eg15zXk9ei16ohZAICDxUBPmh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9TZWN1cml0eS5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wZAIEDxUBxAHXnNep15nXnteV16kg15HXqdeZ16jXldeqINeW15Qg15nXqSDXnNeV15XXk9eQPGJyPiDXkNek16nXqNeV16og16nXqteZ15zXqiDXoteV15LXmdeV16ogKENvb2tpZXMpPGJyPjxicj7XkdeZ16bXldeiINeU16rXqdec15XXnteZ150g15HXkNee16bXoteV16og15TXkNeq16gg15nXotep15Qg15HXkNeX15Mg157XlNei16jXldem15nXnTo8YnI+ZAIFDxUBhgQ8Yj7Xm9eo15jXmdeh15kg15DXqdeo15DXmTo8L2I+DQo8YnI+15DXpNep16jXldeZ15XXqiDXlNeq16nXnNeV150g15zXpNeZINeU16jXm9eRINeU16HXnDo8YnIgLz48dWw+DQogICAgPGxpPtei15HXldeoINek16jXmdeYINeQ15fXkywg16DXmdeq158g15zXqdec150g16LXkyAzNSwwMDAg4oKqINeR16rXqdec15XXnSDXqNeS15nXnCDXkNeVINeR16rXqdec15XXnteZINen16jXk9eZ15guPC9saT4NCiAgICA8bGk+16LXkdeV16gg15nXldeq16gg157XpNeo15nXmCDXkNeX15MsINeg15nXqtefINec16nXnNedINei15MgMTUsMDAwIOKCqiDXnNek16jXmdeYICjXnNec15Ag15TXkteR15zXqiDXnteh16TXqCDXpNeo15nXmNeZ150pINeR16rXqdec15XXnSDXqNeS15nXnCDXkNeVINeR16rXqdec15XXnteZINen16jXk9eZ15guPC9saT4NCiAgICA8bGk+15HXmdeq16gg15TXnten16jXmdedLCDXoNeZ16rXnyDXnNep15zXnSDXkdeq16nXnNeV157XmSDXp9eo15PXmdeYINeR15zXkdeTLjwvbGk+DQo8L3VsPmQCBg8VAZkEPGI+15HXkNee16bXoteV16og15TXoteR16jXlCDXkdeg16fXkNeZ16o6PC9iPiDXkdeR16DXpyDXnNeQ15XXnteZLCDXkdeR16DXpyDXk9eZ16HXp9eV16DXmCwg15HXkdeg16cg15TXpNeV16LXnNeZ150sINeR15HXoNenINeQ15LXldeTLCDXkdeR16DXpyDXkNeV16bXqCDXlNeX15nXmdecLCDXkdeR16DXpyDXnteo15vXoNeq15nXnCwg15HXkdeg16cg157Xlteo15fXmS3XmNek15fXldeqLCDXkdeR16DXpyDXmdeVLdeR16DXpywg15HXkdeg16cg15TXkdeZ16DXnNeQ15XXnteZICwg15HXkdeg16cg157XodeTINeV15HXkdeg16cg16TXkNeSIteZICjXoNeT16jXqSDXnteg15XXmSDXnNep16jXldeq15kg15TXkNeZ16DXmNeo16DXmCDXqdecINeU15HXoNenINeV15HXm9ec15zXnSDXkNeZ16nXldeoINec15HXmdem15XXoiDXlNei15HXqNeV16og16bXkyDXkicpLiDXnteV157XnNelINec16rXkNedINei150g16HXoNeZ16MgICDXlNeR16DXpyDXqtep15zXldee15nXnSDXkdeh15vXldee15nXnSDXkteR15XXlNeZ150g15HXnteZ15XXl9eTZAIIDxUBUGh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9TZWN1cmVGb2xkZXIvQ3JlYXRlUHJvZmlsZS5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wZAIQD2QWDGYPFQM7aHR0cHM6Ly9lY29tLmdvdi5pbC9Wb3VjaGVyL0Fib3V0LmFzcHg/dmlkPTMxOCZsbmc9aGUmZXJyPTAK15DXldeT15XXqgrXkNeV15PXldeqZAIBDxUDPWh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9Db250YWN0LmFzcHg/dmlkPTMxOCZsbmc9aGUmZXJyPTAN16bXldeoINen16nXqA3XpteV16gg16fXqdeoZAICDxUDPmh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9TZWN1cml0eS5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wGdeQ15HXmNeX15Qg15XXpNeo15jXmdeV16oZ15DXkdeY15fXlCDXldek16jXmNeZ15XXqmQCAw8VAzpodHRwczovL2Vjb20uZ292LmlsL1ZvdWNoZXIvSGVscC5hc3B4P3ZpZD0zMTgmbG5nPWhlJmVycj0wCNei15bXqNeUCNei15bXqNeUZAIEDxUDQGh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9Db3B5cmlnaHRzLmFzcHg/dmlkPTMxOCZsbmc9aGUmZXJyPTAK16rXp9eg15XXnwrXqten16DXldefZAIFDxUCQGh0dHBzOi8vZWNvbS5nb3YuaWwvVm91Y2hlci9Db3B5cmlnaHRzLmFzcHg/dmlkPTMxOCZsbmc9aGUmZXJyPTA/15vXnCDXlNeW15vXldeZ15XXqiDXqdee15XXqNeV16ogMjAwNiwg157Xk9eZ16DXqiDXmdep16jXkNecIMKpZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WBgUUY3RsMDAkc2VydmljZVNlbGVjdDEFFGN0bDAwJHNlcnZpY2VTZWxlY3QyBRRjdGwwMCRzZXJ2aWNlU2VsZWN0MwUUY3RsMDAkc2VydmljZVNlbGVjdDQFFGN0bDAwJHNlcnZpY2VTZWxlY3Q1BRBjdGwwMCRidG5Db25maXJtlj2DZaWoKoBBig2DC/LniQush95+XUnm3gydZKkUcaI= \ No newline at end of file
diff --git a/tests/test_viewstate.py b/tests/test_viewstate.py
index 258eb7f..0b69e1d 100644
--- a/tests/test_viewstate.py
+++ b/tests/test_viewstate.py
@@ -10,7 +10,7 @@ class TestViewState(object):
assert not vs.is_valid()
def test_is_valid(self):
- for s in ['ngcs', 'mot']:
+ for s in ['ngcs', 'mot', 'ecom']:
with open(f'tests/samples/{s}.sample', 'r') as f:
vs = ViewState(f.read())
assert vs.is_valid() is True
diff --git a/viewstate/parse.py b/viewstate/parse.py
index 7620f25..b9d2ae1 100644
--- a/viewstate/parse.py
+++ b/viewstate/parse.py
@@ -26,8 +26,9 @@ def parse_int(b):
def parse_string(b):
n = b[0]
- s = b[1:n+1]
- return s.decode(), b[n+1:]
+ n, remain = parse_int(b)
+ s = remain[:n]
+ return s.decode(), remain[n:]
def parse_enum(b):
if b[0] == 0x29:
@@ -42,10 +43,17 @@ def parse_pair(b):
second, remain = parse(remain)
return (first, second), remain
+def parse_str_array(b):
+ n, remain = parse_int(b)
+ l = []
+ for _ in range(n):
+ val, remain = parse_string(remain)
+ l.append(val)
+ return l, remain
+
def parse_array(b):
- n = b[0]
+ n, remain = parse_int(b)
l = []
- remain = b[1:]
for _ in range(n):
val, remain = parse(remain)
l.append(val)
@@ -61,6 +69,14 @@ def parse_dict(b):
d[k] = v
return d, remain
+def parse_type(b):
+ if b[0] in (0x29, 0x2a):
+ return parse_string(b[1:])
+ elif b[0] == 0x2b:
+ return parse_int(b[1:])
+ else:
+ raise ViewStateException(f'Unknown type flag at {len(b)} bytes {b[:20]}')
+
def parse(b):
if not b:
return None
@@ -77,11 +93,15 @@ def parse(b):
return parse_enum(b[1:])
elif b[0] == 0xf:
return parse_pair(b[1:])
+ elif b[0] == 0x14:
+ return parse_type(b[1:])
+ elif b[0] == 0x15:
+ return parse_str_array(b[1:])
elif b[0] == 0x16:
return parse_array(b[1:])
elif b[0] == 0x18:
return parse_dict(b[1:])
else:
- raise ViewStateException('Unable to parse remainder of bytes {}'.format(b))
+ raise ViewStateException(f'Unable to parse remainder of {len(b)} bytes {b[:20]}')
return b, bytes()