1 /*
2 * Copyright (c) 2023 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 "dlp_file_kits_test.h"
17 #include <cstdio>
18 #include <fcntl.h>
19 #include <fstream>
20 #include <iostream>
21 #include <sys/stat.h>
22 #include <sys/types.h>
23 #include "accesstoken_kit.h"
24 #include "dlp_file_kits.h"
25 #include "dlp_permission.h"
26 #include "dlp_permission_log.h"
27 #include "int_wrapper.h"
28 #include "string_wrapper.h"
29 #include "want_params_wrapper.h"
30
31 using namespace testing::ext;
32 using namespace OHOS::Security::DlpPermission;
33 using namespace OHOS::Security::AccessToken;
34 using namespace std;
35
36 using Want = OHOS::AAFwk::Want;
37 using WantParams = OHOS::AAFwk::WantParams;
38 using WantParamWrapper = OHOS::AAFwk::WantParamWrapper;
39 using String = OHOS::AAFwk::String;
40 using Integer = OHOS::AAFwk::Integer;
41 namespace OHOS {
42 namespace AppFileService {
43 namespace ModuleFileUri {
44 namespace {
45 static const std::string DLP_FILE_NAME = "/data/test/fuse_test.txt.dlp";
46 }
GetRealPath()47 std::string FileUri::GetRealPath()
48 {
49 static int32_t gCount = 1;
50 if (gCount == 1) {
51 gCount++;
52 return DLP_FILE_NAME;
53 }
54 return "";
55 }
56 }
57 }
58 }
59 namespace {
60 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_DLP_PERMISSION, "DlpFileKitsTest"};
61
62 static int g_dlpFileFd = -1;
63 static const std::string PLAIN_FILE_NAME = "/data/test/fuse_test.txt";
64 static const std::string DLP_FILE_NAME = "/data/test/fuse_test.txt.dlp";
65 static const std::string DLP_FILE_NAME_2 = "/data/test/fuse_test2.txt.dlp";
66 static const std::string DLP_FILE_URI = "file://data/test/fuse_test.txt.dlp";
67 static const std::string DLP_FILE_URI_2 = "file://data/test/fuse_test2.txt.dlp";
68 static const std::string PLAIN_FILE_URI = "file://data/test/fuse_test.txt";
69 static const std::string DLP_TEST_DIR = "/data/test/dlpTest/";
70 static const int DLP_FILE_PERMISSION = 0777;
71
CreateDlpFileFd()72 void CreateDlpFileFd()
73 {
74 int plainFileFd = open(PLAIN_FILE_NAME.c_str(), O_CREAT | O_RDWR | O_TRUNC, DLP_FILE_PERMISSION);
75 if (plainFileFd < 0) {
76 cout << "create dlpFile fd failed" << endl;
77 return;
78 }
79 int fileFd = open(DLP_FILE_NAME_2.c_str(), O_CREAT | O_RDWR | O_TRUNC, DLP_FILE_PERMISSION);
80 if (fileFd < 0) {
81 close(plainFileFd);
82 cout << "create dlpFile fd failed" << endl;
83 return;
84 }
85 g_dlpFileFd = open(DLP_FILE_NAME.c_str(), O_CREAT | O_RDWR | O_TRUNC, DLP_FILE_PERMISSION);
86 if (g_dlpFileFd < 0) {
87 close(plainFileFd);
88 close(fileFd);
89 cout << "create dlpFile fd failed" << endl;
90 return;
91 }
92
93 struct DlpProperty prop;
94 prop.ownerAccount = "ohosAnonymousName";
95 prop.ownerAccountId = "ohosAnonymousName";
96 prop.ownerAccountType = CLOUD_ACCOUNT;
97 prop.contactAccount = "test@test.com";
98
99 std::shared_ptr<DlpFile> filePtr;
100 int ret = DlpFileManager::GetInstance().GenerateDlpFile(plainFileFd,
101 g_dlpFileFd, prop, filePtr, DLP_TEST_DIR);
102 close(plainFileFd);
103 close(fileFd);
104 if (ret != DLP_OK) {
105 cout << "create dlpFile object failed" << endl;
106 return;
107 }
108 DlpFileManager::GetInstance().CloseDlpFile(filePtr);
109 }
110 }
111
SetUpTestCase()112 void DlpFileKitsTest::SetUpTestCase()
113 {
114 struct stat fstat;
115 if (stat(DLP_TEST_DIR.c_str(), &fstat) != 0) {
116 if (errno == ENOENT) {
117 int32_t ret = mkdir(DLP_TEST_DIR.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
118 if (ret < 0) {
119 DLP_LOG_ERROR(LABEL, "mkdir mount point failed errno %{public}d", errno);
120 return;
121 }
122 } else {
123 DLP_LOG_ERROR(LABEL, "get mount point failed errno %{public}d", errno);
124 return;
125 }
126 }
127 CreateDlpFileFd();
128 }
129
TearDownTestCase()130 void DlpFileKitsTest::TearDownTestCase()
131 {
132 if (g_dlpFileFd != -1) {
133 close(g_dlpFileFd);
134 g_dlpFileFd = -1;
135 }
136 rmdir(DLP_TEST_DIR.c_str());
137 }
138
SetUp()139 void DlpFileKitsTest::SetUp() {}
140
TearDown()141 void DlpFileKitsTest::TearDown() {}
142
143 /**
144 * @tc.name: GetSandboxFlag001
145 * @tc.desc: Get Sandbox flag, want valid
146 * @tc.type: FUNC
147 * @tc.require:AR000H7BOC
148 */
149 HWTEST_F(DlpFileKitsTest, GetSandboxFlag001, TestSize.Level1)
150 {
151 DLP_LOG_INFO(LABEL, "GetSandboxFlag001");
152 OHOS::AAFwk::Want want;
153
154 want.SetAction(TAG_ACTION_VIEW);
155 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
156 want.SetAction(TAG_ACTION_EDIT);
157 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
158 }
159
160 /**
161 * @tc.name: GetSandboxFlag002
162 * @tc.desc: Get Sandbox flag, action inValid
163 * @tc.type: FUNC
164 * @tc.require:AR000H7BOC
165 */
166 HWTEST_F(DlpFileKitsTest, GetSandboxFlag002, TestSize.Level1)
167 {
168 DLP_LOG_INFO(LABEL, "GetSandboxFlag002");
169 OHOS::AAFwk::Want want;
170 want.SetAction("ohos.want.action.home");
171
172 WantParams TopParam;
173 WantParams fileNameParam;
174 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("test.txt.dlp"));
175 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
176
177 WantParams fileFdParam;
178 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
179 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(g_dlpFileFd));
180 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
181 want.SetParams(TopParam);
182
183 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
184 ASSERT_FALSE((want.GetType() == "text/plain"));
185 }
186
187 /**
188 * @tc.name: GetSandboxFlag003
189 * @tc.desc: Get Sandbox flag, no fileName param
190 * @tc.type: FUNC
191 * @tc.require:AR000H7BOC
192 */
193 HWTEST_F(DlpFileKitsTest, GetSandboxFlag003, TestSize.Level1)
194 {
195 DLP_LOG_INFO(LABEL, "GetSandboxFlag003");
196 OHOS::AAFwk::Want want;
197 want.SetAction(TAG_ACTION_VIEW);
198
199 WantParams TopParam;
200 WantParams fileFdParam;
201 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
202 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(g_dlpFileFd));
203 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
204 want.SetParams(TopParam);
205
206 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
207 ASSERT_FALSE((want.GetType() == "text/plain"));
208 }
209
210 /**
211 * @tc.name: GetSandboxFlag004
212 * @tc.desc: Get Sandbox flag, file name is not dlp
213 * @tc.type: FUNC
214 * @tc.require:AR000H7BOC
215 */
216 HWTEST_F(DlpFileKitsTest, GetSandboxFlag004, TestSize.Level1)
217 {
218 DLP_LOG_INFO(LABEL, "GetSandboxFlag004");
219 OHOS::AAFwk::Want want;
220 want.SetAction(TAG_ACTION_VIEW);
221 want.SetUri(DLP_FILE_URI);
222
223 ASSERT_TRUE(DlpFileKits::GetSandboxFlag(want));
224 }
225
226 /**
227 * @tc.name: GetSandboxFlag005
228 * @tc.desc: Get Sandbox flag, file name is .dlp
229 * @tc.type: FUNC
230 * @tc.require:AR000H7BOC
231 */
232 HWTEST_F(DlpFileKitsTest, GetSandboxFlag005, TestSize.Level1)
233 {
234 DLP_LOG_INFO(LABEL, "GetSandboxFlag005");
235 OHOS::AAFwk::Want want;
236 want.SetAction(TAG_ACTION_VIEW);
237
238 WantParams TopParam;
239 WantParams fileNameParam;
240 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box(".dlp"));
241 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
242
243 WantParams fileFdParam;
244 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
245 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(g_dlpFileFd));
246 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
247 want.SetParams(TopParam);
248
249 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
250 ASSERT_FALSE((want.GetType() == "text/plain"));
251 }
252
253 /**
254 * @tc.name: GetSandboxFlag006
255 * @tc.desc: Get Sandbox flag, file name is less than ".dlp"
256 * @tc.type: FUNC
257 * @tc.require:AR000H7BOC
258 */
259 HWTEST_F(DlpFileKitsTest, GetSandboxFlag006, TestSize.Level1)
260 {
261 DLP_LOG_INFO(LABEL, "GetSandboxFlag006");
262 OHOS::AAFwk::Want want;
263 want.SetAction(TAG_ACTION_VIEW);
264
265 WantParams TopParam;
266 WantParams fileNameParam;
267 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("lp"));
268 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
269
270 WantParams fileFdParam;
271 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
272 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(g_dlpFileFd));
273 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
274 want.SetParams(TopParam);
275
276 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
277 ASSERT_FALSE((want.GetType() == "text/plain"));
278 }
279
280 /**
281 * @tc.name: GetSandboxFlag008
282 * @tc.desc: Get Sandbox flag, no keyFd
283 * @tc.type: FUNC
284 * @tc.require:AR000H7BOC
285 */
286 HWTEST_F(DlpFileKitsTest, GetSandboxFlag008, TestSize.Level1)
287 {
288 DLP_LOG_INFO(LABEL, "GetSandboxFlag008");
289 OHOS::AAFwk::Want want;
290 want.SetAction(TAG_ACTION_VIEW);
291
292 WantParams TopParam;
293 WantParams fileNameParam;
294 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("test.txt.dlp"));
295 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
296 want.SetParams(TopParam);
297
298 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
299 ASSERT_FALSE((want.GetType() == "text/plain"));
300 }
301
302 /**
303 * @tc.name: GetSandboxFlag009
304 * @tc.desc: Get Sandbox flag, keyFd type is not FD
305 * @tc.type: FUNC
306 * @tc.require:AR000H7BOC
307 */
308 HWTEST_F(DlpFileKitsTest, GetSandboxFlag009, TestSize.Level1)
309 {
310 DLP_LOG_INFO(LABEL, "GetSandboxFlag009");
311 OHOS::AAFwk::Want want;
312 want.SetAction(TAG_ACTION_VIEW);
313
314 WantParams TopParam;
315 WantParams fileNameParam;
316 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("test.txt.dlp"));
317 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
318
319 WantParams fileFdParam;
320 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box("FD1"));
321 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(g_dlpFileFd));
322 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
323 want.SetParams(TopParam);
324
325 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
326 ASSERT_FALSE((want.GetType() == "text/plain"));
327 }
328
329 /**
330 * @tc.name: GetSandboxFlag010
331 * @tc.desc: Get Sandbox flag, fileFd has no value key
332 * @tc.type: FUNC
333 * @tc.require:AR000H7BOC
334 */
335 HWTEST_F(DlpFileKitsTest, GetSandboxFlag010, TestSize.Level1)
336 {
337 DLP_LOG_INFO(LABEL, "GetSandboxFlag009");
338 OHOS::AAFwk::Want want;
339 want.SetAction(TAG_ACTION_VIEW);
340
341 WantParams TopParam;
342 WantParams fileNameParam;
343 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("test.txt.dlp"));
344 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
345
346 WantParams fileFdParam;
347 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
348 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
349 want.SetParams(TopParam);
350
351 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
352 ASSERT_FALSE((want.GetType() == "text/plain"));
353 }
354
355 /**
356 * @tc.name: GetSandboxFlag011
357 * @tc.desc: Get Sandbox flag, fileFd fd = -1
358 * @tc.type: FUNC
359 * @tc.require:AR000H7BOC
360 */
361 HWTEST_F(DlpFileKitsTest, GetSandboxFlag011, TestSize.Level1)
362 {
363 DLP_LOG_INFO(LABEL, "GetSandboxFlag011");
364 OHOS::AAFwk::Want want;
365 want.SetAction(TAG_ACTION_VIEW);
366
367 WantParams TopParam;
368 WantParams fileNameParam;
369 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("test.txt.dlp"));
370 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
371
372 WantParams fileFdParam;
373 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
374 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(-1));
375 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
376 want.SetParams(TopParam);
377
378 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
379 ASSERT_FALSE((want.GetType() == "text/plain"));
380 }
381
382 /**
383 * @tc.name: GetSandboxFlag012
384 * @tc.desc: Get Sandbox flag, fileFd fd is real, but is not dlpfile fd
385 * @tc.type: FUNC
386 * @tc.require:AR000H7BOC
387 */
388 HWTEST_F(DlpFileKitsTest, GetSandboxFlag012, TestSize.Level1)
389 {
390 DLP_LOG_INFO(LABEL, "GetSandboxFlag012");
391 int plainFileFd = open("/data/fuse_test.txt", O_CREAT | O_RDWR | O_TRUNC, 0777);
392 ASSERT_GE(plainFileFd, 0);
393
394 OHOS::AAFwk::Want want;
395 want.SetAction(TAG_ACTION_VIEW);
396
397 WantParams TopParam;
398 WantParams fileNameParam;
399 fileNameParam.SetParam(TAG_FILE_NAME_VALUE, String::Box("test.txt.dlp"));
400 TopParam.SetParam(TAG_FILE_NAME, WantParamWrapper::Box(fileNameParam));
401
402 WantParams fileFdParam;
403 fileFdParam.SetParam(TAG_KEY_FD_TYPE, String::Box(VALUE_KEY_FD_TYPE));
404 fileFdParam.SetParam(TAG_KEY_FD_VALUE, Integer::Box(plainFileFd));
405 TopParam.SetParam(TAG_KEY_FD, WantParamWrapper::Box(fileFdParam));
406 want.SetParams(TopParam);
407
408 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
409 ASSERT_FALSE((want.GetType() == "text/plain"));
410 }
411
412 /**
413 * @tc.name: GetSandboxFlag013
414 * @tc.desc: Get Sandbox flag, want valid
415 * @tc.type: FUNC
416 * @tc.require:AR000H7BOC
417 */
418 HWTEST_F(DlpFileKitsTest, GetSandboxFlag013, TestSize.Level1)
419 {
420 DLP_LOG_INFO(LABEL, "GetSandboxFlag004");
421 OHOS::AAFwk::Want want;
422 want.SetAction(TAG_ACTION_VIEW);
423 want.SetUri(PLAIN_FILE_URI);
424 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
425 want.SetUri(DLP_FILE_URI_2);
426 ASSERT_FALSE(DlpFileKits::GetSandboxFlag(want));
427 }
428
429 /**
430 * @tc.name: IsDlpFile001
431 * @tc.desc: test param whether dlpFd is valid.
432 * @tc.type: FUNC
433 * @tc.require:issue:IAIFTY
434 */
435 HWTEST_F(DlpFileKitsTest, IsDlpFile001, TestSize.Level1)
436 {
437 DLP_LOG_INFO(LABEL, "IsDlpFile001");
438
439 int32_t dlpFd = -1;
440 ASSERT_FALSE(DlpFileKits::IsDlpFile(dlpFd));
441
442 dlpFd = 1;
443 ASSERT_FALSE(DlpFileKits::IsDlpFile(dlpFd));
444
445 dlpFd = open("/data/fuse_test.txt", O_CREAT | O_RDWR | O_TRUNC, 0777);
446 ASSERT_GE(dlpFd, 0);
447 ASSERT_FALSE(DlpFileKits::IsDlpFile(dlpFd));
448 ASSERT_EQ(close(dlpFd), 0);
449 }