Use a safer implementation of gsub in core.chat_format_message (#9133)

This search-and-replace implementation does not use Lua pattern-matching
This commit is contained in:
ANAND 2019-11-26 00:33:34 +05:30 committed by SmallJoker
parent 0b2f0914cc
commit 4b6bff46e1

@ -1,27 +1,41 @@
-- Minetest: builtin/game/chat.lua -- Minetest: builtin/game/chat.lua
-- Helper function that implements search and replace without pattern matching
-- Returns the string and a boolean indicating whether or not the string was modified
local function safe_gsub(s, replace, with)
local i1, i2 = s:find(replace, 1, true)
if not i1 then
return s, false
end
return s:sub(1, i1 - 1) .. with .. s:sub(i2 + 1), true
end
-- --
-- Chat message formatter -- Chat message formatter
-- --
-- Implemented in Lua to allow redefinition -- Implemented in Lua to allow redefinition
function core.format_chat_message(name, message) function core.format_chat_message(name, message)
local str = core.settings:get("chat_message_format")
local error_str = "Invalid chat message format - missing %s" local error_str = "Invalid chat message format - missing %s"
local i local str = core.settings:get("chat_message_format")
local replaced
str, i = str:gsub("@name", name, 1) -- Name
if i == 0 then str, replaced = safe_gsub(str, "@name", name)
if not replaced then
error(error_str:format("@name"), 2) error(error_str:format("@name"), 2)
end end
str, i = str:gsub("@message", message, 1) -- Timestamp
if i == 0 then str = safe_gsub(str, "@timestamp", os.date("%H:%M:%S", os.time()))
-- Insert the message into the string only after finishing all other processing
str, replaced = safe_gsub(str, "@message", message)
if not replaced then
error(error_str:format("@message"), 2) error(error_str:format("@message"), 2)
end end
str = str:gsub("@timestamp", os.date("%H:%M:%S", os.time()), 1)
return str return str
end end