pulsar/spec/main-process/parse-command-line.test.js
DeeDeeG 7928a1b339
Fix buggy partial startup on macOS due to flag added by Gatekeeper/XProtect (#21861)
macOS Gatekeeper adds a flag ("-psn_0_[six or seven digits here]") when it intercepts Atom launches.
This happens for fresh downloads, new installs, or first launches after upgrading).
 We don't need this flag, and yargs interprets it as many short flags. So, we filter it out.
2021-01-18 19:22:22 +03:00

133 lines
3.8 KiB
JavaScript

const { assert } = require('chai');
const parseCommandLine = require('../../src/main-process/parse-command-line');
describe('parseCommandLine', () => {
describe('when --uri-handler is not passed', () => {
it('parses arguments as normal', () => {
const args = parseCommandLine([
'-d',
'--safe',
'--test',
'/some/path',
'atom://test/url',
'atom://other/url'
]);
assert.isTrue(args.devMode);
assert.isTrue(args.safeMode);
assert.isTrue(args.test);
assert.deepEqual(args.urlsToOpen, [
'atom://test/url',
'atom://other/url'
]);
assert.deepEqual(args.pathsToOpen, ['/some/path']);
});
// The "underscore flag" with no "non-flag argument" after it
// is the minimal reproducer for the macOS Gatekeeper startup bug.
// By default, it causes the addition of boolean "true"s into yargs' "non-flag argument" array: `argv._`
// Whereas we do string-only operations on these arguments, expecting them to be paths or URIs.
describe('and --_ or -_ are passed', () => {
it('does not attempt to parse booleans as paths or URIs', () => {
const args = parseCommandLine([
'--_',
'/some/path',
'-_',
'-_',
'some/other/path',
'atom://test/url',
'--_',
'atom://other/url',
'-_',
'./another-path.file',
'-_',
'-_',
'-_'
]);
assert.deepEqual(args.urlsToOpen, [
'atom://test/url',
'atom://other/url'
]);
assert.deepEqual(args.pathsToOpen, [
'/some/path',
'some/other/path',
'./another-path.file'
]);
});
});
describe('and a non-flag number is passed as an argument', () => {
it('does not attempt to parse numbers as paths or URIs', () => {
const args = parseCommandLine([
'43',
'/some/path',
'22',
'97',
'some/other/path',
'atom://test/url',
'885',
'atom://other/url',
'42',
'./another-path.file'
]);
assert.deepEqual(args.urlsToOpen, [
'atom://test/url',
'atom://other/url'
]);
assert.deepEqual(args.pathsToOpen, [
'/some/path',
'some/other/path',
'./another-path.file'
]);
});
});
});
describe('when --uri-handler is passed', () => {
it('ignores other arguments and limits to one URL', () => {
const args = parseCommandLine([
'-d',
'--uri-handler',
'--safe',
'--test',
'/some/path',
'atom://test/url',
'atom://other/url'
]);
assert.isUndefined(args.devMode);
assert.isUndefined(args.safeMode);
assert.isUndefined(args.test);
assert.deepEqual(args.urlsToOpen, ['atom://test/url']);
assert.deepEqual(args.pathsToOpen, []);
});
});
describe('when evil macOS Gatekeeper flag "-psn_0_[six or seven digits here]" is passed', () => {
it('ignores any arguments starting with "-psn_"', () => {
const getPsnFlag = () => {
return `-psn_0_${Math.floor(Math.random() * 10_000_000)}`;
};
const args = parseCommandLine([
getPsnFlag(),
'/some/path',
getPsnFlag(),
getPsnFlag(),
'some/other/path',
'atom://test/url',
getPsnFlag(),
'atom://other/url',
'-psn_ Any argument starting with "-psn_" should be ignored, even this one.',
'./another-path.file'
]);
assert.deepEqual(args.urlsToOpen, [
'atom://test/url',
'atom://other/url'
]);
assert.deepEqual(args.pathsToOpen, [
'/some/path',
'some/other/path',
'./another-path.file'
]);
});
});
});