Improve MANIFEST.MF parsing

Previously, we would only properly parse LF-encoded manifests, and even
those only if they used the recommended casing.

This commit allows the parser to recognise CR and CRLF newlines, and
also makes the name comparison case insensitive to align with the
specification. (Though not completely: we still don't support multiline
values)

Signed-off-by: Kationor <n96211028@gmail.com>
This commit is contained in:
Kationor 2024-11-24 19:30:59 +01:00
parent 11e7b218d4
commit b40a1973bf
No known key found for this signature in database
GPG Key ID: 1271876935192713

View File

@ -8,6 +8,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonValue> #include <QJsonValue>
#include <QRegularExpression>
#include <QString> #include <QString>
#include "FileSystem.h" #include "FileSystem.h"
@ -15,6 +16,8 @@
#include "minecraft/mod/ModDetails.h" #include "minecraft/mod/ModDetails.h"
#include "settings/INIFile.h" #include "settings/INIFile.h"
static QRegularExpression newlineRegex("\r\n|\n|\r");
namespace ModUtils { namespace ModUtils {
// NEW format // NEW format
@ -487,11 +490,11 @@ bool processZIP(Mod& mod, [[maybe_unused]] ProcessingLevel level)
} }
// quick and dirty line-by-line parser // quick and dirty line-by-line parser
auto manifestLines = file.readAll().split('\n'); auto manifestLines = QString(file.readAll()).split(newlineRegex);
QString manifestVersion = ""; QString manifestVersion = "";
for (auto& line : manifestLines) { for (auto& line : manifestLines) {
if (QString(line).startsWith("Implementation-Version: ")) { if (line.startsWith("Implementation-Version: ", Qt::CaseInsensitive)) {
manifestVersion = QString(line).remove("Implementation-Version: "); manifestVersion = line.remove("Implementation-Version: ", Qt::CaseInsensitive);
break; break;
} }
} }