Fix formspec escaping, add escaping to info.txt for texture packs.

This commit is contained in:
Novatux 2013-08-14 20:21:39 +02:00 committed by Kahrl
parent a97c085e9e
commit 7921fe2cd1
5 changed files with 45 additions and 90 deletions

@ -39,11 +39,11 @@ function menu.render_favorite(spec,render_details)
local text = "" local text = ""
if spec.name ~= nil then if spec.name ~= nil then
text = text .. fs_escape_string(spec.name:trim()) text = text .. engine.formspec_escape(spec.name:trim())
-- if spec.description ~= nil and -- if spec.description ~= nil and
-- fs_escape_string(spec.description):trim() ~= "" then -- engine.formspec_escape(spec.description):trim() ~= "" then
-- text = text .. " (" .. fs_escape_string(spec.description) .. ")" -- text = text .. " (" .. engine.formspec_escape(spec.description) .. ")"
-- end -- end
else else
if spec.address ~= nil then if spec.address ~= nil then
@ -93,7 +93,7 @@ function menu.render_favorite(spec,render_details)
string.format("%03d",spec.clients_max) .. " " string.format("%03d",spec.clients_max) .. " "
end end
return playercount .. fs_escape_string(details) .. text return playercount .. engine.formspec_escape(details) .. text
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -900,7 +900,7 @@ function tabbuilder.tab_multiplayer()
if menu.fav_selected ~= nil and if menu.fav_selected ~= nil and
menu.favorites[menu.fav_selected].description ~= nil then menu.favorites[menu.fav_selected].description ~= nil then
retval = retval .. retval = retval ..
fs_escape_string(menu.favorites[menu.fav_selected].description,true) engine.formspec_escape(menu.favorites[menu.fav_selected].description,true)
end end
retval = retval .. retval = retval ..
@ -1040,7 +1040,7 @@ function tabbuilder.tab_TP()
menu.render_TP_list(TPlist) .. menu.render_TP_list(TPlist) ..
";" .. index .. "]" .. ";" .. index .. "]" ..
"image[0.65,0.25;4.0,3.7;"..(menu.TPscreen or no_screenshot).."]".. "image[0.65,0.25;4.0,3.7;"..(menu.TPscreen or no_screenshot).."]"..
"textarea[1.0,3.25;3.7,1.5;;"..(menu.TPinfo or "")..";]" "textarea[1.0,3.25;3.7,1.5;;"..engine.formspec_escape(menu.TPinfo or "")..";]"
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

@ -99,10 +99,3 @@ function minetest.setting_get_pos(name)
return minetest.string_to_pos(value) return minetest.string_to_pos(value)
end end
function minetest.formspec_escape(str)
str = string.gsub(str, "\\", "\\\\")
str = string.gsub(str, "%[", "\\[")
str = string.gsub(str, "%]", "\\]")
return str
end

@ -184,6 +184,18 @@ function cleanup_path(temppath)
return temppath return temppath
end end
local tbl = engine or minetest
function tbl.formspec_escape(text)
if text ~= nil then
text = string.gsub(text,"\\","\\\\")
text = string.gsub(text,"%]","\\]")
text = string.gsub(text,"%[","\\[")
text = string.gsub(text,";","\\;")
text = string.gsub(text,",","\\,")
end
return text
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- mainmenu only functions -- mainmenu only functions
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -197,41 +209,7 @@ if engine ~= nil then
return nil return nil
end end
--------------------------------------------------------------------------------
function fs_escape_string(text)
if text ~= nil then
while (text:find("\r\n") ~= nil) do
local newtext = text:sub(1,text:find("\r\n")-1)
newtext = newtext .. " " .. text:sub(text:find("\r\n")+3)
text = newtext
end
while (text:find("\n") ~= nil) do
local newtext = text:sub(1,text:find("\n")-1)
newtext = newtext .. " " .. text:sub(text:find("\n")+1)
text = newtext
end
while (text:find("\r") ~= nil) do
local newtext = text:sub(1,text:find("\r")-1)
newtext = newtext .. " " .. text:sub(text:find("\r")+1)
text = newtext
end
text = string.gsub(text,"\\","\\\\")
text = string.gsub(text,"%]","\\]")
text = string.gsub(text,"%[","\\[")
text = string.gsub(text,";","\\;")
text = string.gsub(text,",","\\,")
end
return text
end
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- core only fct -- core only fct
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -241,3 +219,4 @@ if minetest ~= nil then
return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")" return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
end end
end end

