1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ssl_add_cert_handler.h" 6 7 #include <SecurityInterface/SFCertificatePanel.h> 8 #include <SecurityInterface/SFCertificateView.h> 9 10 #include "base/logging.h" 11 #include "base/memory/scoped_nsobject.h" 12 #include "chrome/common/logging_chrome.h" 13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser_list.h" 15 #include "chrome/browser/ui/browser_window.h" 16 #include "grit/generated_resources.h" 17 #include "net/base/x509_certificate.h" 18 #include "ui/base/l10n/l10n_util_mac.h" 19 20 @interface SSLAddCertHandlerCocoa : NSObject 21 { 22 scoped_refptr<SSLAddCertHandler> handler_; 23 } 24 25 - (id)initWithHandler:(SSLAddCertHandler*)handler; 26 - (void)askToAddCert; 27 @end 28 29 30 void SSLAddCertHandler::AskToAddCert() { 31 [[[SSLAddCertHandlerCocoa alloc] initWithHandler: this] askToAddCert]; 32 // The new object will release itself when the sheet ends. 33 } 34 35 36 // The actual implementation of the add-client-cert handler is an Obj-C class. 37 @implementation SSLAddCertHandlerCocoa 38 39 - (id)initWithHandler:(SSLAddCertHandler*)handler { 40 DCHECK(handler && handler->cert()); 41 self = [super init]; 42 if (self) { 43 handler_ = handler; 44 } 45 return self; 46 } 47 48 - (void)sheetDidEnd:(SFCertificatePanel*)panel 49 returnCode:(NSInteger)returnCode 50 context:(void*)context { 51 [panel orderOut:self]; 52 [panel autorelease]; 53 handler_->Finished(returnCode == NSOKButton); 54 [self release]; 55 } 56 57 - (void)askToAddCert { 58 NSWindow* parentWindow = NULL; 59 Browser* browser = BrowserList::GetLastActive(); 60 // TODO(snej): Can I get the Browser that issued the request? 61 if (browser) { 62 parentWindow = browser->window()->GetNativeHandle(); 63 if ([parentWindow attachedSheet]) 64 parentWindow = nil; 65 } 66 67 // Create the cert panel, which will be released in my -sheetDidEnd: method. 68 SFCertificatePanel* panel = [[SFCertificatePanel alloc] init]; 69 [panel setDefaultButtonTitle:l10n_util::GetNSString(IDS_ADD_CERT_DIALOG_ADD)]; 70 [panel setAlternateButtonTitle:l10n_util::GetNSString(IDS_CANCEL)]; 71 SecCertificateRef cert = handler_->cert()->os_cert_handle(); 72 NSArray* certs = [NSArray arrayWithObject: (id)cert]; 73 74 if (parentWindow) { 75 // Open the cert panel as a sheet on the browser window. 76 [panel beginSheetForWindow:parentWindow 77 modalDelegate:self 78 didEndSelector:@selector(sheetDidEnd:returnCode:context:) 79 contextInfo:NULL 80 certificates:certs 81 showGroup:NO]; 82 } else { 83 // No available browser window, so run independently as a (blocking) dialog. 84 int returnCode = [panel runModalForCertificates:certs showGroup:NO]; 85 [self sheetDidEnd:panel returnCode:returnCode context:NULL]; 86 } 87 } 88 89 @end 90