Przeglądaj źródła

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...
Arseniy Shestakov 8 lat temu
rodzic
commit
5d8e943787

+ 20 - 2
launcher/modManager/cmodmanager.cpp

@@ -245,7 +245,7 @@ bool CModManager::doInstallMod(QString modname, QString archivePath)
 
 	if (!ZipArchive::extract(qstringToPath(archivePath), qstringToPath(destDir)))
 	{
-		QDir(destDir + modDirName).removeRecursively();
+		removeModDir(destDir + modDirName);
 		return addError(modname, "Failed to extract mod data");
 	}
 
@@ -270,7 +270,7 @@ bool CModManager::doUninstallMod(QString modname)
 	if (!localMods.contains(modname))
 		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");
 
 	localMods.remove(modname);
@@ -279,3 +279,21 @@ bool CModManager::doUninstallMod(QString modname)
 
 	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();
+}

+ 1 - 0
launcher/modManager/cmodmanager.h

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