1
0
Эх сурвалжийг харах

Bug 1479: Handle dav:// URL

https://winscp.net/tracker/1479

Source commit: c2dd8d68e98b48354a9a60c33b35a1ab7e35efb1
Martin Prikryl 9 жил өмнө
parent
commit
b4df71734a

+ 2 - 2
dotnet/Session.cs

@@ -1390,11 +1390,11 @@ namespace WinSCP
                     case Protocol.Webdav:
                         if (!sessionOptions.WebdavSecure)
                         {
-                            head = "http://";
+                            head = "dav://";
                         }
                         else
                         {
-                            head = "https://";
+                            head = "davs://";
                         }
                         break;
 

+ 4 - 2
dotnet/SessionOptions.cs

@@ -246,11 +246,13 @@ namespace WinSCP
                 Protocol = Protocol.Ftp;
                 FtpSecure = FtpSecure.Explicit;
             }
-            else if (protocol.Equals("http", StringComparison.OrdinalIgnoreCase))
+            else if (protocol.Equals("dav", StringComparison.OrdinalIgnoreCase) ||
+                     protocol.Equals("http", StringComparison.OrdinalIgnoreCase))
             {
                 Protocol = Protocol.Webdav;
             }
-            else if (protocol.Equals("https", StringComparison.OrdinalIgnoreCase))
+            else if (protocol.Equals("davs", StringComparison.OrdinalIgnoreCase) ||
+                     protocol.Equals("https", StringComparison.OrdinalIgnoreCase))
             {
                 Protocol = Protocol.Webdav;
                 WebdavSecure = true;

+ 1 - 1
source/core/NeonIntf.cpp

@@ -32,7 +32,7 @@ void NeonParseUrl(const UnicodeString & Url, ne_uri & uri)
 //---------------------------------------------------------------------------
 bool IsTlsUri(const ne_uri & uri)
 {
-  return SameText(StrFromNeon(uri.scheme), WebDAVSProtocol);
+  return SameText(StrFromNeon(uri.scheme), HttpsProtocol);
 }
 //---------------------------------------------------------------------------
 struct TProxyAuthData

+ 6 - 2
source/core/SessionData.cpp

@@ -51,6 +51,8 @@ const UnicodeString ScpProtocol(L"scp");
 const UnicodeString FtpProtocol(L"ftp");
 const UnicodeString FtpsProtocol(L"ftps");
 const UnicodeString FtpesProtocol(L"ftpes");
+const UnicodeString WebDAVProtocol(L"dav");
+const UnicodeString WebDAVSProtocol(L"davs");
 const UnicodeString SshProtocol(L"ssh");
 const UnicodeString WinSCPProtocolPrefix(L"winscp-");
 const wchar_t UrlParamSeparator = L';';
@@ -1623,7 +1625,8 @@ bool __fastcall TSessionData::ParseUrl(UnicodeString Url, TOptions * Options,
     MoveStr(Url, MaskedUrl, ProtocolLen);
     ProtocolDefined = true;
   }
-  else if (IsProtocolUrl(Url, WebDAVProtocol, ProtocolLen))
+  else if (IsProtocolUrl(Url, WebDAVProtocol, ProtocolLen) ||
+           IsProtocolUrl(Url, HttpProtocol, ProtocolLen))
   {
     AFSProtocol = fsWebDAV;
     AFtps = ftpsNone;
@@ -1631,7 +1634,8 @@ bool __fastcall TSessionData::ParseUrl(UnicodeString Url, TOptions * Options,
     MoveStr(Url, MaskedUrl, ProtocolLen);
     ProtocolDefined = true;
   }
-  else if (IsProtocolUrl(Url, WebDAVSProtocol, ProtocolLen))
+  else if (IsProtocolUrl(Url, WebDAVSProtocol, ProtocolLen) ||
+           IsProtocolUrl(Url, HttpsProtocol, ProtocolLen))
   {
     AFSProtocol = fsWebDAV;
     AFtps = ftpsImplicit;

+ 2 - 2
source/core/SessionData.h

@@ -72,8 +72,8 @@ extern const UnicodeString ScpProtocol;
 extern const UnicodeString FtpProtocol;
 extern const UnicodeString FtpsProtocol;
 extern const UnicodeString FtpesProtocol;
-#define WebDAVProtocol HttpProtocol
-#define WebDAVSProtocol HttpsProtocol
+extern const UnicodeString WebDAVProtocol;
+extern const UnicodeString WebDAVSProtocol;
 extern const UnicodeString SshProtocol;
 extern const UnicodeString WinSCPProtocolPrefix;
 extern const wchar_t UrlParamSeparator;

+ 1 - 1
source/core/WebDAVFileSystem.cpp

@@ -293,7 +293,7 @@ void __fastcall TWebDAVFileSystem::Open()
 
   UnicodeString HostName = Data->HostNameExpanded;
   size_t Port = Data->PortNumber;
-  UnicodeString ProtocolName = (FTerminal->SessionData->Ftps == ftpsNone) ? WebDAVProtocol : WebDAVSProtocol;
+  UnicodeString ProtocolName = (FTerminal->SessionData->Ftps == ftpsNone) ? HttpProtocol : HttpsProtocol;
   UnicodeString Path = Data->RemoteDirectory;
   // PathToNeon is not used as we cannot call AbsolutePath here
   UnicodeString EscapedPath = StrFromNeon(PathEscape(StrToNeon(Path)).c_str());

+ 1 - 1
source/resource/TextsCore2.rc

@@ -61,7 +61,7 @@ BEGIN
     "  bye\n"
   SCRIPT_OPEN_HELP9,
     "open <site>\n"
-    "open sftp|scp|ftp[es]|http[s] :// [ <user> [ :password ] @ ] <host> [ :<port> ]\n"
+    "open sftp|scp|ftp[es]|dav[s] :// [ <user> [ :password ] @ ] <host> [ :<port> ]\n"
     "  Establishes connection to given host. Use either name of the site or\n"
     "  specify host, username, port and protocol directly.\n"
     "switches:\n"

+ 1 - 1
source/windows/ConsoleRunner.cpp

@@ -2104,7 +2104,7 @@ void __fastcall Usage(TConsole * Console)
   if (!Console->CommandLineOnly())
   {
     PrintUsageSyntax(Console, L"site|workspace|folder");
-    PrintUsageSyntax(Console, L"(sftp|scp|ftp[es]|http[s])://[user[:password]@]host[:port][/path/[file]]");
+    PrintUsageSyntax(Console, L"(sftp|scp|ftp[es]|dav[s])://[user[:password]@]host[:port][/path/[file]]");
     PrintUsageSyntax(Console, FORMAT(L"[mysession] /%s=<name>", (LowerCase(SESSIONNAME_SWICH))));
     PrintUsageSyntax(Console, L"[mysession] /newinstance");
     PrintUsageSyntax(Console, L"[mysession] /edit <path>");

+ 13 - 6
source/windows/Setup.cpp

@@ -465,12 +465,16 @@ static void __fastcall RegisterAsNonBrowserUrlHandler(const UnicodeString & Pref
 {
   RegisterAsUrlHandler(Prefix + SftpProtocol.UpperCase());
   RegisterAsUrlHandler(Prefix + ScpProtocol.UpperCase());
+  RegisterAsUrlHandler(Prefix + WebDAVProtocol.UpperCase());
+  RegisterAsUrlHandler(Prefix + WebDAVSProtocol.UpperCase());
 }
 //---------------------------------------------------------------------------
 static void __fastcall UnregisterAsUrlHandlers(const UnicodeString & Prefix, bool UnregisterProtocol)
 {
   UnregisterAsUrlHandler(Prefix + SftpProtocol, UnregisterProtocol);
   UnregisterAsUrlHandler(Prefix + ScpProtocol, UnregisterProtocol);
+  UnregisterAsUrlHandler(Prefix + WebDAVProtocol, UnregisterProtocol);
+  UnregisterAsUrlHandler(Prefix + WebDAVSProtocol, UnregisterProtocol);
 }
 //---------------------------------------------------------------------------
 static const UnicodeString GenericUrlHandler(L"WinSCP.Url");
@@ -574,7 +578,9 @@ static void __fastcall RegisterProtocolsForDefaultPrograms(HKEY RootKey)
   RegisterProtocolForDefaultPrograms(RootKey, SftpProtocol);
   RegisterProtocolForDefaultPrograms(RootKey, ScpProtocol);
   RegisterProtocolForDefaultPrograms(RootKey, SshProtocol);
-  // deliberately not including WebDAV/http,
+  RegisterProtocolForDefaultPrograms(RootKey, WebDAVProtocol);
+  RegisterProtocolForDefaultPrograms(RootKey, WebDAVSProtocol);
+  // deliberately not including http,
   // it's unlikely that anyone would like to change http handler
   // to non-browser application
 }
@@ -586,7 +592,8 @@ static void __fastcall UnregisterProtocolsForDefaultPrograms(HKEY RootKey, bool
   UnregisterProtocolForDefaultPrograms(RootKey, FtpesProtocol, ForceHandlerUnregistration);
   UnregisterProtocolForDefaultPrograms(RootKey, SftpProtocol, ForceHandlerUnregistration);
   UnregisterProtocolForDefaultPrograms(RootKey, ScpProtocol, ForceHandlerUnregistration);
-  UnregisterProtocolForDefaultPrograms(RootKey, SshProtocol, ForceHandlerUnregistration);
+  UnregisterProtocolForDefaultPrograms(RootKey, WebDAVProtocol, ForceHandlerUnregistration);
+  UnregisterProtocolForDefaultPrograms(RootKey, WebDAVSProtocol, ForceHandlerUnregistration);
 
   // we should not really need the "force" flag here, but why not
   UnregisterAsUrlHandler(RootKey, GenericUrlHandler, true, true);
@@ -635,8 +642,8 @@ void __fastcall RegisterForDefaultProtocols()
   RegisterAsUrlHandler(WinSCPProtocolPrefix + FtpProtocol.UpperCase());
   RegisterAsUrlHandler(WinSCPProtocolPrefix + FtpsProtocol.UpperCase());
   RegisterAsUrlHandler(WinSCPProtocolPrefix + FtpesProtocol.UpperCase());
-  RegisterAsUrlHandler(WinSCPProtocolPrefix + WebDAVProtocol.UpperCase());
-  RegisterAsUrlHandler(WinSCPProtocolPrefix + WebDAVSProtocol.UpperCase());
+  RegisterAsUrlHandler(WinSCPProtocolPrefix + HttpProtocol.UpperCase());
+  RegisterAsUrlHandler(WinSCPProtocolPrefix + HttpsProtocol.UpperCase());
   RegisterAsUrlHandler(WinSCPProtocolPrefix + SshProtocol.UpperCase());
 
   NotifyChangedAssociations();
@@ -649,8 +656,8 @@ void __fastcall UnregisterForProtocols()
   UnregisterAsUrlHandler(WinSCPProtocolPrefix + FtpProtocol.UpperCase(), true);
   UnregisterAsUrlHandler(WinSCPProtocolPrefix + FtpsProtocol.UpperCase(), true);
   UnregisterAsUrlHandler(WinSCPProtocolPrefix + FtpesProtocol.UpperCase(), true);
-  UnregisterAsUrlHandler(WinSCPProtocolPrefix + WebDAVProtocol.UpperCase(), true);
-  UnregisterAsUrlHandler(WinSCPProtocolPrefix + WebDAVSProtocol.UpperCase(), true);
+  UnregisterAsUrlHandler(WinSCPProtocolPrefix + HttpProtocol.UpperCase(), true);
+  UnregisterAsUrlHandler(WinSCPProtocolPrefix + HttpsProtocol.UpperCase(), true);
   UnregisterAsUrlHandler(WinSCPProtocolPrefix + SshProtocol.UpperCase(), true);
 
   UnregisterProtocolsForDefaultPrograms(HKEY_CURRENT_USER, false);