blob: 2396cab14935ec67c173b4b68dd33b8e0451de4d [file] [log] [blame]
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Zhiyi Zhangaf7c2902019-03-14 22:13:21 -07003 * Copyright (c) 2017-2019, Regents of the University of California.
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -08004 *
5 * This file is part of ndncert, a certificate management system based on NDN.
6 *
7 * ndncert is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
10 *
11 * ndncert 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 General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License along with
16 * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ndncert authors and contributors.
19 */
20
21#include "client-config.hpp"
Zhiyi Zhang0453dbb2020-04-28 22:39:17 -070022
Zhiyi Zhang5ebeb692017-03-10 14:13:01 -080023#include <ndn-cxx/util/io.hpp>
Zhiyi Zhangcaab5462019-10-18 13:41:02 -070024#include <fstream>
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080025
26namespace ndn {
27namespace ndncert {
28
29void
30ClientConfig::load(const std::string& fileName)
31{
Zhiyi Zhange4ee8222017-12-08 22:43:04 -080032 JsonSection config;
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080033 try {
Zhiyi Zhange4ee8222017-12-08 22:43:04 -080034 boost::property_tree::read_json(fileName, config);
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080035 }
Zhiyi Zhang8da54d62019-11-21 00:03:05 -080036 catch (const std::exception& error) {
37 BOOST_THROW_EXCEPTION(Error("Failed to parse configuration file " + fileName + ", " + error.what()));
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080038 }
39
Zhiyi Zhange4ee8222017-12-08 22:43:04 -080040 if (config.begin() == config.end()) {
Zhiyi Zhang8da54d62019-11-21 00:03:05 -080041 BOOST_THROW_EXCEPTION(Error("Error processing configuration file: " + fileName + ", no data"));
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080042 }
43
Zhiyi Zhange4ee8222017-12-08 22:43:04 -080044 load(config);
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080045}
46
47void
Zhiyi Zhange4ee8222017-12-08 22:43:04 -080048ClientConfig::load(const JsonSection& configSection)
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080049{
50 m_caItems.clear();
Zhiyi Zhange4ee8222017-12-08 22:43:04 -080051 auto caList = configSection.get_child("ca-list");
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080052 auto it = caList.begin();
53 for (; it != caList.end(); it++) {
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +080054 m_caItems.push_back(extractCaItem(it->second));
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080055 }
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +080056 m_localNdncertAnchor = configSection.get("local-ndncert-anchor", "");
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080057}
58
Zhiyi Zhangcaab5462019-10-18 13:41:02 -070059void
60ClientConfig::save(const std::string& fileName)
61{
62 JsonSection configJson;
63 JsonSection caList;
64 std::stringstream ss;
65 for (const auto& item : m_caItems) {
66 JsonSection caItem;
Suyong Won256c9062020-05-11 02:45:56 -070067 caItem.put("ca-prefix", item.m_caPrefix.toUri());
Zhiyi Zhangcaab5462019-10-18 13:41:02 -070068 caItem.put("ca-info", item.m_caInfo);
69 caItem.put("probe", item.m_probe);
70 ss.str(std::string());
71 io::save(item.m_anchor, ss);
72 caItem.put("certificate", ss.str());
73 caList.push_back(std::make_pair("", caItem));
74 }
75 configJson.add_child("ca-list", caList);
76 ss.str(std::string());
77 boost::property_tree::write_json(ss, configJson);
78
79 std::ofstream configFile;
80 configFile.open(fileName, std::ios::trunc);
81 configFile << ss.str();
82 configFile.close();
83}
84
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +080085ClientCaItem
Suyong Won19fba4d2020-05-09 13:39:46 -070086ClientConfig::extractCaItem(const JsonSection& configSection)
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -080087{
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +080088 ClientCaItem item;
Suyong Won256c9062020-05-11 02:45:56 -070089 item.m_caPrefix = Name(configSection.get("ca-prefix", ""));
90 if (item.m_caPrefix.empty()) {
Zhiyi Zhang8da54d62019-11-21 00:03:05 -080091 BOOST_THROW_EXCEPTION(Error("Cannot read ca-prefix from the config file"));
92 }
Suyong Won19fba4d2020-05-09 13:39:46 -070093 item.m_caInfo = configSection.get("ca-info", "");
94 item.m_probe = configSection.get("probe", "");
95 std::istringstream ss(configSection.get("certificate", ""));
tylerliu0b6d0db2020-09-28 17:52:02 -070096 item.m_maxSuffixLength = configSection.get<size_t>(CONFIG_MAX_SUFFIX_LENGTH, 1);
Suyong Won19fba4d2020-05-09 13:39:46 -070097 auto anchor = io::load<security::v2::Certificate>(ss);
Zhiyi Zhang8da54d62019-11-21 00:03:05 -080098 if (anchor == nullptr) {
99 BOOST_THROW_EXCEPTION(Error("Cannot load the certificate from config file"));
100 }
101 item.m_anchor = *anchor;
Zhiyi Zhang1c0bd372017-12-18 18:32:55 +0800102 return item;
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -0800103}
104
105void
106ClientConfig::removeCaItem(const Name& caName)
107{
Suyong Won256c9062020-05-11 02:45:56 -0700108 m_caItems.remove_if([&](const ClientCaItem& item) { return item.m_caPrefix == caName; });
Zhiyi Zhang32dbb9f2017-02-16 15:15:10 -0800109}
110
Zhiyi Zhang0453dbb2020-04-28 22:39:17 -0700111} // namespace ndncert
112} // namespace ndn