diff --git a/rust/build/main.rs b/rust/build/main.rs index 27ab21a..09f8db3 100644 --- a/rust/build/main.rs +++ b/rust/build/main.rs @@ -1,9 +1,8 @@ -use crate::{java::setup_java, protobufs::setup_protobufs, pumpkin::setup_pumpkin_build_info}; +use crate::{java::setup_java, protobufs::setup_protobufs}; use std::{error::Error, path::PathBuf}; pub mod java; pub mod protobufs; -pub mod pumpkin; fn main() -> Result<(), Box> { println!("cargo::rerun-if-changed=rust/src/build.rs"); @@ -12,7 +11,6 @@ fn main() -> Result<(), Box> { let base = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); - setup_pumpkin_build_info(&base); setup_protobufs(base.clone()); setup_java(base); Ok(()) diff --git a/rust/build/pumpkin.rs b/rust/build/pumpkin.rs deleted file mode 100644 index 833853a..0000000 --- a/rust/build/pumpkin.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::{fs, path::Path}; - -fn extract_git_revision(source: &str) -> Option { - source.rsplit('#').next().and_then(|revision| { - let trimmed = revision.trim(); - if trimmed.is_empty() { - None - } else { - Some(trimmed.to_string()) - } - }) -} - -pub fn setup_pumpkin_build_info(base: &Path) { - let lock_path = base.join("Cargo.lock"); - let lock_contents = - fs::read_to_string(&lock_path).expect("Failed to read Cargo.lock for Pumpkin build info"); - - let mut in_pumpkin_package = false; - let mut pumpkin_version: Option = None; - let mut pumpkin_revision: Option = None; - - for line in lock_contents.lines() { - let trimmed = line.trim(); - - if trimmed == "[[package]]" { - if in_pumpkin_package { - break; - } - in_pumpkin_package = false; - pumpkin_version = None; - pumpkin_revision = None; - continue; - } - - if trimmed == r#"name = "pumpkin""# { - in_pumpkin_package = true; - continue; - } - - if !in_pumpkin_package { - continue; - } - - if let Some(version) = trimmed.strip_prefix(r#"version = ""#) { - pumpkin_version = Some(version.trim_end_matches('"').to_string()); - continue; - } - - if let Some(source) = trimmed.strip_prefix(r#"source = ""#) { - let source = source.trim_end_matches('"'); - pumpkin_revision = extract_git_revision(source); - } - } - - let pumpkin_version = pumpkin_version.unwrap_or_else(|| "unknown".to_string()); - let pumpkin_revision = pumpkin_revision.unwrap_or_else(|| "unknown".to_string()); - let pumpkin_revision_short = pumpkin_revision.chars().take(7).collect::(); - - println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_VERSION={pumpkin_version}"); - println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_REVISION={pumpkin_revision}"); - println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_REVISION_SHORT={pumpkin_revision_short}"); - println!("cargo::rerun-if-changed={}", lock_path.display()); -} diff --git a/rust/src/java/plugin/command_manager.rs b/rust/src/java/plugin/command_manager.rs index 373071f..17e5d4e 100644 --- a/rust/src/java/plugin/command_manager.rs +++ b/rust/src/java/plugin/command_manager.rs @@ -4,7 +4,10 @@ use anyhow::Result; use j4rs::{Instance, InvocationArg, Jvm}; use pumpkin::{command::dispatcher::CommandError, plugin::Context}; use pumpkin_protocol::java::client::play::CommandSuggestion; -use pumpkin_util::permission::{Permission, PermissionDefault}; +use pumpkin_util::{ + PermissionLvl, + permission::{Permission, PermissionDefault}, +}; use tokio::sync::mpsc; use crate::{ @@ -187,7 +190,7 @@ impl CommandManager { cmd_data.description.clone().unwrap_or_default(), ); - let permission = build_permission_node(&plugin.name, &cmd_name); + let (permission, permission_default) = build_permission_node(&cmd_name, cmd_data); let registry = { let permission_manager = context.permission_manager.read().await; @@ -200,7 +203,7 @@ impl CommandManager { "Allows running the Bukkit command `{cmd_name}` from `{}`", plugin.name ), - PermissionDefault::Allow, + permission_default, )) { if e.contains("already registered") { tracing::debug!( @@ -318,48 +321,66 @@ impl CommandManager { } } -fn build_permission_node(plugin_name: &str, cmd_name: &str) -> String { - let plugin_segment = sanitize_permission_segment(plugin_name); - let command_segment = sanitize_permission_segment(cmd_name); - format!("{PATCHBUKKIT_PERMISSION_NAMESPACE}:command.{plugin_segment}.{command_segment}") -} - -fn sanitize_permission_segment(value: &str) -> String { - let sanitized: String = value - .chars() - .map(|ch| { - if ch.is_ascii_alphanumeric() || matches!(ch, '.' | '_' | '-') { - ch.to_ascii_lowercase() - } else { - '_' - } - }) - .collect(); - - if sanitized.is_empty() { - "unknown".to_string() +fn build_permission_node( + cmd_name: &str, + cmd_data: &config::spigot::Command, +) -> (String, PermissionDefault) { + if let Some(permission) = &cmd_data.permission { + ( + permission.clone(), + PermissionDefault::Op(PermissionLvl::Two), + ) } else { - sanitized + ( + format!("{PATCHBUKKIT_PERMISSION_NAMESPACE}:command.{cmd_name}"), + PermissionDefault::Allow, + ) } } #[cfg(test)] mod tests { + use pumpkin_util::{PermissionLvl, permission::PermissionDefault}; + + use crate::config::spigot::Command; + use super::build_permission_node; #[test] - fn permission_node_is_namespaced_and_stable() { + fn permission_node_uses_explicit_plugin_permission() { + let command = Command { + description: None, + usage: None, + aliases: None, + permission: Some("simplespawn.spawn".to_string()), + permission_message: None, + }; + assert_eq!( - build_permission_node("SimpleSpawn", "spawn"), - "patchbukkit:command.simplespawn.spawn" + build_permission_node("spawn", &command), + ( + "simplespawn.spawn".to_string(), + PermissionDefault::Op(PermissionLvl::Two) + ) ); } #[test] - fn permission_node_sanitizes_unfriendly_characters() { + fn permission_node_falls_back_to_patchbukkit_namespace() { + let command = Command { + description: None, + usage: None, + aliases: None, + permission: None, + permission_message: None, + }; + assert_eq!( - build_permission_node("Fancy Plugin", "Spawn-All"), - "patchbukkit:command.fancy_plugin.spawn-all" + build_permission_node("spawn", &command), + ( + "patchbukkit:command.spawn".to_string(), + PermissionDefault::Allow + ) ); } } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index fc2e52a..663e48a 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -30,17 +30,9 @@ use crate::{ }, }; -const PATCHBUKKIT_PUMPKIN_VERSION: &str = env!("PATCHBUKKIT_PUMPKIN_VERSION"); -const PATCHBUKKIT_PUMPKIN_REVISION: &str = env!("PATCHBUKKIT_PUMPKIN_REVISION"); -const PATCHBUKKIT_PUMPKIN_REVISION_SHORT: &str = env!("PATCHBUKKIT_PUMPKIN_REVISION_SHORT"); - async fn on_load_inner(plugin: &PatchBukkitPlugin, server: Arc) -> Result<(), String> { server.init_log(); tracing::info!("Starting PatchBukkit"); - tracing::info!( - "Built against Pumpkin {PATCHBUKKIT_PUMPKIN_VERSION} ({PATCHBUKKIT_PUMPKIN_REVISION_SHORT})" - ); - tracing::debug!("Full Pumpkin dependency revision: {PATCHBUKKIT_PUMPKIN_REVISION}"); // Setup directories let dirs = setup_directories(&server)?;