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", error: "net::ERR_PAC_SCRIPT_FAILED",
fatal: false, 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); console.warn('PAC ERROR', details);
// TOOD: add "view pac script at this line" button. // TOOD: add "view pac script at this line" button.
handlers.mayNotify('pac-error', 'Ошибка PAC!', handlers.mayNotify('pac-error', 'Ошибка PAC!',

View File

@ -33,17 +33,23 @@
desc: 'Пытается запретить скрипту использовать DNS, без которого определение блокировки по IP работать не будет (т.е. будет разблокироваться меньше сайтов). Используйте, чтобы получить прирост в производительности или если вам кажется, что мы проксируем слишком много сайтов. Запрет действует только для скрипта, браузер и др.программы продолжат использование DNS.', desc: 'Пытается запретить скрипту использовать DNS, без которого определение блокировки по IP работать не будет (т.е. будет разблокироваться меньше сайтов). Используйте, чтобы получить прирост в производительности или если вам кажется, что мы проксируем слишком много сайтов. Запрет действует только для скрипта, браузер и др.программы продолжат использование DNS.',
index: 2, index: 2,
}, },
ifProxyOrDie: {
dflt: true,
label: 'проксируй или умри!',
desc: 'Запрещает соединение с сайтами напрямую без прокси в случаях, когда все прокси отказывают. Например, если все ВАШИ прокси вдруг недоступны, то добавленные вручную сайты открываться не будут совсем.',
index: 3,
},
ifUsePacScriptProxies: { ifUsePacScriptProxies: {
dflt: true, dflt: true,
label: 'использовать прокси PAC-скрипта', label: 'использовать прокси PAC-скрипта',
desc: 'Использовать прокси-сервера от авторов PAC-скрипта.', desc: 'Использовать прокси-сервера от авторов PAC-скрипта.',
index: 3, index: 4,
}, },
ifUseLocalTor: { ifUseLocalTor: {
dflt: false, dflt: false,
label: 'использовать СВОЙ локальный TOR', label: 'использовать СВОЙ локальный Tor',
desc: 'Установите <a href="https://rebrand.ly/ac-tor">TOR</a> на свой компьютер и используйте его как прокси-сервер. <a href="https://rebrand.ly/ac-tor">ВАЖНО</a>', desc: 'Установите <a href="https://rebrand.ly/ac-tor">Tor</a> на свой компьютер и используйте его как прокси-сервер. <a href="https://rebrand.ly/ac-tor">ВАЖНО</a>',
index: 4, index: 5,
}, },
exceptions: { exceptions: {
dflt: null, dflt: null,
@ -52,13 +58,13 @@
dflt: true, dflt: true,
label: 'учитывать исключения', label: 'учитывать исключения',
desc: 'Учитывать сайты, добавленные вручную. Только для своих прокси-серверов! Без своих прокси работать не будет.', desc: 'Учитывать сайты, добавленные вручную. Только для своих прокси-серверов! Без своих прокси работать не будет.',
index: 5, index: 6,
}, },
customProxyStringRaw: { customProxyStringRaw: {
dflt: '', dflt: '',
label: 'использовать СВОИ прокси', label: 'использовать СВОИ прокси',
url: 'https://rebrand.ly/ac-own-proxy', url: 'https://rebrand.ly/ac-own-proxy',
index: 6, index: 7,
}, },
}; };
@ -76,7 +82,11 @@
const getCurrentConfigs = function getCurrentConfigs() { 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 defaults = getDefaults();
const ifAllDefaults = Object.keys(defaults) const ifAllDefaults = Object.keys(defaults)
.every( .every(
(prop) => !(prop in mods) (dProp) => !(dProp in mods)
|| Boolean(defaults[prop]) === Boolean(mods[prop]) || Boolean(defaults[dProp]) === Boolean(mods[dProp])
); );
console.log('Input mods:', mods); console.log('Input mods:', mods);
@ -148,6 +158,14 @@
self.excluded.push(host); 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) { if (self.included.length && !self.filteredCustomsString) {
return [null, self, new TypeError( return [null, self, new TypeError(
'Имеются сайты, добавленные вручную. Они проксироваться не будут, т.к. нет СВОИХ проски, удовлетворяющих вашим запросам!' 'Имеются сайты, добавленные вручную. Они проксироваться не будут, т.к. нет СВОИХ проски, удовлетворяющих вашим запросам!'
@ -175,15 +193,18 @@
let res = pacMods.ifProhibitDns ? ` let res = pacMods.ifProhibitDns ? `
global.dnsResolve = function(host) { return null; }; global.dnsResolve = function(host) { return null; };
` : ''; ` : '';
if (pacMods.ifProxyHttpsUrlsOnly) { if (pacMods.ifProxyHttpsUrlsOnly) {
res += ` res += `
if (!url.startsWith("https")) { if (!url.startsWith("https")) {
return "DIRECT"; return "DIRECT";
} }
`; `;
} }
res += `
const directIfAllowed = ${pacMods.ifProxyOrDie ? '""/* Not allowed. */' : '"; DIRECT"'};
`;
const ifIncluded = pacMods.included && pacMods.included.length; const ifIncluded = pacMods.included && pacMods.included.length;
const ifExcluded = pacMods.excluded && pacMods.excluded.length; const ifExcluded = pacMods.excluded && pacMods.excluded.length;
@ -191,6 +212,7 @@
if (ifExceptions) { if (ifExceptions) {
res += ` res += `
/* EXCEPTIONS START */
const dotHost = '.' + host; const dotHost = '.' + host;
const isHostInDomain = (domain) => dotHost.endsWith('.' + domain); const isHostInDomain = (domain) => dotHost.endsWith('.' + domain);
const domainReducer = (maxWeight, [domain, ifIncluded]) => { const domainReducer = (maxWeight, [domain, ifIncluded]) => {
@ -209,45 +231,35 @@
const excWeight = ${JSON.stringify(Object.entries(pacMods.exceptions))}.reduce( domainReducer, 0 ); const excWeight = ${JSON.stringify(Object.entries(pacMods.exceptions))}.reduce( domainReducer, 0 );
if (excWeight !== 0) { if (excWeight !== 0) {
if (excWeight > 0) { if (excWeight > 0) {
return "${pacMods.filteredCustomsString}; DIRECT"; // Always proxy it!
return "${pacMods.filteredCustomsString}" + directIfAllowed;
} else { } else {
// Never proxy it!
return "DIRECT"; return "DIRECT";
} }
} }
/* EXCEPTIONS END */
`; `;
} }
/*
if (ifIncluded) {
res += ` res += `
if (${JSON.stringify(pacMods.included)}.some(isHostInDomain)) { const pacProxyString = originalFindProxyForURL(url, host)${
} pacMods.ifProxyOrDie ? '.replace(/DIRECT/g, "")' : ' + directIfAllowed'
`; };`;
}
if (ifExcluded) {
res += `
if (${JSON.stringify(pacMods.excluded)}.some(isHostInDomain)) {
return "DIRECT";
}
`;
}
*/
if( if(
!pacMods.ifUseSecureProxiesOnly && !pacMods.ifUseSecureProxiesOnly &&
!pacMods.filteredCustomsString && !pacMods.filteredCustomsString &&
pacMods.ifUsePacScriptProxies pacMods.ifUsePacScriptProxies
) { ) {
return res + ` return res + `
return originalFindProxyForURL(url, host); return pacProxyString;`;
`;
} }
return res + ` return res + `
const pacProxyString = originalFindProxyForURL(url, host);
let pacProxyArray = pacProxyString.split(/(?:\\s*;\\s*)+/g).filter( (p) => p ); 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. // Directs only or null, no proxies.
return pacProxyString; return "DIRECT";
} }
return ` + return ` +
function() { function() {
@ -258,14 +270,14 @@
let filteredPacExp = 'pacProxyString'; let filteredPacExp = 'pacProxyString';
if (pacMods.ifUseSecureProxiesOnly) { if (pacMods.ifUseSecureProxiesOnly) {
filteredPacExp = filteredPacExp =
'pacProxyArray.filter( (pStr) => /^HTTPS\s/.test(pStr) ).join("; ")'; 'pacProxyArray.filter( (pStr) => /^HTTPS\\s/.test(pStr) ).join("; ")';
} }
if ( !pacMods.filteredCustomsString ) { if ( !pacMods.filteredCustomsString ) {
return filteredPacExp; return filteredPacExp;
} }
return `${filteredPacExp} + "; ${pacMods.filteredCustomsString}"`; 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 // 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) { if (err) {
throw err; throw err;
@ -508,13 +508,16 @@
*/ */
const ifUpdating = antiCensorRu.version !== oldStorage.version; const ifUpdating = antiCensorRu.version !== oldStorage.version;
await new Promise((resolve) => {
if (!ifUpdating) { if (!ifUpdating) {
// LAUNCH, RELOAD, ENABLE // LAUNCH, RELOAD, ENABLE
antiCensorRu.pacProviders = oldStorage.pacProviders; antiCensorRu.pacProviders = oldStorage.pacProviders;
console.log('Extension launched, reloaded or enabled.'); console.log('Extension launched, reloaded or enabled.');
return resolve();
} else { }
// UPDATE & MIGRATION // UPDATE & MIGRATION
console.log('Updating from ', oldStorage.version, 'to', antiCensorRu.version); console.log('Updating from ', oldStorage.version, 'to', antiCensorRu.version);
@ -530,21 +533,20 @@
antiCensorRu._currentPacProviderKey = 'Антизапрет'; antiCensorRu._currentPacProviderKey = 'Антизапрет';
} }
} }
console.log('Extension updated.');
} antiCensorRu.pushToStorageAsync(() =>
window.apis.pacKitchen.keepCookedNowAsync(() => {
console.log('Extension updated.');
resolve();
})
);
});
if (antiCensorRu.getPacProvider()) { if (antiCensorRu.getPacProvider()) {
antiCensorRu.setAlarms();
const ifAlarmTriggered = antiCensorRu.setAlarms();
if (ifAlarmTriggered) {
return; // Already pushed.
}
}
if( ifUpdating ) {
antiCensorRu.pushToStorageAsync();
} }
/* /*

View File

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

View File

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

View File

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