network_ui_data.cc revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
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";
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename Enum>
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct StringEnumEntry {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* string;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Enum enum_value;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const StringEnumEntry<onc::ONCSource> kONCSourceTable[] = {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "user_import", onc::ONC_SOURCE_USER_IMPORT },
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "device_policy", onc::ONC_SOURCE_DEVICE_POLICY },
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "user_policy", onc::ONC_SOURCE_USER_POLICY }
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const StringEnumEntry<ClientCertType> kClientCertTable[] = {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "none", CLIENT_CERT_TYPE_NONE },
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "pattern", CLIENT_CERT_TYPE_PATTERN },
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "ref", CLIENT_CERT_TYPE_REF }
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts |enum_value| to the corresponding string according to |table|. If no
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// enum value of the table matches (which can only occur if incorrect casting
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// was used to obtain |enum_value|), returns an empty string instead.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename Enum, int N>
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string EnumToString(const StringEnumEntry<Enum>(& table)[N],
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         Enum enum_value) {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < N; ++i) {
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (table[i].enum_value == enum_value)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return table[i].string;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return std::string();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts |str| to the corresponding enum value according to |table|. If no
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// string of the table matches, returns |fallback| instead.
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename Enum, int N>
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Enum StringToEnum(const StringEnumEntry<Enum>(& table)[N],
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  const std::string& str,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  Enum fallback) {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < N; ++i) {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (table[i].string == str)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return table[i].enum_value;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return fallback;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::NetworkUIData()
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : onc_source_(onc::ONC_SOURCE_NONE),
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      certificate_type_(CLIENT_CERT_TYPE_NONE) {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::NetworkUIData(const NetworkUIData& other) {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *this = other;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData& NetworkUIData::operator=(const NetworkUIData& other) {
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  certificate_pattern_ = other.certificate_pattern_;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  onc_source_ = other.onc_source_;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  certificate_type_ = other.certificate_type_;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (other.user_settings_)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_settings_.reset(other.user_settings_->DeepCopy());
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy_guid_ = other.policy_guid_;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return *this;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::NetworkUIData(const DictionaryValue& dict) {
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string source;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict.GetString(kKeyONCSource, &source);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  onc_source_ = StringToEnum(kONCSourceTable, source, onc::ONC_SOURCE_NONE);
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string type_string;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict.GetString(kKeyCertificateType, &type_string);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  certificate_type_ =
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      StringToEnum(kClientCertTable, type_string, CLIENT_CERT_TYPE_NONE);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN) {
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const DictionaryValue* cert_dict = NULL;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dict.GetDictionary(kKeyCertificatePattern, &cert_dict);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (cert_dict)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      certificate_pattern_.CopyFromDictionary(*cert_dict);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (certificate_pattern_.Empty()) {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LOG(ERROR) << "Couldn't parse a valid certificate pattern.";
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      certificate_type_ = CLIENT_CERT_TYPE_NONE;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const DictionaryValue* user_settings = NULL;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (dict.GetDictionary(kKeyUserSettings, &user_settings))
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_settings_.reset(user_settings->DeepCopy());
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NetworkUIData::~NetworkUIData() {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dict->Clear();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string source_string = EnumToString(kONCSourceTable, onc_source_);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!source_string.empty())
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dict->SetString(kKeyONCSource, source_string);
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (certificate_type_ != CLIENT_CERT_TYPE_NONE) {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string type_string = EnumToString(kClientCertTable, certificate_type_);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dict->SetString(kKeyCertificateType, type_string);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN &&
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        !certificate_pattern_.Empty()) {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->Set(kKeyCertificatePattern,
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                certificate_pattern_.CreateAsDictionary());
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (user_settings_)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dict->SetWithoutPathExpansion(kKeyUserSettings,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  user_settings_->DeepCopy());
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateClientCertType(const std::string& client_cert_type,
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             NetworkUIData* ui_data) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  using namespace onc::certificate;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClientCertType type;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (client_cert_type == kNone) {
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    type = CLIENT_CERT_TYPE_NONE;
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (client_cert_type == kRef) {
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    type = CLIENT_CERT_TYPE_REF;
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (client_cert_type == kPattern) {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    type = CLIENT_CERT_TYPE_PATTERN;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    type = CLIENT_CERT_TYPE_NONE;
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_data->set_certificate_type(type);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateCertificatePattern(const base::DictionaryValue& onc_object,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 NetworkUIData* ui_data) {
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CertificatePattern pattern;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool success = pattern.CopyFromDictionary(onc_object);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(success);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_data->set_certificate_pattern(pattern);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateEAP(const base::DictionaryValue& eap,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  NetworkUIData* ui_data) {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string client_cert_type;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (eap.GetStringWithoutPathExpansion(onc::eap::kClientCertType,
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        &client_cert_type)) {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateClientCertType(client_cert_type, ui_data);
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateIPsec(const base::DictionaryValue& ipsec,
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    NetworkUIData* ui_data) {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string client_cert_type;
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (ipsec.GetStringWithoutPathExpansion(onc::vpn::kClientCertType,
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          &client_cert_type)) {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateClientCertType(client_cert_type, ui_data);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateOpenVPN(const base::DictionaryValue& openvpn,
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      NetworkUIData* ui_data) {
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string client_cert_type;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (openvpn.GetStringWithoutPathExpansion(onc::vpn::kClientCertType,
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            &client_cert_type)) {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateClientCertType(client_cert_type, ui_data);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateONCHierarchy(const onc::OncValueSignature& signature,
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const base::DictionaryValue& onc_object,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           NetworkUIData* ui_data) {
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (&signature == &onc::kCertificatePatternSignature)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateCertificatePattern(onc_object, ui_data);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (&signature == &onc::kEAPSignature)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateEAP(onc_object, ui_data);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (&signature == &onc::kIPsecSignature)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateIPsec(onc_object, ui_data);
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (&signature == &onc::kOpenVPNSignature)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateOpenVPN(onc_object, ui_data);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Recurse into nested objects.
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd();
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       it.Advance()) {
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::DictionaryValue* inner_object;
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!it.value().GetAsDictionary(&inner_object))
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      continue;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const onc::OncFieldSignature* field_signature =
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GetFieldSignature(signature, it.key());
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TranslateONCHierarchy(*field_signature->value_signature, *inner_object,
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          ui_data);
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// static
222a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<NetworkUIData> NetworkUIData::CreateFromONC(
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onc::ONCSource onc_source,
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::DictionaryValue& onc_network) {
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<NetworkUIData> ui_data(new NetworkUIData());
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TranslateONCHierarchy(onc::kNetworkConfigurationSignature, onc_network,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        ui_data.get());
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_data->set_onc_source(onc_source);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ui_data.Pass();
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
235