Compare commits
4
Commits
16e236c7f8
...
37270acb23
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37270acb23 | ||
|
|
f17d010d5f | ||
|
|
405162ed47 | ||
|
|
dc85f33e9f |
@@ -20,7 +20,28 @@
|
|||||||
# --- Dateitypen, die der Browser nie anfordert ---
|
# --- Dateitypen, die der Browser nie anfordert ---
|
||||||
# Konfiguration, Python-Skripte, Datenhaltung, Vorlagen und Archive. Die
|
# Konfiguration, Python-Skripte, Datenhaltung, Vorlagen und Archive. Die
|
||||||
# Seite laedt ausschliesslich .php, .css, .js, Bilder und Schriften.
|
# Seite laedt ausschliesslich .php, .css, .js, Bilder und Schriften.
|
||||||
<FilesMatch "\.(ini|py|pyc|json|md|log|bak|example|sql|sqlite|db|tgz|gz|zip|yml|yaml)$">
|
<FilesMatch "\.(ini|py|pyc|json|md|log|bak|example|sql|sqlite|db|tgz|gz|zip|yml|yaml|pack|idx)$">
|
||||||
|
<IfModule mod_authz_core.c>
|
||||||
|
Require all denied
|
||||||
|
</IfModule>
|
||||||
|
<IfModule !mod_authz_core.c>
|
||||||
|
Order allow,deny
|
||||||
|
Deny from all
|
||||||
|
</IfModule>
|
||||||
|
</FilesMatch>
|
||||||
|
|
||||||
|
# --- Notbremse ohne Modulabhaengigkeit ---
|
||||||
|
# Die Punkt-Regel oben braucht mod_rewrite oder mod_alias. Fehlen beide, faellt
|
||||||
|
# sie ersatzlos und ohne Fehlermeldung aus - und .git waere wieder abrufbar.
|
||||||
|
# FilesMatch gehoert zum Kern und ist immer verfuegbar. Es passt allerdings nur
|
||||||
|
# auf Dateinamen, nicht auf Pfadbestandteile, kann .git also nicht vollstaendig
|
||||||
|
# sperren. Es nimmt den ueblichen Auslesewerkzeugen aber den Einstieg: ohne
|
||||||
|
# HEAD, config, index und packed-refs laesst sich das Verzeichnis nicht
|
||||||
|
# aufrollen, weil die Objektdateien hexadezimale Namen tragen.
|
||||||
|
#
|
||||||
|
# Belastbar waere nur, .git und restricted/ ausserhalb des Dokumentenbaums zu
|
||||||
|
# legen. Diese Regeln sind Schadensbegrenzung, keine Grenze.
|
||||||
|
<FilesMatch "^(HEAD|ORIG_HEAD|FETCH_HEAD|MERGE_HEAD|COMMIT_EDITMSG|config|index|packed-refs|description|shallow|gitattributes|gitignore|gitmodules)$">
|
||||||
<IfModule mod_authz_core.c>
|
<IfModule mod_authz_core.c>
|
||||||
Require all denied
|
Require all denied
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|||||||
+14
-1
@@ -20,7 +20,20 @@ function ipInNetwork($ip, $cidr)
|
|||||||
if ($adresse === false || $netz === false || strlen($adresse) !== strlen($netz)) {
|
if ($adresse === false || $netz === false || strlen($adresse) !== strlen($netz)) {
|
||||||
return false; // ungueltig oder verschiedene Adressfamilien
|
return false; // ungueltig oder verschiedene Adressfamilien
|
||||||
}
|
}
|
||||||
$bits = isset($teile[1]) ? intval($teile[1]) : strlen($adresse) * 8;
|
// Praefixlaenge streng pruefen. Ohne das macht ein Tippfehler in
|
||||||
|
// LOCAL_NETWORKS die Funktion fail-open: "/-5" etwa liefert eine
|
||||||
|
// Nullmaske, und dann liegt jede Adresse in jedem Netz.
|
||||||
|
if (isset($teile[1])) {
|
||||||
|
if (!ctype_digit($teile[1])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$bits = intval($teile[1]);
|
||||||
|
if ($bits > strlen($adresse) * 8) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$bits = strlen($adresse) * 8;
|
||||||
|
}
|
||||||
$ganzeBytes = intdiv($bits, 8);
|
$ganzeBytes = intdiv($bits, 8);
|
||||||
$restBits = $bits % 8;
|
$restBits = $bits % 8;
|
||||||
if ($ganzeBytes > 0 && strncmp($adresse, $netz, $ganzeBytes) !== 0) {
|
if ($ganzeBytes > 0 && strncmp($adresse, $netz, $ganzeBytes) !== 0) {
|
||||||
|
|||||||
+15
-3
@@ -126,17 +126,29 @@ function setDisplay(id, wert) { schreibe("d:" + id, wert, s => { svgElement(i
|
|||||||
// eine eigene Compositor-Ebene an, und die kostet Speicher.
|
// eine eigene Compositor-Ebene an, und die kostet Speicher.
|
||||||
function setFlowWidth(id, width) {
|
function setFlowWidth(id, width) {
|
||||||
const flow = svgElement(id);
|
const flow = svgElement(id);
|
||||||
const sichtbar = Math.abs(width) >= 0.5;
|
// Eine negative Breite heisst "kein Fluss in dieser Richtung" - die
|
||||||
flow.style.setProperty("--w", (sichtbar ? Math.abs(width) : 0) + "px");
|
// Aufrufer rechnen 55*(1-exp(x)), was bei umgekehrtem Vorzeichen negativ
|
||||||
|
// wird. Frueher zeichnete eine negative stroke-width schlicht nichts.
|
||||||
|
// Math.max haelt das bei; Math.abs wuerde stattdessen einen Fluss in der
|
||||||
|
// falschen Richtung mit voller Staerke anzeigen.
|
||||||
|
const breite = Math.max(0, width);
|
||||||
|
const sichtbar = breite >= 0.5;
|
||||||
|
flow.style.setProperty("--w", breite + "px");
|
||||||
flow.style.animationPlayState = sichtbar ? "running" : "paused";
|
flow.style.animationPlayState = sichtbar ? "running" : "paused";
|
||||||
flow.style.willChange = sichtbar ? "transform" : "auto";
|
flow.style.willChange = sichtbar ? "transform" : "auto";
|
||||||
}
|
}
|
||||||
|
|
||||||
const solarSVG = {
|
const solarSVG = {
|
||||||
updateCnt: 99,
|
updateCnt: 99,
|
||||||
/** Cache verwerfen - noetig, falls das SVG neu gezeichnet wird. */
|
/**
|
||||||
|
* Beide Zwischenspeicher verwerfen - noetig, falls das SVG neu gezeichnet
|
||||||
|
* wird. Nur die Knoten zu vergessen reicht nicht: letzterWert wuerde dann
|
||||||
|
* jeden Schreibzugriff als "unveraendert" ueberspringen und das frische
|
||||||
|
* SVG behielte seine Platzhalter.
|
||||||
|
*/
|
||||||
fillElementArray: function () {
|
fillElementArray: function () {
|
||||||
for (const id in svgElements) delete svgElements[id];
|
for (const id in svgElements) delete svgElements[id];
|
||||||
|
letzterWert.clear();
|
||||||
},
|
},
|
||||||
updateValuesMQTT: function (mqttData) {
|
updateValuesMQTT: function (mqttData) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user