• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #ifndef ACCESSTOKEN_KIT_H
17 #define ACCESSTOKEN_KIT_H
18 
19 #include <string>
20 
21 #include "gmock/gmock.h"
22 #include "parcel.h"
23 
24 namespace OHOS::Security::AccessToken {
25 typedef unsigned int AccessTokenID;
26 
27 typedef struct {
28     unsigned int tokenUniqueID : 20;
29     unsigned int res : 6;
30     unsigned int dlpFlag : 1;
31     unsigned int type : 2;
32     unsigned int version : 3;
33 } AccessTokenIDInner;
34 
35 typedef enum TypeATokenTypeEnum {
36     TOKEN_INVALID = -1,
37     TOKEN_HAP = 0,
38     TOKEN_NATIVE,
39     TOKEN_SHELL,
40     TOKEN_TYPE_BUTT,
41 } ATokenTypeEnum;
42 
43 typedef enum TypePermissionState {
44     PERMISSION_DENIED = -1,
45     PERMISSION_GRANTED = 0,
46 } PermissionState;
47 
48 struct NativeTokenInfoParcel final : public Parcelable {
49     NativeTokenInfoParcel() = default;
50 
51     ~NativeTokenInfoParcel() override = default;
52 
Marshallingfinal53     bool Marshalling(Parcel &out) const override { return true; };
54 
Unmarshallingfinal55     static NativeTokenInfoParcel *Unmarshalling(Parcel &in) { return {}; };
56 };
57 
58 struct HapTokenInfoParcel final : public Parcelable {
59     HapTokenInfoParcel() = default;
60 
61     ~HapTokenInfoParcel() override = default;
62 
Marshallingfinal63     bool Marshalling(Parcel &out) const override { return true; };
64 
Unmarshallingfinal65     static HapTokenInfoParcel *Unmarshalling(Parcel &in) { return {}; };
66 };
67 
68 class HapTokenInfo final {
69 public:
70     std::string bundleName;
71     std::string appID;
72 };
73 
74 class NativeTokenInfo final {
75 public:
76     std::string processName;
77 };
78 
79 class TokenIdKitInterface {
80 public:
81     virtual ~TokenIdKitInterface() = default;
82     virtual bool IsSystemAppByFullTokenID(uint64_t tokenId) = 0;
83 };
84 
85 class MockTokenIdKitInterface : public TokenIdKitInterface {
86 public:
87     MockTokenIdKitInterface() = default;
88     ~MockTokenIdKitInterface() override = default;
89     MOCK_METHOD1(IsSystemAppByFullTokenID, bool(uint64_t tokenId));
90 };
91 
92 class AccessTokenKitInterface : public RefBase {
93 public:
94     virtual ~AccessTokenKitInterface() = default;
95     virtual int32_t VerifyAccessToken(AccessToken::AccessTokenID callerToken, const std::string &permission) = 0;
96     virtual ATokenTypeEnum GetTokenType(AccessTokenID tokenID) = 0;
97     virtual int GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes) = 0;
98     virtual int GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes) = 0;
99 };
100 
101 class MockAccessTokenKitInterface : public AccessTokenKitInterface {
102 public:
103     MockAccessTokenKitInterface() = default;
104     ~MockAccessTokenKitInterface() override = default;
105     MOCK_METHOD(int32_t, VerifyAccessToken, (AccessToken::AccessTokenID callerToken, const std::string &permission));
106     MOCK_METHOD(ATokenTypeEnum, GetTokenType, (AccessTokenID tokenID));
107     MOCK_METHOD(int, GetHapTokenInfo, (AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes));
108 
109     MOCK_METHOD(int, GetNativeTokenInfo, (AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes));
110 };
111 
112 class AccessTokenKit {
113 public:
114     static sptr<MockAccessTokenKitInterface> mockKitIntfObj;
VerifyAccessToken(AccessToken::AccessTokenID callerToken,const std::string & permission)115     static int32_t VerifyAccessToken(AccessToken::AccessTokenID callerToken, const std::string &permission)
116     {
117         return mockKitIntfObj->VerifyAccessToken(callerToken, permission);
118     }
119 
GetTokenType(AccessTokenID tokenID)120     static ATokenTypeEnum GetTokenType(AccessTokenID tokenID)
121     {
122         return mockKitIntfObj->GetTokenType(tokenID);
123     }
124 
GetHapTokenInfo(AccessTokenID tokenID,HapTokenInfo & hapTokenInfoRes)125     static int GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes)
126     {
127         AccessTokenIDInner idInner = *(reinterpret_cast<AccessTokenIDInner *>(&tokenID));
128         if (idInner.tokenUniqueID == 1) {
129             std::string tmp (4097, 's'); // 4097 is The max length of caInfo->certs
130             hapTokenInfoRes.appID = tmp;
131         } else if (idInner.tokenUniqueID == 2) { // 2 is flag for cover branchs
132             hapTokenInfoRes.appID = "Authentication_Test";
133         } else {
134             hapTokenInfoRes.appID = "";
135         }
136         return mockKitIntfObj->GetHapTokenInfo(tokenID, hapTokenInfoRes);
137     }
138 
GetNativeTokenInfo(AccessTokenID tokenID,NativeTokenInfo & nativeTokenInfoRes)139     static int GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes)
140     {
141         AccessTokenIDInner idInner = *(reinterpret_cast<AccessTokenIDInner *>(&tokenID));
142         if (idInner.tokenUniqueID == 1) {
143             std::string tmp (4097, 's'); // 4097 is The max length of caInfo->certs
144             nativeTokenInfoRes.processName = tmp;
145         } else if (idInner.tokenUniqueID == 2) { // 2 is flag for cover branchs
146             nativeTokenInfoRes.processName = "AuthenticationTest";
147         } else {
148             nativeTokenInfoRes.processName = "";
149         }
150         return mockKitIntfObj->GetNativeTokenInfo(tokenID, nativeTokenInfoRes);
151     }
152 
GetTokenTypeFlag(AccessTokenID tokenID)153     static ATokenTypeEnum GetTokenTypeFlag(AccessTokenID tokenID)
154     {
155         AccessTokenIDInner *idInner = reinterpret_cast<AccessTokenIDInner *>(&tokenID);
156         return static_cast<ATokenTypeEnum>(idInner->type);
157     }
158 };
159 }  // OHOS::Security::AccessToken
160 
161 #endif  // ACCESSTOKEN_KIT_H