Problem mit der Authentifizierung bei Cadav / Baikal

Begonnen von beSmart, 21 Juni 2024, 22:09:50

Vorheriges Thema - Nächstes Thema

beSmart

Hallo Forum.

Ich habe das Problem, dass Smartvisu für die Authentifizierung Basic Auth nutzt, die iOS-Geräte (17.5.1)können aber nur Digest.
Wie habt ihr dieses Problem gelöst bzw. wie würdet ihr es lösen?

Vielen Dank und Gruß

besmart

wvhn

#1
Hallo besmart,

den Zusammenhang verstehe ich noch nicht so ganz. Ich nutze mit meinen iOS-Geräten und mit smartViSU den iCloud-Kalender, für den smartVISU das CalDav-Skript verwendet.

Die Kalender-Abfragen sind in PHP-Skripten realisiert. PHP läuft auf dem Server. D.h. das iOS-Gerät sollte an der Authentifizierung nicht beteiligt sein. Welche Fehlermeldung bekommst Du beim Test? Rufe ggfls. das PHP-Skript mal direkt mit debug-Option im Browser auf:
http://<serverIP>/smartVISU/lib/calendar/service/CalDav.php?debug=1
Wenn Dein Kalender-Server nur Digest-Auth unterstützt, dann gibt es bisher keine Lösung. Dafür müsste jemand die Skripte erweitern.

Gruß
Wolfram

P.S.: in einem anderen Forum habe ich gelesen, dass man den Baikal Server wohl auf Basic Auth umstellen kann:
Baïkal web admin -> System settings -> WebDAV authentication type: Basic


beSmart

Guten Morgen Wolfram,

ich habe mich da mißverständlich ausgedrückt.
Es geht um die Nutzung des Kalenders mit Smartvisu (Basic Auth)und unabhängig von Smartvisu die Nutzung der Kalender-App auf dem Tablet.(Kalender-App, kann nur Digest)

Eine Lösung könnte sein einen 2. Server zu starten (1x mit Digest Auth und 1x mit Basic Auth)und dann die Datenbank per Script/cron alle xMinuten zu kopieren. Das finde ich persönlich aber nicht so schön.

Deshalb die Frage wie andere iOS-User das gelöst haben.

Gruß

Dirk

wvhn

#3
Moin Dirk,

leider kann ich keinen Kalender mit Digest Auth testen. Aber ich habe mal mit Hilfe von ChatGPT und Stackoverflow versucht, das CalDav Skript um Digest Auth zu erweitern. Die Digest Auth funktioniert an einer Dummy-Website, aber ich kann nicht testen, ob die XML-Methoden mit CURL so funktionieren.

Kannst Du das mal testen? Dazu einfach die Datei ./lib/calendar/service/CalDav.php sichern (in etwas anderes umbenennen) und mit der angehängten Datei ersetzen (Endung umbenennen in php).

Gruß
Wolfram

wvhn

Sorry, ich musste die Datei nochmal austauschen. Bei der Übernahme des Codes aus dem Test-Skript hatte ich eine Zeile vergessen.

Gruß
Wolfram

beSmart

Hallo Wolfram,

erstmal vielen Dank, dass du dir soviel Mühe gibst und deine Zeit investierst.

Die Datei habe ich wie von dir beschrieben in das angegebene Verzeichnis kopiert. Es kommt oben rechts die Fehlermeldung "HPPT request failed! HTTP/ 1.1 401 Unauthorized" Also ein Problem beim Login. Zur Gegenprobe habe ich dann den Baikal-Servers auf "Basic Auth" umgestellt und es funktioniert dann wieder. Soll ich dir Log-Dateien oder ähnliches senden um das Problem einzugrenzen?


Gruß

Dirk

wvhn

Moin Dirk,

Hattest Du schon die aktualisierte Version verwendet?
Die Fehlermeldung sollte die Überschrift "Calendar: CalDav" haben und im Textblock "Read request to <url> failed with message:..." enthalten. Ist das so?
Gibt es weitere Meldungen, wenn Du den Service mit debug-Parameter aufrufst (siehe oben)?

Am besten wäre es, wenn mir jemand einen Kalender mit Digest Auth zum Testen frei schalten könnte. Alternativ kann ich versuchen, noch mehr Diagnosemöglichkeiten in den Code einzubauen.

Gruß
Wolfram



beSmart

Guten Morgen,

Ja hatte ich. Habe die Datei gerade nochmal herunter geladen und dann aufgerufen. Die Ausgabe habe ich dir per PN geschickt.

