complete login system for now, misc fixes
This commit is contained in:
parent
06a14ae645
commit
a6c2695ccb
26 changed files with 460 additions and 210 deletions
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue