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