Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

electron-notarize

Package Overview
Dependencies
Maintainers
4
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

electron-notarize - npm Package Compare versions

Comparing version 0.0.4 to 0.0.5

107

lib/helpers.js

@@ -9,38 +9,81 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug = require("debug");
const fs = require("fs-extra");
const os = require("os");
const path = require("path");
const d = debug('electron-notarize:helpers');
var debug = require("debug");
var fs = require("fs-extra");
var os = require("os");
var path = require("path");
var d = debug('electron-notarize:helpers');
function withTempDir(fn) {
return __awaiter(this, void 0, void 0, function* () {
const dir = yield fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-notarize-'));
d('doing work inside temp dir:', dir);
let result;
try {
result = yield fn(dir);
}
catch (err) {
d('work failed');
yield fs.remove(dir);
throw err;
}
d('work succeeded');
yield fs.remove(dir);
return result;
return __awaiter(this, void 0, void 0, function () {
var dir, result, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-notarize-'))];
case 1:
dir = _a.sent();
d('doing work inside temp dir:', dir);
_a.label = 2;
case 2:
_a.trys.push([2, 4, , 6]);
return [4 /*yield*/, fn(dir)];
case 3:
result = _a.sent();
return [3 /*break*/, 6];
case 4:
err_1 = _a.sent();
d('work failed');
return [4 /*yield*/, fs.remove(dir)];
case 5:
_a.sent();
throw err_1;
case 6:
d('work succeeded');
return [4 /*yield*/, fs.remove(dir)];
case 7:
_a.sent();
return [2 /*return*/, result];
}
});
});
}
exports.withTempDir = withTempDir;
class Secret {
constructor(value) {
var Secret = /** @class */ (function () {
function Secret(value) {
this.value = value;
}
toString() {
Secret.prototype.toString = function () {
return this.value;
}
inpsect() {
};
Secret.prototype.inpsect = function () {
return '******';
}
}
};
return Secret;
}());
function makeSecret(s) {

@@ -55,5 +98,5 @@ return new Secret(s);

function parseNotarizationInfo(info) {
const out = {};
const matchToProperty = (key, r, modifier) => {
const exec = r.exec(info);
var out = {};
var matchToProperty = function (key, r, modifier) {
var exec = r.exec(info);
if (exec) {

@@ -64,6 +107,6 @@ out[key] = modifier ? modifier(exec[1]) : exec[1];

matchToProperty('uuid', /\n *RequestUUID: (.+?)\n/);
matchToProperty('date', /\n *Date: (.+?)\n/, d => new Date(d));
matchToProperty('date', /\n *Date: (.+?)\n/, function (d) { return new Date(d); });
matchToProperty('status', /\n *Status: (.+?)\n/);
matchToProperty('logFileUrl', /\n *LogFileURL: (.+?)\n/);
matchToProperty('statusCode', /\n *Status Code: (.+?)\n/, n => parseInt(n, 10));
matchToProperty('statusCode', /\n *Status Code: (.+?)\n/, function (n) { return parseInt(n, 10); });
matchToProperty('statusMessage', /\n *Status Message: (.+?)\n/);

@@ -70,0 +113,0 @@ if (out.logFileUrl === '(null)') {

@@ -9,51 +9,95 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug = require("debug");
const path = require("path");
const spawn_1 = require("./spawn");
const helpers_1 = require("./helpers");
const d = debug('electron-notarize');
var debug = require("debug");
var path = require("path");
var spawn_1 = require("./spawn");
var helpers_1 = require("./helpers");
var d = debug('electron-notarize');
function startNotarize(opts) {
return __awaiter(this, void 0, void 0, function* () {
d('starting notarize process for app:', opts.appPath);
return yield helpers_1.withTempDir((dir) => __awaiter(this, void 0, void 0, function* () {
const zipPath = path.resolve(dir, `${path.basename(opts.appPath, '.app')}.zip`);
d('zipping application to:', zipPath);
const zipResult = yield spawn_1.spawn('zip', [
'-r',
'-y',
zipPath,
path.basename(opts.appPath),
], {
cwd: path.dirname(opts.appPath),
});
if (zipResult.code !== 0) {
throw new Error(`Failed to zip application, exited with code: ${zipResult.code}\n\n${zipResult.output}`);
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
d('starting notarize process for app:', opts.appPath);
return [4 /*yield*/, helpers_1.withTempDir(function (dir) { return __awaiter(_this, void 0, void 0, function () {
var zipPath, zipResult, result, uuidMatch;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
zipPath = path.resolve(dir, path.basename(opts.appPath, '.app') + ".zip");
d('zipping application to:', zipPath);
return [4 /*yield*/, spawn_1.spawn('zip', [
'-r',
'-y',
zipPath,
path.basename(opts.appPath),
], {
cwd: path.dirname(opts.appPath),
})];
case 1:
zipResult = _a.sent();
if (zipResult.code !== 0) {
throw new Error("Failed to zip application, exited with code: " + zipResult.code + "\n\n" + zipResult.output);
}
d('zip succeeded, attempting to upload to apple');
return [4 /*yield*/, spawn_1.spawn('xcrun', [
'altool',
'--notarize-app',
'-f',
zipPath,
'--primary-bundle-id',
opts.appBundleId,
'-u',
helpers_1.makeSecret(opts.appleId),
'-p',
helpers_1.makeSecret(opts.appleIdPassword),
])];
case 2:
result = _a.sent();
if (result.code !== 0) {
throw new Error("Failed to upload app to Apples notarization servers\n\n" + result.output);
}
d('upload success');
uuidMatch = /\nRequestUUID = (.+?)\n/g.exec(result.output);
if (!uuidMatch) {
throw new Error("Failed to find request UUID in output:\n\n" + result.output);
}
d('found UUID:', uuidMatch[1]);
return [2 /*return*/, {
uuid: uuidMatch[1],
}];
}
});
}); })];
case 1: return [2 /*return*/, _a.sent()];
}
d('zip succeeded, attempting to upload to apple');
const result = yield spawn_1.spawn('xcrun', [
'altool',
'--notarize-app',
'-f',
zipPath,
'--primary-bundle-id',
opts.appBundleId,
'-u',
helpers_1.makeSecret(opts.appleId),
'-p',
helpers_1.makeSecret(opts.appleIdPassword),
]);
if (result.code !== 0) {
throw new Error(`Failed to upload app to Apples notarization servers\n\n${result.output}`);
}
d('upload success');
const uuidMatch = /\nRequestUUID = (.+?)\n/g.exec(result.output);
if (!uuidMatch) {
throw new Error(`Failed to find request UUID in output:\n\n${result.output}`);
}
d('found UUID:', uuidMatch[1]);
return {
uuid: uuidMatch[1],
};
}));
});
});

@@ -63,36 +107,42 @@ }

function waitForNotarize(opts) {
return __awaiter(this, void 0, void 0, function* () {
d('checking notarization status:', opts.uuid);
const result = yield spawn_1.spawn('xcrun', [
'altool',
'--notarization-info',
opts.uuid,
'-u',
helpers_1.makeSecret(opts.appleId),
'-p',
helpers_1.makeSecret(opts.appleIdPassword),
]);
if (result.code !== 0) {
throw new Error(`Failed to check status of notarization request: ${opts.uuid}\n\n${result.output}`);
}
const notarizationInfo = helpers_1.parseNotarizationInfo(result.output);
if (notarizationInfo.status === 'in progress') {
d('still in progress, waiting 30 seconds');
yield new Promise(r => setTimeout(r, 30000));
return waitForNotarize(opts);
}
d('notarzation done with info:', notarizationInfo);
if (notarizationInfo.status === 'invalid') {
d('notarization failed');
throw new Error(`Apple failed to notarize your application, check the logs for more info
Status Code: ${notarizationInfo.statusCode || 'No Code'}
Message: ${notarizationInfo.statusMessage || 'No Message'}
Logs: ${notarizationInfo.logFileUrl}`);
}
if (notarizationInfo.status !== 'success') {
throw new Error(`Unrecognized notarization status: "${notarizationInfo.status}"`);
}
d('notarization was successful');
return;
return __awaiter(this, void 0, void 0, function () {
var result, notarizationInfo;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
d('checking notarization status:', opts.uuid);
return [4 /*yield*/, spawn_1.spawn('xcrun', [
'altool',
'--notarization-info',
opts.uuid,
'-u',
helpers_1.makeSecret(opts.appleId),
'-p',
helpers_1.makeSecret(opts.appleIdPassword),
])];
case 1:
result = _a.sent();
if (result.code !== 0) {
throw new Error("Failed to check status of notarization request: " + opts.uuid + "\n\n" + result.output);
}
notarizationInfo = helpers_1.parseNotarizationInfo(result.output);
if (!(notarizationInfo.status === 'in progress')) return [3 /*break*/, 3];
d('still in progress, waiting 30 seconds');
return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 30000); })];
case 2:
_a.sent();
return [2 /*return*/, waitForNotarize(opts)];
case 3:
d('notarzation done with info:', notarizationInfo);
if (notarizationInfo.status === 'invalid') {
d('notarization failed');
throw new Error("Apple failed to notarize your application, check the logs for more info\n\nStatus Code: " + (notarizationInfo.statusCode || 'No Code') + "\nMessage: " + (notarizationInfo.statusMessage || 'No Message') + "\nLogs: " + notarizationInfo.logFileUrl);
}
if (notarizationInfo.status !== 'success') {
throw new Error("Unrecognized notarization status: \"" + notarizationInfo.status + "\"");
}
d('notarization was successful');
return [2 /*return*/];
}
});
});

