mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
## Summary This is the first step in making plugin auth routing consistent. The rule should not live as one-off checks in every place that loads or displays plugin capabilities. This PR introduces a small resolver for the auth-level policy: given a plugin's declared apps, MCP servers, current auth mode, and active state, return the capabilities that are actually usable in that context. ## Why Product rule: - SiWC auth can use app connectors, so app declarations stay available. - API-key/direct auth cannot use app connectors, so app declarations are removed. - When an active plugin has both an app and an MCP server with the same name, the app route wins for Codex-backed auth and the conflicting MCP server is hidden. Putting that rule in `capabilities.rs` gives the rest of the stack one place to ask instead of duplicating auth checks in loader, manager, marketplace, and details code. ## Validation - `cargo fmt` - `cargo test -p codex-core-plugins`
33 lines
878 B
Rust
33 lines
878 B
Rust
use codex_app_server_protocol::AuthMode;
|
|
use codex_plugin::AppDeclaration;
|
|
use std::collections::HashMap;
|
|
use std::collections::HashSet;
|
|
|
|
pub fn apps_route_available(auth_mode: Option<AuthMode>) -> bool {
|
|
auth_mode.is_some_and(AuthMode::uses_codex_backend)
|
|
}
|
|
|
|
pub(crate) fn apply_app_mcp_routing_policy<M>(
|
|
apps: &mut Vec<AppDeclaration>,
|
|
mcp_servers: &mut HashMap<String, M>,
|
|
auth_mode: Option<AuthMode>,
|
|
plugin_active: bool,
|
|
) {
|
|
if !apps_route_available(auth_mode) {
|
|
apps.clear();
|
|
return;
|
|
}
|
|
|
|
if plugin_active && !apps.is_empty() {
|
|
let app_declaration_names = apps
|
|
.iter()
|
|
.map(|app| app.name.as_str())
|
|
.collect::<HashSet<_>>();
|
|
mcp_servers.retain(|name, _| !app_declaration_names.contains(name.as_str()));
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "app_mcp_routing_tests.rs"]
|
|
mod tests;
|