Files
chrome-extenstions/foxyproxy/content/authentication.js
2026-01-20 21:53:59 +03:30

51 lines
1.5 KiB
JavaScript

// webRequest.onAuthRequired: Firefox HTTP/HTTPS/WS/WSS | Chrome: HTTP/HTTPS
// 'webRequestAuthProvider' permission Chrome 108, Firefox 126
export class Authentication {
static {
this.data = {};
// prevent bad authentication loop
this.pending = {};
// webRequest.onAuthRequired is only called for HTTP and HTTPS/TLS proxy servers
const urls = ['<all_urls>'];
browser.webRequest.onAuthRequired.addListener(e => this.process(e), {urls}, ['blocking']);
browser.webRequest.onCompleted.addListener(e => this.clearPending(e), {urls});
browser.webRequest.onErrorOccurred.addListener(e => this.clearPending(e), {urls});
}
static init(data) {
// reset data
this.data = {};
data.forEach(i => {
const {hostname, port, username, password} = i;
hostname && port && username && password &&
(this.data[`${hostname}:${port}`] = {username, password});
});
}
static process(e) {
// true for Proxy-Authenticate, false for WWW-Authenticate
if (!e.isProxy) { return; }
// sending message to log.js
browser.runtime.sendMessage({id: 'onAuthRequired', e});
// already sent once and pending
if (this.pending[e.requestId]) {
return {cancel: true};
}
const {host, port} = e.challenger;
const authCredentials = this.data[`${host}:${port}`];
if (authCredentials) {
// prevent bad authentication loop
this.pending[e.requestId] = 1;
return {authCredentials};
}
}
static clearPending(e) {
delete this.pending[e.requestId];
}
}