Handle hwid assocation expiry in dedicated class
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
* @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) {
|
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);
|
SessionDAO.registerAccountAccess(con, accountId, remoteHwid, expiry);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -153,7 +112,7 @@ public class MapleSessionCoordinator {
|
|||||||
if (hwidRelevance.hwid().endsWith(nibbleHwid)) {
|
if (hwidRelevance.hwid().endsWith(nibbleHwid)) {
|
||||||
if (!routineCheck) {
|
if (!routineCheck) {
|
||||||
// better update HWID relevance as soon as the login is authenticated
|
// 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();
|
int relevance = hwidRelevance.relevance();
|
||||||
if (relevance < Byte.MAX_VALUE) {
|
if (relevance < Byte.MAX_VALUE) {
|
||||||
relevance++;
|
relevance++;
|
||||||
@@ -518,7 +477,11 @@ public class MapleSessionCoordinator {
|
|||||||
|
|
||||||
private void associateRemoteHostHwid(String remoteHost, String remoteHwid) {
|
private void associateRemoteHostHwid(String remoteHost, String remoteHwid) {
|
||||||
cachedHostHwids.put(remoteHost, 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() {
|
public void runUpdateHwidHistory() {
|
||||||
|
|||||||
Reference in New Issue
Block a user