e010b72cade80ca3b164476235f77dd583493c5b
[platform/core/system/libdbuspolicy.git] / src / internal / storage_backend_serialized.hpp
1 #pragma once
2 /*  MIT License
3  *
4  * Copyright (c) 2019-2020 Samsung Electronics Co., Ltd
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is furnished
11  * to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE. */
23
24 #include "policy.hpp"
25 #include "serialization_backend.hpp"
26 #include <boost/tokenizer.hpp>
27 #include <sys/types.h>
28
29 namespace ldp_serialized {
30
31 class StorageBackendSerialized
32 {
33 public:
34         StorageBackendSerialized();
35         ~StorageBackendSerialized();
36
37         bool init(const char *filename, bool verify = false);
38         bool initFromData(const uint8_t *serialized_data, size_t length, bool verify = false);
39         void release();
40
41         void printContent(bool xml_format = false) const;
42
43         // Supported template parameters are:
44         // MatchItemOwn, MatchItemSend, MatchItemReceive
45         // and - only for Contexts - MatchItemAccess
46         template <typename MatchItem>
47         ldp_xml_parser::DecisionItem getDecisionItemContextMandatory(const MatchItem &item) const;
48         template <typename MatchItem>
49         ldp_xml_parser::DecisionItem getDecisionItemContextDefault(const MatchItem &item) const;
50         template <typename MatchItem>
51         ldp_xml_parser::DecisionItem getDecisionItemUser(uid_t uid, const MatchItem &item) const;
52         template <typename MatchItem>
53         ldp_xml_parser::DecisionItem getDecisionItemGroup(gid_t gid, const MatchItem &item) const;
54
55         // This works with MatchItem set to MatchItemOwn, MatchItemSend or MatchItemReceive
56         // This is needed for filtering mapGroups. Check NaivePolicyChecker.
57         template <typename MatchItem>
58         bool existsPolicyForGroup(gid_t gid) const;
59
60 private:
61         typedef typename ldp_serialization::SerializationBackend::Storage Backend;
62         Backend impl;
63
64         // Set max size of serialized file to prevent mmap with unexpected memory size.
65         // 1MB. Adjustable
66         static const size_t MAX_SFILE_SIZE{1024 * 1024};
67
68         int __fd{-1};
69         uint8_t *__mem;
70         size_t __length{0};
71
72         void releaseMMap();
73         void releaseFD();
74
75         template <typename MatchItem>
76         auto getPolicySet() const;
77
78         template <typename T, typename P>
79         ldp_xml_parser::DecisionItem getDecisionItem(const T &item, const P &policy, ldp_serialization::ItemsType) const;
80
81         template <typename T, typename P>
82         ldp_xml_parser::DecisionItem getDecisionItem(const T &item, const P &policy, ldp_serialization::TreeType) const;
83
84         template <typename T, typename P>
85         ldp_xml_parser::DecisionItem getDecisionItem(const T &item, const P &policy) const;
86
87         template <typename P>
88         ldp_xml_parser::DecisionItem getDecisionItem(const ldp_xml_parser::MatchItemSend &item, const P &policy) const;
89
90         template <typename MatchItem, typename Map>
91         ldp_xml_parser::DecisionItem getDecisionItem(const MatchItem &item, const Map &map, id_t id) const;
92
93         typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
94
95         template <typename OwnNode>
96         auto getDecisionItemFromTree(const OwnNode &node,
97                                          const tokenizer::iterator &tokens,
98                                          tokenizer::iterator &iterator) const;
99
100         template <typename T, typename I>
101         bool match(const T &match, const I &item) const;
102
103         template <typename I>
104         bool match(const ldp_xml_parser::MatchItemAccess &match, const I &item) const;
105
106         template <typename DI>
107         ldp_xml_parser::DecisionItem makeDecisionItem(const DI &item) const;
108
109         template <typename String>
110         boost::string_ref toStringRef(const String &str) const;
111 };
112
113 }