refactor(database): improve naming to add exclude_matches to it

This commit is contained in:
wanhose 2024-10-18 16:18:52 +02:00
parent accc5efda8
commit daa805f4f4
10 changed files with 462 additions and 390 deletions

View File

@ -10,7 +10,7 @@
# Cookie Dialog Monster
Cookie Dialog Monster is a browser extension that hides cookie consent dialogs without changing user preferences. By default, we do NOT accept cookies (except in [a few cases](https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/database.json#L248) where the pages do not function without accepting them). You can report broken sites with a single click, which will create an issue in this repository to be fixed promptly.
Cookie Dialog Monster is a browser extension that hides cookie consent dialogs without changing user preferences. By default, we do NOT accept cookies (except in [a few cases](https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/database.json) where the pages do not function without accepting them). You can report broken sites with a single click, which will create an issue in this repository to be fixed promptly.
## Contributing

View File

@ -1,547 +1,257 @@
{
"commonWords": [
"ablehnen",
"accept",
"accepta",
"accepter",
"accettare",
"accordo",
"aceitar",
"aceptar",
"acuerdo",
"advertising",
"agree",
"akzeptieren",
"analitica",
"analítica",
"analitice",
"analityka",
"analyse",
"analytics",
"analytique",
"baner",
"banner",
"bannière",
"cc",
"cerrar",
"chiudere",
"close",
"cmp",
"compliance",
"concordar",
"confidențialitate",
"confidentialité",
"configuraciones",
"configurações",
"conformidade",
"conformità",
"conformitate",
"conformité",
"consenso",
"consent",
"consentement",
"consentimento",
"consentimiento",
"consimțământ",
"cookie",
"cumplimiento",
"d'accord",
"dados",
"dane",
"data",
"date",
"daten",
"datenschutz",
"dati",
"datos",
"de acord",
"declinar",
"declinare",
"decline",
"décliner",
"déni",
"descargo de responsabilidad",
"desempenho",
"dialog",
"dialogo",
"diálogo",
"dialogue",
"disclaimer",
"disconoscimento",
"données",
"dritte",
"einstellungen",
"einwilligung",
"fechar",
"fermer",
"fonctionnel",
"funcional",
"functional",
"funcțional",
"funkcjonalny",
"funktional",
"funzionale",
"gdpr",
"gerenciar",
"gérer",
"gesetz",
"gestiona",
"gestionar",
"gestire",
"guardar",
"haftungsausschluss",
"impostazioni",
"închide",
"informação",
"información",
"informacja",
"informații",
"information",
"informazione",
"isenção de responsabilidade",
"konformität",
"konieczny",
"law",
"lege",
"legge",
"lei",
"leistung",
"ley",
"loi",
"manage",
"necesar",
"necesario",
"nécessaire",
"necessario",
"necessário",
"necessary",
"notwendig",
"nutzung",
"odmówić",
"odrzucić",
"opcional",
"opcjonalny",
"optional",
"opțional",
"optionnel",
"opzionale",
"paramètres",
"performance",
"performanță",
"personalisierung",
"personalização",
"personalización",
"personalizacja",
"personalizare",
"personalization",
"personalizzazione",
"personnalisation",
"policy",
"politica",
"politică",
"política",
"politik",
"politique",
"polityka",
"popup",
"präferenzen",
"prawo",
"preferences",
"préférences",
"preferencias",
"preferências",
"preferencje",
"preferenze",
"preferințe",
"prestazioni",
"privacidad",
"privacidade",
"privacy",
"prywatność",
"pubblicità",
"publicidad",
"publicidade",
"publicitate",
"publicité",
"rastreamento",
"rechazar",
"refuza",
"reject",
"rejeitar",
"rejeter",
"reklama",
"rendimiento",
"respinge",
"rifiutare",
"salva",
"salvar",
"salvare",
"sauvegarder",
"save",
"schließen",
"seguimiento",
"setări",
"settings",
"śledzenie",
"speichern",
"strona trzecia",
"suivi",
"terceiro",
"tercero",
"terță parte",
"terza parte",
"third-party",
"tiers",
"tracciamento",
"tracking",
"urmărire",
"usage",
"uso",
"ustawienia",
"utilisation",
"utilizare",
"użycie",
"verfolgung",
"verwalten",
"werbung",
"wydajność",
"zaakceptować",
"zamknij",
"zapisz",
"zarządzać",
"zgoda",
"zgodność",
"zgodzić się",
"zrzeczenie się",
"zustimmen",
"аналитика",
"баннер",
"всплывающее окно",
"данные",
"диалог",
"закон",
"закрыть",
"информация",
"использование",
"конфиденциальность",
"настройки",
"необходимо",
"опционально",
"отказ",
"отказаться",
"отклонить",
"отслеживание",
"персонализация",
"политика",
"предпочтения",
"принять",
"производительность",
"реклама",
"согласен",
"согласие",
"соответствие",
"сохранить",
"третья сторона",
"управлять",
"функциональный"
],
"fixes": [
"actions": [
{
"action": "click",
"domain": "action.com",
"name": "click",
"selector": "#CybotCookiebotDialogBodyLevelButtonLevelOptinDeclineAll"
},
{
"action": "resetAll",
"domain": "automobielmanagement.nl",
"name": "resetAll",
"property": "filter",
"selector": "body > *"
},
{
"action": "click",
"domain": "bilbaomuseoa.eus",
"name": "click",
"selector": ".alert_message .btn-confirm"
},
{
"action": "resetAll",
"domain": "breitbart.com",
"name": "resetAll",
"property": "display",
"selector": ".twitter-tweet"
},
{
"action": "resetAll",
"domain": "breitbart.com",
"name": "resetAll",
"property": "visibility",
"selector": ".twitter-tweet"
},
{
"action": "click",
"domain": "buscotelefonosgratis.es",
"name": "click",
"selector": "#cookie_action_close_header_reject"
},
{
"action": "click",
"domain": "chollometro.com",
"name": "click",
"selector": "[data-t=\"continueWithoutAccepting\"]"
},
{
"action": "click",
"domain": "classicube.net",
"name": "click",
"selector": "#acceptcookies"
},
{
"action": "click",
"domain": "compact-online.de",
"name": "click",
"selector": "[id*=\"bnnr-body-rightSide-\"] div + div > span"
},
{
"action": "click",
"domain": "consent.google",
"name": "click",
"selector": "[aria-label=\"Alle ablehnen\"], [aria-label=\"Odrzuć wszystko\"], [aria-label=\"Rechazar todo\"], [aria-label=\"Recusar tudo\"], [aria-label=\"Reject all\"], [aria-label=\"Rejeitar tudo\"], [aria-label=\"Respinge tot\"], [aria-label=\"Rifiuta tutto\"], [aria-label=\"Tout refuser\"], [aria-label=\"Отклонить все\"]"
},
{
"action": "click",
"domain": "consent.yahoo",
"name": "click",
"selector": ".reject-all"
},
{
"action": "click",
"domain": "consent.youtube",
"name": "click",
"selector": "[aria-label=\"Alle ablehnen\"], [aria-label=\"Odrzuć wszystko\"], [aria-label=\"Rechazar todo\"], [aria-label=\"Recusar tudo\"], [aria-label=\"Reject all\"], [aria-label=\"Rejeitar tudo\"], [aria-label=\"Respinge tot\"], [aria-label=\"Rifiuta tutto\"], [aria-label=\"Tout refuser\"], [aria-label=\"Отклонить все\"]"
},
{
"action": "click",
"domain": "dailymotion.com",
"name": "click",
"selector": "[aria-label=\"Continue without accepting\"]"
},
{
"action": "click",
"domain": "dealabs.com",
"name": "click",
"selector": "[data-t=\"continueWithoutAccepting\"]"
},
{
"action": "click",
"domain": "derstandard",
"name": "click",
"selector": "[aria-label=\"Einverstanden\"]"
},
{
"action": "click",
"domain": "fiberplane.dev",
"name": "click",
"selector": "button[aria-label=\"Close Banner\"]"
},
{
"action": "click",
"domain": "foto-erhardt.de",
"name": "click",
"selector": "[class=\"modal show\"]"
},
{
"action": "reset",
"domain": "gamestar.de",
"name": "reset",
"property": "filter",
"selector": "#content"
},
{
"action": "click",
"domain": "gettr.com",
"name": "click",
"selector": "button.bold"
},
{
"action": "click",
"domain": "gib-uns-deinen-gebrauchten.de",
"name": "click",
"selector": "#cookie-banner-accept-selected-button"
},
{
"action": "click",
"domain": "gmx.com",
"name": "click",
"selector": "#onetrust-accept-btn-handler"
},
{
"action": "click",
"domain": "gmx.net",
"name": "click",
"selector": "[data-id=\"save-all-pur\"]"
},
{
"action": "click",
"domain": "golem.de",
"name": "click",
"selector": "[title=\"Zustimmen und weiter\"]"
},
{
"action": "click",
"domain": "google",
"name": "click",
"selector": "[aria-modal=\"true\"][role=\"dialog\"]:has([href*=\"policies.google.com/technologies/cookies\"]) button:not([aria-label]):not([role=\"link\"])"
},
{
"action": "click",
"domain": "hagglezon.com",
"name": "click",
"selector": "[data-test=\"cookie-submit\"]"
},
{
"action": "click",
"domain": "instagram.com",
"name": "click",
"selector": "[role=\"dialog\"] > [style=\"display: flex; flex-direction: column; height: 100%; max-width: 100%;\"] > button"
},
{
"action": "click",
"domain": "motorolasound.com",
"name": "click",
"selector": "#cookie-btn-denied"
},
{
"action": "click",
"domain": "mydealz.de",
"name": "click",
"selector": "[data-t=\"continueWithoutAccepting\"]"
},
{
"action": "reload",
"domain": "myprivacy.dpgmedia"
"domain": "myprivacy.dpgmedia",
"name": "reload"
},
{
"action": "click",
"domain": "off-campers.com",
"name": "click",
"selector": "[form=\"cookie-consent-form\"][value=\"deny\"]"
},
{
"action": "reset",
"domain": "orcd.co",
"name": "reset",
"property": "opacity",
"selector": ".player-container.box-shadow"
},
{
"action": "resetAll",
"domain": ".pl",
"name": "resetAll",
"property": "filter",
"selector": "body:has(.advertisement.contentAds.ads.adsbygoogle.top-banners.adbanner.bannerAd.ad-google.AdSense:first-child) > *"
},
{
"action": "reset",
"domain": "play.google",
"name": "reset",
"property": "z-index",
"selector": "body > div"
},
{
"action": "click",
"domain": "popeyes.es",
"name": "click",
"selector": ".cookie-buttons > .cookie-buttons-column > div:last-child"
},
{
"action": "click",
"domain": "producthunt.com",
"name": "click",
"selector": "[data-test=\"dismiss-CookiePopup\"] button"
},
{
"action": "click",
"domain": "reddit.com",
"name": "click",
"selector": "#SHORTCUT_FOCUSABLE_DIV [style*=\"--Toaster\"] section:last-child section:last-child button"
},
{
"action": "reset",
"domain": "resonanz-labor.de",
"name": "reset",
"property": "overflow",
"selector": "#wrapwrap"
},
{
"action": "click",
"domain": "staylibere.com",
"name": "click",
"selector": "[class*=\"LayoutCookieBanner_buttons\"] > button:last-child"
},
{
"action": "reset",
"domain": "thetvdb.com",
"name": "reset",
"property": "overflow",
"selector": "body"
},
{
"action": "click",
"domain": "twitch.tv",
"name": "click",
"selector": "[data-a-target=\"consent-banner-accept\"]"
},
{
"action": "click",
"domain": "usnews.com",
"name": "click",
"selector": "#gdpr-modal-agree"
},
{
"action": "click",
"domain": "web.de",
"name": "click",
"selector": "#reminder"
},
{
"action": "click",
"domain": "web.dev",
"name": "click",
"selector": "a[href*=\"cookies\"] + button"
},
{
"action": "click",
"domain": "youtube.com",
"name": "click",
"selector": "[aria-label*=\"ablehnen\"], [aria-label*=\"Reject\"], [aria-label*=\"Rechazar\"], [aria-label*=\"refuser\"], [aria-label*=\"Rifiuta\"], [aria-label*=\"Nie wyrażaj zgody\"], [aria-label*=\"Rejeitar\"], [aria-label*=\"Recusar\"], [aria-label*=\"Resping\"], [aria-label*=\"Запретить\"]"
},
{
"action": "click",
"domain": "zdf.de",
"name": "click",
"selector": "#aria-dialog-cmp-error-dialog > .dialog-close"
},
{
"action": "click",
"domain": "zeit.de",
"name": "click",
"selector": "[title=\"ACCEPT AND CONTINUE\"]"
}
],
"rules": [
"||app.usercentrics.eu^",
"||b2brouter.net/de/wp-content/plugins/cookies-and-content-security-policy^",
"||benno-gymnasium.de/plugins/system/gdpr^",
"||c.evidon.com^",
"||cdn-cookieyes.com^",
"||cdn.consentmanager.net^",
"||cdn.cookielaw.org^",
"||cdn.optable.co^",
"||cdn.trustcommander.net/privacy^",
"||cdntranscend.eventbrite.com^",
"||chollometro.com/assets/js/CookiesMessage*.js^",
"||city-bahn.de/wp-content/plugins/borlabs-cookie^",
"||cmp.huffingtonpost.fr^",
"||cmp.inmobi.com^",
"||cmp.prisa.com^",
"||cmp.uniconsent.com^",
"||cms.static-bahn.de/cms/consent-layer^",
"||consent.cookiebot.com^",
"||consent.cookiefirst.com^",
"||consent.pdf24.org^",
"||consent.trustarc.com^",
"||consent.up.welt.de^",
"||consentbar.interencheres.com^",
"||consentcdn.cookiebot.com^",
"||cookiehub.net^",
"||cp.as.com^",
"||cp.inside-digital.de^",
"||download.amd.com/OneTrust^",
"||driftingchef.com/static/*/Sticky2,ConsentManager",
"||emp.bbci.co.uk^",
"||eu.fastcmp.com^",
"||forum.vorondesign.com/js/xf/notice.min.js^",
"||gdpr-tcfv2.sp-prod.net^",
"||get.optad360.io/sf/*/plugin.min.js",
"||ilims.de/typo3conf/ext/nb_cookie_banner^",
"||itkadmin.de/_javascripts/cookiesolution/es_cookie_solution_sources_v2.js^",
"||js.vxcdn.com/usercentrics-sdk^",
"||lensois.com/wp-admin/admin-ajax.php",
"||media.bzcompany.cz/scookies^",
"||myprivacy-static.dpgmedia.net/consent.js^",
"||myprivacy.dpgmedia.*/consent^",
"||optanon.blob.core.windows.net^",
"||privacy.wetransfer.com/fides.js^",
"||prod.widgets.burgerprofiel.vlaanderen.be/*/js.cookie.js^",
"||redditstatic.com/onetrust.*.js",
"||s.nitropay.com/gpp-*.min.js",
"||s.p7s1.io/cmp^",
"||sdk.privacy-center.org^",
"||static.fastcmp.com^",
"||transcend-cdn.com^",
"||wcpstatic.microsoft.com^",
"||webtools.europa.eu/js/webtools.cck.js^",
"||widgets.marketcat.net^"
],
"skips": {
"exclusions": {
"domains": [
"*.bauhaus.cz",
"*.codesandbox.io",
"*.cookie-dialog-monster.com",
"*.facebook.com",
"*.googleapis.com",
"*.olympics.com",
"translate.google.*",
"www.youtube-nocookie.com",
"www.youtube.com"
],
"overflows": [
"app.diagrams.net",
"blog.sapegin.me",
"buyagift.co.uk",
@ -964,6 +674,307 @@
"YTD-YOODLE-RENDERER"
]
},
"keywords": [
"ablehnen",
"accept",
"accepta",
"accepter",
"accettare",
"accordo",
"aceitar",
"aceptar",
"acuerdo",
"advertising",
"agree",
"akzeptieren",
"analitica",
"analítica",
"analitice",
"analityka",
"analyse",
"analytics",
"analytique",
"baner",
"banner",
"bannière",
"cc",
"cerrar",
"chiudere",
"close",
"cmp",
"compliance",
"concordar",
"confidențialitate",
"confidentialité",
"configuraciones",
"configurações",
"conformidade",
"conformità",
"conformitate",
"conformité",
"consenso",
"consent",
"consentement",
"consentimento",
"consentimiento",
"consimțământ",
"cookie",
"cumplimiento",
"d'accord",
"dados",
"dane",
"data",
"date",
"daten",
"datenschutz",
"dati",
"datos",
"de acord",
"declinar",
"declinare",
"decline",
"décliner",
"déni",
"descargo de responsabilidad",
"desempenho",
"dialog",
"dialogo",
"diálogo",
"dialogue",
"disclaimer",
"disconoscimento",
"données",
"dritte",
"einstellungen",
"einwilligung",
"fechar",
"fermer",
"fonctionnel",
"funcional",
"functional",
"funcțional",
"funkcjonalny",
"funktional",
"funzionale",
"gdpr",
"gerenciar",
"gérer",
"gesetz",
"gestiona",
"gestionar",
"gestire",
"guardar",
"haftungsausschluss",
"impostazioni",
"închide",
"informação",
"información",
"informacja",
"informații",
"information",
"informazione",
"isenção de responsabilidade",
"konformität",
"konieczny",
"law",
"lege",
"legge",
"lei",
"leistung",
"ley",
"loi",
"manage",
"necesar",
"necesario",
"nécessaire",
"necessario",
"necessário",
"necessary",
"notwendig",
"nutzung",
"odmówić",
"odrzucić",
"opcional",
"opcjonalny",
"optional",
"opțional",
"optionnel",
"opzionale",
"paramètres",
"performance",
"performanță",
"personalisierung",
"personalização",
"personalización",
"personalizacja",
"personalizare",
"personalization",
"personalizzazione",
"personnalisation",
"policy",
"politica",
"politică",
"política",
"politik",
"politique",
"polityka",
"popup",
"präferenzen",
"prawo",
"preferences",
"préférences",
"preferencias",
"preferências",
"preferencje",
"preferenze",
"preferințe",
"prestazioni",
"privacidad",
"privacidade",
"privacy",
"prywatność",
"pubblicità",
"publicidad",
"publicidade",
"publicitate",
"publicité",
"rastreamento",
"rechazar",
"refuza",
"reject",
"rejeitar",
"rejeter",
"reklama",
"rendimiento",
"respinge",
"rifiutare",
"salva",
"salvar",
"salvare",
"sauvegarder",
"save",
"schließen",
"seguimiento",
"setări",
"settings",
"śledzenie",
"speichern",
"strona trzecia",
"suivi",
"terceiro",
"tercero",
"terță parte",
"terza parte",
"third-party",
"tiers",
"tracciamento",
"tracking",
"urmărire",
"usage",
"uso",
"ustawienia",
"utilisation",
"utilizare",
"użycie",
"verfolgung",
"verwalten",
"werbung",
"wydajność",
"zaakceptować",
"zamknij",
"zapisz",
"zarządzać",
"zgoda",
"zgodność",
"zgodzić się",
"zrzeczenie się",
"zustimmen",
"аналитика",
"баннер",
"всплывающее окно",
"данные",
"диалог",
"закон",
"закрыть",
"информация",
"использование",
"конфиденциальность",
"настройки",
"необходимо",
"опционально",
"отказ",
"отказаться",
"отклонить",
"отслеживание",
"персонализация",
"политика",
"предпочтения",
"принять",
"производительность",
"реклама",
"согласен",
"согласие",
"соответствие",
"сохранить",
"третья сторона",
"управлять",
"функциональный"
],
"rules": [
"||app.usercentrics.eu^",
"||b2brouter.net/de/wp-content/plugins/cookies-and-content-security-policy^",
"||benno-gymnasium.de/plugins/system/gdpr^",
"||c.evidon.com^",
"||cdn-cookieyes.com^",
"||cdn.consentmanager.net^",
"||cdn.cookielaw.org^",
"||cdn.optable.co^",
"||cdn.trustcommander.net/privacy^",
"||cdntranscend.eventbrite.com^",
"||chollometro.com/assets/js/CookiesMessage*.js^",
"||city-bahn.de/wp-content/plugins/borlabs-cookie^",
"||cmp.huffingtonpost.fr^",
"||cmp.inmobi.com^",
"||cmp.prisa.com^",
"||cmp.uniconsent.com^",
"||cms.static-bahn.de/cms/consent-layer^",
"||consent.cookiebot.com^",
"||consent.cookiefirst.com^",
"||consent.pdf24.org^",
"||consent.trustarc.com^",
"||consent.up.welt.de^",
"||consentbar.interencheres.com^",
"||consentcdn.cookiebot.com^",
"||cookiehub.net^",
"||cp.as.com^",
"||cp.inside-digital.de^",
"||download.amd.com/OneTrust^",
"||driftingchef.com/static/*/Sticky2,ConsentManager",
"||emp.bbci.co.uk^",
"||eu.fastcmp.com^",
"||forum.vorondesign.com/js/xf/notice.min.js^",
"||gdpr-tcfv2.sp-prod.net^",
"||get.optad360.io/sf/*/plugin.min.js",
"||ilims.de/typo3conf/ext/nb_cookie_banner^",
"||itkadmin.de/_javascripts/cookiesolution/es_cookie_solution_sources_v2.js^",
"||js.vxcdn.com/usercentrics-sdk^",
"||lensois.com/wp-admin/admin-ajax.php",
"||media.bzcompany.cz/scookies^",
"||myprivacy-static.dpgmedia.net/consent.js^",
"||myprivacy.dpgmedia.*/consent^",
"||optanon.blob.core.windows.net^",
"||privacy.wetransfer.com/fides.js^",
"||prod.widgets.burgerprofiel.vlaanderen.be/*/js.cookie.js^",
"||redditstatic.com/onetrust.*.js",
"||s.nitropay.com/gpp-*.min.js",
"||s.p7s1.io/cmp^",
"||sdk.privacy-center.org^",
"||static.fastcmp.com^",
"||transcend-cdn.com^",
"||wcpstatic.microsoft.com^",
"||webtools.europa.eu/js/webtools.cck.js^",
"||widgets.marketcat.net^"
],
"tokens": {
"backdrops": [
".cc-policy-overlay",
@ -13997,5 +14008,5 @@
"ytm-consent-bump-v2-renderer"
]
},
"version": "1728300083309"
"version": "1729252494919"
}

View File

@ -12,6 +12,9 @@ import v4ReportRoutes from 'routes/v4/report';
import v5DataRoutes from 'routes/v5/data';
import v5IssuesRoutes from 'routes/v5/issues';
import v5ReportRoutes from 'routes/v5/report';
import v6DataRoutes from 'routes/v6/data';
import v6IssuesRoutes from 'routes/v6/issues';
import v6ReportRoutes from 'routes/v6/report';
import environment from 'services/environment';
const server = fastify({ logger: true });
@ -39,6 +42,9 @@ server.register(v4ReportRoutes, { prefix: '/rest/v4' });
server.register(v5DataRoutes, { prefix: '/rest/v5' });
server.register(v5IssuesRoutes, { prefix: '/rest/v5' });
server.register(v5ReportRoutes, { prefix: '/rest/v5' });
server.register(v6DataRoutes, { prefix: '/rest/v6' });
server.register(v6IssuesRoutes, { prefix: '/rest/v6' });
server.register(v6ReportRoutes, { prefix: '/rest/v6' });
server.listen({ host: '0.0.0.0', port: environment.port }, (error, address) => {
if (error) {

View File

@ -1,6 +1,6 @@
import { FastifyInstance, RouteShorthandOptions } from 'fastify';
import fetch from 'node-fetch';
import { parseNewFix } from 'services/compatibility';
import { parseAction } from 'services/compatibility';
import environment from 'services/environment';
import { RATE_LIMIT_10_PER_MIN } from 'services/rateLimit';
@ -14,17 +14,18 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done:
},
async (_request, reply) => {
try {
const url = `${environment.gitea.raw}/database.json`;
const result = await (await fetch(url)).json();
const database = `${environment.gitea.raw}/database.json`;
const response = await fetch(database);
const { actions, exclusions, keywords, tokens } = await response.json();
reply.send({
data: {
classes: result.tokens.classes,
commonWords: result.commonWords,
elements: result.tokens.selectors,
fixes: result.fixes.map(parseNewFix),
skips: result.skips.domains,
tags: result.skips.tags,
classes: tokens.classes,
commonWords: keywords,
elements: tokens.selectors,
fixes: actions.map(parseAction),
skips: exclusions.overflows,
tags: exclusions.tags,
},
success: true,
});

View File

@ -1,6 +1,6 @@
import { FastifyInstance, RouteShorthandOptions } from 'fastify';
import fetch from 'node-fetch';
import { parseNewFix } from 'services/compatibility';
import { parseAction } from 'services/compatibility';
import environment from 'services/environment';
import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit';
@ -14,13 +14,16 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done:
},
async (_request, reply) => {
try {
const url = `${environment.gitea.raw}/database.json`;
const result = await (await fetch(url)).json();
const database = `${environment.gitea.raw}/database.json`;
const response = await fetch(database);
const { actions, exclusions, keywords, ...rest } = await response.json();
reply.send({
data: {
...result,
fixes: result.fixes.map(parseNewFix),
...rest,
commonWords: keywords,
fixes: actions.map(parseAction),
skips: { domains: exclusions.overflows, tags: exclusions.tags },
},
success: true,
});

View File

@ -1,5 +1,6 @@
import { FastifyInstance, RouteShorthandOptions } from 'fastify';
import fetch from 'node-fetch';
import { parseActionName, toDeclarativeNetRequestRule } from 'services/compatibility';
import environment from 'services/environment';
import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit';
@ -13,14 +14,18 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done:
},
async (_request, reply) => {
try {
const database = `${environment.gitea.raw}/database.json`;
const options = { headers: { 'Cache-Control': 'no-cache' } };
const url = `${environment.gitea.raw}/database.json`;
const { rules, ...result } = await (await fetch(url, options)).json();
const response = await fetch(database, options);
const { actions, exclusions, keywords, rules, ...rest } = await response.json();
reply.send({
data: {
...result,
...rest,
actions: actions.map(parseActionName),
commonWords: keywords,
rules: rules.map(toDeclarativeNetRequestRule),
skips: { domains: exclusions.overflows, tags: exclusions.tags },
},
success: true,
});
@ -35,17 +40,3 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done:
done();
};
function toDeclarativeNetRequestRule(urlFilter: string, index: number) {
return {
action: {
type: 'block',
},
condition: {
resourceTypes: ['font', 'image', 'media', 'object', 'script', 'stylesheet', 'xmlhttprequest'],
urlFilter,
},
id: index + 1,
priority: 1,
};
}

View File

@ -0,0 +1,39 @@
import { FastifyInstance, RouteShorthandOptions } from 'fastify';
import fetch from 'node-fetch';
import { toDeclarativeNetRequestRule } from 'services/compatibility';
import environment from 'services/environment';
import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit';
export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => {
server.get(
'/data/',
{
config: {
rateLimit: RATE_LIMIT_3_PER_MIN,
},
},
async (_request, reply) => {
try {
const database = `${environment.gitea.raw}/database.json`;
const options = { headers: { 'Cache-Control': 'no-cache' } };
const response = await fetch(database, options);
const { rules, ...rest } = await response.json();
reply.send({
data: {
...rest,
rules: rules.map(toDeclarativeNetRequestRule),
},
success: true,
});
} catch (error) {
reply.send({
errors: [error.message],
success: false,
});
}
}
);
done();
};

View File

@ -0,0 +1 @@
export { default as default } from '../v5/issues';

View File

@ -0,0 +1 @@
export { default as default } from '../v5/report';

View File

@ -1,13 +1,32 @@
/**
* Parse the new fix object into the old string format used by older versions of the extension
*/
export function parseNewFix(fix: Fix): string {
return `${fix.domain}##${fix.selector}##${fix.action}${fix.property ? `##${fix.property}` : ''}`;
export function parseAction(action: Action): string {
return `${action.domain}##${action.selector}##${action.name}${action.property ? `##${action.property}` : ''}`;
}
export interface Fix {
readonly action: string;
export function parseActionName(
action: Action
): Omit<Action, 'name'> & { readonly action: string } {
const { name, ...rest } = action;
return { action: name, ...rest };
}
export function toDeclarativeNetRequestRule(urlFilter: string, index: number) {
return {
action: {
type: 'block',
},
condition: {
resourceTypes: ['font', 'image', 'media', 'object', 'script', 'stylesheet', 'xmlhttprequest'],
urlFilter,
},
id: index + 1,
priority: 1,
};
}
export interface Action {
readonly domain: string;
readonly name: string;
readonly property?: string;
readonly selector: string;
}