1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chromeos/network/certificate_pattern.h"
6
7 #include "base/logging.h"
8 #include "base/values.h"
9 #include "components/onc/onc_constants.h"
10
11 namespace chromeos {
12
13 namespace {
14
GetAsListOfStrings(const base::Value & value,std::vector<std::string> * result)15 bool GetAsListOfStrings(const base::Value& value,
16 std::vector<std::string>* result) {
17 const base::ListValue* list = NULL;
18 if (!value.GetAsList(&list))
19 return false;
20 result->clear();
21 result->reserve(list->GetSize());
22 for (size_t i = 0; i < list->GetSize(); i++) {
23 std::string item;
24 if (!list->GetString(i, &item))
25 return false;
26 result->push_back(item);
27 }
28 return true;
29 }
30
31 } // namespace
32
33 ////////////////////////////////////////////////////////////////////////////////
34 // IssuerSubjectPattern
IssuerSubjectPattern(const std::string & common_name,const std::string & locality,const std::string & organization,const std::string & organizational_unit)35 IssuerSubjectPattern::IssuerSubjectPattern(
36 const std::string& common_name,
37 const std::string& locality,
38 const std::string& organization,
39 const std::string& organizational_unit)
40 : common_name_(common_name),
41 locality_(locality),
42 organization_(organization),
43 organizational_unit_(organizational_unit) {
44 }
45
IssuerSubjectPattern()46 IssuerSubjectPattern::IssuerSubjectPattern() {
47 }
48
~IssuerSubjectPattern()49 IssuerSubjectPattern::~IssuerSubjectPattern() {
50 }
51
Empty() const52 bool IssuerSubjectPattern::Empty() const {
53 return common_name_.empty() && locality_.empty() && organization_.empty() &&
54 organizational_unit_.empty();
55 }
56
Clear()57 void IssuerSubjectPattern::Clear() {
58 common_name_.clear();
59 locality_.clear();
60 organization_.clear();
61 organizational_unit_.clear();
62 }
63
ReadFromONCDictionary(const base::DictionaryValue & dict)64 void IssuerSubjectPattern::ReadFromONCDictionary(
65 const base::DictionaryValue& dict) {
66 Clear();
67
68 dict.GetStringWithoutPathExpansion(onc::client_cert::kCommonName,
69 &common_name_);
70 dict.GetStringWithoutPathExpansion(onc::client_cert::kLocality, &locality_);
71 dict.GetStringWithoutPathExpansion(onc::client_cert::kOrganization,
72 &organization_);
73 dict.GetStringWithoutPathExpansion(onc::client_cert::kOrganizationalUnit,
74 &organizational_unit_);
75 }
76
77 ////////////////////////////////////////////////////////////////////////////////
78 // CertificatePattern
79
CertificatePattern()80 CertificatePattern::CertificatePattern() {
81 }
82
~CertificatePattern()83 CertificatePattern::~CertificatePattern() {
84 }
85
Empty() const86 bool CertificatePattern::Empty() const {
87 return issuer_ca_pems_.empty() && issuer_.Empty() && subject_.Empty();
88 }
89
Clear()90 void CertificatePattern::Clear() {
91 issuer_ca_pems_.clear();
92 issuer_.Clear();
93 subject_.Clear();
94 enrollment_uri_list_.clear();
95 }
96
ReadFromONCDictionary(const base::DictionaryValue & dict)97 bool CertificatePattern::ReadFromONCDictionary(
98 const base::DictionaryValue& dict) {
99 Clear();
100
101 const base::DictionaryValue* child_dict = NULL;
102 const base::ListValue* child_list = NULL;
103
104 // All of these are optional.
105 if (dict.GetListWithoutPathExpansion(onc::client_cert::kIssuerCAPEMs,
106 &child_list) &&
107 child_list) {
108 if (!GetAsListOfStrings(*child_list, &issuer_ca_pems_))
109 return false;
110 }
111 if (dict.GetDictionaryWithoutPathExpansion(onc::client_cert::kIssuer,
112 &child_dict) &&
113 child_dict) {
114 issuer_.ReadFromONCDictionary(*child_dict);
115 }
116 child_dict = NULL;
117 if (dict.GetDictionaryWithoutPathExpansion(onc::client_cert::kSubject,
118 &child_dict) &&
119 child_dict) {
120 subject_.ReadFromONCDictionary(*child_dict);
121 }
122 child_list = NULL;
123 if (dict.GetListWithoutPathExpansion(onc::client_cert::kEnrollmentURI,
124 &child_list) &&
125 child_list) {
126 if (!GetAsListOfStrings(*child_list, &enrollment_uri_list_))
127 return false;
128 }
129
130 return true;
131 }
132
133 } // namespace chromeos
134