Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi WebDAV Login Beispiel (https://www.delphipraxis.net/182691-webdav-login-beispiel.html)

Ajintaro 11. Nov 2014 08:58

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:
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;
Aber das Login wird nie ausgeführt, ich lande immer auf der Loginpage. Wie kann ich denn das Login erzwingen ?

mikhal 11. Nov 2014 11:16

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 Eldos.

Grüße
Mikhal

Ajintaro 11. Nov 2014 12:10

AW: WebDAV Login Beispiel
 
Hmm etwas teuer die Eldos Komponente...

mjustin 11. Nov 2014 12:11

AW: WebDAV Login Beispiel
 
Zitat:

Zitat von mikhal (Beitrag 1279363)
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.

Indy unterstützt HTTPS über OpenSSL. Das Problem hier ist die richtige Anmeldung am Server, die schon vor dem Verwenden der WebDAV Protokollerweiterungen fehlschlägt. (Die Art der Anmeldung ist nicht WebDAV-spezifisch).

exilant 11. Nov 2014 12:27

AW: WebDAV Login Beispiel
 
Delphi-Quellcode:
          webdav.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
          webdav.Request.BasicAuthentication:= true;
          webdav.Request.Username := 'yourname';
          webdav.Request.Username := 'Katzeklo';
          webdav.AllowCookies := True;
Ich kenne die komponente nicht, aber du hast zweimal webdav.Username gesetzt. Ist das OK?

fkerber 11. Nov 2014 12:28

AW: WebDAV Login Beispiel
 
Hi,

kann es sein, dass es hier einen C&P-Fehler gibt:

Delphi-Quellcode:
          webdav.Request.Username := 'yourname';
          webdav.Request.Username := 'Katzeklo';
Viele Grüße,
Frederic

Ajintaro 11. Nov 2014 12:38

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.

wschrabi 15. Aug 2020 14:53

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

WiPhi 15. Aug 2020 20:16

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:
  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';
Anschließend ein Listing aus dem Root-Verzeichnis abfordern:
Delphi-Quellcode:
  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;
WebDAVXml ist ein TXmlDocument für die Serverantwort vom WebDAV. Wir verwenden das Apache WebDAV-Modul, aber das sollte keine Rolle spielen.

wschrabi 15. Aug 2020 22:33

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.

hoika 16. Aug 2020 05:36

AW: WebDAV Login Beispiel
 
Hallo,
welche TLS-Version will der Server denn?

WiPhi 16. Aug 2020 16:24

AW: WebDAV Login Beispiel
 
Zitat:

Zitat von wschrabi (Beitrag 1471884)
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.

Versuchst du dir URI "login"

Delphi-Quellcode:
webdav.post('https://www.meinzielserver.de/login', Request, Response);
s := webdav.Get('https://www.meinzielserver.de/katzen/katzen.xml');
aufzurufen?

Das wäre falsch.

Ich mach nochmal ein komplettes Codebeispiel:
Delphi-Quellcode:
  // 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'));
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 :).
Hoffe das hilft dir weiter :)

wschrabi 16. Aug 2020 17:23

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

mmw 16. Aug 2020 18:45

AW: WebDAV Login Beispiel
 
hallo,

eventuell hilft das

http://www.destructor.de/xmlparser/index.htm

Gruß

WiPhi 16. Aug 2020 19:12

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 https://github.com/lookfirst/sardine...ter/webdav.xsd über den Databinding Assistenten von Delphi einbinden.

Du liest die Response einfach ein und gehst die einzelnen Elemente durch.

Grober Ablauf:
Delphi-Quellcode:
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;
Hoffe das hilft dir weiter :)

wschrabi 17. Aug 2020 06:21

AW: WebDAV Login Beispiel
 
Zitat:

Zitat von mmw (Beitrag 1471912)
hallo,

eventuell hilft das

http://www.destructor.de/xmlparser/index.htm

Gruß

Danke SUPER!

wschrabi 17. Aug 2020 06:22

AW: WebDAV Login Beispiel
 
Zitat:

Zitat von WiPhi (Beitrag 1471913)
Das parsen musst du von Hand übernehmen, kannst dir aber den Xml Databinding-Assi zu Hilfe nehmen:

Hoffe das hilft dir weiter :)

Super, besten Dank, wieder viel gelernt.

wschrabi 17. Aug 2020 14:02

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 https://stackoverflow.com/questions/...che-web-server bekomme ich aber weiterhin bei meinem IPW WebDAV Prg den Error 403 Forbidden bei meinem Ubunutu 18.4 WebDav Server (Port 4433 und gültiges Certificate)

Wieso? Wer weiss Rat?
DANKE

wschrabi 18. Aug 2020 14:27

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

WiPhi 18. Aug 2020 17:33

AW: WebDAV Login Beispiel
 
Delphi-Quellcode:
TURLEncoding.URLDecode(...)
bzw.

Delphi-Quellcode:
TURLEncoding.EncodePath(...)
aus

Delphi-Quellcode:
uses
  System.NetEncoding
ist dein Helfer ;)

wschrabi 19. Aug 2020 09:09

AW: WebDAV Login Beispiel
 
Recht herzlichsten DANK!:-D

Carsten Hölscher 27. Mär 2021 21:09

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:
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
Carsten

wschrabi 29. Mär 2021 06:49

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

Carsten Hölscher 29. Mär 2021 09:30

AW: WebDAV Login Beispiel
 
Ich nutze https

Carsten

WiPhi 29. Mär 2021 11:18

AW: WebDAV Login Beispiel
 
Zitat:

Zitat von Carsten Hölscher (Beitrag 1486197)
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.

Vermutlich ist der Session Cookie das Problem.

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.

Carsten Hölscher 29. Mär 2021 16:37

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 01:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz