urbackup_backend/urbackup/server_prepare_hash.cpp
2011-04-13 22:18:14 +02:00

138 lines
3.3 KiB
C++

/*************************************************************************
* UrBackup - Client/Server backup system
* Copyright (C) 2011 Martin Raiber
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
#ifndef CLIENT_ONLY
#include "server_prepare_hash.h"
#include "fileclient/data.h"
#include "../Interface/Server.h"
#include "sha2/sha2.h"
#include "../stringtools.h"
#include "server_log.h"
#include "os_functions.h"
BackupServerPrepareHash::BackupServerPrepareHash(IPipe *pPipe, IPipe *pExitpipe, IPipe *pOutput, IPipe *pExitpipe_hash, int pClientid)
{
pipe=pPipe;
exitpipe=pExitpipe;
output=pOutput;
exitpipe_hash=pExitpipe_hash;
clientid=pClientid;
working=false;
}
BackupServerPrepareHash::~BackupServerPrepareHash(void)
{
Server->destroy(pipe);
}
void BackupServerPrepareHash::operator()(void)
{
while(true)
{
working=false;
std::string data;
size_t rc=pipe->Read(&data);
if(data=="exitnow")
{
output->Write("exitnow");
std::string t;
exitpipe_hash->Read(&t);
Server->destroy(exitpipe_hash);
exitpipe->Write("ok");
Server->Log("server_prepare_hash Thread finished");
delete this;
return;
}
else if(data=="exit")
{
output->Write("exit");
Server->destroy(exitpipe);
Server->Log("server_prepare_hash Thread finished");
delete this;
return;
}
if(rc>0)
{
working=true;
CRData rd(&data);
std::string temp_fn;
rd.getStr(&temp_fn);
unsigned int backupid;
rd.getUInt(&backupid);
std::string tfn;
rd.getStr(&tfn);
IFile *tf=Server->openFile(os_file_prefix()+Server->ConvertToUnicode(temp_fn), MODE_READ);
if(tf==NULL)
{
ServerLogger::Log(clientid, "Error opening file \""+temp_fn+"\" from pipe for reading", LL_ERROR);
}
else
{
ServerLogger::Log(clientid, "PT: Hashing file \""+ExtractFileName(tfn)+"\"", LL_DEBUG);
std::string h=hash(tf);
Server->destroy(tf);
CWData data;
data.addString(temp_fn);
data.addUInt(backupid);
data.addString(tfn);
data.addString(h);
output->Write(data.getDataPtr(), data.getDataSize() );
}
}
}
}
std::string BackupServerPrepareHash::hash(IFile *f)
{
f->Seek(0);
unsigned char buf[4096];
_u32 rc;
sha512_ctx ctx;
sha512_init(&ctx);
do
{
rc=f->Read((char*)buf, 4096);
if(rc>0)
sha512_update(&ctx, buf, rc);
}
while(rc==4096);
std::string ret;
ret.resize(64);
sha512_final(&ctx, (unsigned char*)&ret[0]);
return ret;
}
bool BackupServerPrepareHash::isWorking(void)
{
return working;
}
#endif //CLIENT_ONLY