Merge with develop

--HG--
branch : compatibility-develop
This commit is contained in:
kervala 2016-10-18 17:47:19 +02:00
commit 9b70baf02b
2 changed files with 63 additions and 42 deletions

View file

@ -109,7 +109,7 @@ CMySQLResult::CMySQLResult(MYSQL_RES* res)
/// Constructor
CMySQLResult::CMySQLResult(MYSQL* database)
{
{
_Result = mysql_store_result(database);
}
/// Destructor
@ -174,7 +174,7 @@ MYSQL_ROW CMySQLResult::fetchRow()
/* ***************************************************************************
Doc :
When an entity is added in the service mirror, the service checks if its name is in the name cache. If
When an entity is added in the service mirror, the service checks if its name is in the name cache. If
the string ID is not known, the server ask the IOS for the string.
When the IOS sends back a string, the server broadcasts this string to the connected clients.
@ -275,7 +275,7 @@ void clientWantsToConnect ( TSockId from, void *arg )
nlinfo ("Add client %d", Clients.size());
Clients.push_back (new CMonitorClient(from));
CMonitorService &ms = getMonitorService();
// send params about this sever the client
@ -284,7 +284,7 @@ void clientWantsToConnect ( TSockId from, void *arg )
uint32 version = 0;
msgout.serial(version);
msgout.serial(ms.LoginRequired);
Server->send(msgout, from);
Server->send(msgout, from);
Clients.back()->Authentificated = !ms.LoginRequired;
@ -333,7 +333,7 @@ void clientSetWindow (CMessage &msgin, TSockId from, CCallbackNetBase &netbase)
for (uint i = 0; i < Clients.size(); ++i)
{
if (Clients[i]->getSock() == from && Clients[i]->Authentificated)
{
{
nlinfo ("Client %d sets window (%.0f,%.0f) (%.0f,%.0f)", i, xmin, ymin, xmax, ymax);
Clients[i]->setWindow(xmin,ymin,xmax,ymax);
Clients[i]->resetVision();
@ -377,17 +377,21 @@ void clientAuthentication(CMessage &msgin, TSockId from, CCallbackNetBase &netba
{
if (!Clients[i]->Authentificated && Clients[i]->getSock() == from)
{
if (!Clients[i]->BadLogin) // don't allow new login attempt while thisflag is set
if (!Clients[i]->BadLogin) // don't allow new login attempt while this flag is set
{
// escape login
char esccapedLogin[100];
size_t len = mysql_real_escape_string(DatabaseConnection, esccapedLogin, login.c_str(), login.length());
// make a db request to to db to see if password is valid
std::string queryStr = toString("SELECT Password FROM user where Login='%s'", login.c_str());
std::string queryStr = toString("SELECT Password FROM user where Login='%s'", esccapedLogin);
int result = mysql_query(DatabaseConnection, queryStr.c_str());
if (result == 0)
{
CMySQLResult sqlResult(DatabaseConnection);
if (sqlResult.success() && sqlResult.numRows() == 1)
{
MYSQL_ROW row = sqlResult.fetchRow();
MYSQL_ROW row = sqlResult.fetchRow();
if (sqlResult.numFields() == 1)
{
if (strlen(row[0]) > 2)
@ -407,19 +411,19 @@ void clientAuthentication(CMessage &msgin, TSockId from, CCallbackNetBase &netba
Clients[i]->Authentificated = true;
// password is good
CMessage msgout;
msgout.setType("AUTHENT_VALID");
msgout.setType("AUTHENT_VALID");
Server->send(msgout, from);
return;
}
}
}
}
}
}
// fail the authentication
// Do not send result immediatly to avoid a potential hacker
// to try a dictionnary or that dort of things
BadLoginClients.insert(std::pair<NLMISC::TTime, NLMISC::CRefPtr<CMonitorClient> >(
NLMISC::CTime::getLocalTime() + LOGIN_RETRY_DELAY_IN_MILLISECONDS,
NLMISC::CTime::getLocalTime() + LOGIN_RETRY_DELAY_IN_MILLISECONDS,
(NLMISC::CRefPtr<CMonitorClient>)Clients[i]));
Clients[i]->BadLogin =true;
return;
@ -527,9 +531,9 @@ void CMonitorService::init ()
// ***************************************************************************
void CMonitorService::release ()
void CMonitorService::release ()
{
disconnectFromDatabase();
disconnectFromDatabase();
// release sub systems
// CMessages::release();
CMirrors::release();
@ -568,7 +572,7 @@ bool CMonitorService::update ()
client.update();
}
}
// Sent bad login msg to clients at the right time
NLMISC::TTime currentTime = NLMISC::CTime::getLocalTime();
while (!BadLoginClients.empty() && BadLoginClients.begin()->first <= currentTime)
@ -577,9 +581,9 @@ bool CMonitorService::update ()
if (client != NULL)
{
CMessage msgout;
msgout.setType("AUTHENT_INVALID");
msgout.setType("AUTHENT_INVALID");
Server->send(msgout, client->getSock());
client->BadLogin = false; // allow to accept login again for that client
client->BadLogin = false; // allow to accept login again for that client
}
BadLoginClients.erase(BadLoginClients.begin());
}

View file

@ -408,28 +408,53 @@ bool CFilesExtractor::extract7z()
QString path = QString::fromUtf16(temp);
QString filename = QFileInfo(path).fileName();
if (!isDir)
{
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize,
&offset, &outSizeProcessed, &allocImp, &allocTempImp);
if (res != SZ_OK) break;
}
QString destPath = m_destinationDirectory + '/' + path;
QDir dir;
// get uncompressed size
quint64 uncompressedSize = SzArEx_GetFileSize(&db, i);
// get modification time
quint32 modificationTime = 0;
if (SzBitWithVals_Check(&db.MTime, i))
{
modificationTime = convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i]);
}
if (isDir)
{
dir.mkpath(destPath);
QDir().mkpath(destPath);
continue;
}
dir.mkpath(QFileInfo(destPath).absolutePath());
// check if file exists
if (QFile::exists(destPath))
{
QFileInfo currentFileInfo(destPath);
// skip file if same size and same modification date
if (currentFileInfo.lastModified().toTime_t() == modificationTime && currentFileInfo.size() == uncompressedSize)
{
// update progress
totalUncompressed += uncompressedSize;
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
continue;
}
}
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize,
&offset, &outSizeProcessed, &allocImp, &allocTempImp);
if (res != SZ_OK) break;
// create file directory
QDir().mkpath(QFileInfo(destPath).absolutePath());
// create file
QFile outFile(destPath);
if (!outFile.open(QFile::WriteOnly))
@ -446,10 +471,7 @@ bool CFilesExtractor::extract7z()
qint64 currentProcessedSize = outFile.write((const char*)(outBuffer + offset), currentSizeToProcess);
// errors only occur when returned size is -1
if (currentProcessedSize < 0)
{
break;
}
if (currentProcessedSize < 0) break;
offset += currentProcessedSize;
currentSizeToProcess -= currentProcessedSize;
@ -465,25 +487,20 @@ bool CFilesExtractor::extract7z()
outFile.close();
totalUncompressed += SzArEx_GetFileSize(&db, i);
totalUncompressed += uncompressedSize;
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
// set attrinbutes
// set attributes
if (SzBitWithVals_Check(&db.Attribs, i))
{
Set7zFileAttrib(destPath, db.Attribs.Vals[i]);
}
// set modification time
if (SzBitWithVals_Check(&db.MTime, i))
if (!NLMISC::CFile::setFileModificationDate(qToUtf8(destPath), modificationTime))
{
char buffer[1024];
if (!NLMISC::CFile::setFileModificationDate(qToUtf8(destPath), convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i])))
{
qDebug() << "Unable to change date of " << destPath;
}
qDebug() << "Unable to change date of " << destPath;
}
}