Procházet zdrojové kódy

Factoring out TTerminal::ConfirmCertificate

Source commit: 1b6e09e2a4c47c1615e67db4032d90682bc251a9
Martin Prikryl před 8 roky
rodič
revize
9c5d7676dd

+ 5 - 56
source/core/FtpFileSystem.cpp

@@ -4455,11 +4455,9 @@ bool __fastcall TFTPFileSystem::HandleAsynchRequestVerifyCertificate(
         TryWindowsSystemCertificateStore = false;
       }
 
-      UnicodeString SiteKey = FTerminal->SessionData->SiteKey;
-
       if (!VerificationResult)
       {
-        if (FTerminal->VerifyCertificate(CertificateStorageKey, SiteKey,
+        if (FTerminal->VerifyCertificate(CertificateStorageKey, FTerminal->SessionData->SiteKey,
               FSessionInfo.CertificateFingerprint, CertificateSubject, Data.VerificationResult))
         {
           // certificate is trusted, but for not purposes of info dialog
@@ -4523,59 +4521,10 @@ bool __fastcall TFTPFileSystem::HandleAsynchRequestVerifyCertificate(
 
       if (RequestResult == 0)
       {
-        TClipboardHandler ClipboardHandler;
-        ClipboardHandler.Text = FSessionInfo.CertificateFingerprint;
-
-        TQueryButtonAlias Aliases[1];
-        Aliases[0].Button = qaRetry;
-        Aliases[0].Alias = LoadStr(COPY_KEY_BUTTON);
-        Aliases[0].OnSubmit = &ClipboardHandler.Copy;
-
-        TQueryParams Params(qpWaitInBatch);
-        Params.HelpKeyword = HELP_VERIFY_CERTIFICATE;
-        Params.NoBatchAnswers = qaYes | qaRetry;
-        Params.Aliases = Aliases;
-        Params.AliasesCount = LENOF(Aliases);
-        unsigned int Answer = FTerminal->QueryUser(
-          FMTLOAD(VERIFY_CERT_PROMPT3, (FSessionInfo.Certificate)),
-          NULL, qaYes | qaNo | qaCancel | qaRetry, &Params, qtWarning);
-
-        switch (Answer)
-        {
-          case qaYes:
-            // 2 = always, as used by FZ's VerifyCertDlg.cpp,
-            // however FZAPI takes all non-zero values equally
-            RequestResult = 2;
-            break;
-
-          case qaNo:
-            RequestResult = 1;
-            break;
-
-          case qaCancel:
-            FTerminal->Configuration->Usage->Inc(L"HostNotVerified");
-            RequestResult = 0;
-            break;
-
-          default:
-            DebugFail();
-            RequestResult = 0;
-            break;
-        }
-
-        if (RequestResult == 2)
-        {
-          FTerminal->CacheCertificate(
-            CertificateStorageKey, SiteKey,
-            FSessionInfo.CertificateFingerprint, Data.VerificationResult);
-        }
-
-        // Cache only if the certificate was accepted manually
-        if (RequestResult != 0)
-        {
-          FTerminal->Configuration->RememberLastFingerprint(
-            FTerminal->SessionData->SiteKey, TlsFingerprintType, FSessionInfo.CertificateFingerprint);
-        }
+        bool Confirmed = FTerminal->ConfirmCertificate(FSessionInfo, Data.VerificationResult, CertificateStorageKey, true);
+        // FZ's VerifyCertDlg.cpp returns 2 for "cached", what we do nto distinguish here,
+        // however FZAPI takes all non-zero values equally.
+        RequestResult = Confirmed ? 1 : 0;
       }
     }
 

+ 54 - 0
source/core/Terminal.cpp

@@ -6781,6 +6781,60 @@ bool  __fastcall TTerminal::VerifyCertificate(
   return Result;
 }
 //---------------------------------------------------------------------------
+bool __fastcall TTerminal::ConfirmCertificate(
+  TSessionInfo & SessionInfo, int Failures, const UnicodeString & CertificateStorageKey, bool CanRemember)
+{
+  TClipboardHandler ClipboardHandler;
+  ClipboardHandler.Text = SessionInfo.CertificateFingerprint;
+
+  TQueryButtonAlias Aliases[1];
+  Aliases[0].Button = qaRetry;
+  Aliases[0].Alias = LoadStr(COPY_KEY_BUTTON);
+  Aliases[0].OnSubmit = &ClipboardHandler.Copy;
+
+  TQueryParams Params(qpWaitInBatch);
+  Params.HelpKeyword = HELP_VERIFY_CERTIFICATE;
+  Params.NoBatchAnswers = qaYes | qaRetry;
+  Params.Aliases = Aliases;
+  Params.AliasesCount = LENOF(Aliases);
+  unsigned int Answer =
+    QueryUser(
+      FMTLOAD(VERIFY_CERT_PROMPT3, (SessionInfo.Certificate)),
+      NULL, qaYes | qaNo | qaCancel | qaRetry, &Params, qtWarning);
+
+  bool Result;
+  switch (Answer)
+  {
+    case qaYes:
+      CacheCertificate(
+        CertificateStorageKey, SessionData->SiteKey, SessionInfo.CertificateFingerprint, Failures);
+      Result = true;
+      break;
+
+    case qaNo:
+      Result = true;
+      break;
+
+    case qaCancel:
+      Configuration->Usage->Inc(L"HostNotVerified");
+      Result = false;
+      break;
+
+    default:
+      DebugFail();
+      Result = false;
+      break;
+  }
+
+  // Cache only if the certificate was accepted manually
+  if (Result && CanRemember)
+  {
+    Configuration->RememberLastFingerprint(
+      SessionData->SiteKey, TlsFingerprintType, SessionInfo.CertificateFingerprint);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
 void __fastcall TTerminal::CacheCertificate(const UnicodeString & CertificateStorageKey,
   const UnicodeString & SiteKey, const UnicodeString & Fingerprint, int Failures)
 {

+ 2 - 0
source/core/Terminal.h

@@ -400,6 +400,8 @@ protected:
     const UnicodeString & CertificateSubject, int Failures);
   void __fastcall CacheCertificate(const UnicodeString & CertificateStorageKey,
     const UnicodeString & SiteKey, const UnicodeString & Fingerprint, int Failures);
+  bool __fastcall ConfirmCertificate(
+    TSessionInfo & SessionInfo, int Failures, const UnicodeString & CertificateStorageKey, bool CanRemember);
   void __fastcall CollectTlsUsage(const UnicodeString & TlsVersionStr);
   bool __fastcall LoadTlsCertificate(X509 *& Certificate, EVP_PKEY *& PrivateKey);
   bool __fastcall TryStartOperationWithFile(

+ 2 - 40
source/core/WebDAVFileSystem.cpp

@@ -2313,46 +2313,8 @@ bool TWebDAVFileSystem::VerifyCertificate(const TWebDAVCertificateData & Data, b
 
     if (!Result)
     {
-      TClipboardHandler ClipboardHandler;
-      ClipboardHandler.Text = Data.Fingerprint;
-
-      TQueryButtonAlias Aliases[1];
-      Aliases[0].Button = qaRetry;
-      Aliases[0].Alias = LoadStr(COPY_KEY_BUTTON);
-      Aliases[0].OnSubmit = &ClipboardHandler.Copy;
-
-      TQueryParams Params;
-      Params.HelpKeyword = HELP_VERIFY_CERTIFICATE;
-      Params.NoBatchAnswers = qaYes | qaRetry;
-      Params.Aliases = Aliases;
-      Params.AliasesCount = LENOF(Aliases);
-      unsigned int Answer = FTerminal->QueryUser(
-        FMTLOAD(VERIFY_CERT_PROMPT3, (FSessionInfo.Certificate)),
-        NULL, qaYes | qaNo | qaCancel | qaRetry, &Params, qtWarning);
-      switch (Answer)
-      {
-        case qaYes:
-          FTerminal->CacheCertificate(CertificateStorageKey, SiteKey, Data.Fingerprint, Failures);
-          Result = true;
-          break;
-
-        case qaNo:
-          Result = true;
-          break;
-
-        default:
-          DebugFail();
-        case qaCancel:
-          FTerminal->Configuration->Usage->Inc(L"HostNotVerified");
-          Result = false;
-          break;
-      }
-
-      if (Result && !Aux)
-      {
-        FTerminal->Configuration->RememberLastFingerprint(
-          FTerminal->SessionData->SiteKey, TlsFingerprintType, FSessionInfo.CertificateFingerprint);
-      }
+      Result =
+        FTerminal->ConfirmCertificate(FSessionInfo, Failures, CertificateStorageKey, !Aux);
     }
 
     if (Result && !Aux)