Compare commits
8
Commits
488bc698de
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c59e7fb393 | ||
|
|
7dd6580bcc | ||
|
|
a6758ae63b | ||
|
|
0dceb35502 | ||
|
|
73e64b72ac | ||
|
|
70c8600efe | ||
|
|
f3f97a55ce | ||
|
|
e2124220e5 |
@@ -45,7 +45,7 @@ cd /home/intranet/kunden && php db-backup.php
|
|||||||
|
|
||||||
`CONFIG_PATH` zeigt auf `/volume1/homes/wagner/kundenconfig/` (Linux) bzw. `c:/kundenverwaltung/config/` (Windows). Geschrieben wird die Datei von `update/rebuild-settings.php` beim Ersteinrichten.
|
`CONFIG_PATH` zeigt auf `/volume1/homes/wagner/kundenconfig/` (Linux) bzw. `c:/kundenverwaltung/config/` (Windows). Geschrieben wird die Datei von `update/rebuild-settings.php` beim Ersteinrichten.
|
||||||
|
|
||||||
Neben den Zugangsdaten steht dort auch `$instanz` (siehe oben). Die Datei deklariert `$mysql_user`, `$mysql_pw`, `$mysql_server`, `$mysql_db`, `$firma` und weitere ausdrücklich als `global` und weist sie erst danach zu. Nur deshalb funktioniert `readsettings()` in `incs/settings.php`: Das `include` passiert im Funktionsrumpf, ohne die `global`-Zeilen blieben die Variablen dort lokal. Wer die Config-Struktur ändert, muss diese Eigenheit erhalten.
|
Neben den DB-Zugangsdaten stehen dort auch `$instanz` (siehe oben), die SMTP-Zugänge je Firma (`$smtp_konten`, Schlüssel `"*"` als Rückfall, genutzt von `mail_attachment()`), der Zugang zur Statistik-Datenbank für `stats.php` (`$stats_mysql_*`) und die Wetter-API-Schlüssel (`$openweathermap_appid`, `$aeris_client_*`). Die Datei deklariert `$mysql_user`, `$mysql_pw`, `$mysql_server`, `$mysql_db`, `$firma` und weitere ausdrücklich als `global` und weist sie erst danach zu. Nur deshalb funktioniert `readsettings()` in `incs/settings.php`: Das `include` passiert im Funktionsrumpf, ohne die `global`-Zeilen blieben die Variablen dort lokal. Wer die Config-Struktur ändert, muss diese Eigenheit erhalten.
|
||||||
|
|
||||||
Zugangsdaten gehören **nie** in den Code — `db-backup.php` zeigt das Muster für Skripte außerhalb des Request-Zyklus (Config einlesen, Passwort über eine temporäre Optionsdatei an `mysqldump`, nicht per Kommandozeile).
|
Zugangsdaten gehören **nie** in den Code — `db-backup.php` zeigt das Muster für Skripte außerhalb des Request-Zyklus (Config einlesen, Passwort über eine temporäre Optionsdatei an `mysqldump`, nicht per Kommandozeile).
|
||||||
|
|
||||||
@@ -102,6 +102,9 @@ SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über
|
|||||||
|
|
||||||
Klassischer Login plus WebAuthn/FIDO2. Server-Seite: `authServer.php` mit `incs/WebAuthn` (Bibliothek von Lukas Buchs) und `incs/authHelper.php`; Client-Seite `js/auth.js`. Schlüsselverwaltung über `addKey.php` und `sites/userkeys.php`.
|
Klassischer Login plus WebAuthn/FIDO2. Server-Seite: `authServer.php` mit `incs/WebAuthn` (Bibliothek von Lukas Buchs) und `incs/authHelper.php`; Client-Seite `js/auth.js`. Schlüsselverwaltung über `addKey.php` und `sites/userkeys.php`.
|
||||||
|
|
||||||
|
- **Passwort-Login nur aus dem lokalen Netz**, von außen nur per Passkey. „Lokal“ entscheidet `isLocal()` in `incs/authHelper.php` anhand von `$lokale_netze` (CIDR-Liste) aus der externen Config. Anfragen mit Proxy-Headern (`X-Forwarded-For`, `Forwarded` …) gelten nie als lokal. Webserver und MariaDB laufen in Docker auf dem NAS: **Das Docker-Netz gehört nicht in die Liste**, sonst gilt jede über den Docker- oder Reverse-Proxy eingehende Anfrage als lokal.
|
||||||
|
- **Passkeys anlegen** geht nur über eine Einmal-Freigabe: Ein Superadmin erzeugt in `addKey.php` einen `addKey`, `sites/userkeys.php` löst ihn ein und legt `$_SESSION["passkey_freigabe"]` (Benutzer-id, 5 Minuten) ab. `authServer.php` akzeptiert `getCreateArgs`/`processCreate` nur mit dieser Freigabe und nimmt die Benutzer-id von dort, nie aus der URL.
|
||||||
|
|
||||||
## Historie
|
## Historie
|
||||||
|
|
||||||
Am 2026-08-28 wurden tote Pfade entfernt: `smarty3/` (ungenutztes Smarty 3.1.6), `incs/tcpdf_old/`, `incs/fpdf.php` samt FPDF-Schriftmetriken und `incs/font/makefont/`, `sites/makepdf_OLD.php`, `incs/users_old.php` und `oldindex.php`. Auf keines davon verwies noch Code.
|
Am 2026-08-28 wurden tote Pfade entfernt: `smarty3/` (ungenutztes Smarty 3.1.6), `incs/tcpdf_old/`, `incs/fpdf.php` samt FPDF-Schriftmetriken und `incs/font/makefont/`, `sites/makepdf_OLD.php`, `incs/users_old.php` und `oldindex.php`. Auf keines davon verwies noch Code.
|
||||||
|
|||||||
+4
-3
@@ -16,7 +16,8 @@ if($settings == "valid")
|
|||||||
if(!@mysqli_select_db($dbconn,$mysql_db))
|
if(!@mysqli_select_db($dbconn,$mysql_db))
|
||||||
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
|
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
|
||||||
}
|
}
|
||||||
if($_SESSION["login"] == "valid" && isset($_GET["id"])){
|
// Wie sites/userkeys.php: nur Superadmins dürfen Passkeys vergeben
|
||||||
|
if($_SESSION["login"] == "valid" && isset($_GET["id"]) && ((int)substr($_SESSION["rights"], RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE)){
|
||||||
if(!mysqli_query($dbconn,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){
|
if(!mysqli_query($dbconn,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){
|
||||||
echo mysqli_error($dbconn);
|
echo mysqli_error($dbconn);
|
||||||
}
|
}
|
||||||
@@ -25,8 +26,8 @@ if($_SESSION["login"] == "valid" && isset($_GET["id"])){
|
|||||||
if(!mysqli_query($dbconn,"INSERT INTO addKey SET accesskey=".$accessKey.", datetime=NOW();")){
|
if(!mysqli_query($dbconn,"INSERT INTO addKey SET accesskey=".$accessKey.", datetime=NOW();")){
|
||||||
echo mysqli_error($dbconn);
|
echo mysqli_error($dbconn);
|
||||||
}
|
}
|
||||||
header('Location: https://wm.el-wa.org/kunden?action=userkeys&id='.$_GET["id"].'&addKey='.$accessKey);
|
header('Location: https://wm.el-wa.org/kunden?action=userkeys&id='.(int)$_GET["id"].'&addKey='.$accessKey);
|
||||||
echo 'https://wm.el-wa.org/kunden?action=userkeys&id='.$_GET["id"].'&addKey='.$accessKey;
|
echo 'https://wm.el-wa.org/kunden?action=userkeys&id='.(int)$_GET["id"].'&addKey='.$accessKey;
|
||||||
}else{
|
}else{
|
||||||
echo "Keine Berechtigung.";
|
echo "Keine Berechtigung.";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
require_once("../../incs/constants.php");
|
require_once("../../incs/constants.php");
|
||||||
session_name(SESSION_NAME);
|
session_name(SESSION_NAME);
|
||||||
session_start();
|
session_start();
|
||||||
|
// Alle AJAX-Endpunkte laden diese Datei: ohne Anmeldung gibt es keine Daten.
|
||||||
|
if(($_SESSION["login"] ?? "") !== "valid")
|
||||||
|
{
|
||||||
|
http_response_code(403);
|
||||||
|
exit("Nicht angemeldet.");
|
||||||
|
}
|
||||||
require_once("../../incs/settings.php");
|
require_once("../../incs/settings.php");
|
||||||
$settings=readsettings();
|
$settings=readsettings();
|
||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
|
|||||||
+29
-3
@@ -107,6 +107,24 @@ try {
|
|||||||
// request for create arguments
|
// request for create arguments
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
|
|
||||||
|
// Passkeys anlegen darf nur ein angemeldeter Superadmin, der vorher in
|
||||||
|
// sites/userkeys.php eine gültige Einmal-Freigabe (addKey) eingelöst hat.
|
||||||
|
// Die Freigabe liegt in der Session und legt fest, für welchen Benutzer
|
||||||
|
// der Schlüssel gilt - die id aus der URL zählt nicht.
|
||||||
|
$passkeyFreigabe = null;
|
||||||
|
if (isset($_SESSION["passkey_freigabe"]) && $_SESSION["passkey_freigabe"]["bis"] >= time()
|
||||||
|
&& ($_SESSION["login"] ?? "") == "valid"
|
||||||
|
&& ((int)substr($_SESSION["rights"] ?? "", RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE)) {
|
||||||
|
$passkeyFreigabe = $_SESSION["passkey_freigabe"];
|
||||||
|
}
|
||||||
|
if (($fn === 'getCreateArgs' || $fn === 'processCreate') && $passkeyFreigabe === null) {
|
||||||
|
throw new Exception('Keine Berechtigung, Passkeys anzulegen.');
|
||||||
|
}
|
||||||
|
if ($fn === 'queryFidoMetaDataService'
|
||||||
|
&& !(($_SESSION["login"] ?? "") == "valid" && ((int)substr($_SESSION["rights"] ?? "", RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE))) {
|
||||||
|
throw new Exception('Keine Berechtigung.');
|
||||||
|
}
|
||||||
|
|
||||||
if ($fn === 'getCreateArgs') {
|
if ($fn === 'getCreateArgs') {
|
||||||
$createArgs = $WebAuthn->getCreateArgs(\hex2bin($userId), $userName, $userDisplayName, 60*4, $requireResidentKey, $userVerification, $crossPlatformAttachment);
|
$createArgs = $WebAuthn->getCreateArgs(\hex2bin($userId), $userName, $userDisplayName, 60*4, $requireResidentKey, $userVerification, $crossPlatformAttachment);
|
||||||
|
|
||||||
@@ -181,10 +199,12 @@ try {
|
|||||||
if (!isset($_SESSION['registrations']) || !array_key_exists('registrations', $_SESSION) || !is_array($_SESSION['registrations'])) {
|
if (!isset($_SESSION['registrations']) || !array_key_exists('registrations', $_SESSION) || !is_array($_SESSION['registrations'])) {
|
||||||
$_SESSION['registrations'] = [];
|
$_SESSION['registrations'] = [];
|
||||||
}*/
|
}*/
|
||||||
if(!mysqli_query($dbconn,"INSERT INTO passkeys SET credentialId = '".base64_encode($data->credentialId)."', credentialPublicKey = '".base64_encode($data->credentialPublicKey)."', signatureCounter = '".base64_encode($data->signatureCounter)."', name = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'name'))."', userId = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'id'))."';")){
|
if(!mysqli_query($dbconn,"INSERT INTO passkeys SET credentialId = '".base64_encode($data->credentialId)."', credentialPublicKey = '".base64_encode($data->credentialPublicKey)."', signatureCounter = '".base64_encode($data->signatureCounter)."', name = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'name'))."', userId = '".(int)$passkeyFreigabe["user"]."';")){
|
||||||
$msg = "Error:<br>".mysqli_error($dbconn)."<br />";
|
$msg = "Error:<br>".mysqli_error($dbconn)."<br />";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
// Freigabe gilt für genau einen Schlüssel
|
||||||
|
unset($_SESSION["passkey_freigabe"]);
|
||||||
if ($data->rootValid === false) {
|
if ($data->rootValid === false) {
|
||||||
$msg = 'registration ok, but certificate does not match any of the selected root ca. NO PROBLEM FOR THIS APP';
|
$msg = 'registration ok, but certificate does not match any of the selected root ca. NO PROBLEM FOR THIS APP';
|
||||||
}
|
}
|
||||||
@@ -253,10 +273,16 @@ try {
|
|||||||
|
|
||||||
$authKey = strval(random_int(0,99999999));
|
$authKey = strval(random_int(0,99999999));
|
||||||
$result = mysqli_query($dbconn,"UPDATE passkeys SET authKey=".$authKey.", lastAuth=NOW() WHERE credentialId = '".base64_encode($id)."';");
|
$result = mysqli_query($dbconn,"UPDATE passkeys SET authKey=".$authKey.", lastAuth=NOW() WHERE credentialId = '".base64_encode($id)."';");
|
||||||
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE id = '".mysqli_real_escape_string($dbconn,$userId)."'");
|
// Gesperrte Benutzer bleiben gesperrt, auch mit gültigem Passkey
|
||||||
if(mysqli_num_rows($qry) == 1)
|
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE id = '".mysqli_real_escape_string($dbconn,$userId)."' AND blocked = 0");
|
||||||
|
if(!$qry || mysqli_num_rows($qry) != 1)
|
||||||
|
{
|
||||||
|
throw new Exception('Benutzer nicht gefunden oder gesperrt.');
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
$udata = mysqli_fetch_assoc($qry);
|
$udata = mysqli_fetch_assoc($qry);
|
||||||
|
session_regenerate_id(true);
|
||||||
$_SESSION["login"] = "valid";
|
$_SESSION["login"] = "valid";
|
||||||
$_SESSION["logedout"] = $udata["logedout"];
|
$_SESSION["logedout"] = $udata["logedout"];
|
||||||
$_SESSION["user"] = $udata["id"];
|
$_SESSION["user"] = $udata["id"];
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
// Wartungsskript: nur per Kommandozeile, nie über den Webserver
|
||||||
|
if(PHP_SAPI != "cli")
|
||||||
|
exit;
|
||||||
require_once("./incs/constants.php");
|
require_once("./incs/constants.php");
|
||||||
session_name(SESSION_NAME);
|
session_name(SESSION_NAME);
|
||||||
session_start();
|
session_start();
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
// Nur per Kommandozeile (Cronjob), nie über den Webserver
|
||||||
|
if(PHP_SAPI != "cli")
|
||||||
|
exit;
|
||||||
/*
|
/*
|
||||||
* Datenbank-Backup (Cronjob).
|
* Datenbank-Backup (Cronjob).
|
||||||
*
|
*
|
||||||
|
|||||||
+65
-6
@@ -16,15 +16,74 @@ if($settings == "valid")
|
|||||||
|
|
||||||
$_SESSION["local"] =false;
|
$_SESSION["local"] =false;
|
||||||
|
|
||||||
function isLocal(){
|
/*
|
||||||
$ipv6_prefix = explode(":",$_SERVER['SERVER_ADDR'],5);
|
* Liegt $ip im Netz $netz (CIDR-Schreibweise, IPv4 oder IPv6)? Eine Adresse
|
||||||
$ipv6 = explode(":",$_SERVER['REMOTE_ADDR'],5);
|
* ohne /Präfix gilt als einzelner Host.
|
||||||
if(($ipv6_prefix[0] == $ipv6[0] && $ipv6_prefix[1] == $ipv6[1] && $ipv6_prefix[2] == $ipv6[2] && $ipv6_prefix[3] == $ipv6[3]) || str_starts_with($_SERVER['REMOTE_ADDR'],"192.168.147.")){
|
*/
|
||||||
$_SESSION["local"] =true;
|
function ipImNetz($ip, $netz)
|
||||||
|
{
|
||||||
|
if(!str_contains($netz, "/"))
|
||||||
|
$netz .= str_contains($netz, ":") ? "/128" : "/32";
|
||||||
|
list($adresse, $praefix) = explode("/", $netz, 2);
|
||||||
|
$ipBin = @inet_pton($ip);
|
||||||
|
$netzBin = @inet_pton($adresse);
|
||||||
|
if($ipBin === false || $netzBin === false || !ctype_digit($praefix))
|
||||||
|
return false;
|
||||||
|
// IPv4 in IPv6-Schreibweise (::ffff:192.168.1.2) wie IPv4 behandeln
|
||||||
|
if(strlen($ipBin) == 16 && strlen($netzBin) == 4 && substr($ipBin, 0, 12) === str_repeat("\0", 10)."\xff\xff")
|
||||||
|
$ipBin = substr($ipBin, 12);
|
||||||
|
$praefix = (int)$praefix;
|
||||||
|
if(strlen($ipBin) != strlen($netzBin) || $praefix > strlen($ipBin) * 8)
|
||||||
|
return false;
|
||||||
|
$bytes = intdiv($praefix, 8);
|
||||||
|
if(substr($ipBin, 0, $bytes) !== substr($netzBin, 0, $bytes))
|
||||||
|
return false;
|
||||||
|
$bits = $praefix % 8;
|
||||||
|
if($bits == 0)
|
||||||
return true;
|
return true;
|
||||||
}else{
|
$maske = (0xFF << (8 - $bits)) & 0xFF;
|
||||||
|
return (ord($ipBin[$bytes]) & $maske) == (ord($netzBin[$bytes]) & $maske);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Kommt die Anfrage aus dem lokalen Netz? Davon hängen Passwort-Login und das
|
||||||
|
* Vergeben von Passkeys ab.
|
||||||
|
*
|
||||||
|
* Maßgeblich ist $lokale_netze aus der externen Config, z.B.
|
||||||
|
* $lokale_netze = array("192.168.179.0/24", "2001:db8:1:2::/64");
|
||||||
|
* Fehlt die Liste, gelten nur Geräte im selben IPv6-/64-Netz wie der Server.
|
||||||
|
*
|
||||||
|
* Das Docker-Netz darf dort nicht stehen: Anfragen, die über den Docker-
|
||||||
|
* Proxy oder einen Reverse Proxy kommen, tragen dessen Adresse aus diesem
|
||||||
|
* Netz - dann wäre jeder Zugriff aus dem Internet "lokal".
|
||||||
|
*/
|
||||||
|
function isLocal(){
|
||||||
|
global $lokale_netze;
|
||||||
|
$_SESSION["local"] = false;
|
||||||
|
|
||||||
|
// Über einen Proxy weitergereicht: REMOTE_ADDR ist dann die Adresse des
|
||||||
|
// Proxys, nicht die des Browsers. Solche Anfragen sind nie lokal.
|
||||||
|
foreach(array("HTTP_X_FORWARDED_FOR", "HTTP_X_REAL_IP", "HTTP_FORWARDED", "HTTP_X_FORWARDED_HOST", "HTTP_CLIENT_IP") as $kopf){
|
||||||
|
if(!empty($_SERVER[$kopf]))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$remote = $_SERVER["REMOTE_ADDR"] ?? "";
|
||||||
|
$lokal = false;
|
||||||
|
if(is_array($lokale_netze)){
|
||||||
|
foreach($lokale_netze as $netz){
|
||||||
|
if(ipImNetz($remote, $netz)){
|
||||||
|
$lokal = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$server = $_SERVER["SERVER_ADDR"] ?? "";
|
||||||
|
$lokal = str_contains($server, ":") && !str_starts_with(strtolower($server), "fe80") && ipImNetz($remote, $server."/64");
|
||||||
|
}
|
||||||
|
|
||||||
|
$_SESSION["local"] = $lokal;
|
||||||
|
return $lokal;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkLogin(){
|
function checkLogin(){
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
require_once("../incs/constants.php");
|
require_once("../incs/constants.php");
|
||||||
session_name(SESSION_NAME);
|
session_name(SESSION_NAME);
|
||||||
session_start();
|
session_start();
|
||||||
|
// Alle AJAX-Endpunkte laden diese Datei: ohne Anmeldung gibt es keine Daten.
|
||||||
|
if(($_SESSION["login"] ?? "") !== "valid")
|
||||||
|
{
|
||||||
|
http_response_code(403);
|
||||||
|
exit("Nicht angemeldet.");
|
||||||
|
}
|
||||||
require_once("../incs/settings.php");
|
require_once("../incs/settings.php");
|
||||||
$settings=readsettings();
|
$settings=readsettings();
|
||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
|
|||||||
+15
-18
@@ -85,7 +85,16 @@ function PopulateSessionVars()
|
|||||||
|
|
||||||
use PHPMailer\PHPMailer\PHPMailer;
|
use PHPMailer\PHPMailer\PHPMailer;
|
||||||
function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
|
function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
|
||||||
|
// SMTP-Zugänge stehen in der externen Config, je Firma ein Eintrag,
|
||||||
|
// "*" gilt für alle übrigen: array("user" => "...", "pw" => "...")
|
||||||
|
global $smtp_konten;
|
||||||
|
|
||||||
|
if(isset($smtp_konten[$_SESSION["firma"]]))
|
||||||
|
$konto = $smtp_konten[$_SESSION["firma"]];
|
||||||
|
elseif(isset($smtp_konten["*"]))
|
||||||
|
$konto = $smtp_konten["*"];
|
||||||
|
else
|
||||||
|
return error("Kein SMTP-Zugang für \"".htmlspecialchars($_SESSION["firma"])."\" in der Konfiguration (\$smtp_konten).");
|
||||||
|
|
||||||
$mail = new PHPMailer();
|
$mail = new PHPMailer();
|
||||||
|
|
||||||
@@ -97,21 +106,8 @@ function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $rep
|
|||||||
$mail->SMTPAuth = true; // turn on SMTP authentication
|
$mail->SMTPAuth = true; // turn on SMTP authentication
|
||||||
$mail->SMTPSecure = "ssl";
|
$mail->SMTPSecure = "ssl";
|
||||||
$mail->Port = 465;
|
$mail->Port = 465;
|
||||||
if($_SESSION["firma"] == "Wagner Markisen")
|
$mail->Username = $konto["user"];
|
||||||
{
|
$mail->Password = $konto["pw"];
|
||||||
$mail->Username = "info@wagner-markisen.de"; // SMTP username
|
|
||||||
$mail->Password = "m0w1337@RootServer"; // SMTP password
|
|
||||||
}
|
|
||||||
elseif($_SESSION["firma"] == "Ingenieurbüro Wagner")
|
|
||||||
{
|
|
||||||
$mail->Username = "m0w1337@gmail.com"; // SMTP username
|
|
||||||
$mail->Password = "Gmail@RootServer"; // SMTP password
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$mail->Username = "wagnermarkisen12@googlemail.com"; // SMTP username
|
|
||||||
$mail->Password = "m0w1337@RootServer"; // SMTP password
|
|
||||||
}
|
|
||||||
|
|
||||||
$mail->From = $from_mail;
|
$mail->From = $from_mail;
|
||||||
$mail->FromName = $from_name;
|
$mail->FromName = $from_name;
|
||||||
@@ -570,9 +566,10 @@ function GetWeather($plz='87509', $land='germany', $icons_src="./pics/icons/weat
|
|||||||
{
|
{
|
||||||
$station = $plz."-".$land;
|
$station = $plz."-".$land;
|
||||||
}
|
}
|
||||||
//$url[0] = "http://api.aerisapi.com/observations/immenstadt,germany?client_id=8JYXl86uUEeoPl40ncnBs&client_secret=RvVVj0K9yFgmp7U8CmgCH57YwGYeyuHjHtrSPxGV";
|
// API-Schlüssel stehen in der externen Config
|
||||||
$url[0] = "http://api.openweathermap.org/data/2.5/weather?zip=87509,de&APPID=a7be2029b8584f5eeff40ca9789f6435";
|
global $openweathermap_appid, $aeris_client_id, $aeris_client_secret;
|
||||||
$url[1] = "http://api.aerisapi.com/forecasts/immenstadt,germany?client_id=8JYXl86uUEeoPl40ncnBs&client_secret=RvVVj0K9yFgmp7U8CmgCH57YwGYeyuHjHtrSPxGV&from=today&to=+6days";
|
$url[0] = "http://api.openweathermap.org/data/2.5/weather?zip=87509,de&APPID=".urlencode($openweathermap_appid);
|
||||||
|
$url[1] = "http://api.aerisapi.com/forecasts/immenstadt,germany?client_id=".urlencode($aeris_client_id)."&client_secret=".urlencode($aeris_client_secret)."&from=today&to=+6days";
|
||||||
|
|
||||||
$response = file_get_contents($url[1]);
|
$response = file_get_contents($url[1]);
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ if(isset($_GET["formsent"]) && $_SESSION["login"] != "valid" && isLocal())
|
|||||||
if(mysqli_num_rows($qry) == 1)
|
if(mysqli_num_rows($qry) == 1)
|
||||||
{
|
{
|
||||||
$udata = mysqli_fetch_assoc($qry);
|
$udata = mysqli_fetch_assoc($qry);
|
||||||
|
// neue Session-ID nach dem Login, sonst ist Session-Fixation möglich
|
||||||
|
session_regenerate_id(true);
|
||||||
$_SESSION["login"] = "valid";
|
$_SESSION["login"] = "valid";
|
||||||
$_SESSION["logedout"] = $udata["logedout"];
|
$_SESSION["logedout"] = $udata["logedout"];
|
||||||
$_SESSION["user"] = $udata["id"];
|
$_SESSION["user"] = $udata["id"];
|
||||||
|
|||||||
+8
-3
@@ -2,7 +2,12 @@
|
|||||||
|
|
||||||
|
|
||||||
if(isset($_GET["id"]) && isset($_GET["addKey"])){
|
if(isset($_GET["id"]) && isset($_GET["addKey"])){
|
||||||
if (checkAdduser($_GET["addUser"])) {
|
if (checkAdduser()) {
|
||||||
|
// Freigabe einlösen: gilt 5 Minuten, nur für diesen Benutzer und nur
|
||||||
|
// in dieser Session (geprüft in authServer.php). Der addKey ist damit
|
||||||
|
// verbraucht.
|
||||||
|
$_SESSION["passkey_freigabe"] = array("user" => (int)$_GET["id"], "bis" => time() + 300);
|
||||||
|
mysqli_query($mysql, "DELETE FROM addKey WHERE accesskey = '".mysqli_real_escape_string($mysql, $_GET["addKey"])."'");
|
||||||
echo <<<ENDE
|
echo <<<ENDE
|
||||||
<html>
|
<html>
|
||||||
<head></head>
|
<head></head>
|
||||||
@@ -73,11 +78,11 @@ if(isset($_GET["id"]) && isset($_GET["addKey"])){
|
|||||||
$smarty->assign("heading","Passkeys für externen Zugang verwalten");
|
$smarty->assign("heading","Passkeys für externen Zugang verwalten");
|
||||||
$smarty->display("heading.tpl");
|
$smarty->display("heading.tpl");
|
||||||
|
|
||||||
$qry = mysqli_query($_SESSION["dbconn"],"SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ".mysqli_real_escape_string($_SESSION["dbconn"],$_GET["id"])) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
$qry = mysqli_query($_SESSION["dbconn"],"SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ".(int)$_GET["id"]) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
||||||
$row=mysqli_fetch_array($qry);
|
$row=mysqli_fetch_array($qry);
|
||||||
$smarty->assign("user",$row);
|
$smarty->assign("user",$row);
|
||||||
|
|
||||||
$qry = mysqli_query($_SESSION["dbconn"],"SELECT passkeys.id , passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ".mysqli_real_escape_string($_SESSION["dbconn"],$_GET["id"])) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
$qry = mysqli_query($_SESSION["dbconn"],"SELECT passkeys.id , passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ".(int)$_GET["id"]) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
||||||
$keys = array();
|
$keys = array();
|
||||||
while($row=mysqli_fetch_array($qry)){
|
while($row=mysqli_fetch_array($qry)){
|
||||||
$keys[] = $row;
|
$keys[] = $row;
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
|
require_once("incs/constants.php");
|
||||||
|
session_name(SESSION_NAME);
|
||||||
|
session_start();
|
||||||
|
if((($_SESSION["login"] ?? "") !== "valid"))
|
||||||
|
{
|
||||||
|
http_response_code(403);
|
||||||
|
exit("Nicht angemeldet.");
|
||||||
|
}
|
||||||
|
|
||||||
error_reporting(E_ERROR | E_WARNING | E_PARSE);
|
error_reporting(E_ERROR | E_WARNING | E_PARSE);
|
||||||
// Standard inclusions
|
// Standard inclusions
|
||||||
@@ -6,8 +14,11 @@
|
|||||||
include("incs/pChart/pChart.class");
|
include("incs/pChart/pChart.class");
|
||||||
|
|
||||||
|
|
||||||
$dbconn = mysqli_connect("localhost","m0","m0sSqL");
|
// Zugang zur Statistik-Datenbank steht in der externen Config
|
||||||
mysqli_select_db($dbconn,"systemstats");
|
require_once("incs/settings.php");
|
||||||
|
readsettings();
|
||||||
|
$dbconn = mysqli_connect($stats_mysql_server, $stats_mysql_user, $stats_mysql_pw) or die("Keine Verbindung zur Statistik-Datenbank.");
|
||||||
|
mysqli_select_db($dbconn, $stats_mysql_db);
|
||||||
|
|
||||||
$qry = mysqli_query($dbconn, "SELECT DATE_FORMAT(datetime, '%d.%m.%y') AS datetime, MAX(percent) AS value FROM hdd WHERE datetime > DATE_SUB(NOW(), INTERVAL 31 DAY) GROUP BY DATE_FORMAT(datetime, '%d.%m.%y') ORDER BY DATE_FORMAT(datetime, '%y%m%d') ASC") or die(mysqli_error($dbconn));
|
$qry = mysqli_query($dbconn, "SELECT DATE_FORMAT(datetime, '%d.%m.%y') AS datetime, MAX(percent) AS value FROM hdd WHERE datetime > DATE_SUB(NOW(), INTERVAL 31 DAY) GROUP BY DATE_FORMAT(datetime, '%d.%m.%y') ORDER BY DATE_FORMAT(datetime, '%y%m%d') ASC") or die(mysqli_error($dbconn));
|
||||||
// Dataset definition
|
// Dataset definition
|
||||||
|
|||||||
@@ -30,6 +30,15 @@ if(!file_put_contents (CONFIG_PATH.CONFIG_FILE,
|
|||||||
global $firma;
|
global $firma;
|
||||||
global $dbconn;
|
global $dbconn;
|
||||||
global $geodbconn;
|
global $geodbconn;
|
||||||
|
global $smtp_konten;
|
||||||
|
global $stats_mysql_server;
|
||||||
|
global $stats_mysql_user;
|
||||||
|
global $stats_mysql_pw;
|
||||||
|
global $stats_mysql_db;
|
||||||
|
global $openweathermap_appid;
|
||||||
|
global $aeris_client_id;
|
||||||
|
global $aeris_client_secret;
|
||||||
|
global $lokale_netze;
|
||||||
|
|
||||||
$instanz = '.var_export(INSTANZ, true).';
|
$instanz = '.var_export(INSTANZ, true).';
|
||||||
$dbconn = 0;
|
$dbconn = 0;
|
||||||
@@ -40,6 +49,20 @@ if(!file_put_contents (CONFIG_PATH.CONFIG_FILE,
|
|||||||
$mysql_server = '.configWert("mysqlserver").';
|
$mysql_server = '.configWert("mysqlserver").';
|
||||||
$mysql_opengeodb = '.configWert("opengeodb").';
|
$mysql_opengeodb = '.configWert("opengeodb").';
|
||||||
$firma = '.configWert("firma", true).';
|
$firma = '.configWert("firma", true).';
|
||||||
|
|
||||||
|
// Von Hand zu pflegen: SMTP-Zugänge je Firma, "*" für alle übrigen
|
||||||
|
$smtp_konten = array(
|
||||||
|
"*" => array("user" => "", "pw" => ""),
|
||||||
|
);
|
||||||
|
$stats_mysql_server = "localhost";
|
||||||
|
$stats_mysql_user = "";
|
||||||
|
$stats_mysql_pw = "";
|
||||||
|
$stats_mysql_db = "systemstats";
|
||||||
|
$openweathermap_appid = "";
|
||||||
|
$aeris_client_id = "";
|
||||||
|
$aeris_client_secret = "";
|
||||||
|
// Netze, aus denen Passwort-Login erlaubt ist (CIDR). Nie das Docker-Netz!
|
||||||
|
$lokale_netze = array();
|
||||||
?>'))
|
?>'))
|
||||||
{
|
{
|
||||||
$err= error("Konfiguration konnte nicht geschrieben werden!");
|
$err= error("Konfiguration konnte nicht geschrieben werden!");
|
||||||
|
|||||||
Reference in New Issue
Block a user