package de.sebastianvonhelmersen; import de.sebastianvonhelmersen.authentication.Authenticator; import de.sebastianvonhelmersen.authentication.FetSite; import de.sebastianvonhelmersen.authentication.Ldap; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.logging.Level; public class fetmcplugin extends JavaPlugin implements Listener { private Database db; private Map allInfos = HashMap.newHashMap(0); private Authenticator authenticator; @Override public void onEnable() { // Make sure the plugin's data folder exists File dataFolder = this.getDataFolder(); this.authenticator = new FetSite("MyokpBxpqxw9Eo8IduwH9IFSnBy4qII6"); if (!dataFolder.exists()) { dataFolder.mkdirs(); } // Define the actual SQLite database file File dbFile = new File(dataFolder, "auth.db"); Bukkit.getPluginManager().registerEvents(this, this); this.db = new Database(dbFile); } @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { UUID uuid = event.getPlayer().getUniqueId(); AuthInfos authInfos = new AuthInfos(db, uuid); getLogger().log(Level.INFO,"Detected new Player with Auth State " + authInfos.getState().toString()); if( authInfos.getState() == AuthState.AUTHENTICATED ) { return; } allInfos.put(uuid, authInfos); String greeting = "Hallo, " + event.getPlayer().getName() +"! Willkommen auf dem MC Server der FET!\nBitte registriere dich mit deinen Anmeldedaten um zu beginnen!"; // Set timings: fadeIn = 0, stay = very long, fadeOut = 0 event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TIMES, net.kyori.adventure.title.Title.Times.times( java.time.Duration.ZERO, java.time.Duration.ofSeconds(9999), // basically "forever" java.time.Duration.ZERO ) ); // Send the title text event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TITLE, Component.text("§cBenutzername")); // Send the subtitle text event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.SUBTITLE, Component.text("§eBitte gib den Benutzernamen deines FET Accounts ein!")); event.getPlayer().sendMessage(greeting); event.getPlayer().setGameMode(GameMode.ADVENTURE); } @EventHandler public void onPlayerMove(PlayerMoveEvent event) { UUID uuid = event.getPlayer().getUniqueId(); event.getPlayer().setAllowFlight(true); if ( allInfos.containsKey(uuid) ) { event.setCancelled(true); return; } } @EventHandler public void onPlayerDamage(EntityDamageEvent event) { if ( event.getEntity() instanceof Player) { UUID uuid = event.getEntity().getUniqueId(); if ( allInfos.containsKey(uuid) ) { event.setCancelled(true); return; } } } @EventHandler public void onBlockPlace(BlockPlaceEvent event) { UUID uuid = event.getPlayer().getUniqueId(); if ( allInfos.containsKey(uuid) ) { event.setCancelled(true); return; } } @EventHandler public void onEntityTarget(EntityTargetLivingEntityEvent event) { if (event.getTarget() instanceof Player) { UUID uuid = event.getTarget().getUniqueId(); if ( allInfos.containsKey(uuid) ) { event.setCancelled(true); return; } } } @EventHandler public void onChat(AsyncPlayerChatEvent event) { UUID uuid = event.getPlayer().getUniqueId(); if (!allInfos.containsKey(uuid)) { return; } AuthInfos info = allInfos.get(uuid); String message = event.getMessage(); switch ( info.getState() ) { case AUTHENTICATED, AUTH_FAILED: break; case AUTH_WAITING_USERNAME: getLogger().log(Level.INFO, "Auth Waiting for Player " + event.getPlayer().getName()); allInfos.get(uuid).setUsername(message.trim()); getLogger().log(Level.INFO, "Got Username '" + message.trim() + "'"); event.setCancelled(true); event.getRecipients().clear(); // Send the title text event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TITLE, Component.text("§cPasswort")); // Send the subtitle text event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.SUBTITLE, Component.text("§eBitte gib das Password deines FET Accounts ein!")); break; case AUTH_WAITING_PASSWORD: boolean valid = validate(info.getUsername(), message.trim()); event.setCancelled(true); event.getRecipients().clear(); if(valid) { allInfos.remove(uuid); this.db.addPlayer(uuid.toString(), event.getPlayer().getName(), user); Bukkit.getScheduler().runTask(this, () -> { event.getPlayer().sendMessage( "Der Account " + event.getPlayer().getName() + " wurde erfolgreich mit dem FET Account " + user.ldapName + " verbunden!\r\n" + "Danke " + user.firstName + " " + user.lastName + " das du dich für den FET Server angemeldet hast! Ab jetzt kannst du so spielen wie du es gewohnt bist!"); event.getPlayer().setGameMode(GameMode.SURVIVAL); event.getPlayer().setHealth(20); event.getPlayer().setFoodLevel(20); event.getPlayer().setAllowFlight(false); event.getPlayer().resetTitle(); }); } else { event.getPlayer().sendMessage("That did not work, please try again!\nPlease enter your Username"); // Send the title text event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.TITLE, Component.text("§cBenutzername")); // Send the subtitle text event.getPlayer().sendTitlePart(net.kyori.adventure.title.TitlePart.SUBTITLE, Component.text("§eBitte gib den Benutzernamen deines FET Accounts ein!")); allInfos.get(uuid).reset(); } break; } return; } /* * This function uses the defined Authenticator instance to authenticate the User against their * provided username - token combination * @param username the username used to authenticate the player with the provider * @param token some sort of authentication methon. Can be Password, AppPassword or some other form of token the * provider takes to authenticate the user */ private boolean validate(String username, String token) { getLogger().log(Level.INFO, "Checking LDAP for user " + username); return authenticator.authenticate(username, token); } }