From 6c282b0720897ad58f48197e5be030c17fef6cb6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Laurent?= <francois.laurent@posteo.net>
Date: Wed, 16 Apr 2025 11:12:50 +0200
Subject: [PATCH] fix #316

---
 src/files.jl       | 21 +++++++++++++++++++++
 src/larvatagger.js |  1 +
 2 files changed, 22 insertions(+)

diff --git a/src/files.jl b/src/files.jl
index a9f9a12..9033cc1 100644
--- a/src/files.jl
+++ b/src/files.jl
@@ -249,6 +249,22 @@ end
 
 getoutput(controller) = gethub(controller)[:output]
 
+function valid_filename(name)
+    # adapted from NyxUI.jl (MIT license, same author)
+    windows_extra = "|:*?<>"
+    for c in "./\\'\"`" * windows_extra
+        if c in name
+            return false
+        end
+    end
+    for nonprintable in 0x0:0x31
+        if nonprintable in name
+            return false
+        end
+    end
+    return true
+end
+
 interpolate(s="yyyymmdd_HHMMSS") = Dates.format(Dates.now(), s)
 
 function savetofile(controller, file; datafile=nothing, merge=false)
@@ -474,6 +490,11 @@ function getoutputfile(controller)
             dir = cwd(controller)
             if isnothing(file)
                 outputfile.name.val = "{yyyymmdd_HHMMSS}.label"
+            elseif !valid_filename(file)
+                @warn "Invalid filename; saving to date_time format instead" file
+                file = "{yyyymmdd_HHMMSS}.label"
+                savetofile(hub, file)
+                reset!(outputfile)
             elseif isfile(joinpath(dir, file))
                 twooptiondialog(hub, outputfile.merge,
                     "File already exists",
diff --git a/src/larvatagger.js b/src/larvatagger.js
index 8437424..680b6cd 100644
--- a/src/larvatagger.js
+++ b/src/larvatagger.js
@@ -118,6 +118,7 @@ const LarvaTagger = (function () {
 		return false;
 	}
 
+	// TODO: validate filepath similarly to valid_filename in files.jl
 	function setOutputFilename(obs) {
 		var defaultfilepath = obs.value;
 		if (defaultfilepath === null) {
-- 
GitLab