@@ -102,30 +152,51 @@ }

function stapleApp(opts) {
return __awaiter(this, void 0, void 0, function* () {
d('attempting to staple app:', opts.appPath);
const result = yield spawn_1.spawn('xcrun', [
'stapler',
'staple',
'-v',
path.basename(opts.appPath),
], {
cwd: path.dirname(opts.appPath),
return __awaiter(this, void 0, void 0, function () {
var result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
d('attempting to staple app:', opts.appPath);
return [4 /*yield*/, spawn_1.spawn('xcrun', [
'stapler',
'staple',
'-v',
path.basename(opts.appPath),
], {
cwd: path.dirname(opts.appPath),
})];
case 1:
result = _a.sent();
if (result.code !== 0) {
throw new Error("Failed to staple your application with code: " + result.code + "\n\n" + result.output);
}
d('staple succeeded');
return [2 /*return*/];
}
});
if (result.code !== 0) {
throw new Error(`Failed to staple your application with code: ${result.code}\n\n${result.output}`);
}
d('staple succeeded');
return;
});
}
exports.stapleApp = stapleApp;
function notarize({ appBundleId, appPath, appleId, appleIdPassword, }) {
return __awaiter(this, void 0, void 0, function* () {
const { uuid } = yield startNotarize({
appBundleId,
appPath,
appleId,
appleIdPassword,
function notarize(_a) {
var appBundleId = _a.appBundleId, appPath = _a.appPath, appleId = _a.appleId, appleIdPassword = _a.appleIdPassword;
return __awaiter(this, void 0, void 0, function () {
var uuid;
return __generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, startNotarize({
appBundleId: appBundleId,
appPath: appPath,
appleId: appleId,
appleIdPassword: appleIdPassword,
})];
case 1:
uuid = (_b.sent()).uuid;
return [4 /*yield*/, waitForNotarize({ uuid: uuid, appleId: appleId, appleIdPassword: appleIdPassword })];
case 2:
_b.sent();
return [4 /*yield*/, stapleApp({ appPath: appPath })];
case 3:
_b.sent();
return [2 /*return*/];
}
});
yield waitForNotarize({ uuid, appleId, appleIdPassword });
yield stapleApp({ appPath });
});

@@ -132,0 +203,0 @@ }

Object.defineProperty(exports, "__esModule", { value: true });
const child_process_1 = require("child_process");
const debug = require("debug");
const helpers_1 = require("./helpers");
const d = debug('electron-notarize:spawn');
exports.spawn = (cmd, args = [], opts = {}) => {
d('spawning cmd:', cmd, 'args:', args.map(arg => helpers_1.isSecret(arg) ? '*********' : arg), 'opts:', opts);
const child = child_process_1.spawn(cmd, args, opts);
const out = [];
const dataHandler = (data) => out.push(data.toString());
var child_process_1 = require("child_process");
var debug = require("debug");
var helpers_1 = require("./helpers");
var d = debug('electron-notarize:spawn');
exports.spawn = function (cmd, args, opts) {
if (args === void 0) { args = []; }
if (opts === void 0) { opts = {}; }
d('spawning cmd:', cmd, 'args:', args.map(function (arg) { return helpers_1.isSecret(arg) ? '*********' : arg; }), 'opts:', opts);
var child = child_process_1.spawn(cmd, args, opts);
var out = [];
var dataHandler = function (data) { return out.push(data.toString()); };
child.stdout.on('data', dataHandler);
child.stderr.on('data', dataHandler);
return new Promise((resolve) => {
child.on('exit', (code) => {
d(`cmd ${cmd} terminated with code: ${code}`);
return new Promise(function (resolve) {
child.on('exit', function (code) {
d("cmd " + cmd + " terminated with code: " + code);
resolve({
code,
code: code,
output: out.join(''),

@@ -19,0 +21,0 @@ });

{
"name": "electron-notarize",
"version": "0.0.4",
"version": "0.0.5",
"description": "Notarize your Electron app",

@@ -5,0 +5,0 @@ "main": "lib/index.js",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc