diff --git a/src/Config.h b/src/Config.h index 767cec14..6caa401a 100644 --- a/src/Config.h +++ b/src/Config.h @@ -25,7 +25,7 @@ #define VER_LAMEXP_MAJOR 4 #define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_LO 0 -#define VER_LAMEXP_BUILD 128 +#define VER_LAMEXP_BUILD 130 #define VER_LAMEXP_SUFFIX TechPreview /* diff --git a/src/Dialog_Update.cpp b/src/Dialog_Update.cpp index 517581cd..a049fe39 100644 --- a/src/Dialog_Update.cpp +++ b/src/Dialog_Update.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -197,7 +196,7 @@ void UpdateDialog::checkForUpdates(void) if(connectionScore < MIN_CONNSCORE) { m_logFile->append(QStringList() << "" << "Testing host:" << known_hosts[i] << ""); - QString outFile = QString("%1/%2.htm").arg(QDir::tempPath(), QUuid::createUuid().toString()); + QString outFile = QString("%1/%2.htm").arg(lamexp_temp_folder(), lamexp_rand_str()); if(getFile(known_hosts[i], outFile)) { connectionScore++; @@ -288,9 +287,9 @@ bool UpdateDialog::tryUpdateMirror(UpdateInfo *updateInfo, const QString &url) bool success = false; m_logFile->append(QStringList() << "" << "Trying mirror:" << url); - QUuid uuid = QUuid::createUuid(); - QString outFileVersionInfo = QString("%1/%2.ver").arg(QDir::tempPath(), uuid.toString()); - QString outFileSignature = QString("%1/%2.sig").arg(QDir::tempPath(), uuid.toString()); + QString randPart = lamexp_rand_str(); + QString outFileVersionInfo = QString("%1/%2.ver").arg(lamexp_temp_folder(), randPart); + QString outFileSignature = QString("%1/%2.sig").arg(lamexp_temp_folder(), randPart); m_logFile->append(QStringList() << "" << "Downloading update info:"); bool ok1 = getFile(QString("%1%2").arg(url,mirror_url_postfix), outFileVersionInfo); @@ -373,15 +372,12 @@ bool UpdateDialog::checkSignature(const QString &file, const QString &signature) qWarning("CheckSignature: File and signature should be in same folder!"); return false; } - - QString keyring = QString("%1/%2.gpg").arg(QFileInfo(file).absolutePath(), QUuid::createUuid().toString()); - - if(!QFile::copy(m_binaryKeys, keyring)) + if(QFileInfo(file).absolutePath().compare(QFileInfo(m_binaryKeys).absolutePath(), Qt::CaseInsensitive) != 0) { - qWarning("CheckSignature: Failed to copy keyring file to destination folder!"); + qWarning("CheckSignature: File and keyring should be in same folder!"); return false; } - + QProcess process; process.setProcessChannelMode(QProcess::MergedChannels); process.setReadChannel(QProcess::StandardOutput); @@ -392,11 +388,10 @@ bool UpdateDialog::checkSignature(const QString &file, const QString &signature) connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)), &loop, SLOT(quit())); connect(&process, SIGNAL(readyRead()), &loop, SLOT(quit())); - process.start(m_binaryGnuPG, QStringList() << "--homedir" << "." << "--keyring" << QFileInfo(keyring).fileName() << QFileInfo(signature).fileName() << QFileInfo(file).fileName()); + process.start(m_binaryGnuPG, QStringList() << "--homedir" << "." << "--keyring" << QFileInfo(m_binaryKeys).fileName() << QFileInfo(signature).fileName() << QFileInfo(file).fileName()); if(!process.waitForStarted()) { - QFile::remove(keyring); return false; } @@ -408,8 +403,6 @@ bool UpdateDialog::checkSignature(const QString &file, const QString &signature) m_logFile->append(QString::fromLatin1(process.readLine()).simplified()); } } - - QFile::remove(keyring); m_logFile->append(QString().sprintf("Exited with code %d", process.exitCode())); return (process.exitCode() == 0); diff --git a/src/Global.cpp b/src/Global.cpp index 37fc2c0a..563407ac 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -38,11 +38,15 @@ #include #include #include +#include //LameXP includes #include "Resource.h" #include "LockedFile.h" +//Windows includes +#include + //CRT includes #include #include @@ -583,15 +587,58 @@ void lamexp_ipc_read(unsigned int *command, char* message, size_t buffSize) LAMEXP_DELETE(lamexp_ipc); } +/* + * Get a random string + */ +QString lamexp_rand_str(void) +{ + QRegExp regExp("\\{(\\w+)-(\\w+)-(\\w+)-(\\w+)-(\\w+)\\}"); + QString uuid = QUuid::createUuid().toString(); + + if(regExp.indexIn(uuid) >= 0) + { + return QString().append(regExp.cap(1)).append(regExp.cap(2)).append(regExp.cap(3)).append(regExp.cap(4)).append(regExp.cap(5)); + } + + throw "The RegExp didn't match on the UUID string. This shouldn't happen ;-)"; +} + /* * Get LameXP temp folder */ const QString &lamexp_temp_folder(void) { + const GUID LocalAppDataLowID={0xA520A1A4,0x1780,0x4FF6,{0xBD,0x18,0x16,0x73,0x43,0xC5,0xAF,0x16}}; + typedef HANDLE (WINAPI *SHGetKnownFolderPathFun)(__in const GUID &rfid, __in DWORD dwFlags, __in HANDLE hToken, __out PWSTR *ppszPath); + if(g_lamexp_temp_folder.isEmpty()) { QDir temp = QDir::temp(); + QLibrary Kernel32Lib("shell32.dll"); + SHGetKnownFolderPathFun SHGetKnownFolderPathPtr = (SHGetKnownFolderPathFun) Kernel32Lib.resolve("SHGetKnownFolderPath"); + + if(SHGetKnownFolderPathPtr) + { + WCHAR *localAppDataLowPath = NULL; + if(SHGetKnownFolderPathPtr(LocalAppDataLowID, 0x00008000, NULL, &localAppDataLowPath) == S_OK) + { + QDir localAppDataLow = QDir(QDir::fromNativeSeparators(QString::fromUtf16(reinterpret_cast(localAppDataLowPath)))); + if(localAppDataLow.exists()) + { + if(!localAppDataLow.entryList(QDir::AllDirs).contains("Temp")) + { + localAppDataLow.mkdir("Temp"); + } + if(localAppDataLow.cd("Temp")) + { + temp.setPath(localAppDataLow.canonicalPath()); + } + } + CoTaskMemFree(localAppDataLowPath); + } + } + if(!temp.exists()) { temp.mkpath("."); @@ -602,19 +649,19 @@ const QString &lamexp_temp_folder(void) } } - QString uuid = QUuid::createUuid().toString(); - if(!temp.mkdir(uuid)) + QString subDir = QString("%1.tmp").arg(lamexp_rand_str()); + if(!temp.mkdir(subDir)) { - qFatal("Temporary directory could not be created:\n%s", QString("%1/%2").arg(temp.canonicalPath(), uuid).toUtf8().constData()); + qFatal("Temporary directory could not be created:\n%s", QString("%1/%2").arg(temp.canonicalPath(), subDir).toUtf8().constData()); return g_lamexp_temp_folder; } - if(!temp.cd(uuid)) + if(!temp.cd(subDir)) { - qFatal("Temporary directory could not be entered:\n%s", QString("%1/%2").arg(temp.canonicalPath(), uuid).toUtf8().constData()); + qFatal("Temporary directory could not be entered:\n%s", QString("%1/%2").arg(temp.canonicalPath(), subDir).toUtf8().constData()); return g_lamexp_temp_folder; } - QFile testFile(QString("%1/~test.txt").arg(temp.canonicalPath())); + QFile testFile(QString("%1/.%2").arg(temp.canonicalPath(), lamexp_rand_str())); if(!testFile.open(QIODevice::ReadWrite) || testFile.write("LAMEXP_TEST\n") < 12) { qFatal("Write access to temporary directory has been denied:\n%s", temp.canonicalPath().toUtf8().constData()); diff --git a/src/Global.h b/src/Global.h index fe683ce0..6e23847c 100644 --- a/src/Global.h +++ b/src/Global.h @@ -76,6 +76,7 @@ bool lamexp_check_tool(const QString &toolName); const QString lamexp_lookup_tool(const QString &toolName); unsigned int lamexp_tool_version(const QString &toolName); void lamexp_finalization(void); +QString lamexp_rand_str(void); const QString &lamexp_temp_folder(void); void lamexp_ipc_read(unsigned int *command, char* message, size_t buffSize); void lamexp_ipc_send(unsigned int command, const char* message); diff --git a/src/Main.cpp b/src/Main.cpp index a2a1ee05..be110950 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -51,6 +51,8 @@ int lamexp_main(int argc, char* argv[]) //Init console lamexp_init_console(argc, argv); + lamexp_rand_str(); + //Print version info qDebug("LameXP - Audio Encoder Front-End"); qDebug("Version %d.%02d %s, Build %d [%s], compiled with %s", lamexp_version_major(), lamexp_version_minor(), lamexp_version_release(), lamexp_version_build(), lamexp_version_date().toString(Qt::ISODate).toLatin1().constData(), lamexp_version_compiler()); diff --git a/src/Thread_Process.cpp b/src/Thread_Process.cpp index 5b72e7db..3bab3ce2 100644 --- a/src/Thread_Process.cpp +++ b/src/Thread_Process.cpp @@ -222,7 +222,7 @@ QString ProcessThread::generateOutFileName(void) } } - QFile writeTest(QString("%1/%2").arg(targetDir.canonicalPath(), QUuid::createUuid().toString())); + QFile writeTest(QString("%1/.%2").arg(targetDir.canonicalPath(), lamexp_rand_str())); if(!writeTest.open(QIODevice::ReadWrite)) { handleMessage(QString("The target output directory is NOT writable:\n%1").arg(targetDir.absolutePath())); @@ -252,11 +252,11 @@ QString ProcessThread::generateOutFileName(void) QString ProcessThread::generateTempFileName(void) { QMutexLocker lock(m_mutex_genFileName); - QString tempFileName = QString("%1/%2.wav").arg(QDir::tempPath(), QUuid::createUuid().toString()); + QString tempFileName = QString("%1/%2.wav").arg(lamexp_temp_folder(), lamexp_rand_str()); while(QFileInfo(tempFileName).exists()) { - tempFileName = QString("%1/%2.wav").arg(QDir::tempPath(), QUuid::createUuid().toString()); + tempFileName = QString("%1/%2.wav").arg(lamexp_temp_folder(), lamexp_rand_str()); } QFile file(tempFileName);