mirror of
https://gitlab.com/futo-org/fcast.git
synced 2025-07-22 07:57:00 +00:00
Added encryption.
This commit is contained in:
parent
b8bd78d90d
commit
9599c1931e
29 changed files with 1016 additions and 1069 deletions
|
@ -6,7 +6,11 @@ import { DiscoveryService } from './DiscoveryService';
|
|||
import { Updater } from './Updater';
|
||||
import { WebSocketListenerService } from './WebSocketListenerService';
|
||||
import * as os from 'os';
|
||||
import * as sodium from 'libsodium-wrappers';
|
||||
import { Opcode } from './FCastSession';
|
||||
import fs = require('fs');
|
||||
import forge = require('node-forge');
|
||||
import { TlsListenerService } from './TlsTcpListenerService';
|
||||
import { WebSocketSecureListenerService } from './WebSocketSecureListenerService';
|
||||
|
||||
export default class Main {
|
||||
static shouldOpenMainWindow = true;
|
||||
|
@ -15,8 +19,12 @@ export default class Main {
|
|||
static application: Electron.App;
|
||||
static tcpListenerService: TcpListenerService;
|
||||
static webSocketListenerService: WebSocketListenerService;
|
||||
static tlsListenerService: TlsListenerService;
|
||||
static webSocketSecureListenerService: WebSocketSecureListenerService;
|
||||
static discoveryService: DiscoveryService;
|
||||
static tray: Tray;
|
||||
static key: string = null;
|
||||
static cert: string = null;
|
||||
|
||||
private static createTray() {
|
||||
const icon = (process.platform === 'win32') ? path.join(__dirname, 'app.ico') : path.join(__dirname, 'app.png');
|
||||
|
@ -100,8 +108,10 @@ export default class Main {
|
|||
|
||||
Main.tcpListenerService = new TcpListenerService();
|
||||
Main.webSocketListenerService = new WebSocketListenerService();
|
||||
const listeners = [Main.tcpListenerService, Main.webSocketListenerService];
|
||||
Main.tlsListenerService = new TlsListenerService(Main.key, Main.cert);
|
||||
Main.webSocketSecureListenerService = new WebSocketSecureListenerService(Main.key, Main.cert);
|
||||
|
||||
const listeners = [Main.tcpListenerService, Main.webSocketListenerService, Main.tlsListenerService, Main.webSocketSecureListenerService];
|
||||
listeners.forEach(l => {
|
||||
l.emitter.on("play", (message) => {
|
||||
if (Main.playerWindow == null) {
|
||||
|
@ -142,15 +152,15 @@ export default class Main {
|
|||
l.start();
|
||||
|
||||
ipcMain.on('send-playback-error', (event: IpcMainEvent, value: PlaybackErrorMessage) => {
|
||||
l.sendPlaybackError(value);
|
||||
l.send(Opcode.PlaybackError, value);
|
||||
});
|
||||
|
||||
ipcMain.on('send-playback-update', (event: IpcMainEvent, value: PlaybackUpdateMessage) => {
|
||||
l.sendPlaybackUpdate(value);
|
||||
l.send(Opcode.PlaybackUpdate, value);
|
||||
});
|
||||
|
||||
ipcMain.on('send-volume-update', (event: IpcMainEvent, value: VolumeUpdateMessage) => {
|
||||
l.sendVolumeUpdate(value);
|
||||
l.send(Opcode.VolumeUpdate, value);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -196,12 +206,6 @@ export default class Main {
|
|||
}
|
||||
|
||||
static openMainWindow() {
|
||||
(async () => {
|
||||
console.log("waiting for sodium...");
|
||||
await sodium.ready;
|
||||
console.log("sodium ready");
|
||||
})();
|
||||
|
||||
if (Main.mainWindow) {
|
||||
Main.mainWindow.focus();
|
||||
return;
|
||||
|
@ -230,6 +234,50 @@ export default class Main {
|
|||
}
|
||||
|
||||
static main(app: Electron.App) {
|
||||
if (!fs.existsSync('./cert.pem') || !fs.existsSync('./key.pem')) {
|
||||
try {
|
||||
const keys = forge.pki.rsa.generateKeyPair(2048);
|
||||
|
||||
const cert = forge.pki.createCertificate();
|
||||
cert.publicKey = keys.publicKey;
|
||||
cert.validity.notBefore = new Date();
|
||||
cert.validity.notAfter = new Date(9999, 11, 31);
|
||||
cert.sign(keys.privateKey);
|
||||
|
||||
const pemCert = forge.pki.certificateToPem(cert);
|
||||
const pemKey = forge.pki.privateKeyToPem(keys.privateKey);
|
||||
fs.writeFileSync('./cert.pem', pemCert);
|
||||
fs.writeFileSync('./key.pem', pemKey);
|
||||
} catch {
|
||||
console.error("Failed to generate key pair.");
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Main.key = fs.readFileSync('./key.pem', 'utf8');
|
||||
Main.cert = fs.readFileSync('./cert.pem', 'utf8');
|
||||
} catch (e) {
|
||||
console.error("Failed to load key pair.", e);
|
||||
|
||||
dialog.showMessageBox({
|
||||
type: 'error',
|
||||
title: 'Failed to initialize crypto',
|
||||
message: `The application failed to start properly '${JSON.stringify(e)}'.`,
|
||||
buttons: ['Restart', 'Close'],
|
||||
defaultId: 0,
|
||||
cancelId: 1
|
||||
}).then((p) => {
|
||||
if (p.response === 0) {
|
||||
app.relaunch();
|
||||
app.exit(0);
|
||||
} else {
|
||||
app.exit(0);
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Main.application = app;
|
||||
const argv = process.argv;
|
||||
if (argv.includes('--no-main-window')) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue