util/datamanager.lua
changeset 8302 756a2a00e7e7
parent 8095 0a1c0f1107d2
child 8558 4f0f5b49bb03
--- a/util/datamanager.lua	Sun Oct 08 01:28:32 2017 +0200
+++ b/util/datamanager.lua	Sun Oct 08 18:34:57 2017 +0200
@@ -42,7 +42,7 @@
 local _ENV = nil;
 
 ---- utils -----
-local encode, decode;
+local encode, decode, store_encode;
 do
 	local urlcodes = setmetatable({}, { __index = function (t, k) t[k] = char(tonumber(k, 16)); return t[k]; end });
 
@@ -53,6 +53,12 @@
 	encode = function (s)
 		return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end));
 	end
+
+	-- Special encode function for store names, which historically were unencoded.
+	-- All currently known stores use a-z and underscore, so this one preserves underscores.
+	store_encode = function (s)
+		return s and (s:gsub("[^_%w]", function (c) return format("%%%02x", c:byte()); end));
+	end
 end
 
 if not atomic_append then
@@ -119,6 +125,7 @@
 	ext = ext or "dat";
 	host = (host and encode(host)) or "_global";
 	username = username and encode(username);
+	datastore = store_encode(datastore);
 	if username then
 		if create then mkdir(mkdir(mkdir(data_path).."/"..host).."/"..datastore); end
 		return format("%s/%s/%s/%s.%s", data_path, host, datastore, username, ext);