tizen 2.3 release
[framework/web/wearable/wrt-security.git] / ace / dao / AceDAO.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 /**
17  *
18  *
19  * @file       AceDAO.cpp
20  * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
21  * @version    0.1
22  * @brief
23  */
24
25 #include <ace-dao-rw/AceDAO.h>
26
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>
35
36 using namespace DPL::DB::ORM;
37 using namespace DPL::DB::ORM::ace;
38 using namespace AceDB::AceDaoUtilities;
39 using namespace AceDB::AceDaoConversions;
40
41 namespace {
42 char const * const EMPTY_SESSION = "";
43 } // namespace
44
45 namespace AceDB{
46
47 void AceDAO::setPromptDecision(
48     WidgetHandle widgetHandle,
49     int ruleId,
50     const boost::optional<DPL::String> &session,
51     PromptDecision decision)
52 {
53     Try {
54         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
55
56         ACE_DB_DELETE(del, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
57         del->Where(
58             And(
59                 Equals<AcePromptDecision::app_id>(widgetHandle),
60                 Equals<AcePromptDecision::rule_id>(ruleId)));
61         del->Execute();
62
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);
69         insert->Values(row);
70         insert->Execute();
71
72         transaction.Commit();
73     }
74     Catch(DPL::DB::SqlConnection::Exception::Base) {
75         ReThrowMsg(Exception::DatabaseError, "Failed to setUserSetting");
76     }
77 }
78
79 void AceDAO::removePolicyResult(
80         const BaseAttributeSet &attributes)
81 {
82     Try {
83         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
84
85         auto attrHash =  convertToHash(attributes);
86
87         ACE_DB_DELETE(del,
88                       AcePolicyResult,
89                       &AceDaoUtilities::m_databaseInterface);
90         del->Where(Equals<AcePolicyResult::hash>(attrHash));
91         del->Execute();
92         transaction.Commit();
93     }
94     Catch(DPL::DB::SqlConnection::Exception::Base) {
95         ReThrowMsg(Exception::DatabaseError, "Failed to removeVerdict");
96     }
97 }
98
99 void AceDAO::clearAllSettings(void)
100 {
101     clearWidgetDevCapSettings();
102     clearDevCapSettings();
103 }
104
105 void AceDAO::setDevCapSetting(const std::string &resource,
106                               PreferenceTypes preference)
107 {
108     Try {
109         ACE_DB_UPDATE(update, AceDevCap, &AceDaoUtilities::m_databaseInterface);
110         AceDevCap::Row row;
111         row.Set_general_setting(preferenceToInt(preference));
112         update->Values(row);
113         update->Where(
114             Equals<AceDevCap::id_uri>(DPL::FromUTF8String(resource)));
115         update->Execute();
116     }
117     Catch(DPL::DB::SqlConnection::Exception::Base) {
118         ReThrowMsg(Exception::DatabaseError, "Failed to SetResourceSetting");
119     }
120 }
121
122 void AceDAO::removeDevCapSetting(const std::string &resource)
123 {
124     Try {
125         ACE_DB_UPDATE(update, AceDevCap, &AceDaoUtilities::m_databaseInterface);
126         AceDevCap::Row row;
127         row.Set_general_setting(preferenceToInt(PreferenceTypes::PREFERENCE_DEFAULT));
128         update->Values(row);
129         update->Where(
130             Equals<AceDevCap::id_uri>(DPL::FromUTF8String(resource)));
131         update->Execute();
132     }
133     Catch(DPL::DB::SqlConnection::Exception::Base) {
134         ReThrowMsg(Exception::DatabaseError, "Failed to removeResourceSetting");
135     }
136 }
137
138
139 void AceDAO::setWidgetDevCapSetting(const std::string &resource,
140                                     WidgetHandle handler,
141                                     PreferenceTypes preference)
142 {
143     Try {
144         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
145         // TODO JOIN
146         AceDevCap::Row rrow;
147         if (!getResourceByUri(resource, rrow)) {
148             ThrowMsg(Exception::DatabaseError, "Resource not found");
149         }
150
151         ACE_DB_INSERT(insert,
152                       AceWidgetDevCapSetting,
153                       &AceDaoUtilities::m_databaseInterface);
154
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));
160         insert->Values(row);
161         insert->Execute();
162
163         transaction.Commit();
164     }
165     Catch(DPL::DB::SqlConnection::Exception::Base) {
166         ReThrowMsg(Exception::DatabaseError, "Failed to setUserSetting");
167     }
168 }
169
170 void AceDAO::removeWidgetDevCapSetting(const std::string &resource,
171                                        WidgetHandle handler)
172 {
173     Try {
174         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
175         AceDevCap::Row rrow;
176         if (!getResourceByUri(resource, rrow)) {
177             ThrowMsg(Exception::DatabaseError, "resource not found");
178         }
179
180         ACE_DB_DELETE(del,
181                       AceWidgetDevCapSetting,
182                       &AceDaoUtilities::m_databaseInterface);
183
184         Equals<AceWidgetDevCapSetting::app_id> e1(handler);
185         Equals<AceWidgetDevCapSetting::resource_id> e2(rrow.Get_resource_id());
186         del->Where(And(e1, e2));
187         del->Execute();
188         transaction.Commit();
189     }
190     Catch(DPL::DB::SqlConnection::Exception::Base) {
191         ReThrowMsg(Exception::DatabaseError, "Failed to clearUserSettings");
192     }
193 }
194
195
196 void AceDAO::setPolicyResult(const BaseAttributeSet &attributes,
197                              const ExtendedPolicyResult &exResult)
198 {
199     Try {
200         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
201
202         // TODO: this call is connected with logic.
203         // It should be moved to PolicyEvaluator
204         addAttributes(attributes);
205
206         auto attrHash = convertToHash(attributes);
207
208         ACE_DB_DELETE(del, AcePolicyResult, &AceDaoUtilities::m_databaseInterface)
209         del->Where(Equals<AcePolicyResult::hash>(attrHash));
210         del->Execute();
211
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);
217         insert->Values(row);
218         insert->Execute();
219
220         transaction.Commit();
221     }
222     Catch(DPL::DB::SqlConnection::Exception::Base) {
223         ReThrowMsg(Exception::DatabaseError, "Failed to addVerdict");
224     }
225 }
226
227 void AceDAO::resetDatabase(void)
228 {
229     Try {
230         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
231         ACE_DB_DELETE(del1, AcePolicyResult, &AceDaoUtilities::m_databaseInterface);
232         del1->Execute();
233         ACE_DB_DELETE(del2, AceWidgetDevCapSetting, &AceDaoUtilities::m_databaseInterface);
234         del2->Execute();
235         ACE_DB_DELETE(del3, AceDevCap, &AceDaoUtilities::m_databaseInterface);
236         del3->Execute();
237         ACE_DB_DELETE(del4, AceSubject, &AceDaoUtilities::m_databaseInterface);
238         del4->Execute();
239         ACE_DB_DELETE(del5, AceAttribute, &AceDaoUtilities::m_databaseInterface);
240         del5->Execute();
241         ACE_DB_DELETE(del6, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
242         del6->Execute();
243
244         transaction.Commit();
245
246         // TODO there is no such query yet in ORM.
247         //        GlobalConnection::DataCommandAutoPtr command =
248         //                GlobalConnectionSingleton::Instance().PrepareDataCommand(
249         //                        "VACUUM");
250         //        command->Step();
251     }
252     Catch(DPL::DB::SqlConnection::Exception::Base) {
253         ReThrowMsg(Exception::DatabaseError, "Failed to resetDatabase");
254     }
255 }
256
257 void AceDAO::clearPolicyCache(void)
258 {
259     Try {
260         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
261         ACE_DB_DELETE(del1, AcePolicyResult, &AceDaoUtilities::m_databaseInterface);
262         del1->Execute();
263         ACE_DB_DELETE(del2, AceAttribute, &AceDaoUtilities::m_databaseInterface);
264         del2->Execute();
265         ACE_DB_DELETE(del3, AcePromptDecision, &AceDaoUtilities::m_databaseInterface);
266         del3->Execute();
267
268         transaction.Commit();
269     }
270     Catch(DPL::DB::SqlConnection::Exception::Base) {
271         ReThrowMsg(Exception::DatabaseError, "Failed to clearPolicyCache");
272     }
273 }
274
275 void AceDAO::clearDevCapSettings()
276 {
277     Try {
278         ACE_DB_UPDATE(update, AceDevCap, &AceDaoUtilities::m_databaseInterface);
279         AceDevCap::Row row;
280         row.Set_general_setting(-1);
281         update->Values(row);
282         update->Execute();
283     }
284     Catch(DPL::DB::SqlConnection::Exception::Base) {
285         ReThrowMsg(Exception::DatabaseError, "Failed to clearResourceSettings");
286     }
287 }
288
289 void AceDAO::clearWidgetDevCapSettings()
290 {
291     Try {
292         ACE_DB_DELETE(del, AceWidgetDevCapSetting, &AceDaoUtilities::m_databaseInterface);
293         del->Execute();
294     }
295     Catch(DPL::DB::SqlConnection::Exception::Base) {
296         ReThrowMsg(Exception::DatabaseError, "Failed to clearUserSettings");
297     }
298 }
299
300 int AceDAO::addResource(const std::string &request)
301 {
302     LogDebug("addResource: " << request);
303     Try {
304         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
305         AceDevCap::Row rrow;
306         if (getResourceByUri(request, rrow)) {
307             transaction.Commit();
308             return rrow.Get_resource_id();
309         }
310
311         ACE_DB_INSERT(insert, AceDevCap, &AceDaoUtilities::m_databaseInterface);
312         AceDevCap::Row row;
313         row.Set_id_uri(DPL::FromUTF8String(request));
314         row.Set_general_setting(-1);
315         insert->Values(row);
316         int id = insert->Execute();
317         transaction.Commit();
318         return id;
319     }
320     Catch(DPL::DB::SqlConnection::Exception::Base) {
321         ReThrowMsg(Exception::DatabaseError, "Failed in addResource");
322     }
323 }
324
325 void AceDAO::addAttributes(const BaseAttributeSet &attributes)
326 {
327     Try {
328         BaseAttributeSet::const_iterator iter;
329
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();
335             if (!rows.empty()) {
336                 continue;
337             }
338
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()));
343             insert->Values(row);
344             insert->Execute();
345         }
346     }
347     Catch(DPL::DB::SqlConnection::Exception::Base) {
348         ReThrowMsg(Exception::DatabaseError, "Failed in addAttributes");
349     }
350 }
351
352 void AceDAO::setRequestedDevCaps(
353     WidgetHandle widgetHandle,
354     const RequestedDevCapsMap &permissions)
355 {
356     Try {
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);
364           insert->Values(row);
365           insert->Execute();
366         }
367     } Catch(DPL::DB::SqlConnection::Exception::Base) {
368         ReThrowMsg(Exception::DatabaseError, "Failed in setStaticDevCapPermissions");
369     }
370 }
371
372 void AceDAO::removeRequestedDevCaps(
373     WidgetHandle widgetHandle)
374 {
375     Try {
376         ACE_DB_DELETE(del, AceRequestedDevCaps,
377                       &AceDaoUtilities::m_databaseInterface);
378         del->Where(Equals<AceRequestedDevCaps::app_id>(widgetHandle));
379         del->Execute();
380     } Catch(DPL::DB::SqlConnection::Exception::Base) {
381         ReThrowMsg(Exception::DatabaseError, "Failed in removeRequestedDevCaps");
382     }
383 }
384
385 void AceDAO::setAcceptedFeature(
386     WidgetHandle widgetHandle,
387     const FeatureNameVector &vector)
388 {
389     Try {
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);
397             insert->Values(row);
398             insert->Execute();
399         }
400         transaction.Commit();
401     } Catch(DPL::DB::SqlConnection::Exception::Base) {
402         ReThrowMsg(Exception::DatabaseError, "Failed in setAcceptedFeature");
403     }
404 }
405
406 void AceDAO::removeAcceptedFeature(
407     WidgetHandle widgetHandle)
408 {
409     Try
410     {
411         ACE_DB_DELETE(del, AceAcceptedFeature,
412                       &AceDaoUtilities::m_databaseInterface);
413         del->Where(Equals<AceAcceptedFeature::app_id>(widgetHandle));
414         del->Execute();
415     } Catch(DPL::DB::SqlConnection::Exception::Base) {
416         ReThrowMsg(Exception::DatabaseError, "Failed in removeAcceptedFeature");
417     }
418 }
419
420 void AceDAO::registerWidgetInfo(WidgetHandle handle,
421                                 const WidgetRegisterInfo& info,
422                                 const WidgetCertificateDataList& dataList)
423 {
424     Try
425     {
426         ScopedTransaction transaction(&AceDaoUtilities::m_databaseInterface);
427
428         ACE_DB_INSERT(insert, WidgetInfo, &AceDaoUtilities::m_databaseInterface);
429         WidgetInfo::Row wi;
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);
436         insert->Values(wi);
437         insert->Execute();
438
439         WidgetCertificateDataList::const_iterator it;
440         for (it = dataList.begin(); it != dataList.end(); ++it)
441         {
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);
451             insert->Values(wcf);
452             insert->Execute();
453         }
454         transaction.Commit();
455     } Catch(DPL::DB::SqlConnection::Exception::Base) {
456         ReThrowMsg(Exception::DatabaseError, "Failed in registerWidgetInfo");
457     }
458 }
459
460 void AceDAO::unregisterWidgetInfo(WidgetHandle handle)
461 {
462     if(AceDAO::isWidgetInstalled(handle)) {
463         Try
464         {
465             ACE_DB_DELETE(del, WidgetInfo, &AceDaoUtilities::m_databaseInterface);
466             del->Where(Equals<WidgetInfo::app_id>(handle));
467             del->Execute();
468         } Catch(DPL::DB::SqlConnection::Exception::Base) {
469             ReThrowMsg(Exception::DatabaseError, "Failed in unregisterWidgetInfo");
470         }
471     }
472 }
473
474 }