diff --git a/app/js/ui/main.js b/app/js/ui/main.js
index 97824fcc..c387ea50 100644
--- a/app/js/ui/main.js
+++ b/app/js/ui/main.js
@@ -4,7 +4,7 @@ function msgShow(retcode,msg) {
} else if(retcode == 2 || retcode == 1) {
var alertType = 'danger';
}
- var htmlMsg = '
'+msg+'
';
+ var htmlMsg = ''+msg+'
';
return htmlMsg;
}
@@ -581,3 +581,14 @@ $(document)
.ready(contentLoaded)
.ready(loadWifiStations());
+// To auto-close Bootstrap alerts; time is in milliseconds
+const alertTimeout = parseInt(getCookie('alert_timeout'), 10);
+
+if (!isNaN(alertTimeout) && alertTimeout > 0) {
+ window.setTimeout(function() {
+ $(".alert").fadeTo(500, 0).slideUp(500, function(){
+ $(this).remove();
+ });
+ }, alertTimeout);
+}
+
diff --git a/config/defaults.json b/config/defaults.json
index a0e1b190..093715fb 100644
--- a/config/defaults.json
+++ b/config/defaults.json
@@ -49,7 +49,9 @@
"ListenPort": [ "51820" ],
"DNS": [ "9.9.9.9" ],
"PostUp": [ "iptables -A FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE" ],
- "PostDown": [ "iptables -D FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE" ]
+ "PostDown": [ "iptables -D FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE" ],
+ "PostUpEx": [ "iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL ! -d %s -j REJECT" ],
+ "PreDown": [ "iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL ! -d %s -j REJECT" ]
},
"peer": {
"Address": [ "10.8.1.2/24" ],
diff --git a/dist/sb-admin/js/scripts.js b/dist/sb-admin/js/scripts.js
index 873276da..39067c08 100644
--- a/dist/sb-admin/js/scripts.js
+++ b/dist/sb-admin/js/scripts.js
@@ -13,9 +13,9 @@ window.addEventListener('DOMContentLoaded', event => {
const sidebarToggle = document.body.querySelector('#sidebarToggle');
if (sidebarToggle) {
// Uncomment below to persist sidebar toggle between refreshes
- if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
- document.body.classList.toggle('sb-sidenav-toggled');
- }
+ // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+ // document.body.classList.toggle('sb-sidenav-toggled');
+ // }
sidebarToggle.addEventListener('click', event => {
event.preventDefault();
document.body.classList.toggle('sb-sidenav-toggled');
diff --git a/includes/system.php b/includes/system.php
index 6bc73875..912b3750 100755
--- a/includes/system.php
+++ b/includes/system.php
@@ -12,6 +12,23 @@ function DisplaySystem(&$extraFooterScripts)
$dashboard = new \RaspAP\UI\Dashboard;
$pluginInstaller = \RaspAP\Plugins\PluginInstaller::getInstance();
+ // set defaults
+ $optAutoclose = true;
+ $alertTimeout = 5000;
+ $good_input = true;
+ $config_port = false;
+
+ // set alert_timeout from cookie if valid
+ if (isset($_COOKIE['alert_timeout']) && is_numeric($_COOKIE['alert_timeout'])) {
+ $cookieTimeout = (int) $_COOKIE['alert_timeout'];
+
+ if ($cookieTimeout > 0) {
+ $alertTimeout = $cookieTimeout;
+ } else {
+ // A value of 0 means auto-close is disabled
+ $optAutoclose = false;
+ }
+ }
if (isset($_POST['SaveLanguage'])) {
if (isset($_POST['locale'])) {
$_SESSION['locale'] = $_POST['locale'];
@@ -21,7 +38,6 @@ function DisplaySystem(&$extraFooterScripts)
if (!RASPI_MONITOR_ENABLED) {
if (isset($_POST['SaveServerSettings'])) {
- $good_input = true;
// Validate server port
if (isset($_POST['serverPort'])) {
if (strlen($_POST['serverPort']) > 4 || !is_numeric($_POST['serverPort'])) {
@@ -32,13 +48,13 @@ function DisplaySystem(&$extraFooterScripts)
}
}
// Validate server bind address
- $serverBind = escapeshellarg('');
- if ($_POST['serverBind'] && $_POST['serverBind'] !== null ) {
- if (!filter_var($_POST['serverBind'], FILTER_VALIDATE_IP)) {
+ if (isset($_POST['serverBind']) && $_POST['serverBind'] !== '') {
+ $inputBind = trim($_POST['serverBind']);
+ if (!filter_var($inputBind, FILTER_VALIDATE_IP)) {
$status->addMessage('Invalid value for bind address', 'danger');
$good_input = false;
} else {
- $serverBind = escapeshellarg($_POST['serverBind']);
+ $serverBind = escapeshellarg($inputBind);
}
}
// Validate log limit
@@ -58,6 +74,21 @@ function DisplaySystem(&$extraFooterScripts)
$status->addMessage($line, 'info');
}
}
+ } elseif (isset($_POST['savethemeSettings'])) {
+ // Validate alert timout
+ if (isset($_POST['autoClose'])) {
+ $alertTimeout = trim($_POST['alertTimeout'] ?? '');
+ if (strlen($alertTimeout) > 7 || !is_numeric($alertTimeout)) {
+ $status->addMessage('Invalid value for alert close timeout', 'danger');
+ $good_input = false;
+ } else {
+ setcookie('alert_timeout', (int) $alertTimeout);
+ $status->addMessage(sprintf(_('Changing alert close timeout to %s ms'), $alertTimeout), 'info');
+ }
+ } else {
+ setcookie('alert_timeout', '', time() - 3600, '/');
+ $optAutoclose = false;
+ }
}
}
@@ -155,7 +186,9 @@ function DisplaySystem(&$extraFooterScripts)
"themes",
"selectedTheme",
"logLimit",
- "pluginsTable"
+ "pluginsTable",
+ "optAutoclose",
+ "alertTimeout"
));
}
diff --git a/locale/en_US/LC_MESSAGES/messages.mo b/locale/en_US/LC_MESSAGES/messages.mo
index e2720b14..cb04e00b 100644
Binary files a/locale/en_US/LC_MESSAGES/messages.mo and b/locale/en_US/LC_MESSAGES/messages.mo differ
diff --git a/locale/en_US/LC_MESSAGES/messages.po b/locale/en_US/LC_MESSAGES/messages.po
index 5986aa27..05ddead4 100644
--- a/locale/en_US/LC_MESSAGES/messages.po
+++ b/locale/en_US/LC_MESSAGES/messages.po
@@ -58,9 +58,6 @@ msgstr "TOR proxy"
msgid "Authentication"
msgstr "Authentication"
-msgid "Change Theme"
-msgstr "Change Theme"
-
msgid "System"
msgstr "System"
@@ -1256,6 +1253,15 @@ msgstr "Details"
msgid "Installed"
msgstr "Installed"
+msgid "Alert messages"
+msgstr "Alert messages"
+
+msgid "Automatically close alerts after a specified timeout"
+msgstr "Automatically close alerts after a specified timeout"
+
+msgid "Alert close timeout (milliseconds)"
+msgstr "Alert close timeout (milliseconds)"
+
#: includes/data_usage.php
msgid "Data usage"
msgstr "Data usage"
diff --git a/templates/system/theme.php b/templates/system/theme.php
index 483a1764..045bbd8b 100644
--- a/templates/system/theme.php
+++ b/templates/system/theme.php
@@ -1,19 +1,38 @@