| // 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 "chromeos/network/certificate_pattern.h" |
| |
| #include "base/logging.h" |
| #include "base/values.h" |
| #include "components/onc/onc_constants.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| |
| // Keys for converting classes below to/from dictionaries. |
| const char kCommonNameKey[] = "CommonName"; |
| const char kLocalityKey[] = "Locality"; |
| const char kOrganizationKey[] = "Organization"; |
| const char kOrganizationalUnitKey[] = "OrganizationalUnit"; |
| const char kIssuerKey[] = "Issuer"; |
| const char kSubjectKey[] = "Subject"; |
| const char kEnrollmentUriKey[] = "EnrollmentURI"; |
| |
| bool GetAsListOfStrings(const base::Value& value, |
| std::vector<std::string>* result) { |
| const base::ListValue* list = NULL; |
| if (!value.GetAsList(&list)) |
| return false; |
| result->clear(); |
| result->reserve(list->GetSize()); |
| for (size_t i = 0; i < list->GetSize(); i++) { |
| std::string item; |
| if (!list->GetString(i, &item)) |
| return false; |
| result->push_back(item); |
| } |
| return true; |
| } |
| |
| base::ListValue* CreateListFromStrings( |
| const std::vector<std::string>& strings) { |
| base::ListValue* new_list = new base::ListValue; |
| for (std::vector<std::string>::const_iterator iter = strings.begin(); |
| iter != strings.end(); ++iter) { |
| new_list->Append(new base::StringValue(*iter)); |
| } |
| return new_list; |
| } |
| |
| } // namespace |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // IssuerSubjectPattern |
| IssuerSubjectPattern::IssuerSubjectPattern(const std::string& common_name, |
| const std::string& locality, |
| const std::string& organization, |
| const std::string& organizational_unit) |
| : common_name_(common_name), |
| locality_(locality), |
| organization_(organization), |
| organizational_unit_(organizational_unit) { } |
| |
| IssuerSubjectPattern::IssuerSubjectPattern() {} |
| |
| IssuerSubjectPattern::~IssuerSubjectPattern() {} |
| |
| bool IssuerSubjectPattern::Empty() const { |
| return common_name_.empty() && |
| locality_.empty() && |
| organization_.empty() && |
| organizational_unit_.empty(); |
| } |
| |
| void IssuerSubjectPattern::Clear() { |
| common_name_.clear(); |
| locality_.clear(); |
| organization_.clear(); |
| organizational_unit_.clear(); |
| } |
| |
| base::DictionaryValue* IssuerSubjectPattern::CreateAsDictionary() const { |
| base::DictionaryValue* dict = new base::DictionaryValue; |
| if (!common_name_.empty()) |
| dict->SetString(kCommonNameKey, common_name_); |
| if (!locality_.empty()) |
| dict->SetString(kLocalityKey, locality_); |
| if (!organization_.empty()) |
| dict->SetString(kOrganizationKey, organization_); |
| if (!organizational_unit_.empty()) |
| dict->SetString(kOrganizationalUnitKey, organizational_unit_); |
| return dict; |
| } |
| |
| bool IssuerSubjectPattern::CopyFromDictionary( |
| const base::DictionaryValue& dict) { |
| Clear(); |
| dict.GetString(kCommonNameKey, &common_name_); |
| dict.GetString(kLocalityKey, &locality_); |
| dict.GetString(kOrganizationKey, &organization_); |
| dict.GetString(kOrganizationalUnitKey, &organizational_unit_); |
| // If the dictionary wasn't empty, but we are, or vice versa, then something |
| // went wrong. |
| DCHECK(dict.empty() == Empty()); |
| if (dict.empty() != Empty()) |
| return false; |
| return true; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // CertificatePattern |
| |
| CertificatePattern::CertificatePattern() {} |
| |
| CertificatePattern::~CertificatePattern() {} |
| |
| bool CertificatePattern::Empty() const { |
| return issuer_ca_pems_.empty() && |
| issuer_.Empty() && |
| subject_.Empty(); |
| } |
| |
| void CertificatePattern::Clear() { |
| issuer_ca_pems_.clear(); |
| issuer_.Clear(); |
| subject_.Clear(); |
| enrollment_uri_list_.clear(); |
| } |
| |
| base::DictionaryValue* CertificatePattern::CreateAsDictionary() const { |
| base::DictionaryValue* dict = new base::DictionaryValue; |
| |
| if (!issuer_ca_pems_.empty()) { |
| dict->Set(onc::certificate::kIssuerCAPEMs, |
| CreateListFromStrings(issuer_ca_pems_)); |
| } |
| |
| if (!issuer_.Empty()) |
| dict->Set(kIssuerKey, issuer_.CreateAsDictionary()); |
| |
| if (!subject_.Empty()) |
| dict->Set(kSubjectKey, subject_.CreateAsDictionary()); |
| |
| if (!enrollment_uri_list_.empty()) |
| dict->Set(kEnrollmentUriKey, CreateListFromStrings(enrollment_uri_list_)); |
| return dict; |
| } |
| |
| bool CertificatePattern::CopyFromDictionary(const base::DictionaryValue &dict) { |
| const base::DictionaryValue* child_dict = NULL; |
| const base::ListValue* child_list = NULL; |
| Clear(); |
| |
| // All of these are optional. |
| if (dict.GetList(onc::certificate::kIssuerCAPEMs, &child_list) && |
| child_list) { |
| if (!GetAsListOfStrings(*child_list, &issuer_ca_pems_)) |
| return false; |
| } |
| if (dict.GetDictionary(kIssuerKey, &child_dict) && child_dict) { |
| if (!issuer_.CopyFromDictionary(*child_dict)) |
| return false; |
| } |
| child_dict = NULL; |
| if (dict.GetDictionary(kSubjectKey, &child_dict) && child_dict) { |
| if (!subject_.CopyFromDictionary(*child_dict)) |
| return false; |
| } |
| child_list = NULL; |
| if (dict.GetList(kEnrollmentUriKey, &child_list) && child_list) { |
| if (!GetAsListOfStrings(*child_list, &enrollment_uri_list_)) |
| return false; |
| } |
| |
| // If we didn't copy anything from the dictionary, then it had better be |
| // empty. |
| DCHECK(dict.empty() == Empty()); |
| if (dict.empty() != Empty()) |
| return false; |
| |
| return true; |
| } |
| |
| } // namespace chromeos |