From 0284432e69d47aa628a0d180abf1edf2e88e733f Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Sat, 26 Apr 2025 10:36:20 +0100 Subject: [PATCH 1/3] fix: attempt to retrieve online from offline player for perm attachments --- .../bukkit/BukkitPermissionAttachmentManager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java index 547c59cd8e..a53b12c3ac 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java @@ -1,6 +1,7 @@ package com.fastasyncworldedit.bukkit; import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissibleBase; import org.bukkit.permissions.PermissionAttachment; @@ -19,8 +20,11 @@ public BukkitPermissionAttachmentManager(WorldEditPlugin plugin) { this.plugin = plugin; } - public PermissionAttachment getOrAddAttachment(@Nullable final Player p) { - if (p == null) { + public PermissionAttachment getOrAddAttachment(@Nullable Player p) { + if (p instanceof OfflinePlayer offline) { + p = offline.getPlayer(); + } + if (p == null || !p.isOnline()) { return null; } if (p.hasMetadata("NPC")) { From 5ee02744fba6f94ed0d802e7a9460ea5ae78c666 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Sat, 26 Apr 2025 13:15:42 +0100 Subject: [PATCH 2/3] Use synchonized WeakHashMap to be sure --- .../bukkit/BukkitPermissionAttachmentManager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java index a53b12c3ac..f7037dff2b 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java @@ -7,25 +7,27 @@ import org.bukkit.permissions.PermissionAttachment; import javax.annotation.Nullable; +import java.util.Collections; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.WeakHashMap; public class BukkitPermissionAttachmentManager { private final WorldEditPlugin plugin; - private final Map attachments = new ConcurrentHashMap<>(); + private final Map attachments = Collections.synchronizedMap(new WeakHashMap<>()); private PermissionAttachment noopAttachment; public BukkitPermissionAttachmentManager(WorldEditPlugin plugin) { this.plugin = plugin; } + @Nullable public PermissionAttachment getOrAddAttachment(@Nullable Player p) { if (p instanceof OfflinePlayer offline) { p = offline.getPlayer(); } if (p == null || !p.isOnline()) { - return null; + return null; // The attachment is only used for setting permissions (e.g. when toggling bypass) so null is acceptable } if (p.hasMetadata("NPC")) { if (this.noopAttachment == null) { From 367cac2aa7e8d01af3c37aa8a37315a804457b2a Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Sat, 26 Apr 2025 17:01:35 +0100 Subject: [PATCH 3/3] We don't always need the permission attachment, check for null --- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 4ced1a6805..a7a680b68b 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.internal.cui.CUIEvent; +import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.SessionKey; @@ -51,6 +52,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; +import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -73,10 +75,12 @@ public class BukkitPlayer extends AbstractPlayerActor { + private static final Logger LOGGER = LogManagerCompat.getLogger(); + private final Player player; private final WorldEditPlugin plugin; //FAWE start - private final PermissionAttachment permAttachment; + private PermissionAttachment permAttachment = null; /** * This constructs a new {@link BukkitPlayer} for the given {@link Player}. @@ -89,7 +93,6 @@ public BukkitPlayer(@Nullable Player player) { super(player != null ? getExistingMap(WorldEditPlugin.getInstance(), player) : new ConcurrentHashMap<>()); this.plugin = WorldEditPlugin.getInstance(); this.player = player; - this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player); } //FAWE end @@ -105,7 +108,6 @@ public BukkitPlayer(@Nonnull WorldEditPlugin plugin, @Nullable Player player) { this.plugin = plugin; this.player = player; //FAWE start - this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player); if (player != null && Settings.settings().CLIPBOARD.USE_DISK) { BukkitPlayer cached = WorldEditPlugin.getInstance().getCachedPlayer(player); if (cached == null) { @@ -297,6 +299,17 @@ public void setPermission(String permission, boolean value) { } } if (usesuperperms) { + if (this.permAttachment == null) { + this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player); + } + if (this.permAttachment == null) { + LOGGER.warn( + "Attempted to set permission for offline player `{}`, UUID: `{}`?!", + player.getName(), + player.getUniqueId() + ); + return; + } permAttachment.setPermission(permission, value); } }