1 /*
2  * Copyright (c) 2023-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 <unordered_map>
17 #include "dlp_permission.h"
18 #include "napi_error_msg.h"
19 
20 namespace OHOS {
21 namespace Security {
22 namespace DlpPermission {
23 static const std::unordered_map<int32_t, std::string> JS_ERROR_MSG_MAP = {
24     //  error + message
25     { ERR_JS_SUCCESS, "success" },
26     { ERR_JS_PERMISSION_DENIED, "Permission denied" },
27     { ERR_JS_NOT_SYSTEM_APP, "No permission to invoke this api, it is for system app" },
28     { ERR_JS_PARAMETER_ERROR, "Parameter type error, please check parameter type" },
29     { ERR_JS_CAPABILITY_NOT_SUPPORTED, "Capability is not supported" },
30     { ERR_JS_INVALID_PARAMETER, "Parameter invalid, please check parameter range" },
31     { ERR_JS_BEGIN_CREDENTIAL_FAIL,
32       "Credential encryption or decryption busy, please wait for a moment and try again" },
33     { ERR_JS_CREDENTIAL_TIMEOUT,
34       "Credential encryption or decryption timeout, please wait for a moment and try again" },
35     { ERR_JS_CREDENTIAL_SERVICE_ERROR, "Credential service error, please check the service and try again" },
36     { ERR_JS_CREDENTIAL_SERVER_ERROR, "Credential authentication server error." },
37     { ERR_JS_API_ONLY_FOR_SANDBOX_ERROR,
38       "No permission to call this API, which is available only for DLP sandbox applications." },
39     { ERR_JS_API_NOT_FOR_SANDBOX_ERROR,
40       "No permission to call this API, which is available only for non-DLP sandbox applications." },
41     { ERR_JS_NOT_DLP_FILE, "The file is not a DLP file." },
42     { ERR_JS_OPERATE_DLP_FILE_FAIL, "Failed to operate the DLP file." },
43     { ERR_JS_DLP_FILE_READ_ONLY, "The DLP file is read only." },
44     { ERR_JS_SYSTEM_SERVICE_EXCEPTION, "The system ability works abnormally." },
45     { ERR_JS_OUT_OF_MEMORY, "System out of memory, please try again or reboot your device" },
46     { ERR_JS_SYSTEM_NEED_TO_BE_UPGRADED, "Upgrade required." },
47     { ERR_JS_APPLICATION_NOT_AUTHORIZED, "Not authorized application" },
48     { ERR_JS_DLP_FILE_EXPIRE_TIME, "DLP file is expiry, please contact the owner" },
49     { ERR_JS_DLP_CREDENTIAL_NO_INTERNET_ERROR, "DLP credential need internet, please check your connection" },
50     { ERR_JS_URI_NOT_EXIST, "uri missing in want." },
51     { ERR_JS_PARAM_DISPLAY_NAME_NOT_EXIST, "displayName missing in want." },
52 };
53 
54 static const std::unordered_map<int32_t, int32_t> NATIVE_CODE_TO_JS_CODE_MAP = {
55     { DLP_OK, ERR_JS_SUCCESS },
56     { DLP_KV_GET_DATA_NOT_FOUND, ERR_JS_SUCCESS },
57 
58     // ERR_JS_PERMISSION_DENIED
59     { DLP_SERVICE_ERROR_PERMISSION_DENY, ERR_JS_PERMISSION_DENIED },
60     { DLP_SERVICE_ERROR_NOT_SYSTEM_APP, ERR_JS_NOT_SYSTEM_APP },
61 
62     // ERR_JS_INVALID_PARAMETER
63     { DLP_SERVICE_ERROR_VALUE_INVALID, ERR_JS_INVALID_PARAMETER },
64     { DLP_PARSE_ERROR_VALUE_INVALID, ERR_JS_INVALID_PARAMETER },
65     { DLP_PARSE_ERROR_DIGEST_INVALID, ERR_JS_INVALID_PARAMETER },
66     { DLP_PARSE_ERROR_FD_ERROR, ERR_JS_INVALID_PARAMETER },
67     { DLP_PARSE_ERROR_PTR_NULL, ERR_JS_INVALID_PARAMETER },
68     { DLP_PARSE_ERROR_CIPHER_PARAMS_INVALID, ERR_JS_INVALID_PARAMETER },
69     { DLP_PARSE_ERROR_ACCOUNT_INVALID, ERR_JS_INVALID_PARAMETER },
70     { DLP_FUSE_ERROR_VALUE_INVALID, ERR_JS_INVALID_PARAMETER },
71     { DLP_FUSE_ERROR_DLP_FILE_NULL, ERR_JS_INVALID_PARAMETER },
72     { DLP_KV_DATE_INFO_EMPTY_ERROR, ERR_JS_INVALID_PARAMETER },
73     { DLP_RETENTION_ERROR_VALUE_INVALID, ERR_JS_INVALID_PARAMETER },
74 
75     // ERR_JS_BEGIN_CREDENTIAL_FAIL
76     { DLP_SERVICE_ERROR_CREDENTIAL_BUSY, ERR_JS_BEGIN_CREDENTIAL_FAIL },
77     { DLP_SERVICE_ERROR_CREDENTIAL_TASK_DUPLICATE, ERR_JS_BEGIN_CREDENTIAL_FAIL },
78 
79     // ERR_JS_CREDENTIAL_TIMEOUT
80     { DLP_SERVICE_ERROR_CREDENTIAL_TASK_TIMEOUT, ERR_JS_CREDENTIAL_TIMEOUT },
81     { DLP_CREDENTIAL_ERROR_SERVER_TIME_OUT_ERROR, ERR_JS_CREDENTIAL_TIMEOUT },
82 
83     // ERR_JS_CREDENTIAL_SERVICE_ERROR
84     { DLP_CREDENTIAL_ERROR_COMMON_ERROR, ERR_JS_CREDENTIAL_SERVICE_ERROR },
85     { DLP_CREDENTIAL_ERROR_HUKS_ERROR, ERR_JS_CREDENTIAL_SERVICE_ERROR },
86     { DLP_CREDENTIAL_ERROR_IPC_ERROR, ERR_JS_CREDENTIAL_SERVICE_ERROR },
87 
88     // ERR_JS_CREDENTIAL_SERVER_ERROR
89     { DLP_CREDENTIAL_ERROR_SERVER_ERROR, ERR_JS_CREDENTIAL_SERVER_ERROR },
90 
91     // ERR_JS_ACCOUNT_NOT_LOGIN
92     { DLP_CREDENTIAL_ERROR_NO_ACCOUNT_ERROR, ERR_JS_ACCOUNT_NOT_LOGIN },
93 
94     // ERR_JS_USER_NO_PERMISSION
95     { DLP_CREDENTIAL_ERROR_NO_PERMISSION_ERROR, ERR_JS_USER_NO_PERMISSION },
96 
97     // ERR_JS_API_ONLY_FOR_SANDBOX_ERROR
98     { DLP_NAPI_ERROR_API_ONLY_FOR_SANDBOX_ERROR, ERR_JS_API_ONLY_FOR_SANDBOX_ERROR },
99     { DLP_SERVICE_ERROR_API_ONLY_FOR_SANDBOX_ERROR, ERR_JS_API_ONLY_FOR_SANDBOX_ERROR },
100 
101     // ERR_JS_API_NOT_FOR_SANDBOX_ERROR
102     { DLP_NAPI_ERROR_API_NOT_FOR_SANDBOX_ERROR, ERR_JS_API_NOT_FOR_SANDBOX_ERROR },
103     { DLP_SERVICE_ERROR_API_NOT_FOR_SANDBOX_ERROR, ERR_JS_API_NOT_FOR_SANDBOX_ERROR },
104 
105     // ERR_JS_NOT_DLP_FILE
106     { DLP_PARSE_ERROR_FILE_NOT_DLP, ERR_JS_NOT_DLP_FILE },
107     { DLP_PARSE_ERROR_FILE_FORMAT_ERROR, ERR_JS_NOT_DLP_FILE },
108     { DLP_PARSE_ERROR_FILE_VERIFICATION_FAIL, ERR_JS_NOT_DLP_FILE },
109 
110     // ERR_JS_OPERATE_DLP_FILE_FAIL
111     { DLP_SERVICE_ERROR_INSTALL_SANDBOX_FAIL, ERR_JS_OPERATE_DLP_FILE_FAIL },
112     { DLP_PARSE_ERROR_TOO_MANY_OPEN_DLP_FILE, ERR_JS_OPERATE_DLP_FILE_FAIL },
113     { DLP_FUSE_ERROR_LINKFILE_EXIST, ERR_JS_OPERATE_DLP_FILE_FAIL },
114     { DLP_SERVICE_ERROR_UNINSTALL_SANDBOX_FAIL, ERR_JS_OPERATE_DLP_FILE_FAIL },
115     { DLP_PARSE_ERROR_FILE_OPERATE_FAIL, ERR_JS_OPERATE_DLP_FILE_FAIL },
116     { DLP_PARSE_ERROR_FILE_LINKING, ERR_JS_OPERATE_DLP_FILE_FAIL },
117     { DLP_PARSE_ERROR_FILE_ALREADY_OPENED, ERR_JS_OPERATE_DLP_FILE_FAIL },
118     { DLP_PARSE_ERROR_FILE_NOT_OPENED, ERR_JS_OPERATE_DLP_FILE_FAIL },
119     { DLP_FUSE_ERROR_LINKFILE_NOT_EXIST, ERR_JS_OPERATE_DLP_FILE_FAIL },
120     { DLP_FUSE_ERROR_TOO_MANY_LINK_FILE, ERR_JS_OPERATE_DLP_FILE_FAIL },
121     { DLP_LINK_FILE_NOT_ALLOW_OPERATE, ERR_JS_OPERATE_DLP_FILE_FAIL },
122 
123     // ERR_JS_DLP_FILE_READ_ONLY
124     { DLP_PARSE_ERROR_FILE_READ_ONLY, ERR_JS_DLP_FILE_READ_ONLY },
125 
126     // ERR_JS_SYSTEM_SERVICE_EXCEPTION
127     { DLP_NAPI_ERROR_NATIVE_BINDING_FAIL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
128     { DLP_SERVICE_ERROR_PARCEL_OPERATE_FAIL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
129     { DLP_SERVICE_ERROR_JSON_OPERATE_FAIL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
130     { DLP_SERVICE_ERROR_IPC_REQUEST_FAIL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
131     { DLP_SERVICE_ERROR_APPOBSERVER_NULL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
132     { DLP_SERVICE_ERROR_APPOBSERVER_ERROR, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
133     { DLP_SERVICE_ERROR_SERVICE_NOT_EXIST, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
134     { DLP_SERVICE_ERROR_GET_ACCOUNT_FAIL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
135     { DLP_PARSE_ERROR_CRYPT_FAIL, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
136     { DLP_PARSE_ERROR_CRYPTO_ENGINE_ERROR, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
137     { DLP_PARSE_ERROR_OPERATION_UNSUPPORTED, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
138     { DLP_QUERY_DISTRIBUTE_DATA_ERROR, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
139     { DLP_COMMON_CHECK_KVSTORE_ERROR, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
140     { DLP_COMMON_DELETE_KEY_FROM_KVSTORE_ERROR, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
141     { DLP_CREDENTIAL_ERROR_VALUE_INVALID, ERR_JS_SYSTEM_SERVICE_EXCEPTION },
142 
143     // ERR_JS_OUT_OF_MEMORY
144     { DLP_SERVICE_ERROR_MEMORY_OPERATE_FAIL, ERR_JS_OUT_OF_MEMORY },
145     { DLP_PARSE_ERROR_MEMORY_OPERATE_FAIL, ERR_JS_OUT_OF_MEMORY },
146     { DLP_FUSE_ERROR_MEMORY_OPERATE_FAIL, ERR_JS_OUT_OF_MEMORY },
147 
148     // ERR_JS_SYSTEM_NEED_TO_BE_UPGRADED
149     { DLP_PARSE_ERROR_FILE_VERSION_BIGGER_THAN_CURRENT, ERR_JS_SYSTEM_NEED_TO_BE_UPGRADED },
150 
151     // ERR_JS_APPLICATION_NOT_AUTHORIZED
152     { DLP_CREDENTIAL_ERROR_APPID_NOT_AUTHORIZED, ERR_JS_APPLICATION_NOT_AUTHORIZED},
153 
154     // ERR_JS_DLP_FILE_EXPIRE_TIME
155     { DLP_CREDENTIAL_ERROR_TIME_EXPIRED, ERR_JS_DLP_FILE_EXPIRE_TIME },
156 
157     // ERR_JS_DLP_CREDENTIAL_NO_INTERNET_ERROR
158     { DLP_CREDENTIAL_ERROR_NO_INTERNET, ERR_JS_DLP_CREDENTIAL_NO_INTERNET_ERROR },
159 };
160 
GetJsErrMsg(int32_t jsErrCode)161 std::string GetJsErrMsg(int32_t jsErrCode)
162 {
163     auto iter = JS_ERROR_MSG_MAP.find(jsErrCode);
164     if (iter != JS_ERROR_MSG_MAP.end()) {
165         return iter->second;
166     }
167     std::string msg = "unkown error, please reboot your device and try again, error=" + std::to_string(jsErrCode);
168     return msg;
169 }
170 
NativeCodeToJsCode(int32_t nativeErrCode)171 int32_t NativeCodeToJsCode(int32_t nativeErrCode)
172 {
173     auto iter = NATIVE_CODE_TO_JS_CODE_MAP.find(nativeErrCode);
174     if (iter != NATIVE_CODE_TO_JS_CODE_MAP.end()) {
175         return iter->second;
176     }
177     return ERR_JS_SYSTEM_SERVICE_EXCEPTION;
178 }
179 }  // namespace DlpPermission
180 }  // namespace Security
181 }  // namespace OHOS
182