blob: e2abeabb7c1710b72e659edff64b65eb471af184 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/cros/network_ui_data.h"
#include "base/logging.h"
#include "chrome/browser/chromeos/cros/network_library.h"
namespace chromeos {
// Top-level UI data dictionary keys.
const char NetworkUIData::kKeyONCSource[] = "onc_source";
const char NetworkUIData::kKeyCertificatePattern[] = "certificate_pattern";
const char NetworkUIData::kKeyCertificateType[] = "certificate_type";
// Property names for per-property data stored under |kKeyProperties|.
const EnumMapper<NetworkUIData::ONCSource>::Pair
NetworkUIData::kONCSourceTable[] = {
{ "user_import", NetworkUIData::ONC_SOURCE_USER_IMPORT },
{ "device_policy", NetworkUIData::ONC_SOURCE_DEVICE_POLICY },
{ "user_policy", NetworkUIData::ONC_SOURCE_USER_POLICY },
};
// Property names for per-property data stored under |kKeyProperties|.
const EnumMapper<ClientCertType>::Pair
NetworkUIData::kClientCertTable[] = {
{ "none", CLIENT_CERT_TYPE_NONE },
{ "pattern", CLIENT_CERT_TYPE_PATTERN },
{ "ref", CLIENT_CERT_TYPE_REF },
};
// Property names for the per-property dictionary.
const char NetworkPropertyUIData::kKeyController[] = "controller";
const char NetworkPropertyUIData::kKeyDefaultValue[] = "default_value";
NetworkUIData::NetworkUIData()
: onc_source_(ONC_SOURCE_NONE),
certificate_type_(CLIENT_CERT_TYPE_NONE) {
}
NetworkUIData::NetworkUIData(const DictionaryValue& dict) {
std::string source;
if (dict.GetString(kKeyONCSource, &source)) {
onc_source_ = GetONCSourceMapper().Get(source);
} else {
onc_source_ = ONC_SOURCE_NONE;
}
const DictionaryValue* cert_dict = NULL;
if (dict.GetDictionary(kKeyCertificatePattern, &cert_dict) && cert_dict)
certificate_pattern_.CopyFromDictionary(*cert_dict);
std::string type_string;
if (dict.GetString(kKeyCertificateType, &type_string)) {
certificate_type_ = GetClientCertMapper().Get(type_string);
} else {
certificate_type_ = CLIENT_CERT_TYPE_NONE;
}
DCHECK(certificate_type_ != CLIENT_CERT_TYPE_PATTERN ||
(certificate_type_ == CLIENT_CERT_TYPE_PATTERN &&
!certificate_pattern_.Empty()));
}
NetworkUIData::~NetworkUIData() {
}
void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const {
dict->Clear();
std::string source_string(GetONCSourceMapper().GetKey(onc_source_));
if (!source_string.empty())
dict->SetString(kKeyONCSource, source_string);
std::string type_string(GetClientCertMapper().GetKey(certificate_type_));
switch (certificate_type_) {
case CLIENT_CERT_TYPE_REF:
dict->SetString(kKeyCertificateType, "ref");
break;
case CLIENT_CERT_TYPE_PATTERN:
dict->SetString(kKeyCertificateType, "pattern");
if (!certificate_pattern_.Empty()) {
dict->Set(kKeyCertificatePattern,
certificate_pattern_.CreateAsDictionary());
}
case CLIENT_CERT_TYPE_NONE:
default:
break;
}
}
// static
EnumMapper<NetworkUIData::ONCSource>& NetworkUIData::GetONCSourceMapper() {
CR_DEFINE_STATIC_LOCAL(EnumMapper<ONCSource>, mapper,
(kONCSourceTable, arraysize(kONCSourceTable),
ONC_SOURCE_NONE));
return mapper;
}
// static
EnumMapper<ClientCertType>& NetworkUIData::GetClientCertMapper() {
CR_DEFINE_STATIC_LOCAL(EnumMapper<ClientCertType>, mapper,
(kClientCertTable, arraysize(kClientCertTable),
CLIENT_CERT_TYPE_NONE));
return mapper;
}
NetworkPropertyUIData::NetworkPropertyUIData()
: controller_(CONTROLLER_USER) {
}
NetworkPropertyUIData::~NetworkPropertyUIData() {
}
NetworkPropertyUIData::NetworkPropertyUIData(Controller controller,
base::Value* default_value)
: controller_(controller),
default_value_(default_value) {
}
NetworkPropertyUIData::NetworkPropertyUIData(
const NetworkUIData& ui_data) {
Reset(ui_data);
}
void NetworkPropertyUIData::Reset(const NetworkUIData& ui_data) {
default_value_.reset();
controller_ = ui_data.is_managed() ? CONTROLLER_POLICY : CONTROLLER_USER;
}
void NetworkPropertyUIData::ParseOncProperty(
const NetworkUIData& ui_data,
const base::DictionaryValue* onc,
const std::string& property_key) {
Reset(ui_data);
if (!onc || controller_ == CONTROLLER_USER)
return;
size_t pos = property_key.find_last_of('.');
std::string recommended_property_key;
std::string property_basename(property_key);
if (pos != std::string::npos) {
recommended_property_key = property_key.substr(0, pos + 1);
property_basename = property_key.substr(pos + 1);
}
recommended_property_key += "Recommended";
const base::ListValue* recommended_keys = NULL;
if (onc->GetList(recommended_property_key, &recommended_keys)) {
base::StringValue basename_value(property_basename);
if (recommended_keys->Find(basename_value) != recommended_keys->end()) {
controller_ = CONTROLLER_USER;
const base::Value* default_value = NULL;
if (onc->Get(property_key, &default_value))
default_value_.reset(default_value->DeepCopy());
}
}
}
} // namespace chromeos