summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeuin <[email protected]>2020-04-23 21:33:07 +0800
committerkeuin <[email protected]>2020-04-23 21:33:07 +0800
commit36451c24439b6fc0a407b3aae12048125539f8d5 (patch)
treee7382d2f10f7930a2ac048925110f6630323f597
parentf7f918f19b5d0597d21f03b7085425c3a93cc5f6 (diff)
1.2.0-dev:1.2.0-dev
- Optimized ZipUtil. - Added support for Asian characters (Chinese, Japanese, Korean) in backup name. - Add validate for backup name (in file name).
-rw-r--r--gradle.properties2
-rw-r--r--src/main/java/com/keuin/kbackupfabric/KBCommandRegister.java4
-rw-r--r--src/main/java/com/keuin/kbackupfabric/KBCommands.java24
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/PrintUtil.java2
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/ZipUtil.java2
5 files changed, 24 insertions, 10 deletions
diff --git a/gradle.properties b/gradle.properties
index e6e62df..16593c4 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -6,7 +6,7 @@ minecraft_version=1.14.4
yarn_mappings=1.14.4+build.16
loader_version=0.8.2+build.194
# Mod Properties
-mod_version=1.1.0-dev
+mod_version=1.2.0-dev
maven_group=com.keuin.kbackupfabric
archives_base_name=kbackup-fabric
# Dependencies
diff --git a/src/main/java/com/keuin/kbackupfabric/KBCommandRegister.java b/src/main/java/com/keuin/kbackupfabric/KBCommandRegister.java
index ec67a64..775dd62 100644
--- a/src/main/java/com/keuin/kbackupfabric/KBCommandRegister.java
+++ b/src/main/java/com/keuin/kbackupfabric/KBCommandRegister.java
@@ -19,10 +19,10 @@ public final class KBCommandRegister {
dispatcher.register(CommandManager.literal("kb").then(CommandManager.literal("list").requires(PermissionValidator::op).executes(KBCommands::list)));
// register /kb backup [name] for performing backup. OP is required.
- dispatcher.register(CommandManager.literal("kb").then(CommandManager.literal("backup").then(CommandManager.argument("backupName", StringArgumentType.string()).requires(PermissionValidator::op).executes(KBCommands::backup)).requires(PermissionValidator::op).executes(KBCommands::backupWithDefaultName)));
+ dispatcher.register(CommandManager.literal("kb").then(CommandManager.literal("backup").then(CommandManager.argument("backupName", StringArgumentType.greedyString()).requires(PermissionValidator::op).executes(KBCommands::backup)).requires(PermissionValidator::op).executes(KBCommands::backupWithDefaultName)));
// register /kb restore <name> for performing restore. OP is required.
- dispatcher.register(CommandManager.literal("kb").then(CommandManager.literal("restore").then(CommandManager.argument("backupName", StringArgumentType.string()).suggests(BackupNameSuggestionProvider.getSuggestionProvider()).requires(PermissionValidator::op).executes(KBCommands::restore)).executes(KBCommands::list)));
+ dispatcher.register(CommandManager.literal("kb").then(CommandManager.literal("restore").then(CommandManager.argument("backupName", StringArgumentType.greedyString()).suggests(BackupNameSuggestionProvider.getSuggestionProvider()).requires(PermissionValidator::op).executes(KBCommands::restore)).executes(KBCommands::list)));
// register /kb confirm for confirming the execution. OP is required.
dispatcher.register(CommandManager.literal("kb").then(CommandManager.literal("confirm").requires(PermissionValidator::op).executes(KBCommands::confirm)));
diff --git a/src/main/java/com/keuin/kbackupfabric/KBCommands.java b/src/main/java/com/keuin/kbackupfabric/KBCommands.java
index b932c80..825046d 100644
--- a/src/main/java/com/keuin/kbackupfabric/KBCommands.java
+++ b/src/main/java/com/keuin/kbackupfabric/KBCommands.java
@@ -75,7 +75,7 @@ public final class KBCommands {
if (backupName.matches("[0-9]*")) {
// Numeric param is not allowed
backupName = String.format("a%s", backupName);
- msgWarn(context, String.format("Pure numeric name is not allowed. Renamed to %s", backupName));
+ msgWarn(context, String.format("Pure numeric name is not allowed. Renaming to %s", backupName));
}
return doBackup(context, backupName);
}
@@ -123,13 +123,26 @@ public final class KBCommands {
* @return stat code.
*/
public static int backupWithDefaultName(CommandContext<ServerCommandSource> context) {
+ return doBackup(context, "noname");
+ }
+
+ private static int doBackup(CommandContext<ServerCommandSource> context, String customName) {
+ // Real backup name (compatible with legacy backup): date_name, such as 2020-04-23_21-03-00_test
//KBMain.backup("name")
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss");
String timeString = LocalDateTime.now().format(formatter);
- return doBackup(context, timeString);
- }
+ String backupName = timeString + "_" + customName;
+
+ // Validate file name
+ final char[] ILLEGAL_CHARACTERS = {'/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':'};
+ for (char c : ILLEGAL_CHARACTERS) {
+ if (backupName.contains(String.valueOf(c))) {
+ msgErr(context, String.format("Name cannot contain special character \"%c\".", c));
+ return FAILED;
+ }
+ }
- private static int doBackup(CommandContext<ServerCommandSource> context, String backupName) {
+ // Do backup
BackupMetadata metadata = new BackupMetadata(System.currentTimeMillis(), backupName);
BackupWorker.invoke(context, backupName, metadata);
return SUCCESS;
@@ -149,13 +162,14 @@ public final class KBCommands {
// do restore to backupName
String backupName = restoreBackupNameToBeConfirmed;
- PrintUtil.msgInfo(context, String.format("Restoring worlds to %s ...", backupName), true);
+ PrintUtil.msgInfo(context, String.format("Restoring to previous world %s ...", backupName), true);
// Get server
MinecraftServer server = context.getSource().getMinecraftServer();
String backupFileName = getBackupFileName(backupName);
debug("Backup file name: " + backupFileName);
File backupFile = new File(getBackupSaveDirectory(server), backupFileName);
+
PrintUtil.msgInfo(context, "Server will shutdown in a few seconds, depended on your world size and the disk speed, the restore progress may take seconds or minutes.", true);
PrintUtil.msgInfo(context, "Please do not force the server stop, or the level would be broken.", true);
PrintUtil.msgInfo(context, "After it shuts down, please restart the server manually.", true);
diff --git a/src/main/java/com/keuin/kbackupfabric/util/PrintUtil.java b/src/main/java/com/keuin/kbackupfabric/util/PrintUtil.java
index 4b93d17..de63037 100644
--- a/src/main/java/com/keuin/kbackupfabric/util/PrintUtil.java
+++ b/src/main/java/com/keuin/kbackupfabric/util/PrintUtil.java
@@ -52,7 +52,7 @@ public final class PrintUtil {
return message(context, messageText, broadcastToOps, errorStyle);
}
- public static CommandContext<ServerCommandSource> message(CommandContext<ServerCommandSource> context, String messageText, boolean broadcastToOps, Style style) {
+ private static CommandContext<ServerCommandSource> message(CommandContext<ServerCommandSource> context, String messageText, boolean broadcastToOps, Style style) {
synchronized (syncMessage) {
Text text = new LiteralText(messageText);
text.setStyle(style);
diff --git a/src/main/java/com/keuin/kbackupfabric/util/ZipUtil.java b/src/main/java/com/keuin/kbackupfabric/util/ZipUtil.java
index 5297dda..e819afc 100644
--- a/src/main/java/com/keuin/kbackupfabric/util/ZipUtil.java
+++ b/src/main/java/com/keuin/kbackupfabric/util/ZipUtil.java
@@ -172,7 +172,7 @@ public final class ZipUtil {
BufferedInputStream bis;
BufferedOutputStream bos;
ZipFile zip = new ZipFile(zipFile);
- Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
+ Enumeration<? extends ZipEntry> entries = zip.entries();
// 循环对压缩包里的每一个文件进行解压
while (entries.hasMoreElements()) {
entry = entries.nextElement();