68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { formatAllowlistMatchMeta } from "openclaw/plugin-sdk/channel-runtime";
|
|
import { issuePairingChallenge } from "openclaw/plugin-sdk/conversation-runtime";
|
|
import { upsertChannelPairingRequest } from "openclaw/plugin-sdk/conversation-runtime";
|
|
import { resolveSlackAllowListMatch } from "./allow-list.js";
|
|
import type { SlackMonitorContext } from "./context.js";
|
|
|
|
export async function authorizeSlackDirectMessage(params: {
|
|
ctx: SlackMonitorContext;
|
|
accountId: string;
|
|
senderId: string;
|
|
allowFromLower: string[];
|
|
resolveSenderName: (senderId: string) => Promise<{ name?: string }>;
|
|
sendPairingReply: (text: string) => Promise<void>;
|
|
onDisabled: () => Promise<void> | void;
|
|
onUnauthorized: (params: { allowMatchMeta: string; senderName?: string }) => Promise<void> | void;
|
|
log: (message: string) => void;
|
|
}): Promise<boolean> {
|
|
if (!params.ctx.dmEnabled || params.ctx.dmPolicy === "disabled") {
|
|
await params.onDisabled();
|
|
return false;
|
|
}
|
|
if (params.ctx.dmPolicy === "open") {
|
|
return true;
|
|
}
|
|
|
|
const sender = await params.resolveSenderName(params.senderId);
|
|
const senderName = sender?.name ?? undefined;
|
|
const allowMatch = resolveSlackAllowListMatch({
|
|
allowList: params.allowFromLower,
|
|
id: params.senderId,
|
|
name: senderName,
|
|
allowNameMatching: params.ctx.allowNameMatching,
|
|
});
|
|
const allowMatchMeta = formatAllowlistMatchMeta(allowMatch);
|
|
if (allowMatch.allowed) {
|
|
return true;
|
|
}
|
|
|
|
if (params.ctx.dmPolicy === "pairing") {
|
|
await issuePairingChallenge({
|
|
channel: "slack",
|
|
senderId: params.senderId,
|
|
senderIdLine: `Your Slack user id: ${params.senderId}`,
|
|
meta: { name: senderName },
|
|
upsertPairingRequest: async ({ id, meta }) =>
|
|
await upsertChannelPairingRequest({
|
|
channel: "slack",
|
|
id,
|
|
accountId: params.accountId,
|
|
meta,
|
|
}),
|
|
sendPairingReply: params.sendPairingReply,
|
|
onCreated: () => {
|
|
params.log(
|
|
`slack pairing request sender=${params.senderId} name=${senderName ?? "unknown"} (${allowMatchMeta})`,
|
|
);
|
|
},
|
|
onReplyError: (err) => {
|
|
params.log(`slack pairing reply failed for ${params.senderId}: ${String(err)}`);
|
|
},
|
|
});
|
|
return false;
|
|
}
|
|
|
|
await params.onUnauthorized({ allowMatchMeta, senderName });
|
|
return false;
|
|
}
|