2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <sys/types.h>
26 #include <dpl/test/test_runner.h>
27 #include <dpl/test/test_runner_child.h>
28 #include <policy_configuration.h>
30 #define CONF_DIR "/usr/share/security-manager/policy/"
31 #define CONF_GROUP_FILE "privilege-group.list"
32 #define CONF_USER_TEMPLATE_FILE "usertype-%s.profile"
34 namespace SecurityManagerTest {
36 gid_t nameToGid(const char *name) {
37 struct group entry, *gresult;
40 0 == getgrnam_r(name, &entry, buffer, 1024, &gresult) && (gresult != NULL),
41 "Error in getgrnam. Group name: " << name);
46 std::string PolicyConfiguration::getConfigFilePath(UserType userType) {
47 const char *user = NULL;
49 case GUEST: user = "guest"; break;
50 case NORMAL: user = "normal"; break;
51 case ADMIN: user = "admin"; break;
52 case SYSTEM: user = "system"; break;
55 snprintf(buffer, 1024, CONF_DIR CONF_USER_TEMPLATE_FILE, user);
56 return std::string(buffer);
59 PolicyConfiguration::PrivVector PolicyConfiguration::getUserPriv(PolicyConfiguration::UserType userType) {
60 return getUserDescription(userType).privVector;
63 PolicyConfiguration::GroupVector PolicyConfiguration::getUserGroup(PolicyConfiguration::UserType userType) {
64 return getUserDescription(userType).groupVector;
67 PolicyConfiguration::GidVector PolicyConfiguration::getUserGid(PolicyConfiguration::UserType userType) {
68 return getUserDescription(userType).gidVector;
71 PolicyConfiguration::GidVector PolicyConfiguration::getGid() {
72 return groupToGid(getGroup());
75 PolicyConfiguration::GroupVector PolicyConfiguration::getGroup() {
77 if (m_privGroupMap.empty())
79 for (auto &e : m_privGroupMap)
80 result.push_back(e.second);
84 PolicyConfiguration::UserDescription& PolicyConfiguration::getUserDescription(PolicyConfiguration::UserType userType) {
85 auto it = m_userDescriptionMap.find(userType);
86 if (it == m_userDescriptionMap.end())
87 m_userDescriptionMap[userType] = loadUserDescription(userType);
88 return m_userDescriptionMap[userType];
91 gid_t PolicyConfiguration::groupToGid(const std::string &gname) {
92 auto it = m_groupGidMap.find(gname);
93 if (it == m_groupGidMap.end())
94 m_groupGidMap[gname] = nameToGid(gname.c_str());
95 return m_groupGidMap[gname];
98 PolicyConfiguration::GidVector PolicyConfiguration::groupToGid(const PolicyConfiguration::GroupVector &groupVector) {
100 for (auto &e : groupVector)
101 result.push_back(groupToGid(e));
105 PolicyConfiguration::PrivGroupMap PolicyConfiguration::getPrivGroupMap()
107 if (m_privGroupMap.empty())
109 return m_privGroupMap;
112 bool PolicyConfiguration::getIsAskuserEnabled() {
113 #ifdef ASKUSER_ENABLED
120 PolicyConfiguration::UserDescription PolicyConfiguration::loadUserDescription(PolicyConfiguration::UserType userType) {
121 UserDescription result;
122 std::string path = getConfigFilePath(userType);
123 result.privVector = loadPrivFile(path);
124 result.groupVector = privToGroup(result.privVector);
125 result.gidVector = groupToGid(result.groupVector);
129 PolicyConfiguration::PrivVector PolicyConfiguration::loadPrivFile(const std::string &path) {
131 std::ifstream file(path);
133 std::regex r("^\\*[ \t]+(.*)");
134 while (std::getline(file, line)) {
136 if (std::regex_search(line, m, r))
137 result.push_back(m[1]);
142 PolicyConfiguration::GroupVector PolicyConfiguration::privToGroup(const PolicyConfiguration::PrivVector &privVector) {
144 if (m_privGroupMap.empty())
146 for (auto &e : privVector) {
147 auto it = m_privGroupMap.find(e);
148 if (it == m_privGroupMap.end())
150 result.push_back(it->second);
155 void PolicyConfiguration::loadPrivGroupMap(void) {
156 std::string pgPath(CONF_DIR CONF_GROUP_FILE);
157 std::ifstream file(pgPath);
159 RUNNER_ASSERT_MSG(file.is_open(),
160 "Unable to read group mapping file " << pgPath);
163 std::regex r("^(http(.*)) +(.*)");
164 while (std::getline(file, line)) {
166 if (std::regex_search(line, m, r))
167 m_privGroupMap[m[1]] = m[3];
171 } // namespace SecurityManagerTest