• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include <memory>
17 #include <map>
18 #include "app_domain_verify_manager_napi.h"
19 #include "app_domain_verify_hilog.h"
20 #include "app_domain_verify_mgr_client.h"
21 #include "js_common_defined.h"
22 #include "api_event_reporter.h"
23 
24 namespace OHOS::AppDomainVerify {
25 
GetString(napi_env env,napi_value value)26 static std::string GetString(napi_env env, napi_value value)
27 {
28     std::unique_ptr<char[]> valueBuf = std::make_unique<char[]>(STRING_BUF_MAX_SIZE);
29     size_t size = 0;
30     NAPI_CALL_BASE(env, napi_get_value_string_utf8(env, value, valueBuf.get(), STRING_BUF_MAX_SIZE, &size), "");
31     std::string result = std::string(valueBuf.get(), size);
32     return result;
33 }
BuildString(const napi_env & env,const std::string & data)34 static napi_value BuildString(const napi_env& env, const std::string& data)
35 {
36     napi_value result;
37     NAPI_CALL_BASE(env, napi_create_string_utf8(env, data.c_str(), NAPI_AUTO_LENGTH, &result), nullptr);
38     return result;
39 }
BuildStringArray(const napi_env & env,const std::vector<std::string> & data)40 static napi_value BuildStringArray(const napi_env& env, const std::vector<std::string>& data)
41 {
42     napi_value arr;
43     NAPI_CALL_BASE(env, napi_create_array(env, &arr), nullptr);
44     size_t index = 0;
45     for (auto&& str : data) {
46         napi_value value = BuildString(env, str);
47         NAPI_CALL_BASE(env, napi_set_element(env, arr, index++, value), nullptr);
48     }
49     return arr;
50 }
CheckInput(const std::string & input)51 static bool CheckInput(const std::string& input)
52 {
53     if (input.empty() || input.size() > MAX_STR_INPUT_SIZE) {
54         return false;
55     }
56     return true;
57 }
BuildError(const napi_env & env,ErrorCode errorCode)58 static napi_value BuildError(const napi_env& env, ErrorCode errorCode)
59 {
60     auto ret = napi_throw_error(env, std::to_string(errorCode).c_str(), ErrCodeMap[errorCode]);
61     if (ret != napi_status::napi_ok) {
62         APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "throw err failed.");
63     }
64     return nullptr;
65 }
QueryAssociatedDomains(napi_env env,napi_callback_info info)66 napi_value QueryAssociatedDomains(napi_env env, napi_callback_info info)
67 {
68     size_t argc = 1;
69     napi_value args[1] = { nullptr };
70 
71     Dfx::ApiEventReporter reporter("QueryAssociatedDomains");
72     NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr), nullptr);
73     std::string bundleName = GetString(env, args[0]);
74     if (!CheckInput(bundleName)) {
75         reporter.WriteEndEvent(Dfx::API_FAIL, ErrorCode::E_PARAM_ERROR);
76         return BuildError(env, ErrorCode::E_PARAM_ERROR);
77     }
78     std::vector<std::string> domains;
79     auto ret = AppDomainVerifyMgrClient::GetInstance()->QueryAssociatedDomains(bundleName, domains);
80     if (ret != 0) {
81         if (ErrCodeMap.count(static_cast<ErrorCode>(ret)) != 0) {
82             reporter.WriteEndEvent(Dfx::API_FAIL, static_cast<ErrorCode>(ret));
83             return BuildError(env, static_cast<ErrorCode>(ret));
84         } else {
85             APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "unknown error:%{public}d.", ret);
86             reporter.WriteEndEvent(Dfx::API_FAIL, ret);
87             return BuildStringArray(env, domains);
88         }
89     }
90     reporter.WriteEndEvent(Dfx::API_SUCCESS, ret);
91     return BuildStringArray(env, domains);
92 }
QueryAssociatedBundleNames(napi_env env,napi_callback_info info)93 napi_value QueryAssociatedBundleNames(napi_env env, napi_callback_info info)
94 {
95     size_t argc = 1;
96     napi_value args[1] = { nullptr };
97 
98     Dfx::ApiEventReporter reporter("QueryAssociatedBundleNames");
99     NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr), nullptr);
100     std::string domain = GetString(env, args[0]);
101     if (!CheckInput(domain)) {
102         reporter.WriteEndEvent(Dfx::API_FAIL, ErrorCode::E_PARAM_ERROR);
103         return BuildError(env, ErrorCode::E_PARAM_ERROR);
104     }
105     std::vector<std::string> bundleNames;
106     auto ret = AppDomainVerifyMgrClient::GetInstance()->QueryAssociatedBundleNames(domain, bundleNames);
107     if (ret != 0) {
108         if (ErrCodeMap.count(static_cast<ErrorCode>(ret)) != 0) {
109             reporter.WriteEndEvent(Dfx::API_FAIL, static_cast<ErrorCode>(ret));
110             return BuildError(env, static_cast<ErrorCode>(ret));
111         } else {
112             APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "unknown error:%{public}d.", ret);
113             reporter.WriteEndEvent(Dfx::API_FAIL, ret);
114             return BuildStringArray(env, bundleNames);
115         }
116     }
117     reporter.WriteEndEvent(Dfx::API_SUCCESS, ret);
118     return BuildStringArray(env, bundleNames);
119 }
120 }