• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "bundle_sandbox_data_mgr.h"
17 
18 #include "app_log_wrapper.h"
19 #include "bundle_constants.h"
20 #include "bundle_mgr_service.h"
21 #include "bundle_util.h"
22 
23 namespace OHOS {
24 namespace AppExecFwk {
BundleSandboxDataMgr()25 BundleSandboxDataMgr::BundleSandboxDataMgr()
26 {
27     APP_LOGI("BundleSandboxDataMgr instance is created");
28     sandboxManagerDb_ = std::make_shared<SandboxManagerRdb>();
29     if (sandboxManagerDb_ == nullptr) {
30         APP_LOGE("create sandboxManagerDb_ failed.");
31         return;
32     }
33     if (!RestoreSandboxPersistentInnerBundleInfo()) {
34         APP_LOGW("RestoreSandboxPersistentInnerBundleInfo failed.");
35     }
36 }
37 
~BundleSandboxDataMgr()38 BundleSandboxDataMgr::~BundleSandboxDataMgr()
39 {
40     APP_LOGI("BundleSandboxDataMgr instance is destroyed");
41 }
42 
SaveSandboxAppInfo(const InnerBundleInfo & info,const int32_t & appIndex)43 void BundleSandboxDataMgr::SaveSandboxAppInfo(const InnerBundleInfo &info, const int32_t &appIndex)
44 {
45     APP_LOGI("SaveSandboxAppInfo begin");
46     std::string bundleName = info.GetBundleName();
47     if (bundleName.empty()) {
48         APP_LOGE("SaveSandboxAppInfo bundleName is empty");
49         return;
50     }
51     std::string key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + bundleName;
52     std::unique_lock<std::shared_mutex> lock(sandboxAppMutex_);
53     sandboxAppInfos_[key] = info;
54     APP_LOGD("save sandbox app %{public}s info successfully", key.c_str());
55 }
56 
DeleteSandboxAppInfo(const std::string & bundleName,const int32_t & appIndex)57 void BundleSandboxDataMgr::DeleteSandboxAppInfo(const std::string &bundleName, const int32_t &appIndex)
58 {
59     APP_LOGI("DeleteSandboxAppInfo begin");
60     if (bundleName.empty()) {
61         APP_LOGE("DeleteSandboxAppInfo bundleName is empty");
62         return;
63     }
64     auto key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + bundleName;
65     std::unique_lock<std::shared_mutex> lock(sandboxAppMutex_);
66     auto ret = sandboxAppInfos_.erase(key);
67     if (ret == 0) {
68         APP_LOGE("delete sandbox app info failed due to no sandbox app in the dataMgr");
69         return;
70     }
71     APP_LOGD("delete sandbox app %{public}s info successfully", key.c_str());
72 }
73 
GetSandboxAppInfo(const std::string & bundleName,const int32_t & appIndex,int32_t & userId,InnerBundleInfo & info) const74 ErrCode BundleSandboxDataMgr::GetSandboxAppInfo(
75     const std::string &bundleName, const int32_t &appIndex, int32_t &userId, InnerBundleInfo &info) const
76 {
77     APP_LOGI("GetSandboxAppInfo begin");
78     if (bundleName.empty()) {
79         APP_LOGE("GetSandboxAppInfo bundleName is empty");
80         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
81     }
82     if (appIndex <= Constants::INITIAL_APP_INDEX) {
83         APP_LOGE("GetSandboxAppInfo appIndex is invalid");
84         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
85     }
86     if (userId < Constants::DEFAULT_USERID) {
87         APP_LOGE("userId(%{public}d) is invalid.", userId);
88         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
89     }
90 
91     auto key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + bundleName;
92 
93     {
94         std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
95         auto it = sandboxAppInfos_.find(key);
96         if (it == sandboxAppInfos_.end()) {
97             APP_LOGE("GetSandboxAppInfo no sandbox app info can be found");
98             return ERR_APPEXECFWK_SANDBOX_INSTALL_NO_SANDBOX_APP_INFO;
99         }
100 
101         InnerBundleUserInfo userInfo;
102         if (!(it->second).GetInnerBundleUserInfo(userId, userInfo)) {
103             APP_LOGE("the sandbox app is not installed at this user %{public}d", userId);
104             return ERR_APPEXECFWK_SANDBOX_INSTALL_NOT_INSTALLED_AT_SPECIFIED_USERID;
105         }
106         info = it->second;
107     }
108 
109     APP_LOGI("GetSandboxAppInfo successfully");
110     return ERR_OK;
111 }
112 
GetSandboxAppBundleInfo(const std::string & bundleName,const int32_t & appIndex,const int32_t & userId,BundleInfo & info) const113 ErrCode BundleSandboxDataMgr::GetSandboxAppBundleInfo(
114     const std::string &bundleName, const int32_t &appIndex, const int32_t &userId, BundleInfo &info) const
115 {
116     APP_LOGI("GetSandboxAppBundleInfo begin");
117     InnerBundleInfo innerBundleInfo;
118     int32_t requestUserId = userId;
119     ErrCode result = ERR_OK;
120     if ((result = GetSandboxAppInfo(bundleName, appIndex, requestUserId, innerBundleInfo)) != ERR_OK) {
121         APP_LOGE("GetSandboxAppBundleInfo get sandbox app info failed");
122         return result;
123     }
124     InnerBundleUserInfo userInfo;
125     if (!innerBundleInfo.GetInnerBundleUserInfo(requestUserId, userInfo)) {
126         APP_LOGE("the origin application is not installed at current user");
127         return ERR_APPEXECFWK_SANDBOX_INSTALL_NOT_INSTALLED_AT_SPECIFIED_USERID;
128     }
129 
130     innerBundleInfo.GetBundleInfo(
131         BundleFlag::GET_BUNDLE_DEFAULT |
132         BundleFlag::GET_BUNDLE_WITH_ABILITIES |
133         BundleFlag::GET_BUNDLE_WITH_REQUESTED_PERMISSION |
134         BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO |
135         BundleFlag::GET_BUNDLE_WITH_HASH_VALUE, info, requestUserId);
136     APP_LOGI("GetSandboxAppBundleInfo successfully");
137     return ERR_OK;
138 }
139 
GenerateSandboxAppIndex(const std::string & bundleName)140 int32_t BundleSandboxDataMgr::GenerateSandboxAppIndex(const std::string &bundleName)
141 {
142     APP_LOGI("GenerateSandboxAppIndex begin");
143     if (bundleName.empty()) {
144         APP_LOGE("GenerateSandboxAppIndex bundleName is empty");
145         return Constants::INITIAL_APP_INDEX;
146     }
147     std::unique_lock<std::mutex> lock(sandboxAppIndexMapMutex_);
148     auto firstIterator = sandboxAppIndexMap_.find(bundleName);
149     if (firstIterator == sandboxAppIndexMap_.end()) {
150         std::set<int32_t> innerSet { Constants::INITIAL_APP_INDEX + 1 };
151         sandboxAppIndexMap_.emplace(bundleName, innerSet);
152         APP_LOGD("GenerateSandboxAppIndex successfully");
153         return Constants::INITIAL_APP_INDEX + 1;
154     }
155 
156     if (firstIterator->second.empty()) {
157         firstIterator->second.insert(Constants::INITIAL_APP_INDEX + 1);
158         APP_LOGD("GenerateSandboxAppIndex successfully");
159         return Constants::INITIAL_APP_INDEX + 1;
160     }
161 
162     int32_t pre = Constants::INITIAL_APP_INDEX;
163     for (const auto &item : firstIterator->second) {
164         if (item == pre + 1) {
165             pre++;
166             continue;
167         }
168         break;
169     }
170 
171     int32_t newAppIndex = pre + 1;
172     if (newAppIndex > Constants::MAX_APP_INDEX) {
173         APP_LOGE("GenerateSandboxAppIndex failed due to exceed limitation of maximum appIndex");
174         return Constants::INITIAL_APP_INDEX;
175     }
176     firstIterator->second.insert(newAppIndex);
177     APP_LOGD("GenerateSandboxAppIndex successfully with appIndex %{public}d", newAppIndex);
178     return newAppIndex;
179 }
180 
DeleteSandboxAppIndex(const std::string & bundleName,int32_t appIndex)181 bool BundleSandboxDataMgr::DeleteSandboxAppIndex(const std::string &bundleName, int32_t appIndex)
182 {
183     APP_LOGI("DeleteSandboxAppIndex begin");
184     if (bundleName.empty()) {
185         APP_LOGE("DeleteSandboxAppIndex bundleName is empty");
186         return false;
187     }
188     std::unique_lock<std::mutex> lock(sandboxAppIndexMapMutex_);
189     auto it = sandboxAppIndexMap_.find(bundleName);
190     if (it == sandboxAppIndexMap_.end() || it->second.empty()) {
191         APP_LOGE("no sandbox app can be found %{public}s", bundleName.c_str());
192         return false;
193     }
194 
195     auto ret = it->second.erase(appIndex);
196     if (ret == 0) {
197         APP_LOGE("no sandbox app index can be found %{public}d", appIndex);
198         return false;
199     }
200 
201     if (it->second.empty()) {
202         sandboxAppIndexMap_.erase(bundleName);
203     }
204     APP_LOGI("DeleteSandboxAppIndex successfully");
205     return true;
206 }
207 
GetSandboxAppInfoMap() const208 std::unordered_map<std::string, InnerBundleInfo> BundleSandboxDataMgr::GetSandboxAppInfoMap() const
209 {
210     std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
211     return sandboxAppInfos_;
212 }
213 
GetSandboxHapModuleInfo(const AbilityInfo & abilityInfo,int32_t appIndex,int32_t userId,HapModuleInfo & hapModuleInfo) const214 ErrCode BundleSandboxDataMgr::GetSandboxHapModuleInfo(const AbilityInfo &abilityInfo, int32_t appIndex, int32_t userId,
215     HapModuleInfo &hapModuleInfo) const
216 {
217     APP_LOGD("GetSandboxHapModuleInfo %{public}s", abilityInfo.bundleName.c_str());
218     // check appIndex
219     if (appIndex <= Constants::INITIAL_APP_INDEX || appIndex > Constants::MAX_APP_INDEX) {
220         APP_LOGE("the appIndex %{public}d is invalid", appIndex);
221         return ERR_APPEXECFWK_SANDBOX_QUERY_PARAM_ERROR;
222     }
223     std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
224     auto key = std::to_string(appIndex) + Constants::FILE_UNDERLINE + abilityInfo.bundleName;
225     auto infoItem = sandboxAppInfos_.find(key);
226     if (infoItem == sandboxAppInfos_.end()) {
227         APP_LOGE("no sandbox app can be found %{public}s", abilityInfo.bundleName.c_str());
228         return ERR_APPEXECFWK_SANDBOX_QUERY_NO_SANDBOX_APP;
229     }
230 
231     const InnerBundleInfo &innerBundleInfo = infoItem->second;
232     int32_t responseUserId = innerBundleInfo.GetResponseUserId(userId);
233     auto module = innerBundleInfo.FindHapModuleInfo(abilityInfo.package, responseUserId);
234     if (!module) {
235         APP_LOGE("can not find module %{public}s", abilityInfo.package.c_str());
236         return ERR_APPEXECFWK_SANDBOX_QUERY_NO_MODULE_INFO;
237     }
238     hapModuleInfo = *module;
239     return ERR_OK;
240 }
241 
GetInnerBundleInfoByUid(const int32_t & uid,InnerBundleInfo & innerBundleInfo) const242 ErrCode BundleSandboxDataMgr::GetInnerBundleInfoByUid(const int32_t &uid, InnerBundleInfo &innerBundleInfo) const
243 {
244     APP_LOGD("GetInnerBundleInfoByUid with uid is %{public}d", uid);
245     int32_t userId = BundleUtil::GetUserIdByUid(uid);
246     APP_LOGD("GetInnerBundleInfoByUid with userId is %{public}d", userId);
247     if (userId == Constants::UNSPECIFIED_USERID || userId == Constants::INVALID_USERID) {
248         APP_LOGE("the uid %{public}d is illegal when get bundleName by uid.", uid);
249         return ERR_APPEXECFWK_SANDBOX_QUERY_INVALID_USER_ID;
250     }
251 
252     {
253         std::shared_lock<std::shared_mutex> lock(sandboxAppMutex_);
254         if (!sandboxAppInfos_.empty()) {
255             for (const auto &item : sandboxAppInfos_) {
256                 const InnerBundleInfo &info = item.second;
257                 auto innerUid = info.GetUid(userId);
258                 APP_LOGD("GetInnerBundleInfoByUid with innerUid is %{public}d", innerUid);
259                 if (innerUid == uid) {
260                     innerBundleInfo = info;
261                     return ERR_OK;
262                 }
263             }
264         }
265     }
266     return ERR_APPEXECFWK_SANDBOX_QUERY_NO_SANDBOX_APP;
267 }
268 
SaveSandboxPersistentInfo(const std::string & bundleName,const InnerBundleInfo & innerBundleInfo)269 bool BundleSandboxDataMgr::SaveSandboxPersistentInfo(const std::string &bundleName,
270     const InnerBundleInfo &innerBundleInfo)
271 {
272     APP_LOGD("SaveSandboxPersistentInfo for bundleName %{public}s", bundleName.c_str());
273     std::unique_lock<std::shared_mutex> lock(sandboxDbMutex_);
274     if (sandboxManagerDb_ == nullptr) {
275         APP_LOGE("error sandboxManagerDb_ is nullptr.");
276         return false;
277     }
278     return sandboxManagerDb_->SaveSandboxInnerBundleInfo(bundleName, innerBundleInfo);
279 }
280 
RemoveSandboxPersistentInfo(const std::string & bundleName)281 bool BundleSandboxDataMgr::RemoveSandboxPersistentInfo(const std::string &bundleName)
282 {
283     APP_LOGD("RemoveSandboxPersistentInfo for bundleName %{public}s", bundleName.c_str());
284     std::unique_lock<std::shared_mutex> lock(sandboxDbMutex_);
285     if (sandboxManagerDb_ == nullptr) {
286         APP_LOGE("error sandboxManagerDb_ is nullptr.");
287         return false;
288     }
289     return sandboxManagerDb_->DeleteSandboxInnerBundleInfo(bundleName);
290 }
291 
RestoreSandboxPersistentInnerBundleInfo()292 bool BundleSandboxDataMgr::RestoreSandboxPersistentInnerBundleInfo()
293 {
294     APP_LOGD("start to RestoreSandboxPersistentInnerBundleInfo");
295     std::unique_lock<std::shared_mutex> lockDbMutex(sandboxDbMutex_);
296     if (sandboxManagerDb_ == nullptr) {
297         APP_LOGE("error sandboxManagerDb_ is nullptr.");
298         return false;
299     }
300     std::unique_lock<std::shared_mutex> lockAppMutex(sandboxAppMutex_);
301     if (!sandboxManagerDb_->QueryAllSandboxInnerBundleInfo(sandboxAppInfos_)) {
302         APP_LOGE("QueryAllSandboxInnerBundleInfo failed");
303         return false;
304     }
305     for (const auto &sandboxInfo : sandboxAppInfos_) {
306         auto fileUnderlinePos = sandboxInfo.first.find(Constants::FILE_UNDERLINE);
307         if (fileUnderlinePos == std::string::npos) {
308             APP_LOGW("invalid bundleName_appIndex");
309             continue;
310         }
311         std::string appIndexStr = sandboxInfo.first.substr(0, fileUnderlinePos);
312         std::string bundleName = sandboxInfo.first.substr(fileUnderlinePos + 1);
313         int32_t appIndex = 0;
314         if (!OHOS::StrToInt(appIndexStr, appIndex)) {
315             APP_LOGW("invalid appIndex %{public}s", appIndexStr.c_str());
316             continue;
317         }
318         if (!RestoreSandboxAppIndex(bundleName, appIndex)) {
319             APP_LOGW("RestoreSandboxAppIndex appIndex failed");
320         }
321     }
322     return true;
323 }
324 
RestoreSandboxAppIndex(const std::string & bundleName,int32_t appIndex)325 bool BundleSandboxDataMgr::RestoreSandboxAppIndex(const std::string &bundleName, int32_t appIndex)
326 {
327     APP_LOGD("RestoreSandboxAppIndex begin");
328     if (bundleName.empty()) {
329         APP_LOGE("RestoreSandboxAppIndex bundleName is empty");
330         return false;
331     }
332     std::unique_lock<std::mutex> lock(sandboxAppIndexMapMutex_);
333     auto firstIterator = sandboxAppIndexMap_.find(bundleName);
334     if (firstIterator == sandboxAppIndexMap_.end()) {
335         std::set<int32_t> innerSet { appIndex };
336         sandboxAppIndexMap_.emplace(bundleName, innerSet);
337         APP_LOGD("RestoreSandboxAppIndex successfully");
338         return true;
339     }
340 
341     firstIterator->second.insert(appIndex);
342     APP_LOGD("RestoreSandboxAppIndex finish");
343     return true;
344 }
345 
RestoreSandboxUidAndGid(std::map<int32_t,std::string> & bundleIdMap)346 void BundleSandboxDataMgr::RestoreSandboxUidAndGid(std::map<int32_t, std::string> &bundleIdMap)
347 {
348     APP_LOGD("RestoreSandboxUidAndGid begin");
349     for (const auto &info : sandboxAppInfos_) {
350         for (auto infoItem : info.second.GetInnerBundleUserInfos()) {
351             auto innerBundleUserInfo = infoItem.second;
352             int32_t bundleId = innerBundleUserInfo.uid -
353                 innerBundleUserInfo.bundleUserInfo.userId * Constants::BASE_USER_RANGE;
354             auto item = bundleIdMap.find(bundleId);
355             if (item == bundleIdMap.end()) {
356                 bundleIdMap.emplace(bundleId, info.first);
357             } else {
358                 bundleIdMap[bundleId] = info.first;
359             }
360             BundleUtil::MakeFsConfig(info.first, bundleId, Constants::HMDFS_CONFIG_PATH);
361             BundleUtil::MakeFsConfig(info.first, bundleId, Constants::SHAREFS_CONFIG_PATH);
362         }
363     }
364     APP_LOGD("RestoreSandboxUidAndGid finish");
365 }
366 } // AppExecFwk
367 } // OHOS