mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 13:05:32 +09:00
124 lines
4.9 KiB
JavaScript
124 lines
4.9 KiB
JavaScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import {createRequire} from 'node:module';
|
|
import os from 'node:os';
|
|
import path from 'node:path';
|
|
import {describe, test} from 'node:test';
|
|
import {fileURLToPath} from 'node:url';
|
|
import vm from 'node:vm';
|
|
|
|
const require = createRequire(import.meta.url);
|
|
const esbuild = require('esbuild');
|
|
|
|
function transform(relativePath) {
|
|
const sourcePath = fileURLToPath(new URL(relativePath, import.meta.url));
|
|
const code = esbuild.transformSync(fs.readFileSync(sourcePath, 'utf8'), {
|
|
loader: 'ts',
|
|
format: 'cjs',
|
|
platform: 'node',
|
|
target: 'node20',
|
|
}).code;
|
|
return {sourcePath, code};
|
|
}
|
|
|
|
const constantsSource = transform('../common/Constants.ts');
|
|
const localAppRouteContractSource = transform('../../../packages/desktop_ipc/src/LocalAppRouteContract.ts');
|
|
const desktopConfigSource = transform('../common/DesktopConfig.ts');
|
|
const plainRecordSource = transform('../common/PlainRecord.ts');
|
|
const recordGuardsSource = transform('../../../packages/record_utils/src/RecordGuards.ts');
|
|
const globalShortcutActionsSource = transform('../common/GlobalShortcutActions.ts');
|
|
|
|
const silentLog = {debug() {}, info() {}, warn() {}, error() {}};
|
|
|
|
function runModule({sourcePath, code}, requireStub) {
|
|
const module = {exports: {}};
|
|
const context = vm.createContext({
|
|
require: requireStub,
|
|
module,
|
|
exports: module.exports,
|
|
process,
|
|
console,
|
|
URL,
|
|
JSON,
|
|
});
|
|
vm.runInContext(code, context, {filename: sourcePath});
|
|
return module.exports;
|
|
}
|
|
|
|
function loadDesktop({channel = 'stable', settings} = {}) {
|
|
const userDataPath = fs.mkdtempSync(path.join(os.tmpdir(), 'fluxer-legacy-app-origin-test-'));
|
|
const settingsPath = path.join(userDataPath, 'settings.json');
|
|
if (settings !== undefined) {
|
|
fs.writeFileSync(settingsPath, JSON.stringify(settings), 'utf-8');
|
|
}
|
|
const localAppRouteContract = runModule(localAppRouteContractSource, (specifier) => {
|
|
throw new Error(`Unexpected import: ${specifier}`);
|
|
});
|
|
const constants = runModule(constantsSource, (specifier) => {
|
|
if (specifier === '@electron/common/BuildChannel') return {BUILD_CHANNEL: channel};
|
|
if (specifier === '@fluxer/desktop_ipc/src/LocalAppRouteContract') return localAppRouteContract;
|
|
throw new Error(`Unexpected import: ${specifier}`);
|
|
});
|
|
const globalShortcutActions = runModule(globalShortcutActionsSource, (specifier) => {
|
|
throw new Error(`Unexpected import: ${specifier}`);
|
|
});
|
|
const plainRecord = runModule(plainRecordSource, (specifier) => {
|
|
throw new Error(`Unexpected import: ${specifier}`);
|
|
});
|
|
const recordGuards = runModule(recordGuardsSource, (specifier) => {
|
|
throw new Error(`Unexpected import: ${specifier}`);
|
|
});
|
|
const desktopConfig = runModule(desktopConfigSource, (specifier) => {
|
|
if (specifier === '@electron/common/PlainRecord') return plainRecord;
|
|
if (specifier === '@fluxer/record_utils/src/RecordGuards') return recordGuards;
|
|
if (specifier === 'node:fs') return fs;
|
|
if (specifier === '@electron/common/GlobalShortcutActions') return globalShortcutActions;
|
|
if (specifier === 'node:path') return path;
|
|
if (specifier === '@electron/common/BuildChannel') return {BUILD_CHANNEL: channel};
|
|
if (specifier === '@electron/common/Constants') return constants;
|
|
if (specifier === '@fluxer/instance_bootstrap/src/EndpointNormalization') {
|
|
return {InstanceEndpointKind: {API: 'api'}, normalizeInstanceEndpoint: () => null};
|
|
}
|
|
if (specifier === 'electron-log') return silentLog;
|
|
throw new Error(`Unexpected import: ${specifier}`);
|
|
});
|
|
desktopConfig.loadDesktopConfig(userDataPath);
|
|
return desktopConfig;
|
|
}
|
|
|
|
describe('DesktopConfig legacy app origin', () => {
|
|
test('harvests the legacy web app origin when no app origin is stored', () => {
|
|
assert.equal(loadDesktop().getLegacyAppOrigin(), 'https://web.fluxer.app');
|
|
assert.equal(loadDesktop({channel: 'canary'}).getLegacyAppOrigin(), 'https://web.canary.fluxer.app');
|
|
});
|
|
|
|
test('harvests the migrated origin an older build stored', () => {
|
|
const stable = loadDesktop({settings: {app_origin: 'https://fluxer.com'}});
|
|
const canary = loadDesktop({channel: 'canary', settings: {app_origin: 'https://canary.fluxer.com'}});
|
|
|
|
assert.equal(stable.getLegacyAppOrigin(), 'https://fluxer.com');
|
|
assert.equal(canary.getLegacyAppOrigin(), 'https://canary.fluxer.com');
|
|
});
|
|
|
|
test('harvests the legacy web app origin for a stored legacy origin', () => {
|
|
const desktopConfig = loadDesktop({settings: {app_origin: 'https://web.fluxer.app'}});
|
|
|
|
assert.equal(desktopConfig.getLegacyAppOrigin(), 'https://web.fluxer.app');
|
|
});
|
|
|
|
test('drops stored origins outside the channel allowlist', () => {
|
|
for (const appOrigin of [
|
|
'https://canary.fluxer.com',
|
|
'https://fluxer.com/',
|
|
'https://evil.example',
|
|
'http://fluxer.com',
|
|
42,
|
|
]) {
|
|
const desktopConfig = loadDesktop({settings: {app_origin: appOrigin}});
|
|
assert.equal(desktopConfig.getLegacyAppOrigin(), 'https://web.fluxer.app');
|
|
}
|
|
});
|
|
});
|