fix: allow wildcard control commands

This commit is contained in:
Peter Steinberger
2026-01-05 02:05:23 +01:00
parent 00370139a5
commit 359cb66e68
4 changed files with 48 additions and 53 deletions

View File

@@ -502,7 +502,7 @@ describe("trigger handling", () => {
});
});
it("ignores /activation from non-owners in groups", async () => {
it("allows /activation from allowFrom in groups", async () => {
await withTempHome(async (home) => {
const cfg = makeCfg(home);
const res = await getReplyFromConfig(
@@ -517,7 +517,8 @@ describe("trigger handling", () => {
{},
cfg,
);
expect(res).toBeUndefined();
const text = Array.isArray(res) ? res[0]?.text : res?.text;
expect(text).toBe("⚙️ Group activation set to mention.");
expect(runEmbeddedPiAgent).not.toHaveBeenCalled();
});
});

View File

@@ -63,16 +63,12 @@ export function buildCommandContext(params: {
: undefined;
const from = (ctx.From ?? "").replace(/^whatsapp:/, "");
const to = (ctx.To ?? "").replace(/^whatsapp:/, "");
const defaultAllowFrom =
isWhatsAppSurface &&
(!configuredAllowFrom || configuredAllowFrom.length === 0) &&
to
? [to]
: undefined;
const allowFrom =
configuredAllowFrom && configuredAllowFrom.length > 0
? configuredAllowFrom
: defaultAllowFrom;
const allowFromList =
configuredAllowFrom?.filter((entry) => entry && entry.trim()) ?? [];
const allowAll =
!isWhatsAppSurface ||
allowFromList.length === 0 ||
allowFromList.some((entry) => entry.trim() === "*");
const abortKey = sessionKey ?? (from || undefined) ?? (to || undefined);
const rawBodyNormalized = triggerBodyNormalized;
@@ -80,10 +76,11 @@ export function buildCommandContext(params: {
? stripMentions(rawBodyNormalized, ctx, cfg)
: rawBodyNormalized;
const senderE164 = normalizeE164(ctx.SenderE164 ?? "");
const ownerCandidates = isWhatsAppSurface
? (allowFrom ?? []).filter((entry) => entry && entry !== "*")
: [];
if (isWhatsAppSurface && ownerCandidates.length === 0 && to) {
const ownerCandidates =
isWhatsAppSurface && !allowAll
? allowFromList.filter((entry) => entry !== "*")
: [];
if (isWhatsAppSurface && !allowAll && ownerCandidates.length === 0 && to) {
ownerCandidates.push(to);
}
const ownerList = ownerCandidates
@@ -91,6 +88,7 @@ export function buildCommandContext(params: {
.filter((entry): entry is string => Boolean(entry));
const isOwner =
!isWhatsAppSurface ||
allowAll ||
ownerList.length === 0 ||
(senderE164 ? ownerList.includes(senderE164) : false);
const isAuthorizedSender = commandAuthorized && isOwner;