• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "ipc/storage_manager_stub.h"
17 #include "accesstoken_kit.h"
18 #include "ipc_skeleton.h"
19 #include "storage_manager_ipc_interface_code.h"
20 #include "storage_service_errno.h"
21 #include "storage_service_log.h"
22 
23 namespace OHOS {
24 namespace StorageManager {
25 using namespace std;
26 
27 constexpr pid_t ACCOUNT_UID = 3058;
28 constexpr pid_t BACKUP_SA_UID = 1089;
29 constexpr pid_t FOUNDATION_UID = 5523;
30 constexpr pid_t DFS_UID = 1009;
31 const std::string PERMISSION_STORAGE_MANAGER_CRYPT = "ohos.permission.STORAGE_MANAGER_CRYPT";
32 const std::string PERMISSION_STORAGE_MANAGER = "ohos.permission.STORAGE_MANAGER";
33 const std::string PERMISSION_MOUNT_MANAGER = "ohos.permission.MOUNT_UNMOUNT_MANAGER";
34 const std::string PERMISSION_FORMAT_MANAGER = "ohos.permission.MOUNT_FORMAT_MANAGER";
35 const std::string PROCESS_NAME_FOUNDATION = "foundation";
36 
CheckClientPermission(const std::string & permissionStr)37 bool CheckClientPermission(const std::string& permissionStr)
38 {
39     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
40     auto uid = IPCSkeleton::GetCallingUid();
41     auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenCaller);
42     int res;
43     if (tokenType == Security::AccessToken::TOKEN_NATIVE && uid == ACCOUNT_UID) {
44         res = Security::AccessToken::PermissionState::PERMISSION_GRANTED;
45     } else {
46         res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permissionStr);
47     }
48 
49     if (res == Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
50         LOGD("StorageMangaer permissionCheck pass!");
51         return true;
52     }
53     LOGE("StorageManager permissionCheck error, need %{public}s", permissionStr.c_str());
54     return false;
55 }
56 
CheckClientPermissionForCrypt(const std::string & permissionStr)57 bool CheckClientPermissionForCrypt(const std::string& permissionStr)
58 {
59     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
60     int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, permissionStr);
61     if (res == Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
62         LOGD("StorageMangaer permissionCheck pass!");
63         return true;
64     }
65     LOGE("StorageManager permissionCheck error, need %{public}s", permissionStr.c_str());
66     return false;
67 }
68 
CheckClientPermissionForShareFile()69 bool CheckClientPermissionForShareFile()
70 {
71     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
72     Security::AccessToken::NativeTokenInfo nativeInfo;
73     Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenCaller, nativeInfo);
74 
75     auto uid = IPCSkeleton::GetCallingUid();
76     if (nativeInfo.processName != PROCESS_NAME_FOUNDATION || uid != FOUNDATION_UID) {
77         LOGE("CheckClientPermissionForShareFile error, processName is %{public}s, uid is %{public}d",
78             nativeInfo.processName.c_str(), uid);
79         return false;
80     }
81 
82     return true;
83 }
84 
StorageManagerStub()85 StorageManagerStub::StorageManagerStub()
86 {
87     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::PREPARE_ADD_USER)] =
88         &StorageManagerStub::HandlePrepareAddUser;
89     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::REMOVE_USER)] =
90         &StorageManagerStub::HandleRemoveUser;
91     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::PREPARE_START_USER)] =
92         &StorageManagerStub::HandlePrepareStartUser;
93     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::STOP_USER)] =
94         &StorageManagerStub::HandleStopUser;
95     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_TOTAL)] =
96         &StorageManagerStub::HandleGetTotal;
97     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_FREE)] =
98         &StorageManagerStub::HandleGetFree;
99     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_SYSTEM_SIZE)] =
100         &StorageManagerStub::HandleGetSystemSize;
101     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_TOTAL_SIZE)] =
102         &StorageManagerStub::HandleGetTotalSize;
103     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_FREE_SIZE)] =
104         &StorageManagerStub::HandleGetFreeSize;
105     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_CURR_USER_STATS)] =
106         &StorageManagerStub::HandleGetCurrUserStorageStats;
107     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_USER_STATS)] =
108         &StorageManagerStub::HandleGetUserStorageStats;
109     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_USER_STATS_BY_TYPE)] =
110         &StorageManagerStub::HandleGetUserStorageStatsByType;
111     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_CURR_BUNDLE_STATS)] =
112         &StorageManagerStub::HandleGetCurrentBundleStats;
113     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_BUNDLE_STATUS)] =
114         &StorageManagerStub::HandleGetBundleStatus;
115     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_VOLUME_CREATED)] =
116         &StorageManagerStub::HandleNotifyVolumeCreated;
117     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_VOLUME_MOUNTED)] =
118         &StorageManagerStub::HandleNotifyVolumeMounted;
119     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_VOLUME_STATE_CHANGED)] =
120         &StorageManagerStub::HandleNotifyVolumeStateChanged;
121     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::MOUNT)] =
122         &StorageManagerStub::HandleMount;
123     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::UNMOUNT)] =
124         &StorageManagerStub::HandleUnmount;
125     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_ALL_VOLUMES)] =
126         &StorageManagerStub::HandleGetAllVolumes;
127     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_DISK_CREATED)] =
128         &StorageManagerStub::HandleNotifyDiskCreated;
129     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_DISK_DESTROYED)] =
130         &StorageManagerStub::HandleNotifyDiskDestroyed;
131     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::PARTITION)] =
132         &StorageManagerStub::HandlePartition;
133     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_ALL_DISKS)] =
134         &StorageManagerStub::HandleGetAllDisks;
135     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_VOL_BY_UUID)] =
136         &StorageManagerStub::HandleGetVolumeByUuid;
137     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_VOL_BY_ID)] =
138         &StorageManagerStub::HandleGetVolumeById;
139     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::SET_VOL_DESC)] =
140         &StorageManagerStub::HandleSetVolDesc;
141     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::FORMAT)] =
142         &StorageManagerStub::HandleFormat;
143     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_DISK_BY_ID)] =
144         &StorageManagerStub::HandleGetDiskById;
145     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::CREATE_USER_KEYS)] =
146         &StorageManagerStub::HandleGenerateUserKeys;
147     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::DELETE_USER_KEYS)] =
148         &StorageManagerStub::HandleDeleteUserKeys;
149     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::UPDATE_USER_AUTH)] =
150         &StorageManagerStub::HandleUpdateUserAuth;
151     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::ACTIVE_USER_KEY)] =
152         &StorageManagerStub::HandleActiveUserKey;
153     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::INACTIVE_USER_KEY)] =
154         &StorageManagerStub::HandleInactiveUserKey;
155     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::LOCK_USER_SCREEN)] =
156         &StorageManagerStub::HandleLockUserScreen;
157     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::UNLOCK_USER_SCREEN)] =
158         &StorageManagerStub::HandleUnlockUserScreen;
159     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::LOCK_SCREEN_STATUS)] =
160         &StorageManagerStub::HandleGetLockScreenStatus;
161     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::UPDATE_KEY_CONTEXT)] =
162         &StorageManagerStub::HandleUpdateKeyContext;
163     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::CREATE_SHARE_FILE)] =
164         &StorageManagerStub::HandleCreateShareFile;
165     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::DELETE_SHARE_FILE)] =
166         &StorageManagerStub::HandleDeleteShareFile;
167     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::SET_BUNDLE_QUOTA)] =
168         &StorageManagerStub::HandleSetBundleQuota;
169     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::UPDATE_MEM_PARA)] =
170         &StorageManagerStub::HandleUpdateMemoryPara;
171     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_BUNDLE_STATS_INCREASE)] =
172         &StorageManagerStub::HandleGetBundleStatsForIncrease;
173     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GENERATE_APP_KEY)] =
174         &StorageManagerStub::HandleGenerateAppkey;
175     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::DELETE_APP_KEY)] =
176         &StorageManagerStub::HandleDeleteAppkey;
177     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::MOUNT_DFS_DOCS)] =
178         &StorageManagerStub::HandleMountDfsDocs;
179     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::UMOUNT_DFS_DOCS)] =
180         &StorageManagerStub::HandleUMountDfsDocs;
181     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_FILE_ENCRYPT_STATUS)] =
182         &StorageManagerStub::HandleGetFileEncryptStatus;
183     opToInterfaceMap_[static_cast<uint32_t>(StorageManagerInterfaceCode::GET_USER_NEED_ACTIVE_STATUS)] =
184         &StorageManagerStub::HandleGetUserNeedActiveStatus;
185 }
186 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)187 int32_t StorageManagerStub::OnRemoteRequest(uint32_t code,
188     MessageParcel &data, MessageParcel &reply, MessageOption &option)
189 {
190     if (data.ReadInterfaceToken() != GetDescriptor()) {
191         return E_PERMISSION_DENIED;
192     }
193     switch (code) {
194         case static_cast<uint32_t>(StorageManagerInterfaceCode::PREPARE_ADD_USER):
195             return HandlePrepareAddUser(data, reply);
196         case static_cast<uint32_t>(StorageManagerInterfaceCode::REMOVE_USER):
197             return HandleRemoveUser(data, reply);
198         case static_cast<uint32_t>(StorageManagerInterfaceCode::PREPARE_START_USER):
199             return HandlePrepareStartUser(data, reply);
200         case static_cast<uint32_t>(StorageManagerInterfaceCode::STOP_USER):
201             return HandleStopUser(data, reply);
202         case static_cast<uint32_t>(StorageManagerInterfaceCode::COMPLETE_ADD_USER):
203             return HandleCompleteAddUser(data, reply);
204         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_TOTAL):
205             return HandleGetTotal(data, reply);
206         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_FREE):
207             return HandleGetFree(data, reply);
208         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_SYSTEM_SIZE):
209             return HandleGetSystemSize(data, reply);
210         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_TOTAL_SIZE):
211             return HandleGetTotalSize(data, reply);
212         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_FREE_SIZE):
213             return HandleGetFreeSize(data, reply);
214         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_CURR_USER_STATS):
215             return HandleGetCurrUserStorageStats(data, reply);
216         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_USER_STATS):
217             return HandleGetUserStorageStats(data, reply);
218         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_USER_STATS_BY_TYPE):
219             return HandleGetUserStorageStatsByType(data, reply);
220         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_CURR_BUNDLE_STATS):
221             return HandleGetCurrentBundleStats(data, reply);
222         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_BUNDLE_STATUS):
223             return HandleGetBundleStatus(data, reply);
224         case static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_VOLUME_CREATED):
225             return HandleNotifyVolumeCreated(data, reply);
226         case static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_VOLUME_MOUNTED):
227             return HandleNotifyVolumeMounted(data, reply);
228         case static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_VOLUME_STATE_CHANGED):
229             return HandleNotifyVolumeStateChanged(data, reply);
230         case static_cast<uint32_t>(StorageManagerInterfaceCode::MOUNT):
231             return HandleMount(data, reply);
232         case static_cast<uint32_t>(StorageManagerInterfaceCode::UNMOUNT):
233             return HandleUnmount(data, reply);
234         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_ALL_VOLUMES):
235             return HandleGetAllVolumes(data, reply);
236         case static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_DISK_CREATED):
237             return HandleNotifyDiskCreated(data, reply);
238         case static_cast<uint32_t>(StorageManagerInterfaceCode::NOTIFY_DISK_DESTROYED):
239             return HandleNotifyDiskDestroyed(data, reply);
240         case static_cast<uint32_t>(StorageManagerInterfaceCode::PARTITION):
241             return HandlePartition(data, reply);
242         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_ALL_DISKS):
243             return HandleGetAllDisks(data, reply);
244         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_VOL_BY_UUID):
245             return HandleGetVolumeByUuid(data, reply);
246         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_VOL_BY_ID):
247             return HandleGetVolumeById(data, reply);
248         case static_cast<uint32_t>(StorageManagerInterfaceCode::SET_VOL_DESC):
249             return HandleSetVolDesc(data, reply);
250         case static_cast<uint32_t>(StorageManagerInterfaceCode::FORMAT):
251             return HandleFormat(data, reply);
252         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_DISK_BY_ID):
253             return HandleGetDiskById(data, reply);
254         case static_cast<uint32_t>(StorageManagerInterfaceCode::CREATE_USER_KEYS):
255             return HandleGenerateUserKeys(data, reply);
256         case static_cast<uint32_t>(StorageManagerInterfaceCode::DELETE_USER_KEYS):
257             return HandleDeleteUserKeys(data, reply);
258         case static_cast<uint32_t>(StorageManagerInterfaceCode::UPDATE_USER_AUTH):
259             return HandleUpdateUserAuth(data, reply);
260         case static_cast<uint32_t>(StorageManagerInterfaceCode::ACTIVE_USER_KEY):
261             return HandleActiveUserKey(data, reply);
262         case static_cast<uint32_t>(StorageManagerInterfaceCode::INACTIVE_USER_KEY):
263             return HandleInactiveUserKey(data, reply);
264         case static_cast<uint32_t>(StorageManagerInterfaceCode::LOCK_USER_SCREEN):
265             return HandleLockUserScreen(data, reply);
266         case static_cast<uint32_t>(StorageManagerInterfaceCode::UNLOCK_USER_SCREEN):
267             return HandleUnlockUserScreen(data, reply);
268         case static_cast<uint32_t>(StorageManagerInterfaceCode::LOCK_SCREEN_STATUS):
269             return HandleGetLockScreenStatus(data, reply);
270         case static_cast<uint32_t>(StorageManagerInterfaceCode::UPDATE_KEY_CONTEXT):
271             return HandleUpdateKeyContext(data, reply);
272         case static_cast<uint32_t>(StorageManagerInterfaceCode::CREATE_SHARE_FILE):
273             return HandleCreateShareFile(data, reply);
274         case static_cast<uint32_t>(StorageManagerInterfaceCode::DELETE_SHARE_FILE):
275             return HandleDeleteShareFile(data, reply);
276         case static_cast<uint32_t>(StorageManagerInterfaceCode::SET_BUNDLE_QUOTA):
277             return HandleSetBundleQuota(data, reply);
278         case static_cast<uint32_t>(StorageManagerInterfaceCode::UPDATE_MEM_PARA):
279             return HandleUpdateMemoryPara(data, reply);
280         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_BUNDLE_STATS_INCREASE):
281             return HandleGetBundleStatsForIncrease(data, reply);
282         case static_cast<uint32_t>(StorageManagerInterfaceCode::MOUNT_DFS_DOCS):
283             return HandleMountDfsDocs(data, reply);
284         case static_cast<uint32_t>(StorageManagerInterfaceCode::UMOUNT_DFS_DOCS):
285             return HandleUMountDfsDocs(data, reply);
286         case static_cast<uint32_t>(StorageManagerInterfaceCode::GENERATE_APP_KEY):
287             return HandleGenerateAppkey(data, reply);
288         case static_cast<uint32_t>(StorageManagerInterfaceCode::DELETE_APP_KEY):
289             return HandleDeleteAppkey(data, reply);
290         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_FILE_ENCRYPT_STATUS):
291             return HandleGetFileEncryptStatus(data, reply);
292         case static_cast<uint32_t>(StorageManagerInterfaceCode::GET_USER_NEED_ACTIVE_STATUS):
293             return HandleGetUserNeedActiveStatus(data, reply);
294         default:
295             LOGE("Cannot response request %d: unknown tranction", code);
296             return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
297     }
298 }
299 
HandlePrepareAddUser(MessageParcel & data,MessageParcel & reply)300 int32_t StorageManagerStub::HandlePrepareAddUser(MessageParcel &data, MessageParcel &reply)
301 {
302     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT) &&
303         IPCSkeleton::GetCallingUid() != ACCOUNT_UID) {
304         return E_PERMISSION_DENIED;
305     }
306     int32_t userId = data.ReadInt32();
307     uint32_t flags = data.ReadUint32();
308     LOGI("StorageManagerStub::HandlePrepareAddUser, userId:%{public}d", userId);
309     int err = PrepareAddUser(userId, flags);
310     if (!reply.WriteUint32(err)) {
311         LOGE("StorageManagerStub::HandlePrepareAddUser call PrepareAddUser failed");
312         return  E_WRITE_REPLY_ERR;
313     }
314     return E_OK;
315 }
316 
HandleRemoveUser(MessageParcel & data,MessageParcel & reply)317 int32_t StorageManagerStub::HandleRemoveUser(MessageParcel &data, MessageParcel &reply)
318 {
319     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT) &&
320         IPCSkeleton::GetCallingUid() != ACCOUNT_UID) {
321         return E_PERMISSION_DENIED;
322     }
323     int32_t userId = data.ReadInt32();
324     uint32_t flags = data.ReadUint32();
325     LOGI("StorageManagerStub::HandleRemoveUser, userId:%{public}d", userId);
326     int err = RemoveUser(userId, flags);
327     if (!reply.WriteUint32(err)) {
328         LOGE("StorageManagerStub::HandleRemoveUser call RemoveUser failed");
329         return E_WRITE_REPLY_ERR;
330     }
331     return E_OK;
332 }
333 
HandlePrepareStartUser(MessageParcel & data,MessageParcel & reply)334 int32_t StorageManagerStub::HandlePrepareStartUser(MessageParcel &data, MessageParcel &reply)
335 {
336     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
337         return E_PERMISSION_DENIED;
338     }
339     int32_t userId = data.ReadInt32();
340     LOGI("StorageManagerStub::HandlePrepareStartUser, userId:%{public}d", userId);
341     int err = PrepareStartUser(userId);
342     if (!reply.WriteUint32(err)) {
343         LOGE("StorageManagerStub::HandlePrepareStartUser call PrepareStartUser failed");
344         return E_WRITE_REPLY_ERR;
345     }
346     return E_OK;
347 }
348 
HandleStopUser(MessageParcel & data,MessageParcel & reply)349 int32_t StorageManagerStub::HandleStopUser(MessageParcel &data, MessageParcel &reply)
350 {
351     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
352         return E_PERMISSION_DENIED;
353     }
354     int32_t userId = data.ReadInt32();
355     LOGI("StorageManagerStub::HandleStopUser, userId:%{public}d", userId);
356     int err = StopUser(userId);
357     if (!reply.WriteUint32(err)) {
358         LOGE("StorageManagerStub::HandleStopUser call StopUser failed");
359         return E_WRITE_REPLY_ERR;
360     }
361     return E_OK;
362 }
363 
HandleCompleteAddUser(MessageParcel & data,MessageParcel & reply)364 int32_t StorageManagerStub::HandleCompleteAddUser(MessageParcel &data, MessageParcel &reply)
365 {
366     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
367         return E_PERMISSION_DENIED;
368     }
369     int32_t userId = data.ReadInt32();
370     LOGI("StorageManagerStub::HandleCompleteAddUser, userId:%{public}d", userId);
371     int err = CompleteAddUser(userId);
372     if (!reply.WriteUint32(err)) {
373         LOGE("StorageManagerStub::HandleCompleteAddUser call CompleteAddUser failed");
374         return E_WRITE_REPLY_ERR;
375     }
376     return E_OK;
377 }
378 
HandleGetTotal(MessageParcel & data,MessageParcel & reply)379 int32_t StorageManagerStub::HandleGetTotal(MessageParcel &data, MessageParcel &reply)
380 {
381     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
382         return E_PERMISSION_DENIED;
383     }
384     LOGE("StorageManagerStub::HandleGetTotal Begin.");
385     std::string volumeId = data.ReadString();
386     int64_t totalSize;
387     int32_t err = GetTotalSizeOfVolume(volumeId, totalSize);
388     if (!reply.WriteInt32(err)) {
389         LOGE("StorageManagerStub::HandleGetTotal call OnUserDGetTotalSizeOfVolume failed");
390         return  E_WRITE_REPLY_ERR;
391     }
392     if (!reply.WriteInt64(totalSize)) {
393         return  E_WRITE_REPLY_ERR;
394     }
395     return E_OK;
396 }
397 
HandleGetFree(MessageParcel & data,MessageParcel & reply)398 int32_t StorageManagerStub::HandleGetFree(MessageParcel &data, MessageParcel &reply)
399 {
400     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
401         return E_PERMISSION_DENIED;
402     }
403     std::string volumeId = data.ReadString();
404     int64_t freeSize;
405     int32_t err = GetFreeSizeOfVolume(volumeId, freeSize);
406     if (!reply.WriteInt32(err)) {
407         LOGE("StorageManagerStub::HandleGetFree call GetFreeSizeOfVolume failed");
408         return  E_WRITE_REPLY_ERR;
409     }
410     if (!reply.WriteInt64(freeSize)) {
411         return  E_WRITE_REPLY_ERR;
412     }
413     return E_OK;
414 }
415 
HandleGetBundleStatus(MessageParcel & data,MessageParcel & reply)416 int32_t StorageManagerStub::HandleGetBundleStatus(MessageParcel &data, MessageParcel &reply)
417 {
418     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
419         return E_PERMISSION_DENIED;
420     }
421     std::string pkgName = data.ReadString();
422     int32_t appIndex = data.ReadInt32();
423     uint32_t statFlag = data.ReadUint32();
424     BundleStats bundleStats;
425     int32_t err = GetBundleStats(pkgName, bundleStats, appIndex, statFlag);
426     if (!reply.WriteInt32(err)) {
427         return  E_WRITE_REPLY_ERR;
428     }
429     if (!bundleStats.Marshalling(reply)) {
430         return  E_WRITE_REPLY_ERR;
431     }
432     return E_OK;
433 }
434 
HandleGetSystemSize(MessageParcel & data,MessageParcel & reply)435 int32_t StorageManagerStub::HandleGetSystemSize(MessageParcel &data, MessageParcel &reply)
436 {
437     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
438         return E_PERMISSION_DENIED;
439     }
440     int64_t systemSize;
441     int32_t err = GetSystemSize(systemSize);
442     if (!reply.WriteInt32(err)) {
443         return  E_WRITE_REPLY_ERR;
444     }
445     if (!reply.WriteInt64(systemSize)) {
446         LOGE("StorageManagerStub::HandleGetFree call GetSystemSize failed");
447         return  E_WRITE_REPLY_ERR;
448     }
449     return E_OK;
450 }
451 
HandleGetTotalSize(MessageParcel & data,MessageParcel & reply)452 int32_t StorageManagerStub::HandleGetTotalSize(MessageParcel &data, MessageParcel &reply)
453 {
454     int64_t totalSize;
455     int32_t err = GetTotalSize(totalSize);
456     if (!reply.WriteInt32(err)) {
457         return  E_WRITE_REPLY_ERR;
458     }
459     if (!reply.WriteInt64(totalSize)) {
460         LOGE("StorageManagerStub::HandleGetFree call GetTotalSize failed");
461         return  E_WRITE_REPLY_ERR;
462     }
463     return E_OK;
464 }
465 
HandleGetFreeSize(MessageParcel & data,MessageParcel & reply)466 int32_t StorageManagerStub::HandleGetFreeSize(MessageParcel &data, MessageParcel &reply)
467 {
468     int64_t freeSize;
469     int32_t err = GetFreeSize(freeSize);
470     if (!reply.WriteInt32(err)) {
471         return  E_WRITE_REPLY_ERR;
472     }
473     if (!reply.WriteInt64(freeSize)) {
474         LOGE("StorageManagerStub::HandleGetFree call GetFreeSize failed");
475         return  E_WRITE_REPLY_ERR;
476     }
477     return E_OK;
478 }
479 
HandleGetCurrUserStorageStats(MessageParcel & data,MessageParcel & reply)480 int32_t StorageManagerStub::HandleGetCurrUserStorageStats(MessageParcel &data, MessageParcel &reply)
481 {
482     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
483         return E_PERMISSION_DENIED;
484     }
485     StorageStats storageStats;
486     int32_t err = GetUserStorageStats(storageStats);
487     if (!reply.WriteInt32(err)) {
488         return  E_WRITE_REPLY_ERR;
489     }
490     if (!storageStats.Marshalling(reply)) {
491         return  E_WRITE_REPLY_ERR;
492     }
493     return E_OK;
494 }
495 
HandleGetUserStorageStats(MessageParcel & data,MessageParcel & reply)496 int32_t StorageManagerStub::HandleGetUserStorageStats(MessageParcel &data, MessageParcel &reply)
497 {
498     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
499         return E_PERMISSION_DENIED;
500     }
501     int32_t userId = data.ReadInt32();
502     StorageStats storageStats;
503     int32_t err = GetUserStorageStats(userId, storageStats);
504     if (!reply.WriteInt32(err)) {
505         return  E_WRITE_REPLY_ERR;
506     }
507     if (!storageStats.Marshalling(reply)) {
508         return  E_WRITE_REPLY_ERR;
509     }
510     return E_OK;
511 }
512 
HandleGetCurrentBundleStats(MessageParcel & data,MessageParcel & reply)513 int32_t StorageManagerStub::HandleGetCurrentBundleStats(MessageParcel &data, MessageParcel &reply)
514 {
515     BundleStats bundleStats;
516     uint32_t statFlag = data.ReadUint32();
517     int32_t err = GetCurrentBundleStats(bundleStats, statFlag);
518     if (!reply.WriteInt32(err)) {
519         return  E_WRITE_REPLY_ERR;
520     }
521     if (!bundleStats.Marshalling(reply)) {
522         return  E_WRITE_REPLY_ERR;
523     }
524     return E_OK;
525 }
526 
HandleGetAllVolumes(MessageParcel & data,MessageParcel & reply)527 int32_t StorageManagerStub::HandleGetAllVolumes(MessageParcel &data, MessageParcel &reply)
528 {
529     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
530         return E_PERMISSION_DENIED;
531     }
532     std::vector<VolumeExternal> ve;
533     int32_t err = GetAllVolumes(ve);
534     if (!reply.WriteInt32(err)) {
535         return  E_WRITE_REPLY_ERR;
536     }
537     uint size = ve.size();
538     if (size == 0) {
539         LOGE("StorageManagerStub::No volume.");
540         if (!reply.WriteUint32(0)) {
541             return  E_WRITE_REPLY_ERR;
542         }
543         return E_OK;
544     }
545     if (!reply.WriteUint32(ve.size())) {
546         return  E_WRITE_REPLY_ERR;
547     }
548     for (uint i = 0; i < size; i++) {
549         if (!ve[i].Marshalling(reply)) {
550             return  E_WRITE_REPLY_ERR;
551         }
552     }
553     return E_OK;
554 }
555 
HandleNotifyVolumeCreated(MessageParcel & data,MessageParcel & reply)556 int32_t StorageManagerStub::HandleNotifyVolumeCreated(MessageParcel &data, MessageParcel &reply)
557 {
558     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
559         return E_PERMISSION_DENIED;
560     }
561     std::unique_ptr<VolumeCore> vc = VolumeCore::Unmarshalling(data);
562     NotifyVolumeCreated(*vc);
563     LOGI("StorageManagerStub::HandleNotifyVolumeCreated");
564     return E_OK;
565 }
566 
HandleNotifyVolumeMounted(MessageParcel & data,MessageParcel & reply)567 int32_t StorageManagerStub::HandleNotifyVolumeMounted(MessageParcel &data, MessageParcel &reply)
568 {
569     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
570         return E_PERMISSION_DENIED;
571     }
572     std::string volumeId = data.ReadString();
573     int32_t fsType = data.ReadInt32();
574     std::string fsUuid = data.ReadString();
575     std::string path = data.ReadString();
576     std::string description = data.ReadString();
577     NotifyVolumeMounted(volumeId, fsType, fsUuid, path, description);
578     LOGI("StorageManagerStub::HandleNotifyVolumeMounted");
579     return E_OK;
580 }
581 
HandleNotifyVolumeStateChanged(MessageParcel & data,MessageParcel & reply)582 int32_t StorageManagerStub::HandleNotifyVolumeStateChanged(MessageParcel &data, MessageParcel &reply)
583 {
584     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
585         return E_PERMISSION_DENIED;
586     }
587     std::string volumeId = data.ReadString();
588     VolumeState state = VolumeState(data.ReadInt32());
589     NotifyVolumeStateChanged(volumeId, state);
590     LOGI("StorageManagerStub::HandleNotifyVolumeStateChanged");
591     return E_OK;
592 }
593 
HandleMount(MessageParcel & data,MessageParcel & reply)594 int32_t StorageManagerStub::HandleMount(MessageParcel &data, MessageParcel &reply)
595 {
596     if (!CheckClientPermission(PERMISSION_MOUNT_MANAGER)) {
597         return E_PERMISSION_DENIED;
598     }
599     std::string volumeId = data.ReadString();
600     int err = Mount(volumeId);
601     if (!reply.WriteUint32(err)) {
602         LOGE("StorageManagerStub::HandleMount call Mount failed");
603         return  E_WRITE_REPLY_ERR;
604     }
605     return E_OK;
606 }
607 
HandleUnmount(MessageParcel & data,MessageParcel & reply)608 int32_t StorageManagerStub::HandleUnmount(MessageParcel &data, MessageParcel &reply)
609 {
610     if (!CheckClientPermission(PERMISSION_MOUNT_MANAGER)) {
611         return E_PERMISSION_DENIED;
612     }
613     std::string volumeId = data.ReadString();
614     int err = Unmount(volumeId);
615     if (!reply.WriteUint32(err)) {
616         LOGE("StorageManagerStub::HandleUnmount call Mount failed");
617         return  E_WRITE_REPLY_ERR;
618     }
619     return E_OK;
620 }
621 
HandleNotifyDiskCreated(MessageParcel & data,MessageParcel & reply)622 int32_t StorageManagerStub::HandleNotifyDiskCreated(MessageParcel &data, MessageParcel &reply)
623 {
624     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
625         return E_PERMISSION_DENIED;
626     }
627     auto disk = Disk::Unmarshalling(data);
628     NotifyDiskCreated(*disk);
629     return E_OK;
630 }
631 
HandleNotifyDiskDestroyed(MessageParcel & data,MessageParcel & reply)632 int32_t StorageManagerStub::HandleNotifyDiskDestroyed(MessageParcel &data, MessageParcel &reply)
633 {
634     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
635         return E_PERMISSION_DENIED;
636     }
637     std::string diskId = data.ReadString();
638     NotifyDiskDestroyed(diskId);
639     return E_OK;
640 }
641 
HandlePartition(MessageParcel & data,MessageParcel & reply)642 int32_t StorageManagerStub::HandlePartition(MessageParcel &data, MessageParcel &reply)
643 {
644     if (!CheckClientPermission(PERMISSION_FORMAT_MANAGER)) {
645         return E_PERMISSION_DENIED;
646     }
647     std::string diskId = data.ReadString();
648     int32_t type = data.ReadInt32();
649     int err = Partition(diskId, type);
650     if (!reply.WriteUint32(err)) {
651         LOGE("StorageManagerStub::HandlePartition call Partition failed");
652         return E_WRITE_REPLY_ERR;
653     }
654     return E_OK;
655 }
656 
HandleGetAllDisks(MessageParcel & data,MessageParcel & reply)657 int32_t StorageManagerStub::HandleGetAllDisks(MessageParcel &data, MessageParcel &reply)
658 {
659     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
660         return E_PERMISSION_DENIED;
661     }
662     std::vector<Disk> disks;
663     int32_t err = GetAllDisks(disks);
664     if (!reply.WriteUint32(err)) {
665         return E_WRITE_REPLY_ERR;
666     }
667     uint size = disks.size();
668     if (size == 0) {
669         LOGE("StorageManagerStub::No Disk.");
670         if (!reply.WriteUint32(0)) {
671             return  E_WRITE_REPLY_ERR;
672         }
673         return E_OK;
674     }
675     if (!reply.WriteUint32(disks.size())) {
676         return  E_WRITE_REPLY_ERR;
677     }
678     for (uint i = 0; i < size; i++) {
679         if (!disks[i].Marshalling(reply)) {
680             return  E_WRITE_REPLY_ERR;
681         }
682     }
683     return E_OK;
684 }
685 
HandleGetVolumeByUuid(MessageParcel & data,MessageParcel & reply)686 int32_t StorageManagerStub::HandleGetVolumeByUuid(MessageParcel &data, MessageParcel &reply)
687 {
688     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
689         return E_PERMISSION_DENIED;
690     }
691     std::string fsUuid = data.ReadString();
692     VolumeExternal vc;
693     int err = GetVolumeByUuid(fsUuid, vc);
694     if (!vc.Marshalling(reply)) {
695         return E_WRITE_REPLY_ERR;
696     }
697     if (!reply.WriteUint32(err)) {
698         LOGE("StorageManagerStub::HandleGetVolumeByUuid call GetVolumeByUuid failed");
699         return E_WRITE_REPLY_ERR;
700     }
701     return E_OK;
702 }
703 
HandleGetVolumeById(MessageParcel & data,MessageParcel & reply)704 int32_t StorageManagerStub::HandleGetVolumeById(MessageParcel &data, MessageParcel &reply)
705 {
706     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
707         return E_PERMISSION_DENIED;
708     }
709     std::string volId = data.ReadString();
710     VolumeExternal vc;
711     int err = GetVolumeById(volId, vc);
712     if (!vc.Marshalling(reply)) {
713         return E_WRITE_REPLY_ERR;
714     }
715     if (!reply.WriteUint32(err)) {
716         LOGE("StorageManagerStub::HandleGetVolumeById call GetVolumeById failed");
717         return E_WRITE_REPLY_ERR;
718     }
719     return E_OK;
720 }
721 
HandleSetVolDesc(MessageParcel & data,MessageParcel & reply)722 int32_t StorageManagerStub::HandleSetVolDesc(MessageParcel &data, MessageParcel &reply)
723 {
724     if (!CheckClientPermission(PERMISSION_MOUNT_MANAGER)) {
725         return E_PERMISSION_DENIED;
726     }
727     std::string fsUuid = data.ReadString();
728     std::string desc = data.ReadString();
729     int err = SetVolumeDescription(fsUuid, desc);
730     if (!reply.WriteUint32(err)) {
731         LOGE("StorageManagerStub::HandleSetVolDesc call SetVolumeDescription failed");
732         return E_WRITE_REPLY_ERR;
733     }
734     return E_OK;
735 }
736 
HandleFormat(MessageParcel & data,MessageParcel & reply)737 int32_t StorageManagerStub::HandleFormat(MessageParcel &data, MessageParcel &reply)
738 {
739     if (!CheckClientPermission(PERMISSION_FORMAT_MANAGER)) {
740         return E_PERMISSION_DENIED;
741     }
742     std::string volId = data.ReadString();
743     std::string fsType = data.ReadString();
744     int err = Format(volId, fsType);
745     if (!reply.WriteUint32(err)) {
746         LOGE("StorageManagerStub::HandleFormat call Format failed");
747         return E_WRITE_REPLY_ERR;
748     }
749     return E_OK;
750 }
751 
HandleGetDiskById(MessageParcel & data,MessageParcel & reply)752 int32_t StorageManagerStub::HandleGetDiskById(MessageParcel &data, MessageParcel &reply)
753 {
754     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
755         return E_PERMISSION_DENIED;
756     }
757     std::string volId = data.ReadString();
758     Disk disk;
759     int err = GetDiskById(volId, disk);
760     if (!disk.Marshalling(reply)) {
761         return E_WRITE_REPLY_ERR;
762     }
763     if (!reply.WriteUint32(err)) {
764         LOGE("StorageManagerStub::HandleGetDiskById call GetDiskById failed");
765         return E_WRITE_REPLY_ERR;
766     }
767     return E_OK;
768 }
769 
HandleGenerateUserKeys(MessageParcel & data,MessageParcel & reply)770 int32_t StorageManagerStub::HandleGenerateUserKeys(MessageParcel &data, MessageParcel &reply)
771 {
772     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
773         return E_PERMISSION_DENIED;
774     }
775     uint32_t userId = data.ReadUint32();
776     uint32_t flags = data.ReadUint32();
777     int32_t err = GenerateUserKeys(userId, flags);
778     if (!reply.WriteInt32(err)) {
779         LOGE("Write reply error code failed");
780         return E_WRITE_REPLY_ERR;
781     }
782 
783     return E_OK;
784 }
785 
HandleDeleteUserKeys(MessageParcel & data,MessageParcel & reply)786 int32_t StorageManagerStub::HandleDeleteUserKeys(MessageParcel &data, MessageParcel &reply)
787 {
788     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
789         return E_PERMISSION_DENIED;
790     }
791     uint32_t userId = data.ReadUint32();
792     int32_t err = DeleteUserKeys(userId);
793     if (!reply.WriteInt32(err)) {
794         LOGE("Write reply error code failed");
795         return E_WRITE_REPLY_ERR;
796     }
797 
798     return E_OK;
799 }
800 
HandleUpdateUserAuth(MessageParcel & data,MessageParcel & reply)801 int32_t StorageManagerStub::HandleUpdateUserAuth(MessageParcel &data, MessageParcel &reply)
802 {
803     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT)) {
804         return E_PERMISSION_DENIED;
805     }
806     uint32_t userId = data.ReadUint32();
807     uint64_t secureUid = data.ReadUint64();
808 
809     std::vector<uint8_t> token;
810     std::vector<uint8_t> oldSecret;
811     std::vector<uint8_t> newSecret;
812     data.ReadUInt8Vector(&token);
813     data.ReadUInt8Vector(&oldSecret);
814     data.ReadUInt8Vector(&newSecret);
815 
816     int32_t err = UpdateUserAuth(userId, secureUid, token, oldSecret, newSecret);
817     if (!reply.WriteInt32(err)) {
818         LOGE("Write reply error code failed");
819         return E_WRITE_REPLY_ERR;
820     }
821     return E_OK;
822 }
823 
HandleActiveUserKey(MessageParcel & data,MessageParcel & reply)824 int32_t StorageManagerStub::HandleActiveUserKey(MessageParcel &data, MessageParcel &reply)
825 {
826     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT) &&
827         IPCSkeleton::GetCallingUid() != ACCOUNT_UID) {
828         return E_PERMISSION_DENIED;
829     }
830     uint32_t userId = data.ReadUint32();
831 
832     std::vector<uint8_t> token;
833     std::vector<uint8_t> secret;
834     data.ReadUInt8Vector(&token);
835     data.ReadUInt8Vector(&secret);
836 
837     int32_t err = ActiveUserKey(userId, token, secret);
838     if (!reply.WriteInt32(err)) {
839         LOGE("Write reply error code failed");
840         return E_WRITE_REPLY_ERR;
841     }
842     return E_OK;
843 }
844 
HandleInactiveUserKey(MessageParcel & data,MessageParcel & reply)845 int32_t StorageManagerStub::HandleInactiveUserKey(MessageParcel &data, MessageParcel &reply)
846 {
847     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT)) {
848         return E_PERMISSION_DENIED;
849     }
850     uint32_t userId = data.ReadUint32();
851     int32_t err = InactiveUserKey(userId);
852     if (!reply.WriteInt32(err)) {
853         LOGE("Write reply error code failed");
854         return E_WRITE_REPLY_ERR;
855     }
856     return E_OK;
857 }
858 
HandleLockUserScreen(MessageParcel & data,MessageParcel & reply)859 int32_t StorageManagerStub::HandleLockUserScreen(MessageParcel &data, MessageParcel &reply)
860 {
861     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER_CRYPT)) {
862         return E_PERMISSION_DENIED;
863     }
864     uint32_t userId = data.ReadUint32();
865     int32_t err = LockUserScreen(userId);
866     if (!reply.WriteInt32(err)) {
867         LOGE("Write reply error code failed");
868         return E_WRITE_REPLY_ERR;
869     }
870 
871     return E_OK;
872 }
873 
HandleGetFileEncryptStatus(MessageParcel & data,MessageParcel & reply)874 int32_t StorageManagerStub::HandleGetFileEncryptStatus(MessageParcel &data, MessageParcel &reply)
875 {
876     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
877         return E_PERMISSION_DENIED;
878     }
879     bool isEncrypted = true;
880     uint32_t userId = data.ReadUint32();
881     bool needCheckDirMount = data.ReadBool();
882     int32_t err = GetFileEncryptStatus(userId, isEncrypted, needCheckDirMount);
883     if (!reply.WriteInt32(err)) {
884         LOGE("Write reply error code failed");
885         return E_WRITE_REPLY_ERR;
886     }
887     if (!reply.WriteBool(isEncrypted)) {
888         LOGE("Write reply isEncrypted failed");
889         return E_WRITE_REPLY_ERR;
890     }
891     return E_OK;
892 }
893 
HandleGetUserNeedActiveStatus(MessageParcel & data,MessageParcel & reply)894 int32_t StorageManagerStub::HandleGetUserNeedActiveStatus(MessageParcel &data, MessageParcel &reply)
895 {
896     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
897         return E_PERMISSION_DENIED;
898     }
899     bool needActive = false;
900     uint32_t userId = data.ReadUint32();
901     int32_t err = GetUserNeedActiveStatus(userId, needActive);
902     if (!reply.WriteInt32(err)) {
903         LOGE("Write reply error code failed");
904         return E_WRITE_REPLY_ERR;
905     }
906     if (!reply.WriteBool(needActive)) {
907         LOGE("Write needActive failed");
908         return E_WRITE_REPLY_ERR;
909     }
910     return E_OK;
911 }
912 
HandleUnlockUserScreen(MessageParcel & data,MessageParcel & reply)913 int32_t StorageManagerStub::HandleUnlockUserScreen(MessageParcel &data, MessageParcel &reply)
914 {
915     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT)) {
916         return E_PERMISSION_DENIED;
917     }
918     uint32_t userId = data.ReadUint32();
919 
920     std::vector<uint8_t> token;
921     std::vector<uint8_t> secret;
922     data.ReadUInt8Vector(&token);
923     data.ReadUInt8Vector(&secret);
924 
925     int32_t err = UnlockUserScreen(userId, token, secret);
926     if (!reply.WriteInt32(err)) {
927         LOGE("Write reply error code failed");
928         return E_WRITE_REPLY_ERR;
929     }
930     return E_OK;
931 }
932 
HandleGetLockScreenStatus(MessageParcel & data,MessageParcel & reply)933 int32_t StorageManagerStub::HandleGetLockScreenStatus(MessageParcel &data, MessageParcel &reply)
934 {
935     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER)) {
936         return E_PERMISSION_DENIED;
937     }
938     uint32_t userId = data.ReadUint32();
939     bool lockScreenStatus = false;
940     int32_t err = GetLockScreenStatus(userId, lockScreenStatus);
941     if (!reply.WriteBool(lockScreenStatus)) {
942         LOGE("Write reply lockScreenStatus failed");
943         return E_WRITE_REPLY_ERR;
944     }
945     if (!reply.WriteInt32(err)) {
946         LOGE("Write reply error code failed");
947         return E_WRITE_REPLY_ERR;
948     }
949     return E_OK;
950 }
951 
HandleGenerateAppkey(MessageParcel & data,MessageParcel & reply)952 int32_t StorageManagerStub::HandleGenerateAppkey(MessageParcel &data, MessageParcel &reply)
953 {
954     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT)) {
955         return E_PERMISSION_DENIED;
956     }
957     uint32_t hashId = data.ReadUint32();
958     uint32_t userId = data.ReadUint32();
959     std::string keyId;
960     int32_t err = GenerateAppkey(hashId, userId, keyId);
961     if (!reply.WriteString(keyId)) {
962         LOGE("Write reply lockScreenStatus failed");
963         return E_WRITE_REPLY_ERR;
964     }
965     if (!reply.WriteInt32(err)) {
966         LOGE("Write reply error code failed");
967         return E_WRITE_REPLY_ERR;
968     }
969     return E_OK;
970 }
971 
HandleDeleteAppkey(MessageParcel & data,MessageParcel & reply)972 int32_t StorageManagerStub::HandleDeleteAppkey(MessageParcel &data, MessageParcel &reply)
973 {
974     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT)) {
975         return E_PERMISSION_DENIED;
976     }
977     std::string keyId = data.ReadString();
978     int32_t err = DeleteAppkey(keyId);
979     if (!reply.WriteInt32(err)) {
980         LOGE("Write reply error code failed");
981         return E_WRITE_REPLY_ERR;
982     }
983     return E_OK;
984 }
985 
HandleUpdateKeyContext(MessageParcel & data,MessageParcel & reply)986 int32_t StorageManagerStub::HandleUpdateKeyContext(MessageParcel &data, MessageParcel &reply)
987 {
988     if (!CheckClientPermissionForCrypt(PERMISSION_STORAGE_MANAGER_CRYPT)) {
989         return E_PERMISSION_DENIED;
990     }
991     uint32_t userId = data.ReadUint32();
992     int32_t err = UpdateKeyContext(userId);
993     if (!reply.WriteInt32(err)) {
994         LOGE("Write reply error code failed");
995         return E_WRITE_REPLY_ERR;
996     }
997     return E_OK;
998 }
999 
HandleCreateShareFile(MessageParcel & data,MessageParcel & reply)1000 int32_t StorageManagerStub::HandleCreateShareFile(MessageParcel &data, MessageParcel &reply)
1001 {
1002     if (!CheckClientPermissionForShareFile()) {
1003         return E_PERMISSION_DENIED;
1004     }
1005 
1006     std::vector<std::string> uriList;
1007     if (!data.ReadStringVector(&uriList)) {
1008         return E_WRITE_REPLY_ERR;
1009     }
1010     uint32_t tokenId = data.ReadUint32();
1011     uint32_t flag = data.ReadUint32();
1012     std::vector<int32_t> retList = CreateShareFile(uriList, tokenId, flag);
1013     if (!reply.WriteInt32Vector(retList)) {
1014         return E_WRITE_REPLY_ERR;
1015     }
1016     return E_OK;
1017 }
1018 
HandleDeleteShareFile(MessageParcel & data,MessageParcel & reply)1019 int32_t StorageManagerStub::HandleDeleteShareFile(MessageParcel &data, MessageParcel &reply)
1020 {
1021     if (!CheckClientPermissionForShareFile()) {
1022         return E_PERMISSION_DENIED;
1023     }
1024 
1025     uint32_t tokenId = data.ReadUint32();
1026     std::vector<std::string> uriList;
1027     if (!data.ReadStringVector(&uriList)) {
1028         return E_WRITE_REPLY_ERR;
1029     }
1030 
1031     int err = DeleteShareFile(tokenId, uriList);
1032     if (!reply.WriteInt32(err)) {
1033         return E_WRITE_REPLY_ERR;
1034     }
1035     return E_OK;
1036 }
1037 
HandleSetBundleQuota(MessageParcel & data,MessageParcel & reply)1038 int32_t StorageManagerStub::HandleSetBundleQuota(MessageParcel &data, MessageParcel &reply)
1039 {
1040     if (!CheckClientPermission(PERMISSION_STORAGE_MANAGER)) {
1041         return E_PERMISSION_DENIED;
1042     }
1043 
1044     std::string bundleName = data.ReadString();
1045     int32_t uid = data.ReadInt32();
1046     std::string bundleDataDirPath = data.ReadString();
1047     int32_t limitSizeMb = data.ReadInt32();
1048     int err = SetBundleQuota(bundleName, uid, bundleDataDirPath, limitSizeMb);
1049     if (!reply.WriteInt32(err)) {
1050         return E_WRITE_REPLY_ERR;
1051     }
1052     return E_OK;
1053 }
1054 
HandleGetBundleStatsForIncrease(MessageParcel & data,MessageParcel & reply)1055 int32_t StorageManagerStub::HandleGetBundleStatsForIncrease(MessageParcel &data, MessageParcel &reply)
1056 {
1057     if (IPCSkeleton::GetCallingUid() != BACKUP_SA_UID) {
1058         LOGE("StorageManager permissionCheck error, calling uid is invalid, need backup_sa uid.");
1059         return E_PERMISSION_DENIED;
1060     }
1061 
1062     uint32_t userId = data.ReadUint32();
1063     std::vector<std::string> bundleNames;
1064     if (!data.ReadStringVector(&bundleNames)) {
1065         return E_WRITE_REPLY_ERR;
1066     }
1067     std::vector<int64_t> incrementalBackTimes;
1068     if (!data.ReadInt64Vector(&incrementalBackTimes)) {
1069         return E_WRITE_REPLY_ERR;
1070     }
1071 
1072     std::vector<int64_t> pkgFileSizes;
1073     std::vector<int64_t> incPkgFileSizes;
1074     int32_t err = GetBundleStatsForIncrease(userId, bundleNames, incrementalBackTimes, pkgFileSizes, incPkgFileSizes);
1075     if (!reply.WriteUint32(err)) {
1076         return E_WRITE_REPLY_ERR;
1077     }
1078     if (!reply.WriteInt64Vector(pkgFileSizes)) {
1079         LOGE("StorageManagerStub::HandleGetBundleStatsForIncrease call GetBundleStatsForIncrease failed");
1080         return  E_WRITE_REPLY_ERR;
1081     }
1082     if (!reply.WriteInt64Vector(incPkgFileSizes)) {
1083         LOGE("StorageManagerStub::HandleGetBundleStatsForIncrease call GetBundleStatsForIncrease failed");
1084         return  E_WRITE_REPLY_ERR;
1085     }
1086     return E_OK;
1087 }
1088 
1089 
HandleGetUserStorageStatsByType(MessageParcel & data,MessageParcel & reply)1090 int32_t StorageManagerStub::HandleGetUserStorageStatsByType(MessageParcel &data, MessageParcel &reply)
1091 {
1092     if (IPCSkeleton::GetCallingUid() != BACKUP_SA_UID) {
1093         LOGE("StorageManager permissionCheck error, calling uid is invalid, need backup_sa uid.");
1094         return E_PERMISSION_DENIED;
1095     }
1096 
1097     int32_t userId = data.ReadInt32();
1098     std::string type = data.ReadString();
1099     StorageStats storageStats;
1100     int32_t err = GetUserStorageStatsByType(userId, storageStats, type);
1101     if (!reply.WriteInt32(err)) {
1102         return E_WRITE_REPLY_ERR;
1103     }
1104     if (!storageStats.Marshalling(reply)) {
1105         return  E_WRITE_REPLY_ERR;
1106     }
1107     return E_OK;
1108 }
1109 
HandleUpdateMemoryPara(MessageParcel & data,MessageParcel & reply)1110 int32_t StorageManagerStub::HandleUpdateMemoryPara(MessageParcel &data, MessageParcel &reply)
1111 {
1112     if (IPCSkeleton::GetCallingUid() != BACKUP_SA_UID) {
1113         LOGE("StorageManager permissionCheck error, calling uid is invalid, need backup_sa uid.");
1114         return E_PERMISSION_DENIED;
1115     }
1116 
1117     int32_t size = data.ReadInt32();
1118     int32_t oldSize = 0;
1119     int err = UpdateMemoryPara(size, oldSize);
1120     if (!reply.WriteInt32(err)) {
1121         return E_WRITE_REPLY_ERR;
1122     }
1123     if (!reply.WriteInt32(oldSize)) {
1124         LOGE("StorageManagerStub::HandleUpdateMemoryPara call UpdateMemoryPara failed");
1125         return E_WRITE_REPLY_ERR;
1126     }
1127     return E_OK;
1128 }
1129 
HandleMountDfsDocs(MessageParcel & data,MessageParcel & reply)1130 int32_t StorageManagerStub::HandleMountDfsDocs(MessageParcel &data, MessageParcel &reply)
1131 {
1132     // Only for dfs create device dir and bind mount from DFS Docs.
1133     if (IPCSkeleton::GetCallingUid() != DFS_UID) {
1134         LOGE("HandleMountDfsDocs permissionCheck error, calling uid now is %{public}d, should be DFS_UID: %{public}d",
1135             IPCSkeleton::GetCallingUid(), DFS_UID);
1136         return E_PERMISSION_DENIED;
1137     }
1138 
1139     int32_t userId = data.ReadInt32();
1140     std::string relativePath = data.ReadString();
1141     std::string networkId = data.ReadString();
1142     std::string deviceId = data.ReadString();
1143 
1144     int32_t err = MountDfsDocs(userId, relativePath, networkId, deviceId);
1145     if (!reply.WriteInt32(err)) {
1146         return E_WRITE_REPLY_ERR;
1147     }
1148     return E_OK;
1149 }
1150 
HandleUMountDfsDocs(MessageParcel & data,MessageParcel & reply)1151 int32_t StorageManagerStub::HandleUMountDfsDocs(MessageParcel &data, MessageParcel &reply)
1152 {
1153     // Only for dfs create device dir and bind mount from DFS Docs.
1154     if (IPCSkeleton::GetCallingUid() != DFS_UID) {
1155         LOGE("HandleUMountDfsDocs permissionCheck error, calling uid now is %{public}d, should be DFS_UID: %{public}d",
1156              IPCSkeleton::GetCallingUid(), DFS_UID);
1157         return E_PERMISSION_DENIED;
1158     }
1159 
1160     int32_t userId = data.ReadInt32();
1161     std::string relativePath = data.ReadString();
1162     std::string networkId = data.ReadString();
1163     std::string deviceId = data.ReadString();
1164     int32_t err = UMountDfsDocs(userId, relativePath, networkId, deviceId);
1165     if (!reply.WriteInt32(err)) {
1166         return E_WRITE_REPLY_ERR;
1167     }
1168     return E_OK;
1169 }
1170 } // StorageManager
1171 } // OHOS
1172