瀏覽代碼

Certificate matching selected private key is automatically selected along

Source commit: b9296784b6144dd55fc89e3844593579f3a301cf
Martin Prikryl 2 年之前
父節點
當前提交
b486dd0f3b
共有 4 個文件被更改,包括 75 次插入24 次删除
  1. 42 12
      source/forms/SiteAdvanced.cpp
  2. 1 0
      source/forms/SiteAdvanced.h
  3. 30 12
      source/windows/Tools.cpp
  4. 2 0
      source/windows/Tools.h

+ 42 - 12
source/forms/SiteAdvanced.cpp

@@ -816,6 +816,20 @@ void __fastcall TSiteAdvancedDialog::UpdateNavigationTree()
   }
   }
 }
 }
 //---------------------------------------------------------------------
 //---------------------------------------------------------------------
+bool TSiteAdvancedDialog::HasCertificate(const UnicodeString & FileName)
+{
+  bool Result = false;
+  try
+  {
+    UnicodeString UnusedComment;
+    GetPublicKeyLine(FileName, UnusedComment, Result);
+  }
+  catch (...)
+  {
+  }
+  return Result;
+}
+//---------------------------------------------------------------------
 void __fastcall TSiteAdvancedDialog::UpdateControls()
 void __fastcall TSiteAdvancedDialog::UpdateControls()
 {
 {
   if (Visible)
   if (Visible)
@@ -863,18 +877,10 @@ void __fastcall TSiteAdvancedDialog::UpdateControls()
     if (PrivateKeyEdit3->Text != FLastPrivateKey)
     if (PrivateKeyEdit3->Text != FLastPrivateKey)
     {
     {
       FLastPrivateKey = PrivateKeyEdit3->Text;
       FLastPrivateKey = PrivateKeyEdit3->Text;
-      FKeyHasCertificate = false;
-      if (PrivateKeyEdit3->Enabled && !FLastPrivateKey.IsEmpty())
-      {
-        try
-        {
-          UnicodeString UnusedComment;
-          GetPublicKeyLine(FLastPrivateKey, UnusedComment, FKeyHasCertificate);
-        }
-        catch (...)
-        {
-        }
-      }
+      FKeyHasCertificate =
+        PrivateKeyEdit3->Enabled &&
+        !FLastPrivateKey.IsEmpty() &&
+        HasCertificate(FLastPrivateKey);
     }
     }
     EnableControl(PrivateKeyViewButton, PrivateKeyEdit3->Enabled && !PrivateKeyEdit3->Text.IsEmpty());
     EnableControl(PrivateKeyViewButton, PrivateKeyEdit3->Enabled && !PrivateKeyEdit3->Text.IsEmpty());
     EnableControl(DetachedCertificateEdit, PrivateKeyViewButton->Enabled && !FKeyHasCertificate);
     EnableControl(DetachedCertificateEdit, PrivateKeyViewButton->Enabled && !FKeyHasCertificate);
@@ -1339,6 +1345,30 @@ void __fastcall TSiteAdvancedDialog::PrivateKeyEdit3AfterDialog(TObject * Sender
   if (Name != Edit->Text)
   if (Name != Edit->Text)
   {
   {
     VerifyAndConvertKey(Name, true);
     VerifyAndConvertKey(Name, true);
+
+    if (!Name.IsEmpty() && !HasCertificate(Name))
+    {
+      try
+      {
+        UnicodeString FileName = ExpandEnvironmentVariables(Name);
+        TKeyType Type = KeyType(FileName);
+        // This gonna fail for encrypted keys
+        TPrivateKey * PrivateKey = LoadKey(Type, FileName, EmptyStr);
+        try
+        {
+          UnicodeString CertificateFileName = AddMatchingKeyCertificate(PrivateKey, FileName);
+          DetachedCertificateEdit->Text = CertificateFileName;
+        }
+        __finally
+        {
+          FreeKey(PrivateKey);
+        }
+      }
+      catch (Exception & E)
+      {
+        // swallow
+      }
+    }
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------

+ 1 - 0
source/forms/SiteAdvanced.h

@@ -379,6 +379,7 @@ private:
   UnicodeString __fastcall GetPuttySiteKey();
   UnicodeString __fastcall GetPuttySiteKey();
   void __fastcall ClosePuttySettings();
   void __fastcall ClosePuttySettings();
   void SerializePuttyRegistry(const UnicodeString & Key, TStrings * Values);
   void SerializePuttyRegistry(const UnicodeString & Key, TStrings * Values);
+  bool HasCertificate(const UnicodeString & FileName);
 
 
   INTERFACE_HOOK;
   INTERFACE_HOOK;
 };
 };

+ 30 - 12
source/windows/Tools.cpp

@@ -1255,6 +1255,32 @@ UnicodeString GetConvertedKeyFileName(const UnicodeString & FileName)
   return ChangeFileExt(FileName, FORMAT(L".%s", (PuttyKeyExt)));
   return ChangeFileExt(FileName, FORMAT(L".%s", (PuttyKeyExt)));
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
+UnicodeString AddMatchingKeyCertificate(TPrivateKey * PrivateKey, const UnicodeString & FileName)
+{
+  UnicodeString CertificateFileName = FileName;
+  UnicodeString S = FORMAT(L".%s", (PuttyKeyExt));
+  if (EndsText(S, CertificateFileName))
+  {
+    CertificateFileName.SetLength(CertificateFileName.Length() - S.Length());
+  }
+  CertificateFileName += L"-cert.pub";
+
+  UnicodeString Result;
+  if (FileExists(CertificateFileName))
+  {
+    try
+    {
+      AddCertificateToKey(PrivateKey, CertificateFileName);
+      Result = CertificateFileName;
+    }
+    catch (Exception & E)
+    {
+      AppLogFmt(L"Cannot add certificate from auto-detected \"%s\": %s", (CertificateFileName, E.Message));
+    }
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
 static void __fastcall ConvertKey(UnicodeString & FileName, TKeyType Type)
 static void __fastcall ConvertKey(UnicodeString & FileName, TKeyType Type)
 {
 {
   UnicodeString Passphrase;
   UnicodeString Passphrase;
@@ -1278,19 +1304,11 @@ static void __fastcall ConvertKey(UnicodeString & FileName, TKeyType Type)
     AppLogFmt(L"Loaded key from \"%s\".", (FileName));
     AppLogFmt(L"Loaded key from \"%s\".", (FileName));
 
 
     UnicodeString CertificateMessage;
     UnicodeString CertificateMessage;
-    UnicodeString CertificateFileName = FileName + L"-cert.pub";
-    if (FileExists(CertificateFileName))
+    UnicodeString CertificateFileName = AddMatchingKeyCertificate(PrivateKey, FileName);
+    if (!CertificateFileName.IsEmpty())
     {
     {
-      try
-      {
-        AddCertificateToKey(PrivateKey, CertificateFileName);
-        AppLogFmt(L"Added certificate from auto-detected \"%s\".", (CertificateFileName));
-        CertificateMessage = L"\n" + FMTLOAD(CERTIFICATE_ADDED, (CertificateFileName));
-      }
-      catch (Exception & E)
-      {
-        AppLogFmt(L"Cannot add certificate from auto-detected \"%s\": %s", (CertificateFileName, E.Message));
-      }
+      AppLogFmt(L"Added certificate from auto-detected \"%s\".", (CertificateFileName));
+      CertificateMessage = L"\n" + FMTLOAD(CERTIFICATE_ADDED, (CertificateFileName));
     }
     }
 
 
     FileName = GetConvertedKeyFileName(FileName);
     FileName = GetConvertedKeyFileName(FileName);

+ 2 - 0
source/windows/Tools.h

@@ -72,6 +72,8 @@ void __fastcall ShutDownWindows();
 void __fastcall SuspendWindows();
 void __fastcall SuspendWindows();
 void __fastcall EditSelectBaseName(HWND Edit);
 void __fastcall EditSelectBaseName(HWND Edit);
 UnicodeString GetConvertedKeyFileName(const UnicodeString & FileName);
 UnicodeString GetConvertedKeyFileName(const UnicodeString & FileName);
+struct TPrivateKey;
+UnicodeString AddMatchingKeyCertificate(TPrivateKey * PrivateKey, const UnicodeString & FileName);
 void __fastcall VerifyAndConvertKey(UnicodeString & FileName, bool CanIgnore);
 void __fastcall VerifyAndConvertKey(UnicodeString & FileName, bool CanIgnore);
 void __fastcall VerifyKey(const UnicodeString & FileName);
 void __fastcall VerifyKey(const UnicodeString & FileName);
 void __fastcall VerifyCertificate(const UnicodeString & FileName);
 void __fastcall VerifyCertificate(const UnicodeString & FileName);