From 20fef07f084e23e9c6acbed416e0f1f5a7b2b64f Mon Sep 17 00:00:00 2001 From: "Ilya Ig. Petrov" Date: Fri, 31 Mar 2017 10:33:52 +0000 Subject: [PATCH] Fix HTTPS mod bug, add proxy-or-die, sort exceptions for import, capitalize mods --- .../extension-common/11-error-handlers-api.js | 6 ++ .../extension-common/35-pac-kitchen-api.js | 82 +++++++++++-------- ...7-sync-pac-script-with-pac-provider-api.js | 38 +++++---- .../pages/choose-pac-provider/index.html | 8 +- .../pages/exceptions/index.html | 2 +- .../pages/exceptions/index.js | 2 +- 6 files changed, 82 insertions(+), 56 deletions(-) diff --git a/extensions/chromium/runet-censorship-bypass/src/extension-common/11-error-handlers-api.js b/extensions/chromium/runet-censorship-bypass/src/extension-common/11-error-handlers-api.js index aaecb3b..b4cbac3 100644 --- a/extensions/chromium/runet-censorship-bypass/src/extension-common/11-error-handlers-api.js +++ b/extensions/chromium/runet-censorship-bypass/src/extension-common/11-error-handlers-api.js @@ -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!', diff --git a/extensions/chromium/runet-censorship-bypass/src/extension-common/35-pac-kitchen-api.js b/extensions/chromium/runet-censorship-bypass/src/extension-common/35-pac-kitchen-api.js index 7ccfb8b..dffcda2 100644 --- a/extensions/chromium/runet-censorship-bypass/src/extension-common/35-pac-kitchen-api.js +++ b/extensions/chromium/runet-censorship-bypass/src/extension-common/35-pac-kitchen-api.js @@ -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: 'Установите TOR на свой компьютер и используйте его как прокси-сервер. ВАЖНО', - index: 4, + label: 'использовать СВОЙ локальный Tor', + desc: 'Установите Tor на свой компьютер и используйте его как прокси-сервер. ВАЖНО', + 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"; - } -`; - } - */ + res += ` + 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. }()} diff --git a/extensions/chromium/runet-censorship-bypass/src/extension-common/37-sync-pac-script-with-pac-provider-api.js b/extensions/chromium/runet-censorship-bypass/src/extension-common/37-sync-pac-script-with-pac-provider-api.js index ff82404..1ba1350 100644 --- a/extensions/chromium/runet-censorship-bypass/src/extension-common/37-sync-pac-script-with-pac-provider-api.js +++ b/extensions/chromium/runet-censorship-bypass/src/extension-common/37-sync-pac-script-with-pac-provider-api.js @@ -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; - if (!ifUpdating) { + await new Promise((resolve) => { - // LAUNCH, RELOAD, ENABLE - antiCensorRu.pacProviders = oldStorage.pacProviders; - console.log('Extension launched, reloaded or enabled.'); + if (!ifUpdating) { - } else { + // LAUNCH, RELOAD, ENABLE + antiCensorRu.pacProviders = oldStorage.pacProviders; + console.log('Extension launched, reloaded or enabled.'); + return resolve(); + + } // 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(); } /* diff --git a/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.html b/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.html index 0da0e14..9f2cbfb 100644 --- a/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.html +++ b/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.html @@ -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 @@
*.
- diff --git a/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/exceptions/index.html b/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/exceptions/index.html index 590631e..82329d8 100644 --- a/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/exceptions/index.html +++ b/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/exceptions/index.html @@ -2,7 +2,7 @@ - Импорт-экспорт исключений + Импорт/экспорт исключений