From 2cc311ce01e097795888d2eb29a32c2c42830679 Mon Sep 17 00:00:00 2001 From: Samuel Zamvil Date: Mon, 25 Nov 2024 18:52:07 -0800 Subject: [PATCH 1/5] Network Interfaces and MAC Address Resolution Changes * Fixed MAC address resolution for macOS Sequoia+ to correctly handle private Wi-Fi addresses by introducing a platform-specific check for macOS with release version 24 or higher. * Added a new module for macOS (`getmacaddress_darwin.js`) to resolve MAC addresses using the `networksetup` utility. Affected Files * `index.js` * `lib/getmacaddress.js` * `lib/platform/getmacaddress_darwin.js` --- index.js | 2 +- lib/getmacaddress.js | 2 ++ lib/platform/getmacaddress_darwin.js | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 lib/platform/getmacaddress_darwin.js diff --git a/index.js b/index.js index 0dcc409..b7ba0aa 100644 --- a/index.js +++ b/index.js @@ -108,7 +108,7 @@ lib.all = function (callback) { var ifaces = lib.networkInterfaces(); var resolve = {}; Object.keys(ifaces).forEach(function (iface) { - if (!ifaces[iface].mac) { + if (!ifaces[iface].mac || (os.platform() === 'darwin' && os.release().split('.')[0] >= 24)) { resolve[iface] = lib.getMacAddress.bind(null, iface); } }); diff --git a/lib/getmacaddress.js b/lib/getmacaddress.js index 6ad5bde..5084fef 100644 --- a/lib/getmacaddress.js +++ b/lib/getmacaddress.js @@ -15,6 +15,8 @@ switch (os.platform()) { break; case 'darwin': + _getMacAddress = require('./platform/getmacaddress_darwin.js'); + break; case 'sunos': case 'freebsd': _getMacAddress = require('./platform/getmacaddress_unix.js'); diff --git a/lib/platform/getmacaddress_darwin.js b/lib/platform/getmacaddress_darwin.js new file mode 100644 index 0000000..4f02093 --- /dev/null +++ b/lib/platform/getmacaddress_darwin.js @@ -0,0 +1,17 @@ +/* jshint node: true */ +var execFile = require('child_process').execFile; + +module.exports = function (iface, callback) { + execFile("/usr/sbin/networksetup", ["-getmacaddress", iface], function (err, out) { + if (err) { + callback(err, null); + return; + } + var match = /[a-f0-9]{2}(:[a-f0-9]{2}){5}/.exec(out.toLowerCase()); + if (!match) { + callback("did not find a mac address", null); + return; + } + callback(null, match[0].toLowerCase()); + }); +}; From c2439168fe44915b259f24408457337241e119e6 Mon Sep 17 00:00:00 2001 From: Samuel Zamvil Date: Mon, 25 Nov 2024 18:57:08 -0800 Subject: [PATCH 2/5] Added os import --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index b7ba0aa..4e4edf9 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ var util = require("./lib/util.js"); var lib = {}; +var os = require("os"); lib.getMacAddress = require("./lib/getmacaddress.js"); lib.getAllInterfaces = require("./lib/getallinterfaces.js"); From 2d874e9dede83838318a88604239750e1b592ee5 Mon Sep 17 00:00:00 2001 From: Samuel Zamvil Date: Mon, 25 Nov 2024 19:26:25 -0800 Subject: [PATCH 3/5] Added an additional check for Darwin 24+ so that it would still use ifconfig before it. --- lib/getmacaddress.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/getmacaddress.js b/lib/getmacaddress.js index 5084fef..2eff6b3 100644 --- a/lib/getmacaddress.js +++ b/lib/getmacaddress.js @@ -15,7 +15,11 @@ switch (os.platform()) { break; case 'darwin': - _getMacAddress = require('./platform/getmacaddress_darwin.js'); + if (os.release().split('.')[0] >= 24){ + _getMacAddress = require('./platform/getmacaddress_darwin.js'); + } else { + _getMacAddress = require('./platform/getmacaddress_unix.js'); + } break; case 'sunos': case 'freebsd': From 8331df0eed6f438570645c857fb859b2877a166e Mon Sep 17 00:00:00 2001 From: Samuel Zamvil Date: Mon, 25 Nov 2024 19:27:14 -0800 Subject: [PATCH 4/5] Modified one() to handle lastest mac version. --- index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/index.js b/index.js index 4e4edf9..41ece16 100644 --- a/index.js +++ b/index.js @@ -52,6 +52,9 @@ lib.one = function () { args.push(name); var score = 0; var iface = ifaces[name]; + if (os.platform() === 'darwin' && os.release().split('.')[0] >= 24) { + iface.mac = lib.getMacAddress.bind(null, iface); + } if (typeof iface.mac === "string" && iface.mac !== "00:00:00:00:00:00") { addresses[name] = iface.mac; if (iface.ipv4) { From 824a367d7183464832e56c34dcfb1428f61ea719 Mon Sep 17 00:00:00 2001 From: Samuel Zamvil Date: Mon, 25 Nov 2024 19:33:31 -0800 Subject: [PATCH 5/5] Resolved macaddress.networkInterfaces() by importing the getmacaddress module and running getmacaddress if on macOS Sequoia+. This fixed all the issues of returning the wrong mac address when testing test.js. --- lib/networkinterfaces.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/networkinterfaces.js b/lib/networkinterfaces.js index 5181ded..0b2fe82 100644 --- a/lib/networkinterfaces.js +++ b/lib/networkinterfaces.js @@ -1,5 +1,9 @@ var os = require('os'); +var lib = {}; + +lib.getMacAddress = require("./getmacaddress.js"); + // Retrieves all interfaces that do feature some non-internal address. // This function does NOT employ caching as to reflect the current state // of the machine accurately. @@ -30,7 +34,12 @@ module.exports = function () { addresses[family] = address.address; hasAddresses = true; if (address.mac && address.mac !== '00:00:00:00:00:00') { - addresses.mac = address.mac; + if (os.platform() === 'darwin' && os.release().split('.')[0] >= 24) { + addresses.mac = lib.getMacAddress.bind(null, iface); + } + else{ + addresses.mac = address.mac; + } } } });