forked from automation-stack/node-machine-id
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.js
More file actions
146 lines (137 loc) · 3.68 KB
/
index.js
File metadata and controls
146 lines (137 loc) · 3.68 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
const { exec, execSync } = require('child_process');
const { createHash } = require('crypto');
const reg = require('native-reg');
let { platform } = process;
let win32RegBinPath = {
native: '%windir%\\System32',
mixed: '%windir%\\sysnative\\cmd.exe /c %windir%\\System32',
};
let guid = {
darwin: 'ioreg -rd1 -c IOPlatformExpertDevice',
win32:
`${
win32RegBinPath[isWindowsProcessMixedOrNativeArchitecture()]
}\\REG.exe ` +
'QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography ' +
'/v MachineGuid',
linux:
'( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :',
freebsd: 'kenv -q smbios.system.uuid || sysctl -n kern.hostuuid',
};
function isWindowsProcessMixedOrNativeArchitecture() {
// detect if the node binary is the same arch as the Windows OS.
// or if this is 32 bit node on 64 bit windows.
if (process.platform !== 'win32') {
return '';
}
if (
process.arch === 'ia32' &&
process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')
) {
return 'mixed';
}
return 'native';
}
function hash(guid) {
return createHash('sha256').update(guid).digest('hex');
}
function expose(result) {
switch (platform) {
case 'darwin':
return result
.split('IOPlatformUUID')[1]
.split('\n')[0]
.replace(/\=|\s+|\"/gi, '')
.toLowerCase();
case 'win32':
return result
.toString()
.split('REG_SZ')[1]
.replace(/\r+|\n+|\s+/gi, '')
.toLowerCase();
case 'linux':
return result
.toString()
.replace(/\r+|\n+|\s+/gi, '')
.toLowerCase();
case 'freebsd':
return result
.toString()
.replace(/\r+|\n+|\s+/gi, '')
.toLowerCase();
default:
throw new Error(`Unsupported platform: ${process.platform}`);
}
}
function getWindowsMachineId() {
return reg
.getValue(
reg.HKEY.LOCAL_MACHINE,
'SOFTWARE\\Microsoft\\Cryptography',
'MachineGuid'
)
.toString();
}
function machineIdSync(original) {
let error;
try {
let id = expose(execSync(guid[platform]).toString());
return original ? id : hash(id);
} catch (e) {
// don't throw the error immediately, try the alternative approach (native-reg in case of win32)
error = e;
}
if (platform === 'win32') {
try {
let id = getWindowsMachineId();
return original ? id : hash(id);
} catch (e) {
throw new Error(
`Error while obtaining machine id via native-reg: ${e.stack}`
);
}
}
if (error) {
throw new Error(`Error while obtaining machine id: ${error.stack}`);
}
}
function machineId(original) {
return new Promise((resolve, reject) => {
return exec(guid[platform], {}, (execError, stdout, stderr) => {
if (execError) {
return reject(
new Error(`Error while obtaining machine id: ${execError.stack}`)
);
}
let error;
try {
let id = expose(stdout.toString());
return resolve(original ? id : hash(id));
} catch (e) {
// don't throw the error immediately, try the alternative approach (native-reg in case of win32)
error = e;
}
if (platform === 'win32') {
try {
let id = getWindowsMachineId();
return resolve(original ? id : hash(id));
} catch (e) {
return reject(
new Error(
`Error while obtaining machine id via native-reg: ${e.stack}`
)
);
}
}
if (error) {
return reject(
new Error(`Error while obtaining machine id: ${error.stack}`)
);
}
});
});
}
module.exports = {
machineId,
machineIdSync,
};