112 lines
3.7 KiB
JavaScript
112 lines
3.7 KiB
JavaScript
/** \file
|
|
* \brief FPD module initial configuration
|
|
*
|
|
* \author Copyright (C) 2021 Marek Salon
|
|
* \author Copyright (C) 2023 Martin Zmitko
|
|
*
|
|
* \license SPDX-License-Identifier: GPL-3.0-or-later
|
|
*/
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
/** \file
|
|
*
|
|
* \brief This file is part of Fingerprint Detector (FPD) and contains the function for loading configuration files.
|
|
*
|
|
* \ingroup FPD
|
|
*/
|
|
|
|
//DEF_FPD_FILES_S
|
|
var fp_config_files = ["groups-lvl_0", "groups-lvl_1", "wrappers-lvl_0_1"]
|
|
//DEF_FPD_FILES_E
|
|
|
|
/**
|
|
* Object containing parsed input from JSON configuration files of FPD module.
|
|
*/
|
|
var fp_levels = {};
|
|
|
|
/// \cond (Exclude this section from the doxygen documentation. If this section is not excluded, it is documented as a separate function.)
|
|
{
|
|
// parse input files into fp_levels for each level, generate wrapping code and initialize FPD module
|
|
let loadFpdConfig = async () => {
|
|
for (let file of fp_config_files) {
|
|
try {
|
|
let config = JSON.parse(await readFile(browser.runtime.getURL(`fp_config/${file}.json`)));
|
|
let file_splitted = file.split("-");
|
|
let file_levels = file_splitted[1].split("_").filter(x => x != 'lvl');
|
|
fp_levels[file_splitted[0]] = fp_levels[file_splitted[0]] || {};
|
|
for (let level of file_levels) {
|
|
fp_levels[file_splitted[0]][level] = config;
|
|
}
|
|
}
|
|
catch (e) {
|
|
console.error(e);
|
|
}
|
|
}
|
|
|
|
// merge duplicit entries of the same resource to be wrapped only once
|
|
let mergeWrappers = (sameResources) => {
|
|
let mergeGroups = () => {
|
|
let accArray = [];
|
|
for (let resource of sameResources) {
|
|
accArray.push(...resource.groups);
|
|
}
|
|
return accArray;
|
|
}
|
|
|
|
return {
|
|
resource: sameResources[0].resource,
|
|
type: sameResources[0].type,
|
|
groups: mergeGroups()
|
|
}
|
|
}
|
|
|
|
fp_levels.page_wrappers = [];
|
|
for (let level in fp_levels.wrappers) {
|
|
let tmpWrappers = {};
|
|
for (let wrapper of fp_levels.wrappers[level]) {
|
|
if (!Object.keys(tmpWrappers).includes(wrapper.resource)) {
|
|
let sameResources = fp_levels.wrappers[level].filter(x => x.resource == wrapper.resource);
|
|
tmpWrappers[wrapper.resource] = mergeWrappers(sameResources);
|
|
}
|
|
}
|
|
fp_levels.wrappers[level] = Object.values(tmpWrappers);
|
|
|
|
// Save FPD wrappers for page configuration
|
|
fp_levels.page_wrappers[level] = fp_levels.wrappers[level].map(w => [
|
|
// Wrapped object name
|
|
w.resource,
|
|
// Wrapped object type (0 - function, 1 - property)
|
|
w.type === "property" ? 1 : 0,
|
|
// Array specifying property types to wrap (getter, setter or both)
|
|
Array.from(new Set(w.groups.map(x => x.property != undefined ? x.property : "get"))),
|
|
// Specify if arguments should be sent for evaulation
|
|
w.groups.some(group => "arguments" in group) ? 1 : 0,
|
|
]);
|
|
}
|
|
|
|
// initialize FPD module (background script and event listeners)
|
|
initFpd();
|
|
|
|
fp_levels_initialised = true;
|
|
if (levels_initialised) { // Wait for both levels_initialised and fp_levels_initialised
|
|
var orig_levels_updated_callbacks = levels_updated_callbacks;
|
|
levels_updated_callbacks = [];
|
|
orig_levels_updated_callbacks.forEach((it) => it());
|
|
await updateUserScripts();
|
|
}
|
|
}
|
|
loadFpdConfig();
|
|
}
|
|
/// \endcond
|