From b35c4d3de8a9293d678cb3ef7a829dc839f8b968 Mon Sep 17 00:00:00 2001 From: P0nk Date: Mon, 28 Jun 2021 10:37:06 +0200 Subject: [PATCH] Handle hwid assocation expiry in dedicated class --- .../session/HwidAssociationExpiry.java | 41 +++++++++++++++ .../session/MapleSessionCoordinator.java | 51 +++---------------- 2 files changed, 48 insertions(+), 44 deletions(-) create mode 100644 src/main/java/net/server/coordinator/session/HwidAssociationExpiry.java diff --git a/src/main/java/net/server/coordinator/session/HwidAssociationExpiry.java b/src/main/java/net/server/coordinator/session/HwidAssociationExpiry.java new file mode 100644 index 0000000000..5c93f96802 --- /dev/null +++ b/src/main/java/net/server/coordinator/session/HwidAssociationExpiry.java @@ -0,0 +1,41 @@ +package net.server.coordinator.session; + +import net.server.Server; + +import java.time.Instant; +import java.util.concurrent.TimeUnit; + +public class HwidAssociationExpiry { + public static Instant getHwidAccountExpiry(int relevance) { + return Instant.ofEpochMilli(Server.getInstance().getCurrentTime()).plusMillis(hwidExpirationUpdate(relevance)); + } + + private static long hwidExpirationUpdate(int relevance) { + int degree = getHwidExpirationDegree(relevance); + + final long baseHours = switch (degree) { + case 0 -> 2; + case 1 -> TimeUnit.DAYS.toHours(1); + case 2 -> TimeUnit.DAYS.toHours(7); + default -> TimeUnit.DAYS.toHours(70); + }; + + int subdegreeTime = (degree * 3) + 1; + if (subdegreeTime > 10) { + subdegreeTime = 10; + } + + return TimeUnit.HOURS.toMillis(baseHours + subdegreeTime); + } + + private static int getHwidExpirationDegree(int relevance) { + int degree = 1; + int subdegree; + while ((subdegree = 5 * degree) <= relevance) { + relevance -= subdegree; + degree++; + } + + return --degree; + } +} diff --git a/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java b/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java index 2029cb494e..823b71218f 100644 --- a/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java +++ b/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java @@ -81,47 +81,6 @@ public class MapleSessionCoordinator { } } - private static Instant getHwidAccountExpiry(int relevance) { - return Instant.ofEpochMilli(Server.getInstance().getCurrentTime() + hwidExpirationUpdate(relevance)); - } - - private static long hwidExpirationUpdate(int relevance) { - int degree = 1; - int i = relevance; - int subdegree; - while ((subdegree = 5 * degree) <= i) { - i -= subdegree; - degree++; - } - - degree--; - int baseTime, subdegreeTime; - if (degree > 2) { - subdegreeTime = 10; - } else { - subdegreeTime = 1 + (3 * degree); - } - - switch(degree) { - case 0: - baseTime = 2; // 2 hours - break; - - case 1: - baseTime = 24; // 1 day - break; - - case 2: - baseTime = 168; // 7 days - break; - - default: - baseTime = 1680; // 70 days - } - - return 3600000 * (baseTime + subdegreeTime); - } - /** * @return false if it was already associated, true if a new association was created in this call */ @@ -135,7 +94,7 @@ public class MapleSessionCoordinator { } if (hwids.size() < YamlConfig.config.server.MAX_ALLOWED_ACCOUNT_HWID) { - Instant expiry = getHwidAccountExpiry(0); + Instant expiry = HwidAssociationExpiry.getHwidAccountExpiry(0); SessionDAO.registerAccountAccess(con, accountId, remoteHwid, expiry); return true; } @@ -153,7 +112,7 @@ public class MapleSessionCoordinator { if (hwidRelevance.hwid().endsWith(nibbleHwid)) { if (!routineCheck) { // better update HWID relevance as soon as the login is authenticated - Instant expiry = getHwidAccountExpiry(hwidRelevance.relevance()); + Instant expiry = HwidAssociationExpiry.getHwidAccountExpiry(hwidRelevance.relevance()); int relevance = hwidRelevance.relevance(); if (relevance < Byte.MAX_VALUE) { relevance++; @@ -518,7 +477,11 @@ public class MapleSessionCoordinator { private void associateRemoteHostHwid(String remoteHost, String remoteHwid) { cachedHostHwids.put(remoteHost, remoteHwid); - cachedHostTimeout.put(remoteHost, Server.getInstance().getCurrentTime() + 604800000); // 1 week-time entry + cachedHostTimeout.put(remoteHost, getHostTimeout()); + } + + private static long getHostTimeout() { + return Server.getInstance().getCurrentTime() + TimeUnit.DAYS.toMillis(7); // 1 week-time entry } public void runUpdateHwidHistory() {