Skip to content

Commit ead1e1b

Browse files
authored
Fix checking bypass on initialize (#2082)
* Fix checking bypass on initialize * Add SessionManager#createSession back as deprecated
1 parent 8b7729e commit ead1e1b

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.sk89q.worldguard.session;
2121

22+
import com.google.common.cache.Cache;
2223
import com.google.common.cache.CacheBuilder;
2324
import com.google.common.cache.CacheLoader;
2425
import com.google.common.cache.LoadingCache;
@@ -67,10 +68,9 @@ public abstract class AbstractSessionManager implements SessionManager {
6768
.expireAfterWrite(2, TimeUnit.SECONDS)
6869
.build(CacheLoader.from(tuple -> BYPASS_PERMISSION_TEST.test(tuple.getWorld(), tuple.getPlayer())));
6970

70-
private final LoadingCache<CacheKey, Session> sessions = CacheBuilder.newBuilder()
71+
private final Cache<CacheKey, Session> sessions = CacheBuilder.newBuilder()
7172
.expireAfterAccess(SESSION_LIFETIME, TimeUnit.MINUTES)
72-
.build(CacheLoader.from(key ->
73-
createSession(key.playerRef.get())));
73+
.build();
7474

7575
private boolean hasCustom = false;
7676
private List<Handler.Factory<? extends Handler>> handlers = new LinkedList<>();
@@ -152,7 +152,7 @@ public boolean hasBypass(LocalPlayer player, World world) {
152152
@Override
153153
public void resetState(LocalPlayer player) {
154154
checkNotNull(player, "player");
155-
@Nullable Session session = sessions.getIfPresent(new CacheKey(player));
155+
@Nullable Session session = getIfPresentInternal(new CacheKey(player));
156156
if (session != null) {
157157
session.resetState(player);
158158
}
@@ -161,22 +161,35 @@ public void resetState(LocalPlayer player) {
161161
@Override
162162
@Nullable
163163
public Session getIfPresent(LocalPlayer player) {
164-
return sessions.getIfPresent(new CacheKey(player));
164+
return getIfPresentInternal(new CacheKey(player));
165+
}
166+
167+
private Session getIfPresentInternal(CacheKey cacheKey) {
168+
@Nullable Session session = sessions.getIfPresent(cacheKey);
169+
if (session != null) {
170+
session.ensureInitialized(cacheKey.playerRef.get(), this::initializeSession);
171+
return session;
172+
}
173+
return null;
165174
}
166175

167176
@Override
168177
public Session get(LocalPlayer player) {
169-
return sessions.getUnchecked(new CacheKey(player));
178+
Session session = sessions.asMap().computeIfAbsent(new CacheKey(player), (k) -> new Session(this));
179+
session.ensureInitialized(player, this::initializeSession);
180+
return session;
170181
}
171182

172183
@Override
173184
public Session createSession(LocalPlayer player) {
174-
Session session = new Session(this);
185+
return get(player);
186+
}
187+
188+
private void initializeSession(Session session, LocalPlayer player) {
175189
for (Handler.Factory<? extends Handler> factory : handlers) {
176190
session.register(factory.create(session));
177191
}
178192
session.initialize(player);
179-
return session;
180193
}
181194

182195
protected static final class CacheKey {

worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.HashMap;
3939
import java.util.Set;
4040
import java.util.concurrent.atomic.AtomicBoolean;
41+
import java.util.function.BiConsumer;
4142

4243
import static com.google.common.base.Preconditions.checkNotNull;
4344

@@ -52,6 +53,7 @@ public class Session {
5253
private Location lastValid;
5354
private Set<ProtectedRegion> lastRegionSet;
5455
private final AtomicBoolean needRefresh = new AtomicBoolean(false);
56+
private boolean initialized;
5557

5658
/**
5759
* Create a new session.
@@ -120,6 +122,14 @@ public void initialize(LocalPlayer player) {
120122
}
121123
}
122124

125+
synchronized void ensureInitialized(LocalPlayer player, BiConsumer<Session, LocalPlayer> initializer) {
126+
if (initialized) {
127+
return;
128+
}
129+
initialized = true;
130+
initializer.accept(this, player);
131+
}
132+
123133
/**
124134
* Uninitialize the session.
125135
*

worldguard-core/src/main/java/com/sk89q/worldguard/session/SessionManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ public interface SessionManager {
9595
*
9696
* @param player The player
9797
* @return The new session
98+
* @deprecated Use {@link SessionManager#get} instead
9899
*/
100+
@Deprecated
99101
Session createSession(LocalPlayer player);
100102

101103
/**

0 commit comments

Comments
 (0)