diff --git a/Verify/src/main/java/de/mviper/verify/Verify.java b/Verify/src/main/java/de/mviper/verify/Verify.java new file mode 100644 index 0000000..d6c3e7f --- /dev/null +++ b/Verify/src/main/java/de/mviper/verify/Verify.java @@ -0,0 +1,146 @@ +package de.mviper.verify; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.net.*; +import java.io.*; +import java.nio.charset.Charset; + +public class Verify extends JavaPlugin implements CommandExecutor { + + private String wpVerifyUrl; + private String sharedSecret; + private int serverId; + + @Override + public void onEnable() { + saveDefaultConfig(); + wpVerifyUrl = getConfig().getString("wp_verify_url", "http://deine-wp-domain.tld"); + sharedSecret = getConfig().getString("shared_secret", "ChangeMe"); + serverId = getConfig().getInt("server_id", 0); + getCommand("verify").setExecutor(this); + getLogger().info("Verify enabled for server ID: " + serverId + " | WP URL: " + wpVerifyUrl); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage(ChatColor.RED + "Nur Spieler können diesen Befehl benutzen."); + return true; + } + Player p = (Player) sender; + if (args.length != 1) { + p.sendMessage(ChatColor.YELLOW + "Benutzung: /verify "); + return true; + } + String token = args[0].trim(); + String playerName = p.getName(); + + HttpURLConnection conn = null; + try { + // FIX: Explizit UTF-8 für die Signatur + Charset utf8 = Charset.forName("UTF-8"); + String signature = hmacSHA256(playerName + token, sharedSecret, utf8); + + // FIX: Explizit UTF-8 für den Payload + String payload = "{\"player\":\"" + escapeJson(playerName) + "\",\"token\":\"" + escapeJson(token) + "\",\"server_id\":" + serverId + ",\"signature\":\"" + signature + "\"}"; + + URL url = new URL(wpVerifyUrl + "/wp-json/mc-gallery/v1/verify"); + conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setReadTimeout(7000); + conn.setDoOutput(true); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + + try (OutputStream os = conn.getOutputStream()) { + os.write(payload.getBytes(utf8)); + } + + int code = conn.getResponseCode(); + String resp; + + // FIX: Antwort immer als UTF-8 lesen, egal ob 200 oder 403 + if (code >= 200 && code < 300) { + InputStream is = conn.getInputStream(); + resp = streamToString(is, utf8); + } else { + InputStream es = conn.getErrorStream(); + resp = streamToString(es, utf8); + } + + // Antwort parsen + if (resp != null && !resp.isEmpty() && resp.trim().startsWith("{")) { + // Erfolgreiche Übertragung, nun JSON parsen + + // Checken ob success true ist + boolean isSuccess = resp.contains("\"success\":true"); + + // Die message auslesen + String message = "Ein unbekannter Fehler ist aufgetreten."; + int keyIndex = resp.indexOf("\"message\":\""); + if (keyIndex != -1) { + int startIndex = keyIndex + 11; + int endIndex = resp.indexOf("\"", startIndex); + if (endIndex != -1) { + message = resp.substring(startIndex, endIndex); + } + } + + // Nachricht senden (mit Farbcodes) + if (isSuccess) { + p.sendMessage(ChatColor.GREEN + "✓ " + message); + p.sendMessage(ChatColor.GRAY + "Du kannst nun Bilder hochladen!"); + } else { + // Hier landen Fehler wie "Name stimmt nicht überein" oder 403 + // Durch die UTF-8 Lesung sollten Umlaute jetzt korrekt sein + p.sendMessage(ChatColor.RED + "✗ " + message); + } + } else { + p.sendMessage(ChatColor.RED + "✗ Fehler beim Verbinden mit der Webseite (Code: " + code + ")"); + } + } catch (Exception ex) { + p.sendMessage(ChatColor.RED + "✗ Ein interner Fehler ist aufgetreten."); + getLogger().warning("Verify error: " + ex.getMessage()); + ex.printStackTrace(); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + + return true; + } + + // FIX: UTF-8 als Parameter übergeben + private static String hmacSHA256(String data, String key, Charset charset) throws Exception { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(key.getBytes(charset), "HmacSHA256")); + byte[] raw = mac.doFinal(data.getBytes(charset)); + StringBuilder sb = new StringBuilder(); + for (byte b : raw) sb.append(String.format("%02x", b)); + return sb.toString(); + } + + // FIX: UTF-8 als Parameter übergeben + private static String streamToString(InputStream in, Charset charset) throws IOException { + if (in == null) return ""; + try (BufferedReader br = new BufferedReader(new InputStreamReader(in, charset))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) sb.append(line); + return sb.toString(); + } + } + + private static String escapeJson(String s) { + return s.replace("\\", "\\\\").replace("\"","\\\"").replace("\n","\\n").replace("\r","\\r"); + } +} \ No newline at end of file