-
Notifications
You must be signed in to change notification settings - Fork 9
/
abp_rewrite.py
88 lines (69 loc) · 2.39 KB
/
abp_rewrite.py
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# This Source Code is subject to the terms of the Mozilla Public License
# version 2.0 (the "License"). You can obtain a copy of the License at
# http://mozilla.org/MPL/2.0/.
import os
import platform
import io
import zipfile
import subprocess
try:
from urllib.request import urlopen
except ImportError:
import urllib2
import contextlib
def urlopen(*args, **kwargs):
return contextlib.closing(urllib2.urlopen(*args, **kwargs))
JSSHELL_DIR = 'mozilla-esr45'
JSSHELL_URL = ('https://ftp.mozilla.org/pub/mozilla.org/firefox/nightly'
'/2016/05/2016-05-29-00-15-03-{}'
'/jsshell-{{}}.zip'.format(JSSHELL_DIR))
JSSHELL_SUPPORTED_PLATFORMS = {
'Windows': 'win32',
'Linux': {
'i686': 'linux-i686',
'x86_64': 'linux-x86_64'
},
'Darwin': 'mac'
}
def ensure_jsshell():
path = os.environ.get('SPIDERMONKEY_BINARY')
if path and os.path.isfile(path):
return path
system = platform.system()
try:
build = JSSHELL_SUPPORTED_PLATFORMS[system]
if isinstance(build, dict):
build = build[platform.machine()]
except KeyError:
raise Exception('Platform {} ({}) not supported by JS shell'.format(
system, platform.machine()
))
shell_dir = os.path.join(os.path.dirname(__file__),
'{}-{}'.format(JSSHELL_DIR, build))
if not os.path.exists(shell_dir):
os.makedirs(shell_dir)
if system == 'Windows':
path = os.path.join(shell_dir, 'js.exe')
else:
path = os.path.join(shell_dir, 'js')
if os.path.exists(path):
return path
with urlopen(JSSHELL_URL.format(build)) as response:
data = response.read()
with zipfile.ZipFile(io.BytesIO(data)) as archive:
archive.extractall(shell_dir)
if not os.path.exists(path):
raise Exception("Downloaded package doesn't contain JS shell")
try:
os.chmod(path, 0o700)
except:
pass
return path
def rewrite_js(args, script=None):
jsshell = ensure_jsshell()
env = {'LD_LIBRARY_PATH': os.path.relpath(os.path.dirname(jsshell))}
base_dir = os.path.dirname(__file__)
if not script:
script = os.path.join(base_dir, 'scripts', 'abprewrite.js')
command = [jsshell, os.path.join(base_dir, 'jshydra.js'), script] + args
return subprocess.check_output(command, env=env, universal_newlines=True)