Modify Checker and cache update
[platform/core/security/privacy-manager.git] / pkgmgr_plugin / privileges.cpp
1 //\r
2 // Open Service Platform\r
3 // Copyright (c) 2013 Samsung Electronics Co., Ltd.\r
4 //\r
5 // Licensed under the Apache License, Version 2.0 (the License);\r
6 // you may not use this file except in compliance with the License.\r
7 // You may obtain a copy of the License at\r
8 //\r
9 //     http://www.apache.org/licenses/LICENSE-2.0\r
10 //\r
11 // Unless required by applicable law or agreed to in writing, software\r
12 // distributed under the License is distributed on an "AS IS" BASIS,\r
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 // See the License for the specific language governing permissions and\r
15 // limitations under the License.\r
16 //\r
17 \r
18 #include <errno.h>\r
19 #include <libxml/parser.h>\r
20 #include <libxml/tree.h>\r
21 #include <privacy_manager_client.h>\r
22 #include <dlog.h>\r
23 #include <list>\r
24 #include <string>\r
25 \r
26 static const xmlChar _NODE_PRIVILEGES[]         = "privileges";\r
27 static const xmlChar _NODE_PRIVILEGE[]          = "privilege";\r
28 \r
29 \r
30 void destroy_char_list(char** ppList, int size)\r
31 {\r
32         int i;\r
33         for (i = 0; i < size; ++i)\r
34         {\r
35                 if (ppList[i])\r
36                         free(ppList[i]);\r
37         }\r
38         free(ppList);\r
39 }\r
40 \r
41 extern "C"\r
42 __attribute__ ((visibility("default")))\r
43 int PKGMGR_PARSER_PLUGIN_INSTALL(xmlDocPtr docPtr, const char* packageId)\r
44 {\r
45         int ret;\r
46         LOGI("enter");\r
47 \r
48         // Node: <privileges>\r
49         xmlNodePtr curPtr = xmlFirstElementChild(xmlDocGetRootElement(docPtr));\r
50         LOGD("Node: %s", curPtr->name);\r
51 \r
52         curPtr = curPtr->xmlChildrenNode;\r
53         if (curPtr == NULL)\r
54         {\r
55                 LOGD("No privileges");\r
56                 return 0;\r
57         }\r
58 \r
59         std::list <std::string> privilegeList;\r
60         while (curPtr != NULL)\r
61         {\r
62                 LOGD("Node: %s", curPtr->name);\r
63 \r
64                 if (xmlStrcmp(curPtr->name, _NODE_PRIVILEGE) == 0)\r
65                 {\r
66                         xmlChar* pPrivilege = xmlNodeListGetString(docPtr, curPtr->xmlChildrenNode, 1);\r
67                         LOGD(" value= %s", reinterpret_cast<char*>(pPrivilege));\r
68                         if (pPrivilege == NULL)\r
69                         {\r
70                                 LOGE("Failed to get value");\r
71                                 return -EINVAL;\r
72                         }\r
73                         privilegeList.push_back(std::string( reinterpret_cast<char*> (pPrivilege)));\r
74                 }\r
75                 curPtr = curPtr->next;\r
76         }\r
77 \r
78         char** ppPrivilegeList = (char**) calloc(privilegeList.size() + 1, sizeof(char*));\r
79         std::list <std::string>::iterator iter = privilegeList.begin();\r
80         for (int i = 0; i < privilegeList.size(); ++i)\r
81         {\r
82                 ppPrivilegeList[i] = (char*)calloc (strlen(iter->c_str()) + 1, sizeof(char));\r
83                 if (ppPrivilegeList[i] == NULL)\r
84                 {\r
85                         destroy_char_list(ppPrivilegeList, privilegeList.size() + 1);\r
86                         return -ENOMEM;\r
87                 }\r
88                 memcpy(ppPrivilegeList[i], iter->c_str(), strlen(iter->c_str()));\r
89                 ++iter;\r
90         }\r
91         for (int i = 0; i < privilegeList.size(); ++i)\r
92                 LOGD(" values : %s", ppPrivilegeList[i]);\r
93 \r
94         ppPrivilegeList[privilegeList.size()] = (char*)calloc (2, sizeof(char));\r
95         memcpy(ppPrivilegeList[privilegeList.size()], "\0", 1);\r
96 \r
97         ret = privacy_manager_client_install_privacy(packageId, (const char**) ppPrivilegeList);\r
98         destroy_char_list(ppPrivilegeList, privilegeList.size() + 1);\r
99         if (ret != PRIV_MGR_ERROR_SUCCESS)\r
100         {\r
101                 LOGD("Failed to install privacy : %d", ret);\r
102                 return -EINVAL;\r
103         }\r
104 \r
105         LOGI("leave");\r
106 }\r
107 \r
108 extern "C"\r
109 __attribute__ ((visibility("default")))\r
110 int PKGMGR_PARSER_PLUGIN_UNINSTALL(xmlDocPtr docPtr, const char* packageId)\r
111 {\r
112         LOGI("enter");\r
113 \r
114         privacy_manager_client_uninstall_privacy(packageId);\r
115 \r
116         return 0;\r
117         LOGI("leave");  \r
118 }\r