Skip to content

CLI 启动直读 process.env.OS_SMS_PROVIDER / OS_EMAIL_PROVIDER,完全绕过 settings 的 options 表 —— #5204 的闸门看不到这条路 #5713

Description

@os-zhuang

#5204(env 覆盖过 options 表)的实现中发现,记录下来交 triage。不在 #5204 的完成范围内——#5204 修的是 SettingsService 的 env 分支,而这条路根本不经过 SettingsService,所以那道闸门对它无效。

事实

packages/cli/src/commands/serve.ts 在装配 capability plugin 时直接读 process.env,把 provider 名字原样塞进插件构造参数:

  • :2346

    const provider = (process.env.OS_SMS_PROVIDER || cfgSms.provider || 'log').toLowerCase();
    
  • :3121(resolveEmailCapabilityArg)

    const provider = String(env.OS_EMAIL_PROVIDER || cfgEmail.provider || 'log').toLowerCase();
    

两处都没有拿 provider 去比对任何 options 表。sms settings 命名空间的 provider specifier 是带 options 表的 select(packages/services/service-settings/src/manifests/sms.manifest.ts:24),mail 同理(mail.manifest.ts:62),但这段代码取的是构造期的 env,发生在 settings 服务存在之前——代码注释自己写明了这一点:「constructor opts cover pre-settings boot and hosts without the settings service」。

所以 OS_SMS_PROVIDER=twilo(拼错的 twilio)在启动时不会被任何枚举拦住。#5204 关掉的是 SettingsService.get() 那扇门;这是另一扇。

为什么算一类问题

这与 #5204 是同一个形状(declared ≠ enforced:一个声明了合法值集的配置项,存在一条从 env 到消费方、不经过该值集的路径),只是发生在更早的生命周期阶段,因此不能用同一个修法。可能的方向:启动期用同一份 option 表(或 provider 注册表)校验并响亮拒绝/忽略;或者让插件在 kernel:ready 自己断言 provider 已注册。

未核实的部分(诚实标注)

我没有追下去看 SmsServicePlugin / 邮件插件拿到一个未知 provider 之后会怎样——是响亮失败、还是静默落回 log、还是拼进某个 URL。这决定了本条的严重度,但追查它属于 #5204 之外的范围扩张,所以停在这里。如果插件本身已经响亮拒绝未知 provider,那本条降为「消息质量」问题;如果它静默降级,那就是 #5204 的同级缺陷。

相关

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions