17 Commits

Author SHA1 Message Date
0f1a6d6661 New version added v1.1.3 2023-01-24 21:39:02 +01:00
9d42fb9b5e Improving mac OS part 2023-01-24 21:35:10 +01:00
0fe7bd8eed Merge remote-tracking branch 'origin/master'
# Conflicts:
#	package.json
2023-01-24 21:26:35 +01:00
a8416e1a27 Merge pull request #19 from soitgoes/auditfix
Auditfix
2023-01-24 21:25:59 +01:00
d7715d1cdf Merge remote-tracking branch 'origin/master' 2023-01-24 21:24:40 +01:00
36e1f8ffaf Merge pull request #15 from soitgoes/master
Accomodate for apples elimination of BSSID from airport results
2023-01-24 21:24:15 +01:00
cf885a3bdd Dependency updates only 2023-01-24 21:23:10 +01:00
ba0bfc7d42 upgrade npm modules causing audit flags 2022-12-21 10:25:35 -06:00
d0f22a8ed2 Remove unused var 2022-01-08 11:28:21 -06:00
a021a5d469 Accomodate for apples elimination of BSSID from airport results 2022-01-08 11:24:23 -06:00
9fe4300976 npm changed package.json 2019-10-27 15:08:32 +01:00
8eeb0a9827 Updated version in package.json 2019-10-27 14:35:22 +01:00
d140e224c9 ReadMe updated 2019-10-27 14:21:45 +01:00
ef25a7fb7c info that you need to be superuser in linux in order to see all wifi networks 2019-09-21 15:49:06 +02:00
32b516e302 Dependency updates, some code cleaned up 2019-09-21 11:56:22 +02:00
d1eac84058 Merge pull request #8 from aydogankaragoz/master
Fixed channel NaN issue for 5Ghz networks.
2019-09-21 11:21:45 +02:00
50090aecda Update iwlist.js 2019-09-11 16:59:05 +03:00
13 changed files with 2743 additions and 1153 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.idea
node_modules
/yarn.lock

View File

@ -47,7 +47,7 @@ The tool returns an array with objects, each object representing a network with
* channel: WiFi channel
* ssid: SSID of the network (if available)
* mac: MAC Address of the network access point
* mac: MAC Address of the network access point (if available, otherwise empty string)
* rssi: signal strength
In contrary to other wifi scanners no information about security is returned. This is due to the very different implementation
@ -66,6 +66,22 @@ Unfortunately, Mac OS-X and Windows use the system language for the output which
generic way of parsing the data. If you experience any troubles, please create a GitHub issue and supply
the output of the tool.
## Limits of the tool
There is no such thing as perfect software and this is all the more true when the tools used require different
access rights depending on
the operating system. Please note the following restrictions
before using this tool in a productive system.
**Linux**: iwlist does only return all found networks if run as sudo! Otherwise you'll
get only the network you're connected to.
**Windows**: there are some network cards which do not
return the MAC address and other parameters of the found networks. In this case
the "found" networks are ignored as there is no valuable data. If you have this effect
on your system, please provide as many information about your system (PC manufacturer, network
card, OS,...) as available. Thanks
## Licence
The MIT License (MIT)

View File

