forked from stud178875/tempora
98 lines
2.5 KiB
Python
98 lines
2.5 KiB
Python
import os
|
|
import tempfile
|
|
|
|
class ChromeProxy:
|
|
def __init__(self, host: str, port: int, username: str = "", password: str = ""):
|
|
self.host = host
|
|
self.port = port
|
|
self.username = username
|
|
self.password = password
|
|
|
|
def create_extension(self, name: str = "Chrome Proxy", version="1.0.0") -> str:
|
|
proxy_folder = tempfile.mkdtemp(prefix="chrome_proxy_")
|
|
|
|
self._create_manifest(
|
|
name=name,
|
|
version=version,
|
|
proxy_folder=proxy_folder
|
|
)
|
|
|
|
self._create_background_js(proxy_folder)
|
|
|
|
return proxy_folder
|
|
|
|
def _create_manifest(self, name, version, proxy_folder):
|
|
manifest = ChromeProxy.manifest_json
|
|
manifest = manifest.replace("<ext_name>", name)
|
|
manifest = manifest.replace("<ext_ver>", version)
|
|
|
|
with open(f"{proxy_folder}/manifest.json", "w") as f:
|
|
f.write(manifest)
|
|
|
|
def _create_background_js(self, proxy_folder):
|
|
js = ChromeProxy.background_js
|
|
js = js.replace("<proxy_host>", self.host)
|
|
js = js.replace("<proxy_port>", str(self.port))
|
|
js = js.replace("<proxy_username>", self.username)
|
|
js = js.replace("<proxy_password>", self.password)
|
|
|
|
with open(f"{proxy_folder}/background.js", "w") as f:
|
|
f.write(js)
|
|
|
|
manifest_json = """
|
|
{
|
|
"version": "<ext_ver>",
|
|
"manifest_version": 3,
|
|
"name": "<ext_name>",
|
|
"permissions": [
|
|
"proxy",
|
|
"tabs",
|
|
"storage",
|
|
"webRequest",
|
|
"webRequestAuthProvider"
|
|
],
|
|
"host_permissions": [
|
|
"<all_urls>"
|
|
],
|
|
"background": {
|
|
"service_worker": "background.js"
|
|
},
|
|
"minimum_chrome_version": "22.0.0"
|
|
}
|
|
"""
|
|
|
|
background_js = """
|
|
var config = {
|
|
mode: "fixed_servers",
|
|
rules: {
|
|
singleProxy: {
|
|
scheme: "http",
|
|
host: "<proxy_host>",
|
|
port: parseInt("<proxy_port>")
|
|
},
|
|
bypassList: ["localhost"]
|
|
}
|
|
};
|
|
|
|
chrome.proxy.settings.set({
|
|
value: config,
|
|
scope: "regular"
|
|
}, function() {});
|
|
|
|
function callbackFn(details) {
|
|
return {
|
|
authCredentials: {
|
|
username: "<proxy_username>",
|
|
password: "<proxy_password>"
|
|
}
|
|
};
|
|
}
|
|
|
|
chrome.webRequest.onAuthRequired.addListener(
|
|
callbackFn, {
|
|
urls: ["<all_urls>"]
|
|
},
|
|
['blocking']
|
|
);
|
|
"""
|