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 }