summaryrefslogtreecommitdiffhomepage
path: root/app/lib/rpc-file-security.js
blob: fa88111c0212c60595b60ea1c00fb0ebb8904639 (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
// @flow

import fs from 'fs';

export function canTrustRpcAddressFile(path: string): boolean {
  const platform = process.platform;
  switch (platform) {
    case 'win32':
      return isOwnedByLocalSystem(path);
    case 'darwin':
    case 'linux':
      return isOwnedAndOnlyWritableByRoot(path);
    default:
      throw new Error(`Unknown platform: ${platform}`);
  }
}

function isOwnedAndOnlyWritableByRoot(path: string): boolean {
  const stat = fs.statSync(path);
  const isOwnedByRoot = stat.uid === 0;
  const isOnlyWritableByOwner = (stat.mode & parseInt('022', 8)) === 0;

  return isOwnedByRoot && isOnlyWritableByOwner;
}

function isOwnedByLocalSystem(path: string): boolean {
  // $FlowFixMe: this module is only available on Windows
  const winsec = require('windows-security');
  const ownerSid = winsec.getFileOwnerSid(path, null);
  const isWellKnownSid = winsec.isWellKnownSid(
    ownerSid,
    winsec.WellKnownSid.BuiltinAdministratorsSid,
  );

  return isWellKnownSid;
}