From 49db6344e1db0e2b476b8a736e2813efd4ea6af8 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 16 Mar 2020 16:15:50 +0100 Subject: [PATCH] Check if client name is correct before starting backup --- urbackupclient/ClientService.cpp | 4 +++ urbackupclient/ClientService.h | 1 + urbackupclient/ClientServiceCMD.cpp | 6 +++++ urbackupserver/ClientMain.cpp | 41 +++++++++++++++++++++++++++++ urbackupserver/ClientMain.h | 2 ++ 5 files changed, 54 insertions(+) diff --git a/urbackupclient/ClientService.cpp b/urbackupclient/ClientService.cpp index 499f9007..bc7e3b47 100644 --- a/urbackupclient/ClientService.cpp +++ b/urbackupclient/ClientService.cpp @@ -1098,6 +1098,10 @@ void ClientConnector::ReceivePackets(IRunOtherCallback* p_run_other) { CMD_ADD_IDENTITY(cmd.substr(13)); continue; } + else if (cmd=="GET CLIENTNAME") + { + CMD_GET_CLIENTNAME(cmd); continue; + } } if(pw_ok) //Commands from client frontend { diff --git a/urbackupclient/ClientService.h b/urbackupclient/ClientService.h index 51da0048..b51f9f29 100644 --- a/urbackupclient/ClientService.h +++ b/urbackupclient/ClientService.h @@ -342,6 +342,7 @@ private: void CMD_RESTORE_OK(str_map ¶ms); void CMD_CLIENT_ACCESS_KEY(const std::string& cmd); void CMD_WRITE_TOKENS(const std::string& cmd); + void CMD_GET_CLIENTNAME(const std::string& cmd); int getCapabilities(IDatabase* db); bool multipleChannelServers(); diff --git a/urbackupclient/ClientServiceCMD.cpp b/urbackupclient/ClientServiceCMD.cpp index 6f6937af..1a1a7446 100644 --- a/urbackupclient/ClientServiceCMD.cpp +++ b/urbackupclient/ClientServiceCMD.cpp @@ -2989,4 +2989,10 @@ void ClientConnector::CMD_WRITE_TOKENS(const std::string& cmd) tcpstack.Send(pipe, "ASYNC-async_id=" + bytesToHex(async_id)); } + +void ClientConnector::CMD_GET_CLIENTNAME(const std::string& cmd) +{ + std::string name = IndexThread::getFileSrv()->getServerName(); + tcpstack.Send(pipe, "name="+EscapeParamString(name)); +} diff --git a/urbackupserver/ClientMain.cpp b/urbackupserver/ClientMain.cpp index 24fb9bfa..0c9f03fa 100644 --- a/urbackupserver/ClientMain.cpp +++ b/urbackupserver/ClientMain.cpp @@ -853,6 +853,15 @@ void ClientMain::operator ()(void) if(backup_queue[i].ticket==ILLEGAL_THREADPOOL_TICKET) { can_start=true; + break; + } + } + + if (can_start) + { + if (!checkClientName(can_start)) + { + break; } } @@ -3422,6 +3431,38 @@ void ClientMain::updateVirtualClients() } BackupServer::setVirtualClients(clientname, virtual_clients); +} + +bool ClientMain::checkClientName(bool& continue_start_backups) +{ + if (internet_connection + || !clientsubname.empty()) + return true; + + std::string msg = sendClientMessageRetry("GET CLIENTNAME", "Error getting name of client", 10000, 10, false); + + if (msg == "ERR") + { + return true; + } + else if (msg.empty()) + { + continue_start_backups = false; + return true; + } + + str_map msg_params; + ParseParamStrHttp(msg, &msg_params); + + if (msg_params["name"] == clientname) + { + return true; + } + else + { + Server->Log("Client name check failed. Expected name is \"" + clientname + "\" got \"" + msg_params["name"] + "\"", LL_WARNING); + return false; + } } bool ClientMain::renameClient(const std::string & clientuid) diff --git a/urbackupserver/ClientMain.h b/urbackupserver/ClientMain.h index 575abf8c..c12d0f20 100644 --- a/urbackupserver/ClientMain.h +++ b/urbackupserver/ClientMain.h @@ -313,6 +313,8 @@ private: bool renameClient(const std::string& clientuid); void updateVirtualClients(); + bool checkClientName(bool& continue_start_backups); + struct SPathComponents {