complete login system for now, misc fixes

This commit is contained in:
Sen 2025-05-31 00:23:35 +02:00
parent 06a14ae645
commit a6c2695ccb
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
26 changed files with 460 additions and 210 deletions

View file

@ -7,12 +7,12 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.security.KeyPair;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.text.SimpleDateFormat;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
@ -99,6 +99,7 @@ import server.command.Executor;
import server.command.FixedExecutor;
import server.network.HandshakeHandler;
import server.network.Player;
import server.network.User;
import server.world.Converter;
import server.world.Region;
import server.world.WorldServer;
@ -113,7 +114,8 @@ public final class Server implements IThreadListener {
private final Thread serverThread = Thread.currentThread();
private final List<NetConnection> clients = Collections.<NetConnection>synchronizedList(Lists.<NetConnection>newArrayList());
private final List<Player> players = Lists.<Player>newArrayList();
private final Map<String, Player> usermap = Maps.<String, Player>newHashMap();
private final Map<String, Player> online = Maps.<String, Player>newHashMap();
private final Map<String, User> users = Maps.newTreeMap();
private final Queue<FutureTask<?>> queue = new ArrayDeque<FutureTask<?>>();
private final long[] tickTimes = new long[100];
private final Map<Integer, WorldServer> dimensions = Maps.newTreeMap();
@ -277,20 +279,19 @@ public final class Server implements IThreadListener {
return this.scriptEnv;
}
public String[] getUsers() {
public List<String> getPlayerFilenames() {
String[] list = this.debug ? null : new File("players").list();
if(list == null) {
list = new String[0];
}
if(list == null)
return Lists.newArrayList();
List<String> names = Lists.newArrayList();
for(int i = 0; i < list.length; ++i) {
if(list[i].endsWith(".cdt")) {
list[i] = list[i].substring(0, list[i].length() - 4);
// Player player = this.getPlayer(list[i]);
// if(player != null)
// list[i] = player.getUser();
String name = list[i].substring(0, list[i].length() - 4);
if(IPlayer.isValidUser(name))
names.add(name);
}
}
return list;
return names;
}
public void saveWorldInfo() {
@ -469,6 +470,7 @@ public final class Server implements IThreadListener {
Log.SYSTEM.info("Generiere neues Schlüsselpaar");
this.keyPair = EncryptUtil.createKeypair();
}
User.loadDatabase(this.users);
// if(dtime == -1L) // {
// dtime = World.START_TIME;
//// Config.set("spawnDim", "1", null);
@ -772,7 +774,7 @@ public final class Server implements IThreadListener {
this.timePassed = this.ticksTodo = this.ticksDone = 0L;
}
public List<String> getAllUsernames() {
public List<String> getAllPlayerNames() {
List<String> list = new ArrayList<String>(this.players.size());
for(int z = 0; z < this.players.size(); z++) {
list.add(this.players.get(z).getUser());
@ -780,12 +782,24 @@ public final class Server implements IThreadListener {
return list;
}
public List<String> getAllUserNames() {
return Lists.newArrayList(this.users.keySet());
}
public List<Player> getPlayers() {
return this.players;
}
public Collection<User> getUsers() {
return this.users.values();
}
public Player getPlayer(String user) {
return this.usermap.get(user);
return this.online.get(user);
}
public User getUser(String user) {
return this.users.get(user);
}
private <V> ListenableFuture<V> callFromMainThread(Callable<V> callable) {
@ -848,43 +862,16 @@ public final class Server implements IThreadListener {
radius > 0 ? (-180.0f + world.rand.floatv() * 360.0f) : Config.spawnYaw,
radius > 0 ? 0.0f : Config.spawnPitch, world.dimension.getDimensionId());
}
public void addUser(User user) {
this.users.put(user.getUser(), user);
}
public String addPlayer(NetConnection connection, String loginUser, String loginPass, PublicKey loginKey) {
public void addPlayer(NetConnection connection, String loginUser) {
TagObject tag = this.readPlayer(loginUser);
Player conn = new Player(this, connection, loginUser);
if(tag != null)
conn.readTags(tag);
if(Config.authenticate) {
if(conn.getPasswordHash() == null && conn.getPubkey() == null) {
if(tag != null)
return loginKey != null ? "Falscher Pubkey" : "Falsches Passwort";
if(!Config.register)
return "Anmeldung neuer Accounts ist auf diesem Server deaktiviert (Whitelisted)";
if(Config.playerLimit > 0 && this.players.size() >= Config.playerLimit)
return String.format("Der Server ist voll (%d/%d)!", this.players.size(), Config.playerLimit);
if(loginKey != null) {
conn.setPubkey(loginKey);
Log.NETWORK.info(loginUser + " registrierte sich mit Pubkey");
}
else {
if(loginPass == null || loginPass.length() == 0)
return "Ein neues Passwort ist erforderlich um diesen Server zu betreten (mindestens " + Config.minPassLength + " Zeichen)";
if(loginPass.length() < Config.minPassLength)
return "Passwort ist zu kurz, mindestens " + Config.minPassLength + " Zeichen";
conn.setPasswordHash(EncryptUtil.hashPassword(loginPass));
Log.NETWORK.info(loginUser + " registrierte sich mit Passwort");
}
}
else if(conn.getPubkey() != null ? !conn.getPubkey().equals(loginKey) :
(loginPass == null || !MessageDigest.isEqual(EncryptUtil.hashPassword(loginPass, conn.getPasswordHash().second()), conn.getPasswordHash().first()))) {
return loginKey != null ? "Falscher Pubkey" : "Falsches Passwort";
}
else {
Log.NETWORK.info(loginUser + " loggte sich mit " + (loginKey != null ? "Pubkey" : "Passwort") + " ein");
}
}
if(Config.playerLimit > 0 && this.players.size() >= Config.playerLimit && !conn.isAdmin())
return String.format("Der Server ist voll (%d/%d)!", this.players.size(), Config.playerLimit);
if(Config.compression >= 0) {
connection.sendPacket(new RPacketEnableCompression(Config.compression), new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) throws Exception {
@ -895,7 +882,11 @@ public final class Server implements IThreadListener {
connection.sendPacket(new RPacketLoginSuccess(this.debug));
connection.setNetHandler(conn);
this.players.add(conn);
this.usermap.put(loginUser, conn);
User user = this.users.remove(loginUser);
if(user != null)
conn.copyFrom(user);
this.users.put(loginUser, conn);
this.online.put(loginUser, conn);
tag = conn.readCharacter();
WorldServer world = tag == null ? this.space : this.getWorld(tag.getInt("Dimension"));
@ -936,7 +927,6 @@ public final class Server implements IThreadListener {
conn.sendPacket(new SPacketPlayerAbilities(player));
conn.addSelfToInternalCraftingInventory();
conn.onConnect();
return null;
}
public void removePlayer(Player conn) {
@ -947,7 +937,10 @@ public final class Server implements IThreadListener {
world.removeEntity(player);
world.removePlayer(player);
this.players.remove(conn);
this.usermap.remove(conn.getUser());
this.online.remove(conn.getUser());
User user = new User(conn.getUser());
user.copyFrom(conn);
this.users.put(conn.getUser(), user);
this.sendPacket(new SPacketPlayerListItem(true, conn));
}
@ -1215,7 +1208,7 @@ public final class Server implements IThreadListener {
for(Player conn : this.players) {
this.writePlayer(conn);
}
// this.saveUsers();
User.saveDatabase(this.users);
}
private void updateTimeAndWeatherForPlayer(Player conn, WorldServer world) {