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