Browse Source

Issue 2263 – Cannot use IPv6 literal as hostname on Login dialog

https://winscp.net/tracker/2263

Source commit: 9819c25cf345cb182c6307b2139cc6add72bce96
Martin Prikryl 1 year ago
parent
commit
7ce1361928
3 changed files with 18 additions and 3 deletions
  1. 2 2
      source/core/SessionData.cpp
  2. 2 0
      source/core/SessionData.h
  3. 14 1
      source/forms/Login.cpp

+ 2 - 2
source/core/SessionData.cpp

@@ -3539,7 +3539,7 @@ UnicodeString __fastcall TSessionData::GetProtocolUrl(bool HttpForWebDAV)
   return Url;
 }
 //---------------------------------------------------------------------
-static bool HasIP6LiteralBrackets(const UnicodeString & HostName)
+bool HasIP6LiteralBrackets(const UnicodeString & HostName)
 {
   return
     (HostName.Length() >= 2) &&
@@ -3547,7 +3547,7 @@ static bool HasIP6LiteralBrackets(const UnicodeString & HostName)
     (HostName[HostName.Length()] == L']');
 }
 //---------------------------------------------------------------------
-static UnicodeString StripIP6LiteralBrackets(const UnicodeString & HostName)
+UnicodeString StripIP6LiteralBrackets(const UnicodeString & HostName)
 {
   UnicodeString Result = HostName;
   if (DebugAlwaysTrue(HasIP6LiteralBrackets(Result)))

+ 2 - 0
source/core/SessionData.h

@@ -817,6 +817,8 @@ private:
 UnicodeString GetExpandedLogFileName(UnicodeString LogFileName, TDateTime Started, TSessionData * SessionData);
 bool __fastcall IsSshProtocol(TFSProtocol FSProtocol);
 int __fastcall DefaultPort(TFSProtocol FSProtocol, TFtps Ftps);
+bool HasIP6LiteralBrackets(const UnicodeString & HostName);
+UnicodeString StripIP6LiteralBrackets(const UnicodeString & HostName);
 bool __fastcall IsIPv6Literal(const UnicodeString & HostName);
 UnicodeString __fastcall EscapeIPv6Literal(const UnicodeString & IP);
 TFSProtocol NormalizeFSProtocol(TFSProtocol FSProtocol);

+ 14 - 1
source/forms/Login.cpp

@@ -3204,7 +3204,20 @@ void __fastcall TLoginDialog::ParseUrl(const UnicodeString & Url)
 
   SaveSession(SessionData.get());
 
-  DoParseUrl(SessionData.get(), Url);
+  // Otherwise the colons would be misrepresented as URL syntax
+  if (IsIPv6Literal(Url))
+  {
+    UnicodeString IPv6Literal = Url;
+    if (HasIP6LiteralBrackets(IPv6Literal))
+    {
+      IPv6Literal = StripIP6LiteralBrackets(IPv6Literal);
+    }
+    SessionData->HostName = IPv6Literal;
+  }
+  else
+  {
+    DoParseUrl(SessionData.get(), Url);
+  }
 
   LoadSession(SessionData.get());
 }