diff --git a/cmd/olliesrv/internal/session/session.go b/cmd/olliesrv/internal/session/session.go index 01919f5..0e9c666 100644 --- a/cmd/olliesrv/internal/session/session.go +++ b/cmd/olliesrv/internal/session/session.go @@ -260,8 +260,9 @@ func (s *Session) SetBypassPending(req *protocol.BypassRequest, dialFn func() *t s.bypassSignalCh = make(chan struct{}) s.bypassMu.Unlock() - // Publish event for GUI listeners - PublishEvent("session."+s.ID+".bypass.request", req.ID+"\t"+req.Cmd+"\t"+req.Cwd) + // Publish event for GUI listeners (escape newlines in cmd for single-line event format) + cmd := strings.ReplaceAll(req.Cmd, "\n", "\\n") + PublishEvent("session."+s.ID+".bypass.request", req.ID+"\t"+cmd+"\t"+req.Cwd) } // BypassPending returns the current pending bypass request, or nil if none. diff --git a/kde/gui/ollie9pclient.cpp b/kde/gui/ollie9pclient.cpp index 8df7619..21fd9ca 100644 --- a/kde/gui/ollie9pclient.cpp +++ b/kde/gui/ollie9pclient.cpp @@ -239,7 +239,7 @@ void Ollie9pClient::handleEvent(const QString &eventLine) rest == QLatin1String("rename")) { refreshSessions(); } else if (rest.startsWith(QLatin1String("bypass."))) { - // Bypass event: payload is "id\tcmd\tcwd" + // Bypass event: payload is "id\tcmd\tcwd" (cmd has \n escaped as \\n) if (payload.isEmpty()) return; const int tab1 = payload.indexOf(QLatin1Char('\t')); if (tab1 < 0) return; @@ -247,7 +247,8 @@ void Ollie9pClient::handleEvent(const QString &eventLine) if (tab2 < 0) return; const QString id = payload.left(tab1).toString(); - const QString cmd = payload.mid(tab1 + 1, tab2 - tab1 - 1).toString(); + QString cmd = payload.mid(tab1 + 1, tab2 - tab1 - 1).toString(); + cmd.replace(QLatin1String("\\n"), QLatin1String("\n")); // unescape newlines const QString cwd = payload.mid(tab2 + 1).toString(); emit bypassRequested(sessionId.toString(), id, cmd, cwd); }