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 #define LOG_TAG "UdmfClientHapPermissionTest"
16 #include <gtest/gtest.h>
17 
18 #include <unistd.h>
19 #include <thread>
20 #include <chrono>
21 
22 #include "token_setproc.h"
23 #include "accesstoken_kit.h"
24 #include "directory_ex.h"
25 #include "nativetoken_kit.h"
26 
27 #include "logger.h"
28 #include "udmf_client.h"
29 #include "application_defined_record.h"
30 #include "audio.h"
31 #include "file.h"
32 #include "folder.h"
33 #include "html.h"
34 #include "image.h"
35 #include "link.h"
36 #include "plain_text.h"
37 #include "system_defined_appitem.h"
38 #include "system_defined_form.h"
39 #include "system_defined_pixelmap.h"
40 #include "system_defined_record.h"
41 #include "text.h"
42 #include "unified_data_helper.h"
43 #include "video.h"
44 
45 using namespace testing::ext;
46 using namespace OHOS::Security::AccessToken;
47 using namespace OHOS::UDMF;
48 using namespace OHOS;
49 namespace OHOS::Test {
50 static constexpr int USER_ID = 100;
51 static constexpr int INST_INDEX = 0;
52 class UdmfClientHapPermissionTest : public testing::Test {
53 public:
54     static void SetUpTestCase();
55     static void TearDownTestCase();
56     void SetUp() override;
57     void TearDown() override;
58 
59     void SetNativeToken(const std::string &processName);
60     static void AllocHapToken1();
61     static void AllocHapToken2();
62     void SetHapToken1();
63     void SetHapToken2();
64     void AddPrivilege(QueryOption &option);
65 };
66 
SetUpTestCase()67 void UdmfClientHapPermissionTest::SetUpTestCase()
68 {
69     AllocHapToken1();
70     AllocHapToken2();
71 }
72 
TearDownTestCase()73 void UdmfClientHapPermissionTest::TearDownTestCase()
74 {
75     auto tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo11", INST_INDEX);
76     AccessTokenKit::DeleteToken(tokenId);
77     tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo22", INST_INDEX);
78     AccessTokenKit::DeleteToken(tokenId);
79 }
80 
SetUp()81 void UdmfClientHapPermissionTest::SetUp()
82 {
83     SetHapToken1();
84 }
85 
TearDown()86 void UdmfClientHapPermissionTest::TearDown()
87 {
88 }
89 
SetNativeToken(const std::string & processName)90 void UdmfClientHapPermissionTest::SetNativeToken(const std::string &processName)
91 {
92     auto tokenId = AccessTokenKit::GetNativeTokenId(processName);
93     SetSelfTokenID(tokenId);
94 }
95 
AllocHapToken1()96 void UdmfClientHapPermissionTest::AllocHapToken1()
97 {
98     HapInfoParams info = {
99         .userID = USER_ID,
100         .bundleName = "ohos.test.demo11",
101         .instIndex = INST_INDEX,
102         .appIDDesc = "ohos.test.demo11",
103         .isSystemApp = false,
104     };
105 
106     HapPolicyParams policy = {
107         .apl = APL_SYSTEM_BASIC,
108         .domain = "test.domain",
109         .permList = {
110             {
111                 .permissionName = "ohos.permission.test",
112                 .bundleName = "ohos.test.demo11",
113                 .grantMode = 1,
114                 .availableLevel = APL_SYSTEM_BASIC,
115                 .label = "label",
116                 .labelId = 1,
117                 .description = "test1",
118                 .descriptionId = 1
119             }
120         },
121         .permStateList = {
122             {
123                 .permissionName = "ohos.permission.test",
124                 .isGeneral = true,
125                 .resDeviceID = { "local" },
126                 .grantStatus = { PermissionState::PERMISSION_GRANTED },
127                 .grantFlags = { 1 }
128             }
129         }
130     };
131     auto tokenID = AccessTokenKit::AllocHapToken(info, policy);
132     SetSelfTokenID(tokenID.tokenIDEx);
133 }
134 
AllocHapToken2()135 void UdmfClientHapPermissionTest::AllocHapToken2()
136 {
137     HapInfoParams info = {
138         .userID = USER_ID,
139         .bundleName = "ohos.test.demo22",
140         .instIndex = 0,
141         .isSystemApp = false,
142         .appIDDesc = "ohos.test.demo22"
143     };
144     HapPolicyParams policy = {
145         .apl = APL_SYSTEM_BASIC,
146         .domain = "test.domain",
147         .permList = {
148             {
149                 .permissionName = "ohos.permission.MANAGE_UDMF_APP_SHARE_OPTION",
150                 .bundleName = "ohos.test.demo22",
151                 .grantMode = 1,
152                 .availableLevel = APL_SYSTEM_BASIC,
153                 .label = "label",
154                 .labelId = 1,
155                 .description = "test2",
156                 .descriptionId = 1
157             }
158         },
159         .permStateList = {
160             {
161                 .permissionName = "ohos.permission.MANAGE_UDMF_APP_SHARE_OPTION",
162                 .isGeneral = true,
163                 .resDeviceID = { "local" },
164                 .grantStatus = { PermissionState::PERMISSION_GRANTED },
165                 .grantFlags = { 1 }
166             }
167         }
168     };
169     auto tokenID = AccessTokenKit::AllocHapToken(info, policy);
170     SetSelfTokenID(tokenID.tokenIDEx);
171 }
172 
SetHapToken1()173 void UdmfClientHapPermissionTest::SetHapToken1()
174 {
175     auto tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo11", INST_INDEX);
176     SetSelfTokenID(tokenId);
177 }
178 
SetHapToken2()179 void UdmfClientHapPermissionTest::SetHapToken2()
180 {
181     auto tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo22", INST_INDEX);
182     SetSelfTokenID(tokenId);
183 }
184 
AddPrivilege(QueryOption & option)185 void UdmfClientHapPermissionTest::AddPrivilege(QueryOption &option)
186 {
187     Privilege privilege;
188     privilege.tokenId = AccessTokenKit::GetHapTokenID(USER_ID, "ohos.test.demo22", INST_INDEX);
189     privilege.readPermission = "readPermission";
190     privilege.writePermission = "writePermission";
191     SetNativeToken("msdp_sa");
192     auto status = UdmfClient::GetInstance().AddPrivilege(option, privilege);
193     ASSERT_EQ(status, E_OK);
194 }
195 
196 /**
197 * @tc.name: SetAppShareOption001
198 * @tc.desc: abnormal test, no permission
199 * @tc.type: FUNC
200 */
201 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption001, TestSize.Level1)
202 {
203     SetHapToken1();
204     LOG_INFO(UDMF_TEST, "SetAppShareOption001 begin.");
205     auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::IN_APP);
206     EXPECT_EQ(status, E_NO_PERMISSION);
207     LOG_INFO(UDMF_TEST, "SetAppShareOption001 end.");
208 }
209 
210 /**
211 * @tc.name: SetAppShareOption002
212 * @tc.desc: normal test, has permission
213 * @tc.type: FUNC
214 */
215 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption002, TestSize.Level1)
216 {
217     SetHapToken2();
218     LOG_INFO(UDMF_TEST, "SetAppShareOption002 begin.");
219     auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::IN_APP);
220     EXPECT_EQ(status, E_OK);
221 
222     ShareOptions appShareOptions;
223     status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
224     EXPECT_EQ(status, E_OK);
225     EXPECT_EQ(appShareOptions, ShareOptions::IN_APP);
226 
227     status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
228     EXPECT_EQ(status, E_OK);
229 
230     status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::CROSS_APP);
231     EXPECT_EQ(status, E_OK);
232 
233     status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
234     EXPECT_EQ(status, E_OK);
235     EXPECT_EQ(appShareOptions, ShareOptions::CROSS_APP);
236 
237     status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
238     EXPECT_EQ(status, E_OK);
239 
240     status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
241     EXPECT_EQ(status, E_NOT_FOUND);
242     LOG_INFO(UDMF_TEST, "SetAppShareOption002 end.");
243 }
244 
245 /**
246 * @tc.name: SetAppShareOption003
247 * @tc.desc: SetAppShareOption IN_APP, get data success when IN_APP
248 * @tc.type: FUNC
249 */
250 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption003, TestSize.Level1)
251 {
252     LOG_INFO(UDMF_TEST, "SetAppShareOption003 begin.");
253     SetHapToken2();
254     auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::IN_APP);
255     EXPECT_EQ(status, E_OK);
256 
257     CustomOption option1 = { .intention = Intention::UD_INTENTION_DRAG };
258     UnifiedData data1;
259     Text text1;
260     std::shared_ptr<UnifiedRecord> record1 = std::make_shared<Text>(text1);
261     data1.AddRecord(record1);
262     std::string key;
263     status = UdmfClient::GetInstance().SetData(option1, data1, key);
264     ASSERT_EQ(status, E_OK);
265 
266     QueryOption option2 = { .key = key };
267     SetHapToken2();
268     UnifiedData data2;
269     status = UdmfClient::GetInstance().GetData(option2, data2);
270     ASSERT_EQ(status, E_OK);
271 
272     std::shared_ptr<UnifiedRecord> record2 = data2.GetRecordAt(0);
273     ASSERT_NE(record2, nullptr);
274     auto type = record2->GetType();
275     EXPECT_EQ(type, UDType::TEXT);
276 
277     auto text2 = static_cast<Text *>(record2.get());
278     ASSERT_NE(text2, nullptr);
279 
280     status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
281     EXPECT_EQ(status, E_OK);
282     LOG_INFO(UDMF_TEST, "SetAppShareOption003 end.");
283 }
284 
285 /**
286 * @tc.name: SetAppShareOption004
287 * @tc.desc: SetAppShareOption CROSS_APP, get data success when CROSS_APP
288 * @tc.type: FUNC
289 */
290 HWTEST_F(UdmfClientHapPermissionTest, SetAppShareOption004, TestSize.Level1)
291 {
292     LOG_INFO(UDMF_TEST, "SetAppShareOption004 begin.");
293     SetHapToken2();
294     auto status = UdmfClient::GetInstance().SetAppShareOption("drag", ShareOptions::CROSS_APP);
295     EXPECT_EQ(status, E_OK);
296 
297     CustomOption option1 = { .intention = Intention::UD_INTENTION_DRAG };
298     UnifiedData data1;
299     Text text1;
300     std::shared_ptr<UnifiedRecord> record1 = std::make_shared<Text>(text1);
301     data1.AddRecord(record1);
302     std::string key;
303     status = UdmfClient::GetInstance().SetData(option1, data1, key);
304     ASSERT_EQ(status, E_OK);
305 
306     QueryOption option2 = { .key = key };
307     AddPrivilege(option2);
308 
309     SetHapToken2();
310     UnifiedData data2;
311     status = UdmfClient::GetInstance().GetData(option2, data2);
312     ASSERT_EQ(status, E_OK);
313     std::shared_ptr<UnifiedRecord> record2 = data2.GetRecordAt(0);
314     ASSERT_NE(record2, nullptr);
315     auto type = record2->GetType();
316     EXPECT_EQ(type, UDType::TEXT);
317     auto text2 = static_cast<Text *>(record2.get());
318     ASSERT_NE(text2, nullptr);
319 
320     SetHapToken2();
321     status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
322     EXPECT_EQ(status, E_OK);
323     LOG_INFO(UDMF_TEST, "SetAppShareOption004 end.");
324 }
325 
326 /**
327 * @tc.name: RemoveAppShareOption001
328 * @tc.desc: abnormal test, no permission
329 * @tc.type: FUNC
330 */
331 HWTEST_F(UdmfClientHapPermissionTest, RemoveAppShareOption001, TestSize.Level1)
332 {
333     SetHapToken1();
334     LOG_INFO(UDMF_TEST, "RemoveAppShareOption001 begin.");
335     auto status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
336     EXPECT_EQ(status, E_NO_PERMISSION);
337     LOG_INFO(UDMF_TEST, "RemoveAppShareOption001 end.");
338 }
339 
340 /**
341 * @tc.name: RemoveAppShareOption002
342 * @tc.desc: normal test, has permission
343 * @tc.type: FUNC
344 */
345 HWTEST_F(UdmfClientHapPermissionTest, RemoveAppShareOption002, TestSize.Level1)
346 {
347     SetHapToken2();
348     LOG_INFO(UDMF_TEST, "RemoveAppShareOption002 begin.");
349     auto status = UdmfClient::GetInstance().RemoveAppShareOption("drag");
350     EXPECT_EQ(status, E_OK);
351 
352     ShareOptions appShareOptions;
353     status = UdmfClient::GetInstance().GetAppShareOption("drag", appShareOptions);
354     EXPECT_EQ(status, E_NOT_FOUND);
355     LOG_INFO(UDMF_TEST, "RemoveAppShareOption002 end.");
356 }
357 } // OHOS::Test