15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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/chromeos/enrollment_dialog_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/client_cert_util.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/managed_network_configuration_handler.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chromeos/network/network_event_log.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/network/network_state.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/window/dialog_delegate.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default width/height of the dialog.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultWidth = 350;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultHeight = 100;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dialog for certificate enrollment. This displays the content from the
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate enrollment URI.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnrollmentDialogView : public views::DialogDelegateView {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~EnrollmentDialogView();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ShowDialog(gfx::NativeWindow owning_window,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& network_name,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         Profile* profile,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& target_uri,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const base::Closure& connect);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // views::DialogDelegateView overrides
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetDialogButtons() const OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Accept() OVERRIDE;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void OnClosed() OVERRIDE;
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetDialogButtonLabel(
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ui::DialogButton button) const OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // views::WidgetDelegate overrides
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::ModalType GetModalType() const OVERRIDE;
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetWindowTitle() const OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // views::View overrides
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnrollmentDialogView(const std::string& network_name,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Profile* profile,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const GURL& target_uri,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const base::Closure& connect);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitDialog();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool accepted_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string network_name_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL target_uri_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure connect_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool added_cert_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EnrollmentDialogView implementation.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EnrollmentDialogView::EnrollmentDialogView(const std::string& network_name,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Profile* profile,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const GURL& target_uri,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const base::Closure& connect)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : accepted_(false),
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_name_(network_name),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_(profile),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_uri_(target_uri),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      connect_(connect),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      added_cert_(false) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EnrollmentDialogView::~EnrollmentDialogView() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EnrollmentDialogView::ShowDialog(gfx::NativeWindow owning_window,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const std::string& network_name,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Profile* profile,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const GURL& target_uri,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Closure& connect) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnrollmentDialogView* dialog_view =
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new EnrollmentDialogView(network_name, profile, target_uri, connect);
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  views::DialogDelegate::CreateDialogWidget(dialog_view, NULL, owning_window);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog_view->InitDialog();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = dialog_view->GetWidget();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(widget);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int EnrollmentDialogView::GetDialogButtons() const {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool EnrollmentDialogView::Accept() {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  accepted_ = true;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void EnrollmentDialogView::OnClosed() {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!accepted_)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::NavigateParams params(profile_,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GURL(target_uri_),
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.window_action = chrome::NavigateParams::SHOW_WINDOW;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::Navigate(&params);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 EnrollmentDialogView::GetDialogButtonLabel(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_BUTTON);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return views::DialogDelegateView::GetDialogButtonLabel(button);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType EnrollmentDialogView::GetModalType() const {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_SYSTEM;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 EnrollmentDialogView::GetWindowTitle() const {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_TITLE);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size EnrollmentDialogView::GetPreferredSize() const {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(kDefaultWidth, kDefaultHeight);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void EnrollmentDialogView::InitDialog() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  added_cert_ = false;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the views and layout manager and set them up.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* label = new views::Label(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringFUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_INSTRUCTIONS,
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 base::UTF8ToUTF16(network_name_)));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetMultiLine(true);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetAllowCharacterBreak(true);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::GridLayout* grid_layout = views::GridLayout::CreatePanel(this);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(grid_layout);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* columns = grid_layout->AddColumnSet(0);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::FILL,  // Horizontal resize.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FILL,  // Vertical resize.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     1,   // Resize weight.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::USE_PREF,  // Size type.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0,   // Ignored for USE_PREF.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0);  // Minimum size.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns = grid_layout->AddColumnSet(1);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddPaddingColumn(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, views::kUnrelatedControlHorizontalSpacing);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::LEADING,  // Horizontal leading.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FILL,     // Vertical resize.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     1,   // Resize weight.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::USE_PREF,  // Size type.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0,   // Ignored for USE_PREF.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0);  // Minimum size.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  grid_layout->StartRow(0, 0);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  grid_layout->AddView(label);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  grid_layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  grid_layout->Layout(this);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler for certificate enrollment.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DialogEnrollmentDelegate {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |owning_window| is the window that will own the dialog.
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DialogEnrollmentDelegate(gfx::NativeWindow owning_window,
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           const std::string& network_name,
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           Profile* profile);
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~DialogEnrollmentDelegate();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EnrollmentDelegate overrides
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool Enroll(const std::vector<std::string>& uri_list,
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              const base::Closure& connect);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeWindow owning_window_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string network_name_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DialogEnrollmentDelegate);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DialogEnrollmentDelegate::DialogEnrollmentDelegate(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeWindow owning_window,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& network_name,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) : owning_window_(owning_window),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        network_name_(network_name),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        profile_(profile) {}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DialogEnrollmentDelegate::~DialogEnrollmentDelegate() {}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool DialogEnrollmentDelegate::Enroll(const std::vector<std::string>& uri_list,
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      const base::Closure& post_action) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the closure for later activation if we notice that
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a certificate has been added.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gspencer): Do something smart with the closure.  At the moment it is
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being ignored because we don't know when the enrollment tab is closed.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crosbug.com/30422
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<std::string>::const_iterator iter = uri_list.begin();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != uri_list.end(); ++iter) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL uri(*iter);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (uri.IsStandard() || uri.scheme() == extensions::kExtensionScheme) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If this is a "standard" scheme, like http, ftp, etc., then open that in
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the enrollment dialog.
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      NET_LOG_EVENT("Showing enrollment dialog", network_name_);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EnrollmentDialogView::ShowDialog(owning_window_,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       network_name_,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       profile_,
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                       uri, post_action);
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return true;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    NET_LOG_DEBUG("Nonstandard URI: " + uri.spec(), network_name_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // No appropriate scheme was found.
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NET_LOG_ERROR("No usable enrollment URI", network_name_);
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return false;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void EnrollmentComplete(const std::string& service_path) {
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NET_LOG_USER("Enrollment Complete", service_path);
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory function.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace enrollment {
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CreateDialog(const std::string& service_path,
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  gfx::NativeWindow owning_window) {
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      GetNetworkState(service_path);
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!network) {
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    NET_LOG_ERROR("Enrolling Unknown network", service_path);
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Browser* browser = chrome::FindBrowserWithWindow(owning_window);
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Profile* profile =
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browser ? browser->profile() : ProfileManager::GetPrimaryUserProfile();
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string username_hash = ProfileHelper::GetUserIdHashFromProfile(profile);
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  onc::ONCSource onc_source = onc::ONC_SOURCE_NONE;
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::DictionaryValue* policy =
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NetworkHandler::Get()
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ->managed_network_configuration_handler()
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ->FindPolicyByGUID(username_hash, network->guid(), &onc_source);
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We skip certificate patterns for device policy ONC so that an unmanaged
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // user can't get to the place where a cert is presented for them
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // involuntarily.
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!policy || onc_source == onc::ONC_SOURCE_DEVICE_POLICY)
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_cert::ClientCertConfig cert_config;
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OncToClientCertConfig(*policy, &cert_config);
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cert_config.client_cert_type != onc::client_cert::kPattern)
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cert_config.pattern.Empty())
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NET_LOG_ERROR("Certificate pattern is empty", service_path);
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cert_config.pattern.enrollment_uri_list().empty()) {
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NET_LOG_EVENT("No enrollment URIs", service_path);
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NET_LOG_USER("Enrolling", service_path);
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DialogEnrollmentDelegate* enrollment =
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new DialogEnrollmentDelegate(owning_window, network->name(), profile);
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return enrollment->Enroll(cert_config.pattern.enrollment_uri_list(),
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            base::Bind(&EnrollmentComplete, service_path));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace enrollment
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
310