certificate_trust_mac.mm 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright (c) 2017 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "atom/browser/ui/certificate_trust.h"
  5. #import <Cocoa/Cocoa.h>
  6. #import <SecurityInterface/SFCertificateTrustPanel.h>
  7. #include "atom/browser/native_window.h"
  8. #include "base/strings/sys_string_conversions.h"
  9. #include "net/cert/cert_database.h"
  10. #include "net/cert/x509_util_ios_and_mac.h"
  11. #include "net/cert/x509_util_mac.h"
  12. @interface TrustDelegate : NSObject {
  13. @private
  14. certificate_trust::ShowTrustCallback callback_;
  15. SFCertificateTrustPanel* panel_;
  16. scoped_refptr<net::X509Certificate> cert_;
  17. SecTrustRef trust_;
  18. CFArrayRef cert_chain_;
  19. SecPolicyRef sec_policy_;
  20. }
  21. - (id)initWithCallback:(const certificate_trust::ShowTrustCallback&)callback
  22. panel:(SFCertificateTrustPanel*)panel
  23. cert:(const scoped_refptr<net::X509Certificate>&)cert
  24. trust:(SecTrustRef)trust
  25. certChain:(CFArrayRef)certChain
  26. secPolicy:(SecPolicyRef)secPolicy;
  27. - (void)panelDidEnd:(NSWindow*)sheet
  28. returnCode:(int)returnCode
  29. contextInfo:(void*)contextInfo;
  30. @end
  31. @implementation TrustDelegate
  32. - (void)dealloc {
  33. [panel_ release];
  34. CFRelease(trust_);
  35. CFRelease(cert_chain_);
  36. CFRelease(sec_policy_);
  37. [super dealloc];
  38. }
  39. - (id)initWithCallback:(const certificate_trust::ShowTrustCallback&)callback
  40. panel:(SFCertificateTrustPanel*)panel
  41. cert:(const scoped_refptr<net::X509Certificate>&)cert
  42. trust:(SecTrustRef)trust
  43. certChain:(CFArrayRef)certChain
  44. secPolicy:(SecPolicyRef)secPolicy {
  45. if ((self = [super init])) {
  46. callback_ = callback;
  47. panel_ = panel;
  48. cert_ = cert;
  49. trust_ = trust;
  50. cert_chain_ = certChain;
  51. sec_policy_ = secPolicy;
  52. }
  53. return self;
  54. }
  55. - (void)panelDidEnd:(NSWindow*)sheet
  56. returnCode:(int)returnCode
  57. contextInfo:(void*)contextInfo {
  58. auto* cert_db = net::CertDatabase::GetInstance();
  59. // This forces Chromium to reload the certificate since it might be trusted
  60. // now.
  61. cert_db->NotifyObserversCertDBChanged();
  62. callback_.Run();
  63. [self autorelease];
  64. }
  65. @end
  66. namespace certificate_trust {
  67. void ShowCertificateTrust(atom::NativeWindow* parent_window,
  68. const scoped_refptr<net::X509Certificate>& cert,
  69. const std::string& message,
  70. const ShowTrustCallback& callback) {
  71. auto* sec_policy = SecPolicyCreateBasicX509();
  72. auto cert_chain =
  73. net::x509_util::CreateSecCertificateArrayForX509Certificate(cert.get());
  74. SecTrustRef trust = nullptr;
  75. SecTrustCreateWithCertificates(cert_chain, sec_policy, &trust);
  76. NSWindow* window = parent_window ? parent_window->GetNativeWindow() : nil;
  77. auto msg = base::SysUTF8ToNSString(message);
  78. auto panel = [[SFCertificateTrustPanel alloc] init];
  79. auto delegate = [[TrustDelegate alloc] initWithCallback:callback
  80. panel:panel
  81. cert:cert
  82. trust:trust
  83. certChain:cert_chain
  84. secPolicy:sec_policy];
  85. [panel beginSheetForWindow:window
  86. modalDelegate:delegate
  87. didEndSelector:@selector(panelDidEnd:returnCode:contextInfo:)
  88. contextInfo:nil
  89. trust:trust
  90. message:msg];
  91. }
  92. } // namespace certificate_trust