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