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(¶ms); 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