Home | History | Annotate | Download | only in webui
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_UI_WEBUI_CERTIFICATE_VIEWER_WEBUI_H_
      6 #define CHROME_BROWSER_UI_WEBUI_CERTIFICATE_VIEWER_WEBUI_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/compiler_specific.h"
     12 #include "base/values.h"
     13 #include "components/web_modal/native_web_contents_modal_dialog.h"
     14 #include "content/public/browser/web_ui_message_handler.h"
     15 #include "net/cert/x509_certificate.h"
     16 #include "ui/gfx/native_widget_types.h"
     17 #include "ui/web_dialogs/web_dialog_delegate.h"
     18 
     19 namespace content {
     20 class WebContents;
     21 }
     22 
     23 class ConstrainedWebDialogDelegate;
     24 
     25 // Modal dialog for displaying detailed certificate information. This is used in
     26 // chromeos builds to display detailed information in a modal dialog when the
     27 // user clicks on "View" from the Certificate Manager dialog.
     28 class CertificateViewerModalDialog : public ui::WebDialogDelegate {
     29  public:
     30   // Construct a certificate viewer for the passed in certificate. A reference
     31   // to the certificate pointer is added for the lifetime of the certificate
     32   // viewer.
     33   explicit CertificateViewerModalDialog(
     34       net::X509Certificate* cert);
     35   virtual ~CertificateViewerModalDialog();
     36 
     37   virtual void Show(content::WebContents* web_contents,
     38                     gfx::NativeWindow parent);
     39   virtual web_modal::NativeWebContentsModalDialog
     40   GetNativeWebContentsModalDialog();
     41   const content::WebUI* GetWebUI() const { return webui_; }
     42 
     43  protected:
     44   // Overridden from ui::WebDialogDelegate:
     45   virtual ui::ModalType GetDialogModalType() const OVERRIDE;
     46   virtual base::string16 GetDialogTitle() const OVERRIDE;
     47   virtual GURL GetDialogContentURL() const OVERRIDE;
     48   virtual void GetWebUIMessageHandlers(
     49       std::vector<content::WebUIMessageHandler*>* handlers) const OVERRIDE;
     50   virtual void GetDialogSize(gfx::Size* size) const OVERRIDE;
     51   virtual std::string GetDialogArgs() const OVERRIDE;
     52   virtual void OnDialogShown(
     53       content::WebUI* webui,
     54       content::RenderViewHost* render_view_host) OVERRIDE;
     55   virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE;
     56   virtual void OnCloseContents(
     57       content::WebContents* source, bool* out_close_dialog) OVERRIDE;
     58   virtual bool ShouldShowDialogTitle() const OVERRIDE;
     59 
     60   // The certificate being viewed.
     61   scoped_refptr<net::X509Certificate> cert_;
     62 
     63   // The title of the certificate viewer dialog, Certificate Viewer: CN.
     64   base::string16 title_;
     65 
     66  private:
     67   content::WebUI* webui_;
     68   gfx::NativeWindow window_;
     69   DISALLOW_COPY_AND_ASSIGN(CertificateViewerModalDialog);
     70 };
     71 
     72 // Dialog for displaying detailed certificate information. This is used in linux
     73 // and chromeos builds to display detailed information in a floating dialog when
     74 // the user clicks on "Certificate Information" from the lock icon of a web site
     75 // or "View" from the Certificate Manager.
     76 class CertificateViewerDialog : public CertificateViewerModalDialog {
     77  public:
     78   // Construct a certificate viewer for the passed in certificate. A reference
     79   // to the certificate pointer is added for the lifetime of the certificate
     80   // viewer.
     81   explicit CertificateViewerDialog(net::X509Certificate* cert);
     82   virtual ~CertificateViewerDialog();
     83 
     84   // CertificateViewerModalDialog overrides.
     85   virtual void Show(content::WebContents* web_contents,
     86                     gfx::NativeWindow parent) OVERRIDE;
     87   virtual web_modal::NativeWebContentsModalDialog
     88   GetNativeWebContentsModalDialog() OVERRIDE;
     89 
     90  protected:
     91   // Overridden from ui::WebDialogDelegate:
     92   virtual GURL GetDialogContentURL() const OVERRIDE;
     93   virtual ui::ModalType GetDialogModalType() const OVERRIDE;
     94 
     95  private:
     96   ConstrainedWebDialogDelegate* dialog_;
     97 
     98   DISALLOW_COPY_AND_ASSIGN(CertificateViewerDialog);
     99 };
    100 
    101 // Dialog handler which handles calls from the JS WebUI code to view certificate
    102 // details and export the certificate.
    103 class CertificateViewerDialogHandler : public content::WebUIMessageHandler {
    104  public:
    105   CertificateViewerDialogHandler(CertificateViewerModalDialog* dialog,
    106                                  net::X509Certificate* cert);
    107   virtual ~CertificateViewerDialogHandler();
    108 
    109   // Overridden from WebUIMessageHandler
    110   virtual void RegisterMessages() OVERRIDE;
    111 
    112  private:
    113   // Brings up the export certificate dialog for the chosen certificate in the
    114   // chain.
    115   //
    116   // The input is an integer index to the certificate in the chain to export.
    117   void ExportCertificate(const base::ListValue* args);
    118 
    119   // Gets the details for a specific certificate in the certificate chain. Calls
    120   // the javascript function cert_viewer.getCertificateFields with a tree
    121   // structure containing the fields and values for certain nodes.
    122   //
    123   // The input is an integer index to the certificate in the chain to view.
    124   void RequestCertificateFields(const base::ListValue* args);
    125 
    126   // Helper function to get the certificate index from |args|. Returns -1 if
    127   // the index is out of range.
    128   int GetCertificateIndex(const base::ListValue* args) const;
    129 
    130   // The certificate being viewed.
    131   scoped_refptr<net::X509Certificate> cert_;
    132 
    133   // The dialog.
    134   CertificateViewerModalDialog* dialog_;
    135 
    136   // The certificate chain.
    137   net::X509Certificate::OSCertHandles cert_chain_;
    138 
    139   DISALLOW_COPY_AND_ASSIGN(CertificateViewerDialogHandler);
    140 };
    141 
    142 #endif  // CHROME_BROWSER_UI_WEBUI_CERTIFICATE_VIEWER_WEBUI_H_
    143