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 #ifndef INTERFACES_ACCESSTOKEN_KITS_NAPI_REQUEST_PERMISSION_H 16 #define INTERFACES_ACCESSTOKEN_KITS_NAPI_REQUEST_PERMISSION_H 17 18 #ifdef EVENTHANDLER_ENABLE 19 #include "event_handler.h" 20 #include "event_queue.h" 21 #endif 22 #include "napi_context_common.h" 23 #include "permission_grant_info.h" 24 #include "token_callback_stub.h" 25 #include "ui_content.h" 26 #include "ui_extension_context.h" 27 28 namespace OHOS { 29 namespace Security { 30 namespace AccessToken { 31 static int32_t curRequestCode_ = 0; 32 struct RequestAsyncContext : public AtManagerAsyncWorkData { RequestAsyncContextRequestAsyncContext33 explicit RequestAsyncContext(napi_env env) : AtManagerAsyncWorkData(env) 34 { 35 this->env = env; 36 } 37 38 AccessTokenID tokenId = 0; 39 std::string bundleName = ""; 40 bool needDynamicRequest = true; 41 AtmResult result; 42 int32_t instanceId = -1; 43 std::vector<std::string> permissionList; 44 std::vector<int32_t> permissionsState; 45 napi_value requestResult = nullptr; 46 std::vector<int32_t> errorReasons; 47 std::vector<bool> dialogShownResults; 48 std::vector<int32_t> permissionQueryResults; 49 PermissionGrantInfo info; 50 std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext; 51 std::shared_ptr<AbilityRuntime::UIExtensionContext> uiExtensionContext; 52 bool uiAbilityFlag = false; 53 bool uiExtensionFlag = false; 54 bool uiContentFlag = false; 55 bool releaseFlag = false; 56 #ifdef EVENTHANDLER_ENABLE 57 std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr; 58 #endif 59 }; 60 61 struct RequestAsyncContextHandle { RequestAsyncContextHandleRequestAsyncContextHandle62 explicit RequestAsyncContextHandle(std::shared_ptr<RequestAsyncContext>& requestAsyncContext) 63 { 64 asyncContextPtr = requestAsyncContext; 65 } 66 67 std::shared_ptr<RequestAsyncContext> asyncContextPtr; 68 }; 69 70 class RequestAsyncInstanceControl { 71 public: 72 static void AddCallbackByInstanceId(std::shared_ptr<RequestAsyncContext>& asyncContext); 73 static void ExecCallback(int32_t id); 74 static void CheckDynamicRequest(std::shared_ptr<RequestAsyncContext>& asyncContext, bool& isDynamic); 75 private: 76 static std::map<int32_t, std::vector<std::shared_ptr<RequestAsyncContext>>> instanceIdMap_; 77 static std::mutex instanceIdMutex_; 78 }; 79 80 class UIExtensionCallback { 81 public: 82 explicit UIExtensionCallback(const std::shared_ptr<RequestAsyncContext>& reqContext); 83 ~UIExtensionCallback(); 84 void SetSessionId(int32_t sessionId); 85 void OnRelease(int32_t releaseCode); 86 void OnResult(int32_t resultCode, const OHOS::AAFwk::Want& result); 87 void OnReceive(const OHOS::AAFwk::WantParams& request); 88 void OnError(int32_t code, const std::string& name, const std::string& message); 89 void OnRemoteReady(const std::shared_ptr<OHOS::Ace::ModalUIExtensionProxy>& uiProxy); 90 void OnDestroy(); 91 void ReleaseHandler(int32_t code); 92 93 private: 94 int32_t sessionId_ = 0; 95 std::shared_ptr<RequestAsyncContext> reqContext_ = nullptr; 96 std::atomic<bool> isOnResult_; 97 }; 98 99 struct ResultCallback { 100 std::vector<std::string> permissions; 101 std::vector<int32_t> grantResults; 102 std::vector<int32_t> errorReasons; 103 std::vector<bool> dialogShownResults; 104 std::shared_ptr<RequestAsyncContext> data = nullptr; 105 }; 106 107 class AuthorizationResult : public Security::AccessToken::TokenCallbackStub { 108 public: AuthorizationResult(std::shared_ptr<RequestAsyncContext> & data)109 AuthorizationResult(std::shared_ptr<RequestAsyncContext>& data) : data_(data) {} 110 virtual ~AuthorizationResult() override = default; 111 112 virtual void GrantResultsCallback(const std::vector<std::string>& permissionList, 113 const std::vector<int>& grantResults) override; 114 virtual void WindowShownCallback() override; 115 116 private: 117 std::shared_ptr<RequestAsyncContext> data_ = nullptr; 118 }; 119 120 class NapiRequestPermission { 121 public: 122 static bool IsDynamicRequest(std::shared_ptr<RequestAsyncContext>& asyncContext); 123 static napi_value RequestPermissionsFromUser(napi_env env, napi_callback_info info); 124 static napi_value GetPermissionsStatus(napi_env env, napi_callback_info info); 125 126 private: 127 static bool ParseRequestPermissionFromUser(const napi_env& env, const napi_callback_info& cbInfo, 128 std::shared_ptr<RequestAsyncContext>& asyncContext); 129 static void RequestPermissionsFromUserExecute(napi_env env, void* data); 130 static void RequestPermissionsFromUserComplete(napi_env env, napi_status status, void* data); 131 static bool ParseInputToGetQueryResult(const napi_env& env, const napi_callback_info& info, 132 RequestAsyncContext& asyncContext); 133 static void GetPermissionsStatusExecute(napi_env env, void *data); 134 static void GetPermissionsStatusComplete(napi_env env, napi_status status, void *data); 135 }; 136 } // namespace AccessToken 137 } // namespace Security 138 } // namespace OHOS 139 #endif /* INTERFACES_ACCESSTOKEN_KITS_NAPI_REQUEST_PERMISSION_H */ 140