Skip to content

Commit 3c2b643

Browse files
authored
fix: attempt to retrieve online from offline player for perm attachments (#3182)
* fix: attempt to retrieve online from offline player for perm attachments * Use synchonized WeakHashMap to be sure * We don't always need the permission attachment, check for null
1 parent 8ca47e6 commit 3c2b643

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,33 @@
11
package com.fastasyncworldedit.bukkit;
22

33
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
4+
import org.bukkit.OfflinePlayer;
45
import org.bukkit.entity.Player;
56
import org.bukkit.permissions.PermissibleBase;
67
import org.bukkit.permissions.PermissionAttachment;
78

89
import javax.annotation.Nullable;
10+
import java.util.Collections;
911
import java.util.Map;
10-
import java.util.concurrent.ConcurrentHashMap;
12+
import java.util.WeakHashMap;
1113

1214
public class BukkitPermissionAttachmentManager {
1315

1416
private final WorldEditPlugin plugin;
15-
private final Map<Player, PermissionAttachment> attachments = new ConcurrentHashMap<>();
17+
private final Map<Player, PermissionAttachment> attachments = Collections.synchronizedMap(new WeakHashMap<>());
1618
private PermissionAttachment noopAttachment;
1719

1820
public BukkitPermissionAttachmentManager(WorldEditPlugin plugin) {
1921
this.plugin = plugin;
2022
}
2123

22-
public PermissionAttachment getOrAddAttachment(@Nullable final Player p) {
23-
if (p == null) {
24-
return null;
24+
@Nullable
25+
public PermissionAttachment getOrAddAttachment(@Nullable Player p) {
26+
if (p instanceof OfflinePlayer offline) {
27+
p = offline.getPlayer();
28+
}
29+
if (p == null || !p.isOnline()) {
30+
return null; // The attachment is only used for setting permissions (e.g. when toggling bypass) so null is acceptable
2531
}
2632
if (p.hasMetadata("NPC")) {
2733
if (this.noopAttachment == null) {

worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.sk89q.worldedit.extent.Extent;
3434
import com.sk89q.worldedit.extent.inventory.BlockBag;
3535
import com.sk89q.worldedit.internal.cui.CUIEvent;
36+
import com.sk89q.worldedit.internal.util.LogManagerCompat;
3637
import com.sk89q.worldedit.math.BlockVector3;
3738
import com.sk89q.worldedit.math.Vector3;
3839
import com.sk89q.worldedit.session.SessionKey;
@@ -51,6 +52,7 @@
5152
import com.sk89q.worldedit.world.block.BlockTypes;
5253
import com.sk89q.worldedit.world.gamemode.GameMode;
5354
import com.sk89q.worldedit.world.gamemode.GameModes;
55+
import org.apache.logging.log4j.Logger;
5456
import org.bukkit.Bukkit;
5557
import org.bukkit.Location;
5658
import org.bukkit.Material;
@@ -73,10 +75,12 @@
7375

7476
public class BukkitPlayer extends AbstractPlayerActor {
7577

78+
private static final Logger LOGGER = LogManagerCompat.getLogger();
79+
7680
private final Player player;
7781
private final WorldEditPlugin plugin;
7882
//FAWE start
79-
private final PermissionAttachment permAttachment;
83+
private PermissionAttachment permAttachment = null;
8084

8185
/**
8286
* This constructs a new {@link BukkitPlayer} for the given {@link Player}.
@@ -89,7 +93,6 @@ public BukkitPlayer(@Nullable Player player) {
8993
super(player != null ? getExistingMap(WorldEditPlugin.getInstance(), player) : new ConcurrentHashMap<>());
9094
this.plugin = WorldEditPlugin.getInstance();
9195
this.player = player;
92-
this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player);
9396
}
9497
//FAWE end
9598

@@ -105,7 +108,6 @@ public BukkitPlayer(@Nonnull WorldEditPlugin plugin, @Nullable Player player) {
105108
this.plugin = plugin;
106109
this.player = player;
107110
//FAWE start
108-
this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player);
109111
if (player != null && Settings.settings().CLIPBOARD.USE_DISK) {
110112
BukkitPlayer cached = WorldEditPlugin.getInstance().getCachedPlayer(player);
111113
if (cached == null) {
@@ -297,6 +299,17 @@ public void setPermission(String permission, boolean value) {
297299
}
298300
}
299301
if (usesuperperms) {
302+
if (this.permAttachment == null) {
303+
this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player);
304+
}
305+
if (this.permAttachment == null) {
306+
LOGGER.warn(
307+
"Attempted to set permission for offline player `{}`, UUID: `{}`?!",
308+
player.getName(),
309+
player.getUniqueId()
310+
);
311+
return;
312+
}
300313
permAttachment.setPermission(permission, value);
301314
}
302315
}

0 commit comments

Comments
 (0)