Home | History | Annotate | Download | only in ssl
      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