diff --git a/src/windows-connect.js b/src/windows-connect.js index 11e80c1..b321498 100644 --- a/src/windows-connect.js +++ b/src/windows-connect.js @@ -1,4 +1,4 @@ -const fs = require('fs'); +const fs = require('fs').promises; const execFile = require('child_process').execFile; const env = require('./env'); const scan = require('./windows-scan'); @@ -22,59 +22,74 @@ function execCommand(cmd, params) { }); } -function connectToWifi(config, ap, callback) { - scan(config)() - .then(networks => { - const selectedAp = networks.find(network => { - return network.ssid === ap.ssid; +function connectToWifi(config, givenAP, callback) { + let selectedAp = null; + let profile; + if (givenAP.isHidden) { + selectedAp = { + ssid: givenAP.ssid, + security: ['WPA2'] + }; + profile = new Promise(resolve => resolve(selectedAp)); + } else { + profile = scan(config)().then(networks => { + selectedAp = networks.find(network => { + return network.ssid === givenAP.ssid; }); + return Promise.resolve(selectedAp); + }); + } - if (selectedAp === undefined) { - throw 'SSID not found'; + profile + .then(resolvedAP => { + if (resolvedAP == null) { + return Promise.reject('SSID not found'); } - fs.writeFileSync( + fs.writeFile( profileFilename, - win32WirelessProfileBuilder(selectedAp, ap.password) - ); + win32WirelessProfileBuilder( + resolvedAP, + givenAP.password, + givenAP.isHidden + ) + ) + .then(() => { + return execCommand('netsh', [ + 'wlan', + 'add', + 'profile', + `filename=${profileFilename}` + ]) + .then(() => { + const cmd = 'netsh'; + const params = [ + 'wlan', + 'connect', + `ssid="${givenAP.ssid}"`, + `name="${givenAP.ssid}"` + ]; + if (config.iface) { + params.push(`interface="${config.iface}"`); + } + return execCommand(cmd, params); + }) + .then(() => execCommand(`del ${profileFilename}`)) + .then(() => callback && callback()) + .catch(err => { + execFile( + 'netsh', + ['wlan', 'delete', `profile "${givenAP.ssid}"`], + { env }, + () => { + callback && callback(err); + } + ); + }); + }) + .catch(e => Promise.reject(e)); }) - .then(() => { - return execCommand('netsh', [ - 'wlan', - 'add', - 'profile', - `filename=${profileFilename}` - ]); - }) - .then(() => { - const cmd = 'netsh'; - const params = [ - 'wlan', - 'connect', - `ssid="${ap.ssid}"`, - `name="${ap.ssid}"` - ]; - if (config.iface) { - params.push(`interface="${config.iface}"`); - } - return execCommand(cmd, params); - }) - .then(() => { - return execCommand(`del ${profileFilename}`); - }) - .then(() => { - callback && callback(); - }) - .catch(err => { - execFile( - 'netsh', - ['wlan', 'delete', `profile "${ap.ssid}"`], - { env }, - () => { - callback && callback(err); - } - ); - }); + .catch(e => Promise.reject(e)); } function getHexSsid(plainTextSsid) { @@ -93,12 +108,14 @@ function getHexSsid(plainTextSsid) { return hex; } -function win32WirelessProfileBuilder(selectedAp, key) { +function win32WirelessProfileBuilder(selectedAp, key, isHidden = false) { let profile_content = ` ${ selectedAp.ssid } ${getHexSsid( selectedAp.ssid - )} ${selectedAp.ssid} `; + )} ${selectedAp.ssid} ${ + isHidden ? 'true' : '' + } `; if (selectedAp.security.includes('WPA2')) { profile_content += `ESS auto true WPA2PSK AES false passPhrase false ${key} `;