From e30e74935172b98e5d4f0b9970fce6a92233085b Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Wed, 3 Jul 2019 16:14:49 +0300 Subject: [PATCH] =?UTF-8?q?[FEATURE]=20=D0=90=D0=B2=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20ZIP=20=D0=B0=D1=80?= =?UTF-8?q?=D1=85=D0=B8=D0=B2=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=B4?= =?UTF-8?q?=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=B9=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=81=D0=BE=D0=BC=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B5=2032M?= =?UTF-8?q?B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/launchserver/LaunchServer.java | 40 ++++++++- .../command/basic/TestCommand.java | 2 - .../gravit/launchserver/dao/UserService.java | 2 - .../manangers/CertificateManager.java | 8 -- .../manangers/LaunchServerGsonManager.java | 3 - .../socket/LauncherNettyServer.java | 3 +- .../launchserver/socket/WebSocketService.java | 3 +- .../handlers/NettyServerSocketHandler.java | 4 +- .../handlers/WebSocketFrameHandler.java | 5 -- .../fileserver/FileServerHandler.java | 85 +++---------------- .../launcher/downloader/ListDownloader.java | 28 +++--- .../gravit/launcher/events/ControlEvent.java | 1 + .../events/request/AuthRequestEvent.java | 2 - .../BatchProfileByUsernameRequestEvent.java | 2 - .../request/CheckServerRequestEvent.java | 3 +- .../request/JoinServerRequestEvent.java | 1 + .../events/request/LauncherRequestEvent.java | 1 + .../request/ProfileByUUIDRequestEvent.java | 1 + .../ProfileByUsernameRequestEvent.java | 1 + .../events/request/ProfilesRequestEvent.java | 1 + .../request/SetProfileRequestEvent.java | 1 + .../request/UpdateListRequestEvent.java | 1 + .../launcher/request/auth/AuthRequest.java | 1 - .../request/update/UpdateRequest.java | 4 + .../websockets/ClientWebSocketService.java | 1 - .../StandartClientWebSocketService.java | 3 - .../pro/gravit/launcher/hasher/HashedDir.java | 6 +- .../pro/gravit/utils/helper/IOHelper.java | 9 ++ 28 files changed, 97 insertions(+), 125 deletions(-) diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java index 3b746f13..302b9c74 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java @@ -31,12 +31,14 @@ import java.util.Timer; import java.util.concurrent.atomic.AtomicBoolean; import java.util.zip.CRC32; +import java.util.zip.ZipOutputStream; import io.netty.handler.logging.LogLevel; import pro.gravit.launcher.Launcher; import pro.gravit.launcher.LauncherConfig; import pro.gravit.launcher.NeedGarbageCollection; import pro.gravit.launcher.hasher.HashedDir; +import pro.gravit.launcher.hasher.HashedEntry; import pro.gravit.launcher.hwid.HWIDProvider; import pro.gravit.launcher.managers.ConfigManager; import pro.gravit.launcher.managers.GarbageManager; @@ -65,7 +67,6 @@ import pro.gravit.launchserver.components.Component; import pro.gravit.launchserver.components.RegLimiterComponent; import pro.gravit.launchserver.config.LaunchServerRuntimeConfig; -import pro.gravit.launchserver.dao.UserService; import pro.gravit.launchserver.dao.provider.DaoProvider; import pro.gravit.launchserver.manangers.*; import pro.gravit.launchserver.manangers.hook.AuthHookManager; @@ -457,6 +458,8 @@ public static void main(String... args) throws Throwable { public final Timer taskPool; + public final Path optimizedUpdatesDir; + public static Class defaultLauncherEXEBinaryClass = null; public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException, InvalidKeySpecException { @@ -485,6 +488,7 @@ public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException publicKeyFile = dir.resolve("public.key"); privateKeyFile = dir.resolve("private.key"); updatesDir = dir.resolve("updates"); + optimizedUpdatesDir = dir.resolve("optimized_updates"); profilesDir = dir.resolve("profiles"); //Registration handlers and providers @@ -634,6 +638,9 @@ public LaunchServer(Path dir, boolean testEnv, String[] args) throws IOException // Sync updates dir if (!IOHelper.isDir(updatesDir)) Files.createDirectory(updatesDir); + if (!IOHelper.isDir(optimizedUpdatesDir)) + Files.createDirectory(optimizedUpdatesDir); + updatesDirMap = null; syncUpdatesDir(null); // Sync profiles dir @@ -872,6 +879,7 @@ public void syncProfilesDir() throws IOException { public void syncUpdatesDir(Collection dirs) throws IOException { LogHelper.info("Syncing updates dir"); + boolean start = updatesDirMap == null; Map> newUpdatesDirMap = new HashMap<>(16); try (DirectoryStream dirStream = Files.newDirectoryStream(updatesDir)) { for (final Path updateDir : dirStream) { @@ -894,17 +902,43 @@ public void syncUpdatesDir(Collection dirs) throws IOException { continue; } } - // Sync and sign update dir LogHelper.info("Syncing '%s' update dir", name); HashedDir updateHDir = new HashedDir(updateDir, null, true, true); + if (!start) processUpdate(updateDir, updateHDir, name); newUpdatesDirMap.put(name, new SignedObjectHolder<>(updateHDir, privateKey)); } } updatesDirMap = Collections.unmodifiableMap(newUpdatesDirMap); } - public void restart() { + private void processUpdate(Path updateDir, HashedDir updateHDir, String name) throws IOException { + updateHDir.walk(IOHelper.CROSS_SEPARATOR, (path, filename, entry) -> { + if (entry.getType().equals(HashedEntry.Type.DIR)) { + if (entry.size() < IOHelper.MB32) { + Path p = updateDir.resolve(path); + Path out = optimizedUpdatesDir.resolve(name).resolve(path); + try (ZipOutputStream compressed = new ZipOutputStream(IOHelper.newOutput(out))) { + IOHelper.walk(p, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + compressed.putNextEntry(IOHelper.newZipEntry( + p.relativize(file).toString() + .replace(IOHelper.PLATFORM_SEPARATOR, IOHelper.CROSS_SEPARATOR))); + IOHelper.transfer(file, compressed); + return super.visitFile(file, attrs); + } + }, true); + } + return HashedDir.WalkAction.SKIP_DIR; + } + } + return HashedDir.WalkAction.CONTINUE; + }); + + } + + public void restart() { ProcessBuilder builder = new ProcessBuilder(); if (config.startScript != null) builder.command(Collections.singletonList(config.startScript)); else throw new IllegalArgumentException("Please create start script and link it as startScript in config."); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java index c5deec73..1f85bca8 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/TestCommand.java @@ -1,7 +1,6 @@ package pro.gravit.launchserver.command.basic; import org.bouncycastle.cert.X509CertificateHolder; -import pro.gravit.launcher.events.PingEvent; import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.command.Command; import pro.gravit.launchserver.socket.handlers.NettyServerSocketHandler; @@ -9,7 +8,6 @@ import java.nio.file.Paths; import java.security.KeyPair; -import java.security.KeyPairGenerator; public class TestCommand extends Command { public TestCommand(LaunchServer server) { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/dao/UserService.java b/LaunchServer/src/main/java/pro/gravit/launchserver/dao/UserService.java index 3379ecd2..5dd205d3 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/dao/UserService.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/dao/UserService.java @@ -3,8 +3,6 @@ import java.util.List; import java.util.UUID; -import pro.gravit.launchserver.LaunchServer; - public class UserService { private final UserDAO usersDao; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java index cae36ff7..4b1de19e 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java @@ -1,22 +1,16 @@ package pro.gravit.launchserver.manangers; - import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.asn1.x500.X500NameBuilder; import org.bouncycastle.asn1.x500.style.BCStyle; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; -import org.bouncycastle.cert.CertIOException; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cert.X509v3CertificateBuilder; import org.bouncycastle.crypto.params.AsymmetricKeyParameter; -import org.bouncycastle.crypto.params.ECKeyParameters; import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.PrivateKeyInfoFactory; -import org.bouncycastle.jce.ECNamedCurveTable; -import org.bouncycastle.jce.spec.ECParameterSpec; -import org.bouncycastle.openssl.PEMWriter; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder; import org.bouncycastle.operator.OperatorCreationException; @@ -27,12 +21,10 @@ import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.SecurityHelper; -import java.io.FileWriter; import java.io.IOException; import java.math.BigInteger; import java.nio.file.Path; import java.security.*; -import java.security.cert.CertificateException; import java.security.spec.ECGenParameterSpec; import java.time.Instant; import java.time.LocalDate; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java index 6b804245..800ab194 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java @@ -2,14 +2,11 @@ import com.google.gson.GsonBuilder; -import pro.gravit.launcher.hasher.HashedEntry; -import pro.gravit.launcher.hasher.HashedEntryAdapter; import pro.gravit.launcher.hwid.HWID; import pro.gravit.launcher.hwid.HWIDProvider; import pro.gravit.launcher.managers.GsonManager; import pro.gravit.launcher.request.JsonResultSerializeAdapter; import pro.gravit.launcher.request.WebSocketEvent; -import pro.gravit.launcher.request.websockets.ClientWebSocketService; import pro.gravit.launchserver.auth.handler.AuthHandler; import pro.gravit.launchserver.auth.hwid.HWIDHandler; import pro.gravit.launchserver.auth.permissions.PermissionsHandler; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java index c0b5b205..8e813bbc 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java @@ -1,6 +1,7 @@ package pro.gravit.launchserver.socket; import java.net.InetSocketAddress; +import java.util.Arrays; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; @@ -63,7 +64,7 @@ public void initChannel(SocketChannel ch) { pipeline.addLast(new WebSocketServerCompressionHandler()); pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true)); if (server.config.netty.fileServerEnabled) - pipeline.addLast(new FileServerHandler(server.updatesDir, true)); + pipeline.addLast(new FileServerHandler(Arrays.asList(server.updatesDir, server.optimizedUpdatesDir))); pipeline.addLast(new WebSocketFrameHandler(context, server, service)); } }); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java index 98539d6d..06ee9636 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/WebSocketService.java @@ -58,7 +58,8 @@ public WebSocketService(ChannelGroup channels, LaunchServer server) { private static final HashMap responses = new HashMap<>(); private final Gson gson; - public void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) { + @SuppressWarnings("unchecked") + public void process(ChannelHandlerContext ctx, TextWebSocketFrame frame, Client client, String ip) { String request = frame.text(); WebSocketServerResponse response = gson.fromJson(request, WebSocketServerResponse.class); if (server.config.netty.proxy.enabled) { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/NettyServerSocketHandler.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/NettyServerSocketHandler.java index e87f814d..7fde4af6 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/NettyServerSocketHandler.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/NettyServerSocketHandler.java @@ -23,9 +23,9 @@ import pro.gravit.launchserver.socket.LauncherNettyServer; import pro.gravit.utils.helper.LogHelper; -@SuppressWarnings({"unused", "rawtypes"}) +@SuppressWarnings("unused") public final class NettyServerSocketHandler implements Runnable, AutoCloseable { - private SSLServerSocketFactory ssf; + private SSLServerSocketFactory ssf; public volatile boolean logConnections = Boolean.getBoolean("launcher.logConnections"); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/WebSocketFrameHandler.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/WebSocketFrameHandler.java index 2e5e1ed6..05f66935 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/WebSocketFrameHandler.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/WebSocketFrameHandler.java @@ -2,22 +2,17 @@ import java.util.concurrent.TimeUnit; -import com.google.gson.GsonBuilder; - import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.group.DefaultChannelGroup; import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty.handler.codec.http.websocketx.PingWebSocketFrame; import io.netty.handler.codec.http.websocketx.PongWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketFrame; -import io.netty.util.concurrent.GlobalEventExecutor; import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.socket.Client; import pro.gravit.launchserver.socket.NettyConnectContext; import pro.gravit.launchserver.socket.WebSocketService; -import pro.gravit.utils.helper.CommonHelper; import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.LogHelper; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/fileserver/FileServerHandler.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/fileserver/FileServerHandler.java index 88e762ac..eaaaba87 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/fileserver/FileServerHandler.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/handlers/fileserver/FileServerHandler.java @@ -3,7 +3,6 @@ import static io.netty.handler.codec.http.HttpMethod.GET; import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST; import static io.netty.handler.codec.http.HttpResponseStatus.FORBIDDEN; -import static io.netty.handler.codec.http.HttpResponseStatus.FOUND; import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR; import static io.netty.handler.codec.http.HttpResponseStatus.METHOD_NOT_ALLOWED; import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND; @@ -22,13 +21,13 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.TimeZone; -import java.util.regex.Pattern; import javax.activation.MimetypesFileTypeMap; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -48,6 +47,8 @@ import io.netty.handler.codec.http.LastHttpContent; import io.netty.handler.stream.ChunkedFile; import io.netty.util.CharsetUtil; +import pro.gravit.utils.helper.IOHelper; +import pro.gravit.utils.helper.LogHelper; public class FileServerHandler extends SimpleChannelInboundHandler { @@ -56,12 +57,10 @@ public class FileServerHandler extends SimpleChannelInboundHandler base; - public FileServerHandler(Path base, boolean fullOut) { + public FileServerHandler(List base) { this.base = base; - this.fullOut = fullOut; } @Override @@ -83,13 +82,13 @@ public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) thr return; } - File file = base.resolve(path).toFile(); - if (file.isHidden() || !file.exists()) { + Optional fileO = base.stream().map(t -> t.resolve(path)).filter(t -> IOHelper.isFile(t) && !IOHelper.isHidden(t)).map(t -> t.toFile()).findFirst(); + if (!fileO.isPresent()) { sendError(ctx, NOT_FOUND); return; } - - if (file.isDirectory()) { + File file = fileO.get(); + /*if (file.isDirectory()) { if (fullOut) { if (uri.endsWith("/")) { sendListing(ctx, file, uri); @@ -98,12 +97,12 @@ public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) thr } } else sendError(ctx, NOT_FOUND); // can not handle dirs return; - } + }*/ - if (!file.isFile()) { + /*if (!file.isFile()) { sendError(ctx, FORBIDDEN); return; - } + }*/ // Cache Validation String ifModifiedSince = request.headers().get(HttpHeaderNames.IF_MODIFIED_SINCE); @@ -166,14 +165,12 @@ public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) thr @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - cause.printStackTrace(); + LogHelper.error(cause); if (ctx.channel().isActive()) { sendError(ctx, INTERNAL_SERVER_ERROR); } } - private static final Pattern INSECURE_URI = Pattern.compile(".*[<>&\"].*"); - private static String sanitizeUri(String uri) { // Decode the path. try { @@ -192,60 +189,6 @@ private static String sanitizeUri(String uri) { return Paths.get(uri).normalize().toString().substring(1); } - private static final Pattern ALLOWED_FILE_NAME = Pattern.compile("[^-\\._]?[^<>&\\\"]*"); - - private static void sendListing(ChannelHandlerContext ctx, File dir, String dirPath) { - FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK); - response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8"); - - StringBuilder buf = new StringBuilder() - .append("\r\n") - .append("") - .append("Listing of: ") - .append(dirPath) - .append("\r\n") - - .append("

Listing of: ") - .append(dirPath) - .append("

\r\n") - - .append("
    ") - .append("
  • ..
  • \r\n"); - - for (File f : dir.listFiles()) { - if (f.isHidden() || !f.canRead()) { - continue; - } - - String name = f.getName(); - if (!ALLOWED_FILE_NAME.matcher(name).matches()) { - continue; - } - - buf.append("
  • ") - .append(name) - .append("
  • \r\n"); - } - - buf.append("
\r\n"); - ByteBuf buffer = Unpooled.copiedBuffer(buf, CharsetUtil.UTF_8); - response.content().writeBytes(buffer); - buffer.release(); - - // Close the connection as soon as the error message is sent. - ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); - } - - private static void sendRedirect(ChannelHandlerContext ctx, String newUri) { - FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, FOUND); - response.headers().set(HttpHeaderNames.LOCATION, newUri); - - // Close the connection as soon as the error message is sent. - ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); - } - private static void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) { FullHttpResponse response = new DefaultFullHttpResponse( HTTP_1_1, status, Unpooled.copiedBuffer("Failure: " + status + "\r\n", CharsetUtil.UTF_8)); diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/ListDownloader.java b/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/ListDownloader.java index 5f795bc7..6d0c9f5b 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/ListDownloader.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/ListDownloader.java @@ -36,10 +36,17 @@ public interface DownloadTotalCallback { public static class DownloadTask { public String apply; public long size; + public boolean isZip; public DownloadTask(String apply, long size) { this.apply = apply; this.size = size; + isZip = false; + } + public DownloadTask(String apply, long size, boolean isZip) { + this.apply = apply; + this.size = size; + this.isZip = isZip; } } @@ -59,7 +66,7 @@ public void download(String base, List applies, Path dstDirFile, D get.reset(); get.setURI(u); } - httpclient.execute(get, new FileDownloadResponseHandler(targetPath, apply, callback, totalCallback, false)); + httpclient.execute(get, new FileDownloadResponseHandler(targetPath, apply, callback, totalCallback)); } } } @@ -118,12 +125,12 @@ public FileDownloadResponseHandler(Path target) { totalCallback = null; } - public FileDownloadResponseHandler(Path target, DownloadTask task, DownloadCallback callback, DownloadTotalCallback totalCallback, boolean zip) { + public FileDownloadResponseHandler(Path target, DownloadTask task, DownloadCallback callback, DownloadTotalCallback totalCallback) { this.target = target; this.task = task; this.callback = callback; this.totalCallback = totalCallback; - this.zip = zip; + this.zip = task != null ? task.isZip : false; } public FileDownloadResponseHandler(Path target, DownloadCallback callback, DownloadTotalCallback totalCallback, boolean zip) { @@ -137,16 +144,6 @@ public FileDownloadResponseHandler(Path target, DownloadCallback callback, Downl @Override public Path handleResponse(HttpResponse response) throws IOException { InputStream source = response.getEntity().getContent(); - int returnCode = response.getStatusLine().getStatusCode(); - if(returnCode != 200) - { - throw new IllegalStateException(String.format("Request download file %s return code %d", target.toString(), returnCode)); - } - long contentLength = response.getEntity().getContentLength(); - if (task != null && contentLength != task.size) - { - LogHelper.warning("Missing content length: expected %d | found %d", task.size, contentLength); - } if (zip) { try (ZipInputStream input = IOHelper.newZipInput(source)) { ZipEntry entry = input.getNextEntry(); @@ -171,13 +168,14 @@ public Path handleResponse(HttpResponse response) throws IOException { } if (callback != null && task != null) { callback.stateChanged(task.apply, 0, task.size); - transfer(source, this.target, task.apply, task.size, callback, totalCallback); + transfer(source, target, task.apply, task.size < 0 ? source.available() : task.size, callback, totalCallback); } else - IOHelper.transfer(source, this.target); + IOHelper.transfer(source, IOHelper.newOutput(target)); return this.target; } } + public static void transfer(InputStream input, Path file, String filename, long size, DownloadCallback callback, DownloadTotalCallback totalCallback) throws IOException { try (OutputStream fileOutput = IOHelper.newOutput(file)) { long downloaded = 0L; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/ControlEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/ControlEvent.java index 419619c0..e39f3a5e 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/ControlEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/ControlEvent.java @@ -4,6 +4,7 @@ //Набор стандартных событий public class ControlEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("f1051a64-0cd0-4ed8-8430-d856a196e91f"); public enum ControlCommand { diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/AuthRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/AuthRequestEvent.java index 4b0a09d4..877c5afe 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/AuthRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/AuthRequestEvent.java @@ -1,7 +1,5 @@ package pro.gravit.launcher.events.request; -import java.util.UUID; - import pro.gravit.launcher.ClientPermissions; import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.events.RequestEvent; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/BatchProfileByUsernameRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/BatchProfileByUsernameRequestEvent.java index 2be4e9c7..c6d57f94 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/BatchProfileByUsernameRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/BatchProfileByUsernameRequestEvent.java @@ -1,7 +1,5 @@ package pro.gravit.launcher.events.request; -import java.util.UUID; - import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.events.RequestEvent; import pro.gravit.launcher.profiles.PlayerProfile; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/CheckServerRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/CheckServerRequestEvent.java index 58492013..f28a2a33 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/CheckServerRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/CheckServerRequestEvent.java @@ -8,7 +8,8 @@ public class CheckServerRequestEvent extends RequestEvent { - private static final UUID _uuid = UUID.fromString("8801d07c-51ba-4059-b61d-fe1f1510b28a"); + @SuppressWarnings("unused") + private static final UUID _uuid = UUID.fromString("8801d07c-51ba-4059-b61d-fe1f1510b28a"); @LauncherNetworkAPI public UUID uuid; @LauncherNetworkAPI diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/JoinServerRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/JoinServerRequestEvent.java index 15060252..fb3253ad 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/JoinServerRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/JoinServerRequestEvent.java @@ -7,6 +7,7 @@ public class JoinServerRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("2a12e7b5-3f4a-4891-a2f9-ea141c8e1995"); public JoinServerRequestEvent(boolean allow) { diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/LauncherRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/LauncherRequestEvent.java index 3548aa0e..f792f181 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/LauncherRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/LauncherRequestEvent.java @@ -7,6 +7,7 @@ public class LauncherRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("d54cc12a-4f59-4f23-9b10-f527fdd2e38f"); @LauncherNetworkAPI public String url; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUUIDRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUUIDRequestEvent.java index f945129c..2e42263f 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUUIDRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUUIDRequestEvent.java @@ -8,6 +8,7 @@ public class ProfileByUUIDRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("b9014cf3-4b95-4d38-8c5f-867f190a18a0"); @LauncherNetworkAPI public String error; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUsernameRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUsernameRequestEvent.java index 18c80347..fe828c2c 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUsernameRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfileByUsernameRequestEvent.java @@ -8,6 +8,7 @@ public class ProfileByUsernameRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("06204302-ff6b-4779-b97d-541e3bc39aa1"); @LauncherNetworkAPI public String error; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfilesRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfilesRequestEvent.java index dedd1581..5a0963f7 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfilesRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/ProfilesRequestEvent.java @@ -9,6 +9,7 @@ public class ProfilesRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("2f26fbdf-598a-46dd-92fc-1699c0e173b1"); @LauncherNetworkAPI public List profiles; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/SetProfileRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/SetProfileRequestEvent.java index 9cfe2104..415cd423 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/SetProfileRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/SetProfileRequestEvent.java @@ -8,6 +8,7 @@ public class SetProfileRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("08c0de9e-4364-4152-9066-8354a3a48541"); @LauncherNetworkAPI public ClientProfile newProfile; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/UpdateListRequestEvent.java b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/UpdateListRequestEvent.java index 5f99c6af..ba140030 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/UpdateListRequestEvent.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/events/request/UpdateListRequestEvent.java @@ -8,6 +8,7 @@ public class UpdateListRequestEvent extends RequestEvent { + @SuppressWarnings("unused") private static final UUID uuid = UUID.fromString("5fa836ae-6b61-401c-96ac-d8396f07ec6b"); @LauncherNetworkAPI public final HashSet dirs; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/AuthRequest.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/AuthRequest.java index 9f26491c..e3695bfb 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/AuthRequest.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/auth/AuthRequest.java @@ -4,7 +4,6 @@ import pro.gravit.launcher.LauncherAPI; import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.events.request.AuthRequestEvent; -import pro.gravit.launcher.hwid.OshiHWID; import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.websockets.WebSocketRequest; import pro.gravit.utils.helper.VerifyHelper; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java index e6b9234e..74cb7771 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java @@ -210,6 +210,10 @@ public UpdateRequestEvent requestDo(StandartClientWebSocketService service) thro } catch (IOException ex) { LogHelper.error(ex); } + if (entry.size() < IOHelper.MB32) { + adds.add(new ListDownloader.DownloadTask(path, -1, true)); + return HashedDir.WalkAction.SKIP_DIR; + } } return HashedDir.WalkAction.CONTINUE; }); diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java index de2de7d2..2c97ebea 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.lang.reflect.Type; import java.net.URI; -import java.util.HashMap; import java.util.HashSet; import javax.net.ssl.SSLException; diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java index 79453c73..0caab327 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/StandartClientWebSocketService.java @@ -7,13 +7,10 @@ import javax.net.ssl.SSLException; -import com.google.gson.GsonBuilder; - import pro.gravit.launcher.events.request.ErrorRequestEvent; import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.RequestException; import pro.gravit.launcher.request.WebSocketEvent; -import pro.gravit.utils.helper.CommonHelper; import pro.gravit.utils.helper.JVMHelper; import pro.gravit.utils.helper.LogHelper; diff --git a/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java b/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java index 3bacee9d..2c1d3650 100644 --- a/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java +++ b/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java @@ -350,7 +350,7 @@ public void walk(CharSequence separator, WalkCallback callback) throws IOExcepti } public enum WalkAction { - STOP, CONTINUE + STOP, SKIP_DIR, CONTINUE } @FunctionalInterface @@ -375,7 +375,9 @@ private WalkAction walk(String append, CharSequence separator, WalkCallback call else newAppend = append + separator + entry.getKey(); WalkAction a = callback.walked(newAppend, entry.getKey(), e); if (a == WalkAction.STOP) return a; - a = ((HashedDir) e).walk(newAppend, separator, callback, false); + if (a == WalkAction.CONTINUE) + a = ((HashedDir) e).walk(newAppend, separator, callback, false); + else a = WalkAction.CONTINUE; // skip if (a == WalkAction.STOP) return a; } } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java index 77b34f1b..bee23b5e 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java @@ -297,6 +297,15 @@ public static boolean isFile(Path path) { return Files.isRegularFile(path, LINK_OPTIONS); } + @LauncherAPI + public static boolean isHidden(Path path) { + try { + return Files.isHidden(path); + } catch (IOException e) { + return false; + } + } + @LauncherAPI public static boolean isValidFileName(String fileName) { return !fileName.equals(".") && !fileName.equals("..") &&