![]() |
WebDAV Login Beispiel
Hallo DP,
Ich finde im Netz erstaunlich wenig Beispiele über Delphi und IdWebdav. Da Webdav von HTTP abgeleitet ist, habe ich einfach mal ein Selbstversuch gestartet und eine kleine Demo-Anwendung geschrieben. Diese soll sich auf einem Server einloggen um eine Datei herunterladen zu können:
Delphi-Quellcode:
Aber das Login wird nie ausgeführt, ich lande immer auf der Loginpage. Wie kann ich denn das Login erzwingen ?
procedure TForm5.Button1Click(Sender: TObject);
var webdav: TIdWebDAV; Request: TStringList; Response: TMemoryStream; code:integer; s:string; begin webdav := TIdwebdav.Create; Response :=TMemoryStream.Create; Request := TStringList.Create; try webdav.IOHandler := IdSSLIOHandlerSocketOpenSSL1; webdav.Request.BasicAuthentication:= true; webdav.Request.Username := 'yourname'; webdav.Request.Username := 'Katzeklo'; webdav.AllowCookies := True; webdav.HandleRedirects := True; webdav.Request.ContentType := 'application/x-www-form-urlencoded'; webdav.post('https://www.meinzielserver.de/login', Request, Response); s := webdav.Get('https://www.meinzielserver.de/katzen/katzen.xml'); showmessage(s); finally webdav.Free; Response.Free; Request.Free; end; end; |
AW: WebDAV Login Beispiel
Ist die Indy WebDAV-Komponente überhaupt in der Lage, das HTTPS-Protokoll zu verarbeiten? Ich habe mit den Standard-Komponenten, die mit Delphi mitgeliefert werden, bei meinen Versuchen nur mitgeteilt bekommen, dass dieses Protokoll nicht unterstützt wird.
Ich nutze deshalb für WebDAV die Lösung von ![]() Grüße Mikhal |
AW: WebDAV Login Beispiel
Hmm etwas teuer die Eldos Komponente...
|
AW: WebDAV Login Beispiel
Zitat:
|
AW: WebDAV Login Beispiel
Delphi-Quellcode:
Ich kenne die komponente nicht, aber du hast zweimal webdav.Username gesetzt. Ist das OK?
webdav.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
webdav.Request.BasicAuthentication:= true; webdav.Request.Username := 'yourname'; webdav.Request.Username := 'Katzeklo'; webdav.AllowCookies := True; |
AW: WebDAV Login Beispiel
Hi,
kann es sein, dass es hier einen C&P-Fehler gibt:
Delphi-Quellcode:
Viele Grüße,
webdav.Request.Username := 'yourname';
webdav.Request.Username := 'Katzeklo'; Frederic |
AW: WebDAV Login Beispiel
Huch! Ja das war ein klassischer copy/paste Fehler. Ich habe ihn behoben, das Ergebnis ist unverändert: es erfolgt kein Login. Im String "s" ist lediglich der HTML Output der Anmeldeseite.
|
AW: WebDAV Login Beispiel
Webdav mit 10.4 sydney und mit dem GetIT Tools von /n Software IPWorks.
Hallo ich habe mir in Delphi 10.4 die IPWorks 2020 GetiT Toolbox heruntergeladen. Auch ist da ein Webdav Beispiel drin. Doch ich habe https und bekomme immer 151: 403 Forbitten. Was kann ich da machen? MIt CarotDAV hab ich auf meinenm WEbDAV Server kein Problem. Danke für jeden Rat. mfg ws |
AW: WebDAV Login Beispiel
Also ich habe WebDAV mit Indy ohne Probleme am laufen. WebDAV ist ja nur ein Aufsatz auf das Indy Http.
Bei mir klappts wie folgt: Instanz erzeugen + SSL + Authentification + den Request konfigurieren:
Delphi-Quellcode:
Anschließend ein Listing aus dem Root-Verzeichnis abfordern:
WebDAVClient := TIdWebDAV.Create;
WebDAVClient.Intercept := LogEvent; WebDAVClient.IOHandler := OpenSSL; WebDAVClient.Request.BasicAuthentication := True; WebDAVClient.AllowCookies := True; WebDAVClient.HandleRedirects := True; WebDAVClient.Request.AcceptCharSet := 'utf-8'; WebDAVClient.Request.CacheControl := 'no-cache'; WebDAVClient.Request.Connection := 'Keep-Alive'; WebDAVClient.Request.ContentEncoding := 'utf-8';
Delphi-Quellcode:
WebDAVXml ist ein TXmlDocument für die Serverantwort vom WebDAV. Wir verwenden das Apache WebDAV-Modul, aber das sollte keine Rolle spielen.
Response := TMemoryStream.Create;
try try WebDAVClient.DAVPropFind(URL, nil, Response, '1', 1, 1); except on E: EIdHTTPProtocolException do raise ELoginCredentialError.Create(E.Message); end; WebDAVXml.LoadFromStream(Response); {$IFDEF DEBUG} WebDAVXml.SaveToFile('WebDAVResponse.xml'); {$ENDIF} finally Response.Free; end; |
AW: WebDAV Login Beispiel
Danke, doch wie ist das mit USERNAME und PAssword. Muss diese auch in die request eingebaut werden? wie?
Ich hab das so gemacht wie oben erwähnt, doch bekomme ich bei dem POST: 501 Not implemented yet. Liegt das am SERVER? Danke. |
AW: WebDAV Login Beispiel
Hallo,
welche TLS-Version will der Server denn? |
AW: WebDAV Login Beispiel
Zitat:
Delphi-Quellcode:
aufzurufen?
webdav.post('https://www.meinzielserver.de/login', Request, Response);
s := webdav.Get('https://www.meinzielserver.de/katzen/katzen.xml'); Das wäre falsch. Ich mach nochmal ein komplettes Codebeispiel:
Delphi-Quellcode:
Also du musst dich nicht explizit an einer Login-Adresse autehtifzieren, sondern jedes mal im Request deine Login-Daten mitgeben. Deswegen ist es bei WebDAV unbedingt zu empfehlen die Daten über eine TLS/SSL Verschlüsselung zu transportieren, sonst hast du em Ende ein FTP, wobei die Daten im Klartext übers Web geschoben werden :).
// WebDAV Komponente erzeugen
WebDAVClient := TIdWebDAV.Create; WebDAVClient.Intercept := LogEvent; // SSL handler zuweisen WebDAVClient.IOHandler := OpenSSL; WebDAVClient.Request.BasicAuthentication := True; WebDAVClient.AllowCookies := True; WebDAVClient.HandleRedirects := True; // Request konfigurieren WebDAVClient.Request.AcceptCharSet := 'utf-8'; WebDAVClient.Request.CacheControl := 'no-cache'; WebDAVClient.Request.Connection := 'Keep-Alive'; WebDAVClient.Request.ContentEncoding := 'utf-8'; // Login-Daten bei jedem Request mitgeben WebDAVClient.Request.Username := 'user'; WebDAVClient.Request.Password := 'SUPERGEHEIM'; // Nun mit dem Server kommunizieren, dabei die WebDAV-URI setzen // Diese muss immer aktuell zusammengesetzt werden, ich habe dafür ein Unterroutine, welche das in Abhängigkeit des aktuellen Verzeichnisses macht (BuildURI) - darin steckt Protokoll + Server + Resource // Download WebDAVClient.Get(BuildURL('katzen/katzen.xml'), Dest); // Protokoll + Server + Verzeichnis + Quelldatei, Dest ist ein Stream // Upload WebDAVClient.Put(BuildURL('katzen/katzen.xml'), Source); // Protokoll + Server + Verzeichnis + Zieldatei, Source ist ein Stream // Verzeichnis erstellen WebDAVClient.DAVMakeCollection(BuildURL('ein Verzeichnis')); Hoffe das hilft dir weiter :) |
AW: WebDAV Login Beispiel
Danke herzlichst für den Code. Habe es jetzt hinbekommen. Doch das Dir-Listing(aus dem Code oben) ist ein XML File, wie kann man das am Besten in eine ListView mit den Files in dem Dir anzeigen? Gibt`s da eine Parsing routine?
DANKE |
AW: WebDAV Login Beispiel
|
AW: WebDAV Login Beispiel
Das parsen musst du von Hand übernehmen, kannst dir aber den Xml Databinding-Assi zu Hilfe nehmen:
Du kannst das XML Schema von ![]() Du liest die Response einfach ein und gehst die einzelnen Elemente durch. Grober Ablauf:
Delphi-Quellcode:
Hoffe das hilft dir weiter :)
var
Status: IXMLMultistatus; // generiert durch den Xml Databinding Assi in Delphi WebDAVXml: TXmlDocument; // Das Xml enthält die Serverantwort mit dem Listing im Rohformat Response: TMemoryStream; // Alles im Arbeitsspeicher abarbeiten begin // Per PropFind das aktuelle Listing abrufen und in einen Stream (hier Response) laden WebDAVClient.DAVPropFind(URL, nil, Response, '1', 1, 1); // Die '1' lädt das aktuelle Verzeichnis, die Tiefe kann hier bestimmt werden // Den Stream in ein TXmlDocument (hier WebDAVXml) laden WebDAVXml.LoadFromStream(Response); // Wenn du das Databinding nutzt kannst du dich mit Getmultistatus(...) durch die Liste arbeiten // .. anonsten jeden Tag per Hand auswerten... Status := Getmultistatus(WebDAVXml) // anschließend durch die Responses iterieren... for iResp := 0 to Status.Response.Count - 1 do begin ResponseItem := Status.Response[iResp]; // Listing aufbauen und weiterverarbeiten (z.B. eine StringList oder besser eine TList<> mit eigenem Typ mit mehreren Informationen (Dateigröße, Datum, usw.)) ... end; |
AW: WebDAV Login Beispiel
Zitat:
|
AW: WebDAV Login Beispiel
Zitat:
|
AW: WebDAV Login Beispiel
Noch eine Frage: Also ich kann mit dem Indy WebDav auch das XML Repsone bekommen wenn ich ein DirListing abrufe.
Doch ich habe es auch mit IPWorks WebDAV componente von /nsoftware probiert, doch bekomme ich da immer ein 403 ERROR wenn ich das Listing abrufen will. Upload und Download funktioniert mit beiden. Nach dem ich auch die Optionen in Apache2 unter Ubuntu 18.4 gesetzt habe, damit er Listings im Browser anzeigt, siehe ![]() Wieso? Wer weiss Rat? DANKE |
AW: WebDAV Login Beispiel
Liebe Leute,
besten DANK für Eure Tips, konnt so mit Indy ein WEBDAV Client realisieren. Doch eine Frage. Beim Anlegen eines Verzeichnisses, das BLANK im Namen hat, wie geht man da vor. Er bekommt da einen Error. Soll man den Namen ummer Utf8encode-n? oder alle Blanks dir %20 ersezten? DANKE für Euren Rat. mfg ws |
AW: WebDAV Login Beispiel
Delphi-Quellcode:
bzw.
TURLEncoding.URLDecode(...)
Delphi-Quellcode:
aus
TURLEncoding.EncodePath(...)
Delphi-Quellcode:
ist dein Helfer ;)
uses
System.NetEncoding |
AW: WebDAV Login Beispiel
Recht herzlichsten DANK!:-D
|
AW: WebDAV Login Beispiel
Danke erstmal für die Tipps. ich habe es so grundsätzlich zum Laufen bekommen. Jetzt hab ich aber folgenden Effekt mit 2 Accounts. Starte ich mein Programm und lasse Account 1 eine Datei hochladen, geht das. Dito mit Account 2 nach Neustart des Programms.
Mache ich aber beides nacheinander ohne Neustart schlägt der 2. Zugriff fehl mit folgender Meldung: <?xml version="1.0" encoding="utf-8"?><d:error xmlns:d="DAV:"xmlns:s="http://sabredav.org/ns"><s:exception>Sabre\DAV\Exception\NotAuthentica ted</s:exception><s:message>Username or password was incorrect</s:message></d:error>' Mache ich direkt danach einen erneuten, identischen Versuch, so klappt der.
Delphi-Quellcode:
Carsten
FwebDAVServer.Request.URL:='...';
FwebDAVServer.Request.Username:=Username1; FwebDAVServer.Request.Password:=Password1; FwebDAVServer.Request.CustomHeaders.Clear; Result:=FwebDAVServer.Put('..Ziel1..'+ Dateiname, stream); FwebDAVServer.Request.Username:=Username2; FwebDAVServer.Request.Password:=Password2; FwebDAVServer.Request.CustomHeaders.Clear; FwebDAVServer.Request.CustomHeaders.Add('X-Requested-With: XMLHttpRequest'); Result:=FwebDAVServer.Put('..Ziel2..'+ Dateiname, stream); // <- Fehler Result:=FwebDAVServer.Put('..Ziel2..'+ Dateiname, stream); // <- klappt |
AW: WebDAV Login Beispiel
Hallo Herr Carsten,
danke für Ihr interessantes Remark. Ich denke es könnte an der https connection liegen. Sie hatten ja ursprünglich http. Probieren Sie mal https. Das wäre verschlüsselt mit Certificate und d.h. für Mäuse aller Art&Gattung nicht einsehbar. Ansonsten ist es ein interessantes Artefakt. Bitte halten Sie mich am laufenden. Besten DANK WS |
AW: WebDAV Login Beispiel
Ich nutze https
Carsten |
AW: WebDAV Login Beispiel
Zitat:
Frage... Zwei Accounts, wären in meinem Kopf auch zwei Klasseninstanzen des WebDAVs. Warum benutzt du zwei mal die gleiche Instanz? Damit riskierst du nur unnötige Seiteneffekte. |
AW: WebDAV Login Beispiel
Das mit den 2 Instanzen war mir auch schon eingefallen. Interessieren würde mich trotzdem, woran das liegt.
Carsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz