blob: 83de6a40e26e8c34991588b7fef258923cd9ffdb [file] [log] [blame]
tylerliu01d63ca2020-10-06 16:29:23 -07001//
2// Created by Tyler on 10/6/20.
3//
4
5#include "assignment-param.hpp"
6
7namespace ndn {
8namespace ndncert {
9
10_LOG_INIT(ndncert.assignment.param);
11NDNCERT_REGISTER_FUNCFACTORY(AssignmentParam, "param");
12
13AssignmentParam::AssignmentParam()
14 : NameAssignmentFuncFactory("param")
15{
16}
17
18NameAssignmentFunc
19AssignmentParam::getFunction(const std::string &factoryParam) {
20 std::list<std::string> paramList;
21 size_t index = 0, startIndex = 0;
22 while ((index = factoryParam.find(":", startIndex)) != factoryParam.npos) {
23 paramList.push_back(factoryParam.substr(startIndex, index));
24 startIndex = index + 1;
25 }
26 if (startIndex != factoryParam.size()) {
27 paramList.push_back(factoryParam.substr(startIndex));
28 }
29 return ParamAssignmentFunc(paramList);
30}
31
32AssignmentParam::ParamAssignmentFunc::ParamAssignmentFunc(std::list<std::string> paramList)
33 : m_paramList(std::move(paramList))
34{}
35
36std::vector<PartialName>
37AssignmentParam::ParamAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
38{
39 if (params.size() > m_paramList.size() * 8) { // might be attack
40 BOOST_THROW_EXCEPTION(std::runtime_error("Too many extra parameters given"));
41 }
42 std::map<std::string, std::string> paramMap;
43 for (const auto& param : params) {
44 paramMap[std::get<0>(param)] = std::get<1>(param);
45 }
46
47 //construct name
48 PartialName name;
49 for (const auto& field : m_paramList) {
50 auto it = paramMap.find(field);
51 if (it == paramMap.end()) {
52 return std::vector<PartialName>();
53 } else {
54 name.append(it->second);
55 }
56 }
57 std::vector<PartialName> nameList;
58 nameList.push_back(name);
59 return nameList;
60}
61
62}
63}