1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/certificate_viewer.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <windows.h>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <cryptuiapi.h>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#pragma comment(lib, "cryptui.lib")
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/x509_certificate.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ShowCertificateViewer(gfx::NativeWindow parent,
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           net::X509Certificate* cert) {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CRYPTUI_VIEWCERTIFICATE_STRUCT view_info = { 0 };
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_info.dwSize = sizeof(view_info);
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We set our parent to the tab window. This makes the cert dialog created
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in CryptUIDlgViewCertificate modal to the browser.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_info.hwndParent = parent;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_info.dwFlags = CRYPTUI_DISABLE_EDITPROPERTIES |
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      CRYPTUI_DISABLE_ADDTOSTORE;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_info.pCertContext = cert->os_cert_handle();
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search the cert store that 'cert' is in when building the cert chain.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HCERTSTORE cert_store = view_info.pCertContext->hCertStore;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_info.cStores = 1;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view_info.rghStores = &cert_store;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BOOL properties_changed;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This next call blocks but keeps processing windows messages, making it
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // modal to the browser window.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BOOL rv = ::CryptUIDlgViewCertificate(&view_info, &properties_changed);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
33