Compare commits
4
Commits
16e236c7f8
...
37270acb23
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37270acb23 | ||
|
|
f17d010d5f | ||
|
|
405162ed47 | ||
|
|
dc85f33e9f |
@@ -20,7 +20,28 @@
|
||||
# --- Dateitypen, die der Browser nie anfordert ---
|
||||
# Konfiguration, Python-Skripte, Datenhaltung, Vorlagen und Archive. Die
|
||||
# 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>
|
||||
Require all denied
|
||||
</IfModule>
|
||||
|
||||
+14
-1
@@ -20,7 +20,20 @@ function ipInNetwork($ip, $cidr)
|
||||
if ($adresse === false || $netz === false || strlen($adresse) !== strlen($netz)) {
|
||||
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);
|
||||
$restBits = $bits % 8;
|
||||
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.
|
||||
function setFlowWidth(id, width) {
|
||||
const flow = svgElement(id);
|
||||
const sichtbar = Math.abs(width) >= 0.5;
|
||||
flow.style.setProperty("--w", (sichtbar ? Math.abs(width) : 0) + "px");
|
||||
// Eine negative Breite heisst "kein Fluss in dieser Richtung" - die
|
||||
// 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.willChange = sichtbar ? "transform" : "auto";
|
||||
}
|
||||
|
||||
const solarSVG = {
|
||||
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 () {
|
||||
for (const id in svgElements) delete svgElements[id];
|
||||
letzterWert.clear();
|
||||
},
|
||||
updateValuesMQTT: function (mqttData) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user