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;