int __internal_init(BusType bus_type, const char* const config_name)
{
- policy_checker().clearDb(bus_type);
- auto err = static_parser().parsePolicyConfigFile(bus_type, get_str(config_name));
+ auto ok = policy_checker().initDb(bus_type, get_str(config_name));
if (tslog::enabled())
memory_dump(bus_type);
- return err;
+ return ok ? 0 : -1;
}
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
getPolicyDb(bus_type).initializeGroups(uid, gid);
}
-void NaivePolicyChecker::clearDb(BusType bus_type)
+bool NaivePolicyChecker::initDb(BusType bus_type, const char *config_name)
{
- getPolicyDb(bus_type).clear();
+ return getPolicyDb(bus_type).init(config_name);
}
void NaivePolicyChecker::printContent(BusType bus_type)
/** Clears all db data, useful for reloading configuration
* during testing.
*/
- void clearDb(BusType bus_type);
+ bool initDb(BusType bus_type, const char *filename);
void updateGroupDb(BusType bus_type, uid_t uid, gid_t gid);
}
/********************* NaivePolicyDb **********************/
-template <typename T>
-void NaivePolicyDb::addItem(const PolicyType policy_type,
- const PolicyTypeValue policy_type_value,
- T &item) {
- tslog::log("Add item: ", item, ", decision: ", item.getDecision(), "\n");
- backend.addItem(policy_type, policy_type_value, item);
-}
-
void NaivePolicyDb::printContent() const
{
backend.printContent();
return mapGroups[type_list::IDX<T, MatchItemTypes>::idx][uid];
}
-void NaivePolicyDb::clear() {
- backend.clear();
+bool NaivePolicyDb::init(const char *filename) {
+ return backend.init(filename);
}
template <typename T>
*/
#define T_INSTANTIATION(T) \
template const VGid *NaivePolicyDb::getGroups<MatchItem##T>(uid_t, gid_t) const; \
- template void NaivePolicyDb::addItem(const PolicyType policy_type, const PolicyTypeValue policy_type_value, Item##T &item); \
template const Policy##T &NaivePolicyDb::getPolicyContextMandatory() const; \
template const Policy##T &NaivePolicyDb::getPolicyContextDefault() const;
const PolicyTypeValue policy_type_value,
T &item);
- void clear();
+ bool init(const char *filename);
// The getPolicy*() methods are intended for Serializers to get
// access to policy structures.
return &__current_access;
}
-ItemBuilder::ItemBuilder()
- : __current_item_type(ItemType::GENERIC)
+ItemBuilder::ItemBuilder(ldp_xml::StorageBackendXML &storage)
+ : __storage(storage), __current_item_type(ItemType::GENERIC)
{
reset();
}
__current_item_type = ItemType::GENERIC;
}
-void ItemBuilder::generateItem(BusType bus_type, PolicyType& policy_type, PolicyTypeValue& policy_type_value) {
- NaivePolicyDb &db = policy_checker().getPolicyDb(bus_type);
+void ItemBuilder::generateItem(PolicyType& policy_type, PolicyTypeValue& policy_type_value) {
switch (__current_item_type) {
case ItemType::OWN:
__current_own.__decision = __decision;
- db.addItem(policy_type, policy_type_value, __current_own);
+ __storage.addItem(policy_type, policy_type_value, __current_own);
break;
case ItemType::SEND:
__current_send.__decision = __decision;
- db.addItem(policy_type, policy_type_value, __current_send);
+ __storage.addItem(policy_type, policy_type_value, __current_send);
break;
case ItemType::RECEIVE:
__current_receive.__decision = __decision;
- db.addItem(policy_type, policy_type_value, __current_receive);
+ __storage.addItem(policy_type, policy_type_value, __current_receive);
break;
case ItemType::ACCESS:
__current_access.__decision = __decision;
- db.addItem(policy_type, policy_type_value, __current_access);
+ __storage.addItem(policy_type, policy_type_value, __current_access);
break;
case ItemType::GENERIC:
// do nothing
/** Maximum tree node children. It is connected with proper characters which can be used in name.*/
#define MAX_CHILDREN 65
+namespace ldp_xml {
+ class StorageBackendXML;
+}
+
namespace ldp_xml_parser
{
/** Type of sent message*/
using MatchItemTypes = type_list::type_list<MatchItemOwn, MatchItemSend, MatchItemReceive, MatchItemAccess>;
- class NaivePolicyDb;
-
/** Allows to create items from given name, decision etc. */
class ItemBuilder {
private:
+ ldp_xml::StorageBackendXML &__storage;
+
DecisionItem __decision;
ItemType __current_item_type;
ItemSendReceive* getSendReceiveItem();
ItemAccess* getAccessItem();
public:
- ItemBuilder();
+ explicit ItemBuilder(ldp_xml::StorageBackendXML &storage);
~ItemBuilder();
- void generateItem(BusType bus_type, PolicyType& policy_type, PolicyTypeValue& policy_type_value);
+ void generateItem(PolicyType& policy_type, PolicyTypeValue& policy_type_value);
void reset();
void setOwnItem();
void setSendItem();
#include "storage_backend_xml.hpp"
#include "policy_containers.hpp"
+#include "xml_parser.hpp"
using namespace ldp_xml_parser;
void StorageBackendXML::addItem(const ldp_xml_parser::PolicyType policy_type,
const ldp_xml_parser::PolicyTypeValue policy_type_value,
T &item) {
+ tslog::log("Add item: ", item, ", decision: ", item.getDecision(), "\n");
pimpl->getPolicySet<typename T::match_type>().addItem(policy_type, policy_type_value, item);
}
-void StorageBackendXML::clear() {
+bool StorageBackendXML::init(const char *filename) {
pimpl.reset(new StorageBackendXMLImpl);
+ XmlParser parser(*this, filename);
+ return parser.parsePolicyConfigFile() == 0;
}
void StorageBackendXML::printContent() const {
const ldp_xml_parser::PolicyTypeValue policy_type_value,
T &item);
- void clear();
+ bool init(const char *filename);
void printContent() const;
}
void start_element_handler(void *data, const char *el, const char **attr) {
- (void)data;
- XmlParser& parser = static_parser();
+ XmlParser& parser = *reinterpret_cast<XmlParser*>(data);
try {
parser.elementStart(el, attr);
} catch (...) {
}
void end_element_handler(void *data, const char *el) {
- (void)data;
- XmlParser& parser = static_parser();
+ XmlParser& parser = *reinterpret_cast<XmlParser*>(data);
try {
parser.elementEnd(el);
} catch (...) {
}
void text_handler(void *data, const char *text, int len) {
- (void)data;
- XmlParser& parser = static_parser();
+ XmlParser& parser = *reinterpret_cast<XmlParser*>(data);
try {
parser.text(text, len);
} catch (...) {
}
bool XmlParser::isMainConfFile(const char *filename) {
- switch (curr_bus) {
- case SYSTEM_BUS:
- return strcmp(filename, SYSTEM_BUS_CONF_FILE_PRIMARY) == 0 || strcmp(filename, SYSTEM_BUS_CONF_FILE_SECONDARY) == 0;
- case SESSION_BUS:
- return strcmp(filename, SESSION_BUS_CONF_FILE_PRIMARY) == 0 || strcmp(filename, SESSION_BUS_CONF_FILE_SECONDARY) == 0;
- }
- return false;
+ return strcmp(main_filename, filename) == 0;
}
void XmlParser::setRetCode(int ret) {
}
}
-int XmlParser::parsePolicyConfigFile(BusType bus, const char *fname) {
- tslog::log("XmlParser::parsePolicyConfigFile called with filename: ", fname, "\n");
- curr_bus = bus;
- parsePolicyConfigFileInternal(fname);
+int XmlParser::parsePolicyConfigFile() {
+ tslog::log("XmlParser::parsePolicyConfigFile called with filename: ", main_filename, "\n");
+ parsePolicyConfigFileInternal(main_filename);
return ret_code;
}
auto parser = std::unique_ptr<XML_ParserStruct, std::function<void(XML_Parser)>>(XML_ParserCreate(nullptr),
[](XML_Parser p) { XML_ParserFree(p); });
+ XML_SetUserData(parser.get(), this);
XML_SetElementHandler(parser.get(), start_element_handler, end_element_handler);
XML_SetCharacterDataHandler(parser.get(), text_handler);
parseRuleAttribute(attr[i], attr[i + 1]);
}
- __builder.generateItem(curr_bus, policy_type, policy_type_value);
+ __builder.generateItem(policy_type, policy_type_value);
}
namespace {
__builder.addMessageType(__str_to_message_type(value));
}
-DEF_NODESTRUCT_GLOBAL(ldp_xml_parser::XmlParser, static_parser);
+XmlParser::XmlParser(ldp_xml::StorageBackendXML &storage, const char *fname)
+ : __builder{storage}, main_filename{fname}
+{}
#include <boost/noncopyable.hpp>
#include "policy.hpp"
#include "global_nodestruct.hpp"
+#include <boost/utility/string_ref.hpp>
+
+namespace ldp_xml {
+ class StorageBackendXML;
+}
namespace ldp_xml_parser
{
{
public:
/** Parses given config file for declared bus type */
- int parsePolicyConfigFile(BusType bus_type, const char *fname);
+ int parsePolicyConfigFile();
void elementStart(const char *el, const char **attr);
void setRetCode(int ret);
+ explicit XmlParser(ldp_xml::StorageBackendXML &storage, const char *fname);
+
private:
class IncludeItem;
typedef enum { IDLE, BUSCONFIG, INCLUDE, INCLUDEDIR, POLICY, RULE } ParseState;
- ParseState state;
+ ParseState state{IDLE};
bool ignore_always;
bool ignore_missing;
- BusType curr_bus;
std::string current_text;
std::string curr_dir;
int ret_code;
+ const char *main_filename;
std::vector<std::string> included_files;
};
} //namespace
-DCL_NODESTRUCT_GLOBAL(ldp_xml_parser::XmlParser, static_parser)
-
#endif