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