Gruß Dirk

wvhn

#8
Moin Dirk,

zwecks Dokumentation für die Mitleser setze ich die Diskussion hier fort.

Die Debug-Ausgabe sieht eigentlich gut aus. Es werden die Kalender-URLs gefunden und aufgelistet. Das zeigt, dass die Authentifizierung funktioniert.
/*******************************************************************************
principal_url
--------------------------------------------------------------------------------
/dav.php/principals/xxxxxxx/
*******************************************************************************/

/*******************************************************************************
calendar_home_url
--------------------------------------------------------------------------------
/dav.php/calendars/xxxxxxx/
*******************************************************************************/

/*******************************************************************************
calendar_url of 'abfall'
--------------------------------------------------------------------------------
/dav.php/calendars/xxxxxxx/D2xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/
*******************************************************************************/
...
Trotzdem werden keine Kalenderdaten ausgelesen.
/*******************************************************************************
ICS Data of 'http://<DeineIP>/dav.php/calendars/xxxxxxx/D2xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/';
--------------------------------------------------------------------------------
---> hier müssten Event-Daten stehen <---
*******************************************************************************/
...

/*******************************************************************************
data
--------------------------------------------------------------------------------
Array
(
)

*******************************************************************************/
Im bisherigen Script wird die Authenticate-Methode bei jedem Aufruf einer URL neu ermittelt. Ich habe das jetzt so geändert, dass dies nur beim ersten Kontakt mit der Basis-URL geschieht. Das sollte robuster sein. Kannst Du das nochmal testen? Dann gerne die Debug-Ausgabe wieder per P/N und ggfls. einen Auszug aus der error.log des Webservers.

Gruß
Wolfram

beSmart

Hallo Wolfram,

die Debug-Ausgabe habe ich dir geschickt. Das Log-File des Web-Servers versuche ich heute Abend zu bekommen.


Gruß


Dirk

wvhn

Moin Dirk,

