Unban macs & hwid

This commit is contained in:
P0nk
2024-10-03 21:26:26 +02:00
parent 64f99a29c6
commit e295a24d98
7 changed files with 74 additions and 68 deletions

View File

@@ -6,9 +6,10 @@ import lombok.extern.slf4j.Slf4j;
import net.jcip.annotations.ThreadSafe;
import net.server.coordinator.session.Hwid;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Map;
import java.util.Set;
/**
@@ -18,7 +19,7 @@ import java.util.Set;
@Slf4j
public class HwidBanManager {
private final HwidBanRepository hwidBanRepository;
private final Set<Hwid> bannedHwids = new HashSet<>();
private final Map<Hwid, Integer> bannedHwids = new HashMap<>();
public HwidBanManager(HwidBanRepository hwidBanRepository) {
this.hwidBanRepository = hwidBanRepository;
@@ -27,30 +28,35 @@ public class HwidBanManager {
public synchronized void loadHwidBans() {
List<HwidBan> hwidBans = hwidBanRepository.getAllHwidBans();
log.debug("Loaded {} hwid bans", hwidBans.size());
bannedHwids.addAll(hwidBans.stream()
.map(HwidBanManager::createHwid)
.filter(Objects::nonNull)
.toList()
);
}
private static Hwid createHwid(HwidBan hwidBan) {
try {
return new Hwid(hwidBan.hwid());
} catch (IllegalArgumentException e) {
log.warn("Unable to create Hwid from: {} due to bad 'hwid' value in database", hwidBan);
return null;
}
hwidBans.forEach(hwidBan -> bannedHwids.put(new Hwid(hwidBan.hwid()), hwidBan.accountId()));
}
public synchronized boolean isBanned(Hwid hwid) {
return bannedHwids.contains(hwid);
return bannedHwids.containsKey(hwid);
}
public synchronized void banHwid(Hwid hwid, int accountId) {
if (hwid == null) {
throw new IllegalArgumentException("hwid cannot be null");
}
bannedHwids.put(hwid, accountId);
hwidBanRepository.saveHwidBan(hwid.hwid(), accountId);
}
public synchronized void unbanAccountHwids(int accountId) {
Set<Hwid> hwidsToUnban = new HashSet<>();
for (Map.Entry<Hwid, Integer> bannedHwid : bannedHwids.entrySet()) {
if (bannedHwid.getValue() == accountId) {
hwidsToUnban.add(bannedHwid.getKey());
}
}
hwidsToUnban.forEach(this::unbanHwid);
}
private void unbanHwid(Hwid hwid) {
bannedHwids.remove(hwid);
hwidBanRepository.deleteHwidBan(hwid.hwid());
}
}

View File

@@ -5,8 +5,10 @@ import database.ban.MacBanRepository;
import lombok.extern.slf4j.Slf4j;
import net.jcip.annotations.ThreadSafe;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@@ -16,7 +18,7 @@ import java.util.Set;
@Slf4j
public class MacBanManager {
private final MacBanRepository macBanRepository;
private final Set<String> bannedMacs = new HashSet<>();
private final Map<String, Integer> bannedMacs = new HashMap<>();
public MacBanManager(MacBanRepository macBanRepository) {
this.macBanRepository = macBanRepository;
@@ -25,11 +27,11 @@ public class MacBanManager {
public synchronized void loadMacBans() {
List<MacBan> macBans = macBanRepository.getAllMacBans();
log.debug("Loaded {} mac bans", macBans.size());
bannedMacs.addAll(macBans.stream().map(MacBan::mac).toList());
macBans.forEach(macBan -> bannedMacs.put(macBan.mac(), macBan.accountId()));
}
public synchronized boolean isBanned(String mac) {
return bannedMacs.contains(mac);
return bannedMacs.containsKey(mac);
}
public synchronized void banMac(String mac, int accountId) {
@@ -38,7 +40,23 @@ public class MacBanManager {
}
// TODO: validate mac format. Or create "Mac" model class.
bannedMacs.add(mac);
macBanRepository.saveMacBan(accountId, mac);
bannedMacs.put(mac, accountId);
macBanRepository.saveMacBan(mac, accountId);
}
public synchronized void unbanAccountMacs(int accountId) {
Set<String> macsToUnban = new HashSet<>();
for (Map.Entry<String, Integer> bannedMac : bannedMacs.entrySet()) {
if (bannedMac.getValue() == accountId) {
macsToUnban.add(bannedMac.getKey());
}
}
macsToUnban.forEach(this::unbanMac);
}
private void unbanMac(String ip) {
bannedMacs.remove(ip);
macBanRepository.deleteMacBan(ip);
}
}