1 /* 2 * Copyright (c) 2021 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 #ifndef OHOS_STORAGE_DAEMON_MOUNT_MANAGER_H 17 #define OHOS_STORAGE_DAEMON_MOUNT_MANAGER_H 18 19 #include <fstream> 20 #include <list> 21 #include <map> 22 #include <string> 23 #include <mutex> 24 #include <vector> 25 #include <sys/types.h> 26 #include <nocopyable.h> 27 28 #include "utils/file_utils.h" 29 30 namespace OHOS { 31 namespace StorageDaemon { 32 struct DirInfo { 33 const std::string path; 34 mode_t mode; 35 uid_t uid; 36 gid_t gid; 37 }; 38 39 constexpr uid_t OID_ROOT = 0; 40 constexpr uid_t OID_SYSTEM = 1000; 41 constexpr uid_t OID_FILE_MANAGER = 1006; 42 constexpr uid_t OID_USER_DATA_RW = 1008; 43 constexpr uid_t OID_DFS = 1009; 44 constexpr uid_t OID_BACKUP = 1089; 45 constexpr uid_t OID_DFS_SHARE = 3822; 46 constexpr uid_t OID_TEE = 6668; 47 constexpr uid_t OID_DEVICE_AUTH = 3333; 48 constexpr uid_t OID_HUKS = 3510; 49 constexpr uid_t OID_ASSET = 6226; 50 constexpr uid_t OID_DDMS = 3012; 51 constexpr uid_t OID_HWID = 7008; 52 constexpr uid_t OID_HEALTH_SPORT = 7259; 53 constexpr uid_t OID_DLP_CREDENTIAL = 3553; 54 constexpr uid_t OID_RSS = 1096; 55 constexpr uid_t OID_HIVIEW = 1201; 56 constexpr uid_t OID_PARENT_CONTROL = 7007; 57 constexpr uid_t OID_ACCOUNT = 3058; 58 constexpr uid_t OID_COLLABORATION_FWK = 5520; 59 constexpr uid_t OID_CLOUD_BACK = 5206; 60 constexpr uid_t OID_AV_SESSION = 6700; 61 constexpr uid_t USER_ID_BASE = 200000; 62 constexpr uid_t OID_FOUNDATION = 5523; 63 constexpr uid_t OID_PASTEBOARD = 3816; 64 constexpr uid_t OID_PRINT = 3823; 65 constexpr uid_t OID_FINDNETWORK = 7518; 66 67 class MountManager final { 68 public: 69 MountManager(); 70 virtual ~MountManager() = default; 71 static std::shared_ptr<MountManager> GetInstance(); 72 static std::vector<DirInfo> InitHmdfsDirVec(); 73 static std::vector<DirInfo> InitVirtualDir(); 74 static std::vector<DirInfo> InitSystemServiceDir(); 75 static std::vector<DirInfo> InitFileManagerDir(); 76 static std::vector<DirInfo> InitAppdataDir(); 77 int32_t MountByUser(int32_t userId); 78 int32_t UmountByUser(int32_t userId); 79 int32_t PrepareHmdfsDirs(int32_t userId); 80 int32_t PrepareFileManagerDirs(int32_t userId); 81 int32_t PrepareAppdataDir(int32_t userId); 82 int32_t DestroyHmdfsDirs(int32_t userId); 83 int32_t DestroyFileManagerDirs(int32_t userId); 84 int32_t DestroySystemServiceDirs(int32_t userId); 85 int32_t CloudMount(int32_t userId, const std::string& path); 86 int32_t CloudTwiceMount(int32_t userId); 87 int32_t MountCryptoPathAgain(uint32_t userId); 88 int32_t MountDfsDocs(int32_t userId, const std::string &relativePath, 89 const std::string &networkId, const std::string &deviceId); 90 int32_t UMountDfsDocs(int32_t userId, const std::string &relativePath, 91 const std::string &networkId, const std::string &deviceId); 92 int32_t UMountAllPath(int32_t userId, std::list<std::string> &unMountFailList); 93 int32_t UMountByList(std::list<std::string> &list, std::list<std::string> &unMountFailList); 94 int32_t UMountByListWithDetach(std::list<std::string> &list); 95 void SetCloudState(bool active); 96 int32_t RestoreconSystemServiceDirs(int32_t userId); 97 int32_t FindMountPointsToMap(std::map<std::string, std::list<std::string>> &mountMap, int32_t userId); 98 void MountPointToList(std::list<std::string> &hmdfsList, std::list<std::string> &hmfsList, 99 std::list<std::string> &sharefsList, std::string &line, int32_t userId); 100 bool CheckMaps(const std::string &path, std::list<std::string> &mountFailList); 101 bool CheckSymlink(const std::string &path, std::list<std::string> &mountFailList); 102 bool GetProcessInfo(const std::string &filename, ProcessInfo &info); 103 bool PidUsingFlag(std::string &pidPath, std::list<std::string> &mountFailList); 104 void UmountFailRadar(std::vector<ProcessInfo> &processInfo, int32_t radar); 105 void MountSandboxPath(const std::vector<std::string> &srcPaths, const std::vector<std::string> &dstPaths, 106 const std::string &bundleName, const std::string &userId); 107 bool CheckMountFileByUser(int32_t userId); 108 bool CloudDirFlag(const std::string &path); 109 int32_t FindAndKillProcess(int32_t userId, std::list<std::string> &unMountFailList, int32_t radar); 110 111 private: 112 bool SupportHmdfs(); 113 int32_t CreateVirtualDirs(int32_t userId); 114 int32_t HmdfsMount(int32_t userId); 115 int32_t HmdfsMount(int32_t userId, std::string relativePath, bool mountCloudDisk = false); 116 int32_t HmdfsTwiceMount(int32_t userId, const std::string &relativePath); 117 int32_t SharefsMount(int32_t userId); 118 int32_t HmSharefsMount(int32_t userId, std::string &srcPath, std::string &dstPath); 119 int32_t LocalMount(int32_t userId); 120 int32_t LocalUMount(int32_t userId); 121 int32_t SetFafQuotaProId(int32_t userId); 122 int32_t CreateSystemServiceDirs(int32_t userId); 123 void MountCloudForUsers(void); 124 void UMountCloudForUsers(void); 125 void PrepareFileManagerDir(int32_t userId); 126 int32_t CloudUMount(int32_t userId); 127 bool CheckPathValid(const std::string &bundleNameStr, uint32_t userId); 128 int32_t MountAppdataAndSharefs(int32_t userId); 129 int32_t MountAppdata(const std::string &userId); 130 bool DirExist(const std::string &dir); 131 void GetAllUserId(std::vector<int32_t> &userIds); 132 int32_t PrepareAppdataDirByUserId(int32_t userId); 133 int32_t MountSharefsAndNoSharefs(int32_t userId); 134 int32_t SharedMount(const std::string &path); 135 int32_t BindAndRecMount(std::string &srcPath, std::string &dstPath, bool isUseSlave = true); 136 int32_t UmountMntUserTmpfs(int32_t userId); 137 int32_t UmountFileSystem(int32_t userId); 138 int32_t FindProcess(std::list<std::string> &unMountFailList, std::vector<ProcessInfo> &proInfos, 139 std::list<std::string> &excludeProcess); 140 int32_t FindSaFd(int32_t userId); 141 142 DISALLOW_COPY_AND_MOVE(MountManager); 143 144 static std::shared_ptr<MountManager> instance_; 145 const std::vector<DirInfo> hmdfsDirVec_; 146 const std::vector<DirInfo> virtualDir_; 147 const std::vector<DirInfo> systemServiceDir_; 148 const std::vector<DirInfo> fileManagerDir_; 149 const std::vector<DirInfo> appdataDir_; 150 std::mutex mountMutex_; 151 std::vector<int32_t> fuseToMountUsers_; 152 std::vector<int32_t> fuseMountedUsers_; 153 bool cloudReady_{false}; 154 }; 155 } // STORAGE_DAEMON 156 } // OHOS 157 158 #endif // OHOS_STORAGE_DAEMON_USER_MANAGER_H 159