44 Commits

Author SHA1 Message Date
Thomas Rientjes
ab43484f30 Bump version to 2.0.4 2018-05-29 01:23:55 +02:00
Thomas Rientjes
2a3e508441 Update and refactor existing codebase 2018-05-29 01:18:53 +02:00
Thomas Rientjes
1a7f41ee0a Merge pull request #258 from gorhill/experimental
Hide web accessible resources from websites
2018-05-14 23:14:47 +02:00
Raymond Hill
e6a5de1683 Guard web accessible resources from direct access by outside world
With Chromium-based browsers, web pages can access directly
Decentraleyes' web accessible resources, and thus detect
whether Decentraleyes is used by a visitor.

This potentially adds one bit of information to fingerprinting.

See: "Discovering Browser Extensions via Web Accessible Resources"
www.cse.chalmers.se/~andrei/codaspy17.pdf

Proof-of-concept: https://jsfiddle.net/fuqrudcs/

The change here is to use a secret when accessing a web accessible
resource. If the secret is not present when the resource is fetched
by the browser, the behavior will be the same as if the resource
is not web accessible.

When Decentraleyes redirects a request to one of its web
accessible resources, the secret is appended at the end of the
local URL as a query parameter.

The secret is generated at runtime when Decentraleyes is launched.
2018-03-06 12:24:48 -05:00
Thomas Rientjes
4c8262599e Bump version to 2.0.3 2018-02-21 15:41:55 -03:00
Thomas Rientjes
53c8dd2a1c Update and refactor existing codebase 2018-02-21 15:15:10 -03:00
Thomas Rientjes
b5d09327b8 Bump version to 2.0.2 2018-01-09 01:40:38 -03:00
Thomas Rientjes
9fe8cfb6d3 Update manifest.json 2018-01-09 01:39:49 -03:00
Thomas Rientjes
0072d3bf59 Update welcome page 2018-01-09 01:36:03 -03:00
Thomas Rientjes
e9ccd3e290 Update and refactor existing codebase 2018-01-08 14:52:54 -03:00
Thomas Rientjes
52c9b40c59 Bump version to 2.0.1 2017-11-20 15:05:58 -03:00
Thomas Rientjes
50428fcdc6 Update and refactor existing codebase 2017-11-20 14:50:11 -03:00
Thomas Rientjes
e1b80f73ae Apply fixes and optimizations 2017-11-10 15:25:31 -03:00
Thomas Rientjes
81f60022e8 Refactor existing codebase 2017-11-07 18:27:55 -03:00
Thomas Rientjes
00998af264 Rename ESLint configuration file 2017-11-07 18:04:38 -03:00
Thomas Rientjes
7f80465972 Merge pull request #168 from CapacitorSet/experimental
Add ESLint configuration files
2017-11-04 00:23:08 -03:00
Thomas Rientjes
90c1374c8d Bump version to 2.0.0 2017-10-31 14:39:23 -03:00
Thomas Rientjes
fd59656bb3 Improve tab URL detection logic 2017-10-31 13:10:24 -03:00
Thomas Rientjes
2e1ff77b1c Update and refactor existing codebase 2017-10-28 22:01:39 -03:00
Thomas Rientjes
318058e920 Update existing localizations 2017-10-28 22:00:12 -03:00
Thomas Rientjes
cffd907f88 Modify resource bundle libraries 2017-10-28 21:58:05 -03:00
Thomas Rientjes
b4a5aaf9d2 Refactor existing codebase 2017-08-09 19:49:04 -04:00
Thomas Rientjes
50ee191e22 Replace unnecessary assignments to innerHTML 2017-05-04 01:45:46 +02:00
Capacitor Set
17f4c986fd Fix eslint warnings 2017-04-30 21:24:28 +02:00
Capacitor Set
cc8898a386 Fix indentation error 2017-04-30 21:21:43 +02:00
Capacitor Set
c71216522f Add eslint config 2017-04-30 21:13:22 +02:00
Thomas Rientjes
d036d73ae2 Add support for Greek 2017-04-24 20:45:40 +02:00
Thomas Rientjes
4ded48a07f Update and localize extension description 2017-03-17 21:40:17 +01:00
Thomas Rientjes
5ce6d5f819 Bump version to 1.3.7.5 2017-03-17 00:42:27 +01:00
Thomas Rientjes
0e1b8bf8af Update README.md 2017-03-17 00:40:50 +01:00
Thomas Rientjes
bde8e6357b Implement context stripping for allowed CDN requests 2017-03-17 00:31:58 +01:00
Thomas Rientjes
51c076e984 Fix Subresource Integrity (SRI) validation issues 2017-03-16 21:39:30 +01:00
Thomas Rientjes
037ad24370 Implement request filters to improve performance 2017-03-15 13:58:04 +01:00
Thomas Rientjes
746c5694fb Update README.md 2017-03-14 20:09:23 +01:00
Thomas Rientjes
e7e56deca7 Bump version to 1.3.7.4 2017-03-14 18:28:20 +01:00
Thomas Rientjes
db4b4986de Fix a rare injection counter issue 2017-03-14 18:26:28 +01:00
Thomas Rientjes
bb31683bba Bump version to 1.3.7.3 2017-03-14 01:03:20 +01:00
Thomas Rientjes
3e8b347d6b Improve injection state management 2017-03-14 01:01:18 +01:00
Thomas Rientjes
82750cd381 Implement injection overview and icon badge 2017-03-13 19:29:18 +01:00
Thomas Rientjes
c5b9eda31a Bump version to 1.3.7.2 2017-03-13 17:41:16 +01:00
Thomas Rientjes
00f8bcbac4 Fix popup icon display issue 2017-03-13 09:27:47 +01:00
Thomas Rientjes
826cfd9f72 Improve compatibility with HTTPS Everywhere 2017-03-10 08:52:39 +01:00
Thomas Rientjes
b7392bca64 Add README.md and LICENSE.txt 2017-03-08 15:10:26 +01:00
Thomas Rientjes
3fc2648990 Add project files 2017-03-08 14:52:32 +01:00
350 changed files with 6087 additions and 2453 deletions

6
.eslintignore Normal file
View File

