fix bypass event payload truncation at newlines

The shell command in bypass requests contains embedded newlines.
Escape them as \n in the event payload, unescape in GUI.
This commit is contained in:
Levi Neely 2026-10-06 14:28:10 +02:00
parent ceec28c2b9
commit 59d07d3b4a
2 changed files with 6 additions and 4 deletions

View File

@ -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.

View File

@ -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);
}