summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/webui/certificate_viewer_webui.h
blob: 367f4510cf27523c3ec33665a0e2d115d27dc07b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_WEBUI_CERTIFICATE_VIEWER_WEBUI_H_
#define CHROME_BROWSER_UI_WEBUI_CERTIFICATE_VIEWER_WEBUI_H_

#include <string>
#include <vector>

#include "base/compiler_specific.h"
#include "base/values.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "net/cert/x509_certificate.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/web_dialogs/web_dialog_delegate.h"

namespace content {
class WebContents;
}

class ConstrainedWebDialogDelegate;

// Modal dialog for displaying detailed certificate information. This is used in
// chromeos builds to display detailed information in a modal dialog when the
// user clicks on "View" from the Certificate Manager dialog.
class CertificateViewerModalDialog : public ui::WebDialogDelegate {
 public:
  // Construct a certificate viewer for the passed in certificate. A reference
  // to the certificate pointer is added for the lifetime of the certificate
  // viewer.
  explicit CertificateViewerModalDialog(
      net::X509Certificate* cert);
  ~CertificateViewerModalDialog() override;

  virtual void Show(content::WebContents* web_contents,
                    gfx::NativeWindow parent);
  virtual gfx::NativeWindow GetNativeWebContentsModalDialog();
  const content::WebUI* GetWebUI() const { return webui_; }

 protected:
  // Overridden from ui::WebDialogDelegate:
  ui::ModalType GetDialogModalType() const override;
  base::string16 GetDialogTitle() const override;
  GURL GetDialogContentURL() const override;
  void GetWebUIMessageHandlers(
      std::vector<content::WebUIMessageHandler*>* handlers) const override;
  void GetDialogSize(gfx::Size* size) const override;
  std::string GetDialogArgs() const override;
  void OnDialogShown(content::WebUI* webui,
                     content::RenderViewHost* render_view_host) override;
  void OnDialogClosed(const std::string& json_retval) override;
  void OnCloseContents(content::WebContents* source,
                       bool* out_close_dialog) override;
  bool ShouldShowDialogTitle() const override;

  // The certificate being viewed.
  scoped_refptr<net::X509Certificate> cert_;

  // The title of the certificate viewer dialog, Certificate Viewer: CN.
  base::string16 title_;

 private:
  content::WebUI* webui_;
  gfx::NativeWindow window_;
  DISALLOW_COPY_AND_ASSIGN(CertificateViewerModalDialog);
};

// Dialog for displaying detailed certificate information. This is used in linux
// and chromeos builds to display detailed information in a floating dialog when
// the user clicks on "Certificate Information" from the lock icon of a web site
// or "View" from the Certificate Manager.
class CertificateViewerDialog : public CertificateViewerModalDialog {
 public:
  // Construct a certificate viewer for the passed in certificate. A reference
  // to the certificate pointer is added for the lifetime of the certificate
  // viewer.
  explicit CertificateViewerDialog(net::X509Certificate* cert);
  ~CertificateViewerDialog() override;

  // CertificateViewerModalDialog overrides.
  void Show(content::WebContents* web_contents,
            gfx::NativeWindow parent) override;
  gfx::NativeWindow GetNativeWebContentsModalDialog() override;

 protected:
  // Overridden from ui::WebDialogDelegate:
  GURL GetDialogContentURL() const override;
  ui::ModalType GetDialogModalType() const override;

 private:
  ConstrainedWebDialogDelegate* dialog_;

  DISALLOW_COPY_AND_ASSIGN(CertificateViewerDialog);
};

// Dialog handler which handles calls from the JS WebUI code to view certificate
// details and export the certificate.
class CertificateViewerDialogHandler : public content::WebUIMessageHandler {
 public:
  CertificateViewerDialogHandler(CertificateViewerModalDialog* dialog,
                                 net::X509Certificate* cert);
  ~CertificateViewerDialogHandler() override;

  // Overridden from WebUIMessageHandler
  void RegisterMessages() override;

 private:
  // Brings up the export certificate dialog for the chosen certificate in the
  // chain.
  //
  // The input is an integer index to the certificate in the chain to export.
  void ExportCertificate(const base::ListValue* args);

  // Gets the details for a specific certificate in the certificate chain. Calls
  // the javascript function cert_viewer.getCertificateFields with a tree
  // structure containing the fields and values for certain nodes.
  //
  // The input is an integer index to the certificate in the chain to view.
  void RequestCertificateFields(const base::ListValue* args);

  // Helper function to get the certificate index from |args|. Returns -1 if
  // the index is out of range.
  int GetCertificateIndex(const base::ListValue* args) const;

  // The certificate being viewed.
  scoped_refptr<net::X509Certificate> cert_;

  // The dialog.
  CertificateViewerModalDialog* dialog_;

  // The certificate chain. Does not take references, so only valid as long as
  // |cert_| is.
  net::X509Certificate::OSCertHandles cert_chain_;

  DISALLOW_COPY_AND_ASSIGN(CertificateViewerDialogHandler);
};

#endif  // CHROME_BROWSER_UI_WEBUI_CERTIFICATE_VIEWER_WEBUI_H_