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