ich bin mittlerweile der Ansicht, dass die Digest Auth funktioniert, aber dass es mit Baikal ein Problem beim Auslesen der Kalenderdaten mit cURL und XML-"REPORT" gibt (siehe Kommentar zu https://stackoverflow.com/questions/27405342/get-events-from-caldav-server-using-curl). Wie man das lösen kann, weiß ich (noch) nicht.

Ein generelles Problem mit cURL und der CalDav-Abfrage gibt es wohl nicht. Ich habe zum Test auch die Basic Auth Version auf cURL umgestellt und bekomme von meinem iCloud-Kalender alle Daten ohne Probleme.

Für den weiteren Test sind anbei zwei Versionen:
- CalDav.txt: das ist die bisherige Version. Hier habe ich noch eine Funktion eingebaut, die das cURL-Logfile ./temp/curllog.txt anlegt
- CalDav.txt2: das ist die Version, die für beide Authentifizierungsmethoden cURL einsetzt und ebenfalls das Logfile erzeugt.

Wenn Du Baikal nun wieder auf "Basic Auth" stellst und meine Vermutung stimmt, dann sollte die Kalenderabfrage mit der ersten Version weiterhin funktionieren (hier läuft die Abfrage über PHP file_get_contents), während mit der zweiten Version (mit cURL) keine Daten mehr angezeigt werden. Kannst Du das einmal testen?

Interessant sind dann jeweils die Ausgaben der error.log des Webservers, der ./temp/curllog.txt und falls verfügbar der Log-Datei Deiner Baikal-Installation - natürlich ebenso im Modus "Digest Auth".

Gruß
Wolfram

beSmart

Hallo Wolfram,

Ich habe beide Dateien ausprobiert, die Datei curllog.txt wird nicht erstellt. (OS = Debian)

/temp/ gibt es bei mir nicht bzw. ich kann es nicht finden. Aber es gibt /tmp/. Habe den Pfad angepasst und auch /opt/fhem/ als Pfad probiert. Es wird keine Datei erstellt :(

Gruß

Dirk

wvhn

#12
Moin Dirk,

./temp ist ein Unterverzeichnis des smartVISU Hauptverzeichnisses.

Bestätigt sich meine Vermutung?

Gruß
Wolfram

P.S.: die Datei wird nur im Debug-Modus angelegt, also wenn der Service mit dem Parameter debug=1 aufgerufen wird, oder wenn in der config.ini debug=1 eingetragen.

beSmart

Guten Morgen,

ah, jetzt habe ich es verstanden. Wenn nichts dazwischen kommt, schick ich dir heute Mittag die Dateien.


Gruß


Dirk

beSmart

Hallo,

in der Anlage die Dateien. Ich versuche mal Stichpunktartig zusammenzufassen.

- Datei1 zeigt Termine an bei "Basic", erzeugt aber keine Log-Datei. "Digest" funktioniert wie erwartet nicht.(Log-Datei vorhanden)

-Datei2 zeigt auch Termine an bei "Basic" und erzeugt eine Log-Datei. "Digest" funktioniert auch hier nicht.

Die Logs vom Webserver und Baikal schicke ich später.


Vielen Dank und Gruß

Dirk

wvhn

Moin Dirk,

danke für die Dateien. Meine Vermutung, dass Baikal ein grundsätzliches Problem mit REPORT unter cURL hat, trifft also nicht zu. Ich habe hier (https://www.onderka.com/keine-kalendereintraege-mit-agendav-2-2-0-und-baikal-0-6-1) nochmal einen Hinwweis gefunden. Die vorgeschlagene Maßnahme kannst Du in der CalDav.php (Version 1) umsetzen, indem Du Zeile 50 wie folgt abänderst:
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
Wenn das nicht hilft, gehen mir die Ideen aus. Dann bräuchte ich selbst Zugriff zu einer Testinstanz, um Änderungen testen zu können.

Gruß
Wolfram

beSmart

Hallo Wolfram,

was soll ich sagen, :) :) ich hab ein dickes grinsen im Gesicht! Es funktioniert!!! Zeile 50 angepasst, Baikal auf "Digest" und zack, es funktioniert.
/*******************************************************************************
Authentication Method of Base URL
--------------------------------------------------------------------------------
Digest Auth
*******************************************************************************/

/*******************************************************************************
principal_url
--------------------------------------------------------------------------------
/dav.php/principals/Dirk/
*******************************************************************************/

/*******************************************************************************
calendar_home_url
--------------------------------------------------------------------------------
/dav.php/calendars/Dirk/
*******************************************************************************/

/*******************************************************************************
calendar_url of 'abfall'
--------------------------------------------------------------------------------
/dav.php/calendars/Dirk/D26D86DB-7FAE-44A1-B0E5-7B51731F8C4E/
*******************************************************************************/

/*******************************************************************************
calendar_url of 'default calendar'
--------------------------------------------------------------------------------
/dav.php/calendars/Dirk/default/
*******************************************************************************/

/*******************************************************************************
calendar_url of 'geburtstage'
--------------------------------------------------------------------------------
/dav.php/calendars/Dirk/geburtstage/
*******************************************************************************/

/*******************************************************************************
ICS Data of 'http://192.168.178.20:85/dav.php/calendars/Dirk/D26D86DB-7FAE-44A1-B0E5-7B51731F8C4E/'
--------------------------------------------------------------------------------
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Sabre//Sabre VObject 4.5.4//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT

!!Termine gelöscht!!

*******************************************************************************/

/*******************************************************************************
data
--------------------------------------------------------------------------------
Array
(
    [0] => Array
        (
            [start] => 1719871200
            [end] => 1719957600
            [title] => Papier
            [content] =>
            [where] =>
            [calendarname] => abfall
            [calendardesc] =>
            [calendarcolor] => #FF2968
            [class] =>
        )

)

*******************************************************************************/

<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /var/www/html/smartvisu/lib/service.php:122) in <b>/var/www/html/smartvisu/lib/service.php</b> on line <b>111</b><br />
[{"start":1719871200,"end":1719957600,"title":"Papier","content":"","where":null,"calendarname":"abfall","calendardesc":"","calendarcolor":"#FF2968","class":""}]

Kann das so bleiben oder ist der Code von dir nur zum testen und muss "aufgeräumt" werden?


Vielen, vielen Dank für deine Arbeit!

Gruß

Dirk

wvhn

Moin Dirk,

cool, dass wir das zusammen hinbekomnen haben! Danke Dir fürs Dranbleiben und Testen.

Ich werde die Variante 1 in den develop branch pushen, denn mit der Variante 1 ändert sich für die bisherigen Anwender praktisch nichts. Auch wenn Variante 2 eleganter ist, bleibt eben ein Restrisiko und ich kann nicht jede vorstellbare Kalender-Variante testen.
Du kannst das bei Dir so laufen lassen. Aufgeräumt habe ich schon. Beim nächsten Update per git musst Du dann halt die Änderungen noch "stashen", damit das Update funktioniert.

Gruß
Wolfram