浏览代码

Bug 1789: Fallback to default ANSI encoding, when known_hosts file is not in UTF-8

https://winscp.net/tracker/1789

Source commit: 42f91aa1d99d5a8909ea15a22e0a2dbdf6e8f267
Martin Prikryl 6 年之前
父节点
当前提交
8051ea3a2b
共有 3 个文件被更改,包括 14 次插入4 次删除
  1. 12 2
      source/core/Common.cpp
  2. 1 1
      source/core/Common.h
  3. 1 1
      source/core/Configuration.cpp

+ 12 - 2
source/core/Common.cpp

@@ -3967,7 +3967,7 @@ UnicodeString __fastcall AssemblyAddRawSettings(
   return Result;
 }
 //---------------------------------------------------------------------------
-void __fastcall LoadScriptFromFile(UnicodeString FileName, TStrings * Lines)
+void __fastcall LoadScriptFromFile(UnicodeString FileName, TStrings * Lines, bool FallbackToAnsi)
 {
   std::auto_ptr<TFileStream> Stream(new TFileStream(ApiPath(FileName), fmOpenRead | fmShareDenyWrite));
   Lines->DefaultEncoding = TEncoding::UTF8;
@@ -3977,7 +3977,17 @@ void __fastcall LoadScriptFromFile(UnicodeString FileName, TStrings * Lines)
   }
   catch (EEncodingError & E)
   {
-    throw ExtException(LoadStr(TEXT_FILE_ENCODING), &E);
+    if (FallbackToAnsi)
+    {
+      Lines->DefaultEncoding = TEncoding::ANSI;
+      Lines->Clear();
+      Stream->Position = 0;
+      Lines->LoadFromStream(Stream.get());
+    }
+    else
+    {
+      throw ExtException(LoadStr(TEXT_FILE_ENCODING), &E);
+    }
   }
 }
 //---------------------------------------------------------------------------

+ 1 - 1
source/core/Common.h

@@ -177,7 +177,7 @@ void __fastcall ParseCertificate(const UnicodeString & Path,
 bool __fastcall IsHttpUrl(const UnicodeString & S);
 bool __fastcall IsHttpOrHttpsUrl(const UnicodeString & S);
 UnicodeString __fastcall ChangeUrlProtocol(const UnicodeString & S, const UnicodeString & Protocol);
-void __fastcall LoadScriptFromFile(UnicodeString FileName, TStrings * Lines);
+void __fastcall LoadScriptFromFile(UnicodeString FileName, TStrings * Lines, bool FallbackToAnsi = false);
 UnicodeString __fastcall StripEllipsis(const UnicodeString & S);
 UnicodeString __fastcall GetFileMimeType(const UnicodeString & FileName);
 bool __fastcall IsRealFile(const UnicodeString & FileName);

+ 1 - 1
source/core/Configuration.cpp

@@ -1392,7 +1392,7 @@ TStoredSessionList * __fastcall TConfiguration::SelectKnownHostsSessionsForImpor
     if (FileExists(ApiPath(KnownHostsFile)))
     {
       std::unique_ptr<TStrings> Lines(new TStringList());
-      LoadScriptFromFile(KnownHostsFile, Lines.get());
+      LoadScriptFromFile(KnownHostsFile, Lines.get(), true);
       ImportSessionList->ImportFromKnownHosts(Lines.get());
     }
     else