From 7d8031e009fbf9d662fc375868f1811abe050f5a Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Tue, 28 Jul 2026 22:03:11 +0100 Subject: [PATCH] Route IPC through desktop notify and remove CLI OTP prompting. OTP authentication is now handled by the desktop UI instead of stdin prompts. Co-authored-by: Cursor --- src/documentprinter/documentprinterclient.js | 2 +- src/documentprinter/documentprintermanager.js | 2 +- src/files/filemanager.js | 2 +- src/localserver/localserver.js | 2 -- src/printer/database.js | 2 +- src/printer/printermanager.js | 2 +- src/socket/socketclient.js | 20 ++++------- src/utils.js | 33 ------------------- 8 files changed, 11 insertions(+), 54 deletions(-) diff --git a/src/documentprinter/documentprinterclient.js b/src/documentprinter/documentprinterclient.js index 040a863..2d92400 100644 --- a/src/documentprinter/documentprinterclient.js +++ b/src/documentprinter/documentprinterclient.js @@ -4,7 +4,7 @@ import log4js from "log4js"; import { startWaiting, stopWaiting } from "../spinner.js"; import CupsPrinterInterface from "./interfaces/cupsinterface.js"; import ReceiptInterface from "./interfaces/receiptinterface.js"; -import { sendIPC } from "../electron/ipc.js"; +import { sendIPC } from "../desktop/notify.js"; // Load configuration const config = loadConfig(); diff --git a/src/documentprinter/documentprintermanager.js b/src/documentprinter/documentprintermanager.js index 1b67a93..9418c62 100644 --- a/src/documentprinter/documentprintermanager.js +++ b/src/documentprinter/documentprintermanager.js @@ -1,6 +1,6 @@ import { loadConfig } from "../config.js"; import log4js from "log4js"; -import { sendIPC } from "../electron/ipc.js"; +import { sendIPC } from "../desktop/notify.js"; import { DocumentPrinterClient } from "./documentprinterclient.js"; import { startWaiting, stopWaiting } from "../spinner.js"; diff --git a/src/files/filemanager.js b/src/files/filemanager.js index d027632..26a2ec5 100644 --- a/src/files/filemanager.js +++ b/src/files/filemanager.js @@ -5,7 +5,7 @@ import axios from "axios"; import log4js from "log4js"; import _ from "lodash"; import { loadConfig, ensureDataDir } from "../config.js"; -import { sendIPC } from "../electron/ipc.js"; +import { sendIPC } from "../desktop/notify.js"; const config = loadConfig(); diff --git a/src/localserver/localserver.js b/src/localserver/localserver.js index a743e92..73ec8ed 100644 --- a/src/localserver/localserver.js +++ b/src/localserver/localserver.js @@ -1,6 +1,5 @@ import express from "express"; import log4js from "log4js"; -import { notPrompting } from "../utils.js"; import { getConfigPath, loadConfig } from "../config.js"; import { applyLogLevel } from "../logging.js"; import { getServerVersionInfo } from "../serverVersion.js"; @@ -49,7 +48,6 @@ export class LocalServer { startWaiting("Authenticating with OTP via local server...", logger); let result; try { - notPrompting(); result = await this.socketClient.authenticateWithOtp(otp, { retryOnFailure: false, logs: false, diff --git a/src/printer/database.js b/src/printer/database.js index b0a815d..d06f528 100644 --- a/src/printer/database.js +++ b/src/printer/database.js @@ -2,7 +2,7 @@ import { randomUUID } from "crypto"; import log4js from "log4js"; import NodeCache from "node-cache"; import { loadConfig } from "../config.js"; -import { sendIPC } from "../electron/ipc.js"; +import { sendIPC } from "../desktop/notify.js"; import chalk from "chalk"; import { formatState } from "../commandlineutils.js"; const config = loadConfig(); diff --git a/src/printer/printermanager.js b/src/printer/printermanager.js index 572ce38..fe5f962 100644 --- a/src/printer/printermanager.js +++ b/src/printer/printermanager.js @@ -2,7 +2,7 @@ import { PrinterClient } from "./printerclient.js"; import { loadConfig } from "../config.js"; import log4js from "log4js"; -import { sendIPC } from "../electron/ipc.js"; +import { sendIPC } from "../desktop/notify.js"; import { startWaiting, stopWaiting } from "../spinner.js"; // Load configuration const config = loadConfig(); diff --git a/src/socket/socketclient.js b/src/socket/socketclient.js index 34aa4d1..8a8ebe9 100644 --- a/src/socket/socketclient.js +++ b/src/socket/socketclient.js @@ -3,8 +3,8 @@ import { WebSocketScanner } from "../network/websocketScanner.js"; import { io } from "socket.io-client"; // Load configuration import { loadConfig, saveConfig } from "../config.js"; -import { askOtp, getDeviceInfo, notPrompting } from "../utils.js"; -import { sendIPC } from "../electron/ipc.js"; +import { getDeviceInfo } from "../utils.js"; +import { sendIPC } from "../desktop/notify.js"; import { PrinterManager } from "../printer/printermanager.js"; import { HostManager } from "../host/hostmanager.js"; import { FileManager } from "../files/filemanager.js"; @@ -152,11 +152,11 @@ export class SocketClient { }); } - async authenticateWithOtp(otp = undefined, options = {}) { - const { retryOnFailure = otp == undefined, logs = true } = options; + async authenticateWithOtp(otp, options = {}) { + const { retryOnFailure = false, logs = true } = options; - if (otp == undefined) { - otp = await askOtp(); + if (!otp) { + return { valid: false, error: "OTP is required" }; } await this.waitForConnection(); @@ -188,12 +188,6 @@ export class SocketClient { logger.error("Host not authenticated:", verifyResult.error); } - if (retryOnFailure) { - const retryResult = await this.authenticateWithOtp(); - resolve(retryResult); - return; - } - resolve({ valid: false, error: verifyResult.error }); return; } @@ -331,7 +325,6 @@ export class SocketClient { logger.info("An OTP code is required to setup this host."); this.authenticated = false; sendIPC("setAuthenticated", false); - this.authenticateWithOtp(); return; } this.authenticate({ id: config.host.id, authCode: config.host.authCode }); @@ -760,7 +753,6 @@ export class SocketClient { sendIPC("setConnected", false); this.authenticated = false; sendIPC("setAuthenticated", false); - notPrompting(); this.scheduleReconnect(); } } diff --git a/src/utils.js b/src/utils.js index 00aa272..c4f1a81 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,38 +1,5 @@ -import readline from "node:readline"; import os from "os"; -let isPrompting = false; // prevent multiple prompts at the same time - -export async function askOtp() { - console.log("ASKING OTP"); - if (isPrompting) return null; // prevent multiple prompts - isPrompting = true; - console.log("is not prompting"); - - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const question = (query) => - new Promise((resolve) => rl.question(query, resolve)); - - try { - console.log("-----------"); - const enteredOtp = await question("Enter OTP: "); - console.log("-----------"); - isPrompting = false; - rl.close(); - return enteredOtp.trim(); - } catch (error) { - console.log("Error"); - } -} - -export function notPrompting() { - isPrompting = false; -} - export function getDeviceInfo() { return { os: {