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
16 #include "medialibrary_urisensitive_operations.h"
17
18 #include <iostream>
19 #include <sstream>
20 #include <string>
21 #include <cstdint>
22
23 #include "common_func.h"
24 #include "ipc_skeleton.h"
25 #include "medialibrary_errno.h"
26 #include "medialibrary_object_utils.h"
27 #include "medialibrary_type_const.h"
28 #include "media_file_utils.h"
29 #include "media_log.h"
30 #include "media_app_uri_permission_column.h"
31 #include "media_app_uri_sensitive_column.h"
32 #include "media_column.h"
33 #include "medialibrary_appstate_observer.h"
34 #include "medialibrary_rdb_transaction.h"
35 #include "media_library_manager.h"
36 #include "permission_utils.h"
37 #include "result_set_utils.h"
38 #include "rdb_utils.h"
39
40 namespace OHOS {
41 namespace Media {
42 using namespace std;
43 using namespace OHOS::NativeRdb;
44 using namespace OHOS::DataShare;
45 using namespace OHOS::RdbDataShareAdapter;
46
47 constexpr int32_t NO_DB_OPERATION = -1;
48 constexpr int32_t UPDATE_DB_OPERATION = 0;
49 constexpr int32_t INSERT_DB_OPERATION = 1;
50 constexpr int32_t PHOTOSTYPE = 1;
51 constexpr int32_t AUDIOSTYPE = 2;
52
53 constexpr int32_t FILE_ID_INDEX = 0;
54 constexpr int32_t URI_TYPE_INDEX = 1;
55 constexpr int32_t SENSITIVE_TYPE_INDEX = 2;
56 constexpr int32_t SRC_TOKEN_ID_INDEX = 3;
57 constexpr int32_t TARGET_TOKEN_ID_INDEX = 4;
58
59 const string DB_OPERATION = "uriSensitive_operation";
60
UpdateOperation(MediaLibraryCommand & cmd,NativeRdb::RdbPredicates & rdbPredicate,std::shared_ptr<TransactionOperations> trans)61 int32_t UriSensitiveOperations::UpdateOperation(MediaLibraryCommand &cmd,
62 NativeRdb::RdbPredicates &rdbPredicate, std::shared_ptr<TransactionOperations> trans)
63 {
64 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
65 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_HAS_DB_ERROR, "UriSensitive update operation, rdbStore is null.");
66 cmd.SetTableName(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
67 int32_t updateRows;
68 if (trans == nullptr) {
69 updateRows = MediaLibraryRdbStore::UpdateWithDateTime(cmd.GetValueBucket(), rdbPredicate);
70 } else {
71 updateRows = trans->Update(cmd.GetValueBucket(), rdbPredicate);
72 }
73 CHECK_AND_RETURN_RET_LOG(updateRows >= 0, E_HAS_DB_ERROR,
74 "UriSensitive Update db failed, errCode = %{public}d", updateRows);
75 return static_cast<int32_t>(updateRows);
76 }
77
DeleteAllSensitiveOperation(AsyncTaskData * data)78 static void DeleteAllSensitiveOperation(AsyncTaskData *data)
79 {
80 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
81 CHECK_AND_RETURN_LOG(rdbStore != nullptr, "UriSensitive delete operation fail, rdbStore is null.");
82
83 int32_t ret = rdbStore->ExecuteSql(AppUriSensitiveColumn::CREATE_APP_URI_SENSITIVE_TABLE);
84 CHECK_AND_RETURN_LOG(ret >= 0, "UriSensitive table delete all temporary Sensitive failed");
85
86 ret = rdbStore->ExecuteSql(AppUriSensitiveColumn::CREATE_URI_URITYPE_APPID_INDEX);
87 CHECK_AND_RETURN_LOG(ret >= 0, "UriSensitive table delete all temporary Sensitive failed");
88
89 ret = rdbStore->ExecuteSql(AppUriSensitiveColumn::DELETE_APP_URI_SENSITIVE_TABLE);
90 CHECK_AND_RETURN_LOG(ret >= 0, "UriSensitive table delete all temporary Sensitive failed");
91
92 MEDIA_INFO_LOG("UriSensitive table delete all %{public}d rows temporary Sensitive success", ret);
93 }
94
DeleteAllSensitiveAsync()95 void UriSensitiveOperations::DeleteAllSensitiveAsync()
96 {
97 shared_ptr<MediaLibraryAsyncWorker> asyncWorker = MediaLibraryAsyncWorker::GetInstance();
98 CHECK_AND_RETURN_LOG(asyncWorker != nullptr, "Can not get asyncWorker");
99 shared_ptr<MediaLibraryAsyncTask> notifyAsyncTask =
100 make_shared<MediaLibraryAsyncTask>(DeleteAllSensitiveOperation, nullptr);
101 asyncWorker->AddTask(notifyAsyncTask, true);
102 }
103
DeleteOperation(MediaLibraryCommand & cmd)104 int32_t UriSensitiveOperations::DeleteOperation(MediaLibraryCommand &cmd)
105 {
106 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
107 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_HAS_DB_ERROR, "UriSensitive update operation, rdbStore is null.");
108 cmd.SetTableName(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
109 int32_t deleteRows = -1;
110 int32_t errCode = rdbStore->Delete(cmd, deleteRows);
111 bool cond = (errCode != NativeRdb::E_OK || deleteRows < 0);
112 CHECK_AND_RETURN_RET_LOG(!cond, E_HAS_DB_ERROR, "UriSensitive delete db failed, errCode = %{public}d", errCode);
113 return static_cast<int32_t>(deleteRows);
114 }
115
InsertOperation(MediaLibraryCommand & cmd)116 int32_t UriSensitiveOperations::InsertOperation(MediaLibraryCommand &cmd)
117 {
118 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
119 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_HAS_DB_ERROR, "UriSensitive insert operation, rdbStore is null.");
120 cmd.SetTableName(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
121 int64_t rowId = -1;
122 int32_t errCode = rdbStore->Insert(cmd, rowId);
123 bool cond = (errCode != NativeRdb::E_OK || rowId < 0);
124 CHECK_AND_RETURN_RET_LOG(!cond, E_HAS_DB_ERROR, "UriSensitive insert db failed, errCode = %{public}d", errCode);
125 return static_cast<int32_t>(rowId);
126 }
127
BatchInsertOperation(MediaLibraryCommand & cmd,std::vector<ValuesBucket> & values,std::shared_ptr<TransactionOperations> trans)128 int32_t UriSensitiveOperations::BatchInsertOperation(MediaLibraryCommand &cmd,
129 std::vector<ValuesBucket> &values, std::shared_ptr<TransactionOperations> trans)
130 {
131 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
132 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_HAS_DB_ERROR, "UriSensitive insert operation, rdbStore is null.");
133
134 cmd.SetTableName(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
135 int64_t outInsertNum = -1;
136 int32_t errCode;
137 if (trans == nullptr) {
138 errCode = rdbStore->BatchInsert(cmd, outInsertNum, values);
139 } else {
140 errCode = trans->BatchInsert(cmd, outInsertNum, values);
141 }
142 bool cond = (errCode != NativeRdb::E_OK || outInsertNum < 0);
143 CHECK_AND_RETURN_RET_LOG(!cond, E_HAS_DB_ERROR,
144 "UriSensitive Insert into db failed, errCode = %{public}d", errCode);
145 return static_cast<int32_t>(outInsertNum);
146 }
147
QueryUriSensitive(MediaLibraryCommand & cmd,const std::vector<DataShareValuesBucket> & values,std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet)148 static void QueryUriSensitive(MediaLibraryCommand &cmd, const std::vector<DataShareValuesBucket> &values,
149 std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet)
150 {
151 vector<string> columns;
152 vector<string> predicateInColumns;
153 DataSharePredicates predicates;
154 bool isValid;
155 int64_t targetTokenId = values.at(0).Get(AppUriSensitiveColumn::TARGET_TOKENID, isValid);
156 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
157 CHECK_AND_RETURN_LOG(rdbStore != nullptr, "UriSensitive query operation, rdbStore is null.");
158
159 cmd.SetTableName(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
160 for (const auto &val : values) {
161 predicateInColumns.push_back(static_cast<string>(val.Get(AppUriSensitiveColumn::FILE_ID, isValid)));
162 }
163 predicates.In(AppUriSensitiveColumn::FILE_ID, predicateInColumns);
164 predicates.And()->EqualTo(AppUriSensitiveColumn::TARGET_TOKENID, (int64_t)targetTokenId);
165 NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(predicates, cmd.GetTableName());
166 resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
167 return;
168 }
169
CanConvertToInt32(const std::string & str)170 static bool CanConvertToInt32(const std::string &str)
171 {
172 std::istringstream iss(str);
173 int32_t num = 0;
174 iss >> num;
175 return iss.eof() && !iss.fail();
176 }
177
GetFileId(const DataShareValuesBucket & values,bool & isValid)178 static int32_t GetFileId(const DataShareValuesBucket &values, bool &isValid)
179 {
180 int32_t ret = E_ERR;
181 string fileIdStr = static_cast<string>(values.Get(AppUriSensitiveColumn::FILE_ID, isValid));
182 if (CanConvertToInt32(fileIdStr)) {
183 ret = static_cast<int32_t>(std::stoi(fileIdStr));
184 }
185 return ret;
186 }
187
GetSingleDbOperation(const vector<DataShareValuesBucket> & values,vector<int32_t> & dbOperation,vector<int32_t> & querySingleResultSet,int index)188 static void GetSingleDbOperation(const vector<DataShareValuesBucket> &values, vector<int32_t> &dbOperation,
189 vector<int32_t> &querySingleResultSet, int index)
190 {
191 bool isValid;
192 int32_t fileId = GetFileId(values.at(index), isValid);
193 CHECK_AND_RETURN_LOG(fileId != E_ERR, "Failed GetFileId");
194
195 int32_t uriType = values.at(index).Get(AppUriSensitiveColumn::URI_TYPE, isValid);
196 int32_t sensitiveType = values.at(index).Get(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, isValid);
197 if ((fileId == querySingleResultSet.at(FILE_ID_INDEX)) && (uriType == querySingleResultSet.at(URI_TYPE_INDEX))) {
198 if (sensitiveType == querySingleResultSet.at(SENSITIVE_TYPE_INDEX)) {
199 dbOperation[index] = NO_DB_OPERATION;
200 } else {
201 dbOperation[index] = UPDATE_DB_OPERATION;
202 }
203 }
204 }
205
GetAllUriDbOperation(const vector<DataShareValuesBucket> & values,vector<int32_t> & dbOperation,std::shared_ptr<OHOS::NativeRdb::ResultSet> & queryResult)206 static void GetAllUriDbOperation(const vector<DataShareValuesBucket> &values, vector<int32_t> &dbOperation,
207 std::shared_ptr<OHOS::NativeRdb::ResultSet> &queryResult)
208 {
209 for (const auto &val : values) {
210 dbOperation.push_back(INSERT_DB_OPERATION);
211 }
212 bool cond = ((queryResult == nullptr) || (queryResult->GoToFirstRow() != NativeRdb::E_OK));
213 CHECK_AND_RETURN_INFO_LOG(!cond, "UriSensitive query result is null.");
214
215 do {
216 vector<int32_t> querySingleResultSet;
217 querySingleResultSet.push_back(GetInt32Val(AppUriSensitiveColumn::FILE_ID, queryResult));
218 querySingleResultSet.push_back(GetInt32Val(AppUriSensitiveColumn::URI_TYPE, queryResult));
219 querySingleResultSet.push_back(GetInt32Val(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, queryResult));
220 for (size_t i = 0; i < values.size(); i++) {
221 GetSingleDbOperation(values, dbOperation, querySingleResultSet, i);
222 }
223 } while (!queryResult->GoToNextRow());
224 }
225
BatchUpdate(MediaLibraryCommand & cmd,std::vector<string> inColumn,int32_t tableType,const std::vector<DataShareValuesBucket> & values,std::shared_ptr<TransactionOperations> trans)226 static void BatchUpdate(MediaLibraryCommand &cmd, std::vector<string> inColumn, int32_t tableType,
227 const std::vector<DataShareValuesBucket> &values, std::shared_ptr<TransactionOperations> trans)
228 {
229 cmd.SetTableName(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
230 bool isValid;
231 int64_t targetTokenId = values.at(0).Get(AppUriSensitiveColumn::TARGET_TOKENID, isValid);
232 int64_t srcTokenId = values.at(0).Get(AppUriSensitiveColumn::SOURCE_TOKENID, isValid);
233 int32_t sensitiveType = values.at(0).Get(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, isValid);
234 DataShareValuesBucket valuesBucket;
235 DataSharePredicates predicates;
236 predicates.In(AppUriSensitiveColumn::FILE_ID, inColumn);
237 predicates.EqualTo(AppUriSensitiveColumn::TARGET_TOKENID, (int64_t)targetTokenId);
238 predicates.EqualTo(AppUriSensitiveColumn::SOURCE_TOKENID, (int64_t)srcTokenId);
239 predicates.And()->EqualTo(AppUriSensitiveColumn::URI_TYPE, to_string(tableType));
240 valuesBucket.Put(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, sensitiveType);
241 ValuesBucket value = RdbUtils::ToValuesBucket(valuesBucket);
242 if (value.IsEmpty()) {
243 MEDIA_ERR_LOG("MediaLibraryDataManager Insert: Input parameter is invalid");
244 return;
245 }
246 cmd.SetValueBucket(value);
247 NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(predicates, cmd.GetTableName());
248 UriSensitiveOperations::UpdateOperation(cmd, rdbPredicate, trans);
249 }
250
AppstateOberserverBuild(int32_t sensitiveType)251 static void AppstateOberserverBuild(int32_t sensitiveType)
252 {
253 MedialibraryAppStateObserverManager::GetInstance().SubscribeAppState();
254 }
255
ValueBucketCheck(const std::vector<DataShareValuesBucket> & values)256 static int32_t ValueBucketCheck(const std::vector<DataShareValuesBucket> &values)
257 {
258 bool isValidArr[] = {false, false, false, false, false};
259 if (values.empty()) {
260 return E_ERR;
261 }
262 for (const auto &val : values) {
263 val.Get(AppUriSensitiveColumn::FILE_ID, isValidArr[FILE_ID_INDEX]);
264 val.Get(AppUriSensitiveColumn::URI_TYPE, isValidArr[URI_TYPE_INDEX]);
265 val.Get(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, isValidArr[SENSITIVE_TYPE_INDEX]);
266 val.Get(AppUriSensitiveColumn::SOURCE_TOKENID, isValidArr[SRC_TOKEN_ID_INDEX]);
267 val.Get(AppUriSensitiveColumn::TARGET_TOKENID, isValidArr[TARGET_TOKEN_ID_INDEX]);
268 for (size_t i = 0; i < sizeof(isValidArr); i++) {
269 if ((isValidArr[i]) == false) {
270 return E_ERR;
271 }
272 }
273 }
274 return E_OK;
275 }
276
InsertValueBucketPrepare(const std::vector<DataShareValuesBucket> & values,int32_t fileId,int32_t uriType,std::vector<ValuesBucket> & batchInsertBucket)277 static void InsertValueBucketPrepare(const std::vector<DataShareValuesBucket> &values, int32_t fileId,
278 int32_t uriType, std::vector<ValuesBucket> &batchInsertBucket)
279 {
280 bool isValid;
281 ValuesBucket insertValues;
282 int64_t targetTokenId = values.at(0).Get(AppUriSensitiveColumn::TARGET_TOKENID, isValid);
283 int32_t sensitiveType = values.at(0).Get(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, isValid);
284 int64_t srcTokenId = values.at(0).Get(AppUriSensitiveColumn::SOURCE_TOKENID, isValid);
285 insertValues.Put(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, sensitiveType);
286 insertValues.Put(AppUriSensitiveColumn::FILE_ID, fileId);
287 insertValues.Put(AppUriSensitiveColumn::TARGET_TOKENID, (int64_t)targetTokenId);
288 insertValues.Put(AppUriSensitiveColumn::URI_TYPE, uriType);
289 insertValues.Put(AppUriSensitiveColumn::SOURCE_TOKENID, (int64_t)srcTokenId);
290 insertValues.Put(AppUriSensitiveColumn::DATE_MODIFIED, MediaFileUtils::UTCTimeMilliSeconds());
291 batchInsertBucket.push_back(insertValues);
292 }
293
GrantUriSensitive(MediaLibraryCommand & cmd,const std::vector<DataShareValuesBucket> & values)294 int32_t UriSensitiveOperations::GrantUriSensitive(MediaLibraryCommand &cmd,
295 const std::vector<DataShareValuesBucket> &values)
296 {
297 std::vector<string> photosValues;
298 std::vector<string> audiosValues;
299 std::vector<int32_t> dbOperation;
300 std::shared_ptr<OHOS::NativeRdb::ResultSet> resultSet;
301 std::vector<ValuesBucket> batchInsertBucket;
302 bool photoNeedToUpdate = false;
303 bool audioNeedToUpdate = false;
304 bool needToInsert = false;
305 bool isValid = false;
306 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
307 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_HAS_DB_ERROR, "Failed to get rdbStore.");
308 std::shared_ptr<TransactionOperations> trans = make_shared<TransactionOperations>(__func__);
309 int32_t err = E_OK;
310 std::function<int(void)> func = [&]()->int {
311 if (ValueBucketCheck(values) != E_OK) {
312 return E_ERR;
313 }
314 int32_t sensitiveType = values.at(0).Get(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE, isValid);
315 AppstateOberserverBuild(sensitiveType);
316 QueryUriSensitive(cmd, values, resultSet);
317 GetAllUriDbOperation(values, dbOperation, resultSet);
318 for (size_t i = 0; i < values.size(); i++) {
319 int32_t fileId = GetFileId(values.at(i), isValid);
320 int32_t uriType = values.at(i).Get(AppUriSensitiveColumn::URI_TYPE, isValid);
321 if ((dbOperation.at(i) == UPDATE_DB_OPERATION) && (uriType == PHOTOSTYPE)) {
322 photoNeedToUpdate = true;
323 photosValues.push_back(static_cast<string>(values.at(i).Get(AppUriSensitiveColumn::FILE_ID, isValid)));
324 } else if ((dbOperation.at(i) == UPDATE_DB_OPERATION) && (uriType == AUDIOSTYPE)) {
325 audioNeedToUpdate = true;
326 audiosValues.push_back(static_cast<string>(values.at(i).Get(AppUriSensitiveColumn::FILE_ID, isValid)));
327 } else if (dbOperation.at(i) == INSERT_DB_OPERATION) {
328 needToInsert = true;
329 InsertValueBucketPrepare(values, fileId, uriType, batchInsertBucket);
330 }
331 }
332 if (photoNeedToUpdate) {
333 BatchUpdate(cmd, photosValues, PHOTOSTYPE, values, trans);
334 }
335 if (audioNeedToUpdate) {
336 BatchUpdate(cmd, audiosValues, AUDIOSTYPE, values, trans);
337 }
338 if (needToInsert) {
339 UriSensitiveOperations::BatchInsertOperation(cmd, batchInsertBucket, trans);
340 }
341 return err;
342 };
343 err = trans->RetryTrans(func);
344 CHECK_AND_RETURN_RET_LOG(err == E_OK, err, "GrantUriSensitive: tans finish fail!, ret:%{public}d", err);
345 return E_OK;
346 }
347
IsOwnerPriviledge(const uint32_t & tokenId,const std::string & fileId)348 static bool IsOwnerPriviledge(const uint32_t &tokenId, const std::string &fileId)
349 {
350 NativeRdb::RdbPredicates rdbPredicate(AppUriPermissionColumn::APP_URI_PERMISSION_TABLE);
351 rdbPredicate.EqualTo(AppUriPermissionColumn::TARGET_TOKENID, (int64_t)tokenId);
352 rdbPredicate.EqualTo(AppUriPermissionColumn::FILE_ID, fileId);
353 rdbPredicate.EqualTo(AppUriPermissionColumn::PERMISSION_TYPE,
354 AppUriPermissionColumn::PERMISSION_PERSIST_READ_WRITE);
355 vector<string> columns;
356 auto resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
357 CHECK_AND_RETURN_RET(resultSet != nullptr, false);
358 int32_t numRows = 0;
359 resultSet->GetRowCount(numRows);
360 return numRows > 0;
361 }
362
QuerySensitiveType(const uint32_t & tokenId,const std::string & fileId)363 int32_t UriSensitiveOperations::QuerySensitiveType(const uint32_t &tokenId, const std::string &fileId)
364 {
365 // OwnerPriviledge donot need anonymize
366 if (IsOwnerPriviledge(tokenId, fileId)) {
367 return AppUriSensitiveColumn::SENSITIVE_NO_DESENSITIZE;
368 }
369
370 NativeRdb::RdbPredicates rdbPredicate(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
371 rdbPredicate.BeginWrap();
372 rdbPredicate.And()->EqualTo(AppUriSensitiveColumn::TARGET_TOKENID, (int64_t)tokenId);
373 rdbPredicate.EndWrap();
374 rdbPredicate.And()->EqualTo(AppUriSensitiveColumn::FILE_ID, fileId);
375
376 vector<string> columns;
377 columns.push_back(AppUriSensitiveColumn::ID);
378 columns.push_back(AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE);
379
380 auto resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
381 CHECK_AND_RETURN_RET(resultSet != nullptr, 0);
382
383 int32_t numRows = 0;
384 resultSet->GetRowCount(numRows);
385 if (numRows == 0) {
386 return 0;
387 }
388 resultSet->GoToFirstRow();
389 return MediaLibraryRdbStore::GetInt(resultSet, AppUriSensitiveColumn::HIDE_SENSITIVE_TYPE);
390 }
391
QueryForceSensitive(const uint32_t & tokenId,const std::string & fileId)392 bool UriSensitiveOperations::QueryForceSensitive(const uint32_t &tokenId,
393 const std::string &fileId)
394 {
395 NativeRdb::RdbPredicates rdbPredicate(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
396 rdbPredicate.BeginWrap();
397 rdbPredicate.And()->EqualTo(AppUriSensitiveColumn::TARGET_TOKENID, (int64_t)tokenId);
398 rdbPredicate.EndWrap();
399 rdbPredicate.And()->EqualTo(AppUriSensitiveColumn::FILE_ID, fileId);
400
401 vector<string> columns;
402 columns.push_back(AppUriSensitiveColumn::ID);
403 columns.push_back(AppUriSensitiveColumn::IS_FORCE_SENSITIVE);
404
405 auto resultSet = MediaLibraryRdbStore::Query(rdbPredicate, columns);
406 CHECK_AND_RETURN_RET(resultSet != nullptr, false);
407
408 int32_t numRows = 0;
409 resultSet->GetRowCount(numRows);
410 if (numRows == 0) {
411 return false;
412 }
413 resultSet->GoToFirstRow();
414 return MediaLibraryRdbStore::GetInt(resultSet, AppUriSensitiveColumn::IS_FORCE_SENSITIVE) > 0;
415 }
416 }
417 }