blob: 42e95347a5d15433f0bd05f715caa6b430225ad8 [file] [log] [blame]
Yingdi Yub8f8b342015-04-27 11:06:42 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Yingdi Yu6ee2d362015-07-16 21:48:05 -07003 * Copyright (c) 2013-2017 Regents of the University of California.
Yingdi Yub8f8b342015-04-27 11:06:42 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
Alexander Afanasyev97709c02016-08-25 19:58:30 -070022#ifndef NDN_SECURITY_PIB_CERTIFICATE_CONTAINER_HPP
23#define NDN_SECURITY_PIB_CERTIFICATE_CONTAINER_HPP
Yingdi Yub8f8b342015-04-27 11:06:42 -070024
25#include <set>
Yingdi Yucbe72b02015-11-25 17:35:37 -080026#include <unordered_map>
Yingdi Yu6ee2d362015-07-16 21:48:05 -070027#include "../v2/certificate.hpp"
Yingdi Yub8f8b342015-04-27 11:06:42 -070028
29namespace ndn {
30namespace security {
Yingdi Yu6ee2d362015-07-16 21:48:05 -070031namespace pib {
Yingdi Yub8f8b342015-04-27 11:06:42 -070032
33class PibImpl;
34
Yingdi Yucbe72b02015-11-25 17:35:37 -080035namespace detail {
36class KeyImpl;
37} // namespace detail
38
39/**
40 * @brief Container of certificates of a key
41 *
42 * The container is used to search/enumerate certificates of a key.
43 * The container can be created only by detail::KeyImpl.
44 */
45class CertificateContainer : noncopyable
Yingdi Yub8f8b342015-04-27 11:06:42 -070046{
47public:
Yingdi Yucbe72b02015-11-25 17:35:37 -080048 class const_iterator : public std::iterator<std::forward_iterator_tag, const v2::Certificate>
Yingdi Yub8f8b342015-04-27 11:06:42 -070049 {
50 public:
Yingdi Yucbe72b02015-11-25 17:35:37 -080051 const_iterator();
Yingdi Yub8f8b342015-04-27 11:06:42 -070052
Yingdi Yu6ee2d362015-07-16 21:48:05 -070053 v2::Certificate
Yingdi Yub8f8b342015-04-27 11:06:42 -070054 operator*();
55
56 const_iterator&
57 operator++();
58
59 const_iterator
60 operator++(int);
61
62 bool
Yingdi Yucbe72b02015-11-25 17:35:37 -080063 operator==(const const_iterator& other) const;
Yingdi Yub8f8b342015-04-27 11:06:42 -070064
65 bool
Yingdi Yucbe72b02015-11-25 17:35:37 -080066 operator!=(const const_iterator& other) const;
Yingdi Yub8f8b342015-04-27 11:06:42 -070067
68 private:
Yingdi Yucbe72b02015-11-25 17:35:37 -080069 const_iterator(std::set<Name>::const_iterator it, const CertificateContainer& container);
Yingdi Yub8f8b342015-04-27 11:06:42 -070070
71 private:
72 std::set<Name>::const_iterator m_it;
Yingdi Yucbe72b02015-11-25 17:35:37 -080073 const CertificateContainer* m_container;
74
75 friend class CertificateContainer;
Yingdi Yub8f8b342015-04-27 11:06:42 -070076 };
77
78 typedef const_iterator iterator;
79
80public:
Yingdi Yub8f8b342015-04-27 11:06:42 -070081 const_iterator
82 begin() const;
83
84 const_iterator
85 end() const;
86
87 const_iterator
88 find(const Name& certName) const;
89
90 size_t
91 size() const;
92
Yingdi Yucbe72b02015-11-25 17:35:37 -080093 /**
94 * @brief Add @p certificate into the container
95 * @throw std::invalid_argument the name of @p certificate does not match the key name
96 */
97 void
98 add(const v2::Certificate& certificate);
99
100 /**
101 * @brief Remove a certificate with @p certName from the container
102 * @throw std::invalid_argument @p certName does not match the key name
103 */
104 void
105 remove(const Name& certName);
106
107 /**
108 * @brief Get a certificate with @p certName from the container
109 * @throw std::invalid_argument @p certName does not match the key name
110 * @throw Pib::Error the certificate does not exist
111 */
112 v2::Certificate
113 get(const Name& certName) const;
114
115 /**
116 * @brief Check if the container is consistent with the backend storage
117 *
118 * @note this method is heavyweight and should be used in debugging mode only.
119 */
120 bool
121 isConsistent() const;
122
123NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PRIVATE:
124 /**
125 * @brief Create certificate container for a key with @p keyName
126 * @param impl The PIB backend implementation.
127 */
128 CertificateContainer(const Name& keyName, shared_ptr<PibImpl> impl);
129
130 const std::set<Name>&
131 getCertNames() const
132 {
133 return m_certNames;
134 }
135
136 const std::unordered_map<Name, v2::Certificate>&
137 getCache() const
138 {
139 return m_certs;
140 }
141
Yingdi Yub8f8b342015-04-27 11:06:42 -0700142private:
Yingdi Yucbe72b02015-11-25 17:35:37 -0800143 Name m_keyName;
Yingdi Yub8f8b342015-04-27 11:06:42 -0700144 std::set<Name> m_certNames;
Yingdi Yucbe72b02015-11-25 17:35:37 -0800145 /// @brief Cache of loaded certificates
146 mutable std::unordered_map<Name, v2::Certificate> m_certs;
147
Yingdi Yub8f8b342015-04-27 11:06:42 -0700148 shared_ptr<PibImpl> m_impl;
Yingdi Yucbe72b02015-11-25 17:35:37 -0800149
150 friend class detail::KeyImpl;
Yingdi Yub8f8b342015-04-27 11:06:42 -0700151};
152
Yingdi Yu6ee2d362015-07-16 21:48:05 -0700153} // namespace pib
154
155using pib::CertificateContainer;
156
Yingdi Yub8f8b342015-04-27 11:06:42 -0700157} // namespace security
158} // namespace ndn
159
Alexander Afanasyev97709c02016-08-25 19:58:30 -0700160#endif // NDN_SECURITY_PIB_CERTIFICATE_CONTAINER_HPP