@@ -0,0 +1,6 @@
_locales
audit
icons
modules/*
!modules/internal
resources

179
.eslintrc Normal file
View File

@@ -0,0 +1,179 @@
{
"env": {
"browser": true,
"es6": true,
"webextensions": true
},
"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,
"WebRequestType": true,
"Whitelist": true,
"wrappers": true
},
"overrides": {
"files": [
"core/constants.js",
"core/files.js",
"core/mappings.js",
"core/resources.js",
"core/shorthands.js"
],
"rules": {
"no-unused-vars": "off"
}
},
"plugins": [
"no-unsanitized"
],
"rules": {
"array-bracket-newline": "error",
"array-bracket-spacing": "error",
"arrow-body-style": "error",
"arrow-parens": "error",
"arrow-spacing": "error",
"block-spacing": "error",
"brace-style": "error",
"camelcase": "error",
"comma-spacing": "error",
"comma-style": "error",
"computed-property-spacing": "error",
"consistent-this": "error",
"curly": "error",
"eol-last": "error",
"eqeqeq": "error",
"func-call-spacing": "error",
"function-paren-newline": "error",
"generator-star-spacing": "error",
"indent": [
"error",
4
],
"key-spacing": "error",
"keyword-spacing": "error",
"linebreak-style": [
"error",
"unix"
],
"new-cap": "error",
"new-parens": "error",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-confusing-arrow": "error",
"no-continue": "error",
"no-duplicate-imports": "error",
"no-eval": "error",
"no-extend-native": "error",
"no-implicit-coercion": "error",
"no-implied-eval": "error",
"no-invalid-this": "error",
"no-iterator": "error",
"no-label-var": "error",
"no-labels": "error",
"no-lone-blocks": "error",
"no-loop-func": "error",
"no-multi-spaces": "error",
"no-multi-str": "error",
"no-multiple-empty-lines": [
"error", {
"max": 1,
"maxEOF": 1,
"maxBOF": 0
}
],
"max-len": [
"error", {
"code": 120
}
],
"no-negated-condition": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-new-wrappers": "error",
"no-octal-escape": "error",
"no-proto": "error",
"no-return-assign": "error",
"no-return-await": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-shadow-restricted-names": "error",
"no-tabs": "error",
"no-ternary": "error",
"no-throw-literal": "error",
"no-trailing-spaces": "error",
"no-undef-init": "error",
"no-unmodified-loop-condition": "error",
"no-unused-expressions": "error",
"no-use-before-define": "error",
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-constructor": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-void": "error",
"no-warning-comments": "warn",
"no-whitespace-before-property": "error",
"no-with": "error",
"object-curly-spacing": "error",
"object-shorthand": [
"error",
"consistent-as-needed"
],
"operator-assignment": "error",
"operator-linebreak": "error",
"prefer-numeric-literals": "error",
"prefer-promise-reject-errors": "error",
"quote-props": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"prefer-template": "error",
"quotes": [
"error",
"single"
],
"rest-spread-spacing": "error",
"require-await": "error",
"semi": "error",
"semi-spacing": "error",
"semi-style": "error",
"space-before-blocks": "error",
"space-before-function-paren": "error",
"space-in-parens": "error",
"space-infix-ops": "error",
"space-unary-ops": "error",
"spaced-comment": "error",
"strict": [
"error",
"global"
],
"switch-colon-spacing": "error",
"symbol-description": "error",
"template-curly-spacing": "error",
"template-tag-spacing": "error",
"unicode-bom": "error",
"vars-on-top": "error",
"wrap-regex": "error",
"yield-star-spacing": "error",
"yoda": "error"
}
}

6
.gitignore vendored
View File

@@ -1,4 +1,2 @@
data/_audit/node_modules
data/_audit/report.txt
*.xpi
.idea
audit/node_modules
audit/report.txt

View File

@@ -1,8 +0,0 @@
data/_audit/node_modules
data/_audit/report.txt
.jpmignore
.gitignore
.idea
*.xpi
test
.git

View File

@@ -1,49 +1,35 @@
Decentraleyes
Decentraleyes (Experimental)
=============
A [Firefox add-on](https://addons.mozilla.org/firefox/addon/decentraleyes) that emulates Content Delivery Networks (CDNs) locally by intercepting requests, finding the required resource and injecting it into the environment. This all happens instantaneously, automatically, and no prior configuration is required. Feel free to use this [testing utility](https://decentraleyes.org/test) to see if it's properly installed, enabled, and correctly configured.
A reimplementation of current features of Decentraleyes. This project will help bring Decentraleyes to WebExtensions (Firefox 57 and higher), as well as Chromium-based browsers, Opera, and possibly even Edge.
> **Note:** Decentraleyes is no silver bullet, but it does prevent a lot of websites from making you send these kinds of requests. Ultimately, you can make Decentraleyes block requests for any missing CDN resources, too.
## Changelog
## Roadmap
Below is a list of all notable changes made to the reimplementation project to date. This includes, but is most certainly not limited to, records of changes such as bug fixes, and new, removed, and updated features.
Now that there's a solid, Mozilla approved, foundation, it's time to move forward. Mobility, extensibility (through support for community-powered resource packages), and usability, will be the main points of attention during this phase.
### v1.3.7.5
#### Essential Next Steps
* Fix Subresource Integrity (SRI) validation issues.
* Implement context stripping for allowed CDN requests.
* Implement request filters to improve performance.
* Start work on a resource bundle standard, to allow users to create and import custom resources. With support for these bundles in place, Decentraleyes will still work out of the box, but can be extended if needed.
* To keep this add-on from turning into bloatware, it's important to find out which versions of which libraries are most commonly used on websites, so that less popular resources can be removed from the default bundle.
### v1.3.7.4
#### Planned Features
* Fix rare injection counter issue.
* Advanced policy management for users who block requests for missing resources.
* Smarter resource version interpretation for handling dynamic notations.
* A minimalistic and non-essential graphical user interface.
* Support for custom, importable, library repositories.
### v1.3.7.3
> **Note:** These long-term goals are subjective to change, and can be discussed. That is, as long as the suggestions do not conflict with the ultimate goal of realizing a free and open standard for exchanging web resource bundles.
* Improve injection state management _(requires a new permission)_.
* Implement injection overview and icon badge.
## Submitting Translations
### v1.3.7.2
Do you master a non-supported language? Please help out by translating this add-on on [Crowdin](https://crowdin.com/project/decentraleyes).
* Fix popup icon display issue.
## Contributing Code
### v1.3.7.1
Suggestions in the form of **Issues** and contributions in the form of **Pull Requests** are highly welcome. You can also use the contact details and PGP key on the add-on [download page](https://addons.mozilla.org/firefox/addon/decentraleyes) to get in touch.
* Improve compatibility with HTTPS Everywhere.
#### Prerequisites
### v1.3.7
* Jetpack Manager [jpm](https://developer.mozilla.org/Add-ons/SDK/Tools/jpm#Installation) (a Node-based replacement for cfx).
* Firefox version 38 or later. *If you need to work with earlier versions of Firefox, you'll need to use the old cfx tool. See instructions for [getting started with cfx](https://developer.mozilla.org/Add-ons/SDK/Tutorials/Getting_started).
#### Build Instructions (Unix)
git clone https://github.com/Synzvato/decentraleyes
cd decentraleyes
jpm xpi
> **Important:** All commits since 26 October 2016 are signed with GPG. It's likely best to ignore unsigned commits, unless you really know what you're doing. Please send an email if you have any questions or security concerns.
## License
[MPL-2.0](https://www.mozilla.org/MPL/2.0).
* Initial release.

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"يحميك من التتبع المرتبط بالوصول للمحتوى \"مجاني\"، مركزية.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"أوقف الحماية لهذا الموقع",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"فعّل الحماية",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"عداد محلي للموارد المحقونة",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"إجمالي موارد الـ 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":"الحيلولة دون تسرّب الطلبات الممنوعة الى شبكات التوصيل.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"إزالة بيانات التعريف من الطلبات المسموحة",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"مسح البيانات الحساسة من طلبات CDN المسموحة لتحسين الخصوصية.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"لا تتفحص النطاقات",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"حدد النطاقات التي سوف يتم تجاهلها. إفصل المداخل المتعددة بـفاصلة منقوطة (;).",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"متقدم",
"description":"Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Защитава ви от следене чрез свободна, централизирана доставка на съдържание.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Изключване на защитата за страницата",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Включване на защита",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Брояч за местно вмъкнати ресурси",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Количество на местни вмъквания на ресурси от началото на инсталацията.",
"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":"Предотвратява изтичането на забранени заявки към мрежи за доставка.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Премахване на метаданните от разрешени заявки",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Изтриване на чувствителни данни от допустимите заявки от МДС за подобряване на неприкосновеността.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Изключване на домейни от проверки",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Въведете домейни, които да се добавят в белия списък. Отделете стойностите с точка и запетая.",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Подробности",
"description":"Advanced label."
}
}

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."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Beskytter dig imod sporing af \"gratis\", centraliserede indholdsleverandører.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Deaktiver beskyttelse for dette websted",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Aktiver beskyttelse",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Optælling af lokalt leverede ressourcer",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Antal injektioner af lokale ressourcer siden installation.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Indstillinger",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Vis antal af injektioner på ikon",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Viser antallet af injicerede ressourcer på udvidelsens ikon.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Bloker forespørgsler efter manglende ressourcer",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Annullerer en forespørgsel hvis den forespurgte ressource ikke findes lokalt.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Deaktiver forhåndshentning af link",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Forhindrer ikke-tilladte forespørgsler i at blive lækket til leverandør-netværk.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Fjern metadata fra tilladte forespørgsler",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Sletter følsomme data fra tilladte CDN-forespørgsler for at mindste eksponeringen.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Udeluk disse domæner fra inspektion",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Tilføj domæner der ikke skal inspiceres. Separer flere med semikolon (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Avanceret",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Schützt vor Tracking durch \"gratis\", zentralisiertes, Abliefern von Content.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Schutz für diese Seite deaktivieren",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Schutz aktivieren",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Zähler für lokal injizierte Ressourcen",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Anzahl der lokalen Injektionen von den CDN-Ressourcen seit der Installation.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Einstellungen",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Zeige Anzahl der Injektionen am Icon",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Zeige die Anzahl der injizierten Ressourcen im Erweiterungs-Icon.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Blockiere Anfordern fehlender Inhalte",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Abgefangene Anforderung unterbinden, falls angeforderte Datei nicht lokal verfügbar ist.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Deaktiviere link prefetching",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Verhindere, dass unerlaubte Anfragen an die CDNs durchsickern.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Entferne Metadaten von erlaubten Anfragen",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Lösche sensible Daten aus erlaubten CDN-Anfragen zur Verbesserung des Datenschutzes.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Domains von Prüfung ausschließen",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Gebe zu ignorierende Domains an. Trenne mehrere Einträge durch Semikolons (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Erweitert",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Προστατεύει από παρακολούθηση μέσω \"δωρεάν\" διανομής περιεχόμενου.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Απενεργοποίηση προστασίας για αυτή τη σελίδα",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Ενεργοποίηση προστασίας",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Μετρητής εμβόλιμων τοπικών πόρων",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Ποσοστό εμβόλιμων τοπικών πόρων Δικτύων Παροχής Περιεχομένου από την στιγμή της εγκατάστασης.",
"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": "Αποτροπή διαρροής αποκλεισμένων κλήσεων προς δίκτυα διανομής.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Διαγραφή μεταδεδομένων από επιτρεπόμενες κλήσεις",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Διαγραφή ευαίσθητων δεδομένων από CDN αιτήσεις για ενίσχυση ασφάλειας.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Εξαίρεση διευθύνσεων από επιθεωρήσεις",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Εισαγωγή διευθύνσεων στις επιτρεπόμενες. Διαχωρίστε πολλαπλές καταχωρήσεις με ερωτηματικά (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Για προχωρημένους",
"description": "Advanced label."
}
}

View File

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Protects you against tracking through \"free\", centralised, content delivery.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Disable protection for this site",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Enable protection",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Counter for locally injected resources",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Amount of local Content Delivery Network resource injections since installation.",
"description":"Amount injected description."
},
"optionsTitle":{
"message":"Options",
"description":"Options title."
},
"showIconBadgeTitle":{
"message":"Display injection counts on icon",
"description":"Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Show the number of injected resources on the extension icon.",
"description":"Show icon badge description."
},
"blockMissingTitle":{
"message":"Block requests for missing resources",
"description":"Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Cancel intercepted request if the required resource is not locally available.",
"description":"Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Disable link prefetching",
"description":"Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Prevent disallowed requests from leaking out to delivery networks.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Strip metadata from allowed requests",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Erase sensitive data from allowed CDN-requests for improved privacy.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Exclude domains from inspections",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Enter domains to whitelist them. Separate multiple entries with semi-colons (;).",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Advanced",
"description":"Advanced label."
}
}

View File

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Protects you against tracking through \"free\", centralized, content delivery.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Disable protection for this site",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Enable protection",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Counter for locally injected resources",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Amount of local Content Delivery Network resource injections since installation.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Options",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Display injection counts on icon",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Show the number of injected resources on the extension icon.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Block requests for missing resources",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Cancel intercepted request if the required resource is not locally available.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Disable link prefetching",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Prevent disallowed requests from leaking out to delivery networks.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Strip metadata from allowed requests",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Erase sensitive data from allowed CDN requests for improved privacy.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Exclude domains from inspections",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Enter domains to whitelist them. Separate multiple entries with semi-colons (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Advanced",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Aktivigi protekton",
"description": "Enable protection 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."
},
"optionsTitle": {
"message": "Elektebloj",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Montri nombrilon sur piktogramo",
"description": "Show icon badge title."
},
"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."
},
"blockMissingDescription": {
"message": "Bloki petojn interkaptitajn se la petitan risurcon ne loke haveblas.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Ne antaŭlegi ligilojn",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Bloki malpermesatajn petojn por preventi tralasojn al enhav-proviz-retoj.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Forigi metadatumojn el permesataj petoj",
"description": "Strip metadata title."
},
"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."
},
"whitelistedDomainsDescription": {
"message": "Entajpu demajnojn, kiujn Decentraleyes ne devas inspekti. Disigu domajnojn per punktokomoj (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Spertula",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Protégete contra rastreo a través de entrega de contenido centralizado \"gratis\".",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Desactivar protección en este sitio",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Activar protección",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Contador para fuentes inyectadas localmente",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Cifra de inyecciones de fuentes de Redes de Entrega de Contenido desde instalación.",
"description":"Amount injected description."
},
"optionsTitle":{
"message":"Opciones",
"description":"Options title."
},
"showIconBadgeTitle":{
"message":"Mostrar el conteo de inyecciones en el icono",
"description":"Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Mostrar el número de recursos inyectados en el icono de extensión.",
"description":"Show icon badge description."
},
"blockMissingTitle":{
"message":"Bloquear peticiones de fuentes faltantes",
"description":"Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Cancelar peticiones detenidas si la fuente requerida no se encuentra localmente.",
"description":"Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Deshabilitar la captura previa de enlaces",
"description":"Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Prevenir que las solicitudes no permitidas se escapen hacia redes de distribución.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Remover metadatos de las solicitudes permitidas",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Borrar datos sensibles de solicitudes CDN autorizadas para mejorar la privacidad.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Excluir dominios de inspecciones",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Ingresar dominios a ser ignorados. Separar múltiples entradas con punto y coma (;).",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Avanzado",
"description":"Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Kaitseb sind \"tasuta\", tsentraliseeritud sisu edastamisest tuleneva jälitamise vastu.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Keela kaitse sellel saidil",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Luba kaitse",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Kohalikult sisestatud ressursside loendur",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Kohalike sisuedastusvõrkude ressursisisestuste arv alates installimisest.",
"description":"Amount injected description."
},
"optionsTitle":{
"message":"Valikud",
"description":"Options title."
},
"showIconBadgeTitle":{
"message":"Kuva sisestuste arvu ikoonil",
"description":"Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Kuva sisestatud ressursside arvu laienduse ikoonil.",
"description":"Show icon badge description."
},
"blockMissingTitle":{
"message":"Blokeeri puuduvate ressursside taotlused",
"description":"Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Tühista kinnipüütud taotlus, kui vajaminev ressurss ei ole kohalikult saadaval.",
"description":"Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Keela lingi eellaadimine",
"description":"Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Väldi keelatud taotluste väljalekkimist edastusvõrkudele.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Eemalda lubatud taotlustelt metaandmed",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Kustuta tundlikud andmed lubatud sisuedastusvõrkude taotlustest parema privaatsuse saamiseks.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Välista uuritavaid domeene",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Sisesta domeenid, et lisada need valgesse nimekirja. Eralda mitu üksust semikoolonitega (;).",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Edasijõudnuile",
"description":"Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Suojaa sinua \"ilmaisten\" keskitettyjen sisällön jakeluverkkojen jäljitykseltä.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Poista suojaus tältä sivustolta",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Ota suojaus käyttöön",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Korvatut pyynnöt",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Korvatut sisältöpyynnöt lisäosan asennuksen jälkeen.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Asetukset",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Näytä kohteiden määrä kuvakkeessa",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Näyttää turvattujen kohteiden määrän lisäosan kuvakkeessa.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Estä pyynnöt puuttuviin resursseihin",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Estää pyynnöt jos paikallista sisältöä ei ole saatavilla.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Estä linkkien esihaku",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Estä kiellettyjä sisältöpyyntöjä vuotamasta keskitettyihin jakeluverkkoihin.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Poista metatiedot sallituista sisältöpyynnöistä",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Poista arkaluontoiset tiedot jakeluverkkojen sisältöpyynnöistä yksityisyyden parantamiseksi.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Poissulje verkkotunnukset",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Lisää verkkotunnus jottei sitä korvata. Erota rivit puolipisteellä (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Edistynyt",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Activer la protection",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Compteur de ressources injectées localement",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Quantité de ressources CDN injectées localement depuis l'installation.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Options",
"description": "Options 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."
},
"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."
},
"disablePrefetchTitle": {
"message": "Désactiver le préchargement de lien",
"description": "Disable prefetch title."
},
"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."
},
"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."
},
"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."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "מגן עליך מפני מעקב המבוצע דרך רשתות אספקת תוכן ריכוזיות ו\"חינמיות\".",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "נטרול ההגנה עבור אתר זה",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "הפעלת הגנה",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "מונה משאבים מקומיים שהוזרקו",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "כמות תוכן מקומי שהוזרק במקום רשתות אספקת תוכן מאז התקנת התוכנה.",
"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": "מנע הדלפה של בקשות לא-מאושרות לתוך רשתות אספקת תכנים.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "מחק מטא-דאטה מבקשות שאושרו",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "להגברת הפרטיות, מחק מידע רגיש מבקשות מאושרות לרשתות אספקת תוכן.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "אל תכלול דומיינים כחלק מהבדיקה",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "הזן דומיינים שברצונך להוסיף לרשימת התרים. הפרד ערכים מרובים באמצעות נקודה-פסיק (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "מתקדם",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Védelem az \"ingyenes\" centralizált content delivery hálózatok megfigyelésétől.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Védelem kikapcsolása ezen az oldalon",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Védelem bekapcsolása",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Helyből beszúrt erőforrások számlálója",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Telepítés óta beszúrt helyi Content Delivery Network erőforrások száma.",
"description":"Amount injected description."
},
"optionsTitle":{
"message":"Beállítások",
"description":"Options title."
},
"showIconBadgeTitle":{
"message":"Beszúrások számlálójának megjelenítése az ikonon",
"description":"Show icon badge title."
},
"showIconBadgeDescription":{
"message":"A beszúrt erőforrások számának megjelenítése a bővítmény ikonján.",
"description":"Show icon badge description."
},
"blockMissingTitle":{
"message":"Hiányzó erőforrások blokkolása",
"description":"Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Megszakított kérések blokkolása, amennyiben a kért erőforrás nem érhető el helyben.",
"description":"Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Link prefetching letiltása",
"description":"Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Letiltott kérések kiszivárgásának megakadályozása.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Metaadatok törlése az engedélyezett kérésekből",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Érzékeny adatok törlése az engedélyezett CDN kérésekből.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Domainek vizsgálatának elhagyása",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Írj be domaineket, amik ne legyenek megvizsgálva. Az egyes elemeket pontosvesszővel (;) kell elválasztani.",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Speciális",
"description":"Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Melindungi Anda dari pelacakan distribusi konten \"gratis\" dan terpusat.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Nonaktifkan perlindungan untuk situs web ini",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Aktifkan perlindungan",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Jumlah sumber daya lokal yang disematkan",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Jumlah penyematan sumber daya Jaringan Distribusi Konten lokal sejak pemasangan.",
"description":"Amount injected description."
},
"optionsTitle":{
"message":"Opsi",
"description":"Options title."
},
"showIconBadgeTitle":{
"message":"Tampilkan jumlah penyematan pada ikon",
"description":"Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Tampilkan jumlah sumber yang disematkan pada ekstensi ikon.",
"description":"Show icon badge description."
},
"blockMissingTitle":{
"message":"Blokir permintaan untuk sumber daya yang hilang",
"description":"Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Batalkan pencegatan permintaan jika sumber daya yang dibutuhkan tidak tersedia secara lokal.",
"description":"Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Nonaktifkan tautan pra pengambilan",
"description":"Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Mencegah permintaan yang tidak diizinkan bocor ke jaringan pengiriman.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Kupas metadata dari permintaan yang diizinkan",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Hapus data sensitif dari permintaan CDN yang diizinkan untuk meningkatkan privasi.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Cegah pemeriksaan domain",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Masukkan domain ke daftar putih. Pisahkan entri dengan titik koma (;).",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Canggih",
"description":"Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Virkja vernd",
"description": "Enable protection 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."
},
"optionsTitle": {
"message": "Valkostir",
"description": "Options 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."
},
"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."
},
"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."
},
"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."
},
"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."
},
"advancedLabel": {
"message": "Ítarlegt",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Protegge dal tracciamento tramite i CDN centralizzati \"gratuiti\".",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Disattiva protezione per questo sito",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Attiva protezione",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Contatore per risorse iniettate localmente",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Quantità di iniezioni di risorse dalla Rete di Distribuzione di Contenuti locale sin dall'installazione.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Opzioni",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Mostra il numero di iniezioni sull'icona",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Mostra il numero di risorse iniettate sull'icona dell'estensione.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Bloccare richieste di risorse mancanti",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Annulla la richiesta intercettata se la risorsa necessaria non è disponibile localmente.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Disabilita il prefetching dei link",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Impedisci alle richieste vietate di informare le reti di consegna.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Elimina i metadata dalle richieste consentite",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Cancella i dati sensibili dalle richieste CDN consentite per una migliore privacy.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Escludere domini dalle ispezioni",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Inserire domini nella whitelist per escluderli. Separare voci multiple con punti e virgola (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Avanzate",
"description": "Advanced label."
}
}

70
_locales/ja/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": "インストール後にローカルの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": "配信ネットワークに許可されていないリクエストの漏れから予防する。",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "許可されていたるリクエストからメタデータを取り除く",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "プライバシー向上のために許可されたCDNリクエストから機密データを消去する。",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "保護から除外するドメイン",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "ホワイトリストに登録したいドメインを入力してください。エントリが複数ある場合、セミコロン (;) で区切ってください。",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "エラー内容",
"description": "Advanced label."
}
}

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."
}
}

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

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Bescherming inschakelen",
"description": "Enable protection 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."
},
"optionsTitle": {
"message": "Opties",
"description": "Options 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."
},
"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."
},
"disablePrefetchTitle": {
"message": "Link prefetching uitschakelen",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Voorkom dat geweigerde verzoeken naar afleveringsnetwerken uitlekken.",
"description": "Disable prefetch description."
},
"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."
},
"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."
},
"advancedLabel": {
"message": "Geavanceerd",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription":{
"message":"Chroni przed śledzeniem przez ośrodki CDN.",
"description":"Extension description."
},
"disableProtectionTitle":{
"message":"Wyłącz ochronę dla tej witryny",
"description":"Disable protection title."
},
"enableProtectionTitle":{
"message":"Włącz ochronę",
"description":"Enable protection title."
},
"amountInjectedTitle":{
"message":"Licznik zasobów podanych lokalnie",
"description":"Amount injected title."
},
"amountInjectedDescription":{
"message":"Ilość wstrzyknięć z lokalnego Content Delivery Network od czasu instalacji.",
"description":"Amount injected description."
},
"optionsTitle":{
"message":"Ustawienia",
"description":"Options title."
},
"showIconBadgeTitle":{
"message":"Wyświetl licznik wstrzyknięć na ikonie",
"description":"Show icon badge title."
},
"showIconBadgeDescription":{
"message":"Pokaż ilość wstrzykniętych zasobów na ikonie rozszerzenia.",
"description":"Show icon badge description."
},
"blockMissingTitle":{
"message":"Blokuj żądania brakujących zasobów",
"description":"Block requests for missing resources title."
},
"blockMissingDescription":{
"message":"Anuluj przechwycone żądania jeśli wymagany zasób nie jest dostępny lokalnie.",
"description":"Block requests for missing resources description."
},
"disablePrefetchTitle":{
"message":"Wyłącz wczesne pobieranie linków",
"description":"Disable prefetch title."
},
"disablePrefetchDescription":{
"message":"Zapobiegaj wyciekaniu zabronionych zapytań do systemów dostarczania.",
"description":"Disable prefetch description."
},
"stripMetadataTitle":{
"message":"Usuwaj metadane z dozwolonych zapytań",
"description":"Strip metadata title."
},
"stripMetadataDescription":{
"message":"Usuwaj wrażliwe dane z dozwolonych zapytań do CDN aby zwiększyć prywatność.",
"description":"Strip metadata description."
},
"whitelistedDomainsTitle":{
"message":"Wyklucz domeny z analizy",
"description":"Whitelisted domains title."
},
"whitelistedDomainsDescription":{
"message":"Podaj domeny aby dodać je do białej listy. Oddziel wpisy średnikami (;).",
"description":"Whitelisted domains description."
},
"advancedLabel":{
"message":"Zaawansowane",
"description":"Advanced label."
}
}

View File

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Lhe protege de rastreamento feito usando centrais de disponibilização de conteúdo \"gratuitas\".",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Desabilitar a proteção neste site",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Habilitar proteção",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Contador de recursos injetados localmente",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Total de injeções locais de recursos de Redes de Distribuição de Conteúdo desde a instalação.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Opções",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Exibir total de injeções no ícone",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Mostra o total de injeções de recursos no ícone do complemento.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Bloquear requisições a recursos faltosos",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Cancela requisições interceptadas se o recurso necessário não está disponível localmente.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Desabilitar pré-carregamento de links",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Impede que requisições não permitidas vazem para as redes de distribuição de conteúdo.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Remover metadados de requisições permitidas",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Apaga dados sensíveis de requisições à CDNs permitidas visando melhorar a privacidade.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Remover domínios das inspeções",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Digite os domínios que não devem ser analisados. Separe múltiplos domínios com ponto e vírgula (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Avançado",
"description": "Advanced label."
}
}

View File

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Ativar proteção",
"description": "Enable protection 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."
},
"optionsTitle": {
"message": "Opções",
"description": "Options 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."
},
"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."
},
"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."
},
"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."
},
"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."
},
"advancedLabel": {
"message": "Avançado",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Activează protecția",
"description": "Enable protection 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."
},
"optionsTitle": {
"message": "Opțiuni",
"description": "Options 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."
},
"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."
},
"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."
},
"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."
},
"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."
},
"advancedLabel": {
"message": "Avansat",
"description": "Advanced label."
}
}

70
_locales/ru/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": "Количество локально «доставленных» файлов с момента установки.",
"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": "Не давать запрещенным запросам выходить за сети доставки.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Удалить метаданные из допущенных запросов",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Очистить дополнительные данные из разрешенных CDN запросов, для усиления приватности.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Исключить домены из проверки",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "«Белый список» доменов. Контент, расположенный на них не будет фильтроваться. Записи (при количестве более одной) разделяются точкой с запятой (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Дополнительно",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Штити вас од праћења преко „бесплатних“, централизованих достава садржаја.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Онемогући заштиту на овом сајту",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Омогући заштиту",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Бројач локално убризганих ресурса",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Број локално убризганих ресурса са мрежа за доставу садржаја од инсталације.",
"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": "Спречи цурење недозвољених захтева ка мрежама за доставу.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Скини мета-податке са дозвољених захтева",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Обриши осетљиве податке са дозвољених CDN захтева зарад веће приватности.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Прескочи домене приликом провере",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Унесите домене да их ставите на бели списак. Одвојите више ставки са тачка-запетама (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Напредно",
"description": "Advanced label."
}
}

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

@@ -0,0 +1,70 @@
{
"extensionDescription": {
"message": "Skyddar dig mot att spåras av \"gratis\", centraliserad, innehållsleverans.",
"description": "Extension description."
},
"disableProtectionTitle": {
"message": "Inaktivera skydd för den här sidan",
"description": "Disable protection title."
},
"enableProtectionTitle": {
"message": "Aktivera skydd",
"description": "Enable protection title."
},
"amountInjectedTitle": {
"message": "Räknare för lokalt insatta resurser",
"description": "Amount injected title."
},
"amountInjectedDescription": {
"message": "Antalet insatta Content Delivery Network-resurser sedan installationen.",
"description": "Amount injected description."
},
"optionsTitle": {
"message": "Inställningar",
"description": "Options title."
},
"showIconBadgeTitle": {
"message": "Visa insättningsantal på ikonen",
"description": "Show icon badge title."
},
"showIconBadgeDescription": {
"message": "Visa antalet insatta resurser på tilläggsikonen.",
"description": "Show icon badge description."
},
"blockMissingTitle": {
"message": "Blockera förfrågningar när resurs saknas",
"description": "Block requests for missing resources title."
},
"blockMissingDescription": {
"message": "Avbryt avlyssnad begäran om den begärda resursen inte finns lokalt.",
"description": "Block requests for missing resources description."
},
"disablePrefetchTitle": {
"message": "Inaktivera länkförhandshämtning",
"description": "Disable prefetch title."
},
"disablePrefetchDescription": {
"message": "Förhindra otillåtna förfrågningar från att läcka ut till leveransnätverk.",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "Skala bort metadata från tillåtna förfrågningar",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "Radera känslig data från tillåtna CDN-förfrågningar för förbättrad integritet.",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "Exkludera domäner från inspektioner",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "Ange domäner för vitlistning. Separera flera domänposter med semikolon (;).",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "Avancerad",
"description": "Advanced label."
}
}

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."
}
}

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

@@ -0,0 +1,70 @@
{
"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."
},
"enableProtectionTitle": {
"message": "Korumayı etkinleştir",
"description": "Enable protection 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."
},
"optionsTitle": {
"message": "Seçenekler",
"description": "Options 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."
},
"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."
},
"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."
},
"stripMetadataTitle": {
"message": "Meta verilerini izin verilen isteklerden ayır",
"description": "Strip metadata title."
},
"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."
},
"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."
}
}

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": "自安装以来,从本地的“内容交付网络”发送的资源总量。",
"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": "避免本应禁止的请求发到网络。",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "允许的请求剥去元数据",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "被允许的 CDN 请求剥去敏感数据以保护隐私。",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "排除要检查的域名",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "输入白名单的域名。用分号 (;) 分隔多项。",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "高级",
"description": "Advanced label."
}
}

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": "安裝以來,由本機檔案所取代的 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": "防止發出不被允許的請求到 CDN 網路。",
"description": "Disable prefetch description."
},
"stripMetadataTitle": {
"message": "移除放行請求當中的後設資料",
"description": "Strip metadata title."
},
"stripMetadataDescription": {
"message": "清除放行的 CDN 請求當中的敏感資料,以保護隱私權。",
"description": "Strip metadata description."
},
"whitelistedDomainsTitle": {
"message": "要排除檢查的網域",
"description": "Whitelisted domains title."
},
"whitelistedDomainsDescription": {
"message": "輸入網域即可將其加入白名單。使用分號(;)分隔多個網域。",
"description": "Whitelisted domains description."
},
"advancedLabel": {
"message": "進階",
"description": "Advanced label."
}
}

136
audit/.eslintrc Normal file
View File

@@ -0,0 +1,136 @@
{
"env": {
"es6": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
},
"rules": {
"array-bracket-newline": "error",
"array-bracket-spacing": "error",
"arrow-body-style": "error",
"arrow-parens": "error",
"arrow-spacing": "error",
"block-spacing": "error",
"brace-style": "error",
"camelcase": "error",
"comma-spacing": "error",
"comma-style": "error",
"computed-property-spacing": "error",
"consistent-this": "error",
"curly": "error",
"eol-last": "error",
"eqeqeq": "error",
"func-call-spacing": "error",
"function-paren-newline": "error",
"generator-star-spacing": "error",
"indent": [
"error",
4
],
"key-spacing": "error",
"keyword-spacing": "error",
"linebreak-style": [
"error",
"unix"
],
"new-cap": "error",
"new-parens": "error",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-confusing-arrow": "error",
"no-console": "off",
"no-continue": "error",
"no-duplicate-imports": "error",
"no-eval": "error",
"no-extend-native": "error",
"no-implicit-coercion": "error",
"no-implied-eval": "error",
"no-invalid-this": "error",
"no-iterator": "error",
"no-label-var": "error",
"no-labels": "error",
"no-lone-blocks": "error",
"no-loop-func": "error",
"no-multi-spaces": "error",
"no-multi-str": "error",
"no-multiple-empty-lines": [
"error", {
"max": 1,
"maxEOF": 1,
"maxBOF": 0
}
],
"no-negated-condition": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-new-wrappers": "error",
"no-octal-escape": "error",
"no-proto": "error",
"no-return-assign": "error",
"no-return-await": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-shadow-restricted-names": "error",
"no-tabs": "error",
"no-ternary": "error",
"no-trailing-spaces": "error",
"no-undef-init": "error",
"no-unmodified-loop-condition": "error",
"no-unused-expressions": "error",
"no-use-before-define": "error",
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-constructor": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-void": "error",
"no-warning-comments": "warn",
"no-whitespace-before-property": "error",
"no-with": "error",
"object-curly-spacing": "error",
"object-shorthand": [
"error",
"consistent-as-needed"
],
"operator-assignment": "error",
"operator-linebreak": "error",
"prefer-numeric-literals": "error",
"prefer-promise-reject-errors": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"prefer-template": "error",
"quote-props": "error",
"quotes": [
"error",
"single"
],
"require-await": "error",
"rest-spread-spacing": "error",
"semi": "error",
"semi-spacing": "error",
"semi-style": "error",
"space-before-blocks": "error",
"space-before-function-paren": "error",
"space-in-parens": "error",
"space-infix-ops": "error",
"space-unary-ops": "error",
"spaced-comment": "error",
"strict": [
"error",
"global"
],
"switch-colon-spacing": "error",
"symbol-description": "error",
"template-curly-spacing": "error",
"template-tag-spacing": "error",
"unicode-bom": "error",
"wrap-regex": "error",
"yield-star-spacing": "error",
"yoda": "error"
}
}

18
audit/README.md Normal file
View File

@@ -0,0 +1,18 @@
Introduction
------------
This audit script allows any user and extension reviewer to verify the integrity of the bundled resources. It automatically, and transparently, compares all bundled libraries to their original sources.
Usage Instructions (Unix)
------------------
1. Make sure you have Node.js installed on your machine.
2. Open up a terminal and ```cd``` into this directory.
3. Execute ```npm install``` to fetch any dependencies.
4. Run the audit script by executing ```node run```.
**Note:** If you'd like to save the report, run ```node run > report.txt```.

13
audit/package-lock.json generated Normal file
View File

@@ -0,0 +1,13 @@
{
"name": "decentraleyes-audit",
"version": "1.5.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"source-map-url": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "decentraleyes-audit",
"version": "1.4.0",
"version": "1.5.0",
"author": "Thomas Rientjes",
"license": "MPL-2.0",
"description": "Library audit tool for Decentraleyes.",

View File

@@ -15,12 +15,11 @@
* Imports
*/
var fileSystem, crypto, http, path, sourceMappingURL;
var fileSystem, crypto, https, sourceMappingURL;
fileSystem = require('fs');
crypto = require('crypto');
https = require('https');
path = require('path');
sourceMappingURL = require('source-map-url');
@@ -31,21 +30,18 @@ sourceMappingURL = require('source-map-url');
var localResourceLocation = '../resources';
var localResourceLocationLength = localResourceLocation.length;
var localResourcePaths = [];
var comparedResourceAmount = 0;
var resourceAmount = 0;
/**
* Functions
*/
function _fetchLocalResourcePaths(folderPath) {
function _fetchLocalResourcePaths (folderPath) {
fileSystem.readdirSync(folderPath).forEach(function (resourceName) {
if (resourceName === '_audit') {
return localResourcePaths;
}
var resourcePath = folderPath + '/' + resourceName;
var resourcePath = `${folderPath}/${resourceName}`;
var resourceStatistics = fileSystem.statSync(resourcePath);
if (resourceStatistics && resourceStatistics.isDirectory()) {
@@ -59,7 +55,7 @@ function _fetchLocalResourcePaths(folderPath) {
return localResourcePaths;
}
function _getLocalResourceContents(fileLocation, callback) {
function _getLocalResourceContents (fileLocation, callback) {
fileSystem.exists(fileLocation, function (exists) {
@@ -75,7 +71,7 @@ function _getLocalResourceContents(fileLocation, callback) {
var localFileContents = buffer.toString('utf8', 0, buffer.length);
fileSystem.close(fileDescriptor);
fileSystem.close(fileDescriptor, function () {});
callback(localFileContents);
});
});
@@ -85,16 +81,16 @@ function _getLocalResourceContents(fileLocation, callback) {
});
}
function _getRemoteResourceContents(remoteResourceRoute, callback) {
function _getRemoteResourceContents (remoteResourceRoute, callback) {
var resourceURL = 'https://ajax.googleapis.com/ajax/libs/' + remoteResourceRoute;
var resourceURL = `https://ajax.googleapis.com/ajax/libs/${remoteResourceRoute}`;
https.get(resourceURL, function (response) {
var resourceContents = '';
response.on('data', function (chunk) {
resourceContents = resourceContents + chunk;
resourceContents += chunk;
});
response.on('end', function () {
@@ -105,20 +101,20 @@ function _getRemoteResourceContents(remoteResourceRoute, callback) {
} else {
resourceURL = 'https://cdnjs.cloudflare.com/ajax/libs/' + remoteResourceRoute;
resourceURL = `https://cdnjs.cloudflare.com/ajax/libs/${remoteResourceRoute}`;
https.get(resourceURL, function (response) {
resourceContents = '';
response.on('data', function (chunk) {
resourceContents = resourceContents + chunk;
resourceContents += chunk;
});
response.on('end', function () {
if (response.statusCode !== 200) {
throw 'Error: Resource ' + remoteResourceRoute + ' could not be fetched.';
throw `Error: Resource ${remoteResourceRoute} could not be fetched.`;
}
callback(resourceContents, resourceURL);
@@ -133,7 +129,7 @@ function _getRemoteResourceContents(remoteResourceRoute, callback) {
});
}
function _hashFileContents(fileContents) {
function _hashFileContents (fileContents) {
var hash;
@@ -146,7 +142,27 @@ function _hashFileContents(fileContents) {
return hash.read();
}
function _compareResources(localResourceContents, remoteResourceContents, URL) {
function _showCompletedMessage () {
console.log();
console.log(' *** FILE INTEGRITY CHECKS COMPLETED');
console.log(` *** ${resourceAmount}/${resourceAmount} RESOURCES WERE ANALYZED`);
console.log();
}
function _incrementComparedResourceAmount () {
comparedResourceAmount++;
if (comparedResourceAmount === resourceAmount) {
setTimeout(function () {
_showCompletedMessage();
}, 500);
}
}
function _compareResources (localResourceContents, remoteResourceContents, URL) {
var hasSourceMappingURL = sourceMappingURL.existsIn(remoteResourceContents);
var sourceMappingNotice = '[ ] REMOTE RESOURCE HAD SOURCE MAPPING URL';
@@ -156,14 +172,11 @@ function _compareResources(localResourceContents, remoteResourceContents, URL) {
sourceMappingNotice = '[X] REMOTE RESOURCE HAD SOURCE MAPPING URL';
}
// Remove the syntax invalidation character from the local contents.
localResourceContents = localResourceContents.substring(1);
var localResourceHash = _hashFileContents(localResourceContents);
var remoteResourceHash = _hashFileContents(remoteResourceContents);
console.log('RESOURCE HASH (SHA512): ' + localResourceHash);
console.log('RESOURCE HASH (SHA512): ' + remoteResourceHash);
console.log(`RESOURCE HASH (SHA512): ${localResourceHash}`);
console.log(`RESOURCE HASH (SHA512): ${remoteResourceHash}`);
var fileHashesMatch = (localResourceHash === remoteResourceHash);
@@ -176,14 +189,8 @@ function _compareResources(localResourceContents, remoteResourceContents, URL) {
console.log();
console.log('[X] LOCAL AND REMOTE RESOURCE HASHES MATCH');
console.log(sourceMappingNotice);
}
function _showCompletedMessage() {
console.log();
console.log(' *** FILE INTEGRITY CHECKS COMPLETED');
console.log(' *** ' + resourceAmount + '/' + resourceAmount + ' RESOURCES WERE ANALYZED');
console.log();
_incrementComparedResourceAmount();
}
/**
@@ -197,7 +204,7 @@ resourceAmount = localResourcePaths.length;
* Script
*/
localResourcePaths.forEach(function (resourcePath, index) {
localResourcePaths.forEach(function (resourcePath) {
var resourceRoute = resourcePath.substr(localResourceLocationLength + 1);
resourceRoute = resourceRoute.substring(0, resourceRoute.length - 4);
@@ -215,13 +222,6 @@ localResourcePaths.forEach(function (resourcePath, index) {
console.log();
console.log('------------------------------------------');
if (index === resourceAmount - 1) {
setTimeout(function () {
_showCompletedMessage();
}, 500);
}
});
});

View File

@@ -1,19 +0,0 @@
locale decentraleyes bg locale/bg/
locale decentraleyes da locale/da/
locale decentraleyes de locale/de/
locale decentraleyes en-GB locale/en-GB/
locale decentraleyes en-US locale/en-US/
locale decentraleyes eo locale/eo/
locale decentraleyes es locale/es/
locale decentraleyes fi locale/fi/
locale decentraleyes fr locale/fr/
locale decentraleyes id locale/id/
locale decentraleyes it locale/it/
locale decentraleyes ja locale/ja/
locale decentraleyes nl locale/nl/
locale decentraleyes pl locale/pl/
locale decentraleyes pt-PT locale/pt-PT/
locale decentraleyes ru locale/ru/
locale decentraleyes sv-SE locale/sv-SE/
locale decentraleyes zh-CN locale/zh-CN/
locale decentraleyes zh-TW locale/zh-TW/

72
core/constants.js Normal file
View File

@@ -0,0 +1,72 @@
/**
* Global Constants
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2017-10-27
* @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';
/**
* Constants
*/
const Address = {
'ANY': '*://*/*',
'ANY_PATH': '/*',
'ANY_PROTOCOL': '*://',
'CHROME_EXTENSION': 'chrome-extension:',
'EXAMPLE': 'example.org',
'HTTP': 'http:',
'HTTPS': 'https:',
'WWW_PREFIX': 'www.'
};
const Header = {
'COOKIE': 'Cookie',
'ORIGIN': 'Origin',
'REFERER': 'Referer'
};
const MessageResponse = {
'ASYNCHRONOUS': true,
'SYNCHRONOUS': false
};
const Resource = {
'MAPPING_EXPRESSION': /\.map$/i,
'VERSION_EXPRESSION': /(?:\d{1,2}\.){1,3}\d{1,2}/,
'VERSION_PLACEHOLDER': '{version}'
};
const Setting = {
'AMOUNT_INJECTED': 'amountInjected',
'BLOCK_MISSING': 'blockMissing',
'DISABLE_PREFETCH': 'disablePrefetch',
'SHOW_ICON_BADGE': 'showIconBadge',
'SHOW_RELEASE_NOTES': 'showReleaseNotes',
'STRIP_METADATA': 'stripMetadata',
'WHITELISTED_DOMAINS': 'whitelistedDomains',
'XHR_TEST_DOMAIN': 'xhrTestDomain'
};
const WebRequest = {
'GET': 'GET',
'BLOCKING': 'blocking',
'HEADERS': 'requestHeaders'
};
const WebRequestType = {
'XHR': 'xmlhttprequest'
};
const Whitelist = {
'TRIM_EXPRESSION': /^;+|;+$/g,
'VALUE_SEPARATOR': ';'
};

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

@@ -260,9 +260,3 @@ var files = {
'resources/webfont/1.5.10/webfont.js.dec': true,
'resources/webfont/1.5.18/webfont.js.dec': true
};
/**
* Exports
*/
module.exports = files;

180
core/interceptor.js Normal file
View File

@@ -0,0 +1,180 @@
/**
* Interceptor
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2016-04-06
* @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';
/**
* Interceptor
*/
var interceptor = {};
/**
* Public Methods
*/
interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) {
let validCandidate, tabDomain, targetDetails, targetPath;
validCandidate = requestAnalyzer.isValidCandidate(requestDetails, tab);
if (!validCandidate) {
return {
'cancel': false
};
}
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
};
if (undetectableTaintedDomains[tabDomain] || (/yandex\./).test(tabDomain)) {
if (tabDomain !== 'yandex.ru') {
return interceptor._handleMissingCandidate(requestDetails.url);
}
}
targetDetails = requestAnalyzer.getLocalTarget(requestDetails);
targetPath = targetDetails.path;
if (!targetPath) {
return interceptor._handleMissingCandidate(requestDetails.url);
}
if (!files[targetPath]) {
return interceptor._handleMissingCandidate(requestDetails.url);
}
stateManager.requests[requestDetails.requestId] = {
tabIdentifier, targetDetails
};
return {
'redirectUrl': chrome.extension.getURL(targetPath + fileGuard.secret)
};
};
/**
* Private Methods
*/
interceptor._handleMissingCandidate = function (requestUrl) {
if (interceptor.blockMissing === true) {
return {
'cancel': true
};
}
let requestUrlSegments = new URL(requestUrl);
if (requestUrlSegments.protocol === Address.HTTP) {
requestUrlSegments.protocol = Address.HTTPS;
requestUrl = requestUrlSegments.toString();
return {
'redirectUrl': requestUrl
};
} else {
return {
'cancel': false
};
}
};
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;
}
};
/**
* Initializations
*/
interceptor.amountInjected = 0;
interceptor.xhrTestDomain = 'decentraleyes.org';
interceptor.blockMissing = false;
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;
});
/**
* Event Handlers
*/
chrome.storage.onChanged.addListener(interceptor._handleStorageChanged);

96
core/main.js Normal file
View File

@@ -0,0 +1,96 @@
/**
* Entry Point
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2016-04-04
* @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';
/**
* Main
*/
var main = {};
/**
* Private Methods
*/
main._initializeOptions = function () {
let optionDefaults = {
[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) {
if (options === null) {
options = optionDefaults;
}
if (options.disablePrefetch !== false) {
chrome.privacy.network.networkPredictionEnabled.set({
'value': false
});
}
chrome.storage.local.set(options);
});
};
main._showReleaseNotes = function (details) {
let location, previousVersion;
location = chrome.extension.getURL('pages/welcome/welcome.html');
if (details.reason === chrome.runtime.OnInstalledReason.INSTALL ||
details.reason === chrome.runtime.OnInstalledReason.UPDATE) {
previousVersion = details.previousVersion;
if (previousVersion && previousVersion.charAt(0) === '2') {
return; // Do not show release notes after minor updates.
}
if (details.temporary !== true) {
chrome.storage.local.get({
[Setting.SHOW_RELEASE_NOTES]: true
}, function (options) {
if (options.showReleaseNotes === true) {
chrome.tabs.create({
'url': location,
'active': false
});
}
});
}
}
};
/**
* Initializations
*/
chrome.runtime.onInstalled.addListener(main._showReleaseNotes);
main._initializeOptions();
wrappers.setBadgeBackgroundColor({
'color': [74, 130, 108, 255]
});

View File

@@ -13,12 +13,6 @@
'use strict';
/**
* Imports
*/
var resources = require('./resources');
/**
* Mappings
*/
@@ -41,105 +35,48 @@ 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'
'path': 'resources/dojo/1.6.1/dojo/dojo.js.dec',
'type': 'application/javascript'
},
'jquery/1/jquery.': {
path: 'resources/jquery/1.11.1/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.2/jquery.min.js': {
path: 'resources/jquery/1.2.6/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.2/jquery.js': {
path: 'resources/jquery/1.2.6/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.3/jquery.min.js': {
path: 'resources/jquery/1.3.2/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.3/jquery.js': {
path: 'resources/jquery/1.3.2/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.4/jquery.min.js': {
path: 'resources/jquery/1.4.4/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.4/jquery.js': {
path: 'resources/jquery/1.4.4/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.5/jquery.min.js': {
path: 'resources/jquery/1.5.2/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.5/jquery.js': {
path: 'resources/jquery/1.5.2/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.6/jquery.min.js': {
path: 'resources/jquery/1.6.4/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.6/jquery.js': {
path: 'resources/jquery/1.6.4/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.7/jquery.min.js': {
path: 'resources/jquery/1.7.2/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.7/jquery.js': {
path: 'resources/jquery/1.7.2/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.8/jquery.min.js': {
path: 'resources/jquery/1.8.3/jquery.min.js.dec',
type: 'application/javascript'
},
'jquery/1.8/jquery.js': {
path: 'resources/jquery/1.8.3/jquery.min.js.dec',
type: 'application/javascript'
'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
'type': 'application/javascript'
},
'jqueryui/1/jquery-ui.js': {
path: 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
type: 'application/javascript'
'path': 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
'type': 'application/javascript'
},
'jqueryui/1/jquery-ui.min.js': {
path: 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
type: 'application/javascript'
'path': 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec',
'type': 'application/javascript'
},
'mootools/1/mootools-yui-compressed.': {
path: 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec',
type: 'application/javascript'
'path': 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec',
'type': 'application/javascript'
},
'prototype/1/prototype.': {
path: 'resources/prototype/1.7.1.0/prototype.js.dec',
type: 'application/javascript'
'path': 'resources/prototype/1.7.1.0/prototype.js.dec',
'type': 'application/javascript'
},
'scriptaculous/1/scriptaculous.': {
path: 'resources/scriptaculous/1.9.0/scriptaculous.js.dec',
type: 'application/javascript'
'path': 'resources/scriptaculous/1.9.0/scriptaculous.js.dec',
'type': 'application/javascript'
},
'swfobject/2/swfobject.': {
path: 'resources/swfobject/2.2/swfobject.js.dec',
type: 'application/javascript'
'path': 'resources/swfobject/2.2/swfobject.js.dec',
'type': 'application/javascript'
},
'webfont/1/webfont.': {
path: 'resources/webfont/1.5.18/webfont.js.dec',
type: 'application/javascript'
'path': 'resources/webfont/1.5.18/webfont.js.dec',
'type': 'application/javascript'
}
}
},
// Microsoft Ajax CDN
'ajax.aspnetcdn.com': {
'/ajax/': {
'jQuery/jquery-{version}.': resources.jQuery,
'jquery/jquery-{version}.': resources.jQuery,
'modernizr/modernizr-{version}.': resources.modernizr
}
@@ -147,7 +84,6 @@ var mappings = {
// Microsoft Ajax CDN [Deprecated]
'ajax.microsoft.com': {
'/ajax/': {
'jQuery/jquery-{version}.': resources.jQuery,
'jquery/jquery-{version}.': resources.jQuery,
'modernizr/modernizr-{version}.': resources.modernizr
}
@@ -180,54 +116,14 @@ 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'
'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
'type': 'application/javascript'
},
'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'
'path': 'resources/jquery/1.11.1/jquery.min.js.dec',
'type': 'application/javascript'
}
}
},
@@ -342,8 +238,10 @@ var mappings = {
}
};
/**
* Exports
*/
// Geekzu Public Service [Mirror]
mappings['sdn.geekzu.org'] = {
'/ajax/ajax/libs/': mappings['ajax.googleapis.com']['/ajax/libs/']
};
module.exports = mappings;
// 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);

151
core/request-analyzer.js Normal file
View File

@@ -0,0 +1,151 @@
/**
* Request Analyzer
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2016-04-11
* @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 Analyzer
*/
var requestAnalyzer = {};
/**
* Public Methods
*/
requestAnalyzer.isValidCandidate = function (requestDetails, tabDetails) {
let initiatorDomain, isWhitelisted;
initiatorDomain = helpers.extractDomainFromUrl(tabDetails.url, true);
if (initiatorDomain === null) {
initiatorDomain = Address.EXAMPLE;
}
isWhitelisted = requestAnalyzer.whitelistedDomains[initiatorDomain];
if (isWhitelisted) {
return false;
}
// Only requests of type GET can be valid candidates.
return requestDetails.method === WebRequest.GET;
};
requestAnalyzer.getLocalTarget = function (requestDetails) {
let destinationUrl, destinationHost, destinationPath, hostMappings, basePath, resourceMappings;
destinationUrl = new URL(requestDetails.url);
destinationHost = destinationUrl.host;
destinationPath = destinationUrl.pathname;
// Use the proper mappings for the targeted host.
hostMappings = mappings[destinationHost];
// Resource mapping files are never locally available.
if (Resource.MAPPING_EXPRESSION.test(destinationPath)) {
return false;
}
basePath = requestAnalyzer._matchBasePath(hostMappings, destinationPath);
resourceMappings = hostMappings[basePath];
if (!resourceMappings) {
return false;
}
// Return either the local target's path or false.
return requestAnalyzer._findLocalTarget(resourceMappings, basePath, destinationHost, destinationPath);
};
/**
* Private Methods
*/
requestAnalyzer._matchBasePath = function (hostMappings, channelPath) {
for (let basePath of Object.keys(hostMappings)) {
if (channelPath.startsWith(basePath)) {
return basePath;
}
}
return false;
};
requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channelHost, channelPath) {
let resourcePath, versionNumber, resourcePattern;
resourcePath = channelPath.replace(basePath, '');
versionNumber = resourcePath.match(Resource.VERSION_EXPRESSION);
resourcePattern = resourcePath.replace(versionNumber, Resource.VERSION_PLACEHOLDER);
for (let resourceMold of Object.keys(resourceMappings)) {
if (resourcePattern.startsWith(resourceMold)) {
let targetPath, hostShorthands, version;
targetPath = resourceMappings[resourceMold].path;
targetPath = targetPath.replace(Resource.VERSION_PLACEHOLDER, versionNumber);
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 {
'source': channelHost,
'version': version,
'path': targetPath
};
}
}
return false;
};
requestAnalyzer._applyWhitelistedDomains = function () {
chrome.storage.local.get(Setting.WHITELISTED_DOMAINS, function (items) {
requestAnalyzer.whitelistedDomains = items.whitelistedDomains || {};
});
};
/**
* Initializations
*/
requestAnalyzer.whitelistedDomains = {};
requestAnalyzer._applyWhitelistedDomains();
/**
* Event Handlers
*/
chrome.storage.onChanged.addListener(requestAnalyzer._applyWhitelistedDomains);

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();
}
});

92
core/resources.js Normal file
View File

@@ -0,0 +1,92 @@
/**
* Resources
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2014-05-30
* @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';
/**
* Resources
*/
var resources = {
// AngularJS
'angular': {
'path': 'resources/angularjs/{version}/angular.min.js.dec',
'type': 'application/javascript'
},
// Backbone.js
'backbone': {
'path': 'resources/backbone.js/{version}/backbone-min.js.dec',
'type': 'application/javascript'
},
// Dojo
'dojo': {
'path': 'resources/dojo/{version}/dojo/dojo.js.dec',
'type': 'application/javascript'
},
// Ember.js
'ember': {
'path': 'resources/ember.js/{version}/ember.min.js.dec',
'type': 'application/javascript'
},
// Ext Core
'extCore': {
'path': 'resources/ext-core/{version}/ext-core.js.dec',
'type': 'application/javascript'
},
// jQuery
'jQuery': {
'path': 'resources/jquery/{version}/jquery.min.js.dec',
'type': 'application/javascript'
},
// jQuery UI
'jQueryUI': {
'path': 'resources/jqueryui/{version}/jquery-ui.min.js.dec',
'type': 'application/javascript'
},
// Modernizr
'modernizr': {
'path': 'resources/modernizr/{version}/modernizr.min.js.dec',
'type': 'application/javascript'
},
// MooTools
'mootools': {
'path': 'resources/mootools/{version}/mootools-yui-compressed.js.dec',
'type': 'application/javascript'
},
// Prototype
'prototypeJS': {
'path': 'resources/prototype/{version}/prototype.js.dec',
'type': 'application/javascript'
},
// Scriptaculous
'scriptaculous': {
'path': 'resources/scriptaculous/{version}/scriptaculous.js.dec',
'type': 'application/javascript'
},
// SWFObject
'swfobject': {
'path': 'resources/swfobject/{version}/swfobject.js.dec',
'type': 'application/javascript'
},
// Underscore.js
'underscore': {
'path': 'resources/underscore.js/{version}/underscore-min.js.dec',
'type': 'application/javascript'
},
// Web Font Loader
'webfont': {
'path': 'resources/webfont/{version}/webfont.js.dec',
'type': 'application/javascript'
}
};

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'];

245
core/state-manager.js Normal file
View File

@@ -0,0 +1,245 @@
/**
* State Manager
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2017-03-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';
/**
* State Manager
*/
var stateManager = {};
/**
* Public Methods
*/
stateManager.registerInjection = function (tabIdentifier, injection) {
let injectionIdentifier, registeredTab, injectionCount;
injectionIdentifier = injection.source + injection.path + injection.version;
registeredTab = stateManager.tabs[tabIdentifier];
registeredTab.injections[injectionIdentifier] = injection;
injectionCount = Object.keys(registeredTab.injections).length || 0;
if (stateManager.showIconBadge === true) {
if (injectionCount > 0) {
wrappers.setBadgeText({
'tabId': tabIdentifier,
'text': injectionCount.toString()
});
}
}
if (isNaN(interceptor.amountInjected)) {
chrome.storage.local.get(Setting.AMOUNT_INJECTED, function (items) {
interceptor.amountInjected = items.amountInjected;
chrome.storage.local.set({
[Setting.AMOUNT_INJECTED]: ++interceptor.amountInjected
});
});
} else {
chrome.storage.local.set({
[Setting.AMOUNT_INJECTED]: ++interceptor.amountInjected
});
}
};
stateManager.addDomainToWhitelist = function (domain) {
return new Promise((resolve) => {
let whitelistedDomains = requestAnalyzer.whitelistedDomains;
whitelistedDomains[domain] = true;
chrome.storage.local.set({whitelistedDomains}, resolve);
});
};
stateManager.removeDomainFromWhitelist = function (domain) {
return new Promise((resolve) => {
let whitelistedDomains = requestAnalyzer.whitelistedDomains;
delete whitelistedDomains[domain];
chrome.storage.local.set({whitelistedDomains}, resolve);
});
};
/**
* Private Methods
*/
stateManager._createTab = function (tab) {
let tabIdentifier, requestFilters;
tabIdentifier = tab.id;
stateManager.tabs[tabIdentifier] = {
'injections': {}
};
requestFilters = {
'tabId': tabIdentifier,
'urls': stateManager.validHosts
};
chrome.webRequest.onBeforeRequest.addListener(function (requestDetails) {
let tab = stateManager.tabs[tabIdentifier].details || {};
return interceptor.handleRequest(requestDetails, tabIdentifier, tab);
}, requestFilters, [WebRequest.BLOCKING]);
};
stateManager._removeTab = function (tabIdentifier) {
delete stateManager.tabs[tabIdentifier];
};
stateManager._updateTab = function (details) {
let tabIdentifier, frameIdentifier;
tabIdentifier = details.tabId;
frameIdentifier = details.frameId;
if (tabIdentifier === -1 || frameIdentifier !== 0) {
return;
}
if (stateManager.showIconBadge === true) {
wrappers.setBadgeText({
'tabId': tabIdentifier,
'text': ''
});
}
if (stateManager.tabs[tabIdentifier]) {
stateManager.tabs[tabIdentifier].injections = {};
}
};
stateManager._handleStorageChanged = function (changes) {
if (Setting.SHOW_ICON_BADGE in changes) {
stateManager.showIconBadge = changes.showIconBadge.newValue;
if (changes.showIconBadge.newValue !== true) {
chrome.tabs.query({}, function (tabs) {
tabs.forEach(stateManager._removeIconBadgeFromTab);
});
}
}
if (Setting.STRIP_METADATA in changes) {
requestSanitizer.disable();
if (changes.stripMetadata.newValue !== false) {
requestSanitizer.enable();
}
}
};
stateManager._removeIconBadgeFromTab = function (tab) {
wrappers.setBadgeText({
'tabId': tab.id,
'text': ''
});
};
/**
* Initializations
*/
stateManager.requests = {};
stateManager.tabs = {};
stateManager.validHosts = [];
for (let mapping in mappings) {
let supportedHost = Address.ANY_PROTOCOL + mapping + Address.ANY_PATH;
stateManager.validHosts.push(supportedHost);
}
chrome.tabs.query({}, function (tabs) {
tabs.forEach(stateManager._createTab);
});
chrome.storage.local.get(Setting.SHOW_ICON_BADGE, function (items) {
if (items.showIconBadge === undefined) {
items.showIconBadge = true;
}
stateManager.showIconBadge = items.showIconBadge;
});
/**
* Event Handlers
*/
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': ':'}]
});
chrome.webRequest.onErrorOccurred.addListener(function (requestDetails) {
if (stateManager.requests[requestDetails.requestId]) {
delete stateManager.requests[requestDetails.requestId];
}
}, {'urls': [Address.ANY]});
chrome.webRequest.onBeforeRedirect.addListener(function (requestDetails) {
let knownRequest = stateManager.requests[requestDetails.requestId];
if (knownRequest) {
stateManager.registerInjection(knownRequest.tabIdentifier, knownRequest.targetDetails);
delete stateManager.requests[requestDetails.requestId];
}
}, {'urls': [Address.ANY]});
chrome.storage.onChanged.addListener(stateManager._handleStorageChanged);

35
crowdin.yaml Normal file
View File

@@ -0,0 +1,35 @@
"project_identifier": "decentraleyes"
"preserve_hierarchy": true
"files":
-
"source": "/_locales/en_US/messages.json"
"translation": "/_locales/%locale_with_underscore%/messages.json"
"languages_mapping":
"locale_with_underscore":
"ar": "ar"
"bg": "bg"
"cs": "cs"
"da": "da"
"de": "de"
"el": "el"
"eo": "eo"
"es-ES": "es"
"et": "et"
"fi": "fi"
"fr": "fr"
"he": "he"
"hu": "hu"
"id": "id"
"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,29 +0,0 @@
INTRODUCTION
------------
This script (first introduced in Decentraleyes v1.1.5) should make reviewing this extension a lot easier than it used to be. It's open source and open for scrutiny, and it automatically compares the bundled libraries (resources) to their original sources (after removing any source mapping URLs).
FOR NON-LINUX USERS
-------------------
This usage guide is tailored to Linux based operating systems. If you're on a different type of system, the easiest direct solution might be to launch a free Linux box with Node.js pre-installed on Red Hat OpenShift. You can then SSH into it (after adding your own machine's public key to your account).
Having said that, every terminal command in the usage guide below comes with a description, so it should not be too hard to get this done on practically any type of configuration.
USAGE INSTRUCTIONS
------------------
1. Make sure you have Node.js installed on your machine (or install it).
2. Open up a terminal and 'cd' into this directory.
Description: Navigate to this directory.
3. Execute 'npm install' to fetch any dependencies.
4. Run the audit script by executing 'node run'.
Description: Run the script through Node.js and view the output.
Note: If you'd like to store the report, run 'node run > report.txt'.
Note description: It's possible to write the console output to a file.

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

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

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

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

@@ -1,5 +0,0 @@
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.addNotice', true);
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.blockMissing', false);
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.domainWhitelist', '');
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.amountInjected', 0);
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.showReleaseNotes', true);

BIN
icon.png
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

BIN
icons/action/icon18.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

BIN
icons/action/icon19.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 B

BIN
icons/action/icon32.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
icons/action/icon36.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
icons/action/icon38.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
icons/action/icon64.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
icons/icon128.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
icons/icon16.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

BIN
icons/icon48.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
icons/icon96.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -1,101 +0,0 @@
/**
* Data Handler
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2014-05-30
* @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';
/**
* Imports
*/
var { Cc, Ci } = require('chrome');
var self = require('sdk/self');
//noinspection JSUnresolvedFunction
var ioService = Cc['@mozilla.org/network/io-service;1']
.getService(Ci.nsIIOService);
/**
* Absolute resource file paths.
* @var {object} files
*/
var files = require('./files');
/**
* Constants
*/
const DELIVERY_NOTICE = '/**\n * Local delivery by Decentraleyes (' + self.version + ').\n */\n\n';
/**
* Variables
*/
var resourceData = self.data;
/**
* Public Methods
*/
function getRedirectionURI(targetPath, characterSet, type) {
var data, dataURI, redirectionURI;
data = _loadResource(targetPath);
dataURI = _buildDataURI(type, characterSet, data);
redirectionURI = ioService.newURI(dataURI, null, null);
return redirectionURI;
}
/**
* Exports
*/
exports.getRedirectionURI = getRedirectionURI;
/**
* Private Methods
*/
function _loadResource(targetPath) {
var resource;
// Find the result inside a static path index.
if (!files[targetPath]) {
throw new Error('The requested resource is missing.');
}
// Attempt to load resource contents.
return resource = resourceData.load(targetPath);
}
function _buildDataURI(type, characterSet, data) {
var addNotice, dataURI;
//noinspection JSUnresolvedVariable
addNotice = require('sdk/simple-prefs').prefs.addNotice;
dataURI = 'data:' + type + ';charset=' + characterSet + ',';
// Remove the syntax invalidation character.
data = data.substring(1);
if (!addNotice) {
dataURI = dataURI + encodeURIComponent(data);
} else {
dataURI = dataURI + encodeURIComponent(DELIVERY_NOTICE + data);
}
return dataURI;
}

View File

@@ -1,138 +0,0 @@
/**
* Interceptor
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2014-05-30
* @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';
/**
* Imports
*/
var { Class } = require('sdk/core/heritage');
var { Unknown } = require('sdk/platform/xpcom');
var { Cc, Ci, Cr } = require('chrome');
/**
* Gets and sets add-on specific preferences.
* @var {object} simplePreferences
*/
var simplePreferences = require('sdk/simple-prefs');
/**
* Retains data across application restarts.
* @var {object} simpleStorage
*/
var simpleStorage = require('sdk/simple-storage');
//noinspection JSUnresolvedFunction
var observerService = Cc['@mozilla.org/observer-service;1']
.getService(Ci.nsIObserverService);
var requestAnalyzer = require('./request-analyzer');
var dataHandler = require('./data-handler');
/**
* Variables
*/
var preferences = simplePreferences.prefs;
var storage = simpleStorage.storage;
/**
* Interceptor Class
*/
var Interceptor = new Class({
extends: Unknown,
interfaces: ['nsIObserver'],
topic: 'http-on-modify-request',
register: function () {
observerService.addObserver(this, this.topic, false);
},
unregister: function () {
observerService.removeObserver(this, this.topic);
},
/**
* Called whenever an HTTP request is made.
* @param httpChannel
*/
observe: function (httpChannel) {
var validCandidate, target, characterSet, redirectionURI;
// Enable runtime discovery.
httpChannel.QueryInterface(Ci.nsIHttpChannel);
// Determine the validity of the candidate.
validCandidate = requestAnalyzer.isValidCandidate(httpChannel);
if (!validCandidate) {
return;
}
// Remove referer header from request.
httpChannel.setRequestHeader('Referer', null, false);
// Convert the original request URI to a local target.
target = requestAnalyzer.getLocalTarget(httpChannel.URI.host, httpChannel.URI.path);
if (!target) {
return this.handleMissingCandidate(httpChannel);
}
characterSet = httpChannel.URI.originCharset;
// Fetch local data and create a redirection URI.
try {
redirectionURI = dataHandler.getRedirectionURI(target.path, characterSet, target.type);
} catch (exception) {
return this.handleMissingCandidate(httpChannel);
}
// Fix for reported edge-case issues with specific websites.
var initiatorDomain =
httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain ||
httpChannel.referrer && httpChannel.referrer.host;
if (storage.taintedDomains[initiatorDomain] || /yandex\./.test(initiatorDomain)) {
return this.handleMissingCandidate(httpChannel);
}
// Redirect the HTTP channel to the the local destination.
httpChannel.redirectTo(redirectionURI);
//noinspection JSUnresolvedVariable
preferences.amountInjected++;
},
/**
* Called when a valid candidate cannot be injected.
* @param httpChannel
*/
handleMissingCandidate: function (httpChannel) {
//noinspection JSUnresolvedVariable
if (preferences.blockMissing) {
httpChannel.cancel(Cr.NS_ERROR_NOT_AVAILABLE);
}
}
});
/**
* Exports
*/
module.exports = Interceptor;

View File

@@ -1,168 +0,0 @@
/**
* Load Watcher
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2016-02-04
* @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';
/**
* Imports
*/
var { Class } = require('sdk/core/heritage');
var { Unknown, Factory } = require('sdk/platform/xpcom');
var { Cc, Ci, Cu } = require('chrome');
var xpcom = require('sdk/platform/xpcom');
/**
* Resource version mappings.
* @var {object} mappings
*/
var mappings = require('./mappings');
/**
* Retains data across application restarts.
* @var {object} simpleStorage
*/
var simpleStorage = require('sdk/simple-storage');
//noinspection JSUnresolvedFunction
var categoryManager = Cc['@mozilla.org/categorymanager;1']
.getService(Ci.nsICategoryManager);
/**
* Constants
*/
const CONTRACT_ID = '@decentraleyes.org/load-watcher;1';
const SCRIPT_CONTENT_TYPE = Ci.nsIContentPolicy.TYPE_SCRIPT;
const SCRIPT_ELEMENT = Ci.nsIDOMHTMLScriptElement;
const REQUEST_ACCEPTATION = Ci.nsIContentPolicy.ACCEPT;
/**
* Variables
*/
var storage = simpleStorage.storage;
/**
* Tainted domains that are not automatically detectable.
* @var {object} undetectableTaintedDomains
*/
var undetectableTaintedDomains = {
'identi.ca': true,
'minigames.mail.ru': true,
'passport.twitch.tv': true,
'ya.ru': true,
'yadi.sk': true
};
/**
* Initializations
*/
Object.extend = function (destination, source) {
for (var property in source) {
if (source.hasOwnProperty(property)) {
destination[property] = source[property];
}
}
return destination;
};
storage.taintedDomains = storage.taintedDomains || {};
storage.taintedDomains = Object.extend(storage.taintedDomains, undetectableTaintedDomains);
/**
* Load Watcher Class
*/
var LoadWatcher = new Class({
extends: Unknown,
interfaces: ['nsIContentPolicy'],
get wrappedJSObject() {
return this
},
register: function () {
categoryManager.deleteCategoryEntry('content-policy', CONTRACT_ID, false);
categoryManager.addCategoryEntry('content-policy', CONTRACT_ID, CONTRACT_ID, false, true);
},
shouldLoad: function (contentType, contentLocation, requestOrigin, node) {
if (contentType == SCRIPT_CONTENT_TYPE && mappings[contentLocation.host]) {
if (node instanceof SCRIPT_ELEMENT) {
if (node.hasAttribute('crossorigin') || node.hasAttribute('integrity')) {
// Add corresponding origin domain to the list of tainted domains.
storage.taintedDomains[requestOrigin.host] = true;
}
}
}
// Accept the resource load request.
return REQUEST_ACCEPTATION;
}
});
/**
* Load Watcher Factory
*/
var factory = Factory({
contract: CONTRACT_ID,
Component: LoadWatcher,
unregister: false
});
/**
* Unregister
*/
var unload = require('sdk/system/unload');
unload.when(function () {
function trueUnregister() {
categoryManager.deleteCategoryEntry('content-policy', CONTRACT_ID, false);
try {
xpcom.unregister(factory);
} catch (exception) {
Cu.reportError(exception);
}
}
if ('dispatch' in Cu) {
Cu.dispatch(trueUnregister, trueUnregister);
} else {
Cu.import('resource://gre/modules/Services.jsm');
Services.tm.mainThread.dispatch(trueUnregister, 0);
}
});
/**
* Exports
*/
module.exports = LoadWatcher;

View File

@@ -1,62 +0,0 @@
/**
* Entry Point
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2014-05-30
* @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';
/**
* Imports
*/
var Interceptor = require('./interceptor');
var LoadWatcher = require('./load-watcher');
var preferences = require('sdk/simple-prefs').prefs;
var self = require('sdk/self');
var tabs = require("sdk/tabs");
/**
* Main
*/
var interceptor = new Interceptor();
var loadWatcher = new LoadWatcher();
var featurelessVersions = {
'1.3.7': true
};
// Executed as soon as the add-on is loaded.
exports.main = function (options) {
// Initialize add-on state.
interceptor.register();
loadWatcher.register();
if (preferences.showReleaseNotes) {
if (options.loadReason === 'install' || (options.loadReason === 'upgrade' && !featurelessVersions[self.version])) {
if (preferences['sdk.baseURI']) {
tabs.open(preferences['sdk.baseURI'] + 'static/release-notes.html');
}
}
}
};
// Executed as soon as the add-on is unloaded.
exports.onUnload = function () {
// Clean up add-on state.
interceptor.unregister();
};

View File

@@ -1,183 +0,0 @@
/**
* Request Analyzer
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2014-05-30
* @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';
/**
* Imports
*/
/**
* Resource version mappings.
* @var {object} mappings
*/
var mappings = require('./mappings');
/**
* Gets and sets add-on specific preferences.
* @var {object} simplePreferences
*/
var simplePreferences = require('sdk/simple-prefs');
/**
* Constants
*/
const MAPPING_FILE_EXPRESSION = new RegExp('.map$', 'i');
const VERSION_EXPRESSION = /(?:\d{1,2}\.){1,3}\d{1,2}/;
const VERSION_PLACEHOLDER = '{version}';
const WEB_PREFIX_VALUE = 'www.';
const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length;
const VALUE_SEPARATOR = ';';
/**
* Variables
*/
var preferences = simplePreferences.prefs;
var whitelistedDomains = {};
/**
* Initializations
*/
_applyWhitelistPreference();
/**
* Event Handlers
*/
simplePreferences.on('domainWhitelist', _applyWhitelistPreference);
/**
* Public Methods
*/
exports.isValidCandidate = function (httpChannel) {
// See if the request is targeted at a Content Delivery Network.
if (mappings[httpChannel.URI.host] === undefined) {
return false;
}
// Attempt to determine the domain of the request initiator.
var initiatorDomain =
httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain ||
httpChannel.referrer && httpChannel.referrer.host;
// If the request initiator could be determined and is whitelisted.
if (initiatorDomain && whitelistedDomains[_normalizeDomain(initiatorDomain)]) {
// Remove referer header from request.
httpChannel.setRequestHeader('Referer', null, false);
return false;
}
// Only requests of type GET can be valid candidates.
return httpChannel.requestMethod === 'GET';
};
exports.getLocalTarget = function (channelHost, channelPath) {
var hostMappings, basePath, resourceMappings;
// Use the proper mappings for the targeted host.
hostMappings = mappings[channelHost];
// Resource mapping files are never locally available.
if (MAPPING_FILE_EXPRESSION.test(channelPath)) {
return false;
}
basePath = _matchBasePath(hostMappings, channelPath);
resourceMappings = hostMappings[basePath];
if (!resourceMappings) {
return false;
}
// Return either the local target's path or false.
return _findLocalTarget(resourceMappings, basePath, channelPath);
};
/**
* Private Methods
*/
function _matchBasePath(hostMappings, channelPath) {
for (let basePath of Object.keys(hostMappings)) {
if (channelPath.startsWith(basePath)) {
return basePath;
}
}
return false;
}
function _findLocalTarget(resourceMappings, basePath, channelPath) {
var resourcePath, versionNumber, resourcePattern;
resourcePath = channelPath.replace(basePath, '');
versionNumber = resourcePath.match(VERSION_EXPRESSION);
resourcePattern = resourcePath.replace(versionNumber, VERSION_PLACEHOLDER);
// Determine if the resource path has a static mapping.
if (resourceMappings[resourcePath]) {
// Prepare and return a local target.
return {
path: resourceMappings[resourcePath].path,
type: resourceMappings[resourcePath].type
};
}
// Determine if the resource path fits into a resource mold.
for (let resourceMold of Object.keys(resourceMappings)) {
if (resourcePattern.startsWith(resourceMold)) {
// Prepare and return a local target.
return {
path: resourceMappings[resourceMold].path.replace(VERSION_PLACEHOLDER, versionNumber),
type: resourceMappings[resourceMold].type
};
}
}
return false;
}
function _normalizeDomain(domain) {
domain = domain.toLowerCase().trim();
if (domain.startsWith(WEB_PREFIX_VALUE)) {
domain = domain.slice(WEB_PREFIX_LENGTH);
}
return domain;
}
function _applyWhitelistPreference() {
whitelistedDomains = {};
//noinspection JSUnresolvedVariable
preferences.domainWhitelist.split(VALUE_SEPARATOR).forEach(function (domain) {
whitelistedDomains[_normalizeDomain(domain)] = true;
});
}

View File

@@ -1,98 +0,0 @@
/**
* Resources
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2014-05-30
* @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';
/**
* Resources
*/
var resources = {
// AngularJS
angular: {
path: 'resources/angularjs/{version}/angular.min.js.dec',
type: 'application/javascript'
},
// Backbone.js
backbone: {
path: 'resources/backbone.js/{version}/backbone-min.js.dec',
type: 'application/javascript'
},
// Dojo
dojo: {
path: 'resources/dojo/{version}/dojo/dojo.js.dec',
type: 'application/javascript'
},
// Ember.js
ember: {
path: 'resources/ember.js/{version}/ember.min.js.dec',
type: 'application/javascript'
},
// Ext Core
extCore: {
path: 'resources/ext-core/{version}/ext-core.js.dec',
type: 'application/javascript'
},
// jQuery
jQuery: {
path: 'resources/jquery/{version}/jquery.min.js.dec',
type: 'application/javascript'
},
// jQuery UI
jQueryUI: {
path: 'resources/jqueryui/{version}/jquery-ui.min.js.dec',
type: 'application/javascript'
},
// Modernizr
modernizr: {
path: 'resources/modernizr/{version}/modernizr.min.js.dec',
type: 'application/javascript'
},
// MooTools
mootools: {
path: 'resources/mootools/{version}/mootools-yui-compressed.js.dec',
type: 'application/javascript'
},
// Prototype
prototypeJS: {
path: 'resources/prototype/{version}/prototype.js.dec',
type: 'application/javascript'
},
// Scriptaculous
scriptaculous: {
path: 'resources/scriptaculous/{version}/scriptaculous.js.dec',
type: 'application/javascript'
},
// SWFObject
swfobject: {
path: 'resources/swfobject/{version}/swfobject.js.dec',
type: 'application/javascript'
},
// Underscore.js
underscore: {
path: 'resources/underscore.js/{version}/underscore-min.js.dec',
type: 'application/javascript'
},
// Web Font Loader
webfont: {
path: 'resources/webfont/{version}/webfont.js.dec',
type: 'application/javascript'
}
};
/**
* Exports
*/
module.exports = resources;

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Добавяне на коментари към местно извлечени файлове">
<!ENTITY options.addNotice.description "Автоматично вмъкване на известие към извлечените документи, за да се сигнализира местна доставка.">
<!ENTITY options.blockMissing.title "Блокиране на заявки за липсващи ресурси">
<!ENTITY options.blockMissing.description "Отмяна на прехванатата заявка, ако изисквания ресурс не е наличен на местно ниво.">
<!ENTITY options.domainWhitelist.title "Изключване на домейните от инспекции">
<!ENTITY options.domainWhitelist.description "Въведете домейни, които да се добавят в белия списък. Отделете стойностите с точка и запетая.">
<!ENTITY options.amountInjected.title "Брояч за местно вмъкнати ресурси">
<!ENTITY options.amountInjected.description "Количество на местни вмъквания на ресурси от началото на инсталацията.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Tilføj kommentarer til lokalt hentede filer">
<!ENTITY options.addNotice.description "Tilføj automatiskt en notits til filer, så det fremgår at de er leveret lokalt.">
<!ENTITY options.blockMissing.title "Bloker anmodninger om manglende ressourcer">
<!ENTITY options.blockMissing.description "Annullerer en anmodning hvis den forespurgte ressource ikke findes lokalt.">
<!ENTITY options.domainWhitelist.title "Udeluk disse domæner fra inspektion">
<!ENTITY options.domainWhitelist.description "Tilføj domæner der ikke skal opfanges. Separer flere med semikolon (;).">
<!ENTITY options.amountInjected.title "Optælling af lokalt leverede ressourcer">
<!ENTITY options.amountInjected.description "Antal injektioner af lokale ressourcer siden installation.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Kennzeichne lokal abgerufene Dateien">
<!ENTITY options.addNotice.description "Füge automatisch Kommentare an lokal ausgelieferte Bibliotheken hinzu.">
<!ENTITY options.blockMissing.title "Blockiere Anfordern fehlender Inhalte">
<!ENTITY options.blockMissing.description "Abgefangene Anforderung unterbinden, falls angeforderte Datei nicht lokal verfügbar ist.">
<!ENTITY options.domainWhitelist.title "Domains von Prüfung ausschließen">
<!ENTITY options.domainWhitelist.description "Gebe zu ignorierende Domains an. Trenne mehrere Einträge durch Semikolons (;).">
<!ENTITY options.amountInjected.title "Zähler für lokal injizierte Ressourcen">
<!ENTITY options.amountInjected.description "Anzahl der lokalen Injektionen von den CDN-Ressourcen seit der Installation.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Add comments to locally fetched files">
<!ENTITY options.addNotice.description "Automatically prepend a notice to retrieved documents to signal local delivery.">
<!ENTITY options.blockMissing.title "Block requests for missing resources">
<!ENTITY options.blockMissing.description "Cancel intercepted request if the required resource is not locally available.">
<!ENTITY options.domainWhitelist.title "Exclude domains from inspections">
<!ENTITY options.domainWhitelist.description "Enter domains to whitelist them. Separate multiple entries with semi-colons (;).">
<!ENTITY options.amountInjected.title "Counter for locally injected resources">
<!ENTITY options.amountInjected.description "Amount of local Content Delivery Network resource injections since installation.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Add comments to locally fetched files">
<!ENTITY options.addNotice.description "Automatically prepend a notice to retrieved documents to signal local delivery.">
<!ENTITY options.blockMissing.title "Block requests for missing resources">
<!ENTITY options.blockMissing.description "Cancel intercepted request if the required resource is not locally available.">
<!ENTITY options.domainWhitelist.title "Exclude domains from inspections">
<!ENTITY options.domainWhitelist.description "Enter domains to whitelist them. Separate multiple entries with semi-colons (;).">
<!ENTITY options.amountInjected.title "Counter for locally injected resources">
<!ENTITY options.amountInjected.description "Amount of local Content Delivery Network resource injections since installation.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Aldoni komentojn al lokaj dosieroj">
<!ENTITY options.addNotice.description "Aldoni sciigon al enmetitaj dokumentoj por marki ke ili estas lokaj risurcoj.">
<!ENTITY options.blockMissing.title "Bloki petojn por mankaj risurcoj">
<!ENTITY options.blockMissing.description "Bloki petojn interkaptitajn se la petitan risurcon ne loke haveblas.">
<!ENTITY options.domainWhitelist.title "Neinspektendaj domajnoj">
<!ENTITY options.domainWhitelist.description "Entajpu demajnojn, kiujn Decentraleyes ne devas inspekti. Disigu domajnojn per punktokomoj (;).">
<!ENTITY options.amountInjected.title "Nombrilo de loke enmetiaj risurcoj">
<!ENTITY options.amountInjected.description "Kvanto de lokaj CDN-risurcoj enmetitaj ekde instaliĝo.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Añadir notas a archivos obtenidos localmente">
<!ENTITY options.addNotice.description "Anteponer un aviso a documentos obtenidos para señalar entrega local.">
<!ENTITY options.blockMissing.title "Bloquear peticiones de fuentes faltantes">
<!ENTITY options.blockMissing.description "Cancelar peticiones detenidas si la fuente requerida no se encuentra localmente.">
<!ENTITY options.domainWhitelist.title "Excluir dominios de inspecciones">
<!ENTITY options.domainWhitelist.description "Ingresar dominios a ser ignorados. Separar múltiples entradas con punto y coma (;).">
<!ENTITY options.amountInjected.title "Contador para fuentes inyectadas localmente">
<!ENTITY options.amountInjected.description "Cifra de inyecciones de fuentes de Redes de Entrega de Contenido desde instalación.">

View File

@@ -1,8 +0,0 @@
<!ENTITY options.addNotice.title "Merkitse korvatut tiedostot">
<!ENTITY options.addNotice.description "Lisää alkuun ilmoituksen paikallisesti noudetuille tiedostoille.">
<!ENTITY options.blockMissing.title "Estä pyynnöt puuttuviin resursseihin">
<!ENTITY options.blockMissing.description "Estää pyynnöt jos paikallista sisältöä ei ole saatavilla.">
<!ENTITY options.domainWhitelist.title "Poissulje verkkotunnukset">
<!ENTITY options.domainWhitelist.description "Lisää verkkotunnus jottei sitä korvata. Erota rivit puolipisteellä (;).">
<!ENTITY options.amountInjected.title "Korvatut pyynnöt">
<!ENTITY options.amountInjected.description "Korvatut sisältöpyynnöt lisäosan asennuksen jälkeen.">

Some files were not shown because too many files have changed in this diff Show More