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.
20 * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
25 #include <ace-dao-rw/AceDAO.h>
27 #include <openssl/md5.h>
28 #include <dpl/foreach.h>
29 #include <dpl/string.h>
30 #include <dpl/log/log.h>
31 #include <dpl/db/orm.h>
32 #include <ace-dao-ro/AceDAOUtilities.h>
33 #include <ace-dao-ro/AceDAOConversions.h>
34 #include <ace-dao-ro/AceDatabase.h>
36 using namespace DPL::DB::ORM;
37 using namespace DPL::DB::ORM::ace;
38 using namespace AceDB::AceDaoUtilities;
39 using namespace AceDB::AceDaoConversions;
42 char const * const EMPTY_SESSION = "";
47 void AceDAO::setPromptDecision(
48 WidgetHandle widgetHandle,
50 const boost::optional<DPL::String> &session,
51 PromptDecision decision)
54 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
56 ACE_DB_DELETE(del, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
59 Equals<AcePromptDecision::app_id>(widgetHandle),
60 Equals<AcePromptDecision::rule_id>(ruleId)));
63 AcePromptDecision::Row row;
64 row.Set_rule_id(ruleId);
65 row.Set_decision(promptDecisionToInt(decision));
66 row.Set_app_id(widgetHandle);
67 row.Set_session(session);
68 ACE_DB_INSERT(insert, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
74 Catch(DPL::DB::SqlConnection::Exception::Base) {
75 ReThrowMsg(Exception::DatabaseError, "Failed to setUserSetting");
79 void AceDAO::removePolicyResult(
80 const BaseAttributeSet &attributes)
83 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
85 auto attrHash = convertToHash(attributes);
89 &AceDaoUtilities::m_databaseInterface);
90 del->Where(Equals<AcePolicyResult::hash>(attrHash));
94 Catch(DPL::DB::SqlConnection::Exception::Base) {
95 ReThrowMsg(Exception::DatabaseError, "Failed to removeVerdict");
99 void AceDAO::clearAllSettings(void)
101 clearWidgetDevCapSettings();
102 clearDevCapSettings();
105 void AceDAO::setDevCapSetting(const std::string &resource,
106 PreferenceTypes preference)
109 ACE_DB_UPDATE(update, AceDevCap, &AceDaoUtilities::m_databaseInterface);
111 row.Set_general_setting(preferenceToInt(preference));
114 Equals<AceDevCap::id_uri>(DPL::FromUTF8String(resource)));
117 Catch(DPL::DB::SqlConnection::Exception::Base) {
118 ReThrowMsg(Exception::DatabaseError, "Failed to SetResourceSetting");
122 void AceDAO::removeDevCapSetting(const std::string &resource)
125 ACE_DB_UPDATE(update, AceDevCap, &AceDaoUtilities::m_databaseInterface);
127 row.Set_general_setting(preferenceToInt(PreferenceTypes::PREFERENCE_DEFAULT));
130 Equals<AceDevCap::id_uri>(DPL::FromUTF8String(resource)));
133 Catch(DPL::DB::SqlConnection::Exception::Base) {
134 ReThrowMsg(Exception::DatabaseError, "Failed to removeResourceSetting");
139 void AceDAO::setWidgetDevCapSetting(const std::string &resource,
140 WidgetHandle handler,
141 PreferenceTypes preference)
144 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
147 if (!getResourceByUri(resource, rrow)) {
148 ThrowMsg(Exception::DatabaseError, "Resource not found");
151 ACE_DB_INSERT(insert,
152 AceWidgetDevCapSetting,
153 &AceDaoUtilities::m_databaseInterface);
155 AceWidgetDevCapSetting::Row row;
156 row.Set_app_id(handler);
157 int rid = rrow.Get_resource_id();
158 row.Set_resource_id(rid);
159 row.Set_access_value(preferenceToInt(preference));
163 transaction.Commit();
165 Catch(DPL::DB::SqlConnection::Exception::Base) {
166 ReThrowMsg(Exception::DatabaseError, "Failed to setUserSetting");
170 void AceDAO::removeWidgetDevCapSetting(const std::string &resource,
171 WidgetHandle handler)
174 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
176 if (!getResourceByUri(resource, rrow)) {
177 ThrowMsg(Exception::DatabaseError, "resource not found");
181 AceWidgetDevCapSetting,
182 &AceDaoUtilities::m_databaseInterface);
184 Equals<AceWidgetDevCapSetting::app_id> e1(handler);
185 Equals<AceWidgetDevCapSetting::resource_id> e2(rrow.Get_resource_id());
186 del->Where(And(e1, e2));
188 transaction.Commit();
190 Catch(DPL::DB::SqlConnection::Exception::Base) {
191 ReThrowMsg(Exception::DatabaseError, "Failed to clearUserSettings");
196 void AceDAO::setPolicyResult(const BaseAttributeSet &attributes,
197 const ExtendedPolicyResult &exResult)
200 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
202 // TODO: this call is connected with logic.
203 // It should be moved to PolicyEvaluator
204 addAttributes(attributes);
206 auto attrHash = convertToHash(attributes);
208 ACE_DB_DELETE(del, AcePolicyResult, &AceDaoUtilities::m_databaseInterface)
209 del->Where(Equals<AcePolicyResult::hash>(attrHash));
212 ACE_DB_INSERT(insert, AcePolicyResult, &AceDaoUtilities::m_databaseInterface);
213 AcePolicyResult::Row row;
214 row.Set_decision(PolicyResult::serialize(exResult.policyResult));
215 row.Set_hash(attrHash);
216 row.Set_rule_id(exResult.ruleId);
220 transaction.Commit();
222 Catch(DPL::DB::SqlConnection::Exception::Base) {
223 ReThrowMsg(Exception::DatabaseError, "Failed to addVerdict");
227 void AceDAO::resetDatabase(void)
230 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
231 ACE_DB_DELETE(del1, AcePolicyResult, &AceDaoUtilities::m_databaseInterface);
233 ACE_DB_DELETE(del2, AceWidgetDevCapSetting, &AceDaoUtilities::m_databaseInterface);
235 ACE_DB_DELETE(del3, AceDevCap, &AceDaoUtilities::m_databaseInterface);
237 ACE_DB_DELETE(del4, AceSubject, &AceDaoUtilities::m_databaseInterface);
239 ACE_DB_DELETE(del5, AceAttribute, &AceDaoUtilities::m_databaseInterface);
241 ACE_DB_DELETE(del6, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
244 transaction.Commit();
246 // TODO there is no such query yet in ORM.
247 // GlobalConnection::DataCommandAutoPtr command =
248 // GlobalConnectionSingleton::Instance().PrepareDataCommand(
252 Catch(DPL::DB::SqlConnection::Exception::Base) {
253 ReThrowMsg(Exception::DatabaseError, "Failed to resetDatabase");
257 void AceDAO::clearPolicyCache(void)
260 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
261 ACE_DB_DELETE(del1, AcePolicyResult, &AceDaoUtilities::m_databaseInterface);
263 ACE_DB_DELETE(del2, AceAttribute, &AceDaoUtilities::m_databaseInterface);
265 ACE_DB_DELETE(del3, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
268 transaction.Commit();
270 Catch(DPL::DB::SqlConnection::Exception::Base) {
271 ReThrowMsg(Exception::DatabaseError, "Failed to clearPolicyCache");
275 void AceDAO::clearDevCapSettings()
278 ACE_DB_UPDATE(update, AceDevCap, &AceDaoUtilities::m_databaseInterface);
280 row.Set_general_setting(-1);
284 Catch(DPL::DB::SqlConnection::Exception::Base) {
285 ReThrowMsg(Exception::DatabaseError, "Failed to clearResourceSettings");
289 void AceDAO::clearWidgetDevCapSettings()
292 ACE_DB_DELETE(del, AceWidgetDevCapSetting, &AceDaoUtilities::m_databaseInterface);
295 Catch(DPL::DB::SqlConnection::Exception::Base) {
296 ReThrowMsg(Exception::DatabaseError, "Failed to clearUserSettings");
300 int AceDAO::addResource(const std::string &request)
302 LogDebug("addResource: " << request);
304 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
306 if (getResourceByUri(request, rrow)) {
307 transaction.Commit();
308 return rrow.Get_resource_id();
311 ACE_DB_INSERT(insert, AceDevCap, &AceDaoUtilities::m_databaseInterface);
313 row.Set_id_uri(DPL::FromUTF8String(request));
314 row.Set_general_setting(-1);
316 int id = insert->Execute();
317 transaction.Commit();
320 Catch(DPL::DB::SqlConnection::Exception::Base) {
321 ReThrowMsg(Exception::DatabaseError, "Failed in addResource");
325 void AceDAO::addAttributes(const BaseAttributeSet &attributes)
328 BaseAttributeSet::const_iterator iter;
330 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
331 ACE_DB_SELECT(select, AceAttribute, &AceDaoUtilities::m_databaseInterface);
332 select->Where(Equals<AceAttribute::name>(DPL::FromUTF8String(
333 *(*iter)->getName())));
334 std::list<AceAttribute::Row> rows = select->GetRowList();
339 ACE_DB_INSERT(insert, AceAttribute, &AceDaoUtilities::m_databaseInterface);
340 AceAttribute::Row row;
341 row.Set_name(DPL::FromUTF8String(*(*iter)->getName()));
342 row.Set_type(attributeTypeToInt((*iter)->getType()));
347 Catch(DPL::DB::SqlConnection::Exception::Base) {
348 ReThrowMsg(Exception::DatabaseError, "Failed in addAttributes");
352 void AceDAO::setRequestedDevCaps(
353 WidgetHandle widgetHandle,
354 const RequestedDevCapsMap &permissions)
357 FOREACH(it, permissions) {
358 ACE_DB_INSERT(insert, AceRequestedDevCaps,
359 &AceDaoUtilities::m_databaseInterface);
360 AceRequestedDevCaps::Row row;
361 row.Set_app_id(widgetHandle);
362 row.Set_dev_cap(it->first);
363 row.Set_grant_smack(it->second ? 1 : 0);
367 } Catch(DPL::DB::SqlConnection::Exception::Base) {
368 ReThrowMsg(Exception::DatabaseError, "Failed in setStaticDevCapPermissions");
372 void AceDAO::removeRequestedDevCaps(
373 WidgetHandle widgetHandle)
376 ACE_DB_DELETE(del, AceRequestedDevCaps,
377 &AceDaoUtilities::m_databaseInterface);
378 del->Where(Equals<AceRequestedDevCaps::app_id>(widgetHandle));
380 } Catch(DPL::DB::SqlConnection::Exception::Base) {
381 ReThrowMsg(Exception::DatabaseError, "Failed in removeRequestedDevCaps");
385 void AceDAO::setAcceptedFeature(
386 WidgetHandle widgetHandle,
387 const FeatureNameVector &vector)
390 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
391 FOREACH(it, vector) {
392 ACE_DB_INSERT(insert, AceAcceptedFeature,
393 &AceDaoUtilities::m_databaseInterface);
394 AceAcceptedFeature::Row row;
395 row.Set_app_id(widgetHandle);
396 row.Set_feature(*it);
400 transaction.Commit();
401 } Catch(DPL::DB::SqlConnection::Exception::Base) {
402 ReThrowMsg(Exception::DatabaseError, "Failed in setAcceptedFeature");
406 void AceDAO::removeAcceptedFeature(
407 WidgetHandle widgetHandle)
411 ACE_DB_DELETE(del, AceAcceptedFeature,
412 &AceDaoUtilities::m_databaseInterface);
413 del->Where(Equals<AceAcceptedFeature::app_id>(widgetHandle));
415 } Catch(DPL::DB::SqlConnection::Exception::Base) {
416 ReThrowMsg(Exception::DatabaseError, "Failed in removeAcceptedFeature");
420 void AceDAO::registerWidgetInfo(WidgetHandle handle,
421 const WidgetRegisterInfo& info,
422 const WidgetCertificateDataList& dataList)
426 ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
428 ACE_DB_INSERT(insert, WidgetInfo, &AceDaoUtilities::m_databaseInterface);
430 wi.Set_app_id(handle);
431 wi.Set_widget_type(static_cast<int>(info.type));
432 wi.Set_widget_id(info.widget_id);
433 wi.Set_widget_version(info.version);
434 wi.Set_author_name(info.authorName);
435 wi.Set_share_href(info.shareHref);
439 WidgetCertificateDataList::const_iterator it;
440 for (it = dataList.begin(); it != dataList.end(); ++it)
442 WidgetCertificateFingerprint::Row wcf;
443 wcf.Set_app_id(handle);
444 wcf.Set_owner(it->owner);
445 wcf.Set_chainid(it->chainId);
446 wcf.Set_type(it->type);
447 wcf.Set_md5_fingerprint(DPL::FromUTF8String(it->strMD5Fingerprint));
448 wcf.Set_sha1_fingerprint(DPL::FromUTF8String(it->strSHA1Fingerprint));
449 wcf.Set_common_name(it->strCommonName);
450 ACE_DB_INSERT(insert, WidgetCertificateFingerprint, &AceDaoUtilities::m_databaseInterface);
454 transaction.Commit();
455 } Catch(DPL::DB::SqlConnection::Exception::Base) {
456 ReThrowMsg(Exception::DatabaseError, "Failed in registerWidgetInfo");
460 void AceDAO::unregisterWidgetInfo(WidgetHandle handle)
462 if(AceDAO::isWidgetInstalled(handle)) {
465 ACE_DB_DELETE(del, WidgetInfo, &AceDaoUtilities::m_databaseInterface);
466 del->Where(Equals<WidgetInfo::app_id>(handle));
468 } Catch(DPL::DB::SqlConnection::Exception::Base) {
469 ReThrowMsg(Exception::DatabaseError, "Failed in unregisterWidgetInfo");