diff options
author | Jae-Heon Ji <32578710+jaeheonji@users.noreply.github.com> | 2023-08-12 22:35:42 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-12 15:35:42 +0200 |
commit | c8ddb23297e2f4fc900b8286d57e2808ae6a4fdb (patch) | |
tree | c96d26c8bfc24172374aefe88624b78c6890663f /zellij-utils/src/plugin_api | |
parent | a1903b6b048f8257fc16ffd09e19c825248cb9d6 (diff) |
feat: add plugin permission system (#2624)
* WIP: add exaple of permission ui
* feat: add request permission ui
* feat: add caching permission in memory
* feat: add permission check
* feat: add file caching
* fix: changes request
* feat(ui): new status bar mode (#2619)
* supermode prototype
* fix integration tests
* fix tests
* style(fmt): rustfmt
* docs(changelog): status-bar supermode
* fix(rendering): occasional glitches while resizing (#2621)
* docs(changelog): resize glitches fix
* chore(version): bump development version
* Fix colored pane frames in mirrored sessions (#2625)
* server/panes/tiled: Fix colored frames
in mirrored sessions. Colored frames were previously ignored because
they were treated like floating panes when rendering tiled panes.
* CHANGELOG: Add PR #2625
* server/tab/unit: Fix unit tests for server.
* fix(sessions): use custom lists of adjectives and nouns for generating session names (#2122)
* Create custom lists of adjectives and nouns for generating session names
* move word lists to const slices
* add logic to retry name generation
* refactor
- reuse the name generator
- iterator instead of for loop
---------
Co-authored-by: Thomas Linford <linford.t@gmail.com>
* docs(changelog): generate session names with custom words list
* feat(plugins): make plugins configurable (#2646)
* work
* make every plugin entry point configurable
* make integration tests pass
* make e2e tests pass
* add test for plugin configuration
* add test snapshot
* add plugin config parsing test
* cleanups
* style(fmt): rustfmt
* style(comment): remove commented code
* docs(changelog): configurable plugins
* style(fmt): rustfmt
* touch up ui
* fix: don't save permission data in memory
* feat: load cached permission
* test: add example test (WIP)
* fix: issue event are always denied
* test: update snapshot
* apply formatting
* refactor: update default cache function
* test: add more new test
* apply formatting
* Revert "apply formatting"
This reverts commit a4e93703fbfdb6865131daa1c8b90fc5c36ab25e.
* apply format
* fix: update cache path
* apply format
* fix: cache path
* fix: update log level
* test for github workflow
* Revert "test for github workflow"
This reverts commit 01eff3bc5d1627a4e60bc6dac8ebe5500bc5b56e.
* refactor: permission cache
* fix(test): permission grant/deny race condition
* style(fmt): rustfmt
* style(fmt): rustfmt
* configure permissions
* permission denied test
* snapshot
* add ui for small plugins
* style(fmt): rustfmt
* some cleanups
---------
Co-authored-by: Aram Drevekenin <aram@poor.dev>
Co-authored-by: har7an <99636919+har7an@users.noreply.github.com>
Co-authored-by: Kyle Sutherland-Cash <kyle.sutherlandcash@gmail.com>
Co-authored-by: Thomas Linford <linford.t@gmail.com>
Co-authored-by: Thomas Linford <tlinford@users.noreply.github.com>
Diffstat (limited to 'zellij-utils/src/plugin_api')
-rw-r--r-- | zellij-utils/src/plugin_api/event.proto | 6 | ||||
-rw-r--r-- | zellij-utils/src/plugin_api/event.rs | 30 | ||||
-rw-r--r-- | zellij-utils/src/plugin_api/mod.rs | 1 | ||||
-rw-r--r-- | zellij-utils/src/plugin_api/plugin_command.proto | 7 | ||||
-rw-r--r-- | zellij-utils/src/plugin_api/plugin_command.rs | 34 | ||||
-rw-r--r-- | zellij-utils/src/plugin_api/plugin_permission.proto | 12 | ||||
-rw-r--r-- | zellij-utils/src/plugin_api/plugin_permission.rs | 44 |
7 files changed, 128 insertions, 6 deletions
diff --git a/zellij-utils/src/plugin_api/event.proto b/zellij-utils/src/plugin_api/event.proto index 95928ae3b..3a9838fa8 100644 --- a/zellij-utils/src/plugin_api/event.proto +++ b/zellij-utils/src/plugin_api/event.proto @@ -38,6 +38,7 @@ enum EventType { FileSystemUpdate = 13; /// A file was deleted somewhere in the Zellij CWD folder FileSystemDelete = 14; + PermissionRequestResult = 15; } message EventNameList { @@ -57,9 +58,14 @@ message Event { bool visible_payload = 9; CustomMessagePayload custom_message_payload = 10; FileListPayload file_list_payload = 11; + PermissionRequestResultPayload permission_request_result_payload = 12; } } +message PermissionRequestResultPayload { + bool granted = 1; +} + message FileListPayload { repeated string paths = 1; } diff --git a/zellij-utils/src/plugin_api/event.rs b/zellij-utils/src/plugin_api/event.rs index 315fa54b8..6115fe1e8 100644 --- a/zellij-utils/src/plugin_api/event.rs +++ b/zellij-utils/src/plugin_api/event.rs @@ -13,9 +13,10 @@ pub use super::generated_api::api::{ style::Style as ProtobufStyle, }; use crate::data::{ - CopyDestination, Direction, Event, EventType, InputMode, Key, ModeInfo, Mouse, Palette, - PaletteColor, PaneInfo, PaneManifest, PluginCapabilities, Style, TabInfo, ThemeHue, + CopyDestination, Event, EventType, InputMode, Key, ModeInfo, Mouse, PaneInfo, PaneManifest, + PermissionStatus, PluginCapabilities, Style, TabInfo, }; + use crate::errors::prelude::*; use crate::input::actions::Action; @@ -160,6 +161,16 @@ impl TryFrom<ProtobufEvent> for Event { }, _ => Err("Malformed payload for the file system delete Event"), }, + Some(ProtobufEventType::PermissionRequestResult) => match protobuf_event.payload { + Some(ProtobufEventPayload::PermissionRequestResultPayload(payload)) => { + if payload.granted { + Ok(Event::PermissionRequestResult(PermissionStatus::Granted)) + } else { + Ok(Event::PermissionRequestResult(PermissionStatus::Denied)) + } + }, + _ => Err("Malformed payload for the file system delete Event"), + }, None => Err("Unknown Protobuf Event"), } } @@ -290,6 +301,18 @@ impl TryFrom<Event> for ProtobufEvent { payload: Some(event::Payload::FileListPayload(file_list_payload)), }) }, + Event::PermissionRequestResult(permission_status) => { + let granted = match permission_status { + PermissionStatus::Granted => true, + PermissionStatus::Denied => false, + }; + Ok(ProtobufEvent { + name: ProtobufEventType::PermissionRequestResult as i32, + payload: Some(event::Payload::PermissionRequestResultPayload( + PermissionRequestResultPayload { granted }, + )), + }) + }, } } } @@ -673,6 +696,7 @@ impl TryFrom<ProtobufEventType> for EventType { ProtobufEventType::FileSystemRead => EventType::FileSystemRead, ProtobufEventType::FileSystemUpdate => EventType::FileSystemUpdate, ProtobufEventType::FileSystemDelete => EventType::FileSystemDelete, + ProtobufEventType::PermissionRequestResult => EventType::PermissionRequestResult, }) } } @@ -696,6 +720,7 @@ impl TryFrom<EventType> for ProtobufEventType { EventType::FileSystemRead => ProtobufEventType::FileSystemRead, EventType::FileSystemUpdate => ProtobufEventType::FileSystemUpdate, EventType::FileSystemDelete => ProtobufEventType::FileSystemDelete, + EventType::PermissionRequestResult => ProtobufEventType::PermissionRequestResult, }) } } @@ -717,6 +742,7 @@ fn serialize_mode_update_event() { #[test] fn serialize_mode_update_event_with_non_default_values() { + use crate::data::{Direction, Palette, PaletteColor, ThemeHue}; use prost::Message; let mode_update_event = Event::ModeUpdate(ModeInfo { mode: InputMode::Locked, diff --git a/zellij-utils/src/plugin_api/mod.rs b/zellij-utils/src/plugin_api/mod.rs index 55ace5007..4812d468c 100644 --- a/zellij-utils/src/plugin_api/mod.rs +++ b/zellij-utils/src/plugin_api/mod.rs @@ -7,6 +7,7 @@ pub mod key; pub mod message; pub mod plugin_command; pub mod plugin_ids; +pub mod plugin_permission; pub mod resize; pub mod style; pub mod generated_api { diff --git a/zellij-utils/src/plugin_api/plugin_command.proto b/zellij-utils/src/plugin_api/plugin_command.proto index f09ccf4b1..9ba8bb7f4 100644 --- a/zellij-utils/src/plugin_api/plugin_command.proto +++ b/zellij-utils/src/plugin_api/plugin_command.proto @@ -6,6 +6,7 @@ import "command.proto"; import "message.proto"; import "input_mode.proto"; import "resize.proto"; +import "plugin_permission.proto"; package api.plugin_command; @@ -76,6 +77,7 @@ enum CommandName { RenamePluginPane = 63; RenameTab = 64; ReportCrash = 65; + RequestPluginPermissions = 66; } message PluginCommand { @@ -117,9 +119,14 @@ message PluginCommand { IdAndNewName rename_plugin_pane_payload = 35; IdAndNewName rename_tab_payload = 36; string report_crash_payload = 37; + RequestPluginPermissionPayload request_plugin_permission_payload = 38; } } +message RequestPluginPermissionPayload { + repeated plugin_permission.PermissionType permissions = 1; +} + message SubscribePayload { event.EventNameList subscriptions = 1; } diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs index bf359dd20..ff50a6a76 100644 --- a/zellij-utils/src/plugin_api/plugin_command.rs +++ b/zellij-utils/src/plugin_api/plugin_command.rs @@ -3,14 +3,15 @@ pub use super::generated_api::api::{ plugin_command::{ plugin_command::Payload, CommandName, ExecCmdPayload, IdAndNewName, MovePayload, OpenCommandPanePayload, OpenFilePayload, PaneIdAndShouldFloat, - PluginCommand as ProtobufPluginCommand, PluginMessagePayload, ResizePayload, - SetTimeoutPayload, SubscribePayload, SwitchTabToPayload, SwitchToModePayload, - UnsubscribePayload, + PluginCommand as ProtobufPluginCommand, PluginMessagePayload, + RequestPluginPermissionPayload, ResizePayload, SetTimeoutPayload, SubscribePayload, + SwitchTabToPayload, SwitchToModePayload, UnsubscribePayload, }, + plugin_permission::PermissionType as ProtobufPermissionType, resize::ResizeAction as ProtobufResizeAction, }; -use crate::data::PluginCommand; +use crate::data::{PermissionType, PluginCommand}; use std::convert::TryFrom; @@ -486,6 +487,19 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand { }, _ => Err("Mismatched payload for ReportCrash"), }, + Some(CommandName::RequestPluginPermissions) => match protobuf_plugin_command.payload { + Some(Payload::RequestPluginPermissionPayload(payload)) => { + Ok(PluginCommand::RequestPluginPermissions( + payload + .permissions + .iter() + .filter_map(|p| ProtobufPermissionType::from_i32(*p)) + .filter_map(|p| PermissionType::try_from(p).ok()) + .collect(), + )) + }, + _ => Err("Mismatched payload for RequestPluginPermission"), + }, None => Err("Unrecognized plugin command"), } } @@ -820,6 +834,18 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand { name: CommandName::ReportCrash as i32, payload: Some(Payload::ReportCrashPayload(payload)), }), + PluginCommand::RequestPluginPermissions(permissions) => Ok(ProtobufPluginCommand { + name: CommandName::RequestPluginPermissions as i32, + payload: Some(Payload::RequestPluginPermissionPayload( + RequestPluginPermissionPayload { + permissions: permissions + .iter() + .filter_map(|p| ProtobufPermissionType::try_from(*p).ok()) + .map(|p| p as i32) + .collect(), + }, + )), + }), } } } diff --git a/zellij-utils/src/plugin_api/plugin_permission.proto b/zellij-utils/src/plugin_api/plugin_permission.proto new file mode 100644 index 000000000..50072b1bb --- /dev/null +++ b/zellij-utils/src/plugin_api/plugin_permission.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package api.plugin_permission; + +enum PermissionType { + ReadApplicationState = 0; + ChangeApplicationState = 1; + OpenFiles = 2; + RunCommands = 3; + OpenTerminalsOrPlugins = 4; + WriteToStdin = 5; +} diff --git a/zellij-utils/src/plugin_api/plugin_permission.rs b/zellij-utils/src/plugin_api/plugin_permission.rs new file mode 100644 index 000000000..d2839face --- /dev/null +++ b/zellij-utils/src/plugin_api/plugin_permission.rs @@ -0,0 +1,44 @@ +pub use super::generated_api::api::plugin_permission::PermissionType as ProtobufPermissionType; +use crate::data::PermissionType; + +use std::convert::TryFrom; + +impl TryFrom<ProtobufPermissionType> for PermissionType { + type Error = &'static str; + fn try_from(protobuf_permission: ProtobufPermissionType) -> Result<Self, &'static str> { + match protobuf_permission { + ProtobufPermissionType::ReadApplicationState => { + Ok(PermissionType::ReadApplicationState) + }, + ProtobufPermissionType::ChangeApplicationState => { + Ok(PermissionType::ChangeApplicationState) + }, + ProtobufPermissionType::OpenFiles => Ok(PermissionType::OpenFiles), + ProtobufPermissionType::RunCommands => Ok(PermissionType::RunCommands), + ProtobufPermissionType::OpenTerminalsOrPlugins => { + Ok(PermissionType::OpenTerminalsOrPlugins) + }, + ProtobufPermissionType::WriteToStdin => Ok(PermissionType::WriteToStdin), + } + } +} + +impl TryFrom<PermissionType> for ProtobufPermissionType { + type Error = &'static str; + fn try_from(permission: PermissionType) -> Result<Self, &'static str> { + match permission { + PermissionType::ReadApplicationState => { + Ok(ProtobufPermissionType::ReadApplicationState) + }, + PermissionType::ChangeApplicationState => { + Ok(ProtobufPermissionType::ChangeApplicationState) + }, + PermissionType::OpenFiles => Ok(ProtobufPermissionType::OpenFiles), + PermissionType::RunCommands => Ok(ProtobufPermissionType::RunCommands), + PermissionType::OpenTerminalsOrPlugins => { + Ok(ProtobufPermissionType::OpenTerminalsOrPlugins) + }, + PermissionType::WriteToStdin => Ok(ProtobufPermissionType::WriteToStdin), + } + } +} |