From bfa6d97ed4e619006cb06192c43cbeea2d8e71f2 Mon Sep 17 00:00:00 2001 From: vyPal Date: Sat, 7 Jun 2025 20:43:33 +0200 Subject: [PATCH] Fix permissions not being registered from plugins (#858) * Fix permissions not being registered from plugins * Fix clippy --- pumpkin-util/src/permission.rs | 4 ++-- pumpkin/src/lib.rs | 7 +++++-- pumpkin/src/main.rs | 7 +++++-- pumpkin/src/plugin/api/context.rs | 15 +++++++++++---- pumpkin/src/plugin/mod.rs | 4 +++- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/pumpkin-util/src/permission.rs b/pumpkin-util/src/permission.rs index 521aae408..3fd8846c3 100644 --- a/pumpkin-util/src/permission.rs +++ b/pumpkin-util/src/permission.rs @@ -120,9 +120,9 @@ impl PermissionAttachment { #[derive(Default)] pub struct PermissionManager { /// Global registry of permissions - registry: Arc>, + pub registry: Arc>, /// Player permission attachments - attachments: HashMap>>, + pub attachments: HashMap>>, } impl PermissionManager { diff --git a/pumpkin/src/lib.rs b/pumpkin/src/lib.rs index d90c3a089..906164a78 100644 --- a/pumpkin/src/lib.rs +++ b/pumpkin/src/lib.rs @@ -56,8 +56,11 @@ pub static PLUGIN_MANAGER: LazyLock>> = LazyLock::new( pub static PERMISSION_REGISTRY: LazyLock>> = LazyLock::new(|| Arc::new(RwLock::new(PermissionRegistry::new()))); -pub static PERMISSION_MANAGER: LazyLock> = - LazyLock::new(|| RwLock::new(PermissionManager::new(PERMISSION_REGISTRY.clone()))); +pub static PERMISSION_MANAGER: LazyLock>> = LazyLock::new(|| { + Arc::new(RwLock::new(PermissionManager::new( + PERMISSION_REGISTRY.clone(), + ))) +}); /// A wrapper for our logger to hold the terminal input while no input is expected in order to /// properly flush logs to the output while they happen instead of batched diff --git a/pumpkin/src/main.rs b/pumpkin/src/main.rs index c4cc12026..9ce1d2035 100644 --- a/pumpkin/src/main.rs +++ b/pumpkin/src/main.rs @@ -88,8 +88,11 @@ pub static PLUGIN_MANAGER: LazyLock>> = LazyLock::new( pub static PERMISSION_REGISTRY: LazyLock>> = LazyLock::new(|| Arc::new(RwLock::new(PermissionRegistry::new()))); -pub static PERMISSION_MANAGER: LazyLock> = - LazyLock::new(|| RwLock::new(PermissionManager::new(PERMISSION_REGISTRY.clone()))); +pub static PERMISSION_MANAGER: LazyLock>> = LazyLock::new(|| { + Arc::new(RwLock::new(PermissionManager::new( + PERMISSION_REGISTRY.clone(), + ))) +}); const CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION"); const GIT_VERSION: &str = env!("GIT_VERSION"); diff --git a/pumpkin/src/plugin/api/context.rs b/pumpkin/src/plugin/api/context.rs index 032920aff..8b1081d9c 100644 --- a/pumpkin/src/plugin/api/context.rs +++ b/pumpkin/src/plugin/api/context.rs @@ -1,7 +1,10 @@ use std::{fs, path::Path, sync::Arc}; -use crate::{PERMISSION_MANAGER, PERMISSION_REGISTRY, command::client_suggestions}; -use pumpkin_util::{PermissionLvl, permission::Permission}; +use crate::command::client_suggestions; +use pumpkin_util::{ + PermissionLvl, + permission::{Permission, PermissionManager}, +}; use tokio::sync::RwLock; use crate::{ @@ -24,6 +27,7 @@ pub struct Context { pub server: Arc, pub handlers: Arc>, pub plugin_manager: Arc>, + pub permission_manager: Arc>, } impl Context { /// Creates a new instance of `Context`. @@ -41,12 +45,14 @@ impl Context { server: Arc, handlers: Arc>, plugin_manager: Arc>, + permission_manager: Arc>, ) -> Self { Self { metadata, server, handlers, plugin_manager, + permission_manager, } } @@ -134,13 +140,14 @@ impl Context { )); } - let mut registry = PERMISSION_REGISTRY.write().await; + let manager = self.permission_manager.read().await; + let mut registry = manager.registry.write().await; registry.register_permission(permission) } /// Check if a player has a permission pub async fn player_has_permission(&self, player_uuid: &uuid::Uuid, permission: &str) -> bool { - let permission_manager = PERMISSION_MANAGER.read().await; + let permission_manager = self.permission_manager.read().await; // If the player isn't online, we need to find their op level let player_op_level = (self.server.get_player_by_uuid(*player_uuid).await) diff --git a/pumpkin/src/plugin/mod.rs b/pumpkin/src/plugin/mod.rs index 6372ebe4e..c420a2686 100644 --- a/pumpkin/src/plugin/mod.rs +++ b/pumpkin/src/plugin/mod.rs @@ -13,7 +13,7 @@ use tokio::sync::RwLock; pub mod api; pub mod loader; -use crate::server::Server; +use crate::{PERMISSION_MANAGER, server::Server}; pub use api::*; /// A trait for handling events dynamically. @@ -316,6 +316,7 @@ impl PluginManager { Arc::clone(server), Arc::clone(&self.handlers), Arc::clone(self_ref), + Arc::clone(&PERMISSION_MANAGER), ); if let Err(e) = instance.on_load(&context).await { @@ -394,6 +395,7 @@ impl PluginManager { Arc::clone(server), Arc::clone(&self.handlers), Arc::clone(self_ref), + Arc::clone(&PERMISSION_MANAGER), ); plugin.instance.on_unload(&context).await.ok();