1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Launcher: add sanity checks for QDir::removeRecursively. Issue 2673

I'm not always fail to uninstall mod, but when I do I remove $HOME
Bumblebee developers should be proud of us...
This commit is contained in:
Arseniy Shestakov 2017-05-25 03:03:02 +03:00
parent bdb0db819d
commit 5d8e943787
2 changed files with 21 additions and 2 deletions

View File

@ -245,7 +245,7 @@ bool CModManager::doInstallMod(QString modname, QString archivePath)
if (!ZipArchive::extract(qstringToPath(archivePath), qstringToPath(destDir))) if (!ZipArchive::extract(qstringToPath(archivePath), qstringToPath(destDir)))
{ {
QDir(destDir + modDirName).removeRecursively(); removeModDir(destDir + modDirName);
return addError(modname, "Failed to extract mod data"); return addError(modname, "Failed to extract mod data");
} }
@ -270,7 +270,7 @@ bool CModManager::doUninstallMod(QString modname)
if (!localMods.contains(modname)) if (!localMods.contains(modname))
return addError(modname, "Data with this mod was not found"); return addError(modname, "Data with this mod was not found");
if (!QDir(modDir).removeRecursively()) if (!removeModDir(modDir))
return addError(modname, "Failed to delete mod data"); return addError(modname, "Failed to delete mod data");
localMods.remove(modname); localMods.remove(modname);
@ -279,3 +279,21 @@ bool CModManager::doUninstallMod(QString modname)
return true; return true;
} }
bool CModManager::removeModDir(QString path)
{
// issues 2673 and 2680 its why you do not recursively remove without sanity check
QDir checkDir(path);
if(!checkDir.cdUp() || QString::compare("Mods", checkDir.dirName(), Qt::CaseInsensitive))
return false;
if(!checkDir.cdUp() || QString::compare("vcmi", checkDir.dirName(), Qt::CaseInsensitive))
return false;
QDir dir(path);
if(!dir.absolutePath().contains("vcmi", Qt::CaseInsensitive))
return false;
if(!dir.absolutePath().contains("Mods", Qt::CaseInsensitive))
return false;
return dir.removeRecursively();
}

View File

@ -18,6 +18,7 @@ class CModManager
QStringList recentErrors; QStringList recentErrors;
bool addError(QString modname, QString message); bool addError(QString modname, QString message);
bool removeModDir(QString mod);
public: public:
CModManager(CModList * modList); CModManager(CModList * modList);