xiMatrix

filter net requests according to source, destination and type  https://addons.mozilla.org/firefox/addon/ximatrix/
git clone https://git.ce9e.org/xiMatrix.git

commit
f4888c39857066c074c54e7e4dc85616479203c6
parent
9fad505d76fe2725b3b38dc24270fe9900c9e426
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-08 18:01
split storage into separate module

Diffstat

M src/bg.js 69 ++++++++++++++-----------------------------------------------
A src/storage.js 39 +++++++++++++++++++++++++++++++++++++++

2 files changed, 55 insertions, 53 deletions


diff --git a/src/bg.js b/src/bg.js

@@ -1,21 +1,7 @@
    1     1 /* global browser */
    2     2 
    3     3 import * as shared from './shared.js';
    4    -1 
    5    -1 var lock = Promise.resolve();
    6    -1 
    7    -1 var STORAGE_DEFAULTS = {
    8    -1     'rules': {},
    9    -1     'savedRules': {},
   10    -1     'requests': {},
   11    -1     'recording': true,
   12    -1 };
   13    -1 var STORAGE_AREAS = {
   14    -1     'rules': browser.storage.local,
   15    -1     'savedRules': browser.storage.local,
   16    -1     'requests': browser.storage.session,
   17    -1     'recording': browser.storage.local,
   18    -1 };
   -1     4 import * as storage from './storage.js';
   19     5 
   20     6 var glob = function(s, pattern) {
   21     7     var p = pattern.split('*');
@@ -34,26 +20,9 @@ var getHostname = function(url, patterns) {
   34    20     return u.hostname;
   35    21 };
   36    22 
   37    -1 var storageGet = async function(key) {
   38    -1     var data = await STORAGE_AREAS[key].get(key);
   39    -1     return data[key] ?? STORAGE_DEFAULTS[key];
   40    -1 };
   41    -1 
   42    -1 var _storageChange = async function(key, fn) {
   43    -1     var oldValue = await storageGet(key);
   44    -1     var data = {};
   45    -1     data[key] = fn(oldValue);
   46    -1     await STORAGE_AREAS[key].set(data);
   47    -1 };
   48    -1 
   49    -1 var storageChange = async function(key, fn) {
   50    -1     lock = lock.then(() => _storageChange(key, fn));
   51    -1     await lock;
   52    -1 };
   53    -1 
   54    23 var setRule = async function(context, hostname, type, rule) {
   55    -1     var savedRules = await storageGet('savedRules');
   56    -1     await storageChange('rules', rules => {
   -1    24     var savedRules = await storage.get('savedRules');
   -1    25     await storage.change('rules', rules => {
   57    26         if (hostname === 'first-party') {
   58    27             context = '*';
   59    28         }
@@ -79,14 +48,14 @@ var setRule = async function(context, hostname, type, rule) {
   79    48 };
   80    49 
   81    50 var getPatterns = async function() {
   82    -1     var savedRules = await storageGet('savedRules');
   -1    51     var savedRules = await storage.get('savedRules');
   83    52     return savedRules._patterns || [];
   84    53 };
   85    54 
   86    55 var getRules = async function(context) {
   87    56     var [rules, savedRules] = await Promise.all([
   88    -1         storageGet('rules'),
   89    -1         storageGet('savedRules'),
   -1    57         storage.get('rules'),
   -1    58         storage.get('savedRules'),
   90    59     ]);
   91    60     var restricted = {};
   92    61     restricted['*'] = rules['*'] || savedRules['*'] || {};
@@ -96,9 +65,9 @@ var getRules = async function(context) {
   96    65 };
   97    66 
   98    67 var pushRequest = async function(tabId, hostname, type) {
   99    -1     var recording = await storageGet('recording');
   -1    68     var recording = await storage.get('recording');
  100    69     if (recording) {
  101    -1         await storageChange('requests', requests => {
   -1    70         await storage.change('requests', requests => {
  102    71             if (!requests[tabId]) {
  103    72                 requests[tabId] = {};
  104    73             }
@@ -115,7 +84,7 @@ var pushRequest = async function(tabId, hostname, type) {
  115    84 };
  116    85 
  117    86 var clearRequests = async function(tabId) {
  118    -1     await storageChange('requests', requests => {
   -1    87     await storage.change('requests', requests => {
  119    88         if (requests[tabId]) {
  120    89             delete requests[tabId];
  121    90         }
@@ -140,8 +109,8 @@ browser.runtime.onMessage.addListener(async (msg, sender) => {
  140   109         const context = getHostname(tab.url, patterns);
  141   110         const [rules, requests, recording] = await Promise.all([
  142   111             getRules(context),
  143    -1             storageGet('requests'),
  144    -1             storageGet('recording'),
   -1   112             storage.get('requests'),
   -1   113             storage.get('recording'),
  145   114         ]);
  146   115         return {
  147   116             context: context,
@@ -159,12 +128,12 @@ browser.runtime.onMessage.addListener(async (msg, sender) => {
  159   128         return await getRules(msg.data.context);
  160   129     } else if (msg.type === 'commit') {
  161   130         let r;
  162    -1         await storageChange('rules', rules => {
   -1   131         await storage.change('rules', rules => {
  163   132             r = rules[msg.data];
  164   133             delete rules[msg.data];
  165   134             return rules;
  166   135         });
  167    -1         await storageChange('savedRules', savedRules => {
   -1   136         await storage.change('savedRules', savedRules => {
  168   137             if (Object.keys(r).length === 0) {
  169   138                 delete savedRules[msg.data];
  170   139             } else {
@@ -173,14 +142,14 @@ browser.runtime.onMessage.addListener(async (msg, sender) => {
  173   142             return savedRules;
  174   143         });
  175   144     } else if (msg.type === 'reset') {
  176    -1         await storageChange('rules', rules => {
   -1   145         await storage.change('rules', rules => {
  177   146             delete rules[msg.data];
  178   147             return rules;
  179   148         });
  180   149     } else if (msg.type === 'securitypolicyviolation') {
  181   150         await pushRequest(sender.tab.id, 'inline', msg.data);
  182   151     } else if (msg.type === 'toggleRecording') {
  183    -1         await storageChange('recording', recording => !recording);
   -1   152         await storage.change('recording', recording => !recording);
  184   153     }
  185   154 });
  186   155 
@@ -240,7 +209,7 @@ browser.webRequest.onHeadersReceived.addListener(async details => {
  240   209     var context = getHostname(details.url, patterns);
  241   210     var [rules, recording] = await Promise.all([
  242   211         getRules(context),
  243    -1         storageGet('recording'),
   -1   212         storage.get('recording'),
  244   213     ]);
  245   214     var csp = (type, value) => {
  246   215         var name = 'Content-Security-Policy';
@@ -266,9 +235,3 @@ browser.webRequest.onHeadersReceived.addListener(async details => {
  266   235     urls: ['<all_urls>'],
  267   236     types: ['main_frame'],
  268   237 }, ['blocking', 'responseHeaders']);
  269    -1 
  270    -1 // migrations
  271    -1 browser.runtime.onInstalled.addListener(() => {
  272    -1     // 0.8.0: store requests to session storage
  273    -1     lock = lock.then(() => browser.storage.local.remove('requests'));
  274    -1 });

diff --git a/src/storage.js b/src/storage.js

@@ -0,0 +1,39 @@
   -1     1 /* global browser */
   -1     2 
   -1     3 var STORAGE_DEFAULTS = {
   -1     4     'rules': {},
   -1     5     'savedRules': {},
   -1     6     'requests': {},
   -1     7     'recording': true,
   -1     8 };
   -1     9 var STORAGE_AREAS = {
   -1    10     'rules': browser.storage.local,
   -1    11     'savedRules': browser.storage.local,
   -1    12     'requests': browser.storage.session,
   -1    13     'recording': browser.storage.local,
   -1    14 };
   -1    15 
   -1    16 var lock = Promise.resolve();
   -1    17 
   -1    18 export var get = async function(key) {
   -1    19     var data = await STORAGE_AREAS[key].get(key);
   -1    20     return data[key] ?? STORAGE_DEFAULTS[key];
   -1    21 };
   -1    22 
   -1    23 var _change = async function(key, fn) {
   -1    24     var oldValue = await get(key);
   -1    25     var data = {};
   -1    26     data[key] = fn(oldValue);
   -1    27     await STORAGE_AREAS[key].set(data);
   -1    28 };
   -1    29 
   -1    30 export var change = async function(key, fn) {
   -1    31     lock = lock.then(() => _change(key, fn));
   -1    32     await lock;
   -1    33 };
   -1    34 
   -1    35 // migrations
   -1    36 browser.runtime.onInstalled.addListener(() => {
   -1    37     // 0.8.0: store requests to session storage
   -1    38     lock = lock.then(() => browser.storage.local.remove('requests'));
   -1    39 });