Added plug-in tab back button, Bad user login limitor is now per-public IPv4 subnet.

Ylian Saint-Hilaire committed Jan 10, 2020 at 16:25 UTC 759a358cd46a52202c2cbd6124fd1c137062033c
4 files changed +20 -8
meshuser.js
+5 -1
@@ -699,7 +699,11 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
699 if (typeof parent.badLoginTable[i] == 'number') {
700 r += "Cooloff for " + Math.floor((parent.badLoginTable[i] - Date.now()) / 60000) + " minute(s)\r\n";
701 } else {
702 - r += (i + ' - ' + parent.badLoginTable[i].length + " entries\r\n");
702 + if (parent.badLoginTable[i].length > 1) {
703 + r += (i + ' - ' + parent.badLoginTable[i].length + " records\r\n");
704 + } else {
705 + r += (i + ' - ' + parent.badLoginTable[i].length + " record\r\n");
706 + }
707 }
708 }
709 if (badLoginCount == 0) { r += 'No bad logins.'; }
translate/translate.json
+2 -1
@@ -2804,6 +2804,7 @@
2804 "default.handlebars->container->column_l->p15->p15title->p15BackButton",
2805 "default.handlebars->container->column_l->p16->p16title->p16BackButton",
2806 "default.handlebars->container->column_l->p17->p17title->p17BackButton",
2807 + "default.handlebars->container->column_l->p19->p19title->p19BackButton",
2808 "default.handlebars->container->column_l->p20->p20title->3",
2809 "default.handlebars->container->column_l->p21->p21title->1",
2810 "default.handlebars->container->column_l->p30->1->1->0->1->p30title->1",
@@ -12552,7 +12553,7 @@
12553 "pt": "Plugins -",
12554 "ru": "Плагины - ",
12555 "xloc": [
12555 - "default.handlebars->container->column_l->p19->1"
12556 + "default.handlebars->container->column_l->p19->p19title->3"
12557 ]
12558 },
12559 {
views/default.handlebars
+9 -6
@@ -788,6 +788,14 @@
788 </div>
789 <div id=p17info></div>
790 </div>
791 + <div id=p19 style="display:none">
792 + <div id="p19title">
793 + <div id="p19BackButton" style="float:left"><div class="backButton" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div>
794 + <h1>Plugins - <span id=p19deviceName></span></h1>
795 + </div>
796 + <div id="p19headers"></div>
797 + <div id=p19pages></div>
798 + </div>
799 <div id=p20 style="display:none">
800 <div id="p20title">
801 <picture id=MainMeshImage style=border-width:0px;height:200px;width:200px;float:right>
@@ -983,11 +991,6 @@
991 <div id=p51group2></div>
992 <br />
993 </div>
986 - <div id=p19 style="display:none">
987 - <h1>Plugins - <span id=p19deviceName></span></h1>
988 - <div id="p19headers"></div>
989 - <div id=p19pages></div>
990 - </div>
994 <br id="column_l_bottomgap" />
995 </div>
996 <div id="footer">
@@ -1101,7 +1104,7 @@
1104 <form style="display:none" method=post action=uploadnodefile.ashx enctype=multipart/form-data target=fileUploadFrame><input id=p13fileDragName name="name" /><input id=p13fileDragSize name="size" /><input id=p13fileDragType name="type" /><input id=p13fileDragData name="data" /><input id=p13fileDragLink name="link" /><input type=submit id=p13loginSubmit2 style="display:none" /></form>
1105 <audio id="chimes"><source src="sounds/chimes.mp3" type="audio/mp3" /></audio>
1106 </div>
1104 - <script type="text/javascript">
1107 + <script type="text/javascript" nonce="abc">
1108 'use strict';
1109
1110 // Process server-side web state
webserver.js
+4
@@ -4414,6 +4414,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4414 if ((typeof parent.config.settings.maxinvalidlogin.coolofftime != 'number') || (parent.config.settings.maxinvalidlogin.coolofftime < 1)) { parent.config.settings.maxinvalidlogin.coolofftime = null; }
4415 obj.setbadLogin = function (ip) { // Set an IP address that just did a bad login request
4416 if (typeof ip == 'object') { ip = cleanRemoteAddr(ip.ip); }
4417 + var splitip = ip.split('.');
4418 + if (splitip.length == 4) { ip = (splitip[0] + '.' + splitip[1] + '.' + splitip[2] + '.*'); }
4419 if (++obj.badLoginTableLastClean > 100) { obj.cleanBadLoginTable(); }
4420 if (typeof obj.badLoginTable[ip] == 'number') { if (obj.badLoginTable[ip] < Date.now()) { delete obj.badLoginTable[ip]; } else { return; } } // Check cooloff period
4421 if (obj.badLoginTable[ip] == null) { obj.badLoginTable[ip] = [Date.now()]; } else { obj.badLoginTable[ip].push(Date.now()); }
@@ -4423,6 +4425,8 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4425 }
4426 obj.checkAllowLogin = function (ip) { // Check if an IP address is allowed to login
4427 if (typeof ip == 'object') { ip = cleanRemoteAddr(ip.ip); }
4428 + var splitip = ip.split('.');
4429 + if (splitip.length == 4) { ip = (splitip[0] + '.' + splitip[1] + '.' + splitip[2] + '.*'); } // If this is IPv4, keep only the 3 first
4430 var cutoffTime = Date.now() - (parent.config.settings.maxinvalidlogin.time * 60000); // Time in minutes
4431 var ipTable = obj.badLoginTable[ip];
4432 if (ipTable == null) return true;