Map download: Escape ':' to '_' (#9235)
authorMontandalar <jbis1337@hotmail.com>
Sat, 11 Jan 2020 19:47:34 +0000 (06:47 +1100)
committerSmallJoker <SmallJoker@users.noreply.github.com>
Sat, 11 Jan 2020 19:47:34 +0000 (20:47 +0100)
This is necessary under Windows systems, and direct IPv6 connections.
Windows universally disallows ':' from occuring in filenames.

Other disallowed characters on Windows:

\ / * ? " < > |

are not relevant to hostnames, IPv4 or IPv6 addresses.

Anyone who has got an existing server map saved on Linux with ':' in
the world save will want to keep that save.

src/client/client.cpp

index 315fcd4108fce315d1226bebef4d4c2f7a230f09..94b483802c5d184ee822faf593593b926610b9ee 100644 (file)
@@ -782,11 +782,20 @@ void Client::initLocalMapSaving(const Address &address,
                return;
        }
 
-       const std::string world_path = porting::path_user
-               + DIR_DELIM + "worlds"
-               + DIR_DELIM + "server_"
+       std::string world_path;
+#define set_world_path(hostname) \
+       world_path = porting::path_user \
+               + DIR_DELIM + "worlds" \
+               + DIR_DELIM + "server_" \
                + hostname + "_" + std::to_string(address.getPort());
 
+       set_world_path(hostname);
+       if (!fs::IsDir(world_path)) {
+               std::string hostname_escaped = hostname;
+               str_replace(hostname_escaped, ':', '_');
+               set_world_path(hostname_escaped);
+       }
+#undef set_world_path
        fs::CreateAllDirs(world_path);
 
        m_localdb = new MapDatabaseSQLite3(world_path);