



















@@ -32,7 +32,7 @@ import { isSlackExecApprovalClientEnabled } from "../exec-approvals.js";
3232import { normalizeSlackWebhookPath, registerSlackHttpHandler } from "../http/index.js";
3333import { SLACK_TEXT_LIMIT } from "../limits.js";
3434import { resolveSlackChannelAllowlist } from "../resolve-channels.js";
35-import { resolveSlackUserAllowlist } from "../resolve-users.js";
35+import { resolveSlackUserAllowlist, type SlackUserResolution } from "../resolve-users.js";
3636import { resolveSlackAppToken, resolveSlackBotToken } from "../token.js";
3737import { normalizeAllowList } from "./allow-list.js";
3838import { resolveSlackSlashCommandConfig } from "./commands.js";
@@ -85,6 +85,33 @@ async function getSlackBoltInterop(): Promise<SlackBoltResolvedExports> {
8585const SLACK_WEBHOOK_MAX_BODY_BYTES = 1024 * 1024;
8686const SLACK_WEBHOOK_BODY_TIMEOUT_MS = 30_000;
878788+function resolveStableSlackUserIdEntry(raw: string): string | undefined {
89+const trimmed = raw.trim();
90+if (!trimmed) {
91+return undefined;
92+}
93+const mention = /^<@([A-Z][A-Z0-9]+)>$/i.exec(trimmed);
94+if (mention) {
95+return mention[1]?.toUpperCase();
96+}
97+const prefixed = /^(?:slack:|user:)([A-Z][A-Z0-9]+)$/i.exec(trimmed);
98+if (prefixed) {
99+return prefixed[1]?.toUpperCase();
100+}
101+return /^[UW][A-Z0-9]+$/i.test(trimmed) ? trimmed.toUpperCase() : undefined;
102+}
103+104+function resolveStableSlackUserAllowlistEntries(entries: string[]): SlackUserResolution[] {
105+const resolved: SlackUserResolution[] = [];
106+for (const input of entries) {
107+const id = resolveStableSlackUserIdEntry(input);
108+if (id) {
109+resolved.push({ input, resolved: true, id });
110+}
111+}
112+return resolved;
113+}
114+88115export function formatSlackSocketReconnectMessage(params: {
89116event: string;
90117attempt: number;
@@ -209,6 +236,7 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
209236const threadInheritParent = slackCfg.thread?.inheritParent ?? false;
210237const threadRequireExplicitMention = slackCfg.thread?.requireExplicitMention ?? false;
211238const slashCommand = resolveSlackSlashCommandConfig(opts.slashCommand ?? slackCfg.slashCommand);
239+const allowNameMatching = isDangerousNameMatchingEnabled(slackCfg);
212240const textLimit = resolveTextChunkLimit(cfg, "slack", account.accountId, {
213241fallbackLimit: SLACK_TEXT_LIMIT,
214242});
@@ -301,7 +329,7 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
301329 dmEnabled,
302330 dmPolicy,
303331 allowFrom,
304-allowNameMatching: isDangerousNameMatchingEnabled(slackCfg),
332+ allowNameMatching,
305333 groupDmEnabled,
306334 groupDmChannels,
307335defaultRequireMention: slackCfg.requireMention,
@@ -404,57 +432,87 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
404432405433const allowEntries = normalizeStringEntries(allowFrom).filter((entry) => entry !== "*");
406434if (allowEntries.length > 0) {
407-try {
408- const resolvedUsers = await resolveSlackUserAllowlist({
409- token: resolveToken,
410-entries: allowEntries,
435+const stableResolvedUsers = resolveStableSlackUserAllowlistEntries(allowEntries);
436+if (stableResolvedUsers.length > 0) {
437+const { mapping, additions } = buildAllowlistResolutionSummary(stableResolvedUsers, {
438+formatResolved: formatSlackUserResolved,
411439});
412-const { mapping, unresolved, additions } = buildAllowlistResolutionSummary(
413-resolvedUsers,
414-{
415-formatResolved: formatSlackUserResolved,
416-},
417-);
418440allowFrom = mergeAllowlist({ existing: allowFrom, additions });
419441ctx.allowFrom = normalizeAllowList(allowFrom);
420-summarizeMapping("slack users", mapping, unresolved, runtime);
421-} catch (err) {
422-runtime.log?.(
423-`slack user resolve failed; using config entries. ${formatUnknownError(err)}`,
424-);
425-}
426-}
427-428-if (channelsConfig && Object.keys(channelsConfig).length > 0) {
429-const userEntries = new Set<string>();
430-for (const channel of Object.values(channelsConfig)) {
431-addAllowlistUserEntriesFromConfigEntry(userEntries, channel);
442+summarizeMapping("slack users", mapping, [], runtime);
432443}
433444434-if (userEntries.size > 0) {
445+if (allowNameMatching) {
435446try {
436447const resolvedUsers = await resolveSlackUserAllowlist({
437448token: resolveToken,
438-entries: Array.from(userEntries),
449+entries: allowEntries,
439450});
440-const { resolvedMap, mapping, unresolved } = buildAllowlistResolutionSummary(
451+const { mapping, unresolved, additions } = buildAllowlistResolutionSummary(
441452resolvedUsers,
442453{
443454formatResolved: formatSlackUserResolved,
444455},
445456);
457+allowFrom = mergeAllowlist({ existing: allowFrom, additions });
458+ctx.allowFrom = normalizeAllowList(allowFrom);
459+summarizeMapping("slack users", mapping, unresolved, runtime);
460+} catch (err) {
461+runtime.log?.(
462+`slack user resolve failed; using config entries. ${formatUnknownError(err)}`,
463+);
464+}
465+}
466+}
446467468+if (channelsConfig && Object.keys(channelsConfig).length > 0) {
469+const userEntries = new Set<string>();
470+for (const channel of Object.values(channelsConfig)) {
471+addAllowlistUserEntriesFromConfigEntry(userEntries, channel);
472+}
473+474+if (userEntries.size > 0) {
475+const stableResolvedUsers = resolveStableSlackUserAllowlistEntries(
476+Array.from(userEntries),
477+);
478+if (stableResolvedUsers.length > 0) {
479+const { resolvedMap, mapping } = buildAllowlistResolutionSummary(stableResolvedUsers, {
480+formatResolved: formatSlackUserResolved,
481+});
447482const nextChannels = patchAllowlistUsersInConfigEntries({
448483entries: channelsConfig,
449484 resolvedMap,
450485});
451486channelsConfig = nextChannels;
452487ctx.channelsConfig = nextChannels;
453-summarizeMapping("slack channel users", mapping, unresolved, runtime);
454-} catch (err) {
455-runtime.log?.(
456-`slack channel user resolve failed; using config entries. ${formatUnknownError(err)}`,
457-);
488+summarizeMapping("slack channel users", mapping, [], runtime);
489+}
490+491+if (allowNameMatching) {
492+try {
493+const resolvedUsers = await resolveSlackUserAllowlist({
494+token: resolveToken,
495+entries: Array.from(userEntries),
496+});
497+const { resolvedMap, mapping, unresolved } = buildAllowlistResolutionSummary(
498+resolvedUsers,
499+{
500+formatResolved: formatSlackUserResolved,
501+},
502+);
503+504+const nextChannels = patchAllowlistUsersInConfigEntries({
505+entries: channelsConfig,
506+ resolvedMap,
507+});
508+channelsConfig = nextChannels;
509+ctx.channelsConfig = nextChannels;
510+summarizeMapping("slack channel users", mapping, unresolved, runtime);
511+} catch (err) {
512+runtime.log?.(
513+`slack channel user resolve failed; using config entries. ${formatUnknownError(err)}`,
514+);
515+}
458516}
459517}
460518}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。