mirror of
https://github.com/marcogll/passkit-generator.git
synced 2026-03-15 13:25:19 +00:00
Replaced the creation of one new folder in tmpDir for each manifest to the creation in tmpDir of one manifest with unique generated uuid
Added some comments; Renamed some parameters
This commit is contained in:
60
index.js
60
index.js
@@ -1,11 +1,11 @@
|
||||
const express = require("express");
|
||||
const os = require("os");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const crypto = require("crypto");
|
||||
const { spawn } = require("child_process");
|
||||
const os = require("os");
|
||||
const path = require("path");
|
||||
const archiver = require("archiver");
|
||||
const express = require("express");
|
||||
const async = require("async");
|
||||
const fs = require("fs");
|
||||
|
||||
const _configuration = Object.freeze(require("./config.json"));
|
||||
|
||||
@@ -23,9 +23,7 @@ const Certificates = _configuration.certificates;
|
||||
*/
|
||||
|
||||
function removeDotFiles(from) {
|
||||
return from.filter(e => {
|
||||
return e.charAt(0) !== "."
|
||||
});
|
||||
return from.filter(e => e.charAt(0) !== ".");
|
||||
}
|
||||
|
||||
function capitalizeFirst(str) {
|
||||
@@ -51,6 +49,13 @@ function checkSignatureRequirements() {
|
||||
return Promise.all([checkCertificate, checkKey]);
|
||||
}
|
||||
|
||||
/**
|
||||
Generates a unique UUID
|
||||
From Github Gist: https://gist.github.com/jed/982883
|
||||
*/
|
||||
|
||||
function UUIDGen(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,UUIDGen)}
|
||||
|
||||
/**
|
||||
Generates the cryptografic signature for the manifest file.
|
||||
Spawns Openssl process since Node.js has no support for PKCSs.
|
||||
@@ -60,7 +65,7 @@ function checkSignatureRequirements() {
|
||||
@returns {Object} Promise
|
||||
*/
|
||||
|
||||
function generateManifestSignature(manifestPath) {
|
||||
function generateManifestSignature(manifestUUID) {
|
||||
return new Promise(function(done, rejected) {
|
||||
checkSignatureRequirements()
|
||||
.then(function() {
|
||||
@@ -74,7 +79,7 @@ function generateManifestSignature(manifestPath) {
|
||||
"-certfile", path.resolve(Certificates.dir, Certificates.files["wwdr_pem"]),
|
||||
"-signer", path.resolve(Certificates.dir, Certificates.files["certificate"]),
|
||||
"-inkey", path.resolve(Certificates.dir, Certificates.files["key"]),
|
||||
"-in", path.resolve(`${manifestPath}/manifest.json`),
|
||||
"-in", path.resolve(`${os.tmpdir()}/manifest-${manifestUUID}.json`),
|
||||
// "-out", path.resolve("passCreator", "event.pass", "./signature"),
|
||||
"-outform", "DER",
|
||||
"-passin", `pass:${Certificates.credentials["dev_pem_key"]}`
|
||||
@@ -103,18 +108,28 @@ function generateManifestSignature(manifestPath) {
|
||||
});
|
||||
}
|
||||
|
||||
function generateManifest(fromObject, tempFolderPath) {
|
||||
/**
|
||||
Generates a Buffer of JSON file (manifest)
|
||||
@function generateManifest
|
||||
@params {Object} fromObject - Manifest content
|
||||
@params {String} manifestUUID
|
||||
@return {Promise} - Promise with the manifest buffer
|
||||
@see https://apple.co/2IhJr0Q (PassKit Package Structure)
|
||||
@see https://apple.co/2K2aY3v (Passes Are Cryptographically Signed and Compressed)
|
||||
*/
|
||||
|
||||
function generateManifest(fromObject, manifestUUID) {
|
||||
return new Promise(function(done, failed) {
|
||||
if (!fromObject || typeof fromObject !== "object" && typeof fromObject !== "string") {
|
||||
return failed("generateManifest: Argument 0 is required and must be of an object or a string (source object)");
|
||||
}
|
||||
|
||||
if (!tempFolderPath || typeof tempFolderPath !== "string") {
|
||||
return failed("generateManifest: Argument 1 is required and must be a string (temporary folder path for manifest)");
|
||||
if (!manifestUUID || typeof manifestUUID !== "string") {
|
||||
return failed("generateManifest: Argument 1 is required and must be a string (unique uuid).");
|
||||
}
|
||||
|
||||
const source = typeof fromObject === "object" ? JSON.stringify(fromObject) : fromObject;
|
||||
let manifestWS = fs.createWriteStream(`${tempFolderPath}/manifest.json`);
|
||||
let manifestWS = fs.createWriteStream(`${os.tmpdir()}/manifest-${manifestUUID}.json`);
|
||||
|
||||
manifestWS.write(source);
|
||||
manifestWS.end();
|
||||
@@ -164,18 +179,6 @@ instance.get("/gen/:type/", function (req, res) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Creating a temporary directory to keep the manifest.json of each pass.
|
||||
* This is done to pass the file as openssl parameter.
|
||||
* It would be better to pass openssl a buffer but sadly it seems not possible.
|
||||
* Feel free to contribute if you think there's a better way to achieve this.
|
||||
*/
|
||||
|
||||
fs.mkdtemp(path.join(os.tmpdir(), "passkitWebServer-"), function(err, tempFolder) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
// Manifest dictionary
|
||||
let manifestRaw = {};
|
||||
let archive = archiver("zip");
|
||||
@@ -209,12 +212,14 @@ instance.get("/gen/:type/", function (req, res) {
|
||||
throw new Error(`Unable to compile manifest. ${error}`);
|
||||
}
|
||||
|
||||
generateManifest(manifestRaw, tempFolder)
|
||||
let uuid = UUIDGen();
|
||||
|
||||
generateManifest(manifestRaw, uuid)
|
||||
.then(function(manifestBuffer) {
|
||||
|
||||
archive.append(manifestBuffer, { name: "manifest.json" });
|
||||
|
||||
generateManifestSignature(tempFolder)
|
||||
generateManifestSignature(uuid)
|
||||
.then(function(signatureBuffer) {
|
||||
|
||||
if (!fs.existsSync("output")) {
|
||||
@@ -246,5 +251,4 @@ instance.get("/gen/:type/", function (req, res) {
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user