IceAddressFilter class
Пакет: com.hypixel.hytale.server.core.io.ice
Файл: com/hypixel/hytale/server/core/io/ice/IceAddressFilter.java
Поля (40)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
Duration |
INTERFACE_SUBNET_CACHE_EXPIRY |
|
|
interfaceEnumerationFailureLogged |
|
|
interfaceSubnetCache |
|
IceAddressFilter.InterfaceSubnetCache |
var0 |
|
InetAddress |
var1 |
|
long |
var1 |
|
byte[] |
var1 |
|
byte[] |
var1 |
|
byte[] |
var1 |
|
byte[] |
var1 |
|
int |
var1 |
|
byte[] |
var1 |
|
InetAddress |
var2 |
|
|
var2 |
|
IceAddressFilter.InterfaceSubnetCache |
var2 |
|
byte[] |
var2 |
|
int |
var2 |
|
int |
var2 |
|
int |
var2 |
|
|
var2 |
|
|
var2 |
|
|
var2 |
|
int |
var2 |
|
InetSocketAddress |
var3 |
|
ArrayList |
var3 |
|
IceAddressFilter.InterfaceSubnetCache |
var3 |
|
byte[] |
var3 |
|
int |
var3 |
|
int |
var3 |
|
boolean |
var3 |
|
|
var3 |
|
Enumeration |
var4 |
|
short |
var4 |
|
byte[] |
var4 |
|
NetworkInterface |
var5 |
|
int |
var5 |
|
int |
var7 |
|
InetAddress |
var8 |
|
int |
var8 |
|
short |
var9 |
Методы (35)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
private |
record |
InterfaceSubnetCacherecord InterfaceSubnetCache(@Nonnull List<IceAddressFilter.Subnet> subnets, long loadedAtNanos) |
|
record |
Subnetrecord Subnet(@Nonnull InetAddress address, short prefixLength) |
static |
boolean |
allZeroboolean allZero(byte[] var0, int var1, int var2) |
|
|
for for(IceAddressFilter.Subnet var3 : var1) |
|
|
for for(IceAddressFilter.Subnet var3 : var1) |
|
|
for for(int var6 = 0; var6 < var5; var6++) |
|
|
for for(int var5 = 0; var5 < var4.length; var5++) |
|
|
for for(int var3 = var1; var3 < var2; var3++) |
static |
IceAddressFilter.InterfaceSubnetCache |
getInterfaceSubnetCacheIceAddressFilter.InterfaceSubnetCache getInterfaceSubnetCache() |
static |
boolean |
hasUnsafeTranslatedIpv4boolean hasUnsafeTranslatedIpv4(InetAddress var0) |
|
|
if if(var1 > 0 && var1 <= 65535) |
|
|
if if(var4 != null) |
|
|
if if(var8 != null) |
|
|
if if(!interfaceEnumerationFailureLogged) |
|
|
if if(var2.length == var3.length && var4 >= 0 && var4 <= var2.length * 8) |
|
|
if if(var2[var6] != var3[var6]) |
|
|
if if(var8 == 0) |
|
|
if if(var0 instanceof Inet4Address) |
|
|
if if(var0 instanceof Inet4Address) |
|
|
if if(var2 < 0) |
|
|
if if(var0[var3] != 0) |
|
|
if if(var0 instanceof Inet4Address) |
static |
boolean |
isAcceptableboolean isAcceptable(@Nonnull InetSocketAddress var0) |
static |
boolean |
isAllowedByHostSubnetsboolean isAllowedByHostSubnets(@Nonnull InetAddress var0, @Nonnull List<IceAddressFilter.Subnet> var1) |
static |
boolean |
isBroadcastboolean isBroadcast(InetAddress var0) |
static |
boolean |
isDocumentationboolean isDocumentation(InetAddress var0) |
static |
boolean |
isInAnySubnetboolean isInAnySubnet(@Nonnull InetAddress var0, @Nonnull List<IceAddressFilter.Subnet> var1) |
static |
boolean |
isInSubnetboolean isInSubnet(InetAddress var0, IceAddressFilter.Subnet var1) |
static |
boolean |
isInterfaceSubnetCacheExpiredboolean isInterfaceSubnetCacheExpired(IceAddressFilter.InterfaceSubnetCache var0, long var1) |
static |
boolean |
isPrivateboolean isPrivate(InetAddress var0) |
static |
boolean |
isReservedboolean isReserved(InetAddress var0) |
static |
boolean |
isUnsafeTranslatedIpv4boolean isUnsafeTranslatedIpv4(byte[] var0) |
abstract |
return |
isUnsafeTranslatedIpv4return isUnsafeTranslatedIpv4(var4) |
synchronized |
IceAddressFilter.InterfaceSubnetCache |
refreshInterfaceSubnetCacheIceAddressFilter.InterfaceSubnetCache refreshInterfaceSubnetCache(long var0) |
static |
IceAddressFilter.InterfaceSubnetCache |
updateInterfaceSubnetCacheIceAddressFilter.InterfaceSubnetCache updateInterfaceSubnetCache(List<IceAddressFilter.Subnet> var0, long var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.io.ice;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import java.net.Inet4Address;
class="kw">import java.net.InetAddress;
class="kw">import java.net.InetSocketAddress;
class="kw">import java.net.InterfaceAddress;
class="kw">import java.net.NetworkInterface;
class="kw">import java.net.SocketException;
class="kw">import java.time.Duration;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Enumeration;
class="kw">import java.util.List;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class="kw">final class IceAddressFilter {
class="kw">private class="kw">static class="kw">final Duration INTERFACE_SUBNET_CACHE_EXPIRY = Duration.ofSeconds(30L);
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nullable
class="kw">private class="kw">static class="kw">volatile IceAddressFilter.InterfaceSubnetCache interfaceSubnetCache;
class="kw">private class="kw">static boolean interfaceEnumerationFailureLogged;
class="kw">private IceAddressFilter() {
}
@Nullable
class="kw">public class="kw">static InetSocketAddress parse(@Nonnull String var0, int var1) {
if (var1 > 0 && var1 <= 65535) {
InetAddress var2;
try {
var2 = InetAddress.ofLiteral(var0);
} catch (IllegalArgumentException var4) {
class="kw">return null;
}
InetSocketAddress var3 = new InetSocketAddress(var2, var1);
class="kw">return isAcceptable(var3) ? var3 : null;
} else {
class="kw">return null;
}
}
class="kw">public class="kw">static boolean isAcceptable(@Nonnull InetSocketAddress var0) {
InetAddress var1 = var0.getAddress();
if (var1 == null || var0.getPort() <= 0 || var0.getPort() > 65535) {
class="kw">return false;
} else if (var1.isAnyLocalAddress()
|| var1.isLoopbackAddress()
|| var1.isLinkLocalAddress()
|| var1.isMulticastAddress()
|| isBroadcast(var1)
|| isDocumentation(var1)
|| isReserved(var1)
|| hasUnsafeTranslatedIpv4(var1)) {
LOGGER.at(Level.FINE).log("Refusing ICE candidate address %s", var0);
class="kw">return false;
} else if (!isAllowedByHostSubnets(var1, getInterfaceSubnetCache().subnets())) {
LOGGER.at(Level.FINE).log("Refusing ICE candidate address %s", var0);
class="kw">return false;
} else {
class="kw">return true;
}
}
class="kw">static boolean isAllowedByHostSubnets(@Nonnull InetAddress var0, @Nonnull List<IceAddressFilter.Subnet> var1) {
for (IceAddressFilter.Subnet var3 : var1) {
if (var0.equals(var3.address())) {
class="kw">return false;
}
}
class="kw">return !isPrivate(var0) || isInAnySubnet(var0, var1);
}
class="kw">static boolean isInAnySubnet(@Nonnull InetAddress var0, @Nonnull List<IceAddressFilter.Subnet> var1) {
for (IceAddressFilter.Subnet var3 : var1) {
if (isInSubnet(var0, var3)) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">private class="kw">static IceAddressFilter.InterfaceSubnetCache getInterfaceSubnetCache() {
IceAddressFilter.InterfaceSubnetCache var0 = interfaceSubnetCache;
long var1 = System.nanoTime();
class="kw">return var0 != null && !isInterfaceSubnetCacheExpired(var0, var1) ? var0 : refreshInterfaceSubnetCache(var1);
}
class="kw">private class="kw">static class="kw">synchronized IceAddressFilter.InterfaceSubnetCache refreshInterfaceSubnetCache(long var0) {
IceAddressFilter.InterfaceSubnetCache var2 = interfaceSubnetCache;
if (var2 != null && !isInterfaceSubnetCacheExpired(var2, var0)) {
class="kw">return var2;
}
ArrayList var3 = new ArrayList<>();
try {
Enumeration var4 = NetworkInterface.getNetworkInterfaces();
if (var4 != null) {
while (var4.hasMoreElements()) {
NetworkInterface var5 = var4.nextElement();
if (var5.isUp() && !var5.isLoopback()) {
for (InterfaceAddress var7 : var5.getInterfaceAddresses()) {
InetAddress var8 = var7.getAddress();
short var9 = var7.getNetworkPrefixLength();
if (var8 != null) {
var3.add(new IceAddressFilter.Subnet(var8, var9));
}
}
}
}
}
} catch (SocketException var10) {
if (!interfaceEnumerationFailureLogged) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var10)).log("Could not enumerate class="kw">interface subnets for ICE candidates");
interfaceEnumerationFailureLogged = true;
}
class="kw">return updateInterfaceSubnetCache(List.of(), var0);
}
class="kw">return updateInterfaceSubnetCache(List.copyOf(var3), var0);
}
class="kw">private class="kw">static IceAddressFilter.InterfaceSubnetCache updateInterfaceSubnetCache(List<IceAddressFilter.Subnet> var0, long var1) {
IceAddressFilter.InterfaceSubnetCache var3 = new IceAddressFilter.InterfaceSubnetCache(var0, var1);
interfaceSubnetCache = var3;
class="kw">return var3;
}
class="kw">private class="kw">static boolean isInterfaceSubnetCacheExpired(IceAddressFilter.InterfaceSubnetCache var0, long var1) {
class="kw">return var1 - var0.loadedAtNanos() >= INTERFACE_SUBNET_CACHE_EXPIRY.toNanos();
}
class="kw">private class="kw">static boolean isInSubnet(InetAddress var0, IceAddressFilter.Subnet var1) {
byte[] var2 = var0.getAddress();
byte[] var3 = var1.address().getAddress();
short var4 = var1.prefixLength();
if (var2.length == var3.length && var4 >= 0 && var4 <= var2.length * 8) {
int var5 = var4 / 8;
for (int var6 = 0; var6 < var5; var6++) {
if (var2[var6] != var3[var6]) {
class="kw">return false;
}
}
int var8 = var4 % 8;
if (var8 == 0) {
class="kw">return true;
}
int var7 = 255 << 8 - var8;
class="kw">return (var2[var5] & var7) == (var3[var5] & var7);
} else {
class="kw">return false;
}
}
class="kw">private class="kw">static boolean isPrivate(InetAddress var0) {
byte[] var1 = var0.getAddress();
if (!(var0 class="kw">instanceof Inet4Address)) {
class="kw">return (var1[0] & 254) == 252;
}
int var2 = var1[0] & 255;
int var3 = var1[1] & 255;
class="kw">return var2 == 10 || var2 == 172 && var3 >= 16 && var3 <= 31 || var2 == 192 && var3 == 168 || var2 == 100 && var3 >= 64 && var3 <= 127;
}
class="kw">private class="kw">static boolean isBroadcast(InetAddress var0) {
if (!(var0 class="kw">instanceof Inet4Address)) {
class="kw">return false;
}
byte[] var1 = var0.getAddress();
class="kw">return (var1[0] & 255) == 255 && (var1[1] & 255) == 255 && (var1[2] & 255) == 255 && (var1[3] & 255) == 255;
}
class="kw">private class="kw">static boolean isReserved(InetAddress var0) {
byte[] var1 = var0.getAddress();
if (var0 class="kw">instanceof Inet4Address) {
int var2 = var1[0] & 255;
int var3 = var1[1] & 255;
class="kw">return var2 == 0 || var2 >= 240 || var2 == 198 && (var3 & 254) == 18 || var2 == 192 && var3 == 0 && var1[2] == 0;
} else {
class="kw">return (var1[0] & 255) == 254 && (var1[1] & 192) == 192;
}
}
class="kw">private class="kw">static boolean hasUnsafeTranslatedIpv4(InetAddress var0) {
if (var0 class="kw">instanceof Inet4Address) {
class="kw">return false;
}
byte[] var1 = var0.getAddress();
int var2 = -1;
boolean var3 = false;
if ((var1[0] & 255) == 0 && (var1[1] & 255) == 100 && (var1[2] & 255) == 255 && (var1[3] & 255) == 155 && allZero(var1, 4, 12)) {
var2 = 12;
} else if ((var1[0] & 255) == 32 && (var1[1] & 255) == 2) {
var2 = 2;
} else if ((var1[0] & 255) == 32 && (var1[1] & 255) == 1 && var1[2] == 0 && var1[3] == 0) {
var2 = 12;
var3 = true;
}
if (var2 < 0) {
class="kw">return false;
}
byte[] var4 = new byte[4];
for (int var5 = 0; var5 < var4.length; var5++) {
var4[var5] = var3 ? (byte)(~var1[var2 + var5]) : var1[var2 + var5];
}
class="kw">return isUnsafeTranslatedIpv4(var4);
}
class="kw">private class="kw">static boolean allZero(byte[] var0, int var1, int var2) {
for (int var3 = var1; var3 < var2; var3++) {
if (var0[var3] != 0) {
class="kw">return false;
}
}
class="kw">return true;
}
class="kw">private class="kw">static boolean isUnsafeTranslatedIpv4(byte[] var0) {
int var1 = var0[0] & 255;
int var2 = var0[1] & 255;
class="kw">return var1 == 0
|| var1 == 10
|| var1 == 127
|| var1 >= 224
|| var1 == 169 && var2 == 254
|| var1 == 172 && var2 >= 16 && var2 <= 31
|| var1 == 192 && var2 == 168
|| var1 == 100 && var2 >= 64 && var2 <= 127
|| var1 == 192 && var2 == 0 && (var0[2] & 255) == 2
|| var1 == 198 && var2 == 51 && (var0[2] & 255) == 100
|| var1 == 203 && var2 == 0 && (var0[2] & 255) == 113;
}
class="kw">private class="kw">static boolean isDocumentation(InetAddress var0) {
byte[] var1 = var0.getAddress();
if (var0 class="kw">instanceof Inet4Address) {
if ((var1[0] & 255) == 192 && (var1[1] & 255) == 0 && (var1[2] & 255) == 2) {
class="kw">return true;
} else {
class="kw">return (var1[0] & 255) == 198 && (var1[1] & 255) == 51 && (var1[2] & 255) == 100
? true
: (var1[0] & 255) == 203 && (var1[1] & 255) == 0 && (var1[2] & 255) == 113;
}
} else {
class="kw">return (var1[0] & 255) == 32 && (var1[1] & 255) == 1 && (var1[2] & 255) == 13 && (var1[3] & 255) == 184;
}
}
class="kw">private record InterfaceSubnetCache(@Nonnull List<IceAddressFilter.Subnet> subnets, long loadedAtNanos) {
class="kw">private InterfaceSubnetCache {
}
}
record Subnet(@Nonnull InetAddress address, short prefixLength) {
Subnet {
}
}
}