@@ -16,7 +16,7 @@ use anyhow::{Context, Result, bail};
1616use clap:: Parser ;
1717use notify:: { Event , EventKind , RecommendedWatcher , RecursiveMode , Watcher } ;
1818use serde:: Serialize ;
19- use std:: path:: { Path , PathBuf } ;
19+ use std:: path:: { Component , Path , PathBuf } ;
2020use std:: process:: { Command , Stdio } ;
2121use std:: sync:: mpsc;
2222use std:: time:: Duration ;
@@ -703,6 +703,22 @@ fn get_plugins_dir() -> PathBuf {
703703 . unwrap_or_else ( || PathBuf :: from ( ".cortex/plugins" ) )
704704}
705705
706+ fn installed_plugin_path ( plugins_dir : & Path , name : & str ) -> Result < PathBuf > {
707+ let mut components = Path :: new ( name) . components ( ) ;
708+ let is_single_component = matches ! ( components. next( ) , Some ( Component :: Normal ( _) ) )
709+ && components. next ( ) . is_none ( )
710+ && !name. chars ( ) . any ( |c| matches ! ( c, '/' | '\\' | '\0' ) ) ;
711+
712+ if name. is_empty ( ) || !is_single_component {
713+ bail ! (
714+ "Invalid plugin name '{}'. Use an installed plugin name, not a path." ,
715+ name
716+ ) ;
717+ }
718+
719+ Ok ( plugins_dir. join ( name) )
720+ }
721+
706722// =============================================================================
707723// Plugin Scaffolding Functions
708724// =============================================================================
@@ -1145,7 +1161,7 @@ fn copy_dir_recursive(src: &std::path::Path, dst: &std::path::Path) -> Result<()
11451161
11461162async fn run_remove ( args : PluginRemoveArgs ) -> Result < ( ) > {
11471163 let plugins_dir = get_plugins_dir ( ) ;
1148- let plugin_path = plugins_dir . join ( & args. name ) ;
1164+ let plugin_path = installed_plugin_path ( & plugins_dir , & args. name ) ? ;
11491165
11501166 if !plugin_path. exists ( ) {
11511167 bail ! ( "Plugin '{}' is not installed." , args. name) ;
@@ -1171,7 +1187,7 @@ async fn run_remove(args: PluginRemoveArgs) -> Result<()> {
11711187
11721188async fn run_enable ( args : PluginEnableArgs ) -> Result < ( ) > {
11731189 let plugins_dir = get_plugins_dir ( ) ;
1174- let plugin_path = plugins_dir . join ( & args. name ) ;
1190+ let plugin_path = installed_plugin_path ( & plugins_dir , & args. name ) ? ;
11751191 let manifest_path = plugin_path. join ( "plugin.toml" ) ;
11761192
11771193 if !manifest_path. exists ( ) {
@@ -1192,7 +1208,7 @@ async fn run_enable(args: PluginEnableArgs) -> Result<()> {
11921208
11931209async fn run_disable ( args : PluginDisableArgs ) -> Result < ( ) > {
11941210 let plugins_dir = get_plugins_dir ( ) ;
1195- let plugin_path = plugins_dir . join ( & args. name ) ;
1211+ let plugin_path = installed_plugin_path ( & plugins_dir , & args. name ) ? ;
11961212 let manifest_path = plugin_path. join ( "plugin.toml" ) ;
11971213
11981214 if !manifest_path. exists ( ) {
@@ -1213,7 +1229,7 @@ async fn run_disable(args: PluginDisableArgs) -> Result<()> {
12131229
12141230async fn run_show ( args : PluginShowArgs ) -> Result < ( ) > {
12151231 let plugins_dir = get_plugins_dir ( ) ;
1216- let plugin_path = plugins_dir . join ( & args. name ) ;
1232+ let plugin_path = installed_plugin_path ( & plugins_dir , & args. name ) ? ;
12171233 let manifest_path = plugin_path. join ( "plugin.toml" ) ;
12181234
12191235 if !manifest_path. exists ( ) {
0 commit comments