Compare commits

...

5 Commits

Author SHA1 Message Date
xli-oai
17c9fdea9d Route valid remote plugin uninstall IDs directly 2026-05-01 19:51:08 -07:00
xli-oai
09f8c77edc Use shared remote plugin ID validation in uninstall 2026-05-01 19:44:47 -07:00
xli-oai
af772c1c5a Remove remote plugin prefix regression test cleanup 2026-05-01 19:40:37 -07:00
xli-oai
b346468398 Validate remote plugin ID before uninstall dispatch 2026-05-01 19:37:18 -07:00
xli-oai
5d9d97c3dd Remove remote plugin uninstall prefix gate 2026-05-01 19:31:36 -07:00
2 changed files with 7 additions and 18 deletions

View File

@@ -774,13 +774,11 @@ impl CodexMessageProcessor {
) -> Result<PluginUninstallResponse, JSONRPCErrorError> {
let PluginUninstallParams { plugin_id } = params;
if codex_plugin::PluginId::parse(&plugin_id).is_err()
&& !is_valid_remote_uninstall_plugin_id(&plugin_id)
&& !is_valid_remote_plugin_id(&plugin_id)
{
return Err(invalid_request(
"invalid plugin id: expected a local plugin id in the form `plugin@marketplace` or a remote plugin id starting with `plugins~`, `plugins_`, `app_`, `asdk_app_`, or `connector_`",
));
return Err(invalid_request("invalid remote plugin id"));
}
if is_valid_remote_uninstall_plugin_id(&plugin_id) {
if is_valid_remote_plugin_id(&plugin_id) {
return self.remote_plugin_uninstall_response(plugin_id).await;
}
let plugins_manager = self.thread_manager.plugins_manager();
@@ -907,15 +905,6 @@ impl CodexMessageProcessor {
}
}
fn is_valid_remote_uninstall_plugin_id(plugin_name: &str) -> bool {
is_valid_remote_plugin_id(plugin_name)
&& (plugin_name.starts_with("plugins~")
|| plugin_name.starts_with("plugins_")
|| plugin_name.starts_with("app_")
|| plugin_name.starts_with("asdk_app_")
|| plugin_name.starts_with("connector_"))
}
fn remote_marketplace_to_info(marketplace: RemoteMarketplace) -> PluginMarketplaceEntry {
PluginMarketplaceEntry {
name: marketplace.name,

View File

@@ -454,7 +454,7 @@ async fn plugin_uninstall_rejects_before_post_when_remote_detail_fetch_fails() -
}
#[tokio::test]
async fn plugin_uninstall_rejects_invalid_plugin_id_before_remote_path() -> Result<()> {
async fn plugin_uninstall_rejects_remote_plugin_id_with_spaces_before_network_call() -> Result<()> {
let codex_home = TempDir::new()?;
let server = MockServer::start().await;
write_remote_plugin_catalog_config(
@@ -477,7 +477,7 @@ async fn plugin_uninstall_rejects_invalid_plugin_id_before_remote_path() -> Resu
.await??;
assert_eq!(err.error.code, -32600);
assert!(err.error.message.contains("invalid plugin id"));
assert!(err.error.message.contains("invalid remote plugin id"));
wait_for_remote_plugin_request_count(
&server,
"POST",
@@ -512,7 +512,7 @@ async fn plugin_uninstall_rejects_invalid_remote_plugin_id_before_network_call()
.await??;
assert_eq!(err.error.code, -32600);
assert!(err.error.message.contains("invalid plugin id"));
assert!(err.error.message.contains("invalid remote plugin id"));
wait_for_remote_plugin_request_count(
&server,
"POST",
@@ -546,7 +546,7 @@ async fn plugin_uninstall_rejects_empty_remote_plugin_id() -> Result<()> {
.await??;
assert_eq!(err.error.code, -32600);
assert!(err.error.message.contains("invalid plugin id"));
assert!(err.error.message.contains("invalid remote plugin id"));
Ok(())
}