OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/options/network_connect.h" | 5 #include "chrome/browser/chromeos/options/network_connect.h" |
6 | 6 |
7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
8 #include "ash/shell_delegate.h" | 8 #include "ash/shell_delegate.h" |
9 #include "ash/system/chromeos/network/network_connect.h" | 9 #include "ash/system/chromeos/network/network_connect.h" |
10 #include "ash/system/chromeos/network/network_observer.h" | 10 #include "ash/system/chromeos/network/network_observer.h" |
11 #include "ash/system/tray/system_tray_notifier.h" | 11 #include "ash/system/tray/system_tray_notifier.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
15 #include "chrome/browser/chromeos/cros/network_library.h" | |
16 #include "chrome/browser/chromeos/enrollment_dialog_view.h" | 15 #include "chrome/browser/chromeos/enrollment_dialog_view.h" |
| 16 #include "chrome/browser/chromeos/login/user_manager.h" |
17 #include "chrome/browser/chromeos/options/network_config_view.h" | 17 #include "chrome/browser/chromeos/options/network_config_view.h" |
18 #include "chrome/browser/profiles/profile_manager.h" | 18 #include "chrome/browser/profiles/profile_manager.h" |
19 #include "chrome/browser/ui/browser_finder.h" | 19 #include "chrome/browser/ui/browser_finder.h" |
20 #include "chrome/browser/ui/chrome_pages.h" | 20 #include "chrome/browser/ui/chrome_pages.h" |
21 #include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h" | 21 #include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h" |
22 #include "chrome/common/url_constants.h" | 22 #include "chrome/common/url_constants.h" |
23 #include "chromeos/chromeos_switches.h" | 23 #include "chromeos/chromeos_switches.h" |
| 24 #include "chromeos/network/certificate_pattern.h" |
| 25 #include "chromeos/network/certificate_pattern_matcher.h" |
| 26 #include "chromeos/network/managed_network_configuration_handler.h" |
| 27 #include "chromeos/network/network_event_log.h" |
| 28 #include "chromeos/network/network_handler.h" |
| 29 #include "chromeos/network/network_state.h" |
| 30 #include "chromeos/network/network_state_handler.h" |
24 #include "content/public/browser/user_metrics.h" | 31 #include "content/public/browser/user_metrics.h" |
25 #include "grit/generated_resources.h" | 32 #include "grit/generated_resources.h" |
26 #include "net/base/escape.h" | 33 #include "net/base/escape.h" |
27 #include "third_party/cros_system_api/dbus/service_constants.h" | 34 #include "third_party/cros_system_api/dbus/service_constants.h" |
28 #include "ui/base/l10n/l10n_util.h" | 35 #include "ui/base/l10n/l10n_util.h" |
29 | 36 |
30 namespace chromeos { | 37 namespace chromeos { |
31 namespace network_connect { | |
32 | 38 |
33 namespace { | 39 namespace { |
34 | 40 |
35 void DoConnect(Network* network, gfx::NativeWindow parent_window) { | 41 void EnrollmentComplete(const std::string& service_path) { |
36 NetworkLibrary* cros = NetworkLibrary::Get(); | 42 NET_LOG_USER("Enrollment Complete", service_path); |
37 if (network->type() == TYPE_VPN) { | |
38 VirtualNetwork* vpn = static_cast<VirtualNetwork*>(network); | |
39 if (vpn->NeedMoreInfoToConnect()) { | |
40 // Show the connection UI if info for a field is missing. | |
41 NetworkConfigView::Show(vpn, parent_window); | |
42 } else { | |
43 cros->ConnectToVirtualNetwork(vpn); | |
44 // Connection failures are responsible for updating the UI, including | |
45 // reopening dialogs. | |
46 } | |
47 } else if (network->type() == TYPE_WIFI) { | |
48 WifiNetwork* wifi = static_cast<WifiNetwork*>(network); | |
49 if (wifi->IsPassphraseRequired()) { | |
50 // Show the connection UI if we require a passphrase. | |
51 NetworkConfigView::Show(wifi, parent_window); | |
52 } else { | |
53 cros->ConnectToWifiNetwork(wifi); | |
54 // Connection failures are responsible for updating the UI, including | |
55 // reopening dialogs. | |
56 } | |
57 } else if (network->type() == TYPE_WIMAX) { | |
58 WimaxNetwork* wimax = static_cast<WimaxNetwork*>(network); | |
59 if (wimax->passphrase_required()) { | |
60 // Show the connection UI if we require a passphrase. | |
61 NetworkConfigView::Show(wimax, parent_window); | |
62 } else { | |
63 cros->ConnectToWimaxNetwork(wimax); | |
64 // Connection failures are responsible for updating the UI, including | |
65 // reopening dialogs. | |
66 } | |
67 } else if (network->type() == TYPE_CELLULAR) { | |
68 CellularNetwork* cellular = static_cast<CellularNetwork*>(network); | |
69 if (cellular->activation_state() != ACTIVATION_STATE_ACTIVATED || | |
70 cellular->out_of_credits()) { | |
71 ActivateCellular(cellular->service_path()); | |
72 } else { | |
73 cros->ConnectToCellularNetwork(cellular); | |
74 } | |
75 } | |
76 } | 43 } |
77 | 44 |
78 } // namespace | |
79 | |
80 void ActivateCellular(const std::string& service_path) { | |
81 chromeos::NetworkLibrary* cros = | |
82 chromeos::NetworkLibrary::Get(); | |
83 if (!cros->CellularDeviceUsesDirectActivation()) { | |
84 // For non direct activation, show the mobile setup dialog which can be | |
85 // used to activate the network. | |
86 ShowMobileSetup(service_path); | |
87 return; | |
88 } | |
89 chromeos::CellularNetwork* cellular = | |
90 cros->FindCellularNetworkByPath(service_path); | |
91 if (!cellular) | |
92 return; | |
93 if (cellular->activation_state() != chromeos::ACTIVATION_STATE_ACTIVATED) | |
94 cellular->StartActivation(); | |
95 return; | |
96 } | 45 } |
97 | 46 |
| 47 namespace network_connect { |
| 48 |
98 void ShowMobileSetup(const std::string& service_path) { | 49 void ShowMobileSetup(const std::string& service_path) { |
99 NetworkLibrary* cros = NetworkLibrary::Get(); | 50 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
100 const CellularNetwork* cellular = | 51 const NetworkState* cellular = handler->GetNetworkState(service_path); |
101 cros->FindCellularNetworkByPath(service_path); | 52 if (cellular && cellular->type() == flimflam::kTypeCellular && |
102 if (cellular && !cellular->activated() && | 53 cellular->activation_state() != flimflam::kActivationStateActivated && |
103 cellular->activate_over_non_cellular_network() && | 54 cellular->activate_over_non_cellular_networks() && |
104 (!cros->connected_network() || !cros->connected_network()->online())) { | 55 !handler->DefaultNetwork()) { |
105 NetworkTechnology technology = cellular->network_technology(); | 56 std::string technology = cellular->network_technology(); |
106 ash::NetworkObserver::NetworkType network_type = | 57 ash::NetworkObserver::NetworkType network_type = |
107 (technology == chromeos::NETWORK_TECHNOLOGY_LTE || | 58 (technology == flimflam::kNetworkTechnologyLte || |
108 technology == chromeos::NETWORK_TECHNOLOGY_LTE_ADVANCED) | 59 technology == flimflam::kNetworkTechnologyLteAdvanced) |
109 ? ash::NetworkObserver::NETWORK_CELLULAR_LTE | 60 ? ash::NetworkObserver::NETWORK_CELLULAR_LTE |
110 : ash::NetworkObserver::NETWORK_CELLULAR; | 61 : ash::NetworkObserver::NETWORK_CELLULAR; |
111 ash::Shell::GetInstance()->system_tray_notifier()->NotifySetNetworkMessage( | 62 ash::Shell::GetInstance()->system_tray_notifier()->NotifySetNetworkMessage( |
112 NULL, | 63 NULL, |
113 ash::NetworkObserver::ERROR_CONNECT_FAILED, | 64 ash::NetworkObserver::ERROR_CONNECT_FAILED, |
114 network_type, | 65 network_type, |
115 l10n_util::GetStringUTF16(IDS_NETWORK_ACTIVATION_ERROR_TITLE), | 66 l10n_util::GetStringUTF16(IDS_NETWORK_ACTIVATION_ERROR_TITLE), |
116 l10n_util::GetStringFUTF16(IDS_NETWORK_ACTIVATION_NEEDS_CONNECTION, | 67 l10n_util::GetStringFUTF16(IDS_NETWORK_ACTIVATION_NEEDS_CONNECTION, |
117 UTF8ToUTF16((cellular->name()))), | 68 UTF8ToUTF16((cellular->name()))), |
118 std::vector<string16>()); | 69 std::vector<string16>()); |
119 return; | 70 return; |
120 } | 71 } |
121 MobileSetupDialog::Show(service_path); | 72 MobileSetupDialog::Show(service_path); |
122 } | 73 } |
123 | 74 |
124 ConnectResult ConnectToNetwork(const std::string& service_path, | 75 void ShowNetworkSettings(const std::string& service_path) { |
125 gfx::NativeWindow parent_window) { | 76 std::string page = chrome::kInternetOptionsSubPage; |
126 if (CommandLine::ForCurrentProcess()->HasSwitch( | 77 const NetworkState* network = service_path.empty() ? NULL : |
127 chromeos::switches::kUseNewNetworkConnectionHandler)) { | 78 NetworkHandler::Get()->network_state_handler()->GetNetworkState( |
128 ash::network_connect::ConnectToNetwork(service_path); | 79 service_path); |
129 return CONNECT_STARTED; | 80 if (network) { |
| 81 std::string name(network->name()); |
| 82 if (name.empty() && network->type() == flimflam::kTypeEthernet) |
| 83 name = l10n_util::GetStringUTF8(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); |
| 84 page += base::StringPrintf( |
| 85 "?servicePath=%s&networkType=%s&networkName=%s", |
| 86 net::EscapeUrlEncodedData(service_path, true).c_str(), |
| 87 net::EscapeUrlEncodedData(network->type(), true).c_str(), |
| 88 net::EscapeUrlEncodedData(name, false).c_str()); |
130 } | 89 } |
131 | |
132 NetworkLibrary* cros = NetworkLibrary::Get(); | |
133 Network* network = cros->FindNetworkByPath(service_path); | |
134 if (!network) | |
135 return NETWORK_NOT_FOUND; | |
136 | |
137 if (network->connecting_or_connected()) | |
138 return CONNECT_NOT_STARTED; | |
139 | |
140 if (network->type() == TYPE_ETHERNET) | |
141 return CONNECT_NOT_STARTED; // Normally this shouldn't happen | |
142 | |
143 if (network->type() == TYPE_WIFI || network->type() == TYPE_VPN) { | |
144 network->SetEnrollmentDelegate(chromeos::CreateEnrollmentDelegate( | |
145 parent_window, network->name(), ProfileManager::GetLastUsedProfile())); | |
146 network->AttemptConnection(base::Bind(&DoConnect, network, parent_window)); | |
147 return CONNECT_STARTED; | |
148 } | |
149 | |
150 if (network->type() == TYPE_WIMAX) { | |
151 WimaxNetwork* wimax = static_cast<WimaxNetwork*>(network); | |
152 wimax->AttemptConnection(base::Bind(&DoConnect, wimax, parent_window)); | |
153 return CONNECT_STARTED; | |
154 } | |
155 | |
156 if (network->type() == TYPE_CELLULAR) { | |
157 CellularNetwork* cellular = static_cast<CellularNetwork*>(network); | |
158 if (cellular->NeedsActivation() || cellular->out_of_credits()) { | |
159 ActivateCellular(service_path); | |
160 return CONNECT_STARTED; | |
161 } | |
162 if (cellular->activation_state() == ACTIVATION_STATE_ACTIVATING) | |
163 return CONNECT_NOT_STARTED; | |
164 cros->ConnectToCellularNetwork(cellular); | |
165 return CONNECT_STARTED; | |
166 } | |
167 | |
168 NOTREACHED(); | |
169 return CONNECT_NOT_STARTED; | |
170 } | |
171 | |
172 void HandleUnconfiguredNetwork(const std::string& service_path, | |
173 gfx::NativeWindow parent_window) { | |
174 NetworkLibrary* cros = NetworkLibrary::Get(); | |
175 Network* network = cros->FindNetworkByPath(service_path); | |
176 if (!network) { | |
177 LOG(WARNING) << "Unknown network: " << service_path; | |
178 return; | |
179 } | |
180 | |
181 if (network->type() == TYPE_WIFI || network->type() == TYPE_VPN) { | |
182 network->SetEnrollmentDelegate(chromeos::CreateEnrollmentDelegate( | |
183 parent_window, network->name(), ProfileManager::GetLastUsedProfile())); | |
184 // This will connect to the network only if the network just needs to have | |
185 // its certificate configured. Otherwise it will show an enrollment dialog | |
186 // if available, or call NetworkConfigView::Show(). | |
187 network->AttemptConnection( | |
188 base::Bind(&NetworkConfigView::Show, network, parent_window)); | |
189 return; | |
190 } | |
191 | |
192 if (network->type() == TYPE_WIMAX) { | |
193 NetworkConfigView::Show(network, parent_window); | |
194 return; | |
195 } | |
196 | |
197 if (network->type() == TYPE_CELLULAR) { | |
198 CellularNetwork* cellular = static_cast<CellularNetwork*>(network); | |
199 if (cellular->NeedsActivation()) { | |
200 ActivateCellular(service_path); | |
201 return; | |
202 } else if (cellular->out_of_credits()) { | |
203 ShowMobileSetup(service_path); | |
204 return; | |
205 } | |
206 } | |
207 | |
208 // No special configure or setup for |service_path|, show the settings UI. | |
209 std::string page = chrome::kInternetOptionsSubPage; | |
210 std::string name = network->name(); | |
211 if (name.empty() && network->type() == TYPE_ETHERNET) | |
212 name = l10n_util::GetStringUTF8(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET); | |
213 page += base::StringPrintf( | |
214 "?servicePath=%s&networkType=%d&networkName=%s", | |
215 net::EscapeUrlEncodedData(service_path, true).c_str(), | |
216 network->type(), | |
217 net::EscapeUrlEncodedData(name, false).c_str()); | |
218 content::RecordAction( | 90 content::RecordAction( |
219 content::UserMetricsAction("OpenInternetOptionsDialog")); | 91 content::UserMetricsAction("OpenInternetOptionsDialog")); |
220 Browser* browser = chrome::FindOrCreateTabbedBrowser( | 92 Browser* browser = chrome::FindOrCreateTabbedBrowser( |
221 ProfileManager::GetDefaultProfileOrOffTheRecord(), | 93 ProfileManager::GetDefaultProfileOrOffTheRecord(), |
222 chrome::HOST_DESKTOP_TYPE_ASH); | 94 chrome::HOST_DESKTOP_TYPE_ASH); |
223 chrome::ShowSettingsSubPage(browser, page); | 95 chrome::ShowSettingsSubPage(browser, page); |
224 } | 96 } |
225 | 97 |
| 98 void HandleUnconfiguredNetwork(const std::string& service_path, |
| 99 gfx::NativeWindow parent_window) { |
| 100 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> |
| 101 GetNetworkState(service_path); |
| 102 if (!network) { |
| 103 NET_LOG_ERROR("Configuring unknown network", service_path); |
| 104 return; |
| 105 } |
| 106 |
| 107 if (network->type() == flimflam::kTypeWifi || |
| 108 network->type() == flimflam::kTypeWimax || |
| 109 network->type() == flimflam::kTypeVPN) { |
| 110 NetworkConfigView::Show(service_path, parent_window); |
| 111 return; |
| 112 } |
| 113 |
| 114 if (network->type() == flimflam::kTypeCellular) { |
| 115 if (network->activation_state() != flimflam::kActivationStateActivated) { |
| 116 ash::network_connect::ActivateCellular(service_path); |
| 117 return; |
| 118 } |
| 119 if (network->cellular_out_of_credits()) { |
| 120 ShowMobileSetup(service_path); |
| 121 return; |
| 122 } |
| 123 // No special configure or setup for |network|, show the settings UI. |
| 124 ShowNetworkSettings(service_path); |
| 125 } |
| 126 NOTREACHED(); |
| 127 } |
| 128 |
| 129 bool EnrollNetwork(const std::string& service_path, |
| 130 gfx::NativeWindow parent_window) { |
| 131 const NetworkState* network = NetworkHandler::Get()->network_state_handler()-> |
| 132 GetNetworkState(service_path); |
| 133 if (!network) { |
| 134 NET_LOG_ERROR("Enrolling Unknown network", service_path); |
| 135 return false; |
| 136 } |
| 137 // We skip certificate patterns for device policy ONC so that an unmanaged |
| 138 // user can't get to the place where a cert is presented for them |
| 139 // involuntarily. |
| 140 if (network->ui_data().onc_source() == onc::ONC_SOURCE_DEVICE_POLICY) |
| 141 return false; |
| 142 |
| 143 const CertificatePattern& certificate_pattern = |
| 144 network->ui_data().certificate_pattern(); |
| 145 if (certificate_pattern.Empty()) |
| 146 return false; |
| 147 |
| 148 NET_LOG_USER("Enrolling", service_path); |
| 149 |
| 150 EnrollmentDelegate* enrollment = CreateEnrollmentDelegate( |
| 151 parent_window, network->name(), ProfileManager::GetDefaultProfile()); |
| 152 return enrollment->Enroll(certificate_pattern.enrollment_uri_list(), |
| 153 base::Bind(&EnrollmentComplete, service_path)); |
| 154 } |
| 155 |
| 156 const base::DictionaryValue* FindPolicyForActiveUser( |
| 157 const NetworkState* network, |
| 158 onc::ONCSource* onc_source) { |
| 159 const User* user = UserManager::Get()->GetActiveUser(); |
| 160 std::string username_hash = user ? user->username_hash() : std::string(); |
| 161 return NetworkHandler::Get()->managed_network_configuration_handler()-> |
| 162 FindPolicyByGUID(username_hash, network->guid(), onc_source); |
| 163 } |
| 164 |
226 } // namespace network_connect | 165 } // namespace network_connect |
227 } // namespace chromeos | 166 } // namespace chromeos |
OLD | NEW |