UNPKG

router-toolkit

Version:

A npm module for managing routers and access points

307 lines (306 loc) 13.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const crypto_js_1 = __importDefault(require("crypto-js")); const axios_1 = __importDefault(require("axios")); const Utils_1 = require("../Common/Utils"); const convert = __importStar(require("xml-js")); const Router_1 = __importDefault(require("../Common/Router")); const vendor_lookup_1 = require("@network-utils/vendor-lookup"); class ZTEv9 extends Router_1.default { time; constructor(host, port, username, password) { super(host, port, username, password); this.time = Date.now(); } /** * Get the authorization cookie. * * @returns The cookie in a string format. */ async login() { const first = await axios_1.default.get(`http://${this.host}:${this.port}/?_type=loginData&_tag=login_token&_=${this.time}`); const cookie = (first.headers['set-cookie'] || [''])[0].split(';')[0]; const loginToken = first.data.split('>')[1].split('<')[0]; const sessToken = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=loginData&_tag=login_entry&_=${this.time}`, { headers: { cookie, }, })).data.sess_token; const result = await axios_1.default.request({ method: 'POST', url: `http://${this.host}:${this.port}`, params: { _type: 'loginData', _tag: 'login_entry' }, headers: { cookie, Accept: 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7', 'Cache-Control': 'no-cache', Connection: 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', Origin: `http://${this.host}:${this.port}`, Pragma: 'no-cache', Referer: `http://${this.host}:${this.port}`, 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', }, data: { action: 'login', Password: crypto_js_1.default.SHA256(this.password + loginToken), Username: this.username, _sessionTOKEN: sessToken, }, }); const authCookie = (result.headers['set-cookie'] || [''])[1].split('=')[1].split(';')[0]; return authCookie; } /** * Get the Router's SSIDs information. * * @returns An object conaining the JSON data. * * @example * ```ts * [ * { * enabled: true, * ssid: 'ZTE_2.4G_NKaehT', * authMode: 'PSKAuthentication', * encryption: 'TKIPandAESEncryption', * hidden: false, * passkey: 'HsojahudA', * maxUser: 32 * }, * ] * ``` */ async getSSIDs() { const authCookie = await this.login(); const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=wlanBasic&Menu3Location=0&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data .split('_sessionTmpToken = "')[1] .split('"')[0] .replaceAll('\\x', '')); const res = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_sssidconf_lua.lua&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data; const ssids = []; const instances = convert.xml2js(res, { compact: true }).ajax_response_xml_root.OBJ_WLANAP_ID.Instance; for (let i = 0; i < instances.length; i++) { const password = (await axios_1.default.post(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_sssidconf_lua.lua`, new URLSearchParams({ IF_ACTION: 'GetPassword', _InstID_PASS: `DEV.WIFI.AP${i + 1}.PSK1`, PASSTYPE: 'PSK', _sessionTOKEN: sessToken, }), { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, Check: crypto_js_1.default.SHA256((0, Utils_1.toQS)({ IF_ACTION: 'GetPassword', _InstID_PASS: `DEV.WIFI.AP${i + 1}.PSK1`, PASSTYPE: 'PSK', _sessionTOKEN: sessToken, })).toString(), }, })).data .split('KeyPassphrase</ParaName><ParaValue>')[1] .split('</ParaValue>')[0]; ssids.push({ enabled: Number(instances[i].ParaValue[2]._text) === 1, ssid: instances[i].ParaValue[10]._text, authMode: instances[i].ParaValue[9]._text, encryption: instances[i].ParaValue[7]._text, hidden: Number(instances[i].ParaValue[1]._text) === 1, passkey: (0, Utils_1.decodePassword)(password, sessToken), maxUser: Number(instances[i].ParaValue[8]._text), }); } return ssids; } /** * Get the Router's WLANs information. * * @returns An object conaining the JSON data. * * @example * ```ts * [ * { * frequency: '2.4GHz', * protocol: 'b,g,n', * channel: 1, * beaconInterval: 100, * txPower: 100, * band: 'Auto', * enabled: true * } * ] * ``` */ async getWlans() { const authCookie = await this.login(); const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=wlanBasic&Menu3Location=0&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data .split('_sessionTmpToken = "')[1] .split('"')[0] .replaceAll('\\x', '')); console.log(sessToken); const res = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_wlanbasicadconf_lua.lua&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data; const wlans = convert.xml2js(res, { compact: true }).ajax_response_xml_root.OBJ_WLANSETTING_ID.Instance.map((instance, i) => ({ frequency: instance.ParaValue[3]._text, protocol: instance.ParaValue[4]._text, channel: Number(instance.ParaValue[5]._text), beaconInterval: Number(instance.ParaValue[10]._text), txPower: Number(instance.ParaValue[11]._text.replace('%', '')), band: instance.ParaValue[15]._text, enabled: Number(instance.ParaValue[17]._text) === 1, })); return wlans; } async getHosts() { const authCookie = await this.login(); const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=mmTopology&Menu3Location=0&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data .split('_sessionTmpToken = "')[1] .split('"')[0] .replaceAll('\\x', '')); const res = (await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuData&_tag=topo_lua.lua&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data; delete res.ad.MGET_INST_NUM; const hosts = Object.values(res.ad).map((host) => ({ time: new Date(host.AssocTime * 1000).toISOString().slice(11, 19), hostname: host.HostName, ip: host.IpAddr, mac: host.MacAddr, vendor: (0, vendor_lookup_1.toVendor)(host.MacAddr), signal: Number(host.Rssi), rxMbps: Number(host.RxRateMbps), txMbps: Number(host.TxRateMbps), protocol: host.WirelessMode, })); return hosts; } /** * Change SSID and Passkey of an Wi-Fi. * * @param num - The SSID number from 1 to 7 * @param ssid - The name you want for you SSID * @param ssid - The password you want for you SSID * @returns True if successful and false if error */ async changeSSID(num, ssid, password) { const authCookie = await this.login(); const sessToken = (0, Utils_1.hex2a)((await axios_1.default.get(`http://${this.host}:${this.port}/?_type=menuView&_tag=wlanBasic&Menu3Location=0&_=${this.time}`, { headers: { Cookie: `SID=${authCookie}; _TESTCOOKIESUPPORT=1`, }, })).data .split('_sessionTmpToken = "')[1] .split('"')[0] .replaceAll('\\x', '')); const cryptoKey = (0, Utils_1.randomNum)(16); const cryptoIv = (0, Utils_1.randomNum)(16); const data = { IF_ACTION: 'Apply', Enable: '1', _InstID: `DEV.WIFI.AP${num}`, _WEPCONIG: 'N', _PSKCONIG: 'Y', BeaconType: '11i', WEPAuthMode: 'None', WPAAuthMode: 'PSKAuthentication', '11iAuthMode': 'PSKAuthentication', WPAEncryptType: 'TKIPandAESEncryption', '11iEncryptType': 'AESEncryption', _InstID_WEP0: 'DEV.WIFI.AP5.WEP1', _InstID_WEP1: 'DEV.WIFI.AP5.WEP2', _InstID_WEP2: 'DEV.WIFI.AP5.WEP3', _InstID_WEP3: 'DEV.WIFI.AP5.WEP4', _InstID_PSK: 'DEV.WIFI.AP5.PSK1', MasterAuthServerIp: '...', _InstID_GUEST: '', _GUEST: 'N', GuestWifi: '', ESSID: ssid, ESSIDHideEnable: '0', EncryptionType: 'WPA2-PSK-AES', KeyPassphrase: (0, Utils_1.encodePassword)(password, cryptoKey, cryptoIv), WEPKeyIndex: '1', ShowWEPKey: '0', WEPKey00: (0, Utils_1.encodePassword)('1111', cryptoKey, cryptoIv), WEPKey01: (0, Utils_1.encodePassword)('2222', cryptoKey, cryptoIv), WEPKey02: (0, Utils_1.encodePassword)('3333', cryptoKey, cryptoIv), WEPKey03: (0, Utils_1.encodePassword)('4444', cryptoKey, cryptoIv), VapIsolationEnable: '0', MaxUserNum: '32', Btn_cancel_WLANSSIDConf: '', Btn_apply_WLANSSIDConf: '', encode: (0, Utils_1.encodeKey)(cryptoKey, cryptoIv), _sessionTOKEN: sessToken, }; const encodedData = new URLSearchParams(data); const options = { headers: { Accept: '*/*', 'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7', 'Cache-Control': 'no-cache', Check: (0, Utils_1.asyEncode)(crypto_js_1.default.SHA256((0, Utils_1.toQS)(data)).toString()), Connection: 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', Cookie: `_TESTCOOKIESUPPORT=1; SID=${authCookie}`, Origin: `http://${this.host}:${this.port}`, Pragma: 'no-cache', Referer: `http://${this.host}:${this.port}`, 'Sec-GPC': '1', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', }, }; const res = await axios_1.default.post(`http://${this.host}:${this.port}/?_type=menuData&_tag=wlan_wlansssidconf_lua.lua`, encodedData, options); return String(res.data).includes('<IF_ERRORSTR>SUCC</IF_ERRORSTR>'); } } exports.default = ZTEv9;