1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/network_ui_data.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/onc/onc_signature.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Top-level UI data dictionary keys. 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char NetworkUIData::kKeyONCSource[] = "onc_source"; 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char NetworkUIData::kKeyCertificatePattern[] = "certificate_pattern"; 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char NetworkUIData::kKeyCertificateType[] = "certificate_type"; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char NetworkUIData::kKeyUserSettings[] = "user_settings"; 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char NetworkUIData::kONCSourceUserImport[] = "user_import"; 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char NetworkUIData::kONCSourceDevicePolicy[] = "device_policy"; 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char NetworkUIData::kONCSourceUserPolicy[] = "user_policy"; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename Enum> 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct StringEnumEntry { 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* string; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Enum enum_value; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const StringEnumEntry< ::onc::ONCSource> kONCSourceTable[] = { 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { NetworkUIData::kONCSourceUserImport, ::onc::ONC_SOURCE_USER_IMPORT }, 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { NetworkUIData::kONCSourceDevicePolicy, ::onc::ONC_SOURCE_DEVICE_POLICY }, 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { NetworkUIData::kONCSourceUserPolicy, ::onc::ONC_SOURCE_USER_POLICY } 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const StringEnumEntry<ClientCertType> kClientCertTable[] = { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "none", CLIENT_CERT_TYPE_NONE }, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "pattern", CLIENT_CERT_TYPE_PATTERN }, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "ref", CLIENT_CERT_TYPE_REF } 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts |enum_value| to the corresponding string according to |table|. If no 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// enum value of the table matches (which can only occur if incorrect casting 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// was used to obtain |enum_value|), returns an empty string instead. 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename Enum, int N> 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string EnumToString(const StringEnumEntry<Enum>(& table)[N], 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Enum enum_value) { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (int i = 0; i < N; ++i) { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (table[i].enum_value == enum_value) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return table[i].string; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts |str| to the corresponding enum value according to |table|. If no 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// string of the table matches, returns |fallback| instead. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename Enum, int N> 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Enum StringToEnum(const StringEnumEntry<Enum>(& table)[N], 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& str, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Enum fallback) { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (int i = 0; i < N; ++i) { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (table[i].string == str) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return table[i].enum_value; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return fallback; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::NetworkUIData() 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : onc_source_(::onc::ONC_SOURCE_NONE), 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_type_(CLIENT_CERT_TYPE_NONE) { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::NetworkUIData(const NetworkUIData& other) { 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *this = other; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData& NetworkUIData::operator=(const NetworkUIData& other) { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_pattern_ = other.certificate_pattern_; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) onc_source_ = other.onc_source_; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_type_ = other.certificate_type_; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (other.user_settings_) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_settings_.reset(other.user_settings_->DeepCopy()); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) policy_guid_ = other.policy_guid_; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *this; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetworkUIData::NetworkUIData(const base::DictionaryValue& dict) { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string source; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict.GetString(kKeyONCSource, &source); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) onc_source_ = StringToEnum(kONCSourceTable, source, ::onc::ONC_SOURCE_NONE); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string type_string; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict.GetString(kKeyCertificateType, &type_string); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_type_ = 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringToEnum(kClientCertTable, type_string, CLIENT_CERT_TYPE_NONE); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN) { 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::DictionaryValue* cert_dict = NULL; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict.GetDictionary(kKeyCertificatePattern, &cert_dict); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cert_dict) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_pattern_.CopyFromDictionary(*cert_dict); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (certificate_pattern_.Empty()) { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This case may occur if UIData from an older CrOS version is read. 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LOG(WARNING) << "Couldn't parse a valid certificate pattern."; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_type_ = CLIENT_CERT_TYPE_NONE; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::DictionaryValue* user_settings = NULL; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (dict.GetDictionary(kKeyUserSettings, &user_settings)) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_settings_.reset(user_settings->DeepCopy()); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::~NetworkUIData() { 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void NetworkUIData::set_user_settings(scoped_ptr<base::DictionaryValue> dict) { 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_settings_ = dict.Pass(); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string NetworkUIData::GetONCSourceAsString() const { 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return EnumToString(kONCSourceTable, onc_source_); 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const { 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->Clear(); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string source_string = GetONCSourceAsString(); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!source_string.empty()) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString(kKeyONCSource, source_string); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (certificate_type_ != CLIENT_CERT_TYPE_NONE) { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string type_string = EnumToString(kClientCertTable, certificate_type_); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString(kKeyCertificateType, type_string); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN && 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !certificate_pattern_.Empty()) { 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->Set(kKeyCertificatePattern, 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) certificate_pattern_.CreateAsDictionary()); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (user_settings_) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetWithoutPathExpansion(kKeyUserSettings, 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_settings_->DeepCopy()); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateClientCertType(const std::string& client_cert_type, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkUIData* ui_data) { 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) using namespace ::onc::certificate; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClientCertType type; 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (client_cert_type == kNone) { 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type = CLIENT_CERT_TYPE_NONE; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (client_cert_type == kRef) { 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type = CLIENT_CERT_TYPE_REF; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (client_cert_type == kPattern) { 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type = CLIENT_CERT_TYPE_PATTERN; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) type = CLIENT_CERT_TYPE_NONE; 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_data->set_certificate_type(type); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateCertificatePattern(const base::DictionaryValue& onc_object, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkUIData* ui_data) { 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertificatePattern pattern; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success = pattern.CopyFromDictionary(onc_object); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(success); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_data->set_certificate_pattern(pattern); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateEAP(const base::DictionaryValue& eap, 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkUIData* ui_data) { 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string client_cert_type; 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (eap.GetStringWithoutPathExpansion(::onc::eap::kClientCertType, 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &client_cert_type)) { 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateClientCertType(client_cert_type, ui_data); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateIPsec(const base::DictionaryValue& ipsec, 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkUIData* ui_data) { 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string client_cert_type; 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (ipsec.GetStringWithoutPathExpansion(::onc::vpn::kClientCertType, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &client_cert_type)) { 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateClientCertType(client_cert_type, ui_data); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateOpenVPN(const base::DictionaryValue& openvpn, 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkUIData* ui_data) { 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string client_cert_type; 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (openvpn.GetStringWithoutPathExpansion(::onc::vpn::kClientCertType, 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &client_cert_type)) { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateClientCertType(client_cert_type, ui_data); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateONCHierarchy(const onc::OncValueSignature& signature, 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue& onc_object, 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkUIData* ui_data) { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (&signature == &onc::kCertificatePatternSignature) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateCertificatePattern(onc_object, ui_data); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (&signature == &onc::kEAPSignature) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateEAP(onc_object, ui_data); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (&signature == &onc::kIPsecSignature) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateIPsec(onc_object, ui_data); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (&signature == &onc::kOpenVPNSignature) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateOpenVPN(onc_object, ui_data); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Recurse into nested objects. 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd(); 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it.Advance()) { 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* inner_object; 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!it.value().GetAsDictionary(&inner_object)) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const onc::OncFieldSignature* field_signature = 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFieldSignature(signature, it.key()); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateONCHierarchy(*field_signature->value_signature, *inner_object, 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_data); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// static 234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<NetworkUIData> NetworkUIData::CreateFromONC( 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ::onc::ONCSource onc_source, 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue& onc_network) { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<NetworkUIData> ui_data(new NetworkUIData()); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TranslateONCHierarchy(onc::kNetworkConfigurationSignature, onc_network, 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_data.get()); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_data->set_onc_source(onc_source); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ui_data.Pass(); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 247