15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/certificate_viewer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cryptuiapi.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma comment(lib, "cryptui.lib") 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/cert/x509_certificate.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowCertificateViewerImpl(content::WebContents* web_contents, 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND parent, 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::X509Certificate* cert) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new cert context and store containing just the certificate 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and its intermediate certificates. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCCERT_CONTEXT cert_list = cert->CreateOSCertChainForCert(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(cert_list); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CRYPTUI_VIEWCERTIFICATE_STRUCT view_info = { 0 }; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_info.dwSize = sizeof(view_info); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We set our parent to the tab window. This makes the cert dialog created 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in CryptUIDlgViewCertificate modal to the browser. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_info.hwndParent = parent; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_info.dwFlags = CRYPTUI_DISABLE_EDITPROPERTIES | 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CRYPTUI_DISABLE_ADDTOSTORE; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_info.pCertContext = cert_list; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HCERTSTORE cert_store = cert_list->hCertStore; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_info.cStores = 1; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_info.rghStores = &cert_store; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL properties_changed; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We must allow nested tasks to dispatch so that, e.g. gpu tasks are 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // processed for painting. This allows a second window to continue painting 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // while the the certificate dialog is open. 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop::current()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This next call blocks but keeps processing windows messages, making it 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // modal to the browser window. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL rv = ::CryptUIDlgViewCertificate(&view_info, &properties_changed); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertFreeCertificateContext(cert_list); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShowCertificateViewer(content::WebContents* web_contents, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow parent, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::X509Certificate* cert) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::GetHostDesktopTypeForNativeWindow(parent) != 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HOST_DESKTOP_TYPE_ASH) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShowCertificateViewerImpl( 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_contents, 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent->GetHost()->GetAcceleratedWidget(), cert); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 67