@ -233,12 +233,12 @@ function modstore.getmodlist(list)
--title + author --title + author
retval = retval .."label[2.75," .. screenshot_ypos .. ";" .. retval = retval .."label[2.75," .. screenshot_ypos .. ";" ..
fs_escape_string(details.title) .. " (" .. details.author .. ")]" engine.formspec_escape(details.title) .. " (" .. details.author .. ")]"
--description --description
local descriptiony = screenshot_ypos + 0.5 local descriptiony = screenshot_ypos + 0.5
retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.55;;" .. retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.55;;" ..
fs_escape_string(details.description) .. ";]" engine.formspec_escape(details.description) .. ";]"
--rating --rating
local ratingy = screenshot_ypos + 0.6 local ratingy = screenshot_ypos + 0.6
retval = retval .."label[10.1," .. ratingy .. ";Rating: " .. details.rating .."]" retval = retval .."label[10.1," .. ratingy .. ";Rating: " .. details.rating .."]"

@ -143,51 +143,34 @@ int GUIFormSpecMenu::getListboxIndex(std::string listboxname) {
return -1; return -1;
} }
std::vector<std::string> split(const std::string &s, char delim, bool escape=false) { std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> tokens; std::vector<std::string> tokens;
if (!escape) { std::string current = "";
int startpos = 0; bool last_was_escape = false;
size_t nextpos = s.find(delim); for(unsigned int i=0; i < s.size(); i++) {
if (last_was_escape) {
while(nextpos != std::string::npos) { current += '\\';
std::string toadd = s.substr(startpos,nextpos-startpos); current += s.c_str()[i];
tokens.push_back(toadd); last_was_escape = false;
startpos = nextpos+1;
nextpos = s.find(delim,nextpos+1);
} }
else {
//push last element if (s.c_str()[i] == delim) {
tokens.push_back(s.substr(startpos)); tokens.push_back(current);
} current = "";
else { last_was_escape = false;
std::string current = ""; }
current += s.c_str()[0]; else if (s.c_str()[i] == '\\'){
bool last_was_escape = false; last_was_escape = true;
for(unsigned int i=1; i < s.size(); i++) { }
if (last_was_escape) { else {
current += '\\';
current += s.c_str()[i]; current += s.c_str()[i];
last_was_escape = false; last_was_escape = false;
} }
else {
if (s.c_str()[i] == delim) {
tokens.push_back(current);
current = "";
last_was_escape = false;
}
else if (s.c_str()[i] == '\\'){
last_was_escape = true;
}
else {
current += s.c_str()[i];
last_was_escape = false;
}
}
} }
//push last element
tokens.push_back(current);
} }
//push last element
tokens.push_back(current);
return tokens; return tokens;
} }
@ -518,7 +501,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
std::vector<std::string> v_pos = split(parts[0],','); std::vector<std::string> v_pos = split(parts[0],',');
std::vector<std::string> v_geom = split(parts[1],','); std::vector<std::string> v_geom = split(parts[1],',');
std::string name = parts[2]; std::string name = parts[2];
std::vector<std::string> items = split(parts[3],',',true); std::vector<std::string> items = split(parts[3],',');
std::string str_initial_selection = ""; std::string str_initial_selection = "";
std::string str_transparent = "false"; std::string str_transparent = "false";
@ -911,7 +894,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,std::vector<std::string>& p
} }
void GUIFormSpecMenu::parseField(parserData* data,std::string element,std::string type) { void GUIFormSpecMenu::parseField(parserData* data,std::string element,std::string type) {
std::vector<std::string> parts = split(element,';',true); std::vector<std::string> parts = split(element,';');
if (parts.size() == 3) { if (parts.size() == 3) {
parseSimpleField(data,parts); parseSimpleField(data,parts);
@ -1275,7 +1258,7 @@ void GUIFormSpecMenu::parseElement(parserData* data,std::string element) {
if (element == "") if (element == "")
return; return;
std::vector<std::string> parts = split(element,'[', true); std::vector<std::string> parts = split(element,'[');
// ugly workaround to keep compatibility // ugly workaround to keep compatibility
if (parts.size() > 2) { if (parts.size() > 2) {
@ -1428,7 +1411,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
m_boxes.clear(); m_boxes.clear();
std::vector<std::string> elements = split(m_formspec_string,']',true); std::vector<std::string> elements = split(m_formspec_string,']');
for (unsigned int i=0;i< elements.size();i++) { for (unsigned int i=0;i< elements.size();i++) {
parseElement(&mydata,elements[i]); parseElement(&mydata,elements[i]);