diff --git a/LaunchServer/source/auth/handler/CachedAuthHandler.java b/LaunchServer/source/auth/handler/CachedAuthHandler.java index 6e40b38..2aa40d3 100644 --- a/LaunchServer/source/auth/handler/CachedAuthHandler.java +++ b/LaunchServer/source/auth/handler/CachedAuthHandler.java @@ -25,7 +25,7 @@ @Override public final synchronized UUID auth(String username, String accessToken) throws IOException { Entry entry = getEntry(username); - if (entry == null || !updateAuth(entry.uuid, username, accessToken)) { + if (entry == null || !updateAuth(entry.uuid, entry.username, accessToken)) { return null; // Account doesn't exist } diff --git a/LaunchServer/source/auth/handler/FileAuthHandler.java b/LaunchServer/source/auth/handler/FileAuthHandler.java index 98fd59f..05e4908 100644 --- a/LaunchServer/source/auth/handler/FileAuthHandler.java +++ b/LaunchServer/source/auth/handler/FileAuthHandler.java @@ -27,7 +27,7 @@ public abstract class FileAuthHandler extends AuthHandler { @LauncherAPI public final Path file; - @LauncherAPI public final boolean md5UUIDs; + @LauncherAPI public final boolean offlineUUIDs; // Instance private final SecureRandom random = SecurityHelper.newRandom(); @@ -41,7 +41,9 @@ protected FileAuthHandler(BlockConfigEntry block) { super(block); file = IOHelper.toPath(block.getEntryValue("file", StringConfigEntry.class)); - md5UUIDs = block.getEntryValue("md5UUIDs", BooleanConfigEntry.class); + offlineUUIDs = block.getEntryValue("offlineUUIDs", BooleanConfigEntry.class); + + // Read auth handler file if (IOHelper.isFile(file)) { LogHelper.info("Reading auth handler file"); try { @@ -162,12 +164,12 @@ protected abstract void writeAuthFile() throws IOException; private UUID genUUIDFor(String username) { - if (md5UUIDs) { + if (offlineUUIDs) { UUID md5UUID = PlayerProfile.md5UUID(username); if (!authsMap.containsKey(md5UUID)) { return md5UUID; } - LogHelper.warning("MD5 UUID has been already registered, using random: '%s'", username); + LogHelper.warning("Offline UUID collision, using random: '%s'", username); } // Pick random UUID diff --git a/Launcher/source/Launcher.java b/Launcher/source/Launcher.java index da1b3f8..6738903 100644 --- a/Launcher/source/Launcher.java +++ b/Launcher/source/Launcher.java @@ -262,13 +262,15 @@ @LauncherAPI public final RSAPublicKey publicKey; @LauncherAPI public final Map runtime; + @LauncherAPI @SuppressWarnings("AssignmentToCollectionOrArrayFieldFromParameter") public Config(String address, int port, RSAPublicKey publicKey, Map runtime) { this.address = InetSocketAddress.createUnresolved(address, port); - this.publicKey = publicKey; - this.runtime = runtime; + this.publicKey = Objects.requireNonNull(publicKey, "publicKey"); + this.runtime = Collections.unmodifiableMap(new HashMap<>(runtime)); } + @LauncherAPI public Config(HInput input) throws IOException, InvalidKeySpecException { String localAddress = input.readASCII(255); address = InetSocketAddress.createUnresolved( diff --git a/Launcher/source/client/ClientLauncher.java b/Launcher/source/client/ClientLauncher.java index 562ca51..885cfd4 100644 --- a/Launcher/source/client/ClientLauncher.java +++ b/Launcher/source/client/ClientLauncher.java @@ -307,7 +307,7 @@ // Client params this.pp = pp; - this.accessToken = accessToken; + this.accessToken = SecurityHelper.verifyToken(accessToken); this.autoEnter = autoEnter; this.fullScreen = fullScreen; this.ram = ram; diff --git a/Launcher/source/client/PlayerProfile.java b/Launcher/source/client/PlayerProfile.java index 95e6794..a8d6bd9 100644 --- a/Launcher/source/client/PlayerProfile.java +++ b/Launcher/source/client/PlayerProfile.java @@ -1,6 +1,7 @@ package launcher.client; import java.io.IOException; +import java.util.Objects; import java.util.UUID; import launcher.LauncherAPI; @@ -31,10 +32,10 @@ @LauncherAPI public PlayerProfile(UUID uuid, String username, String skinURL, String cloakURL) { - this.uuid = uuid; - this.username = username; - this.skinURL = skinURL; - this.cloakURL = cloakURL; + this.uuid = Objects.requireNonNull(uuid, "uuid"); + this.username = VerifyHelper.verifyUsername(username); + this.skinURL = skinURL == null ? null : IOHelper.verifyURL(skinURL); + this.cloakURL = cloakURL == null ? null : IOHelper.verifyURL(cloakURL); } @Override diff --git a/Launcher/source/hasher/DirWatcher.java b/Launcher/source/hasher/DirWatcher.java index 32ae5a7..d165135 100644 --- a/Launcher/source/hasher/DirWatcher.java +++ b/Launcher/source/hasher/DirWatcher.java @@ -13,6 +13,7 @@ import java.util.Collection; import java.util.Deque; import java.util.LinkedList; +import java.util.Objects; import com.sun.nio.file.ExtendedWatchEventModifier; import com.sun.nio.file.SensitivityWatchEventModifier; @@ -41,8 +42,8 @@ @LauncherAPI public DirWatcher(Path dir, HashedDir hdir, FileNameMatcher matcher) throws IOException { - this.dir = dir; - this.hdir = hdir; + this.dir = Objects.requireNonNull(dir, "dir"); + this.hdir = Objects.requireNonNull(hdir, "hdir"); this.matcher = matcher; service = dir.getFileSystem().newWatchService(); diff --git a/Launcher/source/hasher/HashedFile.java b/Launcher/source/hasher/HashedFile.java index b4b0256..9f59a84 100644 --- a/Launcher/source/hasher/HashedFile.java +++ b/Launcher/source/hasher/HashedFile.java @@ -7,6 +7,7 @@ import launcher.LauncherAPI; import launcher.helper.IOHelper; import launcher.helper.SecurityHelper; +import launcher.helper.VerifyHelper; import launcher.serialize.HInput; import launcher.serialize.HOutput; @@ -19,7 +20,8 @@ @LauncherAPI public HashedFile(long size, byte[] digest) { - this.size = size; + this.size = VerifyHelper.verifyLong(size, + VerifyHelper.L_NOT_NEGATIVE, "Illegal size: " + size); this.digest = Arrays.copyOf(digest, digest.length); } diff --git a/Launcher/source/request/auth/AuthRequest.java b/Launcher/source/request/auth/AuthRequest.java index 3fccd5c..02b3ea2 100644 --- a/Launcher/source/request/auth/AuthRequest.java +++ b/Launcher/source/request/auth/AuthRequest.java @@ -8,6 +8,7 @@ import launcher.client.PlayerProfile; import launcher.helper.IOHelper; import launcher.helper.SecurityHelper; +import launcher.helper.VerifyHelper; import launcher.request.Request; import launcher.serialize.HInput; import launcher.serialize.HOutput; @@ -19,7 +20,7 @@ @LauncherAPI public AuthRequest(Launcher.Config config, String login, byte[] encryptedPassword) { super(config); - this.login = login; + this.login = VerifyHelper.verify(login, VerifyHelper.NOT_EMPTY, "Login can't be empty"); this.encryptedPassword = Arrays.copyOf(encryptedPassword, encryptedPassword.length); } diff --git a/Launcher/source/request/update/UpdateRequest.java b/Launcher/source/request/update/UpdateRequest.java index e99a64a..862a7c4 100644 --- a/Launcher/source/request/update/UpdateRequest.java +++ b/Launcher/source/request/update/UpdateRequest.java @@ -11,6 +11,7 @@ import java.time.Instant; import java.util.ArrayDeque; import java.util.Map; +import java.util.Objects; import java.util.Queue; import launcher.Launcher; @@ -47,7 +48,7 @@ public UpdateRequest(Launcher.Config config, String dirName, Path dir, FileNameMatcher matcher) { super(config); this.dirName = IOHelper.verifyFileName(dirName); - this.dir = dir; + this.dir = Objects.requireNonNull(dir, "dir"); this.matcher = matcher; } diff --git a/Launcher/source/request/uuid/ProfileByUUIDRequest.java b/Launcher/source/request/uuid/ProfileByUUIDRequest.java index acfe04b..c568b3d 100644 --- a/Launcher/source/request/uuid/ProfileByUUIDRequest.java +++ b/Launcher/source/request/uuid/ProfileByUUIDRequest.java @@ -1,6 +1,7 @@ package launcher.request.uuid; import java.io.IOException; +import java.util.Objects; import java.util.UUID; import launcher.Launcher; @@ -16,7 +17,7 @@ @LauncherAPI public ProfileByUUIDRequest(Launcher.Config config, UUID uuid) { super(config); - this.uuid = uuid; + this.uuid = Objects.requireNonNull(uuid, "uuid"); } @LauncherAPI diff --git a/Launcher/source/serialize/HInput.java b/Launcher/source/serialize/HInput.java index 5c5e8db..97c9b96 100644 --- a/Launcher/source/serialize/HInput.java +++ b/Launcher/source/serialize/HInput.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; +import java.util.Objects; import java.util.UUID; import launcher.LauncherAPI; @@ -15,7 +16,7 @@ @LauncherAPI public HInput(InputStream stream) { - this.stream = stream; + this.stream = Objects.requireNonNull(stream, "stream"); } @LauncherAPI diff --git a/Launcher/source/serialize/HOutput.java b/Launcher/source/serialize/HOutput.java index 81983bb..225579a 100644 --- a/Launcher/source/serialize/HOutput.java +++ b/Launcher/source/serialize/HOutput.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.OutputStream; import java.math.BigInteger; +import java.util.Objects; import java.util.UUID; import launcher.LauncherAPI; @@ -14,7 +15,7 @@ @LauncherAPI public HOutput(OutputStream stream) { - this.stream = stream; + this.stream = Objects.requireNonNull(stream, "stream"); } @Override