2 * Copyright (c) 2011 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.
17 * @file ace_api_install.cpp
18 * @author Tomasz Swierczek (t.swierczek@samsung.com)
20 * @brief This file contains implementation ACE installator API
26 #include <dpl/log/log.h>
27 #include <dpl/foreach.h>
28 #include <dpl/string.h>
29 #include "SecurityCommunicationClient.h"
30 #include <ace-dao-rw/AceDAO.h>
31 #include "ace_server_api.h"
33 #include "ace_api_install.h"
35 static WrtSecurity::Communication::Client *communicationClient = NULL;
39 static AceDB::AppTypes to_db_app_type(ace_widget_type_t widget_type)
41 switch (widget_type) {
43 return AceDB::AppTypes::WAC20;
45 return AceDB::AppTypes::Tizen;
47 return AceDB::AppTypes::Unknown;
51 static ace_widget_type_t to_ace_widget_type(AceDB::AppTypes app_type)
54 case AceDB::AppTypes::WAC20:
56 case AceDB::AppTypes::Tizen:
59 LogError("Invalid app type for widget");
64 ace_return_t ace_install_initialize(void)
66 if (NULL != communicationClient) {
67 LogError("ace_api_install already initialized");
68 return ACE_INTERNAL_ERROR;
70 AceDB::AceDAO::attachToThreadRW();
72 communicationClient = new WrtSecurity::Communication::Client(
73 WrtSecurity::AceServerApi::INTERFACE_NAME());
74 } Catch (WrtSecurity::Communication::Client::Exception::SecurityCommunicationClientException) {
75 LogError("Can't connect to daemon");
76 return ACE_INTERNAL_ERROR;
81 ace_return_t ace_install_shutdown(void)
83 if (NULL == communicationClient) {
84 LogError("ace_api_install not initialized");
85 return ACE_INTERNAL_ERROR;
87 delete communicationClient;
88 communicationClient = NULL;
89 AceDB::AceDAO::detachFromThread();
93 ace_return_t ace_update_policy(void)
96 communicationClient->call(WrtSecurity::AceServerApi::UPDATE_POLICY_METHOD());
97 } Catch (WrtSecurity::Communication::Client::Exception::SecurityCommunicationClientException) {
98 LogError("Problem with connection to daemon");
99 return ACE_INTERNAL_ERROR;
104 ace_return_t ace_free_requested_dev_caps(ace_requested_dev_cap_list_t* caps)
106 if (NULL == caps || NULL == caps->items) {
107 LogError("Invalid arguments");
108 return ACE_INVALID_ARGUMENTS;
111 for (i = 0; i < caps->count; ++i) {
112 delete [] caps->items[i].device_capability;
114 delete [] caps->items;
118 ace_return_t ace_get_requested_dev_caps(ace_widget_handle_t handle,
119 ace_requested_dev_cap_list_t* caps)
122 LogError("Invalid arguments");
123 return ACE_INVALID_ARGUMENTS;
125 AceDB::RequestedDevCapsMap permissions;
127 AceDB::AceDAO::getRequestedDevCaps(
128 handle, &permissions);
129 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
130 return ACE_INTERNAL_ERROR;
132 caps->items = new ace_requested_dev_cap_t[permissions.size()];
133 caps->count = permissions.size();
135 FOREACH (it, permissions) {
136 std::string devCapRequested = DPL::ToUTF8String(it->first);
137 caps->items[i].device_capability =
138 new char[strlen(devCapRequested.c_str())+1];
139 strcpy(caps->items[i].device_capability, devCapRequested.c_str());
140 caps->items[i].smack_granted = it->second ? ACE_TRUE : ACE_FALSE;
146 ace_return_t ace_set_requested_dev_caps(
147 ace_widget_handle_t handle,
148 const ace_requested_dev_cap_list_t* caps)
151 LogError("Invalid arguments");
152 return ACE_INVALID_ARGUMENTS;
154 AceDB::RequestedDevCapsMap db_permissions;
156 for (i = 0; i < caps->count; ++i) {
157 std::string devCap = std::string(caps->items[i].device_capability);
158 db_permissions.insert(std::make_pair(DPL::FromUTF8String(devCap),
159 caps->items[i].smack_granted == ACE_TRUE));
162 AceDB::AceDAO::setRequestedDevCaps(
163 handle, db_permissions);
164 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
165 return ACE_INTERNAL_ERROR;
170 ace_return_t ace_set_accepted_feature(
171 ace_widget_handle_t handle,
172 const ace_feature_list_t *feature)
174 if (NULL == feature) {
175 LogError("Invalid argument");
176 return ACE_INVALID_ARGUMENTS;
178 AceDB::FeatureNameVector fvector;
180 for (i = 0; i < feature->count; ++i) {
182 DPL::FromUTF8String(feature->items[i]));
185 AceDB::AceDAO::setAcceptedFeature(handle, fvector);
186 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
187 return ACE_INTERNAL_ERROR;
192 ace_return_t ace_rem_accepted_feature(
193 ace_widget_handle_t handle)
196 AceDB::AceDAO::removeAcceptedFeature(handle);
197 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
198 return ACE_INTERNAL_ERROR;
203 ace_return_t ace_register_widget(ace_widget_handle_t handle,
204 struct widget_info *info,
205 ace_certificate_data* cert_data[])
209 if (NULL == info || AceDB::AceDAOReadOnly::isWidgetInstalled(handle))
210 return ACE_INVALID_ARGUMENTS;
212 AceDB::WidgetRegisterInfo wri;
213 wri.type = to_db_app_type(info->type);
216 wri.widget_id = DPL::FromUTF8String(info->id);
218 wri.version = DPL::FromUTF8String(info->version);
220 wri.authorName = DPL::FromUTF8String(info->author);
222 wri.shareHref = DPL::FromUTF8String(info->shareHerf);
224 AceDB::WidgetCertificateDataList dataList;
225 if (NULL != cert_data) {
226 AceDB::WidgetCertificateData wcd;
227 ace_certificate_data* cd;
229 while (cert_data[i] != NULL)
231 cd = cert_data[i++]; //increment
234 wcd.type = AceDB::WidgetCertificateData::Type::ROOT;
237 wcd.type = AceDB::WidgetCertificateData::Type::ENDENTITY;
242 wcd.owner = AceDB::WidgetCertificateData::Owner::AUTHOR;
245 wcd.owner = AceDB::WidgetCertificateData::Owner::DISTRIBUTOR;
247 case UNKNOWN: default:
248 wcd.owner = AceDB::WidgetCertificateData::Owner::UNKNOWN;
251 wcd.chainId = cd->chain_id;
253 wcd.strMD5Fingerprint = cd->md5_fp;
255 wcd.strSHA1Fingerprint = cd->sha1_fp;
257 wcd.strCommonName = DPL::FromUTF8String(cd->common_name);
258 dataList.push_back(wcd);
260 LogDebug("All data set. Inserting into database.");
264 AceDB::AceDAO::registerWidgetInfo((WidgetHandle)(handle), wri, dataList);
265 LogDebug("AceDB entry done");
266 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
267 return ACE_INTERNAL_ERROR;
272 ace_return_t ace_unregister_widget(ace_widget_handle_t handle)
275 AceDB::AceDAO::unregisterWidgetInfo((WidgetHandle)(handle));
276 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
277 return ACE_INTERNAL_ERROR;
282 ace_return_t ace_is_widget_installed(ace_widget_handle_t handle, bool *installed)
285 *installed = AceDB::AceDAO::isWidgetInstalled((WidgetHandle)(handle));
286 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
287 return ACE_INTERNAL_ERROR;
292 ace_return_t ace_get_widget_type(ace_widget_handle_t handle,
293 ace_widget_type_t* type)
296 LogError("Invalid arguments");
297 return ACE_INVALID_ARGUMENTS;
300 AceDB::AppTypes db_type = AceDB::AceDAO::getWidgetType(handle);
301 *type = to_ace_widget_type(db_type);
302 } Catch(AceDB::AceDAOReadOnly::Exception::DatabaseError) {
303 return ACE_INTERNAL_ERROR;
308 ace_return_t ace_get_policy_result(const ace_resource_t resource,
309 ace_widget_handle_t handle,
310 ace_policy_result_t* result)
312 if (NULL == result) {
313 LogError("Invalid arguments");
314 return ACE_INVALID_ARGUMENTS;
316 int serializedPolicyResult = 0;
318 std::string resource_str(resource);
319 communicationClient->call(WrtSecurity::AceServerApi::CHECK_ACCESS_INSTALL_METHOD(),
322 &serializedPolicyResult);
323 } Catch (WrtSecurity::Communication::Client::Exception::SecurityCommunicationClientException) {
324 LogError("Can't connect to daemon");
325 return ACE_INTERNAL_ERROR;
327 PolicyResult policyResult = PolicyResult::
328 deserialize(serializedPolicyResult);
329 OptionalPolicyEffect effect = policyResult.getEffect();
330 if (effect.IsNull()) {
331 *result = ACE_UNDEFINED;
332 } else if (*effect == PolicyEffect::DENY) {
334 } else if (*effect == PolicyEffect::PERMIT) {
335 *result = ACE_PERMIT;
336 } else if (*effect == PolicyEffect::PROMPT_ONESHOT ||
337 *effect == PolicyEffect::PROMPT_BLANKET ||
338 *effect == PolicyEffect::PROMPT_SESSION){
339 *result = ACE_PROMPT;
341 *result = ACE_UNDEFINED;