Add basic daemon connection authentication

This commit is contained in:
hensm
2022-08-13 01:45:21 +01:00
parent e7788c1b17
commit 9f719132bf
9 changed files with 294 additions and 124 deletions

View File

@@ -44,6 +44,7 @@ export interface BridgeInfo {
export class BridgeConnectionError extends Error {}
export class BridgeTimedOutError extends Error {}
export class BridgeAuthenticationError extends Error {}
/**
* Creates a temporary bridge to query the version info,
@@ -73,10 +74,14 @@ const getInfo = () =>
{ subject: "bridge:/getInfo", data: version }
);
} catch (err) {
logger.error("Bridge connection failed.");
reject(new BridgeConnectionError());
clearTimeout(bridgeTimeoutId);
if (err === 401) {
reject(new BridgeAuthenticationError());
} else {
logger.error("Bridge connection failed.");
reject(new BridgeConnectionError());
}
clearTimeout(bridgeTimeoutId);
return;
}

View File

@@ -97,8 +97,12 @@ function connectNative(application: string): Port {
};
port.onDisconnect.addListener(async () => {
const { bridgeBackupEnabled, bridgeBackupHost, bridgeBackupPort } =
await options.getAll();
const {
bridgeBackupEnabled,
bridgeBackupHost,
bridgeBackupPort,
bridgeBackupPassword
} = await options.getAll();
if (!bridgeBackupEnabled) {
portObject.error = {
@@ -117,9 +121,12 @@ function connectNative(application: string): Port {
if (port.error && !isNativeHostStatusKnown) {
isNativeHostStatusKnown = true;
socket = new WebSocket(
`ws://${bridgeBackupHost}:${bridgeBackupPort}`
);
const url = new URL(`ws://${bridgeBackupHost}:${bridgeBackupPort}`);
if (bridgeBackupPassword) {
url.searchParams.append("password", bridgeBackupPassword);
}
socket = new WebSocket(url.href);
socket.addEventListener("open", () => {
// Send all messages in queue
@@ -167,8 +174,12 @@ async function sendNativeMessage(application: string, message: Message) {
try {
return await browser.runtime.sendNativeMessage(application, message);
} catch {
const { bridgeBackupEnabled, bridgeBackupHost, bridgeBackupPort } =
await options.getAll();
const {
bridgeBackupEnabled,
bridgeBackupHost,
bridgeBackupPort,
bridgeBackupPassword
} = await options.getAll();
if (!bridgeBackupEnabled) {
throw logger.error(
@@ -176,11 +187,25 @@ async function sendNativeMessage(application: string, message: Message) {
);
}
return await new Promise((resolve, reject) => {
const ws = new WebSocket(
`ws://${bridgeBackupHost}:${bridgeBackupPort}`
const url = new URL(`http://${bridgeBackupHost}:${bridgeBackupPort}`);
if (bridgeBackupPassword) {
url.searchParams.append("password", bridgeBackupPassword);
}
const res = await fetch(url.href);
if (res.status === 401) {
logger.error(
"Bridge daemon connection failed due to authentication error."
);
throw 401;
}
url.protocol = "ws";
return await new Promise((resolve, reject) => {
const ws = new WebSocket(url.href);
ws.addEventListener("open", () => {
ws.send(JSON.stringify(message));
});
@@ -191,7 +216,7 @@ async function sendNativeMessage(application: string, message: Message) {
});
ws.addEventListener("error", () => {
logger.error("No bridge application found.");
logger.error("Bridge daemon connection error.");
reject();
});
});