Fix HTTPS mod bug, add proxy-or-die, sort exceptions for import, capitalize mods

This commit is contained in:
Ilya Ig. Petrov 2017-03-31 10:33:52 +00:00
parent 1f1e3bd033
commit 20fef07f08
6 changed files with 82 additions and 56 deletions

View File

@ -253,6 +253,12 @@
error: "net::ERR_PAC_SCRIPT_FAILED",
fatal: false,
*/
const ifConFail = details.error === 'net::ERR_PROXY_CONNECTION_FAILED';
if (ifConFail) {
// Happens if you return neither prixies nor "DIRECT".
// Ignore it.
return;
}
console.warn('PAC ERROR', details);
// TOOD: add "view pac script at this line" button.
handlers.mayNotify('pac-error', 'Ошибка PAC!',

View File

@ -33,17 +33,23 @@
desc: 'Пытается запретить скрипту использовать DNS, без которого определение блокировки по IP работать не будет (т.е. будет разблокироваться меньше сайтов). Используйте, чтобы получить прирост в производительности или если вам кажется, что мы проксируем слишком много сайтов. Запрет действует только для скрипта, браузер и др.программы продолжат использование DNS.',
index: 2,
},
ifProxyOrDie: {
dflt: true,
label: 'проксируй или умри!',
desc: 'Запрещает соединение с сайтами напрямую без прокси в случаях, когда все прокси отказывают. Например, если все ВАШИ прокси вдруг недоступны, то добавленные вручную сайты открываться не будут совсем.',
index: 3,
},
ifUsePacScriptProxies: {
dflt: true,
label: 'использовать прокси PAC-скрипта',
desc: 'Использовать прокси-сервера от авторов PAC-скрипта.',
index: 3,
index: 4,
},
ifUseLocalTor: {
dflt: false,
label: 'использовать СВОЙ локальный TOR',
desc: 'Установите <a href="https://rebrand.ly/ac-tor">TOR</a> на свой компьютер и используйте его как прокси-сервер. <a href="https://rebrand.ly/ac-tor">ВАЖНО</a>',
index: 4,
label: 'использовать СВОЙ локальный Tor',
desc: 'Установите <a href="https://rebrand.ly/ac-tor">Tor</a> на свой компьютер и используйте его как прокси-сервер. <a href="https://rebrand.ly/ac-tor">ВАЖНО</a>',
index: 5,
},
exceptions: {
dflt: null,
@ -52,13 +58,13 @@
dflt: true,
label: 'учитывать исключения',
desc: 'Учитывать сайты, добавленные вручную. Только для своих прокси-серверов! Без своих прокси работать не будет.',
index: 5,
index: 6,
},
customProxyStringRaw: {
dflt: '',
label: 'использовать СВОИ прокси',
url: 'https://rebrand.ly/ac-own-proxy',
index: 6,
index: 7,
},
};
@ -76,7 +82,11 @@
const getCurrentConfigs = function getCurrentConfigs() {
return kitchenState(modsKey) || getDefaults();
const [err, mods, ...warns] = createPacModifiers( kitchenState(modsKey) );
if (err) {
throw err;
}
return mods;
};
@ -102,8 +112,8 @@
const defaults = getDefaults();
const ifAllDefaults = Object.keys(defaults)
.every(
(prop) => !(prop in mods)
|| Boolean(defaults[prop]) === Boolean(mods[prop])
(dProp) => !(dProp in mods)
|| Boolean(defaults[dProp]) === Boolean(mods[dProp])
);
console.log('Input mods:', mods);
@ -148,6 +158,14 @@
self.excluded.push(host);
}
}
['included', 'excluded'].forEach((who) => {
self[who] = self[who]
.map( (s) => s.split('').reverse() )
.sort()
.map( (a) => a.reverse().join('') );
});
if (self.included.length && !self.filteredCustomsString) {
return [null, self, new TypeError(
'Имеются сайты, добавленные вручную. Они проксироваться не будут, т.к. нет СВОИХ проски, удовлетворяющих вашим запросам!'
@ -175,15 +193,18 @@
let res = pacMods.ifProhibitDns ? `
global.dnsResolve = function(host) { return null; };
` : '';
` : '';
if (pacMods.ifProxyHttpsUrlsOnly) {
res += `
if (!url.startsWith("https")) {
return "DIRECT";
}
`;
`;
}
res += `
const directIfAllowed = ${pacMods.ifProxyOrDie ? '""/* Not allowed. */' : '"; DIRECT"'};
`;
const ifIncluded = pacMods.included && pacMods.included.length;
const ifExcluded = pacMods.excluded && pacMods.excluded.length;
@ -191,6 +212,7 @@
if (ifExceptions) {
res += `
/* EXCEPTIONS START */
const dotHost = '.' + host;
const isHostInDomain = (domain) => dotHost.endsWith('.' + domain);
const domainReducer = (maxWeight, [domain, ifIncluded]) => {
@ -209,45 +231,35 @@
const excWeight = ${JSON.stringify(Object.entries(pacMods.exceptions))}.reduce( domainReducer, 0 );
if (excWeight !== 0) {
if (excWeight > 0) {
return "${pacMods.filteredCustomsString}; DIRECT";
// Always proxy it!
return "${pacMods.filteredCustomsString}" + directIfAllowed;
} else {
// Never proxy it!
return "DIRECT";
}
}
/* EXCEPTIONS END */
`;
}
/*
if (ifIncluded) {
res += `
if (${JSON.stringify(pacMods.included)}.some(isHostInDomain)) {
}
`;
}
if (ifExcluded) {
res += `
if (${JSON.stringify(pacMods.excluded)}.some(isHostInDomain)) {
return "DIRECT";
}
`;
}
*/
const pacProxyString = originalFindProxyForURL(url, host)${
pacMods.ifProxyOrDie ? '.replace(/DIRECT/g, "")' : ' + directIfAllowed'
};`;
if(
!pacMods.ifUseSecureProxiesOnly &&
!pacMods.filteredCustomsString &&
pacMods.ifUsePacScriptProxies
) {
return res + `
return originalFindProxyForURL(url, host);
`;
return pacProxyString;`;
}
return res + `
const pacProxyString = originalFindProxyForURL(url, host);
let pacProxyArray = pacProxyString.split(/(?:\\s*;\\s*)+/g).filter( (p) => p );
if (pacProxyArray.every( (p) => /^DIRECT$/i.test(p) )) {
const ifNoProxies = pacProxyArray${pacMods.ifProxyOrDie ? '.length === 0' : '.every( (p) => /^DIRECT$/i.test(p) )'};
if (ifNoProxies) {
// Directs only or null, no proxies.
return pacProxyString;
return "DIRECT";
}
return ` +
function() {
@ -258,14 +270,14 @@
let filteredPacExp = 'pacProxyString';
if (pacMods.ifUseSecureProxiesOnly) {
filteredPacExp =
'pacProxyArray.filter( (pStr) => /^HTTPS\s/.test(pStr) ).join("; ")';
'pacProxyArray.filter( (pStr) => /^HTTPS\\s/.test(pStr) ).join("; ")';
}
if ( !pacMods.filteredCustomsString ) {
return filteredPacExp;
}
return `${filteredPacExp} + "; ${pacMods.filteredCustomsString}"`;
}() + ' + "; DIRECT";'; // Without DIRECT you will get 'PROXY CONN FAILED' pac-error.
}() + ' + directIfAllowed;'; // Without DIRECT you will get 'PROXY CONN FAILED' pac-error.
}()}

View File

@ -438,7 +438,7 @@
};
// ON EACH LAUNCH, STARTUP, RELOAD, UPDATE, ENABLE
chrome.storage.local.get(null, chromified( (err, oldStorage) => {
chrome.storage.local.get(null, chromified( async (err, oldStorage) => {
if (err) {
throw err;
@ -508,13 +508,16 @@
*/
const ifUpdating = antiCensorRu.version !== oldStorage.version;
await new Promise((resolve) => {
if (!ifUpdating) {
// LAUNCH, RELOAD, ENABLE
antiCensorRu.pacProviders = oldStorage.pacProviders;
console.log('Extension launched, reloaded or enabled.');
return resolve();
} else {
}
// UPDATE & MIGRATION
console.log('Updating from ', oldStorage.version, 'to', antiCensorRu.version);
@ -530,21 +533,20 @@
antiCensorRu._currentPacProviderKey = 'Антизапрет';
}
}
console.log('Extension updated.');
}
antiCensorRu.pushToStorageAsync(() =>
window.apis.pacKitchen.keepCookedNowAsync(() => {
console.log('Extension updated.');
resolve();
})
);
});
if (antiCensorRu.getPacProvider()) {
const ifAlarmTriggered = antiCensorRu.setAlarms();
if (ifAlarmTriggered) {
return; // Already pushed.
}
}
if( ifUpdating ) {
antiCensorRu.pushToStorageAsync();
antiCensorRu.setAlarms();
}
/*

View File

@ -305,6 +305,12 @@
/* TAB_2 PAC MODS */
#pac-mods label {
display: block;
}
#pac-mods label:first-letter {
text-transform: uppercase;
}
#mods-custom-proxy-string-raw ~ textarea {
width: 100%;
height: 7em;
@ -468,7 +474,7 @@
<div id="exc-address">
<span>*.</span><input placeholder="navalny.com" list="exc-list" name="browser" id="exc-editor" style=""/>
</div>
<a href="../exceptions/index.html" title="импорт-экспорт"><svg
<a href="../exceptions/index.html" title="импорт/экспорт"><svg
class="icon"
><use xlink:href="#icon-import-export"></use></svg>
</a>

View File

@ -2,7 +2,7 @@
<html style="display: none; will-change: contents, display">
<head>
<meta charset="utf-8">
<title>Импорт-экспорт исключений</title>
<title>Импорт/экспорт исключений</title>
<style>
@font-face {
font-family: "emoji";

View File

@ -16,7 +16,7 @@ chrome.runtime.getBackgroundPage( (backgroundPage) =>
# Комментарии НЕ сохраняются!
# Сначала идёт список проксируемых сайтов,
# затем ==== на отдельной строке,
# затем исключённые сайты.
# затем исключённые сайты, отсортированные с конца строки.
# ПРОКСИРОВАТЬ: