4 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <permission_checker.h>
21 #include <sf_common.h>
23 #include <sensor_plugin_loader.h>
24 #include <sensor_base.h>
27 #define SECURITY_LIB "/usr/lib/libsecurity-server-client.so.1"
29 permission_checker::permission_checker()
31 , security_server_check_privilege_by_sockfd(NULL)
32 , m_security_handle(NULL)
38 permission_checker::~permission_checker()
40 if (m_security_handle)
41 dlclose(m_security_handle);
44 permission_checker& permission_checker::get_instance()
46 static permission_checker inst;
50 bool permission_checker::init_security_lib(void)
52 m_security_handle = dlopen(SECURITY_LIB, RTLD_LAZY);
54 if (!m_security_handle) {
55 ERR("dlopen(%s) error, cause: %s", SECURITY_LIB, dlerror());
59 security_server_check_privilege_by_sockfd =
60 (security_server_check_privilege_by_sockfd_t) dlsym(m_security_handle, "security_server_check_privilege_by_sockfd");
62 if (!security_server_check_privilege_by_sockfd) {
63 ERR("Failed to load symbol");
64 dlclose(m_security_handle);
65 m_security_handle = NULL;
73 void permission_checker::init()
75 m_permission_infos.push_back(std::make_shared<permission_info> (SENSOR_PERMISSION_STANDARD, false, "", ""));
76 m_permission_infos.push_back(std::make_shared<permission_info> (SENSOR_PERMISSION_BIO, true, "sensord::bio", "rw"));
78 vector<sensor_base *> sensors;
79 sensors = sensor_plugin_loader::get_instance().get_sensors(ALL_SENSOR);
81 for (int i = 0; i < sensors.size(); ++i)
82 m_permission_set |= sensors[i]->get_permission();
84 INFO("Permission Set = %d", m_permission_set);
86 if (!init_security_lib())
87 ERR("Failed to init security lib: %s", SECURITY_LIB);
90 int permission_checker::get_permission(int sock_fd)
92 int permission = SENSOR_PERMISSION_NONE;
94 for (int i = 0; i < m_permission_infos.size(); ++i) {
95 if (!m_permission_infos[i]->need_to_check) {
96 permission |= m_permission_infos[i]->permission;
97 } else if ((m_permission_set & m_permission_infos[i]->permission) && security_server_check_privilege_by_sockfd) {
98 if (security_server_check_privilege_by_sockfd(sock_fd, m_permission_infos[i]->name.c_str(), m_permission_infos[i]->access_right.c_str()) == 1) {
99 permission |= m_permission_infos[i]->permission;