62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
"""Parsing and executing JavaScript code"""
|
|
|
|
import base64
|
|
import regex
|
|
import js2py
|
|
|
|
# Thanks to http://regex.inginf.units.it/
|
|
arrowexp = regex.compile(r'\w[^\}]*+')
|
|
|
|
|
|
def to_ecma5_function(f: str) -> str:
|
|
"""Converts a ECMA6 function
|
|
to ECMA5 format (without arrow expressions)
|
|
|
|
Args:
|
|
f (str): ECMA6 function
|
|
|
|
Returns:
|
|
ECMA5 function
|
|
"""
|
|
|
|
f = regex.sub(r'/\*.+?\*/', '', f)
|
|
match = arrowexp.search(f)
|
|
conv = '(function(){' + match.group(0) + '})()'
|
|
return regex.sub(
|
|
r'(?:s|\(s\)) => s.split\([\'"]{2}\).reverse\(\).join\([\'"]{2}\)',
|
|
'function(s){return s.split(\'\').reverse().join(\'\')}',
|
|
conv
|
|
)
|
|
|
|
|
|
def atob(s: str) -> str:
|
|
"""Decodes base64 string
|
|
|
|
Args:
|
|
s (str): Encoded data
|
|
|
|
Returns:
|
|
Decoded string
|
|
"""
|
|
|
|
return base64.standard_b64decode(str(s)).decode('utf-8')
|
|
|
|
|
|
def exec_js(f: str) -> js2py.EvalJs:
|
|
"""Executes a JavaScript function
|
|
|
|
Args:
|
|
f (str): ECMA6 function
|
|
|
|
Returns:
|
|
JavaScript interpreter context
|
|
"""
|
|
|
|
ctx = js2py.EvalJs({'atob': atob})
|
|
ctx.execute('window.document = { };')
|
|
ctx.execute('window.Map = function(_i){ };')
|
|
ctx.execute('window.setTimeout = function(_f,_t){ };')
|
|
ctx.execute('window.setInterval = function(_f,_t){ };')
|
|
ctx.execute('window.encodeURIComponent = function(_s){ };')
|
|
ctx.execute(to_ecma5_function(f))
|
|
return ctx
|