45 Commits

Author SHA1 Message Date
Thomas Rientjes
a8550f5d06 Bump version to 2.0.4 2018-05-29 01:22:58 +02:00
Thomas Rientjes
7a76451e4e Update temporary list of tainted domains 2018-05-29 00:47:20 +02:00
Thomas Rientjes
433ee697ec Improve support for popular Chinese mirrors 2018-05-29 00:13:16 +02:00
Thomas Rientjes
73134b075e Update temporary list of tainted domains 2018-05-28 23:36:50 +02:00
Thomas Rientjes
6b5c34efc1 Improve compatibility with private browsing 2018-05-28 22:48:05 +02:00
Thomas Rientjes
b23a87a516 Update ESLint configuration file 2018-05-26 17:01:52 +02:00
Thomas Rientjes
fa6c453fc5 Update temporary list of tainted domains 2018-05-24 21:47:24 +02:00
Thomas Rientjes
57479367ee Update existing localizations 2018-05-24 21:43:36 +02:00
Thomas Rientjes
33bccd25ec Improve configuration feedback 2018-05-24 21:35:14 +02:00
Thomas Rientjes
3b13b60bd8 Improve support for popular Chinese mirrors 2018-05-22 16:15:51 +02:00
gloomy-ghost
71d4a39bf3 Add support for the Chinese USTC mirror 2018-05-22 15:59:27 +02:00
Thomas Rientjes
1b77f346e4 Refactor existing codebase 2018-05-18 01:02:59 +02:00
Thomas Rientjes
ba330010e7 Restrict XHR handling to one trusted domain 2018-05-18 00:14:39 +02:00
Thomas Rientjes
060177935e Implement file protection module 2018-05-17 16:40:37 +02:00
Pascal Ernster
498662d538 Add support for Luxembourgish (#262)
Add support for Luxembourgish
2018-05-15 00:49:02 +02:00
Thomas Rientjes
23c343ffe6 Update temporary list of tainted domains 2018-03-20 17:15:09 +01:00
Thomas Rientjes
08f9a489b8 Register additional shorthand notations 2018-02-24 23:48:55 -03:00
Thomas Rientjes
bc6dc59a76 Improve shorthand notation logic 2018-02-24 23:44:17 -03:00
Thomas Rientjes
fe60660cd8 Relocate Czech message reference 2018-02-21 16:49:47 -03:00
Thomas Rientjes
98908a747d Bump version to 2.0.3 2018-02-21 15:22:27 -03:00
Thomas Rientjes
815a16e48b Update temporary list of tainted domains 2018-02-21 12:08:13 -03:00
Thomas Rientjes
c836e8fbbe Fix #253 by correcting initialization logic 2018-02-21 12:03:36 -03:00
Thomas Rientjes
778e2e53a9 Update temporary list of tainted domains 2018-02-19 20:12:32 -03:00
Thomas Rientjes
c614851a93 Add support for Czech 2018-02-19 18:15:46 -03:00
Thomas Rientjes
d513668b77 Update existing localizations 2018-02-19 18:12:13 -03:00
Thomas Rientjes
535d04e924 Implement cookie sanitation 2018-01-11 18:29:53 -03:00
Thomas Rientjes
3440005439 Remove unused code segment 2018-01-11 17:57:45 -03:00
Thomas Rientjes
e81ed053b9 Refactor existing codebase 2018-01-11 13:33:00 -03:00
Thomas Rientjes
c219fae3fb Improve injection count formatting 2018-01-11 12:07:50 -03:00
Thomas Rientjes
a8e340abe0 Modularize request sanitation logic 2018-01-10 19:39:26 -03:00
Thomas Rientjes
6d6a7b68ad Bump version to 2.0.2 2018-01-09 01:38:08 -03:00
Thomas Rientjes
74e6c6fa98 Refactor options page logic 2018-01-08 02:31:18 -03:00
Thomas Rientjes
440def810d Remove unused code segment 2018-01-08 00:00:01 -03:00
Thomas Rientjes
cd0c06c5bc Update temporary list of tainted domains 2018-01-07 22:41:28 -03:00
Thomas Rientjes
be533e8953 Update internal helper module 2018-01-07 22:22:23 -03:00
Thomas Rientjes
7ec143efbf Refactor options page logic 2018-01-07 22:17:37 -03:00
Thomas Rientjes
bce5e9f58e Refactor popup panel logic 2018-01-07 21:06:49 -03:00
Thomas Rientjes
3b941ed077 Update manifest.json 2018-01-07 19:27:20 -03:00
Thomas Rientjes
449bf8c064 Remove unused code segments 2017-12-10 23:15:59 -03:00
Thomas Rientjes
861ba95dee Improve cross-browser compatibility 2017-12-10 18:27:21 -03:00
Thomas Rientjes
b3931febc2 Improve domain parsing logic 2017-12-10 18:17:11 -03:00
Thomas Rientjes
391eb4e6d2 Add internal API wrapper module 2017-12-10 17:58:09 -03:00
Thomas Rientjes
91f32afa59 Upgrade existing modules 2017-12-10 17:54:03 -03:00
Thomas Rientjes
7883d5f2c7 Add support for Korean 2017-11-30 17:35:22 -03:00
Thomas Rientjes
62bd811bbf Update existing localizations 2017-11-30 17:27:07 -03:00
41 changed files with 2004 additions and 1022 deletions

View File

@@ -4,32 +4,46 @@
"es6": true,
"webextensions": true
},
"extends": "eslint:recommended",
"extends": [
"eslint:recommended",
"plugin:no-unsanitized/DOM"
],
"globals": {
"Address": true,
"fileGuard": true,
"files": true,
"Header": true,
"helpers": true,
"interceptor": true,
"mappings": true,
"MessageResponse": true,
"requestAnalyzer": true,
"requestSanitizer": true,
"Resource": true,
"resources": true,
"Setting": true,
"shorthands": true,
"stateManager": true,
"WebRequest": true,
"Whitelist": true
"WebRequestType": true,
"Whitelist": true,
"wrappers": true
},
"overrides": {
"files": [
"core/constants.js",
"core/files.js",
"core/mappings.js",
"core/resources.js"
"core/resources.js",
"core/shorthands.js"
],
"rules": {
"no-unused-vars": "off"
}
},
"plugins": [
"no-unsanitized"
],
"rules": {
"array-bracket-newline": "error",
"array-bracket-spacing": "error",

70
_locales/cs/messages.json Normal file
View File

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Ochrání vás přes sledováním skrze centralizované doručování obsahu.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Zakázat ochranu na této stránce",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Zapnout ochranu",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Počítadlo vložených lokálních zdrojů",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Počet lokální uložených zdrojů vložených od instalace.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Možnosti",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Zobrazovat počet vložení u ikony",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Zobrazit počet vložených zdrojů u ikony rozšíření.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Blokovat požadavky na chybějící zdroje",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Zrušit požadavky na sledované zdroje, pokud nejsou lokálně dostupné.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Zakázat přednačítání odkazů",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Předejte nepovoleným požadavkům do sítí pro doručování obsahu.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Odstranit metadata z povolených požadavků",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Pro zlepšení soukromí odstraní citlivá data z povolených požadavků na CDN.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Nekontrolovat pro domény",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Zadejte domény pro jejich vynechání z kontroly. Jednotlivé domény oddělujte pomocí středníků (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Rozšířené",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Decentraleyes protektas vin kontraŭ sekvado per senkosta, centra enhavoprovizado.",
"description":"Extension description."
"extensionDescription": {
"message": "Decentraleyes protektas vin kontraŭ sekvado per senkosta, centra enhavoprovizado.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Malaktivigi protekton por tiu ĉi retejo",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Malaktivigi protekton por tiu ĉi retejo",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Aktivigi protekton",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Aktivigi protekton",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Nombrilo de loke enmetiaj risurcoj",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Nombrilo de loke enmetiaj risurcoj",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Kvanto de lokaj CDN-risurcoj enmetitaj ekde instaliĝo.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Kvanto de lokaj CDN-risurcoj enmetitaj ekde instaliĝo.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Elektebloj",
"description":"Options title."
"optionsTitle": {
"message": "Elektebloj",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Display injection counts on icon",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Montri nombrilon sur piktogramo",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Show the number of injected resources on the extension icon.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Montri nombron da enmetataj risurcoj sur la aldonaĵa piktogramo.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Bloki petojn por mankaj risurcoj",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Bloki petojn por mankaj risurcoj",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Bloki petojn interkaptitajn se la petitan risurcon ne loke haveblas.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "Bloki petojn interkaptitajn se la petitan risurcon ne loke haveblas.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Disable link prefetching",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Ne antaŭlegi ligilojn",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Prevent disallowed requests from leaking out to delivery networks.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "Bloki malpermesatajn petojn por preventi tralasojn al enhav-proviz-retoj.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Strip metadata from allowed requests",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Forigi metadatumojn el permesataj petoj",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"Erase sensitive data from allowed CDN requests for improved privacy.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "Forviŝi delikatajn datumojn el permesataj CDN-petoj por plibonigi privatecon.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Neinspektendaj domajnoj",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Neinspektendaj domajnoj",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Entajpu demajnojn, kiujn Decentraleyes ne devas inspekti. Disigu domajnojn per punktokomoj (;).",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Entajpu demajnojn, kiujn Decentraleyes ne devas inspekti. Disigu domajnojn per punktokomoj (;).",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Spertula",
"description":"Advanced label."
"advancedLabel": {
"message": "Spertula",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Protège du pistage lié aux diffuseurs de contenus \"gratuits\", centralisés.",
"description":"Extension description."
"extensionDescription": {
"message": "Protège du pistage lié aux diffuseurs de contenus \"gratuits\", centralisés.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Désactiver la protection pour ce site",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Désactiver la protection pour ce site",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Activer la protection",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Activer la protection",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Compteur de ressources injectées localement",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Compteur de ressources injectées localement",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Quantité de ressource CDN injectées localement depuis l'installation.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Quantité de ressources CDN injectées localement depuis l'installation.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Options",
"description":"Options title."
"optionsTitle": {
"message": "Options",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Affichage du nombre d'injections sur l'icône",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Afficher le nombre dinjections sur licône",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Affiche le nombre de ressources injectées sur l'icône d'extension.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Affiche le nombre de ressources injectées sur l'icône d'extension.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Bloquer les requêtes de ressources manquantes",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Bloquer les requêtes de ressources manquantes",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Annule la requête interceptée si la ressource requise n'est pas disponible localement.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "Annule la requête interceptée si la ressource requise n'est pas disponible localement.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Désactiver le préchargement de lien",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Désactiver le préchargement de lien",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Empêcher que des requêtes non autorisées fuit du réseaux de distribution.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "Empêche que des requêtes non autorisées fuient vers les réseaux de distribution.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Découper les métadonnées des requêtes autorisées",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Découper les métadonnées des requêtes autorisées",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"Efface les données sensibles des demandes de CDN autorisées pour améliorer la confidentialité.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "Efface les données sensibles des demandes de CDN autorisées pour améliorer la confidentialité.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Exclure les domaines des inspections",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Exclure les domaines des inspections",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Entrez des domaines pour la liste blanche. Séparez les entrées multiples par des points-virgules (;).",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Entrez des domaines pour la liste blanche. Séparez les entrées multiples par des points-virgules (;).",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Avancé",
"description":"Advanced label."
"advancedLabel": {
"message": "Avancé",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Verndar þig gegn eftirliti frá \"ókeypis\" miðlægum efnisveitum.",
"description":"Extension description."
"extensionDescription": {
"message": "Verndar þig gegn eftirliti frá \"ókeypis\" miðlægum efnisveitum.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Slökkva á vörn fyrir þetta vefsvæði",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Slökkva á vörn fyrir þetta vefsvæði",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Virkja vernd",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Virkja vernd",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Fjöldi staðvært inspýttra tilfanga",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Fjöldi staðvært inspýttra tilfanga",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Fjöldi tilfanga frá miðlægum efnisveitum sem skipt hefur verið út síðan viðbótin var sett upp.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Fjöldi tilfanga frá miðlægum efnisveitum sem skipt hefur verið út síðan viðbótin var sett upp.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Valkostir",
"description":"Options title."
"optionsTitle": {
"message": "Valkostir",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Birta fjölda innspýtinga á táknmynd",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Birta fjölda innspýtinga á táknmynd",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Sýnir merki fyrir fjölda innspýttra tilfanga á táknmynd viðbótarinnar.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Sýnir merki fyrir fjölda innspýttra tilfanga á táknmynd viðbótarinnar.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Loka á beiðnir vegna tilfanga sem vantar",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Loka á beiðnir vegna tilfanga sem vantar",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Hætta við veiddar beiðnir ef umbeðið tilfang er ekki til staðar á tölvunni.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "Hætta við veiddar beiðnir ef umbeðið tilfang er ekki til staðar á tölvunni.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Gera forsöfnun tengla óvirka",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Gera forsöfnun tengla óvirka",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Kemur í veg fyrir að bannaðar beiðnir leki út til afhendingarveitna.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "Kemur í veg fyrir að bannaðar beiðnir leki út til afhendingarveitna.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Hreinsa lýsigögn úr leyfðum beiðnum",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Hreinsa lýsigögn úr leyfðum beiðnum",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"Þurrka viðkvæm gögn út úr leyfðum beiðnum til efnisveitna til að auka gagnaleynd.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "Þurrka viðkvæm gögn út úr leyfðum beiðnum til efnisveitna til að auka gagnaleynd.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Undanskilja lén frá athugun",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Undanskilja lén frá athugun",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Settu inn lén til að skrá þau á lista yfir leyfð lén. Aðgreindu færslur með semíkommum (;).",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Settu inn lén til að skrá þau á lista yfir leyfð lén. Aðgreindu færslur með semíkommum (;).",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Ítarlegt",
"description":"Advanced label."
"advancedLabel": {
"message": "Ítarlegt",
"description": "Advanced label."
}
}

View File

@@ -44,15 +44,15 @@
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Prevent disallowed requests from leaking out to delivery networks.",
"message": "配信ネットワークに許可されていないリクエストの漏れから予防する。",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Strip metadata from allowed requests",
"message": "許可されていたるリクエストからメタデータを取り除く",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Erase sensitive data from allowed CDN requests for improved privacy.",
"message": "プライバシー向上のために許可されたCDNリクエストから機密データを消去する。",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {

70
_locales/ko/messages.json Normal file
View File

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "\"무료\"라는 미끼로 당신을 추적하는 대규모 CDN을 사용하지 않음으로써 개인 정보를 지킵니다.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "이 사이트의 보호 비활성화",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "보호 활성화",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "로컬 리소스로 대체한 요청 횟수",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Decentraleyes를 설치한 뒤, CDN에서 다운로드 하는 대신 로컬 자원을 사용한 횟수입니다.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "옵션",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "차단한 횟수를 아이콘에 표시",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "로컬 리소스로 대체한 요청 수를 확장 기능 아이콘에 표시합니다.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "존재하지 않는 리소스에 대한 요청을 차단",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "리소스를 로컬에서 가져올 수 없다면 리소스 요청을 취소합니다.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "링크 프리페치를 비활성화",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "허가되지 않은 요청이 전달 네트워크(DN)로 전송되는 것을 차단합니다.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "허용된 요청에서 메타데이터를 제거",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "프라이버시 보호를 위해 허가된 CDN 요청에서 민감한 데이터를 지웁니다.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Decentraleyes를 사용하지 않을 도메인",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "화이트 리스트에 등록할 도메인을 입력하세요. 여러 개를 입력할 경우 세미콜론 (;) 을 이용해 구분합니다.",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "고급",
"description": "Advanced label."
}
}

70
_locales/lb/messages.json Normal file
View File

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Schützt virun Tracking duerch \"gratis\" Content Delivery Networks.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Schutz fir dëse Site ausschalten",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Schutz aktivéieren",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Zieler fir lokal injizéierte Ressourcen",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Unzuel vu lokalen Injektiounen vun CDN-Ressourcen säit der Installatioun.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Astellungen",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Unzuel vun Injektiounen op der Ikon uweisen",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "D'Unzuel vun injizéierte Ressourcen op der Decentraleyes-Ikon uweisen.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Eroflueden vu fehlenden Ressourcen blockéieren",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Ofgefaangen Ressourcen-Downloads blockéieren, wann déi ugefuerdert Datei net lokal um System verfügbar ass.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "\"Link Prefetching\" ausschalten",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Verhënnert, dass onerlaabten Ressourcen entgéint den aneren Astellungen trotzdeem ugefuerdert\/erofgeluede ginn.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Metadaten aus den erlaabten Downloads erausläschen",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Läscht sensibel Daten aus den erlaabten CDN-Downloads fir den Dateschutz ze verbesseren.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Downloads fir dës Siten ëmmer erlaaben (Whitelist)",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Gitt hei d'Domains un, deenen hir Downloads ëmmer sollen erlaabt ginn. Trennt déi eenzel Domains duerch e Semikolon (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Erweidert",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Beschermt tegen tracking via het \"gratis\", gecentraliseerd, verzorgen van content.",
"description":"Extension description."
"extensionDescription": {
"message": "Beschermt tegen tracking via het \"gratis\", gecentraliseerd, verzorgen van content.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Bescherming voor deze website uitschakelen",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Bescherming voor deze website uitschakelen",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Bescherming inschakelen",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Bescherming inschakelen",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Teller voor lokaal geïnjecteerde bestanden",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Teller voor lokaal geïnjecteerde bestanden",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Aantal lokale Content Delivery Network-bestandsinjecties sinds installatie.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Aantal lokale Content Delivery Network-bestandsinjecties sinds installatie.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Opties",
"description":"Options title."
"optionsTitle": {
"message": "Opties",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Getelde injecties op icoon weergeven",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Getelde injecties op icoon weergeven",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Toon het aantal geïnjecteerde bestanden op het extensie-icoon.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Toon het aantal geïnjecteerde bestanden op het extensie-icoon.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Verzoeken voor ontbrekende items blokkeren",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Verzoeken voor ontbrekende items blokkeren",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Annuleer een onderschept verzoek wanneer het bestand niet lokaal beschikbaar is.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "Annuleer een onderschept verzoek wanneer het bestand niet lokaal beschikbaar is.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Link prefetching uitschakelen",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Link prefetching uitschakelen",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Voorkom dat geweigerde verzoeken naar afleveringsnetwerken uitlekken.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "Voorkom dat geweigerde verzoeken naar afleveringsnetwerken uitlekken.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Metadata uit toegestane verzoeken verwijderen",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Metadata uit toegestane verzoeken verwijderen",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"Wis gevoelige gegevens uit toegestane CDN-verzoeken voor verbeterde privacy.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "Wis gevoelige gegevens uit toegestane CDN-verzoeken voor verbeterde privacy.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Sluit domeinen uit van inspecties",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Sluit domeinen uit van inspecties",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Voer de te negeren domeinen in. Scheid de waarden met puntkomma's (;).",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Voer de te negeren domeinen in. Scheid de waarden met puntkomma's (;).",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Geavanceerd",
"description":"Advanced label."
"advancedLabel": {
"message": "Geavanceerd",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Protege contra monitorização através de entrega de conteúdo centralizado.",
"description":"Extension description."
"extensionDescription": {
"message": "Protege contra monitorização através de entrega de conteúdo centralizado.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Desativar proteção para este site",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Desativar proteção para este site",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Ativar proteção",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Ativar proteção",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Contador para recursos injetados localmente",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Contador para recursos injetados localmente",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Quantidade de injeções de recurso Content Delivery Network locais desde a instalação.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Quantidade de injeções de recurso Content Delivery Network locais desde a instalação.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Opções",
"description":"Options title."
"optionsTitle": {
"message": "Opções",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Mostrar contagem de injeções no ícone",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Mostrar contagem de injeções no ícone",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Mostrar o número de recursos injetados no ícone da extensão.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Mostrar o número de recursos injetados no ícone da extensão.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Bloquear pedidos por falta de recursos",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Bloquear pedidos por falta de recursos",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Cancelar pedido intercetado se o recurso necessário não estiver disponível localmente.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "Cancelar pedido intercetado se o recurso necessário não estiver disponível localmente.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Desativar pré-obtenção de ligações",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Desativar pré-obtenção de ligações",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Impedir recursos não permitidos de vazar para as redes de entrega.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "Impedir recursos não permitidos de vazar para as redes de entrega.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Retirar metadados dos pedidos permitidos",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Retirar metadados dos pedidos permitidos",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"Limpar dados sensíveis de recursos CDN permitidos para melhoria de privacidade.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "Limpar dados sensíveis de recursos CDN permitidos para melhoria de privacidade.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Excluir domínios de inspeções",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Excluir domínios de inspeções",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Insira domínios para os colocar na lista branca. Separe múltiplas entradas com pontos e vírgulas (;).",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Insira domínios para os colocar na lista branca. Separe múltiplas entradas com pontos e vírgulas (;).",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Avançado",
"description":"Advanced label."
"advancedLabel": {
"message": "Avançado",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Te protejează împotriva urmăririi prin livrare \"gratuită\" de conținut centralizat.",
"description":"Extension description."
"extensionDescription": {
"message": "Te protejează împotriva urmăririi prin livrare \"gratuită\" de conținut centralizat.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Dezactivează protecția pentru acest site",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Dezactivează protecția pentru acest site",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Activează protecția",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Activează protecția",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Contor pentru resursele injectate local",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Contor pentru resursele injectate local",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Cantitatea de resurse locale injectate de Rețelele care Livrează Conținut din momentul instalării.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Cantitatea de resurse locale injectate de Rețelele care Livrează Conținut din momentul instalării.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Opțiuni",
"description":"Options title."
"optionsTitle": {
"message": "Opțiuni",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Afișează numărul de dependențe înlocuite pe iconiță",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Afișează numărul de dependențe înlocuite pe iconiță",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Afișează numărul de resurse înlocuite pe iconița extensiei.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Afișează numărul de resurse înlocuite pe iconița extensiei.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Blochează cererile pentru resursele care lipsesc",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Blochează cererile pentru resursele care lipsesc",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Anulează cererile interceptate dacă resursa solicitată nu este disponibilă local.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "Anulează cererile interceptate dacă resursa solicitată nu este disponibilă local.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Dezactivează pre-încărcarea de linkuri",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Dezactivează pre-încărcarea de linkuri",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Previne scurgerea request-uri nepermise către rețele de livrare.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "Previne scurgerea request-uri nepermise către rețele de livrare.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Scoate metadatele din requesturi permise",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Scoate metadatele din requesturi permise",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"Șterge date sensibile din requesturi permise pentru îmbunătățirea confidențialității.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "Șterge date sensibile din requesturi permise pentru îmbunătățirea confidențialității.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Exclude domeniile următoare de la inspecții",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Exclude domeniile următoare de la inspecții",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Introduceți domeniile dorite în lista albă. Separați intrările multiple între ele prin punct și virgulă (;).",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Introduceți domeniile dorite în lista albă. Separați intrările multiple între ele prin punct și virgulă (;).",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Avansat",
"description":"Advanced label."
"advancedLabel": {
"message": "Avansat",
"description": "Advanced label."
}
}

View File

@@ -60,7 +60,7 @@
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Унесите домене да их ставите на бели списак. Више одвојених ставки са тачка-запетама (;).",
"message": "Унесите домене да их ставите на бели списак. Одвојите више ставки са тачка-запетама (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {

70
_locales/tl/messages.json Normal file
View File

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Para protektahan ka laban sa pagsubaybay sa pamamagitan ng \"libre\", sentralisadong, paghahatid ng nilalaman.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Huwag paganahin ang proteksyon para sa sayt na ito",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Paganahin ang proteksyon",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Laban para sa mga lokal na iniksiyong mga mapagkukunan",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Ang halaga ng mga lokal na Nilalaman sa Network ng Paghahatid ng pinagmulan sa pag-install mula noong pag-install.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Ang mga pagpipilian",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Ang naka-displey na ineksyon ay mabibilang sa imahe",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Ipakita ang bilang ng mga injected na pinagmulan sa ekstensyon nang imahe.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Harangan ang mga kahilingan para sa mga nawawalang mapagkukunan",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Kanselahin ang kahilingan na intercepted kung ang mga kinakailangang mapagkukunan ay hindi available sa lokal.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Huwag paganahin ang prefetching link",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Pigilan ang mga kahilingan na hindi pinayagan mula sa pagkalat sa paghahatid ng mga network.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Iliston ang metadata mula sa mga pinayagan na kahilingan",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Burahin ang sensitibong datus mula sa mga pinahihintulutang kahilingan ng CDN para sa pinahusay na pagiging pribado nito.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Ibukod ang mga domain mula sa mga iinspeksyon",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Ipasok ang mga domain upang i-whitelist sila. Paghiwalayin ang maramihang mga entry na may tuldok kuwit (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Naka-usad",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"Sizi, \"ücretsiz\", merkezi, içerik dağıtımı aracılığıyla yapılan takipten korur.",
"description":"Extension description."
"extensionDescription": {
"message": "Sizi, \"ücretsiz\", merkezi, içerik dağıtımı aracılığıyla yapılan takipten korur.",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"Bu sitede korumayı devre dışı bırak",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "Bu sitede korumayı devre dışı bırak",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"Korumayı etkinleştir",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "Korumayı etkinleştir",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"Yerel olarak eklenen kaynaklar için sayaç",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "Yerel olarak eklenen kaynaklar için sayaç",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"Kurulumdan bu yana yerel İçerik Dağıtım Ağı kaynak eklemelerinin miktarı.",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "Kurulumdan bu yana yerel İçerik Dağıtım Ağı kaynak eklemelerinin miktarı.",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"Seçenekler",
"description":"Options title."
"optionsTitle": {
"message": "Seçenekler",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"Simgede enjeksiyon sayaçlarını göster",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "Simgede enjeksiyon sayaçlarını göster",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Enjekte edilen kaynakların sayısını uzantı simgesinde gösterin.",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "Enjekte edilen kaynakların sayısını uzantı simgesinde gösterin.",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"Eksik kaynaklar için gelen istekleri engelle",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "Eksik kaynaklar için gelen istekleri engelle",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"İstenilen kaynak yerel olarak mevcut değilse, yakalanan isteği iptal et.",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "İstenilen kaynak yerel olarak mevcut değilse, yakalanan isteği iptal et.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Bağlantı önalımını devre dışı bırak",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "Bağlantı önalımını devre dışı bırak",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"İzin verilmeyen isteklerin dağıtım ağlarına sızmasını engelleyin.",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "İzin verilmeyen isteklerin dağıtım ağlarına sızmasını engelleyin.",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Meta verilerini izin verilen isteklerden ayır",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "Meta verilerini izin verilen isteklerden ayır",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":zin verilen CDN isteklerine duyarlı verileri gelişmiş gizlilik için silin.",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": leri düzey gizlilik için, izin verilen CDN isteklerinden hassas verileri sil.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Alanları denetimlerden hariç tut",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "Alanları denetimlerden hariç tut",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Beyaz listeye eklemek için alan adlarını girin. Birden çok girdiyi noktalı virgül (;) ile ayırın.",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "Beyaz listeye eklemek için alan adlarını girin. Birden çok girdiyi noktalı virgül (;) ile ayırın.",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"Gelişmiş",
"description":"Advanced label."
"advancedLabel": {
"message": "Gelişmiş",
"description": "Advanced label."
}
}

View File

@@ -1,70 +1,70 @@
{
"extensionDescription":{
"message":"保護您不受「免費」、中心化的內容傳遞網路CDN的追蹤。",
"description":"Extension description."
"extensionDescription": {
"message": "保護您不受「免費」、中心化的內容傳遞網路CDN的追蹤。",
"description": "Extension description."
},
"disableProtectionTitle":{
"message":"為此網站停用保護",
"description":"Disable protection title."
"disableProtectionTitle": {
"message": "為此網站停用保護",
"description": "Disable protection title."
},
"enableProtectionTitle":{
"message":"啟用保護",
"description":"Enable protection title."
"enableProtectionTitle": {
"message": "啟用保護",
"description": "Enable protection title."
},
"amountInjectedTitle":{
"message":"由本機提供的資源計數器",
"description":"Amount injected title."
"amountInjectedTitle": {
"message": "由本機提供的資源計數器",
"description": "Amount injected title."
},
"amountInjectedDescription":{
"message":"安裝以來,由本機檔案所取代的 CDN 資源數量。",
"description":"Amount injected description."
"amountInjectedDescription": {
"message": "安裝以來,由本機檔案所取代的 CDN 資源數量。",
"description": "Amount injected description."
},
"optionsTitle":{
"message":"選項",
"description":"Options title."
"optionsTitle": {
"message": "選項",
"description": "Options title."
},
"showIconBadgeTitle":{
"message":"在圖示上顯示被取代的資源數量",
"description":"Show icon badge title."
"showIconBadgeTitle": {
"message": "在圖示上顯示被取代的資源數量",
"description": "Show icon badge title."
},
"showIconBadgeDescription":{
"message":"在擴充套件圖示上,顯示被取代的資源數量。",
"description":"Show icon badge description."
"showIconBadgeDescription": {
"message": "在擴充套件圖示上,顯示被取代的資源數量。",
"description": "Show icon badge description."
},
"blockMissingTitle":{
"message":"封鎖缺少資源時的連線請求",
"description":"Block requests for missing resources title."
"blockMissingTitle": {
"message": "封鎖缺少資源時的連線請求",
"description": "Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"若本機沒有所請求的資源,就取消該請求。",
"description":"Block requests for missing resources description."
"blockMissingDescription": {
"message": "若本機沒有所請求的資源,就取消該請求。",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"停用連結預讀功能",
"description":"Disable prefetch title."
"disablePrefetchTitle": {
"message": "停用連結預讀功能",
"description": "Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"防止發出不被允許的請求到 CDN 網路。",
"description":"Disable prefetch description."
"disablePrefetchDescription": {
"message": "防止發出不被允許的請求到 CDN 網路。",
"description": "Disable prefetch description."
},
"stripMetadataTitle":{
"message":"移除放行請求當中的後設資料",
"description":"Strip metadata title."
"stripMetadataTitle": {
"message": "移除放行請求當中的後設資料",
"description": "Strip metadata title."
},
"stripMetadataDescription":{
"message":"清除放行的 CDN 請求當中的敏感資料,以保護隱私權。",
"description":"Strip metadata description."
"stripMetadataDescription": {
"message": "清除放行的 CDN 請求當中的敏感資料,以保護隱私權。",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"要排除檢查的網域",
"description":"Whitelisted domains title."
"whitelistedDomainsTitle": {
"message": "要排除檢查的網域",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"輸入網域即可將其加入白名單。使用分號(;)分隔多個網域。",
"description":"Whitelisted domains description."
"whitelistedDomainsDescription": {
"message": "輸入網域即可將其加入白名單。使用分號(;)分隔多個網域。",
"description": "Whitelisted domains description."
},
"advancedLabel":{
"message":"進階",
"description":"Advanced label."
"advancedLabel": {
"message": "進階",
"description": "Advanced label."
}
}

View File

@@ -21,12 +21,22 @@ const Address = {
'ANY': '*://*/*',
'ANY_PATH': '/*',
'ANY_PROTOCOL': '*://',
'DOMAIN_EXPRESSION': /:\/\/(.[^/]+)(.*)/,
'CHROME_EXTENSION': 'chrome-extension:',
'EXAMPLE': 'example.org',
'HTTP_EXPRESSION': /^http?:\/\//,
'HTTPS': 'https://',
'WWW_PREFIX': 'www.',
'WWW_PREFIX_LENGTH': 4
'HTTP': 'http:',
'HTTPS': 'https:',
'WWW_PREFIX': 'www.'
};
const Header = {
'COOKIE': 'Cookie',
'ORIGIN': 'Origin',
'REFERER': 'Referer'
};
const MessageResponse = {
'ASYNCHRONOUS': true,
'SYNCHRONOUS': false
};
const Resource = {
@@ -40,16 +50,20 @@ const Setting = {
'BLOCK_MISSING': 'blockMissing',
'DISABLE_PREFETCH': 'disablePrefetch',
'SHOW_ICON_BADGE': 'showIconBadge',
'SHOW_RELEASE_NOTES': 'showReleaseNotes',
'STRIP_METADATA': 'stripMetadata',
'WHITELISTED_DOMAINS': 'whitelistedDomains'
'WHITELISTED_DOMAINS': 'whitelistedDomains',
'XHR_TEST_DOMAIN': 'xhrTestDomain'
};
const WebRequest = {
'GET': 'GET',
'BLOCKING': 'blocking',
'HEADERS': 'requestHeaders',
'ORIGIN_HEADER': 'Origin',
'REFERER_HEADER': 'Referer'
'HEADERS': 'requestHeaders'
};
const WebRequestType = {
'XHR': 'xmlhttprequest'
};
const Whitelist = {

58
core/file-guard.js Normal file
View File

@@ -0,0 +1,58 @@
/**
* File Guard
* Belongs to Decentraleyes.
*
* @see https://github.com/Synzvato/decentraleyes/pull/258
*
* @author Thomas Rientjes
* @since 2018-05-17
* @license MPL 2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* File Guard
*/
var fileGuard = {};
/**
* Private Methods
*/
fileGuard._startListening = function () {
let randomHexString = helpers.generateRandomHexString(24);
fileGuard.secret = `?_=${randomHexString}`;
chrome.webRequest.onBeforeRequest.addListener(
fileGuard._verifyRequest,
{'urls': [`${fileGuard.path}/*`]},
[WebRequest.BLOCKING]
);
};
fileGuard._verifyRequest = function (requestDetails) {
let redirectUrl = chrome.runtime.getURL('/');
if (!requestDetails.url.endsWith(fileGuard.secret)) {
return {redirectUrl};
}
};
/**
* Initializations
*/
fileGuard.path = chrome.runtime.getURL('/resources');
fileGuard.secret = '';
if (fileGuard.path.startsWith(Address.CHROME_EXTENSION)) {
fileGuard._startListening();
}

View File

@@ -36,23 +36,47 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
};
}
try {
tabDomain = tab.url.match(Address.DOMAIN_EXPRESSION)[1];
tabDomain = requestAnalyzer._normalizeDomain(tabDomain);
} catch (exception) {
tabDomain = helpers.extractDomainFromUrl(tab.url, true);
if (tabDomain === null) {
tabDomain = Address.EXAMPLE;
}
if (requestDetails.type === WebRequestType.XHR) {
if (tabDomain !== interceptor.xhrTestDomain) {
return interceptor._handleMissingCandidate(requestDetails.url);
}
}
// Temporary list of undetectable tainted domains.
let undetectableTaintedDomains = {
'10fastfingers.com': true,
'blog.datawrapper.de': true,
'bundleofholding.com': true,
'cdnjs.com': true,
'dropbox.com': true,
'evoice.com': true,
'freebusy.io': true,
'gazetadopovo.com.br': true,
'glowing-bear.org': true,
'manualslib.com': true,
'meslieux.paris.fr': true,
'mgm.gov.tr': true,
'minigames.mail.ru': true,
'miniquadtestbench.com': true,
'nhm.ac.uk': true,
'openweathermap.org': true,
'poedb.tw': true,
'qwertee.com': true,
'regentgreymouth.co.nz': true,
'report-uri.io': true,
'scan.nextcloud.com': true,
'scotthelme.co.uk': true,
'securityheaders.com': true,
'securityheaders.io': true,
'stefansundin.github.io': true,
'transcend-info.com': true,
'udacity.com': true,
'yadi.sk': true,
'yourvotematters.co.uk': true
@@ -81,7 +105,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
};
return {
'redirectUrl': chrome.extension.getURL(targetPath)
'redirectUrl': chrome.extension.getURL(targetPath + fileGuard.secret)
};
};
@@ -98,12 +122,15 @@ interceptor._handleMissingCandidate = function (requestUrl) {
};
}
if (requestUrl.match(Address.HTTP_EXPRESSION)) {
let requestUrlSegments = new URL(requestUrl);
let secureRequestUrl = requestUrl.replace(Address.HTTP_EXPRESSION, Address.HTTPS);
if (requestUrlSegments.protocol === Address.HTTP) {
requestUrlSegments.protocol = Address.HTTPS;
requestUrl = requestUrlSegments.toString();
return {
'redirectUrl': secureRequestUrl
'redirectUrl': requestUrl
};
} else {
@@ -116,6 +143,10 @@ interceptor._handleMissingCandidate = function (requestUrl) {
interceptor._handleStorageChanged = function (changes) {
if (Setting.XHR_TEST_DOMAIN in changes) {
interceptor.xhrTestDomain = changes.xhrTestDomain.newValue;
}
if (Setting.BLOCK_MISSING in changes) {
interceptor.blockMissing = changes.blockMissing.newValue;
}
@@ -126,11 +157,19 @@ interceptor._handleStorageChanged = function (changes) {
*/
interceptor.amountInjected = 0;
interceptor.xhrTestDomain = 'decentraleyes.org';
interceptor.blockMissing = false;
chrome.storage.local.get([Setting.AMOUNT_INJECTED, Setting.BLOCK_MISSING], function (items) {
interceptor.relatedSettings = [];
interceptor.relatedSettings.push(Setting.AMOUNT_INJECTED);
interceptor.relatedSettings.push(Setting.XHR_TEST_DOMAIN);
interceptor.relatedSettings.push(Setting.BLOCK_MISSING);
chrome.storage.local.get(interceptor.relatedSettings, function (items) {
interceptor.amountInjected = items.amountInjected || 0;
interceptor.xhrTestDomain = items.xhrTestDomain || 'decentraleyes.org';
interceptor.blockMissing = items.blockMissing || false;
});

View File

@@ -26,11 +26,12 @@ var main = {};
main._initializeOptions = function () {
let optionDefaults = {
'showIconBadge': true,
'blockMissing': false,
'disablePrefetch': true,
'stripMetadata': true,
'whitelistedDomains': {}
[Setting.XHR_TEST_DOMAIN]: 'decentraleyes.org',
[Setting.SHOW_ICON_BADGE]: true,
[Setting.BLOCK_MISSING]: false,
[Setting.DISABLE_PREFETCH]: true,
[Setting.STRIP_METADATA]: true,
[Setting.WHITELISTED_DOMAINS]: {}
};
chrome.storage.local.get(optionDefaults, function (options) {
@@ -68,7 +69,7 @@ main._showReleaseNotes = function (details) {
if (details.temporary !== true) {
chrome.storage.local.get({
'showReleaseNotes': true
[Setting.SHOW_RELEASE_NOTES]: true
}, function (options) {
if (options.showReleaseNotes === true) {
@@ -90,24 +91,6 @@ main._showReleaseNotes = function (details) {
chrome.runtime.onInstalled.addListener(main._showReleaseNotes);
main._initializeOptions();
chrome.runtime.getPlatformInfo(function (information) {
main.operatingSystem = information.os;
});
if (typeof chrome.browserAction.setBadgeBackgroundColor !== 'function') {
chrome.browserAction.setBadgeBackgroundColor = function () {};
chrome.browserAction.setBadgeText = function () {};
chrome.browserAction.onClicked.addListener(function () {
chrome.tabs.create({
'url': chrome.extension.getURL('pages/popup/popup.html'),
'active': false
});
});
}
chrome.browserAction.setBadgeBackgroundColor({
wrappers.setBadgeBackgroundColor({
'color': [74, 130, 108, 255]
});

View File

@@ -35,7 +35,7 @@ var mappings = {
'swfobject/{version}/swfobject.': resources.swfobject,
'webfont/{version}/webfont.': resources.webfont,
// Common Shorthand Notations [Deprecated]
// Basic Shorthand Notations [Deprecated]
'dojo/1/dojo/dojo.': {
'path': 'resources/dojo/1.6.1/dojo/dojo.js.dec',
'type': 'application/javascript'
@@ -116,7 +116,7 @@ var mappings = {
'ui/{version}/jquery-ui.js': resources.jQueryUI,
'ui/{version}/jquery-ui.min.js': resources.jQueryUI,
// Common Shorthand Notations [Deprecated]
// Basic Shorthand Notations [Deprecated]
'jquery-latest.': {
'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
'type': 'application/javascript'
@@ -124,46 +124,6 @@ var mappings = {
'jquery.': {
'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.3.min.js': {
'path': 'resources/jquery/1.3.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.3.js': {
'path': 'resources/jquery/1.3.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.4.min.js': {
'path': 'resources/jquery/1.4.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.4.js': {
'path': 'resources/jquery/1.4.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.5.min.js': {
'path': 'resources/jquery/1.5.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.5.js': {
'path': 'resources/jquery/1.5.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.6.min.js': {
'path': 'resources/jquery/1.6.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.6.js': {
'path': 'resources/jquery/1.6.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.7.min.js': {
'path': 'resources/jquery/1.7.0/jquery.min.js.dec',
'type': 'application/javascript'
},
'jquery-1.7.js': {
'path': 'resources/jquery/1.7.0/jquery.min.js.dec',
'type': 'application/javascript'
}
}
},
@@ -277,3 +237,11 @@ var mappings = {
}
}
};
// Geekzu Public Service [Mirror]
mappings['sdn.geekzu.org'] = {
'/ajax/ajax/libs/': mappings['ajax.googleapis.com']['/ajax/libs/']
};
// USTC Linux User Group [Mirror]
mappings['ajax.proxy.ustclug.org'] = mappings['ajax.googleapis.com'];

70
core/messenger.js Normal file
View File

@@ -0,0 +1,70 @@
/**
* Messenger
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2018-05-28
* @license MPL 2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* Messenger
*/
var messenger = {};
/**
* Private Methods
*/
messenger._handleMessageReceived = function (message, sender, sendResponse) {
let topic, value;
topic = message.topic;
value = message.value;
if (topic === 'tab:fetch-injections') {
sendResponse({'value': stateManager.tabs[value].injections});
return MessageResponse.SYNCHRONOUS;
}
if (topic === 'domain:fetch-is-whitelisted') {
let whitelistRecord = requestAnalyzer.whitelistedDomains[value];
sendResponse({'value': Boolean(whitelistRecord)});
return MessageResponse.SYNCHRONOUS;
}
if (topic === 'whitelist:add-domain') {
stateManager.addDomainToWhitelist(value).then(function () {
sendResponse({'value': true});
});
return MessageResponse.ASYNCHRONOUS;
}
if (topic === 'whitelist:remove-domain') {
stateManager.removeDomainFromWhitelist(value).then(function () {
sendResponse({'value': true});
});
return MessageResponse.ASYNCHRONOUS;
}
};
/**
* Event Handlers
*/
chrome.runtime.onMessage.addListener(messenger._handleMessageReceived);

View File

@@ -25,15 +25,17 @@ var requestAnalyzer = {};
requestAnalyzer.isValidCandidate = function (requestDetails, tabDetails) {
let initiatorHost;
let initiatorDomain, isWhitelisted;
try {
initiatorHost = tabDetails.url.match(Address.DOMAIN_EXPRESSION)[1];
} catch (exception) {
initiatorHost = Address.EXAMPLE;
initiatorDomain = helpers.extractDomainFromUrl(tabDetails.url, true);
if (initiatorDomain === null) {
initiatorDomain = Address.EXAMPLE;
}
if (initiatorHost && requestAnalyzer.whitelistedDomains[requestAnalyzer._normalizeDomain(initiatorHost)]) {
isWhitelisted = requestAnalyzer.whitelistedDomains[initiatorDomain];
if (isWhitelisted) {
return false;
}
@@ -43,10 +45,12 @@ requestAnalyzer.isValidCandidate = function (requestDetails, tabDetails) {
requestAnalyzer.getLocalTarget = function (requestDetails) {
let destinationHost, destinationPath, hostMappings, basePath, resourceMappings;
let destinationUrl, destinationHost, destinationPath, hostMappings, basePath, resourceMappings;
destinationHost = requestDetails.url.match(Address.DOMAIN_EXPRESSION)[1];
destinationPath = requestDetails.url.match(Address.DOMAIN_EXPRESSION)[2];
destinationUrl = new URL(requestDetails.url);
destinationHost = destinationUrl.host;
destinationPath = destinationUrl.pathname;
// Use the proper mappings for the targeted host.
hostMappings = mappings[destinationHost];
@@ -96,12 +100,23 @@ requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channel
if (resourcePattern.startsWith(resourceMold)) {
let targetPath, version;
let targetPath, hostShorthands, version;
targetPath = resourceMappings[resourceMold].path;
targetPath = targetPath.replace(Resource.VERSION_PLACEHOLDER, versionNumber);
version = versionNumber && versionNumber[0] || targetPath.match(Resource.VERSION_EXPRESSION);
hostShorthands = shorthands[channelHost];
if (hostShorthands && hostShorthands[targetPath]) {
let shorthand = hostShorthands[targetPath];
targetPath = shorthand.path;
version = shorthand.version;
} else {
version = versionNumber && versionNumber[0] || targetPath.match(Resource.VERSION_EXPRESSION);
}
// Prepare and return a local target.
return {
@@ -122,17 +137,6 @@ requestAnalyzer._applyWhitelistedDomains = function () {
});
};
requestAnalyzer._normalizeDomain = function (domain) {
domain = domain.toLowerCase().trim();
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX_LENGTH);
}
return domain;
};
/**
* Initializations
*/

73
core/request-sanitizer.js Normal file
View File

@@ -0,0 +1,73 @@
/**
* Request Sanitizer
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2018-01-10
* @license MPL 2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* Request Sanitizer
*/
var requestSanitizer = {};
/**
* Public Methods
*/
requestSanitizer.enable = function () {
let onBeforeSendHeaders = chrome.webRequest.onBeforeSendHeaders;
onBeforeSendHeaders.addListener(requestSanitizer._stripMetadata, {
'urls': stateManager.validHosts
}, [WebRequest.BLOCKING, WebRequest.HEADERS]);
};
requestSanitizer.disable = function () {
let onBeforeSendHeaders = chrome.webRequest.onBeforeSendHeaders;
onBeforeSendHeaders.removeListener(requestSanitizer._stripMetadata, {
'urls': stateManager.validHosts
}, [WebRequest.BLOCKING, WebRequest.HEADERS]);
};
/**
* Private Methods
*/
requestSanitizer._stripMetadata = function (requestDetails) {
let sensitiveHeaders = [Header.COOKIE, Header.ORIGIN, Header.REFERER];
for (let i = 0; i < requestDetails.requestHeaders.length; ++i) {
if (sensitiveHeaders.indexOf(requestDetails.requestHeaders[i].name) > -1) {
requestDetails.requestHeaders.splice(i--, 1);
}
}
return {
[WebRequest.HEADERS]: requestDetails.requestHeaders
};
};
/**
* Initializations
*/
chrome.storage.local.get({[Setting.STRIP_METADATA]: true}, function (options) {
if (options === null || options.stripMetadata !== false) {
requestSanitizer.enable();
}
});

82
core/shorthands.js Normal file
View File

@@ -0,0 +1,82 @@
/**
* Shorthands
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2018-02-24
* @license MPL 2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* Shorthands
*/
var shorthands = {
// Google Hosted Libraries [Deprecated]
'ajax.googleapis.com': {
'resources/jquery/1.8/jquery.min.js.dec': {
'path': 'resources/jquery/1.8.3/jquery.min.js.dec',
'version': '1.8.3'
},
'resources/jquery/1.7/jquery.min.js.dec': {
'path': 'resources/jquery/1.7.2/jquery.min.js.dec',
'version': '1.7.2'
},
'resources/jquery/1.6/jquery.min.js.dec': {
'path': 'resources/jquery/1.6.4/jquery.min.js.dec',
'version': '1.6.4'
},
'resources/jquery/1.5/jquery.min.js.dec': {
'path': 'resources/jquery/1.5.2/jquery.min.js.dec',
'version': '1.5.2'
},
'resources/jquery/1.4/jquery.min.js.dec': {
'path': 'resources/jquery/1.4.4/jquery.min.js.dec',
'version': '1.4.4'
},
'resources/jquery/1.3/jquery.min.js.dec': {
'path': 'resources/jquery/1.3.2/jquery.min.js.dec',
'version': '1.3.2'
},
'resources/jquery/1.2/jquery.min.js.dec': {
'path': 'resources/jquery/1.2.6/jquery.min.js.dec',
'version': '1.2.6'
}
},
// jQuery CDN [Deprecated]
'code.jquery.com': {
'resources/jquery/1.7/jquery.min.js.dec': {
'path': 'resources/jquery/1.7.0/jquery.min.js.dec',
'version': '1.7.0'
},
'resources/jquery/1.6/jquery.min.js.dec': {
'path': 'resources/jquery/1.6.0/jquery.min.js.dec',
'version': '1.6.0'
},
'resources/jquery/1.5/jquery.min.js.dec': {
'path': 'resources/jquery/1.5.0/jquery.min.js.dec',
'version': '1.5.0'
},
'resources/jquery/1.4/jquery.min.js.dec': {
'path': 'resources/jquery/1.4.0/jquery.min.js.dec',
'version': '1.4.0'
},
'resources/jquery/1.3/jquery.min.js.dec': {
'path': 'resources/jquery/1.3.0/jquery.min.js.dec',
'version': '1.3.0'
}
}
};
// Geekzu Public Service [Mirror]
shorthands['sdn.geekzu.org'] = shorthands['ajax.googleapis.com'];
// USTC Linux User Group [Mirror]
shorthands['ajax.proxy.ustclug.org'] = shorthands['ajax.googleapis.com'];

View File

@@ -37,17 +37,10 @@ stateManager.registerInjection = function (tabIdentifier, injection) {
if (injectionCount > 0) {
chrome.browserAction.setBadgeText({
wrappers.setBadgeText({
'tabId': tabIdentifier,
'text': injectionCount.toString()
});
} else {
chrome.browserAction.setBadgeText({
'tabId': tabIdentifier,
'text': ''
});
}
}
@@ -58,14 +51,14 @@ stateManager.registerInjection = function (tabIdentifier, injection) {
interceptor.amountInjected = items.amountInjected;
chrome.storage.local.set({
'amountInjected': ++interceptor.amountInjected
[Setting.AMOUNT_INJECTED]: ++interceptor.amountInjected
});
});
} else {
chrome.storage.local.set({
'amountInjected': ++interceptor.amountInjected
[Setting.AMOUNT_INJECTED]: ++interceptor.amountInjected
});
}
};
@@ -81,7 +74,7 @@ stateManager.addDomainToWhitelist = function (domain) {
});
};
stateManager.deleteDomainFromWhitelist = function (domain) {
stateManager.removeDomainFromWhitelist = function (domain) {
return new Promise((resolve) => {
@@ -114,12 +107,8 @@ stateManager._createTab = function (tab) {
chrome.webRequest.onBeforeRequest.addListener(function (requestDetails) {
return new Promise((resolve) => {
browser.tabs.get(tabIdentifier).then(function (tab) {
resolve(interceptor.handleRequest(requestDetails, tabIdentifier, tab));
});
});
let tab = stateManager.tabs[tabIdentifier].details || {};
return interceptor.handleRequest(requestDetails, tabIdentifier, tab);
}, requestFilters, [WebRequest.BLOCKING]);
};
@@ -141,7 +130,7 @@ stateManager._updateTab = function (details) {
if (stateManager.showIconBadge === true) {
chrome.browserAction.setBadgeText({
wrappers.setBadgeText({
'tabId': tabIdentifier,
'text': ''
});
@@ -152,25 +141,9 @@ stateManager._updateTab = function (details) {
}
};
stateManager._stripMetadata = function (requestDetails) {
for (let i = 0; i < requestDetails.requestHeaders.length; ++i) {
if (requestDetails.requestHeaders[i].name === WebRequest.ORIGIN_HEADER) {
requestDetails.requestHeaders.splice(i--, 1);
} else if (requestDetails.requestHeaders[i].name === WebRequest.REFERER_HEADER) {
requestDetails.requestHeaders.splice(i--, 1);
}
}
return {
'requestHeaders': requestDetails.requestHeaders
};
};
stateManager._handleStorageChanged = function (changes) {
if ('showIconBadge' in changes) {
if (Setting.SHOW_ICON_BADGE in changes) {
stateManager.showIconBadge = changes.showIconBadge.newValue;
@@ -182,28 +155,19 @@ stateManager._handleStorageChanged = function (changes) {
}
}
if ('stripMetadata' in changes) {
if (Setting.STRIP_METADATA in changes) {
let onBeforeSendHeaders;
onBeforeSendHeaders = chrome.webRequest.onBeforeSendHeaders;
onBeforeSendHeaders.removeListener(stateManager._stripMetadata, {
'urls': stateManager.validHosts
}, [WebRequest.BLOCKING, WebRequest.HEADERS]);
requestSanitizer.disable();
if (changes.stripMetadata.newValue !== false) {
onBeforeSendHeaders.addListener(stateManager._stripMetadata, {
'urls': stateManager.validHosts
}, [WebRequest.BLOCKING, WebRequest.HEADERS]);
requestSanitizer.enable();
}
}
};
stateManager._removeIconBadgeFromTab = function (tab) {
chrome.browserAction.setBadgeText({
wrappers.setBadgeText({
'tabId': tab.id,
'text': ''
});
@@ -227,8 +191,13 @@ chrome.tabs.query({}, function (tabs) {
tabs.forEach(stateManager._createTab);
});
chrome.storage.local.get('showIconBadge', function (items) {
stateManager.showIconBadge = items.showIconBadge || true;
chrome.storage.local.get(Setting.SHOW_ICON_BADGE, function (items) {
if (items.showIconBadge === undefined) {
items.showIconBadge = true;
}
stateManager.showIconBadge = items.showIconBadge;
});
/**
@@ -238,6 +207,17 @@ chrome.storage.local.get('showIconBadge', function (items) {
chrome.tabs.onCreated.addListener(stateManager._createTab);
chrome.tabs.onRemoved.addListener(stateManager._removeTab);
chrome.webRequest.onBeforeRequest.addListener(function (requestDetails) {
if (requestDetails.tabId !== -1) {
stateManager.tabs[requestDetails.tabId].details = {
'url': requestDetails.url
};
}
}, {'types': ['main_frame'], 'urls': [Address.ANY]});
chrome.webNavigation.onCommitted.addListener(stateManager._updateTab, {
'url': [{'urlContains': ':'}]
});
@@ -262,14 +242,4 @@ chrome.webRequest.onBeforeRedirect.addListener(function (requestDetails) {
}, {'urls': [Address.ANY]});
chrome.storage.local.get({'stripMetadata': true}, function (options) {
if (options === null || options.stripMetadata !== false) {
chrome.webRequest.onBeforeSendHeaders.addListener(stateManager._stripMetadata, {
'urls': stateManager.validHosts
}, [WebRequest.BLOCKING, WebRequest.HEADERS]);
}
});
chrome.storage.onChanged.addListener(stateManager._handleStorageChanged);

View File

@@ -8,12 +8,13 @@
"locale_with_underscore":
"ar": "ar"
"bg": "bg"
"cs": "cs"
"da": "da"
"de": "de"
"el": "el"
"et": "et"
"eo": "eo"
"es-ES": "es"
"et": "et"
"fi": "fi"
"fr": "fr"
"he": "he"
@@ -22,10 +23,13 @@
"is": "is"
"it": "it"
"ja": "ja"
"ko": "ko"
"lb": "lb"
"nl": "nl"
"pl": "pl"
"ro": "ro"
"ru": "ru"
"sr": "sr"
"sv-SE": "sv"
"tl": "tl"
"tr": "tr"

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Decentraleyes",
"version": "2.0.1",
"version": "2.0.4",
"author": "Thomas Rientjes",
@@ -39,8 +39,8 @@
"38": "icons/action/icon38.png",
"64": "icons/action/icon64.png"
},
"default_popup": "pages/popup/popup.html",
"browser_style": false
"default_popup": "pages/popup/popup.html",
"browser_style": false
},
"options_ui": {
@@ -49,8 +49,8 @@
"applications": {
"gecko": {
"id": "jid1-BoFifL9Vbdl2zQ@jetpack",
"strict_min_version": "56.0a1"
"id": "jid1-BoFifL9Vbdl2zQ@jetpack",
"strict_min_version": "56.0a1"
}
},

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@@ -20,7 +20,7 @@
var helpers = {};
/**
* Public Functions
* Public Methods
*/
helpers.insertI18nContentIntoDocument = function (document) {
@@ -62,8 +62,9 @@ helpers.languageIsFullySupported = function (language) {
languageSupported = false;
supportedLanguages = [
'ar', 'bg', 'zh-CN', 'zh-TW', 'da', 'nl', 'en', 'et', 'fi', 'fr', 'de',
'el', 'is', 'id', 'pl', 'pt-PT', 'ro', 'ru', 'es', 'sv', 'tr'
'ar', 'bg', 'zh', 'cs', 'da', 'nl', 'en', 'et', 'fi',
'fr', 'de', 'el', 'is', 'id', 'it', 'ja', 'ko', 'lb',
'pl', 'pt', 'ro', 'ru', 'es', 'sv', 'tr'
];
for (let supportedLanguage of supportedLanguages) {
@@ -76,6 +77,65 @@ helpers.languageIsFullySupported = function (language) {
return languageSupported;
};
helpers.normalizeDomain = function (domain) {
domain = domain.toLowerCase().trim();
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX.length);
}
return domain;
};
helpers.extractDomainFromUrl = function (url, normalize) {
let extractedDomain;
try {
extractedDomain = new URL(url).host;
} catch (exception) {
extractedDomain = null;
}
if (extractedDomain === '') {
extractedDomain = null;
}
if (extractedDomain !== null && normalize === true) {
extractedDomain = helpers.normalizeDomain(extractedDomain);
}
return extractedDomain;
};
helpers.extractFilenameFromPath = function (path) {
let pathSegments, filename;
pathSegments = path.split('/');
filename = pathSegments[pathSegments.length - 1];
return filename;
};
helpers.generateRandomHexString = function (length) {
let randomValues, randomHexString;
randomValues = crypto.getRandomValues(new Uint8Array(length));
randomHexString = '';
for (let value of randomValues) {
// eslint-disable-next-line no-bitwise
let hexValue = (0 ^ value & 15 >> 0 / 4).toString(16);
randomHexString += hexValue;
}
return randomHexString;
};
helpers.determineCdnName = function (domainName) {
switch (domainName) {
@@ -102,6 +162,10 @@ helpers.determineCdnName = function (domainName) {
return 'Sina Public Resources';
case 'upcdn.b0.upaiyun.com':
return 'UpYun Library';
case 'sdn.geekzu.org':
return 'Geekzu Public Service [Mirror]';
case 'ajax.proxy.ustclug.org':
return 'USTC Linux User Group [Mirror]';
default:
return 'Unknown';
}
@@ -159,6 +223,13 @@ helpers.determineScriptDirection = function (language) {
return scriptDirection;
};
helpers.formatNumber = function (number) {
if (typeof number === 'number') {
return number.toLocaleString();
}
};
helpers.formatVersion = function (version) {
if (version.indexOf('beta') === -1) {

View File

@@ -0,0 +1,38 @@
/**
* Internal API Wrapper Module
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2017-12-03
* @license MPL 2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* Wrappers
*/
var wrappers = {};
/**
* Public Methods
*/
wrappers.setBadgeBackgroundColor = function (details) {
if (chrome.browserAction.setBadgeBackgroundColor !== undefined) {
chrome.browserAction.setBadgeBackgroundColor(details);
}
};
wrappers.setBadgeText = function (details) {
if (chrome.browserAction.setBadgeText !== undefined) {
chrome.browserAction.setBadgeText(details);
}
};

View File

@@ -10,14 +10,19 @@
<body>
<script src="../../modules/internal/wrappers.js"></script>
<script src="../../modules/internal/helpers.js"></script>
<script src="../../core/constants.js"></script>
<script src="../../core/files.js"></script>
<script src="../../core/resources.js"></script>
<script src="../../core/mappings.js"></script>
<script src="../../core/shorthands.js"></script>
<script src="../../core/request-sanitizer.js"></script>
<script src="../../core/state-manager.js"></script>
<script src="../../core/request-analyzer.js"></script>
<script src="../../core/file-guard.js"></script>
<script src="../../core/messenger.js"></script>
<script src="../../core/interceptor.js"></script>
<script src="../../core/main.js"></script>

View File

@@ -7,15 +7,29 @@ body {
cursor: default;
font-family: 'Noto Sans', Arial, sans-serif !important;
font-size: 12px;
margin-top: -15px;
padding: 10px !important;
}
.option {
margin-bottom: 22px;
margin-top: 25px;
}
.notice {
margin-top: 12px;
border-radius: 3px;
box-sizing: border-box;
margin-top: 25px;
max-width: 470px;
padding: 14px 16px;
}
.notice-default {
background-color: #f1f1f1;
}
.notice-warning {
background-color: #ffa500;
color: #fff;
}
/**
@@ -74,10 +88,58 @@ body {
*/
.icon {
color: #777;
margin-right: 3px;
}
/**
* Buttons
*/
.button {
-moz-user-select: none;
background-color: #f5f5f5;
border-radius: 2px;
border: 1px solid #cfcfcf;
color: #5f5f5f;
cursor: pointer;
float: right;
font-size: 12px;
outline: 0;
padding: 5px 22px;
text-decoration: none;
user-select: none;
white-space: nowrap;
}
.button:hover {
background-color: #fff;
}
.button:active {
background-color: #dedede;
}
.button-warning {
background-color: #ea9700;
border: 1px solid #d88c00;
color: #fff;
}
.button-warning:hover {
background-color: #d88c00;
border-color: #c98200;
}
.button-warning:active {
background-color: #c07c00;
border-color: #b47400;
}
.button-notice {
margin-left: auto;
padding: 5px 9px;
}
/**
* Links
*/
@@ -118,14 +180,19 @@ body {
display: flex;
}
.notice-head {
font-weight: 600;
margin-bottom: 6px;
}
.notice-body {
background-color: #fbfbfb;
border-radius: 3px;
border: 1px solid #e7e7e7;
color: #595959;
display: inline-block;
font-size: 11px;
padding: 8px 10px;
align-items: center;
display: flex;
}
.notice-message {
line-height: 1.3;
margin-right: 14px;
}
/**

View File

@@ -11,8 +11,8 @@
<link rel="stylesheet" type="text/css" href="options.css">
<script defer src="../../modules/fontawesome/packs/solid.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.js"></script>
<script defer src="../../modules/fontawesome/icon-bundle.min.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.min.js"></script>
</head>
@@ -23,6 +23,29 @@
<script src="options.js"></script>
<section class="notice notice-warning hidden" id="notice-block-missing">
<div class="notice-head">
<i class="fai fa-exclamation-triangle icon"></i>
<span data-i18n-content="blockMissingTitle"></span>
</div>
<div class="notice-body" dir="ltr">
<div class="notice-message">
This feature breaks websites. Do not leave it enabled, unless you are prepared to manually whitelist any affected domains.
</div>
<div class="button button-notice button-warning" id="button-block-missing">
Disable
</div>
</div>
</section>
<section class="option">
<div class="title-option">
@@ -105,13 +128,18 @@
</section>
<section class="notice hidden" id="notice-locale">
<section class="notice notice-default hidden" id="notice-locale">
<div class="notice-body" dir="ltr">
<i class="fas fa-exclamation-triangle icon"></i>
Your preferred language is not yet fully supported.
<a class="link-text" href="https://crowdin.com/project/decentraleyes" target="_blank">
<div class="notice-message">
<i class="fai fa-exclamation-triangle icon"></i>
Your preferred language is not yet fully supported.
</div>
<a class="button button-notice" href="https://crowdin.com/project/decentraleyes" target="_blank">
Help Translate
</a>

View File

@@ -23,120 +23,210 @@ var options = {};
* Private Methods
*/
options._renderContents = function () {
document.body.setAttribute('dir', options._scriptDirection);
helpers.insertI18nContentIntoDocument(document);
options._determineOptionValues()
.then(options._renderOptionsPanel);
};
options._renderOptionsPanel = function () {
let whitelistedDomains, domainWhitelist, elements;
whitelistedDomains = options._optionValues.whitelistedDomains;
domainWhitelist = options._serializeWhitelistedDomains(whitelistedDomains);
elements = options._optionElements;
elements.showIconBadge.checked = options._optionValues.showIconBadge;
elements.blockMissing.checked = options._optionValues.blockMissing;
elements.disablePrefetch.checked = options._optionValues.disablePrefetch;
elements.stripMetadata.checked = options._optionValues.stripMetadata;
elements.whitelistedDomains.value = domainWhitelist;
options._registerOptionChangedEventListeners(elements);
options._registerMiscellaneousEventListeners();
if (options._optionValues.blockMissing === true) {
options._renderBlockMissingNotice();
}
if (options._languageSupported === false) {
options._renderLocaleNotice();
}
};
options._renderBlockMissingNotice = function () {
let blockMissingNoticeElement = document.getElementById('notice-block-missing');
blockMissingNoticeElement.setAttribute('class', 'notice notice-warning');
};
options._hideBlockMissingNotice = function () {
let blockMissingNoticeElement = document.getElementById('notice-block-missing');
blockMissingNoticeElement.setAttribute('class', 'notice notice-warning hidden');
};
options._renderLocaleNotice = function () {
let localeNoticeElement = document.getElementById('notice-locale');
localeNoticeElement.setAttribute('class', 'notice notice-default');
};
options._registerOptionChangedEventListeners = function (elements) {
elements.showIconBadge.addEventListener('change', options._onOptionChanged);
elements.blockMissing.addEventListener('change', options._onOptionChanged);
elements.disablePrefetch.addEventListener('change', options._onOptionChanged);
elements.stripMetadata.addEventListener('change', options._onOptionChanged);
elements.whitelistedDomains.addEventListener('keyup', options._onOptionChanged);
};
options._registerMiscellaneousEventListeners = function () {
let blockMissingButtonElement = document.getElementById('button-block-missing');
blockMissingButtonElement.addEventListener('click', function () {
let changeEvent = new Event('change');
options._optionElements.blockMissing.checked = false;
options._optionElements.blockMissing.dispatchEvent(changeEvent);
});
};
options._determineOptionValues = function () {
return new Promise((resolve) => {
let optionKeys = Object.keys(options._optionElements);
chrome.storage.local.get(optionKeys, function (items) {
options._optionValues = items;
resolve();
});
});
};
options._getOptionElement = function (optionKey) {
return document.querySelector(`[data-option=${optionKey}]`);
};
function _normalizeDomain (domain) {
options._getOptionElements = function () {
domain = domain.toLowerCase().trim();
let optionElements = {
[Setting.SHOW_ICON_BADGE]: options._getOptionElement(Setting.SHOW_ICON_BADGE),
[Setting.BLOCK_MISSING]: options._getOptionElement(Setting.BLOCK_MISSING),
[Setting.DISABLE_PREFETCH]: options._getOptionElement(Setting.DISABLE_PREFETCH),
[Setting.STRIP_METADATA]: options._getOptionElement(Setting.STRIP_METADATA),
[Setting.WHITELISTED_DOMAINS]: options._getOptionElement(Setting.WHITELISTED_DOMAINS)
};
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX_LENGTH);
return optionElements;
};
options._configureLinkPrefetching = function (value) {
if (value === false) {
// Restore default values of related preference values.
chrome.privacy.network.networkPredictionEnabled.clear({});
} else {
chrome.privacy.network.networkPredictionEnabled.set({
'value': false
});
}
};
options._serializeWhitelistedDomains = function (whitelistedDomains) {
let domainWhitelist, whitelistedDomainKeys;
whitelistedDomainKeys = Object.keys(whitelistedDomains);
domainWhitelist = '';
whitelistedDomainKeys.forEach(function (domain) {
domainWhitelist = `${domainWhitelist}${domain};`;
});
domainWhitelist = domainWhitelist.slice(0, -1);
domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, '');
return domainWhitelist;
};
options._parseDomainWhitelist = function (domainWhitelist) {
let whitelistedDomains = {};
domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) {
whitelistedDomains[helpers.normalizeDomain(domain)] = true;
});
return whitelistedDomains;
};
/**
* Event Handlers
*/
options._onDocumentLoaded = function () {
let language = navigator.language;
options._optionElements = options._getOptionElements();
options._languageSupported = helpers.languageIsFullySupported(language);
options._scriptDirection = helpers.determineScriptDirection(language);
options._renderContents();
};
options._onOptionChanged = function ({target}) {
let optionKey, optionType, optionValue;
optionKey = target.getAttribute('data-option');
optionType = target.getAttribute('type');
switch (optionType) {
case 'checkbox':
optionValue = target.checked;
break;
default:
optionValue = target.value;
}
return domain;
}
if (optionKey === Setting.BLOCK_MISSING) {
if (optionValue === true) {
options._renderBlockMissingNotice();
} else {
options._hideBlockMissingNotice();
}
}
if (optionKey === Setting.DISABLE_PREFETCH) {
options._configureLinkPrefetching(optionValue);
}
if (optionKey === Setting.WHITELISTED_DOMAINS) {
optionValue = options._parseDomainWhitelist(optionValue);
}
chrome.storage.local.set({
[optionKey]: optionValue
});
};
/**
* Initializations
*/
document.addEventListener('DOMContentLoaded', function () {
let scriptDirection, languageSupported, optionElements;
scriptDirection = helpers.determineScriptDirection(navigator.language);
document.body.setAttribute('dir', scriptDirection);
languageSupported = helpers.languageIsFullySupported(navigator.language);
if (languageSupported === false) {
let localeNoticeElement = document.getElementById('notice-locale');
localeNoticeElement.setAttribute('class', 'notice');
}
helpers.insertI18nContentIntoDocument(document);
optionElements = {
'showIconBadge': options._getOptionElement(Setting.SHOW_ICON_BADGE),
'blockMissing': options._getOptionElement(Setting.BLOCK_MISSING),
'disablePrefetch': options._getOptionElement(Setting.DISABLE_PREFETCH),
'stripMetadata': options._getOptionElement(Setting.STRIP_METADATA),
'whitelistedDomains': options._getOptionElement(Setting.WHITELISTED_DOMAINS)
};
chrome.storage.local.get(Object.keys(optionElements), function (items) {
let whitelistedDomains, domainWhitelist;
whitelistedDomains = items.whitelistedDomains;
domainWhitelist = '';
Object.keys(whitelistedDomains).forEach(function (domain) {
domainWhitelist = `${domainWhitelist}${domain};`;
});
domainWhitelist = domainWhitelist.slice(0, -1);
domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, '');
optionElements.showIconBadge.checked = items.showIconBadge;
optionElements.blockMissing.checked = items.blockMissing;
optionElements.disablePrefetch.checked = items.disablePrefetch;
optionElements.stripMetadata.checked = items.stripMetadata;
optionElements.whitelistedDomains.value = domainWhitelist;
});
let optionChangedHandler = function ({target}) {
let optionKey, optionType, optionValue;
optionKey = target.getAttribute('data-option');
optionType = target.getAttribute('type');
switch (optionType) {
case 'checkbox':
optionValue = target.checked;
break;
default:
optionValue = target.value;
}
if (optionKey === Setting.DISABLE_PREFETCH) {
if (optionValue === false) {
// Restore default values of related preference values.
chrome.privacy.network.networkPredictionEnabled.clear({});
} else {
chrome.privacy.network.networkPredictionEnabled.set({
'value': false
});
}
}
if (optionKey === Setting.WHITELISTED_DOMAINS) {
let domainWhitelist = optionValue;
optionValue = {};
domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) {
optionValue[_normalizeDomain(domain)] = true;
});
}
chrome.storage.local.set({
[optionKey]: optionValue
});
};
optionElements.showIconBadge.addEventListener('change', optionChangedHandler);
optionElements.blockMissing.addEventListener('change', optionChangedHandler);
optionElements.disablePrefetch.addEventListener('change', optionChangedHandler);
optionElements.stripMetadata.addEventListener('change', optionChangedHandler);
optionElements.whitelistedDomains.addEventListener('keyup', optionChangedHandler);
});
document.addEventListener('DOMContentLoaded', options._onDocumentLoaded);

View File

@@ -247,3 +247,14 @@ footer {
font-style: italic;
font-weight: 400;
}
/**
* Compatibility
*/
@media screen and (-webkit-min-device-pixel-ratio: 0) {
body {
width: 348px;
}
}

View File

@@ -2,74 +2,74 @@
<html>
<head>
<head>
<title>Decentraleyes Popup</title>
<title>Decentraleyes Popup</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="popup.css">
<link rel="stylesheet" type="text/css" href="popup.css">
<script defer src="../../modules/fontawesome/packs/solid.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.js"></script>
<script defer src="../../modules/fontawesome/icon-bundle.min.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.min.js"></script>
</head>
</head>
<body>
<body>
<script src="../../core/constants.js"></script>
<script src="../../modules/internal/helpers.js"></script>
<script src="../../core/constants.js"></script>
<script src="../../modules/internal/helpers.js"></script>
<script src="popup.js"></script>
<script src="popup.js"></script>
<header>
<header>
<img class="icon-logo" src="icon.svg" alt="Extension Icon">
<div class="heading">Decentraleyes <sup id="version-label" class="label-version"></sup></div>
<img class="icon-logo" src="icon.svg" alt="Extension Icon">
<div class="heading">Decentraleyes <sup id="version-label" class="label-version"></sup></div>
</header>
</header>
<section class="content">
<section class="content">
<div id="website-context" class="panel hidden">
<div id="website-context" class="panel hidden">
<div class="subpanel">
<div class="subpanel">
<div id="protection-toggle-button" class="button button-toggle active">
<i class="fas fa-power-off" data-fa-transform="grow-2"></i>
</div>
<div id="protection-toggle-button" class="button button-toggle active">
<i class="fai fa-power-off" data-fa-transform="grow-2 down-.5"></i>
</div>
<div class="label-domain">
<i class="icon fai fa-globe fa-lg" data-fa-transform="down-1"></i>
<span id="domain-indicator"></span>
</div>
<div class="label-domain">
<i class="icon fas fa-globe fa-lg" data-fa-transform="down-1"></i>
<span id="domain-indicator"></span>
</div>
</div>
</div>
<div id="extension-context" class="panel">
<div id="extension-context" class="panel">
<div id="injection-counter" class="counter">0</div>
<div id="injection-counter" class="counter">0</div>
<div class="subheading" data-i18n-content="amountInjectedTitle"></div>
<div class="description" data-i18n-content="amountInjectedDescription"></div>
<div class="subheading" data-i18n-content="amountInjectedTitle"></div>
<div class="description" data-i18n-content="amountInjectedDescription"></div>
</div>
</div>
</section>
</section>
<footer>
<footer>
<span id="testing-utility-link" class="link-text">decentraleyes.org/test</span>
<span id="testing-utility-link" class="link-text">decentraleyes.org/test</span>
<div id="options-button" class="button" data-i18n-title="optionsTitle">
<i class="fai fa-cog" data-fa-transform="grow-2 down-.5"></i>
</div>
<div id="options-button" class="button" data-i18n-title="optionsTitle">
<i class="fas fa-cog" data-fa-transform="grow-2"></i>
</div>
</footer>
</footer>
</body>
</body>
</html>

View File

@@ -20,237 +20,342 @@
var popup = {};
/**
* Initializations
* Private Methods
*/
document.addEventListener('DOMContentLoaded', function () {
let version, optionsButtonElement, scriptDirection;
version = helpers.formatVersion(chrome.runtime.getManifest().version);
document.getElementById('version-label').innerText = version;
scriptDirection = helpers.determineScriptDirection(navigator.language);
optionsButtonElement = document.getElementById('options-button');
popup._renderContents = function () {
helpers.insertI18nContentIntoDocument(document);
helpers.insertI18nTitlesIntoDocument(document);
chrome.storage.local.get('amountInjected', function (items) {
popup._renderNonContextualContents();
let amountInjected = items.amountInjected || 0;
document.getElementById('injection-counter').innerText = amountInjected;
popup._determineTargetTab()
.then(popup._determineDomainWhitelistStatus)
.then(popup._determineResourceInjections)
.then(popup._renderContextualContents);
};
popup._renderNonContextualContents = function () {
let versionLabelElement, counterElement, testingUtilityLinkElement, optionsButtonElement;
versionLabelElement = document.getElementById('version-label');
counterElement = document.getElementById('injection-counter');
testingUtilityLinkElement = document.getElementById('testing-utility-link');
optionsButtonElement = document.getElementById('options-button');
versionLabelElement.innerText = popup._version;
counterElement.innerText = helpers.formatNumber(popup._amountInjected);
testingUtilityLinkElement.addEventListener('mouseup', popup._onTestingUtilityLinkClicked);
optionsButtonElement.addEventListener('mouseup', popup._onOptionsButtonClicked);
};
popup._renderContextualContents = function () {
if (popup._domain !== null) {
popup._renderDomainWhitelistPanel();
}
if (Object.keys(popup._resourceInjections).length > 0) {
popup._renderInjectionPanel(popup._resourceInjections);
}
};
popup._renderDomainWhitelistPanel = function () {
let websiteContextElement, protectionToggleElement, domainIndicatorElement;
websiteContextElement = document.getElementById('website-context');
protectionToggleElement = document.getElementById('protection-toggle-button');
domainIndicatorElement = document.getElementById('domain-indicator');
protectionToggleElement.setAttribute('dir', popup._scriptDirection);
domainIndicatorElement.innerText = popup._domain;
if (popup._domainIsWhitelisted === true) {
let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
protectionToggleElement.setAttribute('class', 'button button-toggle');
protectionToggleElement.addEventListener('click', popup._enableProtection);
protectionToggleElement.setAttribute('title', enableProtectionTitle);
} else {
let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
protectionToggleElement.setAttribute('class', 'button button-toggle active');
protectionToggleElement.addEventListener('click', popup._disableProtection);
protectionToggleElement.setAttribute('title', disableProtectionTitle);
}
websiteContextElement.setAttribute('class', 'panel');
};
popup._renderInjectionPanel = function (groupedInjections) {
let websiteContextElement, injectionOverviewElement;
websiteContextElement = document.getElementById('website-context');
injectionOverviewElement = popup._createInjectionOverviewElement(groupedInjections);
websiteContextElement.append(injectionOverviewElement);
};
popup._enableProtection = function () {
let message = {
'topic': 'whitelist:remove-domain',
'value': popup._domain
};
chrome.runtime.sendMessage(message, function () {
popup._onProtectionToggled();
});
};
popup._disableProtection = function () {
let message = {
'topic': 'whitelist:add-domain',
'value': popup._domain
};
chrome.runtime.sendMessage(message, function () {
popup._onProtectionToggled();
});
};
popup._determineDomainWhitelistStatus = function () {
return new Promise((resolve) => {
let message = {
'topic': 'domain:fetch-is-whitelisted',
'value': popup._domain
};
chrome.runtime.sendMessage(message, function (response) {
popup._domainIsWhitelisted = response.value;
resolve();
});
});
};
popup._determineResourceInjections = function () {
return new Promise((resolve) => {
let message = {
'topic': 'tab:fetch-injections',
'value': popup._targetTab.id
};
chrome.runtime.sendMessage(message, function (response) {
let groupedInjections = popup._groupResourceInjections(response.value);
popup._resourceInjections = groupedInjections;
resolve();
});
});
};
popup._determineTargetTab = function () {
return new Promise((resolve) => {
chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) {
chrome.runtime.getBackgroundPage(function (backgroundPage) {
popup._targetTab = tabs[0];
popup._domain = helpers.extractDomainFromUrl(tabs[0].url);
if (backgroundPage === null) {
return;
}
if (popup._domain !== null) {
popup._domain = helpers.normalizeDomain(popup._domain);
}
popup.backgroundPage = backgroundPage;
if (backgroundPage.main.operatingSystem === chrome.runtime.PlatformOs.ANDROID) {
browser.tabs.getCurrent().then(function (tab) {
browser.tabs.update(tab.id, {
'active': true
});
});
}
let injections, injectionOverview, domain;
injections = backgroundPage.stateManager.tabs[tabs[0].id].injections;
injectionOverview = {};
try {
domain = tabs[0].url.match(Address.DOMAIN_EXPRESSION)[1];
} catch (exception) {
domain = null;
}
if (domain !== null) {
let websiteContextElement, protectionToggleElement, domainIndicatorElement;
websiteContextElement = document.getElementById('website-context');
protectionToggleElement = document.getElementById('protection-toggle-button');
domainIndicatorElement = document.getElementById('domain-indicator');
if (domain.startsWith(Address.WWW_PREFIX)) {
domain = domain.slice(Address.WWW_PREFIX_LENGTH);
}
domainIndicatorElement.innerText = domain;
if (backgroundPage.requestAnalyzer.whitelistedDomains[domain]) {
protectionToggleElement.setAttribute('class', 'button button-toggle');
let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle');
protectionToggleElement.setAttribute('title', enableProtectionTitle);
protectionToggleElement.addEventListener('click', function () {
backgroundPage.stateManager.deleteDomainFromWhitelist(domain).then(function () {
chrome.tabs.reload(tabs[0].id);
if (backgroundPage.main.operatingSystem === chrome.runtime.PlatformOs.ANDROID) {
return browser.tabs.getCurrent().then(function (tab) {
browser.tabs.remove(tab.id);
});
}
return window.close();
});
});
} else {
protectionToggleElement.setAttribute('class', 'button button-toggle active');
let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle');
protectionToggleElement.setAttribute('title', disableProtectionTitle);
protectionToggleElement.setAttribute('dir', scriptDirection);
protectionToggleElement.addEventListener('click', function () {
backgroundPage.stateManager.addDomainToWhitelist(domain).then(function () {
chrome.tabs.reload(tabs[0].id);
if (backgroundPage.main.operatingSystem === chrome.runtime.PlatformOs.ANDROID) {
return browser.tabs.getCurrent().then(function (tab) {
browser.tabs.remove(tab.id);
});
}
return window.close();
});
});
}
websiteContextElement.setAttribute('class', 'panel');
}
for (let injection in injections) {
injection = injections[injection];
let injectionSource = injection.source;
injectionOverview[injectionSource] = injectionOverview[injectionSource] || [];
injectionOverview[injectionSource].push({
'path': injection.path,
'version': injection.version,
'source': injection.source
});
}
let listElement = document.createElement('ul');
listElement.setAttribute('class', 'list');
for (let injectionSource in injectionOverview) {
let cdn, listItemElement, badgeElement, badgeTextNode, cdnName, cdnNameTextNode, subListElement;
cdn = injectionOverview[injectionSource];
listItemElement = document.createElement('li');
listItemElement.setAttribute('class', 'list-item');
badgeElement = document.createElement('span');
badgeElement.setAttribute('class', 'badge');
badgeTextNode = document.createTextNode(cdn.length);
badgeElement.appendChild(badgeTextNode);
cdnName = helpers.determineCdnName(injectionSource);
cdnNameTextNode = document.createTextNode(cdnName);
listItemElement.appendChild(badgeElement);
listItemElement.appendChild(cdnNameTextNode);
listElement.appendChild(listItemElement);
subListElement = document.createElement('ul');
subListElement.setAttribute('class', 'sublist');
listElement.appendChild(subListElement);
for (let injection of cdn) {
let subListItemElement, resourcePathDetails, resourceFilename, resourceName,
resourceNameTextNode, sideNoteElement, sideNoteTextNode;
subListItemElement = document.createElement('li');
subListItemElement.setAttribute('class', 'sublist-item');
resourcePathDetails = injection.path.split('/');
resourceFilename = resourcePathDetails[resourcePathDetails.length - 1];
resourceName = helpers.determineResourceName(resourceFilename);
resourceNameTextNode = document.createTextNode(`- ${resourceName}`);
subListItemElement.appendChild(resourceNameTextNode);
sideNoteElement = document.createElement('span');
sideNoteElement.setAttribute('class', 'side-note');
sideNoteTextNode = document.createTextNode(` v${injection.version}`);
sideNoteElement.appendChild(sideNoteTextNode);
subListItemElement.appendChild(sideNoteElement);
subListElement.appendChild(subListItemElement);
}
}
if (Object.keys(injectionOverview).length > 0) {
let websiteContextElement = document.getElementById('website-context');
websiteContextElement.append(listElement);
}
});
resolve();
});
});
};
popup._determineAmountInjected = function () {
return new Promise((resolve) => {
chrome.storage.local.get(Setting.AMOUNT_INJECTED, function (items) {
popup._amountInjected = items.amountInjected || 0;
resolve();
});
});
};
popup._groupResourceInjections = function (injections) {
let groupedInjections = {};
for (let index in injections) {
let {source} = injections[index];
groupedInjections[source] = groupedInjections[source] || [];
groupedInjections[source].push(injections[index]);
}
return groupedInjections;
};
popup._createInjectionOverviewElement = function (groupedInjections) {
let injectionOverviewElement = document.createElement('ul');
injectionOverviewElement.setAttribute('class', 'list');
for (let source in groupedInjections) {
let injectionGroupHeaderElement, injectionGroupElement, cdn;
cdn = groupedInjections[source];
injectionGroupHeaderElement = popup._createInjectionGroupHeaderElement(source, cdn);
injectionGroupElement = popup._createInjectionGroupElement(source, cdn);
injectionOverviewElement.appendChild(injectionGroupHeaderElement);
injectionOverviewElement.appendChild(injectionGroupElement);
}
return injectionOverviewElement;
};
popup._createInjectionGroupHeaderElement = function (source, cdn) {
let injectionGroupHeaderElement, badgeElement, badgeTextNode, cdnNameTextNode;
injectionGroupHeaderElement = document.createElement('li');
injectionGroupHeaderElement.setAttribute('class', 'list-item');
badgeElement = document.createElement('span');
badgeElement.setAttribute('class', 'badge');
badgeTextNode = document.createTextNode(cdn.length);
badgeElement.appendChild(badgeTextNode);
cdnNameTextNode = document.createTextNode(helpers.determineCdnName(source));
injectionGroupHeaderElement.appendChild(badgeElement);
injectionGroupHeaderElement.appendChild(cdnNameTextNode);
return injectionGroupHeaderElement;
};
popup._createInjectionGroupElement = function (source, cdn) {
let injectionGroupElement;
injectionGroupElement = document.createElement('ul');
injectionGroupElement.setAttribute('class', 'sublist');
for (let injection of cdn) {
let injectionElement = popup._createInjectionElement(injection);
injectionGroupElement.appendChild(injectionElement);
}
return injectionGroupElement;
};
popup._createInjectionElement = function (injection) {
let injectionElement, filename, name, nameTextNode, noteElement, noteTextNode;
injectionElement = document.createElement('li');
injectionElement.setAttribute('class', 'sublist-item');
filename = helpers.extractFilenameFromPath(injection.path);
name = helpers.determineResourceName(filename);
nameTextNode = document.createTextNode(`- ${name}`);
injectionElement.appendChild(nameTextNode);
noteElement = document.createElement('span');
noteElement.setAttribute('class', 'side-note');
noteTextNode = document.createTextNode(` v${injection.version}`);
noteElement.appendChild(noteTextNode);
injectionElement.appendChild(noteElement);
return injectionElement;
};
popup._close = function () {
chrome.runtime.getPlatformInfo(function (information) {
optionsButtonElement.addEventListener('mouseup', function () {
if (information.os === chrome.runtime.PlatformOs.ANDROID) {
if (information.os === chrome.runtime.PlatformOs.ANDROID) {
return chrome.tabs.create({
'url': chrome.extension.getURL('pages/options/options.html')
});
}
chrome.runtime.openOptionsPage();
return window.close();
});
});
document.getElementById('testing-utility-link').addEventListener('mouseup', function (event) {
if (event.button === 0 || event.button === 1) {
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'active': (event.button === 0)
chrome.tabs.getCurrent(function (tab) {
chrome.tabs.remove(tab.id);
});
}
if (event.button === 0) {
} else {
window.close();
}
});
});
};
/**
* Event Handlers
*/
popup._onDocumentLoaded = function () {
let manifest, language;
manifest = chrome.runtime.getManifest();
language = navigator.language;
popup._version = helpers.formatVersion(manifest.version);
popup._scriptDirection = helpers.determineScriptDirection(language);
popup._determineAmountInjected()
.then(popup._renderContents);
};
popup._onTestingUtilityLinkClicked = function (event) {
if (event.button === 0 || event.button === 1) {
chrome.tabs.create({
'url': 'https://decentraleyes.org/test',
'active': (event.button === 0)
});
}
if (event.button === 0) {
window.close();
}
};
popup._onOptionsButtonClicked = function () {
chrome.runtime.openOptionsPage();
return window.close();
};
popup._onProtectionToggled = function () {
let bypassCache = (typeof browser === 'undefined');
chrome.tabs.reload(popup._targetTab.id, {bypassCache});
popup._close();
};
/**
* Initializations
*/
document.addEventListener('DOMContentLoaded', popup._onDocumentLoaded);

View File

@@ -2,79 +2,79 @@
<html>
<head>
<head>
<title>2.0 Says Hello - Decentraleyes</title>
<title>2.0 Says Hello - Decentraleyes</title>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="welcome.css">
<link rel="stylesheet" type="text/css" href="welcome.css">
<script defer src="../../modules/fontawesome/packs/solid.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.js"></script>
<script defer src="../../modules/fontawesome/icon-bundle.min.js"></script>
<script defer src="../../modules/fontawesome/fontawesome.min.js"></script>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="icon" href="favicon.ico" type="image/x-icon">
</head>
</head>
<body>
<body>
<img src="logo.svg" alt="Decentraleyes" class="logo"/>
<img src="logo.svg" alt="Decentraleyes" class="logo"/>
<div class="container">
<div class="container">
<h1>What's new in version 2.0?</h1>
<h1>What's new in version 2.0?</h1>
<div class="notice">
<div class="notice">
<span class="subtle-hint"><span class="topic-label">A Completely New Foundation</span><br>Decentraleyes has been fully rebuilt, on top of cutting-edge web technologies. As a result, it's even faster, more capable, and ready for upcoming versions of Firefox.</span>
<span class="subtle-hint"><span class="topic-label">A Completely New Foundation</span><br>Decentraleyes has been fully rebuilt, on top of cutting-edge web technologies. As a result, it's even faster, more capable, and ready for upcoming versions of Firefox.</span>
<div class="topic-badge"><i class="fas fa-cube"></i></div>
<div class="topic-badge"><i class="fai fa-cube"></i></div>
</div>
<div class="notice">
<div class="topic-badge color-purple"><i class="fai fa-window-restore fa-flip-horizontal"></i></div>
<span class="subtle-hint"><span class="topic-label color-purple">A Clear User Interface</span><br>The extension is finally less shy about what it does to protect you. It shows you what exactly it injects into given pages, and puts all available features right at your fingertips.</span>
</div>
<div class="notice">
<span class="subtle-hint"><span class="topic-label">Improved Configurability</span><br>The options screen has been updated to give you more control over the extension. Settings that impact privacy, or website functionality, are now explicitly labeled as advanced.</span>
<div class="topic-badge"><i class="fai fa-cog"></i></div>
</div>
<div class="notice">
<div class="topic-badge color-purple"><i class="fai fa-power-off"></i></div>
<span class="subtle-hint"><span class="topic-label color-purple">Simplified Whitelist Management</span><br>Excluding the domain you're visiting from inspections is now easier than ever. Just open up the popup panel, and use the dedicated button, to disable protection for said site.</span>
</div>
<h1>Learn more, or contribute</h1>
<div class="btn-panel">
<a class="btn btn-website" href="https://decentraleyes.org" target="_blank"><i class="btn-icon fai fa-globe" data-fa-transform="grow-2"></i><span class="btn-text">Website</span></a>
<a class="btn btn-github" href="https://github.com/Synzvato/decentraleyes" target="_blank"><i class="btn-icon fai fa-github-alt" data-fa-transform="grow-2"></i><span class="btn-text">GitHub</span></a>
<a class="btn btn-bitcoin" href="https://decentraleyes.org/donate/bitcoin/" target="_blank"><i class="btn-icon fai fa-btc" data-fa-transform="grow-2"></i><span class="btn-text">Bitcoin</span></a>
<a class="btn btn-monero" href="https://decentraleyes.org/donate/monero/" target="_blank"><i class="btn-icon fai fa-monero" data-fa-transform="grow-2"></i><span class="btn-text">Monero</span></a>
</div>
</div>
<div class="notice">
<div class="topic-badge color-purple"><i class="fas fa-browser fa-flip-horizontal"></i></div>
<span class="subtle-hint"><span class="topic-label color-purple">A Clear User Interface</span><br>The extension is finally less shy about what it does to protect you. It shows you what exactly it injects into given pages, and puts all available features right at your fingertips.</span>
</div>
<div class="notice">
<span class="subtle-hint"><span class="topic-label">Improved Configurability</span><br>The options screen has been updated to give you more control over the extension. Settings that impact privacy, or website functionality, are now explicitly labeled as advanced.</span>
<div class="topic-badge"><i class="fas fa-cog"></i></div>
</div>
<div class="notice">
<div class="topic-badge color-purple"><i class="fas fa-power-off"></i></div>
<span class="subtle-hint"><span class="topic-label color-purple">Simplified Whitelist Management</span><br>Excluding the domain you're visiting from inspections is now easier than ever. Just open up the popup panel, and use the dedicated button, to disable protection for said site.</span>
</div>
<h1>Learn more, or contribute</h1>
<div class="btn-panel">
<a class="btn btn-website" href="https://decentraleyes.org" target="_blank"><i class="btn-icon fas fa-globe" data-fa-transform="grow-2"></i><span class="btn-text">Website</span></a>
<a class="btn btn-github" href="https://github.com/Synzvato/decentraleyes" target="_blank"><i class="btn-icon fas fa-github-alt" data-fa-transform="grow-2"></i><span class="btn-text">GitHub</span></a>
<a class="btn btn-bitcoin" href="https://decentraleyes.org/donate/bitcoin/" target="_blank"><i class="btn-icon fas fa-btc" data-fa-transform="grow-2"></i><span class="btn-text">Bitcoin</span></a>
<a class="btn btn-monero" href="https://decentraleyes.org/donate/monero/" target="_blank"><i class="btn-icon fas fa-monero" data-fa-transform="grow-2"></i><span class="btn-text">Monero</span></a>
</div>
</div>
</body>
</body>
</html>