commit 079b90d9fde73909bfbddf9849fd00690190f028 Author: FedorSarafanov Date: Sat Apr 23 13:39:38 2022 +0300 Начальный коммит diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2051cad --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +my_secrets.py \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..a0afe81 --- /dev/null +++ b/Readme.md @@ -0,0 +1,3 @@ +Простой проект управления роутерами `TP-Link` серии `WRxxxN` с помощью `python requests`. + +Реализован код для генерации `auth`-токена из пары логин-пароль (адаптирован из js-кода веб-интерфейса роутера), login/logout. \ No newline at end of file diff --git a/cookie_tplink_wr_series.py b/cookie_tplink_wr_series.py new file mode 100644 index 0000000..42b2231 --- /dev/null +++ b/cookie_tplink_wr_series.py @@ -0,0 +1,201 @@ +import base64 +import ctypes +import urllib.parse + + +def _32bit(number): + return ctypes.c_int(number).value + + +def _zero_fill_right_shift(val, n): + val = _32bit(val) + n = _32bit(n) + return _32bit(val >> n) if val >= 0 else _32bit((val + 0x100000000) >> n) + + +def hex_md5(a): + return binl2hex(core_md5(str2binl(a), len(a) * 8)) + + +def core_md5(p, k): + p = p + [0] * 1000 + p[k >> 5] |= 128 << ((k) % 32) + p[(_zero_fill_right_shift(k + 64, 9) << 4) + 14] = k + plen = ((_zero_fill_right_shift(k + 64, 9) << 4) + 14) + 1 + o = 1732584193 + n = -271733879 + m = -1732584194 + l = 271733878 + for g in range(0, plen, 16): + j = o + h = n + f = m + e = l + o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936) + l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586) + m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819) + n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330) + o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897) + l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426) + m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341) + n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983) + o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416) + l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417) + m = md5_ff(m, l, o, n, p[g + 10], 17, -42063) + n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162) + o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682) + l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101) + m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290) + n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329) + o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510) + l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632) + m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713) + n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302) + o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691) + l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083) + m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335) + n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848) + o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438) + l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690) + m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961) + n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501) + o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467) + l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784) + m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473) + n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734) + o = md5_hh(o, n, m, l, p[g + 5], 4, -378558) + l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463) + m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562) + n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556) + o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060) + l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353) + m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632) + n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640) + o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174) + l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222) + m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979) + n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189) + o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487) + l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835) + m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520) + n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651) + o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844) + l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415) + m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905) + n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055) + o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571) + l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606) + m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523) + n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799) + o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359) + l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744) + m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380) + n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649) + o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070) + l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379) + m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259) + n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551) + o = safe_add(o, j) + n = safe_add(n, h) + m = safe_add(m, f) + l = safe_add(l, e) + + return [o, n, m, l] + + +def md5_cmn(h, e, d, c, g, f): + h = _32bit(h) + e = _32bit(e) + d = _32bit(d) + c = _32bit(c) + g = _32bit(g) + f = _32bit(f) + return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) + + +def md5_ff(g, f, k, j, e, i, h): + g = _32bit(g) + f = _32bit(f) + k = _32bit(k) + j = _32bit(j) + e = _32bit(e) + i = _32bit(i) + h = _32bit(h) + return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) + + +def md5_gg(g, f, k, j, e, i, h): + g = _32bit(g) + f = _32bit(f) + k = _32bit(k) + j = _32bit(j) + e = _32bit(e) + i = _32bit(i) + h = _32bit(h) + return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) + + +def md5_hh(g, f, k, j, e, i, h): + g = _32bit(g) + f = _32bit(f) + k = _32bit(k) + j = _32bit(j) + e = _32bit(e) + i = _32bit(i) + h = _32bit(h) + return md5_cmn(f ^ k ^ j, g, f, e, i, h) + + +def md5_ii(g, f, k, j, e, i, h): + g = _32bit(g) + f = _32bit(f) + k = _32bit(k) + j = _32bit(j) + e = _32bit(e) + i = _32bit(i) + h = _32bit(h) + return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) + + +def safe_add(a, d): + a = _32bit(a) + d = _32bit(d) + c = _32bit(_32bit(a & 65535) + _32bit(d & 65535)) + b = _32bit(_32bit(a >> 16) + _32bit(d >> 16) + _32bit(c >> 16)) + return _32bit(_32bit(b << 16) | _32bit(c & 65535)) + + +def bit_rol(a, b): + return _32bit(_32bit(a << b) | _32bit(_zero_fill_right_shift(a, 32 - b))) + + +def str2binl(d): + c = [None] * 1000 + a = (1 << 8) - 1 + for b in range(0, len(d) * 8, 8): + if c[b >> 5] == None: + c[b >> 5] = 0 + c[b >> 5] |= (ord(d[int(b / 8)]) & a) << (b % 32) + return [s for s in c if s != None] + + +def binl2hex(c): + b = "0123456789abcdef" + d = "" + for a in range(0, len(c) * 4): + d += ( + b[int(((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15))] + + b[int(((c[a >> 2] >> ((a % 4) * 8)) & 15))] + ) + return d + + +def Base64Encoding(s): + return base64.b64encode(s.encode("UTF-8")).decode("UTF-8") + + +def get_cookie(username, password): + password = hex_md5(password) + auth = "Basic " + Base64Encoding(username + ":" + password) + cookie = "Authorization=" + urllib.parse.quote(auth) + return cookie diff --git a/js/common.js b/js/common.js new file mode 100644 index 0000000..b1e5874 --- /dev/null +++ b/js/common.js @@ -0,0 +1,939 @@ +var rateTable_300M = new Array("1Mbps", 1, "2Mbps", 1, "5.5Mbps", 1, "6Mbps", 6, "7Mbps", 8, "9Mbps", 6, "11Mbps", 1, "12Mbps", 6, "13Mbps", 8, "15Mbps", 16, "18Mbps", 6, "21Mbps", 8, "24Mbps", 6, "26Mbps", 8, "30Mbps", 16, "36Mbps", 6, "39Mbps", 8, "45Mbps", 16, "48Mbps", 6, "52Mbps", 8, "54Mbps", 6, "60Mbps", 16, "65Mbps", 8, "72Mbps", 8, "78Mbps", 8, "90Mbps", 16, "104Mbps", 8, "117Mbps", 8, "120Mbps", 16, "130Mbps", 8, "135Mbps", 16, "150Mbps", 16, "180Mbps", 16, "240Mbps", 16, "270Mbps", 16, "300Mbps", 16, 0, 0); +var rateTable_450M = new Array("1Mbps", 5, "2Mbps", 5, "5.5Mbps", 1, "6Mbps", 6, "9Mbps", 6, "11Mbps", 1, "12Mbps", 6, "18Mbps", 6, "19.5Mbps", 8, "21.7Mbps", 8, "24Mbps", 6, "36Mbps", 6, "39Mbps", 8, "40.5Mbps", 16, "43.3Mbps", 8, "45Mbps", 16, "48Mbps", 6, "54Mbps", 6, "58.5Mbps", 8, "65Mbps", 8, "78Mbps", 8, "81Mbps", 16, "86.7Mbps", 8, "90Mbps", 16, "117Mbps", 8, "121.5Mbps", 16, "130Mbps", 8, "135Mbps", 16, "156Mbps", 8, "162Mbps", 16, "173.3Mbps", 8, "175.5Mbps", 8, "180Mbps", 16, "195Mbps", 8, "216.7Mbps", 8, "243Mbps", 16, "270Mbps", 16, "324Mbps", 16, "360Mbps", 16, "364.5Mbps", 16, "405Mbps", 16, "450Mbps", 16, 0, 0); +var operModeNum = 9; +var minOperMode = 0; +var maxOperMode = operModeNum; +var operModeList = new Array(0, 1, "Точка доступа", 1, 1, "Multi-SSID", 2, 0, "Multi-Bss Plus VLAN", 3, 1, "Client", 4, 1, "Усилитель сигнала", 5, 1, "Усилитель сигнала", 6, 1, "Bridge with AP", 7, 0, "Bridge with AP", 8, 0, "Debug"); + +function getOperModeName(a) { + if (a < minOperMode || a > maxOperMode) { + return null + } + if (operModeList[a * 3 + 1] == 0) { + return null + } else { + return operModeList[a * 3 + 2] + } +} + +function operModeEnable(a) { + if (a < minOperMode || a > maxOperMode) { + return null + } + if (operModeList[a * 3 + 1] == 0) { + return false + } else { + return true + } +} + +function getOperModeValue(a) { + if (a < minOperMode || a > maxOperMode) { + return null + } + if (operModeList[a * 3 + 1] == 0) { + return null + } else { + return operModeList[a * 3] + } +} + +function getOperModeIdxByValue(b) { + for (var a = 0; a < operModeNum; a++) { + if (operModeList[a * 3] == b) { + return a + } + } + return null +} + +function disableTag(g, a, d) { + try { + var b = g.getElementsByTagName(a) + } catch (f) { + return + } + if (d == undefined) { + for (var c = 0; c < b.length; c++) { + b[c].disabled = true + } + } else { + for (var c = 0; c < b.length; c++) { + if (b[c].type == d) { + b[c].disabled = true + } + } + } +} +var str_pages = parent.pages_js; +var str_main = parent.str_main; + +function setTagStr(g, d) { + var f, a; + var c, h; + var b; + if ((undefined == str_pages) || (undefined == str_main)) { + return + } + if ((undefined == g) || (undefined == d)) { + return + } + for (tag in str_pages[d]) { + try { + if (!window.ActiveXObject) { + b = g.getElementsByName(tag); + if (b.length > 0) { + for (c = 0; c < b.length; c++) { + b[c].innerHTML = str_pages[d][tag] + } + } else { + g.getElementById(tag).innerHTML = str_pages[d][tag] + } + } else { + b = g.all[tag]; + if (undefined != b.length && b.length > 0) { + for (c = 0; c < b.length; c++) { + b[c].innerHTML = str_pages[d][tag] + } + } else { + b.innerHTML = str_pages[d][tag] + } + } + } catch (f) { + continue + } + } + for (btn in str_main.btn) { + try { + if (!window.ActiveXObject) { + b = g.getElementsByName(btn); + if (b.length > 0) { + for (c = 0; c < b.length; c++) { + b[c].value = str_main.btn[btn] + } + } else { + g.getElementById(btn).value = str_main.btn[btn] + } + } else { + b = g.all[btn]; + if (undefined != b.length && b.length > 0) { + for (c = 0; c < b.length; c++) { + b[c].value = str_main.btn[btn] + } + } else { + b.value = str_main.btn[btn] + } + } + } catch (f) { + continue + } + } +} + +function GetMinWidth() { + var a = Math.ceil((window.screen.width - 182) * 0.55) - 6; + return a +} + +function LoadHelp(a) { + if (window.parent != window) { + if (window.parent.topFrame.hl != a) { + window.parent.topFrame.hl = a; + window.parent.helpFrame.location.href = "/help/" + a + } + } + return true +} + +function resize(b) { + var a = GetMinWidth(); + if (window.document.body.offsetWidth > a) { + b.document.getElementById("autoWidth").style.width = "100%" + } else { + b.document.getElementById("autoWidth").style.width = a + } + return true +} + +function resizeHelp(a) { + if (window.document.body.offsetWidth > 290) { + a.document.getElementById("autoWidth").style.width = "100%" + } else { + a.document.getElementById("autoWidth").style.width = 290 + } + return true +} + +function elementDisplay(d, a, b) { + try { + if (!window.ActiveXObject) { + items = d.getElementsByName(a); + if (items.length > 0) { + for (i = 0; i < items.length; i++) { + items[i].style.display = b + } + } else { + d.getElementById(a).style.display = b + } + } else { + items = d.all[a]; + if (undefined != items.length && items.length > 0) { + for (i = 0; i < items.length; i++) { + items[i].style.display = b + } + } + } + } catch (c) { + return + } +} + +function enableTag(g, a, d) { + try { + var b = g.getElementsByTagName(a) + } catch (f) { + return + } + if (d == undefined) { + for (var c = 0; c < b.length; c++) { + b[c].disabled = false + } + } else { + for (var c = 0; c < b.length; c++) { + if (b[c].type == d) { + b[c].disabled = false + } + } + } +} + +function LoadNext(a) { + if (window.parent != window) { + window.parent.mainFrame.location.href = a + } + return true +} + +function lastipverify(e, a, f) { + var h; + var g = 0; + var d = "0123456789"; + if (e.length == 0) { + return false + } + for (var b = 0; b < e.length; b++) { + h = e.charAt(b); + if (d.indexOf(h) == -1) { + return false + } + } + if (parseInt(e, 10) < a || parseInt(e, 10) > f) { + return false + } + return true +} + +function is_lastip(b, a, c) { + if (b.length == 0) { + alert(str_pages.ntw_common_js.js_input_ip); + return false + } + if (!lastipverify(b, a, c)) { + alert(str_pages.ntw_common_js.js_bad_ip); + return false + } + return true +} + +function maskipverify(b) { + var h; + var g = 0; + var d = ".0123456789"; + if (b.length < 7 || b.length > 15) { + return false + } + for (var a = 0; a < b.length; a++) { + h = b.charAt(a); + if (d.indexOf(h) == -1) { + return false + } else { + if (h == ".") { + if (b.charAt(a + 1) != ".") { + g++ + } else { + return false + } + } + } + } + if (g != 3) { + return false + } + if (b.indexOf(".") == 0 || b.lastIndexOf(".") == (b.length - 1)) { + return false + } + szarray = [0, 0, 0, 0]; + var f; + var a; + for (a = 0; a < 3; a++) { + var g = b.indexOf("."); + szarray[a] = b.substring(0, g); + f = b.substring(g + 1); + b = f + } + szarray[3] = b; + var e = { + 128: 1, + 192: 1, + 224: 1, + 240: 1, + 248: 1, + 252: 1, + 254: 1, + 255: 1, + 0: 1 + }; + for (a = 0; a < 4; a++) { + if (!(szarray[a] in e)) { + return false + } + } + if ((szarray[0] == 0) || (szarray[0] != 255 && szarray[1] != 0) || (szarray[1] != 255 && szarray[2] != 0) || (szarray[2] != 255 && szarray[3] != 0)) { + return false + } + return true +} + +function ipverify(b) { + var g; + var f = 0; + var d = ".0123456789"; + if (b.charAt(0) == "0") { + return false + } + if (b.length < 7 || b.length > 15) { + return false + } + for (var a = 0; a < b.length; a++) { + g = b.charAt(a); + if (d.indexOf(g) == -1) { + return false + } else { + if (g == ".") { + if (b.charAt(a + 1) != ".") { + f++ + } else { + return false + } + } + } + } + if (f != 3) { + return false + } + if (b.indexOf(".") == 0 || b.lastIndexOf(".") == (b.length - 1)) { + return false + } + szarray = [0, 0, 0, 0]; + var e; + var a; + for (a = 0; a < 3; a++) { + var f = b.indexOf("."); + szarray[a] = b.substring(0, f); + e = b.substring(f + 1); + b = e + } + szarray[3] = e; + for (a = 0; a < 4; a++) { + if (szarray[a] < 0 || szarray[a] > 255) { + return false + } + } + if (szarray[0] == 127) { + return false + } + if (szarray[0] >= 224 && szarray[0] <= 239) { + return false + } + return true +} + +function is_ipaddr(a) { + if (a.length == 0) { + alert(str_pages.ntw_common_js.js_input_ip_2); + return false + } + if (!ipverify(a)) { + alert(str_pages.ntw_common_js.js_bad_ip_2); + return false + } + return true +} + +function is_gatewayaddr(a) { + if (a.length == 0) { + alert(str_pages.ntw_common_js.js_input_gateway); + return false + } + if (!ipverify(a)) { + alert(str_pages.ntw_common_js.js_bad_gateway); + return false + } + return true +} + +function is_dnsaddr(a) { + if (a.length == 0) { + alert(str_pages.ntw_common_js.js_input_dns); + return false + } + if (maskipverify(a)) { + alert(str_pages.ntw_common_js.js_bad_dns); + return false + } + if (!ipverify(a)) { + alert(str_pages.ntw_common_js.js_bad_dns); + return false + } + return true +} + +function is_domain(a) { + var e; + var d = "-.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (var b = 0; b < a.length; b++) { + e = a.charAt(b); + if (d.indexOf(e) == -1) { + alert(str_pages.ntw_common_js.js_illegal_input); + return false + } + } + return true +} + +function is_digit(a) { + var e; + var d = "0123456789"; + for (var b = 0; b < a.length; b++) { + e = a.charAt(b); + if (e == " " && b == 1) { + continue + } + if (b > 0) { + if (a.charAt(b - 1) == " " && e == " ") { + continue + } + if (a.charAt(b - 1) != " " && e == " ") { + alert(str_pages.ntw_common_js.js_illegal_input); + return false + } + } + if (d.indexOf(e) == -1) { + if (e != " ") { + alert(str_pages.ntw_common_js.js_illegal_input); + return false + } + } + } + return true +} + +function portverify(d) { + var e; + var b = "0123456789"; + if (d.length == 0) { + return false + } + for (var a = 0; a < d.length; a++) { + e = d.charAt(a); + if (b.indexOf(e) == -1) { + return false + } + } + if (parseInt(d, 10) <= 0 || parseInt(d, 10) > 65535) { + return false + } + return true +} + +function is_port(a) { + if (a.length == 0) { + alert(str_pages.ntw_common_js.js_input_port); + return false + } + if (!portverify(a)) { + alert(str_pages.ntw_common_js.js_bad_port); + return false + } + return true +} + +function is_number(f, a, e) { + var g; + var d = "0123456789"; + if (f.length == 0) { + return false + } + for (var b = 0; b < f.length; b++) { + g = f.charAt(b); + if (d.indexOf(g) == -1) { + return false + } + } + if (parseInt(f, 10) < a || parseInt(f, 10) > e) { + return false + } + return true +} + +function is_maskaddr(a) { + if (a.length == 0) { + alert(str_pages.ntw_common_js.js_input_mask); + return false + } + if (!maskipverify(a)) { + alert(str_pages.ntw_common_js.js_bad_mask); + return false + } + return true +} + +function macverify(b) { + var f; + var e = "0123456789abcdef"; + var d = b.toLowerCase(); + if (d == "ff-ff-ff-ff-ff-ff") { + alert(str_pages.ntw_common_js.js_broadcast_mac); + return false + } + if (d == "00-00-00-00-00-00") { + alert(str_pages.ntw_common_js.js_invalid_mac); + return false + } + if (b.length != 17) { + alert(str_pages.ntw_common_js.js_bad_mac_format); + return false + } + for (var a = 0; a < d.length; a++) { + f = d.charAt(a); + if (a % 3 == 2) { + if (f != "-") { + alert(str_pages.ntw_common_js.js_bad_mac_format); + return false + } + } else { + if (e.indexOf(f) == -1) { + alert(str_pages.ntw_common_js.js_invalid_mac); + return false + } + } + } + f = d.charAt(1); + if (e.indexOf(f) % 2 == 1) { + alert(str_pages.ntw_common_js.js_multi_mac); + return false + } + return true +} + +function is_macaddr(a) { + if (a.length == 0) { + alert(str_pages.ntw_common_js.js_input_mac); + return false + } + if (!macverify(a)) { + return false + } + return true +} + +function charCompare(f, b) { + var g; + var a = 0; + var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@^-_.><,[]{}?/+=|\\'\":;~!#$%()` & "; + if (f.length > b) { + return false + } + for (var d = 0; d < f.length; d++) { + g = f.charAt(d); + if (e.indexOf(g) == -1) { + a += 2 + } else { + a += 1 + } + if (a > b) { + return false + } + } + return true +} + +function is_hostname(a, b) { + if (!charCompare(a, b)) { + alert(str_pages.ntw_common_js.js_input_msg); + return false + } else { + return true + } +} + +function is_port_range(a) { + if (a < 0 || a > 65535) { + alert(str_pages.ntw_common_js.js_bad_port); + return false + } else { + return true + } +} +var tipMsgArray = new Array("Start", "Working Mode", "Internet Access", "WAN / 3G/4G", "WAN Connection Type", "3G/4G", "Wireless operMode", "Dual Band Selection", "Wireless  2.4G", "Wireless  5G", "Wireless", "Network Settings", "Finish"); +var startIdx = 0; +var sysModeIdx = 1; +var netInIdx = 2; +var wanOr3gIdx = 3; +var wanTypeIdx = 4; +var net3gIdx = 5; +var wlanModeIdx = 6; +var wlanBandIdx = 7; +var wlan2gIdx = 8; +var wlan5gIdx = 9; +var wlanIdx = 10; +var wiredIdx = 11; +var endIdx = 12; +var startStep = 0; +var sysModeStep = 1; +var netInStep = 2; +var wanOr3gStep = 3; +var wanTypeStep = 4; +var net3gStep = 5; +var wlanModeStep = 6; +var wlanBandStep = 7; +var wlan2gStep = 8; +var wlan5gStep = 9; +var wlanStep = 10; +var netWorkStep = 11; +var endStep = 12; +var standardRouterMode = 1; +var normal3gMode = 2; +var apcMode = 4; +var apMode = 8; +var pure3gMode = 16; +var pureApMode = 7; +var repeaterMode = 6; +var clientMode = 3; +var type3gFirst = 0; +var type3gOnly = 1; +var typeWanFirst = 2; +var typeWanOnly = 3; + +function showTipMsg(j, f, a, h, b, c) { + var e = ""; + var d = 0; + var g = 0; + for (d = startIdx; d <= endIdx; d++) { + g = 0; + switch (d) { + case sysModeIdx: + if (j != 1) { + g = 1 + } + break; + case netInIdx: + if (f != normal3gMode) { + g = 1 + } + break; + case wanOr3gIdx: + if (f != normal3gMode || c > d) { + g = 1 + } + break; + case wanTypeIdx: + if (f != standardRouterMode && f != normal3gMode && f != apcMode) { + g = 1 + } + if (f == normal3gMode && (c <= netInIdx || a == type3gOnly)) { + g = 1 + } + break; + case net3gIdx: + if (f != normal3gMode && f != pure3gMode) { + g = 1 + } + if (f == normal3gMode && a == typeWanOnly) { + g = 1 + } + break; + case wlanModeIdx: + if (f != apMode) { + g = 1 + } + break; + case wlanBandIdx: + case wlan2gIdx: + case wlan5gIdx: + if (h != 1) { + g = 1 + } + break; + case wlanIdx: + if (h == 1) { + g = 1 + } + break; + case wiredIdx: + if ((f != apMode) && (f != pureApMode) && (f != repeaterMode) && (f != clientMode)) { + g = 1 + } + break; + default: + break + } + if (g) { + continue + } + if (d != 0) { + e += " >> " + } + if (c == d) { + e += '' + tipMsgArray[d] + "" + } else { + e += tipMsgArray[d] + } + } + e += ""; + document.getElementById(b).innerHTML = e +} + +function checkIpAddressFormat(a) { + var d = 0, + b = 0; + var e = 0; + var c = /[^a-fA-F0-9:]/ig; + if (a[a.length - 1] == ":") { + return false + } + if (a.match(c) != null) { + return false + } + if (a.indexOf(":::") != -1) { + return false + } + addrParts = a.split(":"); + if (addrParts.length < 3 || addrParts.length > 8) { + return false + } + for (d = 0; d < addrParts.length; d++) { + if (addrParts[d].length > 4) { + return false + } + if (addrParts[d] != "") { + if (d == 8) { + return false + } + } else { + if ((d != 0) && (d != (addrParts.length - 1))) { + e += 1 + } + if (e > 1) { + return false + } + } + } + if (e == 0) { + if (addrParts.length != 8) { + return false + } + } else { + if (addrParts.length > 9) { + return false + } + } + return true +} + +function isValidIPv6Prefix(d) { + var f; + var a; + var c = /[^a-fA-F0-9:]/ig; + var e = 0; + var b = 0; + if (d.length == 0) { + alert("Префикс не указан, укажите префикс IPv6-адреса."); + return false + } + if (d.indexOf(":::") != -1) { + alert('"' + d + '" неверный формат префикса IPv6-адреса, исправьте его.'); + return false + } + if (d.match(c) != null) { + alert('"' + d + '" содержит недопустимые символы, пожалуйста, исправьте.'); + return false + } + if (d.charAt(d.length - 1) != ":" || d.charAt(d.length - 2) != ":") { + alert('"' + d + '" неверный формат префикса IPv6-адреса, исправьте его.'); + return false + } + addrParts = d.split("::"); + if (addrParts.length >= 3) { + alert('"' + d + '" не может содержать более двух символов "::", исправьте.'); + return false + } + addrParts = d.split(":"); + if (addrParts.length >= 7 || addrParts.length < 3) { + alert('"' + d + '" неверный формат префикса IPv6-адреса, исправьте его.'); + return false + } + if (addrParts[0] == "2002") { + alert('Префикс, начинающийся с "2002", зарезервирован для использования в сети 6to4. Проверьте вводимое значение.'); + return false + } + for (b = 0; b < addrParts.length; b++) { + if (addrParts[b].length > 4) { + alert('"' + d + '" содержит неверный раздел ' + addrParts[b] + ", исправьте!."); + return false + } + } + e = parseInt(addrParts[0], 16); + if (e >> 13 != 1) { + alert('"' + d + '" не является префиксом IPv6-адреса, исправьте.'); + return false + } + if (11520 == e || 11776 == e || 12288 == e) { + alert('"' + d + '" является зарезервированным префиксом публичного IPv6-адреса, укажите допустимый адрес.'); + return false + } + return true +} + +function isGlobalUnicastAddressesPrefix(a) { + var d; + var b; + var c = 0; + addrParts = a.split(":"); + c = parseInt(addrParts[0], 16) >> 13; + if (c != 1) { + return false + } else { + return true + } +} + +function isValidPart(b) { + var a = /[^a-fA-F0-9:]/ig; + if (0 == parseInt(b, 16) || 65535 == parseInt(b, 16)) { + return false + } + if (b.match(a) != null) { + return false + } else { + return true + } +} + +function isPubIPv6Addr(a) { + var e; + var b; + var c = /[^a-fA-F0-9:]/ig; + var d = 0; + addrParts = a.split(":"); + if (addrParts[0] == "" & addrParts[1] == "") { + if (addrParts.length == 2) { + return false + } + if (parseInt(addrParts[2], 16) == 1) { + return false + } + if (parseInt(addrParts[2], 16) == 65535) { + return false + } + } + if (addrParts[addrParts.length - 1] == "" && addrParts[addrParts.length - 2] == "") { + return false + } + d = parseInt(addrParts[0], 16); + if (d == 256 || d == 512 || d == 1024 || d == 2048 || d == 4096 || (d >= 16384 && d <= 49152) || d == 57344 || d == 61440 || d == 63488 || d == 64512 || d == 65024 || d == 65152 || d == 65216 || d == 65280) { + return false + } + if ((parseInt(addrParts[0], 16) >> 6) == 24320) { + return false + } + if ((parseInt(addrParts[0], 16) >> 6) == 1018) { + return false + } + if ((parseInt(addrParts[0], 16) >> 9) == 126) { + return false + } + if ((parseInt(addrParts[0], 16) >> 8) == 255) { + return false + } + if (parseInt(addrParts[0], 16) == 100 & parseInt(addrParts[1], 16) == 65435 & addrParts[2] == "") { + if (addrParts.length <= 5) { + return false + } + } + return true +} + +function isReservedIpAddress(a) { + var d; + var b; + var c = 0; + addrParts = a.split(":"); + c = parseInt(addrParts[0], 16); + if (11520 == c || 11776 == c || 12288 == c) { + return true + } + return false +} + +function isUnusedIpAddress(a) { + var d; + var b; + var c = 0; + addrParts = a.split(":"); + c = parseInt(addrParts[0], 16); + return false +} + +function isGlobalIPv6Addr(a) { + var b; + b = a.split(":"); + if (b[0] == "2002") { + alert('"' + a + '" является адресом туннеля 6to4, его нельзя настраивать вручную. Укажите другой адрес.'); + return false + } + if (false == checkIpAddressFormat(a)) { + alert('"' + a + '" не является публичным IPv6-адресом, укажите допустимый адрес.'); + return false + } else { + if (false == isPubIPv6Addr(a)) { + alert('"' + a + '" является зарезервированным публичным IPv6-адресом, укажите допустимый адрес.'); + return false + } else { + if (false == isGlobalUnicastAddressesPrefix(a)) { + alert('"' + a + '" является зарезервированным публичным IPv6-адресом, укажите допустимый адрес.'); + return false + } else { + if (true == isReservedIpAddress(a)) { + alert('"' + a + '" является зарезервированным публичным IPv6-адресом, укажите допустимый адрес.'); + return false + } else { + if (true == isUnusedIpAddress(a)) { + alert('"' + a + '" является неиспользуемым IPv6-адресом, укажите допустимый адрес.'); + return false + } + } + } + } + } + return true +} +var transMatrixHTML = new Array(/&/g, "&", /\\/g, "\", /'/g, "'", /"/g, """, //g, ">", / /g, " "); + +function escapeHtml(c) { + var b = c.toString(); + for (var a = 0; a < transMatrixHTML.length; a += 2) { + b = b.replace(transMatrixHTML[a], transMatrixHTML[a + 1]) + } + return b +}; \ No newline at end of file diff --git a/js/encrypt.js b/js/encrypt.js new file mode 100644 index 0000000..a1904d1 --- /dev/null +++ b/js/encrypt.js @@ -0,0 +1,182 @@ +function hex_md5(a) { + return binl2hex(core_md5(str2binl(a), a.length * 8)) +} + +function core_md5(p, k) { + p[k >> 5] |= 128 << ((k) % 32); + p[(((k + 64) >>> 9) << 4) + 14] = k; + var o = 1732584193; + var n = -271733879; + var m = -1732584194; + var l = 271733878; + for (var g = 0; g < p.length; g += 16) { + var j = o; + var h = n; + var f = m; + var e = l; + o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936); + l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586); + m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819); + n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330); + o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897); + l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426); + m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341); + n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983); + o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416); + l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417); + m = md5_ff(m, l, o, n, p[g + 10], 17, -42063); + n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162); + o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682); + l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101); + m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290); + n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329); + o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510); + l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632); + m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713); + n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302); + o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691); + l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083); + m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335); + n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848); + o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438); + l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690); + m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961); + n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501); + o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467); + l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784); + m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473); + n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734); + o = md5_hh(o, n, m, l, p[g + 5], 4, -378558); + l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463); + m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562); + n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556); + o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060); + l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353); + m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632); + n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640); + o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174); + l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222); + m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979); + n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189); + o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487); + l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835); + m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520); + n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651); + o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844); + l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415); + m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905); + n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055); + o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571); + l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606); + m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523); + n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799); + o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359); + l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744); + m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380); + n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649); + o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070); + l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379); + m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259); + n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551); + o = safe_add(o, j); + n = safe_add(n, h); + m = safe_add(m, f); + l = safe_add(l, e) + } + return Array(o, n, m, l) +} + +function md5_cmn(h, e, d, c, g, f) { + console.log(c, safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)) + return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) +} + +function md5_ff(g, f, k, j, e, i, h) { + return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) +} + +function md5_gg(g, f, k, j, e, i, h) { + return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) +} + +function md5_hh(g, f, k, j, e, i, h) { + return md5_cmn(f ^ k ^ j, g, f, e, i, h) +} + +function md5_ii(g, f, k, j, e, i, h) { + return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) +} + +function safe_add(a, d) { + var c = (a & 65535) + (d & 65535); + var b = (a >> 16) + (d >> 16) + (c >> 16); + return (b << 16) | (c & 65535) +} + +function bit_rol(a, b) { + return (a << b) | (a >>> (32 - b)) +} + +function str2binl(d) { + var c = Array(); + var a = (1 << 8) - 1; + for (var b = 0; b < d.length * 8; b += 8) { + c[b >> 5] |= (d.charCodeAt(b / 8) & a) << (b % 32) + } + return c +} + +function binl2hex(c) { + var b = "0123456789abcdef"; + var d = ""; + for (var a = 0; a < c.length * 4; a++) { + d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15) + } + return d +} + +function Base64Encoding(d) { + var b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var a = ""; + var l, j, g, k, h, f, e; + var c = 0; + while (c < d.length) { + l = d.charCodeAt(c++); + j = d.charCodeAt(c++); + g = d.charCodeAt(c++); + k = l >> 2; + h = ((l & 3) << 4) | (j >> 4); + f = ((j & 15) << 2) | (g >> 6); + e = g & 63; + if (isNaN(j)) { + f = e = 64 + } else { + if (isNaN(g)) { + e = 64 + } + } + a = a + b.charAt(k) + b.charAt(h) + b.charAt(f) + b.charAt(e) + } + return a +} + +function utf8_encode(b) { + b = b.replace(/\r\n/g, "\n"); + var a = ""; + for (var e = 0; e < b.length; e++) { + var d = b.charCodeAt(e); + if (d < 128) { + a += String.fromCharCode(d) + } else { + if ((d > 127) && (d < 2048)) { + a += String.fromCharCode((d >> 6) | 192); + a += String.fromCharCode((d & 63) | 128) + } else { + a += String.fromCharCode((d >> 12) | 224); + a += String.fromCharCode(((d >> 6) & 63) | 128); + a += String.fromCharCode((d & 63) | 128) + } + } + } + return a +}; \ No newline at end of file diff --git a/tplink_controller.py b/tplink_controller.py new file mode 100644 index 0000000..d6cbf07 --- /dev/null +++ b/tplink_controller.py @@ -0,0 +1,77 @@ +import time +import logging +import requests +from cookie_tplink_wr_series import get_cookie +from my_secrets import my_secrets + +logging.basicConfig(encoding="utf-8", level=logging.INFO) # filename="example.log" + + +class TPLink(object): + def __init__(self, ip="192.168.0.1", login="", password=""): + self.ip = f"http://{ip}" + self.auth_cookie = get_cookie(login, password) + self.session_id = "" + + def login(self): + have_new_sid = False + for _ in range(3): + req = requests.get( + f"{self.ip}/userRpm/LoginRpm.htm?Save=Save", + headers={"Referer": f"{self.ip}/", "Cookie": self.auth_cookie}, + ) + + if req.status_code != 200: + logging.warning( + f"Failed login with token '{self.auth_cookie}' (request code != 200)" + ) + continue + + params = req.text.split("/") + if len(params) >= 3: + if len(params[3]) == 16: + self.session_id = params[3] + have_new_sid = True + logging.info(f"Successfully login to session {self.session_id}") + break + + time.sleep(0.1) + + if not have_new_sid: + self.session_id = "" + logging.warning( + f"Failed login with token '{self.auth_cookie}' (can't get session id)" + ) + + def logout(self): + have_logout = False + for _ in range(3): + req = requests.get( + f"{self.ip}/{self.session_id}/userRpm/LogoutRpm.htm", + headers={ + "Referer": f"{self.ip}/{self.session_id}/userRpm/MenuRpm.htm", + "Cookie": self.auth_cookie, + }, + ) + + if req.status_code != 200: + logging.warning( + f"Failed logout from session '{self.session_id}' (request code != 200)" + ) + continue + else: + have_logout = True + break + + time.sleep(1) + + if not have_logout: + self.session_id = "" + logging.warning(f"Failed logout") + else: + logging.info(f"Successfully logout from session {self.session_id}") + + +router = TPLink(login=my_secrets.login, password=my_secrets.password) +router.login() +router.logout()