mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-11-04 17:16:20 +00:00
Make maximum upload file size configurable (#1417)
This commit is contained in:
parent
470f2b098d
commit
e24b5f0888
@ -55,6 +55,7 @@ public abstract class AbstractComputerScreen<T extends AbstractComputerMenu> ext
|
||||
protected final int sidebarYOffset;
|
||||
|
||||
private long uploadNagDeadline = Long.MAX_VALUE;
|
||||
private final int uploadMaxSize;
|
||||
private final ItemStack displayStack;
|
||||
|
||||
public AbstractComputerScreen(T container, Inventory player, Component title, int sidebarYOffset) {
|
||||
@ -62,6 +63,7 @@ public abstract class AbstractComputerScreen<T extends AbstractComputerMenu> ext
|
||||
terminalData = container.getTerminal();
|
||||
family = container.getFamily();
|
||||
displayStack = container.getDisplayStack();
|
||||
uploadMaxSize = container.getUploadMaxSize();
|
||||
input = new ClientInputHandler(menu);
|
||||
this.sidebarYOffset = sidebarYOffset;
|
||||
}
|
||||
@ -161,7 +163,7 @@ public abstract class AbstractComputerScreen<T extends AbstractComputerMenu> ext
|
||||
|
||||
try (var sbc = Files.newByteChannel(file)) {
|
||||
var fileSize = sbc.size();
|
||||
if (fileSize > UploadFileMessage.MAX_SIZE || (size += fileSize) >= UploadFileMessage.MAX_SIZE) {
|
||||
if (fileSize > uploadMaxSize || (size += fileSize) >= uploadMaxSize) {
|
||||
alert(UploadResult.FAILED_TITLE, UploadResult.TOO_MUCH_MSG);
|
||||
return;
|
||||
}
|
||||
|
@ -208,6 +208,7 @@ public final class LanguageProvider implements DataProvider {
|
||||
// Config options
|
||||
addConfigEntry(ConfigSpec.computerSpaceLimit, "Computer space limit (bytes)");
|
||||
addConfigEntry(ConfigSpec.floppySpaceLimit, "Floppy Disk space limit (bytes)");
|
||||
addConfigEntry(ConfigSpec.uploadMaxSize, "File upload size limit (bytes)");
|
||||
addConfigEntry(ConfigSpec.maximumFilesOpen, "Maximum files open per computer");
|
||||
addConfigEntry(ConfigSpec.disableLua51Features, "Disable Lua 5.1 features");
|
||||
addConfigEntry(ConfigSpec.defaultComputerSettings, "Default Computer settings");
|
||||
|
@ -5,6 +5,7 @@
|
||||
package dan200.computercraft.shared.computer.inventory;
|
||||
|
||||
import dan200.computercraft.core.terminal.Terminal;
|
||||
import dan200.computercraft.shared.config.Config;
|
||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
|
||||
import dan200.computercraft.shared.computer.core.ServerComputer;
|
||||
import dan200.computercraft.shared.computer.menu.ComputerMenu;
|
||||
@ -26,6 +27,7 @@ import java.util.function.Predicate;
|
||||
|
||||
public abstract class AbstractComputerMenu extends AbstractContainerMenu implements ComputerMenu {
|
||||
public static final int SIDEBAR_WIDTH = 17;
|
||||
private final int uploadMaxSize;
|
||||
|
||||
private final Predicate<Player> canUse;
|
||||
private final ComputerFamily family;
|
||||
@ -52,6 +54,7 @@ public abstract class AbstractComputerMenu extends AbstractContainerMenu impleme
|
||||
input = computer == null ? null : new ServerInputState<>(this);
|
||||
terminal = containerData == null ? null : containerData.terminal().create();
|
||||
displayStack = containerData == null ? ItemStack.EMPTY : containerData.displayStack();
|
||||
uploadMaxSize = containerData == null ? Config.uploadMaxSize : containerData.uploadMaxSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -67,6 +70,10 @@ public abstract class AbstractComputerMenu extends AbstractContainerMenu impleme
|
||||
return data.get(0) != 0;
|
||||
}
|
||||
|
||||
public int getUploadMaxSize() {
|
||||
return uploadMaxSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServerComputer getComputer() {
|
||||
if (computer == null) throw new UnsupportedOperationException("Cannot access server computer on the client");
|
||||
|
@ -14,6 +14,7 @@ import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
|
||||
public final class Config {
|
||||
public static int computerSpaceLimit = 1000 * 1000;
|
||||
public static int floppySpaceLimit = 125 * 1000;
|
||||
public static int uploadMaxSize = 512 * 1024; // 512 KB
|
||||
public static boolean commandRequireCreative = true;
|
||||
|
||||
public static boolean enableCommandBlock = false;
|
||||
|
@ -32,6 +32,7 @@ public final class ConfigSpec {
|
||||
public static final ConfigFile.Value<String> defaultComputerSettings;
|
||||
public static final ConfigFile.Value<Boolean> logComputerErrors;
|
||||
public static final ConfigFile.Value<Boolean> commandRequireCreative;
|
||||
public static final ConfigFile.Value<Integer> uploadMaxSize;
|
||||
|
||||
public static final ConfigFile.Value<Integer> computerThreads;
|
||||
public static final ConfigFile.Value<Integer> maxMainGlobalTime;
|
||||
@ -96,6 +97,13 @@ public final class ConfigSpec {
|
||||
.comment("The disk space limit for floppy disks, in bytes.")
|
||||
.define("floppy_space_limit", Config.floppySpaceLimit);
|
||||
|
||||
uploadMaxSize = builder
|
||||
.comment("""
|
||||
The file upload size limit, in bytes. Must be in range of 1 KiB and 16 MiB.
|
||||
Keep in mind that uploads are processed in a single tick - large files or
|
||||
poor network performance can stall the networking thread. And mind the disk space!""")
|
||||
.defineInRange("upload_max_size", Config.uploadMaxSize, 1024, 16 * 1024 * 1024);
|
||||
|
||||
maximumFilesOpen = builder
|
||||
.comment("Set how many files a computer can have open at the same time. Set to 0 for unlimited.")
|
||||
.defineInRange("maximum_open_files", CoreConfig.maximumFilesOpen, 0, Integer.MAX_VALUE);
|
||||
@ -334,6 +342,7 @@ public final class ConfigSpec {
|
||||
// General
|
||||
Config.computerSpaceLimit = computerSpaceLimit.get();
|
||||
Config.floppySpaceLimit = floppySpaceLimit.get();
|
||||
Config.uploadMaxSize = uploadMaxSize.get();
|
||||
CoreConfig.maximumFilesOpen = maximumFilesOpen.get();
|
||||
CoreConfig.disableLua51Features = disableLua51Features.get();
|
||||
CoreConfig.defaultComputerSettings = defaultComputerSettings.get();
|
||||
|
@ -7,6 +7,7 @@ package dan200.computercraft.shared.network.container;
|
||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
|
||||
import dan200.computercraft.shared.computer.core.ServerComputer;
|
||||
import dan200.computercraft.shared.computer.terminal.TerminalState;
|
||||
import dan200.computercraft.shared.config.Config;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
@ -14,17 +15,20 @@ public class ComputerContainerData implements ContainerData {
|
||||
private final ComputerFamily family;
|
||||
private final TerminalState terminal;
|
||||
private final ItemStack displayStack;
|
||||
private final int uploadMaxSize;
|
||||
|
||||
public ComputerContainerData(ServerComputer computer, ItemStack displayStack) {
|
||||
family = computer.getFamily();
|
||||
terminal = computer.getTerminalState();
|
||||
this.displayStack = displayStack;
|
||||
uploadMaxSize = Config.uploadMaxSize;
|
||||
}
|
||||
|
||||
public ComputerContainerData(FriendlyByteBuf buf) {
|
||||
family = buf.readEnum(ComputerFamily.class);
|
||||
terminal = new TerminalState(buf);
|
||||
displayStack = buf.readItem();
|
||||
uploadMaxSize = buf.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -32,6 +36,7 @@ public class ComputerContainerData implements ContainerData {
|
||||
buf.writeEnum(family);
|
||||
terminal.write(buf);
|
||||
buf.writeItem(displayStack);
|
||||
buf.writeInt(uploadMaxSize);
|
||||
}
|
||||
|
||||
public ComputerFamily family() {
|
||||
@ -50,4 +55,8 @@ public class ComputerContainerData implements ContainerData {
|
||||
public ItemStack displayStack() {
|
||||
return displayStack;
|
||||
}
|
||||
|
||||
public int uploadMaxSize() {
|
||||
return uploadMaxSize;
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import com.google.common.annotations.VisibleForTesting;
|
||||
import dan200.computercraft.shared.computer.menu.ComputerMenu;
|
||||
import dan200.computercraft.shared.computer.upload.FileSlice;
|
||||
import dan200.computercraft.shared.computer.upload.FileUpload;
|
||||
import dan200.computercraft.shared.config.Config;
|
||||
import io.netty.handler.codec.DecoderException;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
@ -22,7 +23,6 @@ import java.util.function.Consumer;
|
||||
import static dan200.computercraft.core.util.Nullability.assertNonNull;
|
||||
|
||||
public class UploadFileMessage extends ComputerServerMessage {
|
||||
public static final int MAX_SIZE = 512 * 1024;
|
||||
static final int MAX_PACKET_SIZE = 30 * 1024; // Max packet size is 32767.
|
||||
private static final int HEADER_SIZE = 16 + 1; // 16 bytes for the UUID, 4 for the flag.
|
||||
|
||||
@ -60,7 +60,7 @@ public class UploadFileMessage extends ComputerServerMessage {
|
||||
for (var i = 0; i < nFiles; i++) {
|
||||
var name = buf.readUtf(MAX_FILE_NAME);
|
||||
var size = buf.readVarInt();
|
||||
if (size > MAX_SIZE || (totalSize += size) > MAX_SIZE) {
|
||||
if (size > Config.uploadMaxSize || (totalSize += size) > Config.uploadMaxSize) {
|
||||
throw new DecoderException("Files are too large");
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
package dan200.computercraft.shared.network.server;
|
||||
|
||||
import dan200.computercraft.shared.computer.upload.FileUpload;
|
||||
import dan200.computercraft.shared.config.Config;
|
||||
import dan200.computercraft.test.core.ArbitraryByteBuffer;
|
||||
import dan200.computercraft.test.shared.FakeContainer;
|
||||
import dan200.computercraft.test.shared.WithMinecraft;
|
||||
@ -114,7 +115,7 @@ public class UploadFileMessageTest {
|
||||
Arbitraries.strings().ofMinLength(1).ascii().ofMaxLength(MAX_FILE_NAME),
|
||||
Arbitraries.strings().ofMinLength(1).ofMaxLength(MAX_FILE_NAME / 4)
|
||||
)),
|
||||
ArbitraryByteBuffer.bytes().ofMaxSize(MAX_SIZE)
|
||||
ArbitraryByteBuffer.bytes().ofMaxSize(Config.uploadMaxSize)
|
||||
).as(UploadFileMessageTest::file);
|
||||
}
|
||||
|
||||
@ -122,7 +123,7 @@ public class UploadFileMessageTest {
|
||||
Arbitrary<List<FileUpload>> fileUploads() {
|
||||
return fileUpload().list()
|
||||
.ofMinSize(1).ofMaxSize(MAX_FILES)
|
||||
.filter(us -> us.stream().mapToInt(u -> u.getBytes().remaining()).sum() <= MAX_SIZE);
|
||||
.filter(us -> us.stream().mapToInt(u -> u.getBytes().remaining()).sum() <= Config.uploadMaxSize);
|
||||
}
|
||||
|
||||
private static FileUpload file(String name, ByteBuffer buffer) {
|
||||
|
@ -163,6 +163,8 @@
|
||||
"gui.computercraft.config.turtle.normal_fuel_limit": "Turtle fuel limit",
|
||||
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "The fuel limit for Turtles.\nRange: > 0",
|
||||
"gui.computercraft.config.turtle.tooltip": "Various options relating to turtles.",
|
||||
"gui.computercraft.config.upload_max_size": "File upload size limit (bytes)",
|
||||
"gui.computercraft.config.upload_max_size.tooltip": "The file upload size limit, in bytes. Must be in range of 1 KiB and 16 MiB.\nKeep in mind that uploads are processed in a single tick - large files or\npoor network performance can stall the networking thread. And mind the disk space!\nRange: 1024 ~ 16777216",
|
||||
"gui.computercraft.config.upload_nag_delay": "Upload nag delay",
|
||||
"gui.computercraft.config.upload_nag_delay.tooltip": "The delay in seconds after which we'll notify about unhandled imports. Set to 0 to disable.\nRange: 0 ~ 60",
|
||||
"gui.computercraft.pocket_computer_overlay": "Pocket computer open. Press ESC to close.",
|
||||
|
@ -163,6 +163,8 @@
|
||||
"gui.computercraft.config.turtle.normal_fuel_limit": "Turtle fuel limit",
|
||||
"gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "The fuel limit for Turtles.\nRange: > 0",
|
||||
"gui.computercraft.config.turtle.tooltip": "Various options relating to turtles.",
|
||||
"gui.computercraft.config.upload_max_size": "File upload size limit (bytes)",
|
||||
"gui.computercraft.config.upload_max_size.tooltip": "The file upload size limit, in bytes. Must be in range of 1 KiB and 16 MiB.\nKeep in mind that uploads are processed in a single tick - large files or\npoor network performance can stall the networking thread. And mind the disk space!\nRange: 1024 ~ 16777216",
|
||||
"gui.computercraft.config.upload_nag_delay": "Upload nag delay",
|
||||
"gui.computercraft.config.upload_nag_delay.tooltip": "The delay in seconds after which we'll notify about unhandled imports. Set to 0 to disable.\nRange: 0 ~ 60",
|
||||
"gui.computercraft.pocket_computer_overlay": "Pocket computer open. Press ESC to close.",
|
||||
|
Loading…
Reference in New Issue
Block a user