diff options
author | Robert Griebl <robert.griebl@pelagicore.com> | 2018-04-23 01:55:41 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@pelagicore.com> | 2018-04-23 09:23:55 +0000 |
commit | 405e5c3a29ff21183769e322a64bad46ea67078d (patch) | |
tree | 2ce73224e7badc6ba5199ac1b8a72658129bcf29 | |
parent | 19d62811f54505c66ae8f3b661721ee87a9f0cf1 (diff) | |
download | qtapplicationmanager-405e5c3a29ff21183769e322a64bad46ea67078d.tar.gz |
Fix Windows/Cygwin test package creation
Change-Id: Iaafbc803b8c6a1f5a1e31ed22f9cb53300d59c82
Reviewed-by: Dominik Holland <dominik.holland@pelagicore.com>
-rw-r--r-- | src/tools/packager/packager.cpp | 275 | ||||
-rwxr-xr-x | tests/data/create-test-packages.sh | 6 |
2 files changed, 141 insertions, 140 deletions
diff --git a/src/tools/packager/packager.cpp b/src/tools/packager/packager.cpp index 237f8b42..b237cc99 100644 --- a/src/tools/packager/packager.cpp +++ b/src/tools/packager/packager.cpp @@ -126,152 +126,153 @@ int main(int argc, char *argv[]) } clp.setOptionsAfterPositionalArgumentsMode(QCommandLineParser::ParseAsOptions); - PackagingJob *p = nullptr; - - // REMEMBER to update the completion file util/bash/appman-prompt, if you apply changes below! - switch (command(clp)) { - default: - case NoCommand: - if (clp.isSet(qSL("version"))) - clp.showVersion(); - if (clp.isSet(qSL("help"))) - clp.showHelp(); - clp.showHelp(1); - break; - - case CreatePackage: { - clp.addOption({ qSL("verbose"), qSL("Dump the package's meta-data header and footer information to stdout.") }); - clp.addOption({ qSL("json"), qSL("Output in JSON format instead of YAML.") }); - clp.addOption({{ qSL("extra-metadata"), qSL("m") }, qSL("Add extra meta-data to the package, supplied on the commandline."), qSL("yaml-snippet") }); - clp.addOption({{ qSL("extra-metadata-file"), qSL("M") }, qSL("Add extra meta-data to the package, read from file."), qSL("yaml-file") }); - clp.addOption({{ qSL("extra-signed-metadata"), qSL("s") }, qSL("Add extra, digitally signed, meta-data to the package, supplied on the commandline."), qSL("yaml-snippet") }); - clp.addOption({{ qSL("extra-signed-metadata-file"), qSL("S") }, qSL("Add extra, digitally signed, meta-data to the package, read from file."), qSL("yaml-file") }); - clp.addPositionalArgument(qSL("package"), qSL("The file name of the created package.")); - clp.addPositionalArgument(qSL("source-directory"), qSL("The package's content root directory.")); - clp.process(a); - - if (clp.positionalArguments().size() != 3) + try { + PackagingJob *p = nullptr; + + // REMEMBER to update the completion file util/bash/appman-prompt, if you apply changes below! + switch (command(clp)) { + default: + case NoCommand: + if (clp.isSet(qSL("version"))) + clp.showVersion(); + if (clp.isSet(qSL("help"))) + clp.showHelp(); clp.showHelp(1); - - auto parseYamlMetada = [](const QStringList &metadataSnippets, const QStringList &metadataFiles, bool isSigned) -> QVariantMap { - QVariantMap result; - QVector<QPair<QByteArray, QString>> metadata; - - for (const QString &file : metadataFiles) { - QFile f(file); - if (!f.open(QIODevice::ReadOnly)) - throw Exception(f, "Could not open metadata file for reading"); - metadata.append(qMakePair(f.readAll(), file)); - } - for (const QString &snippet : metadataSnippets) - metadata.append(qMakePair(snippet.toUtf8(), QString())); - - for (const auto &md : metadata) { - QtYaml::ParseError parseError; - const QVector<QVariant> docs = QtYaml::variantDocumentsFromYaml(md.first, &parseError); - if (parseError.error != QJsonParseError::NoError) { - throw Exception(Error::IO, "YAML parse error in --extra-%4metadata%5 %6 at line %1, column %2: %3") - .arg(parseError.line).arg(parseError.column).arg(parseError.errorString()) - .arg(isSigned ? "signed-" : "").arg(md.second.isEmpty() ? "": "-file") - .arg(md.second.isEmpty() ? qSL("option") : md.second); + break; + + case CreatePackage: { + clp.addOption({ qSL("verbose"), qSL("Dump the package's meta-data header and footer information to stdout.") }); + clp.addOption({ qSL("json"), qSL("Output in JSON format instead of YAML.") }); + clp.addOption({{ qSL("extra-metadata"), qSL("m") }, qSL("Add extra meta-data to the package, supplied on the commandline."), qSL("yaml-snippet") }); + clp.addOption({{ qSL("extra-metadata-file"), qSL("M") }, qSL("Add extra meta-data to the package, read from file."), qSL("yaml-file") }); + clp.addOption({{ qSL("extra-signed-metadata"), qSL("s") }, qSL("Add extra, digitally signed, meta-data to the package, supplied on the commandline."), qSL("yaml-snippet") }); + clp.addOption({{ qSL("extra-signed-metadata-file"), qSL("S") }, qSL("Add extra, digitally signed, meta-data to the package, read from file."), qSL("yaml-file") }); + clp.addPositionalArgument(qSL("package"), qSL("The file name of the created package.")); + clp.addPositionalArgument(qSL("source-directory"), qSL("The package's content root directory.")); + clp.process(a); + + if (clp.positionalArguments().size() != 3) + clp.showHelp(1); + + auto parseYamlMetada = [](const QStringList &metadataSnippets, const QStringList &metadataFiles, bool isSigned) -> QVariantMap { + QVariantMap result; + QVector<QPair<QByteArray, QString>> metadata; + + for (const QString &file : metadataFiles) { + QFile f(file); + if (!f.open(QIODevice::ReadOnly)) + throw Exception(f, "Could not open metadata file for reading"); + metadata.append(qMakePair(f.readAll(), file)); } - if (docs.size() < 1) { - throw Exception("Could not parse --extra-%1metadata%2 %3: Invalid document format") - .arg(isSigned ? "signed-" : "").arg(md.second.isEmpty() ? "": "-file") - .arg(md.second.isEmpty() ? qSL("option") : md.second); + for (const QString &snippet : metadataSnippets) + metadata.append(qMakePair(snippet.toUtf8(), QString())); + + for (const auto &md : metadata) { + QtYaml::ParseError parseError; + const QVector<QVariant> docs = QtYaml::variantDocumentsFromYaml(md.first, &parseError); + if (parseError.error != QJsonParseError::NoError) { + throw Exception(Error::IO, "YAML parse error in --extra-%4metadata%5 %6 at line %1, column %2: %3") + .arg(parseError.line).arg(parseError.column).arg(parseError.errorString()) + .arg(isSigned ? "signed-" : "").arg(md.second.isEmpty() ? "": "-file") + .arg(md.second.isEmpty() ? qSL("option") : md.second); + } + if (docs.size() < 1) { + throw Exception("Could not parse --extra-%1metadata%2 %3: Invalid document format") + .arg(isSigned ? "signed-" : "").arg(md.second.isEmpty() ? "": "-file") + .arg(md.second.isEmpty() ? qSL("option") : md.second); + } + for (auto doc : docs) + recursiveMergeVariantMap(result, doc.toMap()); } - for (auto doc : docs) - recursiveMergeVariantMap(result, doc.toMap()); - } - return result; - }; - - QVariantMap extraMetaDataMap = parseYamlMetada(clp.values(qSL("extra-metadata")), - clp.values(qSL("extra-metadata-file")), - false); - QVariantMap extraSignedMetaDataMap = parseYamlMetada(clp.values(qSL("extra-signed-metadata")), - clp.values(qSL("extra-signed-metadata-file")), - true); - - p = PackagingJob::create(clp.positionalArguments().at(1), - clp.positionalArguments().at(2), - extraMetaDataMap, - extraSignedMetaDataMap, - clp.isSet(qSL("json"))); - break; - } - case DevSignPackage: - clp.addOption({ qSL("verbose"), qSL("Dump the package's meta-data header and footer information to stdout.") }); - clp.addOption({ qSL("json"), qSL("Output in JSON format instead of YAML.") }); - clp.addPositionalArgument(qSL("package"), qSL("File name of the unsigned package (input).")); - clp.addPositionalArgument(qSL("signed-package"), qSL("File name of the signed package (output).")); - clp.addPositionalArgument(qSL("certificate"), qSL("PKCS#12 certificate file.")); - clp.addPositionalArgument(qSL("password"), qSL("Password for the PKCS#12 certificate.")); - clp.process(a); - - if (clp.positionalArguments().size() != 5) - clp.showHelp(1); - - p = PackagingJob::developerSign(clp.positionalArguments().at(1), + return result; + }; + + QVariantMap extraMetaDataMap = parseYamlMetada(clp.values(qSL("extra-metadata")), + clp.values(qSL("extra-metadata-file")), + false); + QVariantMap extraSignedMetaDataMap = parseYamlMetada(clp.values(qSL("extra-signed-metadata")), + clp.values(qSL("extra-signed-metadata-file")), + true); + + p = PackagingJob::create(clp.positionalArguments().at(1), + clp.positionalArguments().at(2), + extraMetaDataMap, + extraSignedMetaDataMap, + clp.isSet(qSL("json"))); + break; + } + case DevSignPackage: + clp.addOption({ qSL("verbose"), qSL("Dump the package's meta-data header and footer information to stdout.") }); + clp.addOption({ qSL("json"), qSL("Output in JSON format instead of YAML.") }); + clp.addPositionalArgument(qSL("package"), qSL("File name of the unsigned package (input).")); + clp.addPositionalArgument(qSL("signed-package"), qSL("File name of the signed package (output).")); + clp.addPositionalArgument(qSL("certificate"), qSL("PKCS#12 certificate file.")); + clp.addPositionalArgument(qSL("password"), qSL("Password for the PKCS#12 certificate.")); + clp.process(a); + + if (clp.positionalArguments().size() != 5) + clp.showHelp(1); + + p = PackagingJob::developerSign(clp.positionalArguments().at(1), + clp.positionalArguments().at(2), + clp.positionalArguments().at(3), + clp.positionalArguments().at(4), + clp.isSet(qSL("json"))); + break; + + case DevVerifyPackage: + clp.addOption({ qSL("verbose"), qSL("Print details regarding the verification to stdout.") }); + clp.addPositionalArgument(qSL("package"), qSL("File name of the signed package (input).")); + clp.addPositionalArgument(qSL("certificates"), qSL("The developer's CA certificate file(s)."), qSL("certificates...")); + clp.process(a); + + if (clp.positionalArguments().size() < 3) + clp.showHelp(1); + + p = PackagingJob::developerVerify(clp.positionalArguments().at(1), + clp.positionalArguments().mid(2)); + break; + + case StoreSignPackage: + clp.addOption({ qSL("verbose"), qSL("Dump the package's meta-data header and footer information to stdout.") }); + clp.addOption({ qSL("json"), qSL("Output in JSON format instead of YAML.") }); + clp.addPositionalArgument(qSL("package"), qSL("File name of the unsigned package (input).")); + clp.addPositionalArgument(qSL("signed-package"), qSL("File name of the signed package (output).")); + clp.addPositionalArgument(qSL("certificate"), qSL("PKCS#12 certificate file.")); + clp.addPositionalArgument(qSL("password"), qSL("Password for the PKCS#12 certificate.")); + clp.addPositionalArgument(qSL("hardware-id"), qSL("Unique hardware id to which this package gets bound.")); + clp.process(a); + + if (clp.positionalArguments().size() != 6) + clp.showHelp(1); + + p = PackagingJob::storeSign(clp.positionalArguments().at(1), clp.positionalArguments().at(2), clp.positionalArguments().at(3), clp.positionalArguments().at(4), + clp.positionalArguments().at(5), clp.isSet(qSL("json"))); - break; - - case DevVerifyPackage: - clp.addOption({ qSL("verbose"), qSL("Print details regarding the verification to stdout.") }); - clp.addPositionalArgument(qSL("package"), qSL("File name of the signed package (input).")); - clp.addPositionalArgument(qSL("certificates"), qSL("The developer's CA certificate file(s)."), qSL("certificates...")); - clp.process(a); - - if (clp.positionalArguments().size() < 3) - clp.showHelp(1); - - p = PackagingJob::developerVerify(clp.positionalArguments().at(1), - clp.positionalArguments().mid(2)); - break; - - case StoreSignPackage: - clp.addOption({ qSL("verbose"), qSL("Dump the package's meta-data header and footer information to stdout.") }); - clp.addOption({ qSL("json"), qSL("Output in JSON format instead of YAML.") }); - clp.addPositionalArgument(qSL("package"), qSL("File name of the unsigned package (input).")); - clp.addPositionalArgument(qSL("signed-package"), qSL("File name of the signed package (output).")); - clp.addPositionalArgument(qSL("certificate"), qSL("PKCS#12 certificate file.")); - clp.addPositionalArgument(qSL("password"), qSL("Password for the PKCS#12 certificate.")); - clp.addPositionalArgument(qSL("hardware-id"), qSL("Unique hardware id to which this package gets bound.")); - clp.process(a); - - if (clp.positionalArguments().size() != 6) - clp.showHelp(1); - - p = PackagingJob::storeSign(clp.positionalArguments().at(1), - clp.positionalArguments().at(2), - clp.positionalArguments().at(3), - clp.positionalArguments().at(4), - clp.positionalArguments().at(5), - clp.isSet(qSL("json"))); - break; - - case StoreVerifyPackage: - clp.addOption({ qSL("verbose"), qSL("Print details regarding the verification to stdout.") }); - clp.addPositionalArgument(qSL("package"), qSL("File name of the signed package (input).")); - clp.addPositionalArgument(qSL("certificates"), qSL("Store CA certificate file(s)."), qSL("certificates...")); - clp.addPositionalArgument(qSL("hardware-id"), qSL("Unique hardware id to which this package was bound.")); - clp.process(a); - - if (clp.positionalArguments().size() < 4) - clp.showHelp(1); + break; + + case StoreVerifyPackage: + clp.addOption({ qSL("verbose"), qSL("Print details regarding the verification to stdout.") }); + clp.addPositionalArgument(qSL("package"), qSL("File name of the signed package (input).")); + clp.addPositionalArgument(qSL("certificates"), qSL("Store CA certificate file(s)."), qSL("certificates...")); + clp.addPositionalArgument(qSL("hardware-id"), qSL("Unique hardware id to which this package was bound.")); + clp.process(a); + + if (clp.positionalArguments().size() < 4) + clp.showHelp(1); + + p = PackagingJob::storeVerify(clp.positionalArguments().at(1), + clp.positionalArguments().mid(2, clp.positionalArguments().size() - 2), + *--clp.positionalArguments().cend()); + break; + } - p = PackagingJob::storeVerify(clp.positionalArguments().at(1), - clp.positionalArguments().mid(2, clp.positionalArguments().size() - 2), - *--clp.positionalArguments().cend()); - break; - } + if (!p) + return 2; - if (!p) - return 2; - try { p->execute(); if (clp.isSet(qSL("verbose")) && !p->output().isEmpty()) fprintf(stdout, "%s\n", qPrintable(p->output())); diff --git a/tests/data/create-test-packages.sh b/tests/data/create-test-packages.sh index 7ec23779..c2f78f98 100755 --- a/tests/data/create-test-packages.sh +++ b/tests/data/create-test-packages.sh @@ -120,8 +120,8 @@ signed-key: signed-value EOT packager create-package "$dst/test-extra.appkg" "$src" \ - -m '{ "foo": "bar" }' -m '{ "foo2": "bar2" }' -M "$tmp/exmd" -M "$tmp/exmd2" \ - -s '{ "sfoo": "sbar" }' -s '{ "sfoo2": "sbar2" }' -S "$tmp/exmds" -S "$tmp/exmds2" + -m '{ "foo": "bar" }' -m '{ "foo2": "bar2" }' -M "$src/../exmd" -M "$src/../exmd2" \ + -s '{ "sfoo": "sbar" }' -s '{ "sfoo2": "sbar2" }' -S "$src/../exmds" -S "$src/../exmds2" info "Dev-sign package with extra meta-data" packager dev-sign-package "$dst/test-extra.appkg" "$dst/test-extra-dev-signed.appkg" certificates/dev1.p12 password @@ -197,7 +197,7 @@ mv "$src"/info.yaml{.orig,} info "Create a package with an invalid info.yaml file" mv "$src"/info.yaml{,.orig} -sed <"$src/info.yaml.orig" >"$src/info.yaml" 's/code: "test"$/: "test"/' +sed <"$src/info.yaml.orig" >"$src/info.yaml" 's/code: "test"/: "test"/' tar -C "$src" -cf "$dst/test-invalid-info.appkg" -- --PACKAGE-HEADER-- info.yaml icon.png test --PACKAGE-FOOTER-- mv "$src"/info.yaml{.orig,} |