From 0328c36bc9de9b42b918e0853be633b056b198f1 Mon Sep 17 00:00:00 2001 From: nidotls Date: Sat, 23 Mar 2024 03:09:04 +0100 Subject: [PATCH 1/2] chore: Add /32 to 127.0.53.53 to avoid warning in logs/console --- common/src/main/resources/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index bd885c1..f4eb345 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -40,7 +40,7 @@ ignore: - "10.0.0.0/8" - "100.64.0.0/10" - "127.0.0.0/8" - - "127.0.53.53" + - "127.0.53.53/32" - "169.254.0.0/16" - "172.16.0.0/12" - "192.0.0.0/24" From 9b699dde47e205f7fbb6937ecb4d4565e05354a6 Mon Sep 17 00:00:00 2001 From: nidotls Date: Sat, 23 Mar 2024 14:13:54 +0100 Subject: [PATCH 2/2] feat: Add discord webhook notify --- bukkit/pom.xml | 24 ++++++++++++ .../bukkit/listeners/PlayerJoinListener.java | 4 ++ bungee/pom.xml | 24 ++++++++++++ .../bungee/listeners/PostLoginListener.java | 2 + common/pom.xml | 6 +++ .../common/NetworkFilterCommon.java | 37 +++++++++++++++++-- .../common/NetworkFilterResult.java | 3 +- .../networkfilter/common/config/Config.java | 5 +++ .../config/notify/DiscordNotifySettings.java | 21 +++++++++++ .../common/config/notify/NotifySettings.java | 17 +++++++++ .../common/util/PlaceholderUtil.java | 1 + common/src/main/resources/config.yml | 16 +++++--- velocity/pom.xml | 24 ++++++++++++ .../velocity/listeners/PostLoginListener.java | 2 + 14 files changed, 175 insertions(+), 11 deletions(-) create mode 100644 common/src/main/java/ls/ni/networkfilter/common/config/notify/DiscordNotifySettings.java create mode 100644 common/src/main/java/ls/ni/networkfilter/common/config/notify/NotifySettings.java diff --git a/bukkit/pom.xml b/bukkit/pom.xml index d1d44f7..8333971 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -127,6 +127,30 @@ org.apache.commons.net ${project.parent.groupId}.libs.org.apache.commons.net + + club.minnced.discord.webhook + ${project.parent.groupId}.libs.club.minnced.discord.webhook + + + kotlin + ${project.parent.groupId}.libs.kotlin + + + okhttp3 + ${project.parent.groupId}.libs.okhttp3 + + + okio + ${project.parent.groupId}.libs.okio + + + org.json + ${project.parent.groupId}.libs.org.json + + + org.slf4j + ${project.parent.groupId}.libs.org.slf4j + diff --git a/bukkit/src/main/java/ls/ni/networkfilter/bukkit/listeners/PlayerJoinListener.java b/bukkit/src/main/java/ls/ni/networkfilter/bukkit/listeners/PlayerJoinListener.java index f72f58f..896f626 100644 --- a/bukkit/src/main/java/ls/ni/networkfilter/bukkit/listeners/PlayerJoinListener.java +++ b/bukkit/src/main/java/ls/ni/networkfilter/bukkit/listeners/PlayerJoinListener.java @@ -56,6 +56,10 @@ public void onEvent(PlayerJoinEvent event) { this.plugin.getServer().dispatchCommand( this.plugin.getServer().getConsoleSender(), command); } + + this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { + NetworkFilterCommon.getInstance().sendNotify(result, player.getName(), player.getUniqueId()); + }); }); }); } diff --git a/bungee/pom.xml b/bungee/pom.xml index 9e3da7d..7a26306 100644 --- a/bungee/pom.xml +++ b/bungee/pom.xml @@ -127,6 +127,30 @@ org.apache.commons.net ${project.parent.groupId}.libs.org.apache.commons.net + + club.minnced.discord.webhook + ${project.parent.groupId}.libs.club.minnced.discord.webhook + + + kotlin + ${project.parent.groupId}.libs.kotlin + + + okhttp3 + ${project.parent.groupId}.libs.okhttp3 + + + okio + ${project.parent.groupId}.libs.okio + + + org.json + ${project.parent.groupId}.libs.org.json + + + org.slf4j + ${project.parent.groupId}.libs.org.slf4j + diff --git a/bungee/src/main/java/ls/ni/networkfilter/bungee/listeners/PostLoginListener.java b/bungee/src/main/java/ls/ni/networkfilter/bungee/listeners/PostLoginListener.java index 3751f36..a511fea 100644 --- a/bungee/src/main/java/ls/ni/networkfilter/bungee/listeners/PostLoginListener.java +++ b/bungee/src/main/java/ls/ni/networkfilter/bungee/listeners/PostLoginListener.java @@ -79,6 +79,8 @@ public void onEvent(PostLoginEvent event) { this.plugin.getProxy().getPluginManager().dispatchCommand( this.plugin.getProxy().getConsole(), command); } + + NetworkFilterCommon.getInstance().sendNotify(result, player.getName(), player.getUniqueId()); }); } } diff --git a/common/pom.xml b/common/pom.xml index 98adb31..9bf9d87 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -53,6 +53,12 @@ caffeine 3.1.8 + + + club.minnced + discord-webhooks + 0.8.4 + diff --git a/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterCommon.java b/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterCommon.java index b6c2d9e..deed5cb 100644 --- a/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterCommon.java +++ b/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterCommon.java @@ -1,23 +1,28 @@ package ls.ni.networkfilter.common; -import jakarta.validation.constraints.Null; +import club.minnced.discord.webhook.WebhookClient; +import club.minnced.discord.webhook.send.WebhookEmbed; +import club.minnced.discord.webhook.send.WebhookEmbedBuilder; import lombok.Getter; import ls.ni.networkfilter.common.cache.Cache; import ls.ni.networkfilter.common.cache.CacheFactory; import ls.ni.networkfilter.common.config.Config; import ls.ni.networkfilter.common.config.ConfigManager; -import ls.ni.networkfilter.common.filter.*; +import ls.ni.networkfilter.common.filter.FilterException; +import ls.ni.networkfilter.common.filter.FilterResult; +import ls.ni.networkfilter.common.filter.FilterService; +import ls.ni.networkfilter.common.filter.FilterServiceFactory; +import ls.ni.networkfilter.common.util.PlaceholderUtil; import org.apache.commons.net.util.SubnetUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.net.Inet4Address; -import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.text.MessageFormat; import java.util.Optional; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -120,6 +125,7 @@ public void debug(String pattern, Object... arguments) { cached.get().block(), cached.get().asn(), cached.get().org(), + ip, true, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) ); @@ -146,6 +152,7 @@ public void debug(String pattern, Object... arguments) { false, -1, "Ignored Network", + ip, false, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) ); @@ -179,8 +186,30 @@ public void debug(String pattern, Object... arguments) { filterResult.block(), filterResult.asn(), filterResult.org(), + ip, false, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) ); } + + public void sendNotify(NetworkFilterResult result, String name, UUID uuid) { + if (this.getConfigManager().getConfig().getNotify().getDiscord().getEnabled()) { + String webhookUrl = this.getConfigManager().getConfig().getNotify().getDiscord().getWebhook(); + + try (WebhookClient client = WebhookClient.withUrl(webhookUrl)) { + String message = PlaceholderUtil.replace(this.getConfigManager().getConfig().getNotify().getDiscord().getMessage(), + result, name, uuid); + + WebhookEmbed embed = new WebhookEmbedBuilder() + .setColor(0xFF0000) + .setDescription(message) + .addField(new WebhookEmbed.EmbedField(true, "ASN", String.valueOf(result.asn()))) + .addField(new WebhookEmbed.EmbedField(true, "Organisation", String.valueOf(result.org()))) + .addField(new WebhookEmbed.EmbedField(true, "Took", result.tookMs() + "ms")) + .build(); + + client.send(embed); + } + } + } } diff --git a/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterResult.java b/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterResult.java index 115eed2..0d0878f 100644 --- a/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterResult.java +++ b/common/src/main/java/ls/ni/networkfilter/common/NetworkFilterResult.java @@ -1,6 +1,7 @@ package ls.ni.networkfilter.common; import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.NotNull; /** * @param blocked @@ -9,6 +10,6 @@ * @param cached * @param tookMs */ -public record NetworkFilterResult(boolean blocked, @Nullable Integer asn, @Nullable String org, boolean cached, +public record NetworkFilterResult(boolean blocked, @Nullable Integer asn, @Nullable String org, @NotNull String ip, boolean cached, long tookMs) { } diff --git a/common/src/main/java/ls/ni/networkfilter/common/config/Config.java b/common/src/main/java/ls/ni/networkfilter/common/config/Config.java index d8e6000..b77639d 100644 --- a/common/src/main/java/ls/ni/networkfilter/common/config/Config.java +++ b/common/src/main/java/ls/ni/networkfilter/common/config/Config.java @@ -9,6 +9,7 @@ import ls.ni.networkfilter.common.config.cache.CacheType; import ls.ni.networkfilter.common.config.consequence.ConsequenceSettings; import ls.ni.networkfilter.common.config.ignore.IgnoreSettings; +import ls.ni.networkfilter.common.config.notify.NotifySettings; import ls.ni.networkfilter.common.config.service.ServiceSettings; import ls.ni.networkfilter.common.config.service.ServiceType; @@ -45,4 +46,8 @@ public class Config { @Valid @NotNull private ConsequenceSettings consequences; + + @Valid + @NotNull + private NotifySettings notify; } diff --git a/common/src/main/java/ls/ni/networkfilter/common/config/notify/DiscordNotifySettings.java b/common/src/main/java/ls/ni/networkfilter/common/config/notify/DiscordNotifySettings.java new file mode 100644 index 0000000..74665b6 --- /dev/null +++ b/common/src/main/java/ls/ni/networkfilter/common/config/notify/DiscordNotifySettings.java @@ -0,0 +1,21 @@ +package ls.ni.networkfilter.common.config.notify; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DiscordNotifySettings { + + @NotNull + private Boolean enabled; + + @NotNull + private String webhook; + + @NotNull + private String message; +} diff --git a/common/src/main/java/ls/ni/networkfilter/common/config/notify/NotifySettings.java b/common/src/main/java/ls/ni/networkfilter/common/config/notify/NotifySettings.java new file mode 100644 index 0000000..fd8a6d9 --- /dev/null +++ b/common/src/main/java/ls/ni/networkfilter/common/config/notify/NotifySettings.java @@ -0,0 +1,17 @@ +package ls.ni.networkfilter.common.config.notify; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NotifySettings { + + @Valid + @NotNull + private DiscordNotifySettings discord; +} diff --git a/common/src/main/java/ls/ni/networkfilter/common/util/PlaceholderUtil.java b/common/src/main/java/ls/ni/networkfilter/common/util/PlaceholderUtil.java index ecaf528..5330f73 100644 --- a/common/src/main/java/ls/ni/networkfilter/common/util/PlaceholderUtil.java +++ b/common/src/main/java/ls/ni/networkfilter/common/util/PlaceholderUtil.java @@ -10,6 +10,7 @@ public class PlaceholderUtil { public static String replace(String message, NetworkFilterResult result, String name, UUID uuid) { message = message.replace("%asn%", Optional.ofNullable(result.asn()).map(String::valueOf).orElse("-1")); message = message.replace("%org%", Optional.ofNullable(result.org()).orElse("Unknown")); + message = message.replace("%ip%", result.ip()); message = message.replace("%name%", name); message = message.replace("%uuid%", uuid.toString()); diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index f4eb345..3db10b0 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -56,13 +56,17 @@ ignore: permission: "networkfilter.bypass" consequences: - # Available placeholders for message and commands: - # %asn% - Autonomous System Number - # %org% - Organization - # %name% - Player Name - # %uuid% - Player UUID kick: enabled: true - message: "§3§lNetworkFilter §8§l» §7Fehler beim Verbinden. Melde dich beim Support mit der Id §e%asn% (%org%)" + # Placeholders: %asn%, %org%, %name%, %uuid% + message: "§3§lNetworkFilter §8§l» §7Bei dir wurde eine VPN erkannt. Melde dich im Support mit der Id §e%asn% (%org%)" + # Placeholders: %asn%, %org%, %name%, %uuid% commands: - "" + +notify: + discord: + enabled: false + webhook: "" + # Placeholders: %asn%, %org%, %name%, %uuid% + message: "`%name%` (`%uuid%`) hat eine VPN und wurde gekickt" diff --git a/velocity/pom.xml b/velocity/pom.xml index 3bf90b5..7795cc3 100644 --- a/velocity/pom.xml +++ b/velocity/pom.xml @@ -135,6 +135,30 @@ org.apache.commons.net ${project.parent.groupId}.libs.org.apache.commons.net + + club.minnced.discord.webhook + ${project.parent.groupId}.libs.club.minnced.discord.webhook + + + kotlin + ${project.parent.groupId}.libs.kotlin + + + okhttp3 + ${project.parent.groupId}.libs.okhttp3 + + + okio + ${project.parent.groupId}.libs.okio + + + org.json + ${project.parent.groupId}.libs.org.json + + + org.slf4j + ${project.parent.groupId}.libs.org.slf4j + diff --git a/velocity/src/main/java/ls/ni/networkfilter/velocity/listeners/PostLoginListener.java b/velocity/src/main/java/ls/ni/networkfilter/velocity/listeners/PostLoginListener.java index 20976f1..9d7d082 100644 --- a/velocity/src/main/java/ls/ni/networkfilter/velocity/listeners/PostLoginListener.java +++ b/velocity/src/main/java/ls/ni/networkfilter/velocity/listeners/PostLoginListener.java @@ -53,6 +53,8 @@ public void onEvent(PostLoginEvent event) { this.plugin.getServer().getCommandManager().executeAsync( this.plugin.getServer().getConsoleCommandSource(), command); } + + NetworkFilterCommon.getInstance().sendNotify(result, player.getUsername(), player.getUniqueId()); }).schedule(); } }