• 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 #include "medialibrary_appstate_observer.h"
16 
17 #include <cstddef>
18 #include <sstream>
19 #include <string>
20 
21 #include "if_system_ability_manager.h"
22 #include "iservice_registry.h"
23 #include "media_app_uri_permission_column.h"
24 #include "media_app_uri_sensitive_column.h"
25 #include "media_library_manager.h"
26 #include "media_log.h"
27 #include "medialibrary_data_manager.h"
28 #include "medialibrary_errno.h"
29 #include "permission_utils.h"
30 #include "system_ability_definition.h"
31 
32 namespace OHOS {
33 namespace Media {
34 using namespace OHOS::AppExecFwk;
35 
GetAppManagerInstance()36 sptr<IAppMgr> MedialibraryAppStateObserverManager::GetAppManagerInstance()
37 {
38     sptr<ISystemAbilityManager> systemAbilityManager =
39         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
40     CHECK_AND_RETURN_RET_LOG(systemAbilityManager != nullptr, nullptr, "systemAbilityManager is nullptr");
41 
42     sptr<IRemoteObject> object = systemAbilityManager->GetSystemAbility(APP_MGR_SERVICE_ID);
43     CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "systemAbilityManager remote object is nullptr");
44     return iface_cast<IAppMgr>(object);
45 }
46 
SubscribeAppState()47 void MedialibraryAppStateObserverManager::SubscribeAppState()
48 {
49     MEDIA_INFO_LOG("SubscribeAppState");
50     sptr<IAppMgr> appManager = GetAppManagerInstance();
51     CHECK_AND_RETURN_LOG(appManager != nullptr, "GetAppManagerInstance failed");
52     CHECK_AND_RETURN_INFO_LOG(appStateObserver_ == nullptr, "appStateObserver has been registed");
53 
54     appStateObserver_ = new (std::nothrow) MedialibraryAppStateObserver();
55     CHECK_AND_RETURN_LOG(appStateObserver_ != nullptr, "get appStateObserver failed");
56 
57     int32_t result = appManager->RegisterApplicationStateObserver(appStateObserver_);
58     if (result != E_SUCCESS) {
59         MEDIA_ERR_LOG("RegistApplicationStateObserver failed");
60         appStateObserver_ = nullptr;
61         return;
62     }
63 
64     MEDIA_INFO_LOG("SubscribeAppState success");
65     return;
66 }
67 
UnSubscribeAppState()68 void MedialibraryAppStateObserverManager::UnSubscribeAppState()
69 {
70     CHECK_AND_RETURN_LOG(appStateObserver_ != nullptr, "appStateObserver_ is nullptr");
71 
72     sptr<IAppMgr> appManager = GetAppManagerInstance();
73     CHECK_AND_RETURN_LOG(appManager != nullptr, "GetAppManagerInstance failed");
74 
75     int32_t result = appManager->UnregisterApplicationStateObserver(appStateObserver_);
76     CHECK_AND_RETURN_LOG(result == E_SUCCESS, "UnregisterApplicationStateObserver failed");
77 
78     appStateObserver_ = nullptr;
79     MEDIA_INFO_LOG("UnSubscribeAppState success");
80     return;
81 }
82 
GetInstance()83 MedialibraryAppStateObserverManager &MedialibraryAppStateObserverManager::GetInstance()
84 {
85     static MedialibraryAppStateObserverManager instance;
86     return instance;
87 }
88 
CountTemporaryPermission(const std::shared_ptr<MediaLibraryRdbStore> rdbStore)89 static int32_t CountTemporaryPermission(const std::shared_ptr<MediaLibraryRdbStore> rdbStore)
90 {
91     NativeRdb::AbsRdbPredicates predicatesUnSubscribe(AppUriPermissionColumn::APP_URI_PERMISSION_TABLE);
92     vector<string> permissionTypes;
93     permissionTypes.emplace_back(to_string(
94         static_cast<int32_t>(PhotoPermissionType::TEMPORARY_READ_IMAGEVIDEO)));
95     permissionTypes.emplace_back(to_string(
96         static_cast<int32_t>(PhotoPermissionType::TEMPORARY_WRITE_IMAGEVIDEO)));
97     permissionTypes.emplace_back(to_string(
98         static_cast<int32_t>(PhotoPermissionType::TEMPORARY_READWRITE_IMAGEVIDEO)));
99     predicatesUnSubscribe.And()->In(AppUriPermissionColumn::PERMISSION_TYPE, permissionTypes);
100     vector<string> columns = { AppUriPermissionColumn::ID };
101     auto resultSet = rdbStore->Query(predicatesUnSubscribe, columns);
102     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_ERR, "Can not query URIPERMISSION");
103 
104     int32_t count = 0;
105     auto ret = resultSet->GetRowCount(count);
106     CHECK_AND_RETURN_RET_LOG(ret == NativeRdb::E_OK, E_ERR, "GetRowCount failed ret:%{public}d", ret);
107     return count;
108 }
109 
CountHideSensitive(const std::shared_ptr<MediaLibraryRdbStore> rdbStore)110 static int32_t CountHideSensitive(const std::shared_ptr<MediaLibraryRdbStore> rdbStore)
111 {
112     NativeRdb::AbsRdbPredicates predicatesUnSubscribe(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
113     vector<string> columns = { AppUriPermissionColumn::ID };
114     auto resultSet = rdbStore->Query(predicatesUnSubscribe, columns);
115     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_ERR, "Can not query URIPERMISSION");
116 
117     int32_t count = 0;
118     auto ret = resultSet->GetRowCount(count);
119     CHECK_AND_RETURN_RET_LOG(ret == NativeRdb::E_OK, E_ERR, "GetRowCount failed ret:%{public}d", ret);
120     return count;
121 }
122 
TryUnSubscribeAppState(const std::shared_ptr<MediaLibraryRdbStore> rdbStore)123 static void TryUnSubscribeAppState(const std::shared_ptr<MediaLibraryRdbStore> rdbStore)
124 {
125     int32_t countPermission = CountTemporaryPermission(rdbStore);
126     int32_t countSensitive = CountHideSensitive(rdbStore);
127     bool cond = (countPermission < 0 || countSensitive < 0);
128     CHECK_AND_PRINT_LOG(!cond, "TryUnSubscribeAppState System exception");
129 
130     if (countPermission == 0 && countSensitive == 0) {
131         MedialibraryAppStateObserverManager::GetInstance().UnSubscribeAppState();
132         MEDIA_INFO_LOG("No temporary permission record remains ,UnSubscribeAppState");
133     }
134 }
135 
DeleteTemporaryPermission(const std::shared_ptr<MediaLibraryRdbStore> rdbStore,const uint32_t tokenId)136 static int32_t DeleteTemporaryPermission(const std::shared_ptr<MediaLibraryRdbStore> rdbStore, const uint32_t tokenId)
137 {
138     NativeRdb::AbsRdbPredicates predicates(AppUriPermissionColumn::APP_URI_PERMISSION_TABLE);
139     predicates.EqualTo(AppUriPermissionColumn::TARGET_TOKENID, static_cast<int64_t>(tokenId));
140     vector<string> permissionTypes;
141     permissionTypes.emplace_back(to_string(
142         static_cast<int32_t>(PhotoPermissionType::TEMPORARY_READ_IMAGEVIDEO)));
143     permissionTypes.emplace_back(to_string(
144         static_cast<int32_t>(PhotoPermissionType::TEMPORARY_WRITE_IMAGEVIDEO)));
145     permissionTypes.emplace_back(to_string(
146         static_cast<int32_t>(PhotoPermissionType::TEMPORARY_READWRITE_IMAGEVIDEO)));
147     predicates.And()->In(AppUriPermissionColumn::PERMISSION_TYPE, permissionTypes);
148     int32_t deletedRows = -1;
149 
150     auto ret = rdbStore->Delete(deletedRows, predicates);
151     bool cond = (ret != NativeRdb::E_OK || deletedRows < 0);
152     CHECK_AND_PRINT_LOG(!cond, "Story Delete db failed, errCode = %{public}d", ret);
153     MEDIA_INFO_LOG("Uripermission Delete retVal: %{public}d, deletedRows: %{public}d", ret, deletedRows);
154 
155     return deletedRows;
156 }
157 
DeleteHideSensitive(const std::shared_ptr<MediaLibraryRdbStore> rdbStore,const uint32_t tokenId)158 static int32_t DeleteHideSensitive(const std::shared_ptr<MediaLibraryRdbStore> rdbStore, const uint32_t tokenId)
159 {
160     NativeRdb::AbsRdbPredicates predicates(AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE);
161     predicates.EqualTo(AppUriPermissionColumn::TARGET_TOKENID, static_cast<int64_t>(tokenId));
162     int32_t deletedRows = -1;
163     auto ret = rdbStore->Delete(deletedRows, predicates);
164     bool cond = (ret != NativeRdb::E_OK || deletedRows < 0);
165     CHECK_AND_PRINT_LOG(!cond, "Story Delete db failed, errCode = %{public}d", ret);
166     MEDIA_INFO_LOG("Uripermission Delete retVal: %{public}d, deletedRows: %{public}d", ret, deletedRows);
167 
168     return deletedRows;
169 }
170 
OnAppStopped(const AppStateData & appStateData)171 void MedialibraryAppStateObserver::OnAppStopped(const AppStateData &appStateData)
172 {
173     auto tokenId = appStateData.accessTokenId;
174     MEDIA_INFO_LOG("MedialibraryAppStateObserver OnAppStopped, tokenId:%{public}d", tokenId);
175     auto rdbStore = MediaLibraryDataManager::GetInstance()->rdbStore_;
176     CHECK_AND_RETURN_LOG(rdbStore != nullptr, "Uripermission Delete failed, rdbStore is null.");
177 
178     int32_t deletedRowsPermission = DeleteTemporaryPermission(rdbStore, tokenId);
179     int32_t deletedRowsSensitive = DeleteHideSensitive(rdbStore, tokenId);
180     if (deletedRowsPermission == 0 && deletedRowsSensitive == 0) {
181         return;
182     }
183     TryUnSubscribeAppState(rdbStore);
184 }
185 }  // namespace Media
186 }  // namespace OHOS
187