@ -5,7 +5,7 @@
* Created by kc on 04.04.16.
*/
var scanner = require('../index');
const scanner = require('../index');
scanner.scan((err, output) => {
if (err) {

View File

@ -11,7 +11,7 @@ const airport = require('./lib/airport');
const iwlist = require('./lib/iwlist');
const netsh = require('./lib/netsh');
var scanner;
let scanner;
// Initializing the tools
function initTools(callback) {
@ -42,7 +42,7 @@ function initTools(callback) {
}
],
function (err, results) {
var res = _.find(results,
let res = _.find(results,
function (f) {
return !f.err
});

View File

@ -7,39 +7,35 @@ const tool = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions
const cmdLine = tool + ' -s';
const detector = tool + ' -getInfo';
const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/;
/**
* Parsing the output of airport (Mac OS X)
* @param str output of the tool
* @param callback
*/
function parseOutput(str, callback) {
var err = null;
let err = null;
let wifis = [];
try {
var lines = str.split('\n');
var wifis = [];
let lines = str.split('\n');
for (var i = 1, l = lines.length; i < l; i++) {
var mac = lines[i].match(macRegex);
if (!mac) {
continue;
}
var macStart = lines[i].indexOf(mac[0]);
var elements = lines[i].substr(macStart).split(/[ ]+/);
for (let i = 1, l = lines.length; i < l; i++) {
if (lines[i] === '') continue;
let elements = lines[i].substring(51).split(/[ ]+/);
wifis.push({
'ssid' : lines[i].substr(0, macStart).trim(),
'mac' : elements[0].trim(),
'channel' : parseInt(elements[2].trim(), 10),
'rssi' : parseInt(elements[1].trim(), 10)
'ssid' : lines[i].substring(0, 32).trim(),
'mac' : '', // There is no more mac on a mac
'channel': parseInt(elements[1].trim(), 10),
'rssi' : parseInt(elements[0].trim(), 10)
});
}
}
catch (ex) {
err = ex;
}
finally {
callback(err, wifis);
}
}

View File

@ -13,21 +13,22 @@ const detector = tool + ' --help';
const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/;
const cellRegex = /Cell [0-9]{2,} - Address:/;
/**
* Parsing the output of iwlist, tool having a lot of different faces :-(
* @param str output of the tool
* @param callback
*/
function parseOutput(str, callback) {
var err = null;
var wifis = [];
let err = null;
let wifis = [];
try {
var blocks = str.split(cellRegex);
let blocks = str.split(cellRegex);
blocks.forEach(block => {
var network = {};
var lines = block.split('\n');
let network = {};
let lines = block.split('\n');
if (macRegex.exec(lines[0])) {
// First line is the mac address (always! (?))
network.mac = lines[0].trim();
@ -43,8 +44,8 @@ function parseOutput(str, callback) {
}
// Channel, an ugly thing to get it
else if (_.startsWith(line.trim(), 'Frequency:')) {
network.channel = parseInt(_.trim(line, ' )').split(/Channel/)[1], 10);
else if (_.startsWith(line.trim(), 'Channel:')) {
network.channel = parseInt(_.trim(line, ' )').split(/:/)[1]);
}
// Another ugly thing, the signal which can have different formats, even worse als
@ -53,15 +54,14 @@ function parseOutput(str, callback) {
if (line.indexOf('Quality') > -1) {
// This is a "Quality=40/70 Signal level=-70 dBm" line
network.rssi = parseInt(line.substr(line.indexOf('Signal level') + 13), 10);
}
else {
} else {
// This is a "Signal level=60/100" line
var elements = line.split('=');
let elements = line.split('=');
elements.forEach(e => {
if (e.indexOf('/') > 0) {
// that's our part
var parts = e.split('/');
var level = Math.floor(100 * parseInt(parts[0], 10) / parseInt(parts[1], 10));
let parts = e.split('/');
let level = Math.floor(100 * parseInt(parts[0], 10) / parseInt(parts[1], 10));
network.rssi = level / 2 - 100;
}
})

View File

@ -15,9 +15,9 @@ const detector = tool + ' show alias';
* an approach of analyzing the structure of the output
*/
function parseOutput(str, callback) {
var blocks = str.split('\n\n');
var wifis = [];
var err = null;
let blocks = str.split('\n\n');
let wifis = [];
let err = null;
try {
if (blocks.length < 2) {
// 2nd try, with \r\n
@ -40,18 +40,18 @@ function parseOutput(str, callback) {
// Channel : 6
// Basic rates (MBit/s) : 1 2 5.5 11
// Other rates (MBit/s) : 6 9 12 18 24 36 48 54
for (var i = 1, l = blocks.length; i < l; i++) {
var network = {};
var lines = blocks[i].split('\n');
var regexChannel = /[a-zA-Z0-9()\s]+:[\s]*[0-9]+$/g;
for (let i = 1, l = blocks.length; i < l; i++) {
let network = {};
let lines = blocks[i].split('\n');
let regexChannel = /[a-zA-Z0-9()\s]+:[\s]*[0-9]+$/g;
if (!lines || lines.length < 2) {
continue;
}
// First line is always the SSID (which can be empty)
var ssid = lines[0].substring(lines[0].indexOf(':') + 1).trim();
let ssid = lines[0].substring(lines[0].indexOf(':') + 1).trim();
for (var t = 1, n = lines.length; t < n; t++) {
for (let t = 1, n = lines.length; t < n; t++) {
if (lines[t].split(':').length === 7) {
// This is the mac address, use this one as trigger for a new network
if (network.mac) {
@ -61,14 +61,12 @@ function parseOutput(str, callback) {
ssid: ssid,
mac : lines[t].substring(lines[t].indexOf(':') + 1).trim()
};
}
else if (lines[t].indexOf('%') > 0) {
} else if (lines[t].indexOf('%') > 0) {
// Network signal strength, identified by '%'
var level = parseInt(lines[t].split(':')[1].split('%')[0].trim(), 10);
let level = parseInt(lines[t].split(':')[1].split('%')[0].trim(), 10);
network.rssi = (level / 2) - 100;
}
else if (!network.channel) {
} else if (!network.channel) {
// A tricky one: the channel is the first one having just ONE number. Set only
// if the channel is not already set ("Basic Rates" can be a single number also)
if (regexChannel.exec(lines[t].trim())) {

3753
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "node-wifi-scanner",
"version": "1.1.1",
"version": "1.1.3",
"description": "node.js module for WiFi network detection",
"main": "index.js",
"keywords": [
@ -35,12 +35,12 @@
"test": "mocha test"
},
"dependencies": {
"async": "2.6.2",
"lodash": "^4.17.11"
"async": "3.2.4",
"lodash": "4.17.21"
},
"devDependencies": {
"grunt": "^1.0.3",
"grunt": "1.5.3",
"grunt-bump": "0.8.0",
"mocha": "^6.0.2"
"mocha": "10.2.0"
}
}

View File

@ -16,8 +16,8 @@ describe('airport', () => {
assert.ok(info);
assert.equal(info.length, 36);
var ap = info[0];
assert.equal(ap.mac, '00:35:1a:90:56:03');
let ap = info[0];
assert.equal(ap.mac, '');
assert.equal(ap.ssid, 'OurTest');
assert.equal(ap.rssi, -70);
assert.strictEqual(ap.channel, 112);
@ -49,7 +49,7 @@ describe('airport', () => {
assert.ok(info);
assert.equal(info.length, 4);
var ap = info[0];
let ap = info[0];
assert.equal(ap.mac, '7c:b7:33:ae:3b:06');
assert.equal(ap.ssid, 'Raupo');
assert.equal(ap.rssi, -80);

View File

@ -1,5 +1,5 @@
SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
OurTest 00:35:1a:90:56:03 -70 112 Y CH WPA2(PSK/AES/AES)
OurTest -70 112 Y CH WPA2(PSK/AES/AES)
OurDev 00:35:1a:90:56:04 -70 112 Y CH WPA2(PSK/AES/AES)
PDANet1 00:35:1a:90:56:09 -70 112 Y CH WPA2(PSK/AES/AES)
TEST-Wifi 00:35:1a:90:56:0f -70 112 Y CH WPA2(PSK/AES/AES)

View File

@ -22,7 +22,7 @@ describe('iwlist', () => {
assert.ok(info);
var ap = info[0];
let ap = info[0];
assert.equal(ap.mac, 'D4:D1:84:50:76:45');
assert.equal(ap.ssid, 'gsy-97796');
assert.equal(ap.rssi, -76);
@ -40,7 +40,7 @@ describe('iwlist', () => {
iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist03_raspi.txt'), { encoding: 'utf8' }), (err, info) => {
assert.ok(info);
var ap = info[0];
let ap = info[0];
assert.equal(ap.mac, '00:35:1A:90:56:00');
assert.equal(ap.ssid, 'LORA-Wifi');
assert.equal(ap.rssi, -71);

View File

@ -16,7 +16,7 @@ describe('netsh', function () {
assert.ok(info);
assert.equal(info.length, 86);
var ap = info[0];
let ap = info[0];
assert.equal(ap.mac, '00:f2:8b:8c:a6:88');
assert.equal(ap.ssid, '');
assert.equal(ap.rssi, -88.5);
@ -55,7 +55,7 @@ describe('netsh', function () {
assert.ok(info);
assert.equal(info.length, 86);
var ap = info[0];
let ap = info[0];
assert.equal(ap.mac, '00:f2:8b:8c:a6:88');
assert.equal(ap.ssid, '');
assert.equal(ap.rssi, -88.5);
@ -94,7 +94,7 @@ describe('netsh', function () {
assert.ok(info);
assert.equal(info.length, 8);
var ap = info[0];
let ap = info[0];
assert.equal(ap.mac, '98:fc:11:b6:88:9e');
assert.equal(ap.ssid, 'CARAMANZANAS_BAJA');
assert.equal(ap.rssi, -86);