summaryrefslogtreecommitdiff
path: root/test/parallel/test-macos-app-sandbox.js
blob: 7de50d4b4a2507973dada01e84a9ead7c9296b71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'use strict';
const common = require('../common');
if (process.platform !== 'darwin')
  common.skip('App Sandbox is only available on Darwin');
if (process.config.variables.node_builtin_modules_path)
  common.skip('App Sandbox cannot load modules from outside the sandbox');

const fixtures = require('../common/fixtures');
const tmpdir = require('../common/tmpdir');
const assert = require('assert');
const child_process = require('child_process');
const path = require('path');
const fs = require('fs');
const os = require('os');

const nodeBinary = process.execPath;

tmpdir.refresh();

const appBundlePath = path.join(tmpdir.path, 'node_sandboxed.app');
const appBundleContentPath = path.join(appBundlePath, 'Contents');
const appExecutablePath = path.join(
  appBundleContentPath, 'MacOS', 'node');

// Construct the app bundle and put the node executable in it:
// node_sandboxed.app/
// └── Contents
//     ├── Info.plist
//     ├── MacOS
//     │   └── node
fs.mkdirSync(appBundlePath);
fs.mkdirSync(appBundleContentPath);
fs.mkdirSync(path.join(appBundleContentPath, 'MacOS'));
fs.copyFileSync(
  fixtures.path('macos-app-sandbox', 'Info.plist'),
  path.join(appBundleContentPath, 'Info.plist'));
fs.copyFileSync(
  nodeBinary,
  appExecutablePath);


// Sign the app bundle with sandbox entitlements:
assert.strictEqual(
  child_process.spawnSync('/usr/bin/codesign', [
    '--entitlements', fixtures.path(
      'macos-app-sandbox', 'node_sandboxed.entitlements'),
    '--force', '-s', '-',
    appBundlePath,
  ]).status,
  0);

// Sandboxed app shouldn't be able to read the home dir
assert.notStrictEqual(
  child_process.spawnSync(appExecutablePath, [
    '-e', 'fs.readdirSync(process.argv[1])', os.homedir(),
  ]).status,
  0);

if (process.stdin.isTTY) {
  // Run the sandboxed node instance with inherited tty stdin
  const spawnResult = child_process.spawnSync(
    appExecutablePath, ['-e', ''],
    { stdio: 'inherit' }
  );

  assert.strictEqual(spawnResult.signal, null);
}