All checks were successful
Quality Check / Validate OAS (push) Successful in 37s
Quality Check / Validate OAS (pull_request) Successful in 36s
Quality Check / Linting (push) Successful in 1m14s
Quality Check / Testing (push) Successful in 1m17s
Quality Check / Static Analysis (push) Successful in 1m22s
Quality Check / Linting (pull_request) Successful in 1m7s
Quality Check / Static Analysis (pull_request) Successful in 1m11s
Quality Check / Testing (pull_request) Successful in 45s
63 lines
2.4 KiB
Java
63 lines
2.4 KiB
Java
package de.towerdefence.server.session;
|
|
|
|
import de.towerdefence.server.player.Player;
|
|
import lombok.AllArgsConstructor;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.Optional;
|
|
import java.util.concurrent.*;
|
|
|
|
@Service
|
|
@AllArgsConstructor
|
|
public class SessionsService {
|
|
private static final int TIME_TO_LIVE_SECONDS = 30;
|
|
|
|
private final Map<String, Channel> tokenGrants = new ConcurrentHashMap<>();
|
|
private final Map<String, Player> sessions = new ConcurrentHashMap<>();
|
|
private final Map<String, ScheduledFuture<?>> tokenGarbageCollectors = new ConcurrentHashMap<>();
|
|
|
|
@Autowired
|
|
private final JwtService jwtService;
|
|
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
|
|
|
public String createSession(Player player, Channel channel){
|
|
String jwt = jwtService.generateToken(player.getUsername(), channel, TIME_TO_LIVE_SECONDS);
|
|
if(tokenGrants.containsKey(jwt)){
|
|
throw new IllegalStateException("The exact same JWT allready exists");
|
|
}
|
|
tokenGrants.put(jwt, channel);
|
|
sessions.put(jwt, player);
|
|
this.tokenGarbageCollectors.put(jwt, scheduler.schedule(() -> {
|
|
tokenGrants.remove(jwt);
|
|
sessions.remove(jwt);
|
|
tokenGarbageCollectors.remove(jwt);
|
|
}, TIME_TO_LIVE_SECONDS, TimeUnit.SECONDS));
|
|
return jwt;
|
|
}
|
|
|
|
public Optional<Player> getSession(String jwt, Channel channel){
|
|
Channel grantedChannel = tokenGrants.get(jwt);
|
|
if (grantedChannel == null || !grantedChannel.equals(channel)) {
|
|
return Optional.empty();
|
|
}
|
|
Optional<String> username = jwtService.verifyToken(jwt, channel);
|
|
if (username.isEmpty()) {
|
|
return Optional.empty();
|
|
}
|
|
Player player = sessions.get(jwt);
|
|
if (!Objects.equals(player.getUsername(), username.get())) {
|
|
return Optional.empty();
|
|
}
|
|
ScheduledFuture<?> garbageCollector = tokenGarbageCollectors.get(jwt);
|
|
if (garbageCollector != null && !garbageCollector.isCancelled() && !garbageCollector.isDone()) {
|
|
garbageCollector.cancel(false);
|
|
}
|
|
tokenGarbageCollectors.remove(jwt);
|
|
tokenGrants.remove(jwt);
|
|
sessions.remove(jwt);
|
|
return Optional.of(player);
|
|
}
|
|
}
|