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
11namespace chromeos {
12
13namespace {
14
15bool 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
35IssuerSubjectPattern::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
46IssuerSubjectPattern::IssuerSubjectPattern() {
47}
48
49IssuerSubjectPattern::~IssuerSubjectPattern() {
50}
51
52bool IssuerSubjectPattern::Empty() const {
53  return common_name_.empty() && locality_.empty() && organization_.empty() &&
54         organizational_unit_.empty();
55}
56
57void IssuerSubjectPattern::Clear() {
58  common_name_.clear();
59  locality_.clear();
60  organization_.clear();
61  organizational_unit_.clear();
62}
63
64void 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
80CertificatePattern::CertificatePattern() {
81}
82
83CertificatePattern::~CertificatePattern() {
84}
85
86bool CertificatePattern::Empty() const {
87  return issuer_ca_pems_.empty() && issuer_.Empty() && subject_.Empty();
88}
89
90void CertificatePattern::Clear() {
91  issuer_ca_pems_.clear();
92  issuer_.Clear();
93  subject_.Clear();
94  enrollment_uri_list_.clear();
95}
96
97bool 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