1 /*
2  * Copyright (C) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "setting_data_share_helper.h"
16 #include "datashare_helper.h"
17 #include "datashare_predicates.h"
18 #include "iservice_registry.h"
19 #include "uri.h"
20 #include "singleton.h"
21 #include "app_domain_verify_hilog.h"
22 #include "app_domain_verify_xcollie_helper.h"
23 #include "scope_guard.h"
24 
25 namespace OHOS::AppDomainVerify {
26 const std::string SettingsDataShareHelper::SETTINGS_DATASHARE_URI =
27     "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
28 const std::string SETTINGS_DATASHARE_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
29 constexpr const char* SETTINGS_DATA_COLUMN_KEYWORD = "KEYWORD";
30 constexpr const char* SETTINGS_DATA_COLUMN_VALUE = "VALUE";
31 constexpr const char* GET_DATA_SHARE = "get_data_share";
32 constexpr const char* RELEASE_DATA_SHARE = "release_data_share";
33 constexpr const char* QUERY_DATA_SHARE = "query_data_share";
34 constexpr const int TIME_5_SECONDS = 5;
35 SettingsDataShareHelper::SettingsDataShareHelper() = default;
36 
~SettingsDataShareHelper()37 SettingsDataShareHelper::~SettingsDataShareHelper()
38 {
39     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "~SettingsDataShareHelper");
40     if (dataShareHelper_) {
41         APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "~SettingsDataShareHelper release datashare");
42         auto id = XCollieHelper::SetTimer(RELEASE_DATA_SHARE, TIME_5_SECONDS, nullptr, nullptr);
43         dataShareHelper_->Release();
44         XCollieHelper::CancelTimer(id);
45     }
46     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "~SettingsDataShareHelper end");
47 };
48 
GetDataShareHelper()49 std::shared_ptr<DataShare::DataShareHelper> SettingsDataShareHelper::GetDataShareHelper()
50 {
51     if (dataShareHelper_ != nullptr) {
52         return dataShareHelper_;
53     }
54     auto id = XCollieHelper::SetTimer(GET_DATA_SHARE, TIME_5_SECONDS, nullptr, nullptr);
55     ScopeGuard stateGuard([&] { XCollieHelper::CancelTimer(id); });
56     {
57         sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
58         if (saManager == nullptr) {
59             APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "GetSystemAbilityManager failed.");
60             return nullptr;
61         }
62         sptr<IRemoteObject> remote = saManager->GetSystemAbility(APP_DOMAIN_VERIFY_AGENT_SA_ID);
63         if (remote == nullptr) {
64             APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "GetSystemAbility Service Failed.");
65             return nullptr;
66         }
67         APP_DOMAIN_VERIFY_HILOGI(
68             APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "systemAbilityId = %{public}d", APP_DOMAIN_VERIFY_AGENT_SA_ID);
69         dataShareHelper_ = DataShare::DataShareHelper::Creator(
70             remote, SETTINGS_DATASHARE_URI, SETTINGS_DATASHARE_EXT_URI);
71     }
72     return dataShareHelper_;
73 }
74 
Query(Uri & uri,const std::string & key,std::string & value)75 int32_t SettingsDataShareHelper::Query(Uri& uri, const std::string& key, std::string& value)
76 {
77     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "start Query");
78     std::shared_ptr<DataShare::DataShareHelper> settingHelper = GetDataShareHelper();
79     auto id = XCollieHelper::SetTimer(QUERY_DATA_SHARE, TIME_5_SECONDS, nullptr, nullptr);
80     ScopeGuard stateGuard([&] { XCollieHelper::CancelTimer(id); });
81     if (settingHelper == nullptr) {
82         APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "query error, datashareHelper_ is nullptr");
83         return -1;
84     }
85 
86     std::vector<std::string> columns;
87     DataShare::DataSharePredicates predicates;
88     predicates.EqualTo(SETTINGS_DATA_COLUMN_KEYWORD, key);
89     auto result = settingHelper->Query(uri, predicates, columns);
90     if (result == nullptr) {
91         APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "query error, result is nullptr");
92         return -1;
93     }
94 
95     int rowCount = 0;
96     result->GetRowCount(rowCount);
97     if (rowCount == 0) {
98         APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "query success, but rowCount is 0");
99         result->Close();
100         return 0;
101     }
102     if (result->GoToFirstRow() != DataShare::E_OK) {
103         APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "query error, go to first row error");
104         result->Close();
105         return -1;
106     }
107 
108     int columnIndex = 0;
109     result->GetColumnIndex(SETTINGS_DATA_COLUMN_VALUE, columnIndex);
110     result->GetString(columnIndex, value);
111     result->Close();
112     APP_DOMAIN_VERIFY_HILOGI(
113         APP_DOMAIN_VERIFY_AGENT_MODULE_SERVICE, "SettingUtils: query success %{public}s", value.c_str());
114     return 0;
115 }
116 }