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