• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 
16 #ifndef OHOS_ABILITY_RUNTIME_URI_PERMISSION_MANAGER_STUB_IMPL_H
17 #define OHOS_ABILITY_RUNTIME_URI_PERMISSION_MANAGER_STUB_IMPL_H
18 
19 #include <functional>
20 #include <map>
21 
22 #include "app_mgr_interface.h"
23 #include "bundlemgr/bundle_mgr_interface.h"
24 #include "istorage_manager.h"
25 #include "uri.h"
26 #include "uri_permission_manager_stub.h"
27 #include "uri_permission_rdb.h"
28 
29 namespace OHOS::AAFwk {
30 namespace {
31 using ClearProxyCallback = std::function<void(const wptr<IRemoteObject>&)>;
32 using TokenId = Security::AccessToken::AccessTokenID;
33 }
34 
35 struct GrantInfo {
36     unsigned int flag;
37     const uint32_t fromTokenId;
38     const uint32_t targetTokenId;
39     int autoremove;
40 };
41 class UriPermissionManagerStubImpl : public UriPermissionManagerStub,
42                                      public std::enable_shared_from_this<UriPermissionManagerStubImpl> {
43 public:
44     UriPermissionManagerStubImpl() = default;
45     virtual ~UriPermissionManagerStubImpl() = default;
46     void Init();
47 
48     int GrantUriPermission(const Uri &uri, unsigned int flag,
49         const std::string targetBundleName, int autoremove, int32_t appIndex = 0) override;
50     void RevokeUriPermission(const TokenId tokenId) override;
51     int RevokeAllUriPermissions(uint32_t tokenId) override;
52     int RevokeUriPermissionManually(const Uri &uri, const std::string bundleName) override;
53 
54     bool CheckPersistableUriPermissionProxy(const Uri &uri, uint32_t flag, uint32_t tokenId) override;
55     bool VerifyUriPermission(const Uri &uri, uint32_t flag, uint32_t tokenId) override;
56 
57     uint32_t GetTokenIdByBundleName(const std::string bundleName, int32_t appIndex);
58 
59 private:
60     template<typename T>
61     void ConnectManager(sptr<T> &mgr, int32_t serviceId);
62     int32_t GetCurrentAccountId() const;
63     int GrantUriPermissionImpl(const Uri &uri, unsigned int flag,
64         TokenId fromTokenId, TokenId targetTokenId, int autoremove);
65     int GetUriPermissionFlag(const Uri &uri, unsigned int flag, uint32_t fromTokenId,
66         uint32_t targetTokenId, unsigned int &newFlag);
67     int AddTempUriPermission(const std::string &uri, unsigned int flag, TokenId fromTokenId,
68         TokenId targetTokenId, int autoremove);
69     int DeletTempUriPermission(const std::string &uri, uint32_t flag, uint32_t targetTokenId);
70     int DeletTempUriPermissionAndShareFile(const std::string &uri, uint32_t targetTokenId);
71 
72     void InitPersistableUriPermissionConfig();
73 
74     class ProxyDeathRecipient : public IRemoteObject::DeathRecipient {
75     public:
ProxyDeathRecipient(ClearProxyCallback && proxy)76         explicit ProxyDeathRecipient(ClearProxyCallback&& proxy) : proxy_(proxy) {}
77         ~ProxyDeathRecipient() = default;
78         virtual void OnRemoteDied([[maybe_unused]] const wptr<IRemoteObject>& remote) override;
79 
80     private:
81         ClearProxyCallback proxy_;
82     };
83 
84 private:
85     std::map<std::string, std::list<GrantInfo>> uriMap_;
86     std::mutex mutex_;
87     std::mutex mgrMutex_;
88     sptr<AppExecFwk::IAppMgr> appMgr_ = nullptr;
89     sptr<AppExecFwk::IBundleMgr> bundleManager_ = nullptr;
90     sptr<StorageManager::IStorageManager> storageManager_ = nullptr;
91     std::shared_ptr<UriPermissionRdb> uriPermissionRdb_;
92     bool isGrantPersistableUriPermissionEnable_ = false;
93 };
94 }  // namespace OHOS::AAFwk
95 #endif  // OHOS_ABILITY_RUNTIME_URI_PERMISSION_MANAGER_STUB_IMPL_H
96