16ea96550Sopenharmony_ci/*
26ea96550Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
36ea96550Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46ea96550Sopenharmony_ci * you may not use this file except in compliance with the License.
56ea96550Sopenharmony_ci * You may obtain a copy of the License at
66ea96550Sopenharmony_ci *
76ea96550Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86ea96550Sopenharmony_ci *
96ea96550Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106ea96550Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116ea96550Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126ea96550Sopenharmony_ci * See the License for the specific language governing permissions and
136ea96550Sopenharmony_ci * limitations under the License.
146ea96550Sopenharmony_ci */
156ea96550Sopenharmony_ci
166ea96550Sopenharmony_ci#ifndef ACCESSTOKEN_KIT_H
176ea96550Sopenharmony_ci#define ACCESSTOKEN_KIT_H
186ea96550Sopenharmony_ci
196ea96550Sopenharmony_ci#include <string>
206ea96550Sopenharmony_ci
216ea96550Sopenharmony_ci#include "gmock/gmock.h"
226ea96550Sopenharmony_ci#include "parcel.h"
236ea96550Sopenharmony_ci
246ea96550Sopenharmony_cinamespace OHOS::Security::AccessToken {
256ea96550Sopenharmony_citypedef unsigned int AccessTokenID;
266ea96550Sopenharmony_ci
276ea96550Sopenharmony_citypedef enum TypeATokenTypeEnum {
286ea96550Sopenharmony_ci    TOKEN_INVALID = -1,
296ea96550Sopenharmony_ci    TOKEN_HAP = 0,
306ea96550Sopenharmony_ci    TOKEN_NATIVE,
316ea96550Sopenharmony_ci    TOKEN_SHELL,
326ea96550Sopenharmony_ci    TOKEN_TYPE_BUTT,
336ea96550Sopenharmony_ci} ATokenTypeEnum;
346ea96550Sopenharmony_ci
356ea96550Sopenharmony_citypedef enum TypePermissionState {
366ea96550Sopenharmony_ci    PERMISSION_DENIED = -1,
376ea96550Sopenharmony_ci    PERMISSION_GRANTED = 0,
386ea96550Sopenharmony_ci} PermissionState;
396ea96550Sopenharmony_ci
406ea96550Sopenharmony_cistruct NativeTokenInfoParcel final : public Parcelable {
416ea96550Sopenharmony_ci    NativeTokenInfoParcel() = default;
426ea96550Sopenharmony_ci
436ea96550Sopenharmony_ci    ~NativeTokenInfoParcel() override = default;
446ea96550Sopenharmony_ci
456ea96550Sopenharmony_ci    bool Marshalling(Parcel &out) const override { return true; };
466ea96550Sopenharmony_ci
476ea96550Sopenharmony_ci    static NativeTokenInfoParcel *Unmarshalling(Parcel &in) { return {}; };
486ea96550Sopenharmony_ci};
496ea96550Sopenharmony_ci
506ea96550Sopenharmony_cistruct HapTokenInfoParcel final : public Parcelable {
516ea96550Sopenharmony_ci    HapTokenInfoParcel() = default;
526ea96550Sopenharmony_ci
536ea96550Sopenharmony_ci    ~HapTokenInfoParcel() override = default;
546ea96550Sopenharmony_ci
556ea96550Sopenharmony_ci    bool Marshalling(Parcel &out) const override { return true; };
566ea96550Sopenharmony_ci
576ea96550Sopenharmony_ci    static HapTokenInfoParcel *Unmarshalling(Parcel &in) { return {}; };
586ea96550Sopenharmony_ci};
596ea96550Sopenharmony_ci
606ea96550Sopenharmony_ciclass HapTokenInfo final {
616ea96550Sopenharmony_cipublic:
626ea96550Sopenharmony_ci    std::string bundleName;
636ea96550Sopenharmony_ci};
646ea96550Sopenharmony_ci
656ea96550Sopenharmony_ciclass NativeTokenInfo final {
666ea96550Sopenharmony_cipublic:
676ea96550Sopenharmony_ci    std::string processName;
686ea96550Sopenharmony_ci};
696ea96550Sopenharmony_ci
706ea96550Sopenharmony_ciclass TokenIdKitInterface {
716ea96550Sopenharmony_cipublic:
726ea96550Sopenharmony_ci    virtual ~TokenIdKitInterface() = default;
736ea96550Sopenharmony_ci    virtual bool IsSystemAppByFullTokenID(uint64_t tokenId) = 0;
746ea96550Sopenharmony_ci};
756ea96550Sopenharmony_ci
766ea96550Sopenharmony_ciclass MockTokenIdKitInterface : public TokenIdKitInterface {
776ea96550Sopenharmony_cipublic:
786ea96550Sopenharmony_ci    MockTokenIdKitInterface() = default;
796ea96550Sopenharmony_ci    ~MockTokenIdKitInterface() override = default;
806ea96550Sopenharmony_ci    MOCK_METHOD1(IsSystemAppByFullTokenID, bool(uint64_t tokenId));
816ea96550Sopenharmony_ci};
826ea96550Sopenharmony_ci
836ea96550Sopenharmony_ciclass TokenIdKit {
846ea96550Sopenharmony_cipublic:
856ea96550Sopenharmony_ci    static bool IsSystemAppByFullTokenID(uint64_t tokenId)
866ea96550Sopenharmony_ci    {
876ea96550Sopenharmony_ci        if (instance_ == nullptr) {
886ea96550Sopenharmony_ci            return false;
896ea96550Sopenharmony_ci        }
906ea96550Sopenharmony_ci        return instance_->IsSystemAppByFullTokenID(tokenId);
916ea96550Sopenharmony_ci    }
926ea96550Sopenharmony_ci
936ea96550Sopenharmony_ci    static std::shared_ptr<MockTokenIdKitInterface> GetInterface()
946ea96550Sopenharmony_ci    {
956ea96550Sopenharmony_ci        if (instance_ == nullptr) {
966ea96550Sopenharmony_ci            std::lock_guard<std::mutex> lock(mutex_);
976ea96550Sopenharmony_ci            if (instance_ == nullptr) {
986ea96550Sopenharmony_ci                instance_ = std::make_shared<MockTokenIdKitInterface>();
996ea96550Sopenharmony_ci            }
1006ea96550Sopenharmony_ci        }
1016ea96550Sopenharmony_ci        return instance_;
1026ea96550Sopenharmony_ci    };
1036ea96550Sopenharmony_ci
1046ea96550Sopenharmony_ci    static void DelInterface()
1056ea96550Sopenharmony_ci    {
1066ea96550Sopenharmony_ci        if (instance_ != nullptr) {
1076ea96550Sopenharmony_ci            instance_.reset();
1086ea96550Sopenharmony_ci        }
1096ea96550Sopenharmony_ci    };
1106ea96550Sopenharmony_ci
1116ea96550Sopenharmony_ciprivate:
1126ea96550Sopenharmony_ci    static std::shared_ptr<MockTokenIdKitInterface> instance_;
1136ea96550Sopenharmony_ci    static std::mutex mutex_;
1146ea96550Sopenharmony_ci};
1156ea96550Sopenharmony_ci
1166ea96550Sopenharmony_ciclass AccessTokenKitInterface {
1176ea96550Sopenharmony_cipublic:
1186ea96550Sopenharmony_ci    virtual ~AccessTokenKitInterface() = default;
1196ea96550Sopenharmony_ci    virtual int32_t VerifyAccessToken(AccessToken::AccessTokenID callerToken, const std::string &permission) = 0;
1206ea96550Sopenharmony_ci    virtual ATokenTypeEnum GetTokenType(AccessTokenID tokenID) = 0;
1216ea96550Sopenharmony_ci    virtual int GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes) = 0;
1226ea96550Sopenharmony_ci    virtual int GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes) = 0;
1236ea96550Sopenharmony_ci};
1246ea96550Sopenharmony_ci
1256ea96550Sopenharmony_ciclass MockAccessTokenKitInterface : public AccessTokenKitInterface {
1266ea96550Sopenharmony_cipublic:
1276ea96550Sopenharmony_ci    MockAccessTokenKitInterface() = default;
1286ea96550Sopenharmony_ci    ~MockAccessTokenKitInterface() override = default;
1296ea96550Sopenharmony_ci    MOCK_METHOD2(VerifyAccessToken, int32_t(AccessToken::AccessTokenID callerToken, const std::string &permission));
1306ea96550Sopenharmony_ci    MOCK_METHOD1(GetTokenType, ATokenTypeEnum(AccessTokenID tokenID));
1316ea96550Sopenharmony_ci    MOCK_METHOD2(GetHapTokenInfo, int(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes));
1326ea96550Sopenharmony_ci    MOCK_METHOD2(GetNativeTokenInfo, int(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes));
1336ea96550Sopenharmony_ci};
1346ea96550Sopenharmony_ci
1356ea96550Sopenharmony_ciclass AccessTokenKit {
1366ea96550Sopenharmony_cipublic:
1376ea96550Sopenharmony_ci    static int32_t VerifyAccessToken(AccessToken::AccessTokenID callerToken, const std::string &permission)
1386ea96550Sopenharmony_ci    {
1396ea96550Sopenharmony_ci        if (instance_ == nullptr) {
1406ea96550Sopenharmony_ci            return -1;
1416ea96550Sopenharmony_ci        }
1426ea96550Sopenharmony_ci        return instance_->VerifyAccessToken(callerToken, permission);
1436ea96550Sopenharmony_ci    }
1446ea96550Sopenharmony_ci
1456ea96550Sopenharmony_ci    static ATokenTypeEnum GetTokenType(AccessTokenID tokenID)
1466ea96550Sopenharmony_ci    {
1476ea96550Sopenharmony_ci        if (instance_ == nullptr) {
1486ea96550Sopenharmony_ci            return TOKEN_INVALID;
1496ea96550Sopenharmony_ci        }
1506ea96550Sopenharmony_ci        return instance_->GetTokenType(tokenID);
1516ea96550Sopenharmony_ci    }
1526ea96550Sopenharmony_ci
1536ea96550Sopenharmony_ci    static int GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes)
1546ea96550Sopenharmony_ci    {
1556ea96550Sopenharmony_ci        if (instance_ == nullptr) {
1566ea96550Sopenharmony_ci            return -1;
1576ea96550Sopenharmony_ci        }
1586ea96550Sopenharmony_ci        return instance_->GetHapTokenInfo(tokenID, hapTokenInfoRes);
1596ea96550Sopenharmony_ci    }
1606ea96550Sopenharmony_ci
1616ea96550Sopenharmony_ci    static int GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes)
1626ea96550Sopenharmony_ci    {
1636ea96550Sopenharmony_ci        if (instance_ == nullptr) {
1646ea96550Sopenharmony_ci            return -1;
1656ea96550Sopenharmony_ci        }
1666ea96550Sopenharmony_ci        return instance_->GetNativeTokenInfo(tokenID, nativeTokenInfoRes);
1676ea96550Sopenharmony_ci    }
1686ea96550Sopenharmony_ci
1696ea96550Sopenharmony_ci    static std::shared_ptr<MockAccessTokenKitInterface> GetInterface()
1706ea96550Sopenharmony_ci    {
1716ea96550Sopenharmony_ci        if (instance_ == nullptr) {
1726ea96550Sopenharmony_ci            std::lock_guard<std::mutex> lock(mutex_);
1736ea96550Sopenharmony_ci            if (instance_ == nullptr) {
1746ea96550Sopenharmony_ci                instance_ = std::make_shared<MockAccessTokenKitInterface>();
1756ea96550Sopenharmony_ci            }
1766ea96550Sopenharmony_ci        }
1776ea96550Sopenharmony_ci        return instance_;
1786ea96550Sopenharmony_ci    };
1796ea96550Sopenharmony_ci
1806ea96550Sopenharmony_ci    static void DelInterface()
1816ea96550Sopenharmony_ci    {
1826ea96550Sopenharmony_ci        if (instance_ != nullptr) {
1836ea96550Sopenharmony_ci            instance_.reset();
1846ea96550Sopenharmony_ci        }
1856ea96550Sopenharmony_ci    };
1866ea96550Sopenharmony_ci
1876ea96550Sopenharmony_ciprivate:
1886ea96550Sopenharmony_ci    static std::shared_ptr<MockAccessTokenKitInterface> instance_;
1896ea96550Sopenharmony_ci    static std::mutex mutex_;
1906ea96550Sopenharmony_ci};
1916ea96550Sopenharmony_ci}  // OHOS::Security::AccessToken
1926ea96550Sopenharmony_ci
1936ea96550Sopenharmony_ci#endif  // ACCESSTOKEN_KIT_H