From 087d15eeaac7c38cac6aa03f4429fe19319357ae Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 13 Apr 2019 17:19:55 -0600 Subject: [PATCH] Filter out bridges which aren't configured --- src/bridges/GitterBridge.ts | 2 +- src/bridges/IrcBridge.ts | 5 +++++ src/bridges/SlackBridge.ts | 2 +- src/bridges/TelegramBridge.ts | 2 +- src/bridges/WebhooksBridge.ts | 2 +- src/db/BridgeStore.ts | 31 ++++++++++++++++++++++++++++++- 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/bridges/GitterBridge.ts b/src/bridges/GitterBridge.ts index 1589d31..eb2fab8 100644 --- a/src/bridges/GitterBridge.ts +++ b/src/bridges/GitterBridge.ts @@ -31,7 +31,7 @@ export class GitterBridge { public async isBridgingEnabled(): Promise { const bridges = await GitterBridgeRecord.findAll({where: {isEnabled: true}}); - return !!bridges; + return !!bridges && bridges.length > 0; } public async getBridgeInfo(): Promise { diff --git a/src/bridges/IrcBridge.ts b/src/bridges/IrcBridge.ts index 40fdb52..b2e1933 100644 --- a/src/bridges/IrcBridge.ts +++ b/src/bridges/IrcBridge.ts @@ -48,6 +48,11 @@ export class IrcBridge { constructor(private requestingUserId: string) { } + public async isBridgingEnabled(): Promise { + const bridges = await IrcBridgeRecord.findAll({where: {isEnabled: true}}); + return !!bridges && bridges.length > 0; + } + public async hasNetworks(): Promise { const allNetworks = (await this.getAllNetworks()).filter(n => n.isEnabled); return allNetworks.length > 0; diff --git a/src/bridges/SlackBridge.ts b/src/bridges/SlackBridge.ts index 3306d93..303ed30 100644 --- a/src/bridges/SlackBridge.ts +++ b/src/bridges/SlackBridge.ts @@ -42,7 +42,7 @@ export class SlackBridge { public async isBridgingEnabled(): Promise { const bridges = await SlackBridgeRecord.findAll({where: {isEnabled: true}}); - return !!bridges; + return !!bridges && bridges.length > 0; } public async getBridgeInfo(): Promise { diff --git a/src/bridges/TelegramBridge.ts b/src/bridges/TelegramBridge.ts index b88a09c..4db065e 100644 --- a/src/bridges/TelegramBridge.ts +++ b/src/bridges/TelegramBridge.ts @@ -53,7 +53,7 @@ export class TelegramBridge { public async isBridgingEnabled(): Promise { const bridges = await TelegramBridgeRecord.findAll({where: {isEnabled: true}}); - return !!bridges; + return !!bridges && bridges.length > 0; } public async getBridgeInfo(): Promise { diff --git a/src/bridges/WebhooksBridge.ts b/src/bridges/WebhooksBridge.ts index 2450ed7..f8be37f 100644 --- a/src/bridges/WebhooksBridge.ts +++ b/src/bridges/WebhooksBridge.ts @@ -25,7 +25,7 @@ export class WebhooksBridge { public async isBridgingEnabled(): Promise { const bridges = await WebhookBridgeRecord.findAll({where: {isEnabled: true}}); - return !!bridges; + return !!bridges && bridges.length > 0; } public async getBridgeInfo(): Promise { diff --git a/src/db/BridgeStore.ts b/src/db/BridgeStore.ts index e58b3ff..0df38a0 100644 --- a/src/db/BridgeStore.ts +++ b/src/db/BridgeStore.ts @@ -12,6 +12,7 @@ import { TelegramBridge } from "../bridges/TelegramBridge"; import { WebhooksBridge } from "../bridges/WebhooksBridge"; import { GitterBridge } from "../bridges/GitterBridge"; import { SlackBridge } from "../bridges/SlackBridge"; +import { AdminService } from "../api/admin/AdminService"; export class BridgeStore { @@ -23,15 +24,20 @@ export class BridgeStore { const enabledBridges: Bridge[] = []; for (const bridgeRecord of allRecords) { + LogService.info("BridgeStore", "Checking bridge configuration: " + bridgeRecord.name); + let isLogicallyEnabled = await BridgeStore.hasBridgesConfigured(bridgeRecord, requestingUserId); try { if (isEnabled === true || isEnabled === false) { - const isLogicallyEnabled = await BridgeStore.isLogicallyEnabled(bridgeRecord, requestingUserId); + isLogicallyEnabled = await BridgeStore.isLogicallyEnabled(bridgeRecord, requestingUserId); if (isLogicallyEnabled !== isEnabled) continue; } const bridgeConfig = await BridgeStore.getConfiguration(bridgeRecord, requestingUserId, inRoomId); enabledBridges.push(new Bridge(bridgeRecord, bridgeConfig)); } catch (e) { + // Skip bridges which just aren't online + if (!isLogicallyEnabled) continue; + LogService.error("BridgeStore", "Failed to load configuration for bridge: " + bridgeRecord.name); LogService.error("BridgeStore", e); @@ -41,6 +47,10 @@ export class BridgeStore { } } + if (!AdminService.isAdmin(requestingUserId)) { + return enabledBridges.filter(b => b.isOnline); + } + return enabledBridges; } @@ -81,6 +91,25 @@ export class BridgeStore { } else return true; } + private static async hasBridgesConfigured(record: BridgeRecord, requestingUserId: string): Promise { + if (record.type === "irc") { + const irc = new IrcBridge(requestingUserId); + return irc.isBridgingEnabled(); + } else if (record.type === "telegram") { + const telegram = new TelegramBridge(requestingUserId); + return telegram.isBridgingEnabled(); + } else if (record.type === "webhooks") { + const webhooks = new WebhooksBridge(requestingUserId); + return webhooks.isBridgingEnabled(); + } else if (record.type === "gitter") { + const gitter = new GitterBridge(requestingUserId); + return gitter.isBridgingEnabled(); + } else if (record.type === "slack") { + const slack = new SlackBridge(requestingUserId); + return slack.isBridgingEnabled(); + } else return false; + } + private static async getConfiguration(record: BridgeRecord, requestingUserId: string, inRoomId?: string): Promise { if (record.type === "irc") { if (!inRoomId) return {}; // The bridge's admin config is handled by other APIs