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