From 599c4036168b79ea6de2a5ad1719a32dbfd3568c Mon Sep 17 00:00:00 2001 From: UnlikePaladin <36827970+UnlikePaladin@users.noreply.github.com> Date: Sat, 2 Mar 2024 02:17:50 -0600 Subject: [PATCH] fixed several issues --- .../org/figuramc/figura/avatar/Avatar.java | 15 --- .../figuramc/figura/config/ConfigType.java | 5 +- .../gui/widgets/lists/NetworkFilterList.java | 13 +- .../figuramc/figura/lua/FiguraAPIManager.java | 5 - .../figuramc/figura/lua/FiguraLuaRuntime.java | 1 - .../figuramc/figura/lua/api/AvatarAPI.java | 12 -- .../org/figuramc/figura/lua/api/FileAPI.java | 17 ++- .../figura/lua/api/net/FiguraSocket.java | 115 ------------------ .../figura/lua/api/net/HttpRequestsAPI.java | 14 ++- .../figura/lua/api/net/NetworkingAPI.java | 86 +++++-------- .../figura/lua/api/net/SocketAPI.java | 62 ---------- .../figura/lua/docs/FiguraDocsManager.java | 6 +- .../figura/permissions/Permissions.java | 6 +- .../resources/assets/figura/lang/en_us.json | 3 +- gradle.properties | 2 +- 15 files changed, 63 insertions(+), 299 deletions(-) delete mode 100644 common/src/main/java/org/figuramc/figura/lua/api/net/FiguraSocket.java delete mode 100644 common/src/main/java/org/figuramc/figura/lua/api/net/SocketAPI.java diff --git a/common/src/main/java/org/figuramc/figura/avatar/Avatar.java b/common/src/main/java/org/figuramc/figura/avatar/Avatar.java index 9a939994c..6a2855545 100644 --- a/common/src/main/java/org/figuramc/figura/avatar/Avatar.java +++ b/common/src/main/java/org/figuramc/figura/avatar/Avatar.java @@ -38,7 +38,6 @@ import org.figuramc.figura.lua.api.TextureAPI; import org.figuramc.figura.lua.api.data.FiguraBuffer; import org.figuramc.figura.lua.api.entity.EntityAPI; -import org.figuramc.figura.lua.api.net.FiguraSocket; import org.figuramc.figura.lua.api.particle.ParticleAPI; import org.figuramc.figura.lua.api.ping.PingArg; import org.figuramc.figura.lua.api.ping.PingFunction; @@ -109,7 +108,6 @@ public class Avatar { // Runtime data private final Queue events = new ConcurrentLinkedQueue<>(); - public final ArrayList openSockets = new ArrayList<>(); public final ArrayList openBuffers = new ArrayList<>(); public AvatarRenderer renderer; public FiguraLuaRuntime luaRuntime; @@ -936,7 +934,6 @@ public void clean() { clearSounds(); clearParticles(); - closeSockets(); closeBuffers(); events.clear(); @@ -948,18 +945,6 @@ public void clearSounds() { value.releaseAlBuffer(); } - public void closeSockets() { - for (FiguraSocket socket : - openSockets) { - if (!socket.isClosed()) { - try { - socket.baseClose(); - } catch (Exception ignored) {} - } - } - openSockets.clear(); - } - public void closeBuffers() { for (FiguraBuffer buffer : openBuffers) { diff --git a/common/src/main/java/org/figuramc/figura/config/ConfigType.java b/common/src/main/java/org/figuramc/figura/config/ConfigType.java index 0ee841449..ba35fac47 100644 --- a/common/src/main/java/org/figuramc/figura/config/ConfigType.java +++ b/common/src/main/java/org/figuramc/figura/config/ConfigType.java @@ -352,7 +352,6 @@ public JsonElement serialize() { filters) { JsonObject o = new JsonObject(); o.addProperty("source", filter.getSource()); - o.addProperty("mode", filter.getMode().getId()); array.add(o); } return array; @@ -373,9 +372,7 @@ public void deserialize(JsonElement element) { JsonPrimitive source = s.getAsJsonPrimitive(); JsonPrimitive mode = m.getAsJsonPrimitive(); if (!source.isString() || !mode.isNumber()) continue; - NetworkingAPI.Filter.FilterMode filterMode = NetworkingAPI.Filter.FilterMode.getById(mode.getAsInt()); - if (filterMode == null) continue; - filters.add(new NetworkingAPI.Filter(source.getAsString(), filterMode)); + filters.add(new NetworkingAPI.Filter(source.getAsString())); } } diff --git a/common/src/main/java/org/figuramc/figura/gui/widgets/lists/NetworkFilterList.java b/common/src/main/java/org/figuramc/figura/gui/widgets/lists/NetworkFilterList.java index bbd86fc49..cc3f799d5 100644 --- a/common/src/main/java/org/figuramc/figura/gui/widgets/lists/NetworkFilterList.java +++ b/common/src/main/java/org/figuramc/figura/gui/widgets/lists/NetworkFilterList.java @@ -184,22 +184,17 @@ public List contents() { public static class NetworkFilterEntry extends AbstractContainerElement { private static final ResourceLocation deleteButtonLocation = new ResourceLocation("figura", "textures/gui/delete.png"); private final NetworkingAPI.Filter sourceFilter; - private final EnumButton enumButton; private final IconButton deleteButton; private final TextField filterTextField; private final NetworkFilterList parent; public NetworkFilterEntry(NetworkFilterList parent, int x, int y, int width, int height) { - this(parent, x, y, width, height, new NetworkingAPI.Filter("https://example.com", NetworkingAPI.Filter.FilterMode.EQUALS)); + this(parent, x, y, width, height, new NetworkingAPI.Filter("https://example.com")); } public NetworkFilterEntry(NetworkFilterList parent, int x, int y, int width, int height, NetworkingAPI.Filter sourceFilter) { super(x, y, width, height); this.parent = parent; this.sourceFilter = sourceFilter; - children.add(enumButton = - new EnumButton(x+width-114, y, 90, 20, "gui.network_filter.list.filter_mode" - ,sourceFilter.getMode().getId(), 5, this::onEnumSelect) - ); children.add(filterTextField = new TextField(x, y, width - 118, 20, TextField.HintType.IP, this::onSourceChange)); children.add( deleteButton = new IconButton(x + width - 20, y, 20, 20, @@ -228,17 +223,11 @@ private void onSourceChange(String s) { sourceFilter.setSource(s); } - private void onEnumSelect(int i) { - sourceFilter.setMode(NetworkingAPI.Filter.FilterMode.getById(i)); - } - private void repositionChildren() { int x = getX(), y = getY(), width = getWidth(); filterTextField.setX(x); filterTextField.setY(y); filterTextField.setWidth(width - 118); - enumButton.setX(x+width-114); - enumButton.setY(y); deleteButton.setX(x+width-20); deleteButton.setY(y); } diff --git a/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java b/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java index 3e99e4514..8db31c463 100644 --- a/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java +++ b/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java @@ -6,10 +6,8 @@ import org.figuramc.figura.lua.api.data.*; import org.figuramc.figura.lua.api.json.*; import org.figuramc.figura.lua.api.entity.*; -import org.figuramc.figura.lua.api.net.FiguraSocket; import org.figuramc.figura.lua.api.net.HttpRequestsAPI; import org.figuramc.figura.lua.api.net.NetworkingAPI; -import org.figuramc.figura.lua.api.net.SocketAPI; import org.figuramc.figura.model.rendertasks.*; import org.figuramc.figura.lua.api.action_wheel.Action; import org.figuramc.figura.lua.api.action_wheel.ActionWheelAPI; @@ -168,9 +166,6 @@ public class FiguraAPIManager { add(FiguraFuture.class); - add(SocketAPI.class); - add(FiguraSocket.class); - add(RaycastAPI.class); }}; diff --git a/common/src/main/java/org/figuramc/figura/lua/FiguraLuaRuntime.java b/common/src/main/java/org/figuramc/figura/lua/FiguraLuaRuntime.java index 4a4c9bf5a..a32282028 100644 --- a/common/src/main/java/org/figuramc/figura/lua/FiguraLuaRuntime.java +++ b/common/src/main/java/org/figuramc/figura/lua/FiguraLuaRuntime.java @@ -406,7 +406,6 @@ public void error(Throwable e) { owner.luaRuntime = null; owner.clearParticles(); owner.clearSounds(); - owner.closeSockets(); owner.closeBuffers(); } diff --git a/common/src/main/java/org/figuramc/figura/lua/api/AvatarAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/AvatarAPI.java index 7e309d245..a2e11f526 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/AvatarAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/AvatarAPI.java @@ -330,18 +330,6 @@ public int getMaxBuffersCount() { return avatar.permissions.get(Permissions.BUFFERS_COUNT); } - @LuaWhitelist - @LuaMethodDoc("avatar.get_sockets_count") - public int getSocketsCount() { - return avatar.openSockets.size(); - } - - @LuaWhitelist - @LuaMethodDoc("avatar.get_max_sockets_count") - public int getMaxSocketsCount() { - return avatar.permissions.get(Permissions.MAX_SOCKETS); - } - @LuaWhitelist @LuaMethodDoc("avatar.get_max_texture_size") public int getMaxTextureSize() { diff --git a/common/src/main/java/org/figuramc/figura/lua/api/FileAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/FileAPI.java index ff7625e4f..3dd64ab34 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/FileAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/FileAPI.java @@ -15,6 +15,7 @@ import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -26,6 +27,7 @@ public class FileAPI { private final Avatar parent; private static final Path rootFolderPath = FiguraMod.getFiguraDirectory().resolve("data").toAbsolutePath() .normalize(); + private static final String WRITE_NOT_ALLOWED = "You are only allowed to write in the data folder! Anything else is read only!"; public FileAPI(Avatar parent) { this.parent = parent; @@ -34,6 +36,7 @@ public FileAPI(Avatar parent) { private Path securityCheck(String path) { if (!parent.isHost) throw new LuaError("You can't use FileAPI outside of host environment"); Path p = relativizePath(path); + if (Files.isSymbolicLink(p)) throw new LuaError("Symbolic links are not allowed in FileAPI %s!".formatted(path)); if (!isPathAllowed(p)) throw new LuaError("Path %s is not allowed in FileAPI".formatted(path)); return p; } @@ -58,7 +61,7 @@ public boolean isPathAllowed(@LuaNotNil String path) { } public boolean isPathAllowed(Path path) { - return path.toAbsolutePath().startsWith(rootFolderPath); + return !Files.isSymbolicLink(path) && path.toAbsolutePath().startsWith(rootFolderPath); } @LuaWhitelist @@ -149,6 +152,9 @@ public FiguraInputStream openReadStream(@LuaNotNil String path) { public FiguraOutputStream openWriteStream(@LuaNotNil String path) { try { Path p = securityCheck(path); + if (!p.startsWith(rootFolderPath)) { + throw new LuaError(WRITE_NOT_ALLOWED); + } File f = p.toFile(); FileOutputStream fos = new FileOutputStream(f); return new FiguraOutputStream(fos); @@ -218,6 +224,9 @@ public void writeString(@LuaNotNil String path, @LuaNotNil String data, String e ) public boolean mkdir(@LuaNotNil String path) { Path p = securityCheck(path); + if (!p.startsWith(rootFolderPath)) { + throw new LuaError(WRITE_NOT_ALLOWED); + } File f = p.toFile(); return f.mkdir(); } @@ -233,6 +242,9 @@ public boolean mkdir(@LuaNotNil String path) { ) public boolean mkdirs(@LuaNotNil String path) { Path p = securityCheck(path); + if (!p.startsWith(rootFolderPath)) { + throw new LuaError(WRITE_NOT_ALLOWED); + } File f = p.toFile(); return f.mkdirs(); } @@ -248,6 +260,9 @@ public boolean mkdirs(@LuaNotNil String path) { ) public boolean delete(@LuaNotNil String path) { Path p = securityCheck(path); + if (!p.startsWith(rootFolderPath)) { + throw new LuaError(WRITE_NOT_ALLOWED); + } File f = p.toFile(); return f.delete(); } diff --git a/common/src/main/java/org/figuramc/figura/lua/api/net/FiguraSocket.java b/common/src/main/java/org/figuramc/figura/lua/api/net/FiguraSocket.java deleted file mode 100644 index 6d808608d..000000000 --- a/common/src/main/java/org/figuramc/figura/lua/api/net/FiguraSocket.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.figuramc.figura.lua.api.net; - -import org.figuramc.figura.avatar.Avatar; -import org.figuramc.figura.lua.LuaWhitelist; -import org.figuramc.figura.lua.api.data.FiguraInputStream; -import org.figuramc.figura.lua.api.data.FiguraOutputStream; -import org.figuramc.figura.lua.docs.LuaMethodDoc; -import org.figuramc.figura.lua.docs.LuaMethodOverload; -import org.figuramc.figura.lua.docs.LuaTypeDoc; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; - -@LuaWhitelist -@LuaTypeDoc(value = "socket", name = "Socket") -public class FiguraSocket implements AutoCloseable { - private final Avatar parent; - private final Socket parentSocket; - private final FiguraInputStream socketInputStream; - private final FiguraOutputStream socketOutputStream; - - public FiguraSocket(String host, int port, Avatar parent) throws IOException { - this.parent = parent; - this.parentSocket = new Socket(host, port); - this.socketInputStream = new FiguraInputStream(parentSocket.getInputStream(), true); - this.socketOutputStream = new FiguraOutputStream(parentSocket.getOutputStream()); - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket.get_input_stream", - overloads = @LuaMethodOverload( - returnType = FiguraInputStream.class - ) - ) - public FiguraInputStream getInputStream() { - return socketInputStream; - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket.get_output_stream", - overloads = @LuaMethodOverload( - returnType = FiguraOutputStream.class - ) - ) - public FiguraOutputStream getOutputStream() { - return socketOutputStream; - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket.get_port", - overloads = @LuaMethodOverload( - returnType = int.class - ) - ) - public int getPort() { - return parentSocket.getPort(); - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket.get_host", - overloads = @LuaMethodOverload( - returnType = String.class - ) - ) - public String getHost() { - return parentSocket.getInetAddress().getHostAddress(); - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket.is_connected", - overloads = @LuaMethodOverload( - returnType = boolean.class - ) - ) - public boolean isConnected() { - return parentSocket.isConnected(); - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket.is_closed", - overloads = @LuaMethodOverload( - returnType = boolean.class - ) - ) - public boolean isClosed() { - return parentSocket.isClosed(); - } - - @Override - @LuaWhitelist - @LuaMethodDoc("socket.close") - public void close() throws IOException { - baseClose(); - parent.openSockets.remove(this); - } - - public void baseClose() throws IOException { - if (!isClosed()) { - parentSocket.close(); - } - } - - @Override - public String toString() { - InetAddress address = parentSocket.getInetAddress(); - return "Socket(%s;%s)".formatted(address.getHostAddress(), parentSocket.getPort()); - } -} diff --git a/common/src/main/java/org/figuramc/figura/lua/api/net/HttpRequestsAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/net/HttpRequestsAPI.java index 99c04b897..054feca34 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/net/HttpRequestsAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/net/HttpRequestsAPI.java @@ -1,6 +1,7 @@ package org.figuramc.figura.lua.api.net; import net.minecraft.network.chat.Component; +import org.figuramc.figura.FiguraMod; import org.figuramc.figura.lua.api.data.FiguraBuffer; import org.figuramc.figura.lua.docs.LuaMethodOverload; import org.luaj.vm2.LuaError; @@ -18,10 +19,7 @@ import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; @LuaWhitelist @LuaTypeDoc( @@ -31,6 +29,8 @@ public class HttpRequestsAPI { private final NetworkingAPI parent; private final HttpClient httpClient; + private static final List disallowedHeaders = Arrays.asList("Host", "X-Forwarded-Host", "X-Host"); + HttpRequestsAPI(NetworkingAPI parent) { this.parent = parent; httpClient = HttpClient.newBuilder().build(); @@ -259,6 +259,12 @@ private HttpRequest getRequest() { HttpRequest.BodyPublishers.ofInputStream(this::inputStreamSupplier) : HttpRequest.BodyPublishers.noBody(); for (Map.Entry entry : getHeaders().entrySet()) { + if (disallowedHeaders.stream().anyMatch(s -> s.equalsIgnoreCase(entry.getKey()))) { + if (parent.parent.owner.isHost) { + FiguraMod.sendChatMessage(Component.translatable("figura.network.header_disabled", entry.getKey())); + } + continue; + } builder.header(entry.getKey(), entry.getValue()); } builder.method(getMethod(), bp); diff --git a/common/src/main/java/org/figuramc/figura/lua/api/net/NetworkingAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/net/NetworkingAPI.java index c589b757c..bca9a495f 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/net/NetworkingAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/net/NetworkingAPI.java @@ -17,6 +17,8 @@ import org.figuramc.figura.permissions.Permissions; import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.time.LocalDate; @@ -31,6 +33,7 @@ ) public class NetworkingAPI { private static FileOutputStream logFileOutputStream; + private static final String NETWORKING_IS_HOST_ONLY = "NetworkingAPI is only allowed in a host environment!"; private static final String NETWORKING_DISABLED_ERROR_TEXT = "Networking is disabled in config"; private static final String NO_PERMISSION_ERROR_TEXT = "This avatar doesn't have networking permissions"; private static final String NETWORKING_DISALLOWED_FOR_LINK_ERROR = "Networking whitelist/blacklist does not allow access to link: %s"; @@ -38,17 +41,15 @@ public class NetworkingAPI { @LuaWhitelist @LuaFieldDoc("net.http") public final HttpRequestsAPI http; - @LuaWhitelist - @LuaFieldDoc("net.socket") - public final SocketAPI socket; public NetworkingAPI(Avatar owner) { this.owner = owner; http = new HttpRequestsAPI(this); - socket = new SocketAPI(this); } public void securityCheck(String link) throws RuntimeException { + if (!owner.isHost) + throw new LuaError(NETWORKING_IS_HOST_ONLY); if (!Configs.ALLOW_NETWORKING.value) throw new LuaError(NETWORKING_DISABLED_ERROR_TEXT); if (owner.permissions.get(Permissions.NETWORKING) < 1) { @@ -68,7 +69,7 @@ public void securityCheck(String link) throws RuntimeException { ) ) public boolean isNetworkingAllowed() { - return Configs.ALLOW_NETWORKING.value && owner.permissions.get(Permissions.NETWORKING) >= 1; + return owner.isHost && Configs.ALLOW_NETWORKING.value && owner.permissions.get(Permissions.NETWORKING) >= 1; } @LuaWhitelist @@ -81,14 +82,26 @@ public boolean isNetworkingAllowed() { ) ) public boolean isLinkAllowed(String link) { + if (!owner.isHost) + throw new LuaError(NETWORKING_IS_HOST_ONLY); + RestrictionLevel level = RestrictionLevel.getById(Configs.NETWORKING_RESTRICTION.value); if (level == null) return false; ArrayList filters = Configs.NETWORK_FILTER.getFilters(); - return switch (level) { - case WHITELIST -> filters.stream().anyMatch(f -> f.matches(link)); - case BLACKLIST -> filters.stream().noneMatch(f -> f.matches(link)); - case NONE -> true; - }; + try { + URL url = new URL(link); + if (url.getPort() != -1 && url.getPort() != 80 && url.getPort() != 443) + throw new LuaError("Port %s not allowed, only 80 (HTTP) and 443 (HTTPS) are permitted.".formatted(url.getPort())); + + return switch (level) { + case WHITELIST -> filters.stream().anyMatch(f -> f.matches(url.getHost())); + case BLACKLIST -> filters.stream().noneMatch(f -> f.matches(url.getHost())); + case NONE -> true; + }; + } + catch (MalformedURLException e) { + throw new LinkNotAllowedException(NETWORKING_DISALLOWED_FOR_LINK_ERROR.formatted(link)); + } } void log(LogSource source, Component text) { @@ -160,11 +173,9 @@ private static void prepareLogStream() { public static class Filter { private String filterSource; - private FilterMode filterMode; - public Filter(String source, FilterMode mode) { + public Filter(String source) { setSource(source.trim()); - setMode(mode); } public String getSource() { @@ -175,46 +186,8 @@ public void setSource(String filterSource) { this.filterSource = filterSource; } - public FilterMode getMode() { - return filterMode; - } - - public void setMode(FilterMode filterMode) { - this.filterMode = filterMode; - } - public boolean matches(String s) { - return switch (filterMode) { - case EQUALS -> s.trim().equals(filterSource); - case CONTAINS -> s.trim().contains(filterSource); - case STARTS_WITH -> s.trim().startsWith(filterSource); - case ENDS_WITH -> s.trim().endsWith(filterSource); - case REGEX -> s.trim().matches(filterSource); - }; - } - - public enum FilterMode { - EQUALS(0), - CONTAINS(1), - STARTS_WITH(2), - ENDS_WITH(3), - REGEX(4); - private final int id; - FilterMode(int id) { - this.id = id; - } - - public int getId() { - return id; - } - - public static FilterMode getById(int id) { - for (FilterMode t : - FilterMode.values()) { - if (t.id == id) return t; - } - return null; - } + return s.trim().equalsIgnoreCase(filterSource); } } @@ -247,11 +220,10 @@ enum LogSource { @LuaWhitelist public Object __index(LuaValue key) { if (!key.isstring()) return null; - return switch (key.tojstring()) { - case "http" -> http; - case "socket" -> socket; - default -> null; - }; + if (key.tojstring().equals("http")) { + return http; + } + return null; } static class LinkNotAllowedException extends RuntimeException { diff --git a/common/src/main/java/org/figuramc/figura/lua/api/net/SocketAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/net/SocketAPI.java deleted file mode 100644 index 0adebd4ce..000000000 --- a/common/src/main/java/org/figuramc/figura/lua/api/net/SocketAPI.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.figuramc.figura.lua.api.net; - -import net.minecraft.network.chat.Component; -import org.figuramc.figura.lua.LuaNotNil; -import org.figuramc.figura.lua.LuaWhitelist; -import org.figuramc.figura.lua.api.data.FiguraFuture; -import org.figuramc.figura.lua.docs.LuaMethodDoc; -import org.figuramc.figura.lua.docs.LuaMethodOverload; -import org.figuramc.figura.lua.docs.LuaTypeDoc; -import org.figuramc.figura.permissions.Permissions; -import org.luaj.vm2.LuaError; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -@LuaWhitelist -@LuaTypeDoc(value = "socket_api", name = "SocketAPI") -public class SocketAPI { - private final NetworkingAPI parent; - - public SocketAPI(NetworkingAPI parent) { - this.parent = parent; - } - - @LuaWhitelist - @LuaMethodDoc( - value = "socket_api.open", - overloads = @LuaMethodOverload( - argumentNames = {"host", "port"}, - argumentTypes = {String.class, Integer.class}, - returnType = FiguraFuture.class - ) - ) - public FiguraFuture open(@LuaNotNil String host, @LuaNotNil Integer port) { - try { - parent.securityCheck(host); - } catch (NetworkingAPI.LinkNotAllowedException e) { - parent.error(NetworkingAPI.LogSource.SOCKET, Component.literal("Tried to establish connection to not allowed host %s".formatted(host))); - throw e.luaError; - } - int maxSockets = parent.owner.permissions.get(Permissions.MAX_SOCKETS); - if (parent.owner.openSockets.size() > maxSockets) - throw new LuaError("You can't open more than %s sockets".formatted(maxSockets)); - FiguraFuture future = new FiguraFuture<>(); - CompletableFuture.supplyAsync(() -> { - try { - FiguraSocket socket = new FiguraSocket(host, port, parent.owner); - parent.owner.openSockets.add(socket); - parent.log(NetworkingAPI.LogSource.SOCKET, Component.literal("Established connection to host %s".formatted(host))); - return socket; - } catch (IOException e) { - throw new LuaError(e); - } - }).whenCompleteAsync(future::handle); - return future; - } - - @Override - public String toString() { - return "SocketAPI"; - } -} diff --git a/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java b/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java index 30d3ad587..917d44492 100644 --- a/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java +++ b/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java @@ -31,10 +31,8 @@ import org.figuramc.figura.lua.api.nameplate.NameplateAPI; import org.figuramc.figura.lua.api.nameplate.NameplateCustomization; import org.figuramc.figura.lua.api.nameplate.NameplateCustomizationGroup; -import org.figuramc.figura.lua.api.net.FiguraSocket; import org.figuramc.figura.lua.api.net.HttpRequestsAPI; import org.figuramc.figura.lua.api.net.NetworkingAPI; -import org.figuramc.figura.lua.api.net.SocketAPI; import org.figuramc.figura.lua.api.particle.LuaParticle; import org.figuramc.figura.lua.api.particle.ParticleAPI; import org.figuramc.figura.lua.api.ping.PingAPI; @@ -244,9 +242,7 @@ public class FiguraDocsManager { NetworkingAPI.class, HttpRequestsAPI.class, HttpRequestsAPI.HttpResponse.class, - HttpRequestsAPI.HttpRequestBuilder.class, - SocketAPI.class, - FiguraSocket.class + HttpRequestsAPI.HttpRequestBuilder.class )); put("file", List.of( diff --git a/common/src/main/java/org/figuramc/figura/permissions/Permissions.java b/common/src/main/java/org/figuramc/figura/permissions/Permissions.java index f3e1c1f5d..771dfd805 100644 --- a/common/src/main/java/org/figuramc/figura/permissions/Permissions.java +++ b/common/src/main/java/org/figuramc/figura/permissions/Permissions.java @@ -39,8 +39,7 @@ public boolean checkInfinity(int value) { CUSTOM_SKULL = new Permissions("CUSTOM_SKULL", 0, 0, 1, 1, 1), BUFFER_SIZE = new Permissions("BUFFER_SIZE", 0, 3072000, 0, 128000, 1024000, 2048000, Integer.MAX_VALUE), BUFFERS_COUNT = new Permissions("BUFFERS_COUNT", 0, 32, 0, 2, 4, 16, 32), - NETWORKING = new Permissions("NETWORKING", 0,0,0,1,1), - MAX_SOCKETS = new Permissions("MAX_SOCKETS_COUNT", 0, 16, 0, 1, 2, 8, 16); + NETWORKING = new Permissions("NETWORKING", 0,0,0,1,1); public static final List DEFAULT = List.of( INIT_INST, @@ -63,8 +62,7 @@ public boolean checkInfinity(int value) { CUSTOM_SKULL, BUFFER_SIZE, BUFFERS_COUNT, - NETWORKING, - MAX_SOCKETS + NETWORKING ); diff --git a/common/src/main/resources/assets/figura/lang/en_us.json b/common/src/main/resources/assets/figura/lang/en_us.json index aed85254e..6d4300bc6 100644 --- a/common/src/main/resources/assets/figura/lang/en_us.json +++ b/common/src/main/resources/assets/figura/lang/en_us.json @@ -1825,5 +1825,6 @@ "figura.docs.socket.get_host": "Returns host this socket is connected to", "figura.docs.socket.is_connected": "Checks if this socket is connected", "figura.docs.socket.is_closed": "Checks if this socket is closed", - "figura.docs.socket.close": "Closes this socket" + "figura.docs.socket.close": "Closes this socket", + "figura.network.header_disabled": "The %s header is disabled, skipping!" } diff --git a/gradle.properties b/gradle.properties index d1fe1b72d..6b1ab79ae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ mappings = 1 enabled_platforms = fabric,forge # Mod Properties -mod_version = 0.1.3 +mod_version = 0.1.4 maven_group = org.figuramc archives_base_name = figura assets_version = v2