• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include "permission_request_toggle_status_test.h"
17 #include "gtest/gtest.h"
18 #include <thread>
19 #include <unistd.h>
20 
21 #include "access_token.h"
22 #include "access_token_error.h"
23 #include "accesstoken_common_log.h"
24 #include "iaccess_token_manager.h"
25 #include "permission_grant_info.h"
26 #include "permission_state_change_info_parcel.h"
27 #include "string_ex.h"
28 #include "test_common.h"
29 #include "tokenid_kit.h"
30 #include "token_setproc.h"
31 
32 using namespace testing::ext;
33 namespace OHOS {
34 namespace Security {
35 namespace AccessToken {
36 namespace {
37 static uint64_t g_selfTokenId = 0;
38 static const std::string TEST_BUNDLE_NAME = "ohos";
39 static const int TEST_USER_ID = 0;
40 static constexpr int32_t DEFAULT_API_VERSION = 8;
41 static MockHapToken* g_mock = nullptr;
42 HapInfoParams g_infoManagerTestNormalInfoParms = TestCommon::GetInfoManagerTestNormalInfoParms();
43 HapInfoParams g_infoManagerTestSystemInfoParms = TestCommon::GetInfoManagerTestSystemInfoParms();
44 HapPolicyParams g_infoManagerTestPolicyPrams = TestCommon::GetInfoManagerTestPolicyPrams();
45 };
46 
SetUpTestCase()47 void PermissionRequestToggleStatusTest::SetUpTestCase()
48 {
49     g_selfTokenId = GetSelfTokenID();
50     TestCommon::SetTestEvironment(g_selfTokenId);
51 
52     // clean up test cases
53     AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0);
54     AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID;
55     TestCommon::DeleteTestHapToken(tokenID);
56 
57     std::vector<std::string> reqPerm;
58     reqPerm.emplace_back("ohos.permission.GET_SENSITIVE_PERMISSIONS");
59     reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
60     g_mock = new (std::nothrow) MockHapToken("PermissionRequestToggleStatusTest", reqPerm, true);
61 }
62 
TearDownTestCase()63 void PermissionRequestToggleStatusTest::TearDownTestCase()
64 {
65     AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0);
66     AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID;
67     TestCommon::DeleteTestHapToken(tokenID);
68 
69     if (g_mock != nullptr) {
70         delete g_mock;
71         g_mock = nullptr;
72     }
73     EXPECT_EQ(0, SetSelfTokenID(g_selfTokenId));
74     TestCommon::ResetTestEvironment();
75 }
76 
SetUp()77 void PermissionRequestToggleStatusTest::SetUp()
78 {
79     LOGI(ATM_DOMAIN, ATM_TAG, "SetUp ok.");
80 
81     setuid(0);
82     HapInfoParams info = {
83         .userID = TEST_USER_ID,
84         .bundleName = TEST_BUNDLE_NAME,
85         .instIndex = 0,
86         .appIDDesc = "appIDDesc",
87         .apiVersion = DEFAULT_API_VERSION
88     };
89 
90     HapPolicyParams policy = {
91         .apl = APL_NORMAL,
92         .domain = "domain"
93     };
94     TestCommon::TestPreparePermStateList(policy);
95 
96     AccessTokenIDEx tokenIdEx = {0};
97     EXPECT_EQ(RET_SUCCESS, TestCommon::AllocTestHapToken(info, policy, tokenIdEx));
98     EXPECT_NE(INVALID_TOKENID, tokenIdEx.tokenIdExStruct.tokenID);
99 }
100 
TearDown()101 void PermissionRequestToggleStatusTest::TearDown()
102 {
103     AccessTokenIDEx tokenIdEx = TestCommon::GetHapTokenIdFromBundle(TEST_USER_ID, TEST_BUNDLE_NAME, 0);
104     AccessTokenID tokenID = tokenIdEx.tokenIdExStruct.tokenID;
105     TestCommon::DeleteTestHapToken(tokenID);
106 }
107 
108 /**
109  * @tc.name: SetPermissionRequestToggleStatusAbnormalTest001
110  * @tc.desc: Set permission request toggle status that userId, permission or status is invalid.
111  * @tc.type: FUNC
112  * @tc.require: Issue Number
113  */
114 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatusAbnormalTest001, TestSize.Level0)
115 {
116     LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatusAbnormalTest001");
117 
118     int32_t userID = 100;
119     uint32_t status = PermissionRequestToggleStatus::CLOSED;
120 
121     // Permission name is invalid.
122     int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("", status, userID);
123     EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
124 
125     // Status is invalid.
126     status = 2;
127     ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status, userID);
128     EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
129 
130     // UserID is invalid.
131     userID = -1;
132     status = PermissionRequestToggleStatus::CLOSED;
133     ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status, userID);
134     EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
135 }
136 
137 /**
138  * @tc.name: SetPermissionRequestToggleStatus001
139  * @tc.desc: SetPermissionRequestToggleStatus caller is a normal app, not a system app.
140  * @tc.type: FUNC
141  * @tc.require: Issue Number
142  */
143 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatus001, TestSize.Level0)
144 {
145     LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatus001");
146     std::vector<std::string> reqPerm;
147     reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
148     MockHapToken mock("SetPermissionRequestToggleStatus001", reqPerm, false);
149 
150     uint32_t status = PermissionRequestToggleStatus::CLOSED;
151     int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
152         g_infoManagerTestNormalInfoParms.userID);
153     EXPECT_EQ(ERR_NOT_SYSTEM_APP, ret);
154 }
155 
156 /**
157  * @tc.name: SetPermissionRequestToggleStatus002
158  * @tc.desc: SetPermissionRequestToggleStatus caller is a system app without permissions.
159  * @tc.type: FUNC
160  * @tc.require: Issue Number
161  */
162 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatus002, TestSize.Level0)
163 {
164     LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatus002");
165     std::vector<std::string> reqPerm;
166     MockHapToken mock("SetPermissionRequestToggleStatus002", reqPerm, true);
167 
168     int32_t selfUid = getuid();
169     setuid(10001); // 10001: UID
170     uint32_t status = PermissionRequestToggleStatus::CLOSED;
171     int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
172         g_infoManagerTestSystemInfoParms.userID);
173     EXPECT_EQ(AccessTokenError::ERR_PERMISSION_DENIED, ret);
174 
175     status = PermissionRequestToggleStatus::OPEN;
176     ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
177         g_infoManagerTestSystemInfoParms.userID);
178     EXPECT_EQ(AccessTokenError::ERR_PERMISSION_DENIED, ret);
179 
180     // restore environment
181     setuid(selfUid);
182 }
183 
184 /**
185  * @tc.name: SetPermissionRequestToggleStatusSpecTest003
186  * @tc.desc: SetPermissionRequestToggleStatus caller is a system app with permissions.
187  * @tc.type: FUNC
188  * @tc.require: Issue Number
189  */
190 HWTEST_F(PermissionRequestToggleStatusTest, SetPermissionRequestToggleStatusSpecTest003, TestSize.Level0)
191 {
192     LOGI(ATM_DOMAIN, ATM_TAG, "SetPermissionRequestToggleStatusSpecTest003");
193     std::vector<std::string> reqPerm;
194     reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
195     MockHapToken mock("SetPermissionRequestToggleStatusSpecTest003", reqPerm, true);
196 
197     uint32_t status = PermissionRequestToggleStatus::CLOSED;
198     int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
199         g_infoManagerTestSystemInfoParms.userID);
200     EXPECT_EQ(RET_SUCCESS, ret);
201 
202     status = PermissionRequestToggleStatus::OPEN;
203     ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
204         g_infoManagerTestSystemInfoParms.userID);
205     EXPECT_EQ(RET_SUCCESS, ret);
206 }
207 
208 /**
209  * @tc.name: GetPermissionRequestToggleStatusAbnormalTest001
210  * @tc.desc: Get permission request toggle status that userId, permission is invalid.
211  * @tc.type: FUNC
212  * @tc.require: Issue Number
213  */
214 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusAbnormalTest001, TestSize.Level0)
215 {
216     LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusAbnormalTest001");
217 
218     int32_t userID = 100;
219     uint32_t status;
220 
221     // Permission name is invalid.
222     int32_t ret = AccessTokenKit::GetPermissionRequestToggleStatus("", status, userID);
223     EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
224 
225     // UserId is invalid.
226     userID = -1;
227     ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status, userID);
228     EXPECT_EQ(AccessTokenError::ERR_PARAM_INVALID, ret);
229 }
230 
231 /**
232  * @tc.name: GetPermissionRequestToggleStatusSpecTest001
233  * @tc.desc: GetPermissionRequestToggleStatus caller is a normal app, not a system app.
234  * @tc.type: FUNC
235  * @tc.require: Issue Number
236  */
237 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusSpecTest001, TestSize.Level0)
238 {
239     LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusSpecTest001");
240     std::vector<std::string> reqPerm;
241     reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
242     MockHapToken mock("GetPermissionRequestToggleStatusSpecTest001", reqPerm, false);
243 
244     uint32_t status;
245     int32_t ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
246         g_infoManagerTestNormalInfoParms.userID);
247     EXPECT_EQ(ERR_NOT_SYSTEM_APP, ret);
248 }
249 
250 /**
251  * @tc.name: GetPermissionRequestToggleStatusSpecTest002
252  * @tc.desc: GetPermissionRequestToggleStatus caller is a system app without permissions.
253  * @tc.type: FUNC
254  * @tc.require: Issue Number
255  */
256 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusSpecTest002, TestSize.Level0)
257 {
258     LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusSpecTest002");
259     std::vector<std::string> reqPerm;
260     MockHapToken mock("GetPermissionRequestToggleStatusSpecTest002", reqPerm, true);
261 
262     int32_t selfUid = getuid();
263     setuid(10001); // 10001: UID
264 
265     uint32_t getStatus;
266     int32_t ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", getStatus,
267         g_infoManagerTestSystemInfoParms.userID);
268     EXPECT_EQ(AccessTokenError::ERR_PERMISSION_DENIED, ret);
269 
270     // restore environment
271     setuid(selfUid);
272 }
273 
274 /**
275  * @tc.name: GetPermissionRequestToggleStatusSpecTest003
276  * @tc.desc: GetPermissionRequestToggleStatus caller is a system app with related permissions.
277  * @tc.type: FUNC
278  * @tc.require: Issue Number
279  */
280 HWTEST_F(PermissionRequestToggleStatusTest, GetPermissionRequestToggleStatusSpecTest003, TestSize.Level0)
281 {
282     LOGI(ATM_DOMAIN, ATM_TAG, "GetPermissionRequestToggleStatusSpecTest003");
283     std::vector<std::string> reqPerm;
284     reqPerm.emplace_back("ohos.permission.DISABLE_PERMISSION_DIALOG");
285     reqPerm.emplace_back("ohos.permission.GET_SENSITIVE_PERMISSIONS");
286     MockHapToken mock("GetPermissionRequestToggleStatusSpecTest003", reqPerm, true);
287 
288     // Set a closed status value.
289     uint32_t status = PermissionRequestToggleStatus::CLOSED;
290     int32_t ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
291         g_infoManagerTestSystemInfoParms.userID);
292     EXPECT_EQ(RET_SUCCESS, ret);
293 
294     // Get a closed status value.
295     uint32_t getStatus;
296     ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", getStatus,
297         g_infoManagerTestSystemInfoParms.userID);
298     EXPECT_EQ(RET_SUCCESS, ret);
299     EXPECT_EQ(PermissionRequestToggleStatus::CLOSED, getStatus);
300 
301     // Set a open status value.
302     status = PermissionRequestToggleStatus::OPEN;
303     ret = AccessTokenKit::SetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", status,
304         g_infoManagerTestSystemInfoParms.userID);
305     EXPECT_EQ(RET_SUCCESS, ret);
306 
307     // Get a open status value.
308     ret = AccessTokenKit::GetPermissionRequestToggleStatus("ohos.permission.MICROPHONE", getStatus,
309         g_infoManagerTestSystemInfoParms.userID);
310     EXPECT_EQ(RET_SUCCESS, ret);
311     EXPECT_EQ(PermissionRequestToggleStatus::OPEN, getStatus);
312 }
313 } // namespace AccessToken
314 } // namespace Security
315 } // namespace OHOS