├── .eslintignore ├── .travis.yml ├── src ├── background │ ├── index.js │ ├── config.js │ ├── db.js │ └── db.test.js ├── domains │ └── facebook.com │ │ ├── index.js │ │ ├── content_scripts │ │ ├── components │ │ │ ├── Webtrex.svelte │ │ │ └── Onboarding.svelte │ │ ├── handlers │ │ │ ├── spy.js │ │ │ ├── shield │ │ │ │ ├── Component.svelte │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── feed │ │ │ │ ├── index.js │ │ │ │ └── Component.svelte │ │ │ ├── sync.js │ │ │ └── scrape.js │ │ ├── utils.js │ │ ├── index.js │ │ ├── sifter.js │ │ ├── …observers.ᴊs │ │ └── scraper.js │ │ ├── background │ │ ├── sync.js │ │ ├── v1.js │ │ ├── api.js │ │ ├── userInfo.js │ │ ├── index.js │ │ └── profile.js │ │ └── default_popup │ │ ├── Popup.svelte │ │ ├── Nav.svelte │ │ ├── About.svelte │ │ ├── Profiles.svelte │ │ ├── Profile.svelte │ │ └── Settings.svelte ├── images │ ├── icon-128.png │ ├── icon-16.png │ └── icon-48.png ├── content_scripts │ ├── index.js │ ├── logger.js │ ├── hub.js │ └── dom.js ├── default_popup │ ├── index.js │ ├── index.html │ └── App.svelte ├── _locales │ ├── README.md │ ├── en │ │ └── messages.json │ ├── pt_BR │ │ └── messages.json │ ├── it │ │ └── messages.json │ └── es │ │ └── messages.json ├── styles │ ├── _font.scss │ └── main.scss ├── common │ └── utils.js └── manifest.json ├── assets ├── fonts │ ├── Trex-Bold.woff2 │ ├── Trex-Medium.woff2 │ ├── Trex-Regular.woff2 │ ├── Trex-BoldItalic.woff2 │ └── Trex-RegularItalic.woff2 └── images │ ├── trex-logo-128.png │ ├── trex-logo-16.png │ ├── trex-logo-256.png │ ├── trex-logo-32.png │ ├── trex-logo-48.png │ ├── trex-logo-64.png │ ├── trex-logo.svg │ └── header-logo-default.svg ├── .env_template ├── .gitignore ├── babel.config.js ├── package.json ├── README.md ├── CHANGELOG.md ├── rollup.config.js └── LICENSE /.eslintignore: -------------------------------------------------------------------------------- 1 | build/* 2 | dist/* 3 | node_modules/* 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "10" 4 | -------------------------------------------------------------------------------- /src/background/index.js: -------------------------------------------------------------------------------- 1 | import "src/domains/facebook.com/background/"; 2 | -------------------------------------------------------------------------------- /src/domains/facebook.com/index.js: -------------------------------------------------------------------------------- 1 | export const NAMESPACE = "facebook.com"; 2 | -------------------------------------------------------------------------------- /src/background/config.js: -------------------------------------------------------------------------------- 1 | const CONFIG = __CONFIG__; 2 | export default CONFIG; 3 | -------------------------------------------------------------------------------- /src/images/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/src/images/icon-128.png -------------------------------------------------------------------------------- /src/images/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/src/images/icon-16.png -------------------------------------------------------------------------------- /src/images/icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/src/images/icon-48.png -------------------------------------------------------------------------------- /assets/fonts/Trex-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/fonts/Trex-Bold.woff2 -------------------------------------------------------------------------------- /src/content_scripts/index.js: -------------------------------------------------------------------------------- 1 | import * as dom from "./dom"; 2 | import Hub from "./hub"; 3 | 4 | export { dom, Hub }; 5 | -------------------------------------------------------------------------------- /assets/fonts/Trex-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/fonts/Trex-Medium.woff2 -------------------------------------------------------------------------------- /assets/fonts/Trex-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/fonts/Trex-Regular.woff2 -------------------------------------------------------------------------------- /assets/images/trex-logo-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/images/trex-logo-128.png -------------------------------------------------------------------------------- /assets/images/trex-logo-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/images/trex-logo-16.png -------------------------------------------------------------------------------- /assets/images/trex-logo-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/images/trex-logo-256.png -------------------------------------------------------------------------------- /assets/images/trex-logo-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/images/trex-logo-32.png -------------------------------------------------------------------------------- /assets/images/trex-logo-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/images/trex-logo-48.png -------------------------------------------------------------------------------- /assets/images/trex-logo-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/images/trex-logo-64.png -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/components/Webtrex.svelte: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /assets/fonts/Trex-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/fonts/Trex-BoldItalic.woff2 -------------------------------------------------------------------------------- /assets/fonts/Trex-RegularItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tracking-exposed/web-extension/HEAD/assets/fonts/Trex-RegularItalic.woff2 -------------------------------------------------------------------------------- /.env_template: -------------------------------------------------------------------------------- 1 | # Add any app settings here 2 | 3 | 4 | # Demo server settings (ignored when building for production) 5 | DEMO_PORT=3000 6 | DEMO_HOST_NAME=localhost 7 | AUTOLOGIN_EMAIL= 8 | AUTOLOGIN_PASSWORD= 9 | -------------------------------------------------------------------------------- /src/default_popup/index.js: -------------------------------------------------------------------------------- 1 | import App from "./App.svelte"; 2 | 3 | const app = new App({ 4 | target: document.body, 5 | props: { 6 | name: "World" 7 | } 8 | }); 9 | 10 | export default app; 11 | -------------------------------------------------------------------------------- /src/domains/facebook.com/background/sync.js: -------------------------------------------------------------------------------- 1 | import api from "./api"; 2 | import { getProfile } from "./profile"; 3 | 4 | export async function syncEvents(events) { 5 | return api.sync(events, await getProfile()); 6 | } 7 | -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/handlers/spy.js: -------------------------------------------------------------------------------- 1 | function eventHandler(type, e) { 2 | console.debug("[log event]", type, e); 3 | } 4 | 5 | export default function register(hub) { 6 | hub.on("*", eventHandler); 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __old 2 | .DS_Store 3 | *.seed 4 | *.log 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | .idea 10 | *.sublime-project 11 | *.sublime-workspace 12 | 13 | extension.zip 14 | 15 | .env 16 | 17 | build/* 18 | dist/* 19 | docs/* 20 | 21 | node_modules/* 22 | -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/handlers/shield/Component.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/handlers/index.js: -------------------------------------------------------------------------------- 1 | import sync from "./sync"; 2 | import spy from "./spy"; 3 | import feed from "./feed"; 4 | import scrape from "./scrape"; 5 | import shield from "./shield"; 6 | 7 | export default function registerHandlers(hub) { 8 | spy(hub); 9 | sync(hub); 10 | feed(hub); 11 | scrape(hub); 12 | // shield(hub); 13 | } 14 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | // Note: configuration used only for testing. 2 | // The final bundle is generated by rollup, and the transpilation is made 3 | // by svelte itself. 4 | 5 | module.exports = { 6 | presets: [ 7 | [ 8 | '@babel/preset-env', 9 | { 10 | targets: { 11 | node: 'current', 12 | }, 13 | }, 14 | ], 15 | ], 16 | }; 17 | -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/utils.js: -------------------------------------------------------------------------------- 1 | export async function toDataURL(url) { 2 | const response = await fetch(url); 3 | const blob = await response.blob(); 4 | return new Promise((resolve, reject) => { 5 | const reader = new FileReader(); 6 | reader.onloadend = () => resolve(reader.result); 7 | reader.onerror = reject; 8 | reader.readAsDataURL(blob); 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /src/content_scripts/logger.js: -------------------------------------------------------------------------------- 1 | const ROOT = "trex"; 2 | 3 | export default function get(context) { 4 | context = context ? [ROOT, context].join(":") : ROOT; 5 | const _get = method => 6 | Function.prototype.bind.call(console[method], console, context); 7 | const log = _get("log"); 8 | log.debug = _get("debug"); 9 | log.info = _get("info"); 10 | log.warn = _get("warn"); 11 | log.error = _get("error"); 12 | return log; 13 | } 14 | -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/handlers/shield/index.js: -------------------------------------------------------------------------------- 1 | // # Shield 2 | // 3 | // This handler protec but it also attac 4 | 5 | import Component from "./Component.svelte"; 6 | 7 | function eventHandler(type, payload) { 8 | new Component({ 9 | target: payload.element, 10 | anchor: payload.element.querySelector("div") 11 | }); 12 | } 13 | 14 | export default function register(hub) { 15 | hub.on("newPost", eventHandler); 16 | } 17 | -------------------------------------------------------------------------------- /src/domains/facebook.com/background/v1.js: -------------------------------------------------------------------------------- 1 | import bs58 from "bs58"; 2 | 3 | import db from "src/background/db"; 4 | 5 | export async function getProfile(id) { 6 | const profile = await db.get(id); 7 | db.remove(id); 8 | return ( 9 | profile && { 10 | address: profile.publicKey, 11 | publicKey: Array.from(bs58.decode(profile.publicKey)), 12 | secretKey: Array.from(bs58.decode(profile.secretKey)), 13 | optIn: !!profile.optin 14 | } 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /src/default_popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Tracking Exposed 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/_locales/README.md: -------------------------------------------------------------------------------- 1 | # Working with i18n 2 | 3 | Check the [official docs](https://developer.chrome.com/extensions/i18n). This is important 4 | if you are developing under Linux: 5 | 6 | > to change the locale on Linux, first quit Google Chrome. Then, all in one line, set the LANGUAGE environment variable and launch Google Chrome. For example: 7 | 8 | ``` 9 | LANGUAGE=es ./chrome 10 | ``` 11 | 12 | 13 | # Accepted locales 14 | 15 | Refer to the [locales support](https://developer.chrome.com/webstore/i18n?csw=1#localeTable) page 16 | in the official Chrome documentation. 17 | -------------------------------------------------------------------------------- /src/domains/facebook.com/content_scripts/handlers/feed/index.js: -------------------------------------------------------------------------------- 1 | // # Feed 2 | // 3 | // This handler displays metadata about the scraping in the Facebook UI. 4 | 5 | import Component from "./Component.svelte"; 6 | 7 | function eventHandler(type, payload, hub) { 8 | if(!payload.data) { 9 | console.debug("data is null, returning", payload); 10 | return; 11 | } 12 | new Component({ 13 | target: payload.element, 14 | anchor: payload.element.querySelector("div"), 15 | props: { 16 | hub, 17 | visibility: payload.data.visibility 18 | } 19 | }); 20 | } 21 | 22 | export default function register(hub) { 23 | hub.on("newPost", eventHandler); 24 | } 25 | -------------------------------------------------------------------------------- /src/domains/facebook.com/default_popup/Popup.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 |