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