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 758ce70..a2aa381 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 @@ -19,53 +19,72 @@ dflt: false, label: 'проксировать только HTTPS-сайты', desc: 'Проксировать только сайты, доступные по шифрованному протоколу HTTPS. Прокси и провайдер смогут видеть только адреса проксируемых HTTPS-сайтов, но не их содержимое. Используйте, если вы не доверяете прокси-серверам ваш HTTP-трафик. Разумеется, что с этой опцией разблокировка HTTP-сайтов работать не будет.', - index: 0, + order: 0, }, ifUseSecureProxiesOnly: { dflt: false, label: 'только шифрованная связь с прокси', desc: 'Шифровать соединение до прокси от провайдера, используя только прокси типа HTTPS или локальный Tor. Провайдер всё же сможет видеть адреса (но не содержимое) проксируемых ресурсов из протокола DNS (даже с Tor). Опция вряд ли может быть вам полезна, т.к. шифруется не весь трафик, а лишь разблокируемые ресурсы.', - index: 1, + order: 1, }, ifProhibitDns: { dflt: false, label: 'запретить опредление по IP/DNS', desc: 'Пытается запретить скрипту использовать DNS, без которого определение блокировки по IP работать не будет (т.е. будет разблокироваться меньше сайтов). Используйте, чтобы получить прирост в производительности или если вам кажется, что мы проксируем слишком много сайтов. Запрет действует только для скрипта, браузер и др.программы продолжат использование DNS.', - index: 2, + order: 2, }, ifProxyOrDie: { dflt: true, ifDfltMods: true, label: 'проксируй или умри!', desc: 'Запрещает соединение с сайтами напрямую без прокси в случаях, когда все прокси отказывают. Например, если все ВАШИ прокси вдруг недоступны, то добавленные вручную сайты открываться не будут совсем. Однако смысл опции в том, что она препятствует занесению прокси в чёрные списки Хрома. Рекомендуется не отключать.', - index: 3, + order: 3, }, ifUsePacScriptProxies: { dflt: true, + category: 'ownProxies', label: 'использовать прокси PAC-скрипта', desc: 'Использовать прокси-сервера от авторов PAC-скрипта.', - index: 4, + order: 4, }, ifUseLocalTor: { dflt: false, + category: 'ownProxies', label: 'использовать СВОЙ локальный Tor', desc: 'Установите Tor на свой компьютер и используйте его как прокси-сервер. ВАЖНО', - index: 5, + order: 5, }, exceptions: { + category: 'exceptions', dflt: null, }, ifMindExceptions: { dflt: true, + category: 'exceptions', label: 'учитывать исключения', desc: 'Учитывать сайты, добавленные вручную. Только для своих прокси-серверов! Без своих прокси работать не будет.', - index: 6, + order: 6, + }, + ifProxyErrors: { + dflt: false, + category: 'exceptions', + label: 'проксировать выбранные ошибки', + desc: 'Предлагать добавить сайт в исключения при выбранных ошибках', + order: 7, }, customProxyStringRaw: { dflt: '', + category: 'ownProxies', label: 'использовать СВОИ прокси', url: 'https://rebrand.ly/ac-own-proxy', - index: 7, + order: 8, + }, + ifProxyMoreDomains: { + dflt: false, + category: 'ownProxies', + label: 'проксировать .onion, .i2p и OpenNIC', + desc: 'Проксировать особые домены. Необходима поддержка со стороны прокси.', + order: 9, }, }; @@ -91,20 +110,24 @@ }; - const getOrderedConfigsForUser = function getOrderedConfigs() { + const getOrderedConfigsForUser = function getOrderedConfigs(category) { const pacMods = getCurrentConfigs(); - return Object.keys(configs).reduce((arr, key) => { + return Object.keys(configs) + .sort((keyA, keyB) => configs[keyA].order - configs[keyB].order) + .reduce((arr, key) => { - const conf = configs[key]; - if(typeof(conf.index) === 'number') { - arr[conf.index] = conf; - conf.value = pacMods[key]; - conf.key = key; - } - return arr; + const conf = configs[key]; + if(typeof(conf.order) === 'number') { + if(!category || category === (conf.category || 'general')) { + arr.push(conf); + conf.value = pacMods[key]; + conf.key = key; + } + } + return arr; - }, []); + }, []); }; 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 8679370..fe0d5b0 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 @@ -213,7 +213,7 @@ getSortedEntriesForProviders() { - return Object.entries(this.pacProviders).sort((entryA, entryB) => entryA[1].order - entryB[1].order); + return Object.entries(this.pacProviders).sort((entryA, entryB) => entryA[1].order - entryB[1].order).map(([key, prov]) => Object.assign({key: key}, prov)); }, 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 3efdf4e..fa67d25 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 @@ -82,6 +82,10 @@ padding-left: 1.4em; padding-right: 1.4em; } + .horizontal-list, + .horizontal-list li { + line-height: 100%; + } .horizontal-list li { display: inline-block; } @@ -147,6 +151,7 @@ :root:not(.if-options-page) #acc-pac:not(:checked) ~ .main-nav section[data-for="acc-pac"], :root:not(.if-options-page) #acc-exc:not(:checked) ~ .main-nav section[data-for="acc-exc"], + :root:not(.if-options-page) #acc-own:not(:checked) ~ .main-nav section[data-for="acc-own"], :root:not(.if-options-page) #acc-mods:not(:checked) ~ .main-nav section[data-for="acc-mods"], :root:not(.if-options-page) #acc-ntf:not(:checked) ~ .main-nav section[data-for="acc-ntf"] { @@ -164,6 +169,7 @@ } :root:not(.if-options-page) #acc-pac:not(:checked) ~ .main-nav section[data-for="acc-pac"] *, :root:not(.if-options-page) #acc-exc:not(:checked) ~ .main-nav section[data-for="acc-exc"] *, + :root:not(.if-options-page) #acc-own:not(:checked) ~ .main-nav section[data-for="acc-own"] *, :root:not(.if-options-page) #acc-mods:not(:checked) ~ .main-nav section[data-for="acc-mods"] *, :root:not(.if-options-page) #acc-ntf:not(:checked) ~ .main-nav section[data-for="acc-ntf"] * { @@ -171,47 +177,50 @@ margin-bottom: 0 !important; } .nav-labels { + background-color: #eef; text-align: center; } .nav-labels li label { display: inline-block; - border: 2px solid var(--blue-bg); - border-radius: 0.7em; + border: 1px solid var(--blue-bg); + border-radius: 0.2em; background-color: white; color: var(--ribbon-color); - padding: 0.2em 0.65em 0.3em 0.4em; - line-height: 0.9em; + padding: 0.2em 0.3em 0.3em 0.2em; + line-height: 0.8em; margin: 0.1em 0; } .nav-labels li label:hover { background-color: var(--blue-bg); color: white; + /* border-color: white; - border-style: dotted; + border-style: dotted;*/ } /* CHECKED LABELS */ #acc-pac:checked ~ .nav-labels label[for="acc-pac"]:not(:hover), #acc-exc:checked ~ .nav-labels label[for="acc-exc"]:not(:hover), + #acc-own:checked ~ .nav-labels label[for="acc-own"]:not(:hover), #acc-mods:checked ~ .nav-labels label[for="acc-mods"]:not(:hover), #acc-ntf:checked ~ .nav-labels label[for="acc-ntf"]:not(:hover) { background-color: var(--blue-bg); color: white; - - line-height: 0.8em; } /* ★★★★★ */ .nav-labels label:before { - content: '★ '; + content: '★'; + padding-right: 0.1em; visibility: hidden; } .nav-labels li label:hover:before, #acc-pac:checked ~ .nav-labels label[for="acc-pac"]:before, #acc-exc:checked ~ .nav-labels label[for="acc-exc"]:before, + #acc-own:checked ~ .nav-labels label[for="acc-own"]:before, #acc-mods:checked ~ .nav-labels label[for="acc-mods"]:before, #acc-ntf:checked ~ .nav-labels label[for="acc-ntf"]:before { @@ -435,15 +444,17 @@ + - - - PAC-скрипт + + + PAC-скрипт + Исключения + Свои прокси Модификаторы - Исключения - Уведомления + Уведомления @@ -496,6 +507,17 @@ + + + + + + К изначальным! + + + + + diff --git a/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.js b/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.js index acd2c30..957deb7 100644 --- a/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.js +++ b/extensions/chromium/runet-censorship-bypass/src/extension-common/pages/choose-pac-provider/index.js @@ -158,11 +158,9 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => }; - const infoIcon = ` - - - `; + const infoIcon = ` + + `; const infoSign = function infoSign(tooltip) { @@ -173,22 +171,31 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => }; + const infoUrl = (url) => `${infoIcon}`; + + const appendInfoRow = (mountEl, conf, inputTypeName, inputId, htmlAfterLabel = '') => { + + mountEl.classList.add('info-row', 'hor-flex'); + mountEl.innerHTML = ` + + + ${conf.label} + ${htmlAfterLabel} + ` + (conf.desc ? infoSign(conf.desc) : infoUrl(conf.url)); + + }; + { const ul = document.querySelector('#list-of-providers'); const _firstChild = ul.firstChild; for( - const [providerKey, provider] of antiCensorRu.getSortedEntriesForProviders() + const provConf of antiCensorRu.getSortedEntriesForProviders() ) { const li = document.createElement('li'); - li.classList.add('info-row', 'hor-flex'); - li.innerHTML = ` - - - ${provider.label} - [обновить] - ` + - infoSign(provider.desc); + appendInfoRow(li, provConf, 'type="radio" name="pacProvider"', provConf.key, ` + [обновить] + `); li.querySelector('.link-button').onclick = () => { conduct( @@ -255,13 +262,12 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => document.documentElement.classList.add('if-options-page'); } - // EXCEPTIONS PANEL - { + { // KITCHEN PANELS starts. const pacKitchen = backgroundPage.apis.pacKitchen; - { + { // EXCEPTIONS TAB starts. const excEditor = document.getElementById('exc-editor'); @@ -518,124 +524,140 @@ chrome.runtime.getBackgroundPage( (backgroundPage) => }; - } + } // EXCEPTIONS TAB ends. - // PAC MODS PANEL + const camelToDash = (name) => name.replace(/([A-Z])/g, (_, p) => '-' + p.toLowerCase()); - const modPanel = document.getElementById('pac-mods'); - const _firstChild = modPanel.firstChild; - const keyToLi = {}; - const customProxyStringKey = 'customProxyStringRaw'; - const uiRaw = 'ui-proxy-string-raw'; + { // OWN PROXIES TAB starts. - for(const conf of pacKitchen.getOrderedConfigs()) { + const ownsList = document.getElementById('own-proxies'); + const _firstChild = ownsList.firstChild; + const keyToLi = {}; + const customProxyStringKey = 'customProxyStringRaw'; + const uiRaw = 'ui-proxy-string-raw'; - const key = conf.key; - const iddy = 'mods-' + conf.key.replace(/([A-Z])/g, (_, p) => '-' + p.toLowerCase()); - const li = document.createElement('li'); - li.classList.add('info-row', 'hor-flex'); - keyToLi[key] = li; - const ifMultiline = key === customProxyStringKey; - li.innerHTML = ` - - - ${ conf.label } - `; + for(const conf of pacKitchen.getOrderedConfigs('ownProxies')) { - if (!ifMultiline) { - li.innerHTML += infoSign(conf.desc); - } else { - li.style.flexWrap = 'wrap'; - li.innerHTML += `${infoIcon} -${conf.value || localStorage.getItem(uiRaw) || ''}`; - li.querySelector('textarea').onkeyup = function() { +PROXY foobar.com:8080; # Not HTTP!">${conf.value || localStorage.getItem(uiRaw) || ''} + `; + li.querySelector('textarea').onkeyup = function() { - this.dispatchEvent( new Event('change', {'bubbles': true}) ); + this.dispatchEvent( new Event('change', {'bubbles': true}) ); + + }; + } + + ownsList.insertBefore( li, _firstChild ); - }; } - modPanel.insertBefore( li, _firstChild ); + } // OWN PROXIES TAB ends. - }; - document.getElementById('apply-mods').onclick = () => { + { // PAC MODS TAB starts. + + const modsList = document.getElementById('pac-mods'); + const _firstChild = modsList.firstChild; + const keyToLi = {}; + + for(const conf of pacKitchen.getOrderedConfigs('general')) { + + const key = conf.key; + const iddy = 'mods-' + camelToDash(conf.key); + const li = document.createElement('li'); + appendInfoRow(li, conf, `type="checkbox" ${conf.value ? 'checked' : ''}`, iddy); + keyToLi[key] = li; + modsList.insertBefore( li, _firstChild ); + + }; + document.getElementById('apply-mods').onclick = () => { + + const oldMods = pacKitchen.getPacMods(); + for(const key of Object.keys(keyToLi)) { + oldMods[key] = keyToLi[key].querySelector('input').checked; + }; + + { + // OWN PROXY + + const liPs = keyToLi[customProxyStringKey]; + oldMods[customProxyStringKey] + = liPs.querySelector('input').checked + && liPs.querySelector('textarea').value.trim(); + + const taVal = liPs.querySelector('textarea').value; + if (oldMods[customProxyStringKey] !== false) { + const ifValidArr = taVal + .trim() + .replace(/#.*$/mg, '') + .split(/\s*[;\n\r]+\s*/g) + .filter( (str) => str ); + const ifValid = ifValidArr.every( + (str) => + /^(?:DIRECT|(?:(?:HTTPS|PROXY|SOCKS(?:4|5)?)\s+\S+))$/g + .test(str.trim()) + ); + if (!(ifValidArr.length && ifValid)) { + return showErrors(new TypeError( + 'Неверный формат своих прокси. Свертесь с документацией.' + )); + } + oldMods[customProxyStringKey] = taVal; + } else { + localStorage.setItem(uiRaw, taVal); + } + + } + + conduct( + 'Применяем настройки...', + (cb) => pacKitchen.keepCookedNowAsync(oldMods, cb), + 'Настройки применены.', + () => { + + document.getElementById('apply-mods').disabled = true; + + } + ); - const oldMods = pacKitchen.getPacMods(); - for(const key of Object.keys(keyToLi)) { - oldMods[key] = keyToLi[key].querySelector('input').checked; }; - { - // OWN PROXY + document.getElementById('reset-mods').onclick = () => { - const liPs = keyToLi[customProxyStringKey]; - oldMods[customProxyStringKey] - = liPs.querySelector('input').checked - && liPs.querySelector('textarea').value.trim(); - - const taVal = liPs.querySelector('textarea').value; - if (oldMods[customProxyStringKey] !== false) { - const ifValidArr = taVal - .trim() - .replace(/#.*$/mg, '') - .split(/\s*[;\n\r]+\s*/g) - .filter( (str) => str ); - const ifValid = ifValidArr.every( - (str) => - /^(?:DIRECT|(?:(?:HTTPS|PROXY|SOCKS(?:4|5)?)\s+\S+))$/g - .test(str.trim()) - ); - if (!(ifValidArr.length && ifValid)) { - return showErrors(new TypeError( - 'Неверный формат своих прокси. Свертесь с документацией.' - )); - } - oldMods[customProxyStringKey] = taVal; - } else { - localStorage.setItem(uiRaw, taVal); + const ifSure = backgroundPage.confirm('Сбросить все модификаторы и ИСКЛЮЧЕНИЯ?'); + if (!ifSure) { + return false; } + conduct( + 'Сбрасываем...', + (cb) => { - } + pacKitchen.resetToDefaults(); + backgroundPage.utils.fireRequest('ip-to-host-reset-to-defaults', cb); - conduct( - 'Применяем настройки...', - (cb) => pacKitchen.keepCookedNowAsync(oldMods, cb), - 'Настройки применены.', - () => { + }, + 'Откройте окно заново для отображения эффекта.', + () => window.close() + ); - document.getElementById('apply-mods').disabled = true; + }; - } - ); + } // PAC MODS TAB ends. - }; - - document.getElementById('reset-mods').onclick = () => { - - const ifSure = backgroundPage.confirm('Сбросить все модификаторы и ИСКЛЮЧЕНИЯ?'); - if (!ifSure) { - return false; - } - conduct( - 'Сбрасываем...', - (cb) => { - - pacKitchen.resetToDefaults(); - backgroundPage.utils.fireRequest('ip-to-host-reset-to-defaults', cb); - - }, - 'Откройте окно заново для отображения эффекта.', - () => window.close() - ); - - }; - - } + } // KITCHEN PANELS ends. // NOTIFICATIONS PANEL