fchat-rising/electron/blocker/blocker.ts

130 lines
5.1 KiB
TypeScript

import log from 'electron-log';
import { ElectronBlocker } from '@cliqz/adblocker-electron';
import path from 'path';
import fs from 'fs';
import * as _ from 'lodash';
import * as electron from 'electron';
import { NetworkFilter } from '@cliqz/adblocker';
export class BlockerIntegration {
protected static readonly adBlockerLists = [
'https://easylist.to/easylist/easylist.txt',
'https://easylist.to/easylist/easyprivacy.txt', // EasyPrivacy
'https://secure.fanboy.co.nz/fanboy-cookiemonster.txt', // Easy Cookies
'https://easylist.to/easylist/fanboy-social.txt', // Fanboy Social
'https://easylist.to/easylist/fanboy-annoyance.txt', // Fanboy Annoyances
'https://filters.adtidy.org/extension/chromium/filters/2.txt', // AdGuard Base
'https://filters.adtidy.org/extension/chromium/filters/11.txt', // AdGuard Mobile Ads
'https://filters.adtidy.org/extension/chromium/filters/4.txt', // AdGuard Social Media
'https://filters.adtidy.org/extension/chromium/filters/14.txt', // AdGuard Annoyances
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/annoyances.txt', // uBlock Origin Annoyances
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt', // uBlock Origin Filters
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/privacy.txt', // uBlock Origin Privacy
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/badware.txt', // uBlock Origin Badware
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/resource-abuse.txt', // uBlock Origin Resource Abuse
'https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/unbreak.txt' // uBlock Origin Unbreak
];
// tslint:disable-next-line:max-line-length
constructor(protected readonly baseDir: string, protected readonly blocker?: ElectronBlocker, protected readonly session?: electron.Session) {
// nothing yet
}
static async factory(baseDir: string): Promise<BlockerIntegration> {
log.debug('adblock.init');
try {
const blocker = await ElectronBlocker.fromLists(
fetch,
BlockerIntegration.adBlockerLists,
{
enableCompression: true
},
{
path: path.join(baseDir, 'adblocker.bin'),
read: fs.promises.readFile,
write: fs.promises.writeFile
}
);
log.debug('adblock.load.complete');
const session = electron.session.fromPartition('persist:adblocked', { cache: true });
log.debug('adblock.session.created');
blocker.update({
newNetworkFilters: [
NetworkFilter.parse('@@||redgifs.com')!,
]
});
blocker.enableBlockingInSession(session);
log.debug('adblock.enabled');
BlockerIntegration.configureBlocker(blocker, session);
log.debug('adblock.session.attached');
return new BlockerIntegration(baseDir, blocker, session);
} catch (err) {
log.warn('adblock.init.error', 'Adblocker failed to initialize.'
+ 'This does not break F-Chat Rising, but may produce slower image previews', err);
return new BlockerIntegration(baseDir);
}
}
protected static configureBlocker(blocker: ElectronBlocker, session: electron.Session): void {
// Temp fix -- manually override adblocker's preload script
// to point to CJS that has been copied over with config in webpack.config.js
// require.resolve('@cliqz/adblocker-electron-preload');
const preloadScript = path.join(electron.app.getAppPath(), './preview/assets/adblocker/preload.cjs.js');
// const originPath = require.resolve('@cliqz/adblocker-electron-preload');
// const preloadScript = path.resolve(path.dirname(originPath), 'preload.cjs');
log.debug('adblock.preload.path', { finalPath: preloadScript /*, originPath */ });
log.debug('adblock.preloaders.original', { loaders: session.getPreloads() });
session.setPreloads(
_.concat(
_.filter(
session.getPreloads(),
(p) => (p.indexOf('adblocker-electron-preload') < 0)
),
[preloadScript]
)
);
blocker.blockFonts();
log.debug('adblock.preloaders', { loaders: session.getPreloads() });
blocker.on('request-blocked', (request: Request) => {
log.debug('adblock.request.blocked', { url: request.url });
});
blocker.on('request-redirected', (request: Request) => {
log.debug('adblock.request.redirected', { url: request.url });
});
blocker.on('request-whitelisted', (request: Request) => {
log.debug('adblock.request.whitelisted', { url: request.url });
});
blocker.on('csp-injected', (request: Request) => {
log.debug('adblock.inject.csp', { url: request.url });
});
blocker.on('script-injected', (script: string, url: string) => {
log.debug('adblock.inject.script', { length: script.length, url });
});
blocker.on('style-injected', (style: string, url: string) => {
log.debug('adblock.inject.style', { length: style.length, url });
});
}
}