浏览代码

Bug 1890: Edited/opened files from a disconnected session can now be attached to new session even if its username was entered only during authentication instead of directly on the Login dialog

https://winscp.net/tracker/1890

Source commit: 5bc305b0970fc064015eeaba3913a850d9d76c48
Martin Prikryl 5 年之前
父节点
当前提交
09451a11f0
共有 3 个文件被更改,包括 16 次插入4 次删除
  1. 2 2
      source/forms/CustomScpExplorer.cpp
  2. 13 2
      source/windows/TerminalManager.cpp
  3. 1 0
      source/windows/TerminalManager.h

+ 2 - 2
source/forms/CustomScpExplorer.cpp

@@ -393,7 +393,7 @@ void __fastcall TCustomScpExplorerForm::RefreshPanel(const UnicodeString & Sessi
   {
     TTerminal * Terminal = Manager->Terminals[Index];
     if (Session.IsEmpty() ||
-        Terminal->SessionData->IsSameSite(Data.get()))
+        Manager->IsActiveTerminalForSite(Terminal, Data.get()))
     {
       if (Path.IsEmpty())
       {
@@ -409,7 +409,7 @@ void __fastcall TCustomScpExplorerForm::RefreshPanel(const UnicodeString & Sessi
   // We should flag a pending refresh for the background terminals or busy foreground terminals
   if (HasActiveTerminal() &&
       CanCommandLineFromAnotherInstance() &&
-      (Session.IsEmpty() || Terminal->SessionData->IsSameSite(Data.get())) &&
+      (Session.IsEmpty() || Manager->IsActiveTerminalForSite(Terminal, Data.get())) &&
       (Path.IsEmpty() || UnixIsChildPath(Path, Terminal->CurrentDirectory)))
   {
     Terminal->ReloadDirectory();

+ 13 - 2
source/windows/TerminalManager.cpp

@@ -1696,14 +1696,25 @@ void __fastcall TTerminalManager::SaveWorkspace(TList * DataList)
   }
 }
 //---------------------------------------------------------------------------
+bool __fastcall TTerminalManager::IsActiveTerminalForSite(TTerminal * Terminal, TSessionData * Data)
+{
+  bool Result = Terminal->Active;
+  if (Result)
+  {
+    std::unique_ptr<TSessionData> TerminalData(Terminal->SessionData->Clone());
+    Terminal->UpdateSessionCredentials(TerminalData.get());
+    Result = TerminalData->IsSameSite(Data);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
 TTerminal * __fastcall TTerminalManager::FindActiveTerminalForSite(TSessionData * Data)
 {
   TTerminal * Result = NULL;
   for (int Index = 0; (Result == NULL) && (Index < Count); Index++)
   {
     TTerminal * Terminal = Terminals[Index];
-    if (Terminal->Active &&
-        Terminal->SessionData->IsSameSite(Data))
+    if (IsActiveTerminalForSite(Terminal, Data))
     {
       Result = Terminal;
     }

+ 1 - 0
source/windows/TerminalManager.h

@@ -70,6 +70,7 @@ public:
   void __fastcall HandleException(Exception * E);
   void __fastcall SaveWorkspace(TList * DataList);
   void __fastcall QueueStatusUpdated();
+  bool __fastcall IsActiveTerminalForSite(TTerminal * Terminal, TSessionData * Data);
   TTerminal * __fastcall FindActiveTerminalForSite(TSessionData * Data);
   TTerminalQueue * __fastcall FindQueueForTerminal(TTerminal * Terminal);
   bool __fastcall UploadPublicKey(TTerminal * Terminal, TSessionData * Data, UnicodeString & FileName);