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 "file_sharing/file_sharing.h"
16 
17 namespace OHOS {
18 namespace StorageDaemon {
SetupFileSharingDir()19 int SetupFileSharingDir()
20 {
21     if (!IsDir(FSCRYPT_EL1_PUBLIC)) {
22         LOGE("No directory for filesystem encryption EL1");
23         return -1;
24     }
25 
26     std::string fsShareParam = GetFileShareDefineParameter();
27     if (PrepareFileSharingDir(fsShareParam) != 0) {
28         LOGE("Failed to prepare file sharing directory of storage daemon");
29         return -1;
30     }
31 
32     return SetupDirAcl(fsShareParam);
33 }
34 
PrepareFileSharingDir(const std::string & fsShareParam)35 int PrepareFileSharingDir(const std::string &fsShareParam)
36 {
37     bool success = PrepareDir(STORAGE_DAEMON_EL1_DIR, STORAGE_DAEMON_DIR_MODE, ROOT_UID, ROOT_GID);
38     if (!success) {
39         LOGE("Prepare directory of storage daemon failed, path = %{public}s", STORAGE_DAEMON_EL1_DIR.c_str());
40         return -1;
41     }
42 
43     if (fsShareParam == TOB_SCENE || fsShareParam == TOD_SCENE) {
44         success = PrepareDir(SHARE_TOB_DIR, SHARE_TOB_DIR_MODE, SHARE_TOB_UID, SHARE_TOB_GID);
45         if (!success) {
46             LOGE("Prepare directory for path = %{public}s failed, fsShareParam = %{public}s",
47                  SHARE_TOB_DIR.c_str(), fsShareParam.c_str());
48             return -1;
49         }
50     }
51 
52     if (fsShareParam == TOC_SCENE || fsShareParam == TOD_SCENE) {
53         success = PrepareDir(FILE_SHARING_DIR, FILE_SHARING_DIR_MODE, FILE_MANAGER_UID, FILE_MANAGER_GID);
54         if (!success) {
55             LOGE("Prepare directory for path = %{public}s failed, fsShareParam = %{public}s",
56                  FILE_SHARING_DIR.c_str(), fsShareParam.c_str());
57             return -1;
58         }
59 
60         success = PrepareDir(PUBLIC_DIR, PUBLIC_DIR_MODE, FILE_MANAGER_UID, FILE_MANAGER_GID);
61         if (!success) {
62             LOGE("Prepare directory for path = %{public}s failed, fsShareParam = %{public}s",
63                  PUBLIC_DIR.c_str(), fsShareParam.c_str());
64             return -1;
65         }
66     }
67     LOGI("Prepare file sharing directory success");
68     return 0;
69 }
70 
SetupDirAcl(const std::string & fsShareParam)71 int SetupDirAcl(const std::string &fsShareParam)
72 {
73     if (fsShareParam == TOB_SCENE || fsShareParam == TOD_SCENE) {
74         if (getxattr(SHARE_TOB_DIR.c_str(), ACL_XATTR_DEFAULT, nullptr, 0) <= 0) {
75             int rc = AclSetDefault(SHARE_TOB_DIR, "g:7017:rwx");
76             if (rc != 0) {
77                 LOGE("Set acl for dir = %{public}s failed, fsShareParam = %{public}s",
78                      SHARE_TOB_DIR.c_str(), fsShareParam.c_str());
79                 return -1;
80             }
81         }
82     }
83 
84     if (fsShareParam == TOC_SCENE || fsShareParam == TOD_SCENE) {
85         if (getxattr(PUBLIC_DIR.c_str(), ACL_XATTR_DEFAULT, nullptr, 0) <= 0) {
86             int rc = AclSetDefault(PUBLIC_DIR, "g:1006:rwx");
87             if (rc != 0) {
88                 LOGE("Set acl for dir = %{public}s failed, fsShareParam = %{public}s",
89                      PUBLIC_DIR.c_str(), fsShareParam.c_str());
90                 return -1;
91             }
92         }
93     }
94     LOGI("Set acl success");
95     return 0;
96 }
97 
GetFileShareDefineParameter()98 std::string GetFileShareDefineParameter()
99 {
100     char fsShareParam[] = "2c_share";
101     int ret = GetParameter(SHARE_DIR_ENABLE_PARAMETER, "", fsShareParam, MAX_FS_DEFINE_VAL_LEN);
102     if (ret <= 0) {
103         LOGE("GetParameter name = %{public}s error, ret = %{public}d, return default value",
104              SHARE_DIR_ENABLE_PARAMETER, ret);
105         return TOC_SCENE;
106     }
107 
108     if ((strlen(fsShareParam) == 0) || (strlen(fsShareParam) > MAX_FS_DEFINE_VAL_LEN)) {
109         LOGE("GetParameter success, but fsShareParam = %{public}s is invalid, return default value",
110              fsShareParam);
111         return TOC_SCENE;
112     }
113 
114     if ((fsShareParam != TOB_SCENE) && (fsShareParam != TOC_SCENE) && (fsShareParam != TOD_SCENE)) {
115         LOGE("GetParameter success, but fsShareParam = %{public}s is not expected, return default value",
116              fsShareParam);
117         return TOC_SCENE;
118     }
119     LOGI("GetParameter success, fsShareParam = %{public}s", fsShareParam);
120     return fsShareParam;
121 }
122 } // namespace StorageDaemon
123 } // namespace OHOS
124 
125