diff options
Diffstat (limited to 'zellij-server/src/plugins/zellij_exports.rs')
-rw-r--r-- | zellij-server/src/plugins/zellij_exports.rs | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/zellij-server/src/plugins/zellij_exports.rs b/zellij-server/src/plugins/zellij_exports.rs index 8791e128e..e6787c240 100644 --- a/zellij-server/src/plugins/zellij_exports.rs +++ b/zellij-server/src/plugins/zellij_exports.rs @@ -18,10 +18,14 @@ use std::{ use wasmer::{imports, AsStoreMut, Function, FunctionEnv, FunctionEnvMut, Imports}; use wasmer_wasi::WasiEnv; use zellij_utils::data::{ - CommandType, ConnectToSession, HttpVerb, MessageToPlugin, PermissionStatus, PermissionType, - PluginPermission, + CommandType, ConnectToSession, HttpVerb, LayoutInfo, MessageToPlugin, PermissionStatus, + PermissionType, PluginPermission, }; use zellij_utils::input::permission::PermissionCache; +use zellij_utils::{ + interprocess::local_socket::LocalSocketStream, + ipc::{ClientToServerMsg, IpcSenderWithContext}, +}; use url::Url; @@ -225,6 +229,7 @@ fn host_run_plugin_command(env: FunctionEnvMut<ForeignFunctionEnv>) { connect_to_session.name, connect_to_session.tab_position, connect_to_session.pane_id, + connect_to_session.layout, )?, PluginCommand::DeleteDeadSession(session_name) => { delete_dead_session(session_name)? @@ -252,6 +257,8 @@ fn host_run_plugin_command(env: FunctionEnvMut<ForeignFunctionEnv>) { cli_pipe_output(env, pipe_name, output)? }, PluginCommand::MessageToPlugin(message) => message_to_plugin(env, message)?, + PluginCommand::DisconnectOtherClients => disconnect_other_clients(env), + PluginCommand::KillSessions(session_list) => kill_sessions(session_list), }, (PermissionStatus::Denied, permission) => { log::error!( @@ -900,6 +907,7 @@ fn switch_session( session_name: Option<String>, tab_position: Option<usize>, pane_id: Option<(u32, bool)>, + layout: Option<LayoutInfo>, ) -> Result<()> { // pane_id is (id, is_plugin) let err_context = || format!("Failed to switch session"); @@ -909,6 +917,7 @@ fn switch_session( name: session_name, tab_position, pane_id, + layout, }; env.plugin_env .senders @@ -1278,6 +1287,30 @@ fn rename_session(env: &ForeignFunctionEnv, new_session_name: String) { apply_action!(action, error_msg, env); } +fn disconnect_other_clients(env: &ForeignFunctionEnv) { + let _ = env + .plugin_env + .senders + .send_to_server(ServerInstruction::DisconnectAllClientsExcept( + env.plugin_env.client_id, + )) + .context("failed to send disconnect other clients instruction"); +} + +fn kill_sessions(session_names: Vec<String>) { + for session_name in session_names { + let path = &*ZELLIJ_SOCK_DIR.join(&session_name); + match LocalSocketStream::connect(path) { + Ok(stream) => { + let _ = IpcSenderWithContext::new(stream).send(ClientToServerMsg::KillSession); + }, + Err(e) => { + log::error!("Failed to kill session {}: {:?}", session_name, e); + }, + }; + } +} + // Custom panic handler for plugins. // // This is called when a panic occurs in a plugin. Since most panics will likely originate in the @@ -1406,7 +1439,9 @@ fn check_command_permission( | PluginCommand::DeleteDeadSession(..) | PluginCommand::DeleteAllDeadSessions | PluginCommand::RenameSession(..) - | PluginCommand::RenameTab(..) => PermissionType::ChangeApplicationState, + | PluginCommand::RenameTab(..) + | PluginCommand::DisconnectOtherClients + | PluginCommand::KillSessions(..) => PermissionType::ChangeApplicationState, PluginCommand::UnblockCliPipeInput(..) | PluginCommand::BlockCliPipeInput(..) | PluginCommand::CliPipeOutput(..) => PermissionType::ReadCliPipes, |