Files
mattermostest/src/main/trustedOrigins.ts
Devin Binnie 9b36c25e4e [MM-52696] Upgrade and clean up Desktop App dev dependencies (#2970)
* Upgrade to ESLint v8

* Upgrade TypeScript, api-types, react-intl

* Remove unnecessary dependencies

* Update to React 17.0.2

* npm audit fixes, remove storybook

* Lock some packages

* Remove nan patch

* Remove some deprecated dependencies

* Fix lint/type/tests

* Merge'd

* Fix bad use of spawn

* Fix notarize

* Fix afterpack, switch to tsc es2020

* Fix api types

* Use @mattermost/eslint-plugin
2024-03-07 15:55:33 -05:00

111 lines
3.3 KiB
TypeScript

// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
'use strict';
import fs from 'fs';
import {ipcMain} from 'electron';
import {UPDATE_PATHS} from 'common/communication';
import {Logger} from 'common/log';
import * as Validator from 'common/Validator';
import type {TrustedOrigin, PermissionType} from 'types/trustedOrigin';
import {trustedOriginsStoreFile} from './constants';
const log = new Logger('TrustedOriginsStore');
export class TrustedOriginsStore {
storeFile: string;
data?: Map<string, TrustedOrigin>;
constructor(storeFile: string) {
this.storeFile = storeFile;
}
// don't use this, is for ease of mocking it on testing
readFromFile = () => {
let storeData;
try {
storeData = fs.readFileSync(this.storeFile, 'utf-8');
} catch (e) {
storeData = null;
}
return storeData;
};
load = () => {
const storeData = this.readFromFile();
let result = {};
if (storeData !== null) {
result = Validator.validateTrustedOriginsStore(storeData);
if (!result) {
throw new Error('Provided TrustedOrigins file does not validate, using defaults instead.');
}
}
this.data = new Map(Object.entries(result));
};
// don't use this, is for ease of mocking it on testing
saveToFile(stringMap: string) {
fs.writeFileSync(this.storeFile, stringMap);
}
save = () => {
if (!this.data) {
return;
}
this.saveToFile(JSON.stringify(Object.fromEntries((this.data.entries())), null, ' '));
};
// if permissions or targetUrl are invalid, this function will throw an error
// this function stablishes all the permissions at once, overwriting whatever was before
// to enable just one permission use addPermission instead.
set = (targetURL: URL, permissions: Record<PermissionType, boolean>) => {
if (!this.data) {
return;
}
const validPermissions = Validator.validateOriginPermissions(permissions);
if (!validPermissions) {
throw new Error(`Invalid permissions set for trusting ${targetURL}`);
}
this.data.set(targetURL.origin, validPermissions);
};
// enables usage of `targetURL` for `permission`
addPermission = (targetURL: URL, permission: PermissionType) => {
this.set(targetURL, {[permission]: true});
};
delete = (targetURL: URL) => {
return this.data?.delete(targetURL.origin);
};
isExisting = (targetURL: URL) => {
return this.data?.has(targetURL.origin) || false;
};
checkPermission = (targetURL: URL, permission: PermissionType) => {
if (!permission) {
log.error(`Missing permission request on ${targetURL}`);
return null;
}
const urlPermissions = this.data?.get(targetURL.origin);
return urlPermissions ? urlPermissions[permission] : undefined;
};
}
const trustedOriginsStore = new TrustedOriginsStore(trustedOriginsStoreFile);
export default trustedOriginsStore;
ipcMain.on(UPDATE_PATHS, () => {
log.debug('UPDATE_PATHS');
trustedOriginsStore.storeFile = trustedOriginsStoreFile;
if (trustedOriginsStore.data) {
trustedOriginsStore.load();
}
});