17405867cSopenharmony_ci/* 27405867cSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 37405867cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 47405867cSopenharmony_ci * you may not use this file except in compliance with the License. 57405867cSopenharmony_ci * You may obtain a copy of the License at 67405867cSopenharmony_ci * 77405867cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 87405867cSopenharmony_ci * 97405867cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 107405867cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 117405867cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127405867cSopenharmony_ci * See the License for the specific language governing permissions and 137405867cSopenharmony_ci * limitations under the License. 147405867cSopenharmony_ci */ 157405867cSopenharmony_ci 167405867cSopenharmony_ci#include "hiappevent_verify.h" 177405867cSopenharmony_ci 187405867cSopenharmony_ci#include <cctype> 197405867cSopenharmony_ci#include <iterator> 207405867cSopenharmony_ci#include <unistd.h> 217405867cSopenharmony_ci#include <unordered_set> 227405867cSopenharmony_ci 237405867cSopenharmony_ci#include "hiappevent_base.h" 247405867cSopenharmony_ci#include "hiappevent_config.h" 257405867cSopenharmony_ci#include "hilog/log.h" 267405867cSopenharmony_ci 277405867cSopenharmony_ci#undef LOG_DOMAIN 287405867cSopenharmony_ci#define LOG_DOMAIN 0xD002D07 297405867cSopenharmony_ci 307405867cSopenharmony_ci#undef LOG_TAG 317405867cSopenharmony_ci#define LOG_TAG "Verify" 327405867cSopenharmony_ci 337405867cSopenharmony_ciusing namespace OHOS::HiviewDFX::ErrorCode; 347405867cSopenharmony_ci 357405867cSopenharmony_cinamespace OHOS { 367405867cSopenharmony_cinamespace HiviewDFX { 377405867cSopenharmony_cinamespace { 387405867cSopenharmony_ciconstexpr size_t MAX_LEN_OF_WATCHER = 32; 397405867cSopenharmony_ciconstexpr size_t MAX_LEN_OF_DOMAIN = 32; 407405867cSopenharmony_cistatic constexpr int MAX_LENGTH_OF_EVENT_NAME = 48; 417405867cSopenharmony_cistatic constexpr int MAX_LENGTH_OF_PARAM_NAME = 32; 427405867cSopenharmony_cistatic constexpr unsigned int MAX_NUM_OF_PARAMS = 32; 437405867cSopenharmony_cistatic constexpr size_t MAX_LENGTH_OF_STR_PARAM = 8 * 1024; 447405867cSopenharmony_cistatic constexpr size_t MAX_LENGTH_OF_SPECIAL_STR_PARAM = 1024 * 1024; 457405867cSopenharmony_cistatic constexpr int MAX_SIZE_OF_LIST_PARAM = 100; 467405867cSopenharmony_cistatic constexpr int MAX_LENGTH_OF_USER_INFO_NAME = 256; 477405867cSopenharmony_cistatic constexpr int MAX_LENGTH_OF_USER_ID_VALUE = 256; 487405867cSopenharmony_cistatic constexpr int MAX_LENGTH_OF_USER_PROPERTY_VALUE = 1024; 497405867cSopenharmony_cistatic constexpr int MAX_LENGTH_OF_PROCESSOR_NAME = 256; 507405867cSopenharmony_cistatic constexpr int MAX_LEN_OF_BATCH_REPORT = 1000; 517405867cSopenharmony_cistatic constexpr size_t MAX_NUM_OF_CUSTOM_CONFIGS = 32; 527405867cSopenharmony_cistatic constexpr size_t MAX_LENGTH_OF_CUSTOM_CONFIG_NAME = 32; 537405867cSopenharmony_cistatic constexpr size_t MAX_LENGTH_OF_CUSTOM_CONFIG_VALUE = 1024; 547405867cSopenharmony_cistatic constexpr size_t MAX_NUM_OF_CUSTOM_PARAMS = 64; 557405867cSopenharmony_cistatic constexpr size_t MAX_LENGTH_OF_CUSTOM_PARAM = 1024; 567405867cSopenharmony_ciconstexpr int MIN_APP_UID = 20000; 577405867cSopenharmony_ci 587405867cSopenharmony_cibool IsValidName(const std::string& name, size_t maxSize, bool allowDollarSign = true) 597405867cSopenharmony_ci{ 607405867cSopenharmony_ci if (name.empty() || name.length() > maxSize) { 617405867cSopenharmony_ci return false; 627405867cSopenharmony_ci } 637405867cSopenharmony_ci // start char is [$a-zA-Z] or [a-zA-Z] 647405867cSopenharmony_ci if (!isalpha(name[0]) && (!allowDollarSign || name[0] != '$')) { 657405867cSopenharmony_ci return false; 667405867cSopenharmony_ci } 677405867cSopenharmony_ci // end char is [a-zA-Z0-9] 687405867cSopenharmony_ci if (name.length() > 1 && (!isalnum(name.back()))) { 697405867cSopenharmony_ci return false; 707405867cSopenharmony_ci } 717405867cSopenharmony_ci // middle char is [a-zA-Z0-9_] 727405867cSopenharmony_ci for (size_t i = 1; i < name.length() - 1; ++i) { 737405867cSopenharmony_ci if (!isalnum(name[i]) && name[i] != '_') { 747405867cSopenharmony_ci return false; 757405867cSopenharmony_ci } 767405867cSopenharmony_ci } 777405867cSopenharmony_ci return true; 787405867cSopenharmony_ci} 797405867cSopenharmony_ci 807405867cSopenharmony_cibool CheckParamName(const std::string& paramName) 817405867cSopenharmony_ci{ 827405867cSopenharmony_ci return IsValidName(paramName, MAX_LENGTH_OF_PARAM_NAME); 837405867cSopenharmony_ci} 847405867cSopenharmony_ci 857405867cSopenharmony_civoid EscapeStringValue(std::string &value) 867405867cSopenharmony_ci{ 877405867cSopenharmony_ci std::string escapeValue; 887405867cSopenharmony_ci for (auto it = value.begin(); it != value.end(); it++) { 897405867cSopenharmony_ci switch (*it) { 907405867cSopenharmony_ci case '\\': 917405867cSopenharmony_ci escapeValue.append("\\\\"); 927405867cSopenharmony_ci break; 937405867cSopenharmony_ci case '\"': 947405867cSopenharmony_ci escapeValue.append("\\\""); 957405867cSopenharmony_ci break; 967405867cSopenharmony_ci case '\b': 977405867cSopenharmony_ci escapeValue.append("\\b"); 987405867cSopenharmony_ci break; 997405867cSopenharmony_ci case '\f': 1007405867cSopenharmony_ci escapeValue.append("\\f"); 1017405867cSopenharmony_ci break; 1027405867cSopenharmony_ci case '\n': 1037405867cSopenharmony_ci escapeValue.append("\\n"); 1047405867cSopenharmony_ci break; 1057405867cSopenharmony_ci case '\r': 1067405867cSopenharmony_ci escapeValue.append("\\r"); 1077405867cSopenharmony_ci break; 1087405867cSopenharmony_ci case '\t': 1097405867cSopenharmony_ci escapeValue.append("\\t"); 1107405867cSopenharmony_ci break; 1117405867cSopenharmony_ci default: 1127405867cSopenharmony_ci escapeValue.push_back(*it); 1137405867cSopenharmony_ci break; 1147405867cSopenharmony_ci } 1157405867cSopenharmony_ci } 1167405867cSopenharmony_ci value = escapeValue; 1177405867cSopenharmony_ci} 1187405867cSopenharmony_ci 1197405867cSopenharmony_cibool CheckStrParamLength(std::string& strParamValue, size_t maxLen = MAX_LENGTH_OF_STR_PARAM) 1207405867cSopenharmony_ci{ 1217405867cSopenharmony_ci if (strParamValue.empty()) { 1227405867cSopenharmony_ci return true; 1237405867cSopenharmony_ci } 1247405867cSopenharmony_ci 1257405867cSopenharmony_ci if (strParamValue.length() > maxLen) { 1267405867cSopenharmony_ci return false; 1277405867cSopenharmony_ci } 1287405867cSopenharmony_ci 1297405867cSopenharmony_ci EscapeStringValue(strParamValue); 1307405867cSopenharmony_ci return true; 1317405867cSopenharmony_ci} 1327405867cSopenharmony_ci 1337405867cSopenharmony_cibool CheckListValueSize(AppEventParamType type, AppEventParamValue::ValueUnion& vu) 1347405867cSopenharmony_ci{ 1357405867cSopenharmony_ci if (type == AppEventParamType::BVECTOR && vu.bs_.size() > MAX_SIZE_OF_LIST_PARAM) { 1367405867cSopenharmony_ci vu.bs_.resize(MAX_SIZE_OF_LIST_PARAM); 1377405867cSopenharmony_ci } else if (type == AppEventParamType::CVECTOR && vu.cs_.size() > MAX_SIZE_OF_LIST_PARAM) { 1387405867cSopenharmony_ci vu.cs_.resize(MAX_SIZE_OF_LIST_PARAM); 1397405867cSopenharmony_ci } else if (type == AppEventParamType::SHVECTOR && vu.shs_.size() > MAX_SIZE_OF_LIST_PARAM) { 1407405867cSopenharmony_ci vu.shs_.resize(MAX_SIZE_OF_LIST_PARAM); 1417405867cSopenharmony_ci } else if (type == AppEventParamType::IVECTOR && vu.is_.size() > MAX_SIZE_OF_LIST_PARAM) { 1427405867cSopenharmony_ci vu.is_.resize(MAX_SIZE_OF_LIST_PARAM); 1437405867cSopenharmony_ci } else if (type == AppEventParamType::LLVECTOR && vu.lls_.size() > MAX_SIZE_OF_LIST_PARAM) { 1447405867cSopenharmony_ci vu.lls_.resize(MAX_SIZE_OF_LIST_PARAM); 1457405867cSopenharmony_ci } else if (type == AppEventParamType::FVECTOR && vu.fs_.size() > MAX_SIZE_OF_LIST_PARAM) { 1467405867cSopenharmony_ci vu.fs_.resize(MAX_SIZE_OF_LIST_PARAM); 1477405867cSopenharmony_ci } else if (type == AppEventParamType::DVECTOR && vu.ds_.size() > MAX_SIZE_OF_LIST_PARAM) { 1487405867cSopenharmony_ci vu.ds_.resize(MAX_SIZE_OF_LIST_PARAM); 1497405867cSopenharmony_ci } else if (type == AppEventParamType::STRVECTOR && vu.strs_.size() > MAX_SIZE_OF_LIST_PARAM) { 1507405867cSopenharmony_ci vu.strs_.resize(MAX_SIZE_OF_LIST_PARAM); 1517405867cSopenharmony_ci } else { 1527405867cSopenharmony_ci return true; 1537405867cSopenharmony_ci } 1547405867cSopenharmony_ci 1557405867cSopenharmony_ci return false; 1567405867cSopenharmony_ci} 1577405867cSopenharmony_ci 1587405867cSopenharmony_cibool CheckStringLengthOfList(std::vector<std::string>& strs, size_t maxTotalLen = 0) 1597405867cSopenharmony_ci{ 1607405867cSopenharmony_ci if (strs.empty()) { 1617405867cSopenharmony_ci return true; 1627405867cSopenharmony_ci } 1637405867cSopenharmony_ci size_t totalLen = 0; 1647405867cSopenharmony_ci for (auto it = strs.begin(); it != strs.end(); it++) { 1657405867cSopenharmony_ci if (!CheckStrParamLength(*it)) { 1667405867cSopenharmony_ci return false; 1677405867cSopenharmony_ci } 1687405867cSopenharmony_ci totalLen += (*it).length(); 1697405867cSopenharmony_ci } 1707405867cSopenharmony_ci if (maxTotalLen > 0 && totalLen > maxTotalLen) { 1717405867cSopenharmony_ci return false; 1727405867cSopenharmony_ci } 1737405867cSopenharmony_ci return true; 1747405867cSopenharmony_ci} 1757405867cSopenharmony_ci 1767405867cSopenharmony_cibool CheckParamsNum(std::list<AppEventParam>& baseParams) 1777405867cSopenharmony_ci{ 1787405867cSopenharmony_ci if (baseParams.size() == 0) { 1797405867cSopenharmony_ci return true; 1807405867cSopenharmony_ci } 1817405867cSopenharmony_ci 1827405867cSopenharmony_ci auto listSize = baseParams.size(); 1837405867cSopenharmony_ci if (listSize > MAX_NUM_OF_PARAMS) { 1847405867cSopenharmony_ci auto delStartPtr = baseParams.begin(); 1857405867cSopenharmony_ci std::advance(delStartPtr, MAX_NUM_OF_PARAMS); 1867405867cSopenharmony_ci baseParams.erase(delStartPtr, baseParams.end()); 1877405867cSopenharmony_ci return false; 1887405867cSopenharmony_ci } 1897405867cSopenharmony_ci 1907405867cSopenharmony_ci return true; 1917405867cSopenharmony_ci} 1927405867cSopenharmony_ci 1937405867cSopenharmony_cibool VerifyAppEventParam(AppEventParam& param, std::unordered_set<std::string>& paramNames, int& verifyRes) 1947405867cSopenharmony_ci{ 1957405867cSopenharmony_ci std::string name = param.name; 1967405867cSopenharmony_ci if (paramNames.find(name) != paramNames.end()) { 1977405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because param is duplicate.", name.c_str()); 1987405867cSopenharmony_ci verifyRes = ERROR_DUPLICATE_PARAM; 1997405867cSopenharmony_ci return false; 2007405867cSopenharmony_ci } 2017405867cSopenharmony_ci 2027405867cSopenharmony_ci if (!CheckParamName(name)) { 2037405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because the paramName is invalid.", name.c_str()); 2047405867cSopenharmony_ci verifyRes = ERROR_INVALID_PARAM_NAME; 2057405867cSopenharmony_ci return false; 2067405867cSopenharmony_ci } 2077405867cSopenharmony_ci 2087405867cSopenharmony_ci const std::unordered_set<std::string> tempTrueNames = {"crash", "anr"}; 2097405867cSopenharmony_ci size_t maxLen = tempTrueNames.find(name) == tempTrueNames.end() ? MAX_LENGTH_OF_STR_PARAM : 2107405867cSopenharmony_ci MAX_LENGTH_OF_SPECIAL_STR_PARAM; 2117405867cSopenharmony_ci if (param.type == AppEventParamType::STRING && !CheckStrParamLength(param.value.valueUnion.str_, maxLen)) { 2127405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because the string length exceeds %{public}zu.", 2137405867cSopenharmony_ci name.c_str(), maxLen); 2147405867cSopenharmony_ci verifyRes = ERROR_INVALID_PARAM_VALUE_LENGTH; 2157405867cSopenharmony_ci return false; 2167405867cSopenharmony_ci } 2177405867cSopenharmony_ci 2187405867cSopenharmony_ci if (param.type == AppEventParamType::STRVECTOR && !CheckStringLengthOfList(param.value.valueUnion.strs_)) { 2197405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because the string length of list exceeds 8192.", 2207405867cSopenharmony_ci name.c_str()); 2217405867cSopenharmony_ci verifyRes = ERROR_INVALID_PARAM_VALUE_LENGTH; 2227405867cSopenharmony_ci return false; 2237405867cSopenharmony_ci } 2247405867cSopenharmony_ci 2257405867cSopenharmony_ci if (param.type > AppEventParamType::STRING && !CheckListValueSize(param.type, param.value.valueUnion)) { 2267405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "list param=%{public}s is truncated because the list size exceeds 100.", name.c_str()); 2277405867cSopenharmony_ci verifyRes = ERROR_INVALID_LIST_PARAM_SIZE; 2287405867cSopenharmony_ci return true; 2297405867cSopenharmony_ci } 2307405867cSopenharmony_ci return true; 2317405867cSopenharmony_ci} 2327405867cSopenharmony_ci 2337405867cSopenharmony_ciint VerifyCustomAppEventParam(AppEventParam& param, std::unordered_set<std::string>& paramNames) 2347405867cSopenharmony_ci{ 2357405867cSopenharmony_ci std::string name = param.name; 2367405867cSopenharmony_ci if (paramNames.find(name) != paramNames.end()) { 2377405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because param is duplicate.", name.c_str()); 2387405867cSopenharmony_ci return ERROR_DUPLICATE_PARAM; 2397405867cSopenharmony_ci } 2407405867cSopenharmony_ci 2417405867cSopenharmony_ci if (!CheckParamName(name)) { 2427405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because the paramName is invalid.", name.c_str()); 2437405867cSopenharmony_ci return ERROR_INVALID_PARAM_NAME; 2447405867cSopenharmony_ci } 2457405867cSopenharmony_ci 2467405867cSopenharmony_ci if (param.type == AppEventParamType::STRING 2477405867cSopenharmony_ci && !CheckStrParamLength(param.value.valueUnion.str_, MAX_LENGTH_OF_CUSTOM_PARAM)) { 2487405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because the string length exceeds %{public}zu.", 2497405867cSopenharmony_ci name.c_str(), MAX_LENGTH_OF_CUSTOM_PARAM); 2507405867cSopenharmony_ci return ERROR_INVALID_PARAM_VALUE_LENGTH; 2517405867cSopenharmony_ci } 2527405867cSopenharmony_ci 2537405867cSopenharmony_ci if (param.type == AppEventParamType::STRVECTOR 2547405867cSopenharmony_ci && !CheckStringLengthOfList(param.value.valueUnion.strs_, MAX_LENGTH_OF_CUSTOM_PARAM)) { 2557405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "param=%{public}s is discarded because the string length of list exceeds %{public}zu.", 2567405867cSopenharmony_ci name.c_str(), MAX_LENGTH_OF_CUSTOM_PARAM); 2577405867cSopenharmony_ci return ERROR_INVALID_PARAM_VALUE_LENGTH; 2587405867cSopenharmony_ci } 2597405867cSopenharmony_ci 2607405867cSopenharmony_ci return HIAPPEVENT_VERIFY_SUCCESSFUL; 2617405867cSopenharmony_ci} 2627405867cSopenharmony_ci 2637405867cSopenharmony_ciusing VerifyReportConfigFunc = int (*)(ReportConfig& config); 2647405867cSopenharmony_ciint VerifyNameOfReportConfig(ReportConfig& config) 2657405867cSopenharmony_ci{ 2667405867cSopenharmony_ci if (!IsValidProcessorName(config.name)) { 2677405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "invalid name=%{public}s", config.name.c_str()); 2687405867cSopenharmony_ci return -1; 2697405867cSopenharmony_ci } 2707405867cSopenharmony_ci return 0; 2717405867cSopenharmony_ci} 2727405867cSopenharmony_ci 2737405867cSopenharmony_ciint VerifyRouteInfoOfReportConfig(ReportConfig& config) 2747405867cSopenharmony_ci{ 2757405867cSopenharmony_ci if (!IsValidRouteInfo(config.routeInfo)) { 2767405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid routeInfo."); 2777405867cSopenharmony_ci config.routeInfo = ""; 2787405867cSopenharmony_ci } 2797405867cSopenharmony_ci return 0; 2807405867cSopenharmony_ci} 2817405867cSopenharmony_ci 2827405867cSopenharmony_ciint VerifyAppIdOfReportConfig(ReportConfig& config) 2837405867cSopenharmony_ci{ 2847405867cSopenharmony_ci if (!IsValidAppId(config.appId)) { 2857405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid appId."); 2867405867cSopenharmony_ci config.appId = ""; 2877405867cSopenharmony_ci } 2887405867cSopenharmony_ci return 0; 2897405867cSopenharmony_ci} 2907405867cSopenharmony_ci 2917405867cSopenharmony_ciint VerifyTriggerCondOfReportConfig(ReportConfig& config) 2927405867cSopenharmony_ci{ 2937405867cSopenharmony_ci if (!IsValidBatchReport(config.triggerCond.row)) { 2947405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid triggerCond.row=%{public}d", config.triggerCond.row); 2957405867cSopenharmony_ci config.triggerCond.row = 0; 2967405867cSopenharmony_ci } 2977405867cSopenharmony_ci if (!IsValidPeriodReport(config.triggerCond.timeout)) { 2987405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid triggerCond.timeout=%{public}d", config.triggerCond.row); 2997405867cSopenharmony_ci config.triggerCond.timeout = 0; 3007405867cSopenharmony_ci } 3017405867cSopenharmony_ci // processor does not support the size 3027405867cSopenharmony_ci config.triggerCond.size = 0; 3037405867cSopenharmony_ci return 0; 3047405867cSopenharmony_ci} 3057405867cSopenharmony_ci 3067405867cSopenharmony_ciint VerifyUserIdNamesOfReportConfig(ReportConfig& config) 3077405867cSopenharmony_ci{ 3087405867cSopenharmony_ci for (const auto& name : config.userIdNames) { 3097405867cSopenharmony_ci if (!IsValidUserIdName(name)) { 3107405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid user id name=%{public}s", name.c_str()); 3117405867cSopenharmony_ci config.userIdNames.clear(); 3127405867cSopenharmony_ci break; 3137405867cSopenharmony_ci } 3147405867cSopenharmony_ci } 3157405867cSopenharmony_ci return 0; 3167405867cSopenharmony_ci} 3177405867cSopenharmony_ci 3187405867cSopenharmony_ciint VerifyUserPropertyNamesOfReportConfig(ReportConfig& config) 3197405867cSopenharmony_ci{ 3207405867cSopenharmony_ci for (const auto& name : config.userPropertyNames) { 3217405867cSopenharmony_ci if (!IsValidUserIdName(name)) { 3227405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid user property name=%{public}s", name.c_str()); 3237405867cSopenharmony_ci config.userPropertyNames.clear(); 3247405867cSopenharmony_ci break; 3257405867cSopenharmony_ci } 3267405867cSopenharmony_ci } 3277405867cSopenharmony_ci return 0; 3287405867cSopenharmony_ci} 3297405867cSopenharmony_ci 3307405867cSopenharmony_ciint VerifyEventConfigsOfReportConfig(ReportConfig& reportConfig) 3317405867cSopenharmony_ci{ 3327405867cSopenharmony_ci for (const auto& eventConfig : reportConfig.eventConfigs) { 3337405867cSopenharmony_ci if (!IsValidEventConfig(eventConfig)) { 3347405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid event configs, domain=%{public}s, name=%{public}s", 3357405867cSopenharmony_ci eventConfig.domain.c_str(), eventConfig.name.c_str()); 3367405867cSopenharmony_ci reportConfig.eventConfigs.clear(); 3377405867cSopenharmony_ci break; 3387405867cSopenharmony_ci } 3397405867cSopenharmony_ci } 3407405867cSopenharmony_ci return 0; 3417405867cSopenharmony_ci} 3427405867cSopenharmony_ci 3437405867cSopenharmony_ciint VerifyConfigIdOfReportConfig(ReportConfig& config) 3447405867cSopenharmony_ci{ 3457405867cSopenharmony_ci if (!IsValidConfigId(config.configId)) { 3467405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid configId=%{public}d", config.configId); 3477405867cSopenharmony_ci config.configId = 0; 3487405867cSopenharmony_ci } 3497405867cSopenharmony_ci return 0; 3507405867cSopenharmony_ci} 3517405867cSopenharmony_ci 3527405867cSopenharmony_ciint VerifyCustomConfigsOfReportConfig(ReportConfig& config) 3537405867cSopenharmony_ci{ 3547405867cSopenharmony_ci if (!IsValidCustomConfigsNum(config.customConfigs.size())) { 3557405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid keys size=%{public}zu", config.customConfigs.size()); 3567405867cSopenharmony_ci config.customConfigs.clear(); 3577405867cSopenharmony_ci return 0; 3587405867cSopenharmony_ci } 3597405867cSopenharmony_ci for (const auto& item : config.customConfigs) { 3607405867cSopenharmony_ci if (!IsValidCustomConfig(item.first, item.second)) { 3617405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "invalid key name=%{public}s", item.first.c_str()); 3627405867cSopenharmony_ci config.customConfigs.clear(); 3637405867cSopenharmony_ci break; 3647405867cSopenharmony_ci } 3657405867cSopenharmony_ci } 3667405867cSopenharmony_ci return 0; 3677405867cSopenharmony_ci} 3687405867cSopenharmony_ci} 3697405867cSopenharmony_ci 3707405867cSopenharmony_cibool IsValidDomain(const std::string& eventDomain) 3717405867cSopenharmony_ci{ 3727405867cSopenharmony_ci return IsValidName(eventDomain, MAX_LEN_OF_DOMAIN, false); 3737405867cSopenharmony_ci} 3747405867cSopenharmony_ci 3757405867cSopenharmony_cibool IsValidEventName(const std::string& eventName) 3767405867cSopenharmony_ci{ 3777405867cSopenharmony_ci const std::string eventPrefix = "hiappevent."; 3787405867cSopenharmony_ci return eventName.find(eventPrefix) == 0 ? 3797405867cSopenharmony_ci IsValidName(eventName.substr(eventPrefix.length()), MAX_LENGTH_OF_EVENT_NAME - eventPrefix.length()) : 3807405867cSopenharmony_ci IsValidName(eventName, MAX_LENGTH_OF_EVENT_NAME); 3817405867cSopenharmony_ci} 3827405867cSopenharmony_ci 3837405867cSopenharmony_cibool IsValidWatcherName(const std::string& watcherName) 3847405867cSopenharmony_ci{ 3857405867cSopenharmony_ci return IsValidName(watcherName, MAX_LEN_OF_WATCHER, false); 3867405867cSopenharmony_ci} 3877405867cSopenharmony_ci 3887405867cSopenharmony_cibool IsValidEventType(int eventType) 3897405867cSopenharmony_ci{ 3907405867cSopenharmony_ci return eventType >= 1 && eventType <= 4; // 1-4: value range of event type 3917405867cSopenharmony_ci} 3927405867cSopenharmony_ci 3937405867cSopenharmony_ciint VerifyAppEvent(std::shared_ptr<AppEventPack> event) 3947405867cSopenharmony_ci{ 3957405867cSopenharmony_ci if (HiAppEventConfig::GetInstance().GetDisable()) { 3967405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "the HiAppEvent function is disabled."); 3977405867cSopenharmony_ci return ERROR_HIAPPEVENT_DISABLE; 3987405867cSopenharmony_ci } 3997405867cSopenharmony_ci if (!IsValidDomain(event->GetDomain())) { 4007405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "eventDomain=%{public}s is invalid.", event->GetDomain().c_str()); 4017405867cSopenharmony_ci return ERROR_INVALID_EVENT_DOMAIN; 4027405867cSopenharmony_ci } 4037405867cSopenharmony_ci if (!IsValidEventName(event->GetName())) { 4047405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "eventName=%{public}s is invalid.", event->GetName().c_str()); 4057405867cSopenharmony_ci return ERROR_INVALID_EVENT_NAME; 4067405867cSopenharmony_ci } 4077405867cSopenharmony_ci 4087405867cSopenharmony_ci int verifyRes = HIAPPEVENT_VERIFY_SUCCESSFUL; 4097405867cSopenharmony_ci std::list<AppEventParam>& baseParams = event->baseParams_; 4107405867cSopenharmony_ci std::unordered_set<std::string> paramNames; 4117405867cSopenharmony_ci for (auto it = baseParams.begin(); it != baseParams.end();) { 4127405867cSopenharmony_ci if (!VerifyAppEventParam(*it, paramNames, verifyRes)) { 4137405867cSopenharmony_ci baseParams.erase(it++); 4147405867cSopenharmony_ci continue; 4157405867cSopenharmony_ci } 4167405867cSopenharmony_ci paramNames.emplace(it->name); 4177405867cSopenharmony_ci it++; 4187405867cSopenharmony_ci } 4197405867cSopenharmony_ci 4207405867cSopenharmony_ci if (!CheckParamsNum(baseParams)) { 4217405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "params that exceed 32 are discarded because the number of params cannot exceed 32."); 4227405867cSopenharmony_ci verifyRes = ERROR_INVALID_PARAM_NUM; 4237405867cSopenharmony_ci } 4247405867cSopenharmony_ci 4257405867cSopenharmony_ci return verifyRes; 4267405867cSopenharmony_ci} 4277405867cSopenharmony_ci 4287405867cSopenharmony_ciint VerifyCustomEventParams(std::shared_ptr<AppEventPack> event) 4297405867cSopenharmony_ci{ 4307405867cSopenharmony_ci if (HiAppEventConfig::GetInstance().GetDisable()) { 4317405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "the HiAppEvent function is disabled."); 4327405867cSopenharmony_ci return ERROR_HIAPPEVENT_DISABLE; 4337405867cSopenharmony_ci } 4347405867cSopenharmony_ci if (!IsValidDomain(event->GetDomain())) { 4357405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "eventDomain=%{public}s is invalid.", event->GetDomain().c_str()); 4367405867cSopenharmony_ci return ERROR_INVALID_EVENT_DOMAIN; 4377405867cSopenharmony_ci } 4387405867cSopenharmony_ci if (!event->GetName().empty() && !IsValidEventName(event->GetName())) { 4397405867cSopenharmony_ci HILOG_ERROR(LOG_CORE, "eventName=%{public}s is invalid.", event->GetName().c_str()); 4407405867cSopenharmony_ci return ERROR_INVALID_EVENT_NAME; 4417405867cSopenharmony_ci } 4427405867cSopenharmony_ci 4437405867cSopenharmony_ci std::list<AppEventParam>& baseParams = event->baseParams_; 4447405867cSopenharmony_ci if (baseParams.size() > MAX_NUM_OF_CUSTOM_PARAMS) { 4457405867cSopenharmony_ci HILOG_WARN(LOG_CORE, "params that exceed 64 are discarded because the number of params cannot exceed 64."); 4467405867cSopenharmony_ci return ERROR_INVALID_CUSTOM_PARAM_NUM; 4477405867cSopenharmony_ci } 4487405867cSopenharmony_ci std::unordered_set<std::string> paramNames; 4497405867cSopenharmony_ci for (auto it = baseParams.begin(); it != baseParams.end(); ++it) { 4507405867cSopenharmony_ci if (int ret = VerifyCustomAppEventParam(*it, paramNames); ret != HIAPPEVENT_VERIFY_SUCCESSFUL) { 4517405867cSopenharmony_ci return ret; 4527405867cSopenharmony_ci } 4537405867cSopenharmony_ci } 4547405867cSopenharmony_ci return HIAPPEVENT_VERIFY_SUCCESSFUL; 4557405867cSopenharmony_ci} 4567405867cSopenharmony_ci 4577405867cSopenharmony_cibool IsValidPropName(const std::string& name, size_t maxSize) 4587405867cSopenharmony_ci{ 4597405867cSopenharmony_ci if (name.empty() || name.length() > maxSize) { 4607405867cSopenharmony_ci return false; 4617405867cSopenharmony_ci } 4627405867cSopenharmony_ci // start char is [a-zA-Z_$] 4637405867cSopenharmony_ci if (!isalpha(name[0]) && name[0] != '_' && name[0] != '$') { 4647405867cSopenharmony_ci return false; 4657405867cSopenharmony_ci } 4667405867cSopenharmony_ci // other char is [a-zA-Z0-9_$] 4677405867cSopenharmony_ci for (size_t i = 1; i < name.length(); ++i) { 4687405867cSopenharmony_ci if (!isalnum(name[i]) && name[i] != '_' && name[i] != '$') { 4697405867cSopenharmony_ci return false; 4707405867cSopenharmony_ci } 4717405867cSopenharmony_ci } 4727405867cSopenharmony_ci return true; 4737405867cSopenharmony_ci} 4747405867cSopenharmony_ci 4757405867cSopenharmony_cibool IsValidPropValue(const std::string& val, size_t maxSize) 4767405867cSopenharmony_ci{ 4777405867cSopenharmony_ci return !val.empty() && val.length() <= maxSize; 4787405867cSopenharmony_ci} 4797405867cSopenharmony_ci 4807405867cSopenharmony_cibool IsValidProcessorName(const std::string& name) 4817405867cSopenharmony_ci{ 4827405867cSopenharmony_ci return IsValidPropName(name, MAX_LENGTH_OF_PROCESSOR_NAME); 4837405867cSopenharmony_ci} 4847405867cSopenharmony_ci 4857405867cSopenharmony_cibool IsValidRouteInfo(const std::string& name) 4867405867cSopenharmony_ci{ 4877405867cSopenharmony_ci return name.length() <= MAX_LENGTH_OF_STR_PARAM; 4887405867cSopenharmony_ci} 4897405867cSopenharmony_ci 4907405867cSopenharmony_cibool IsValidAppId(const std::string& name) 4917405867cSopenharmony_ci{ 4927405867cSopenharmony_ci return name.length() <= MAX_LENGTH_OF_STR_PARAM; 4937405867cSopenharmony_ci} 4947405867cSopenharmony_ci 4957405867cSopenharmony_cibool IsValidPeriodReport(int timeout) 4967405867cSopenharmony_ci{ 4977405867cSopenharmony_ci return timeout >= 0; 4987405867cSopenharmony_ci} 4997405867cSopenharmony_ci 5007405867cSopenharmony_cibool IsValidBatchReport(int count) 5017405867cSopenharmony_ci{ 5027405867cSopenharmony_ci return count >= 0 && count <= MAX_LEN_OF_BATCH_REPORT; 5037405867cSopenharmony_ci} 5047405867cSopenharmony_ci 5057405867cSopenharmony_cibool IsValidUserIdName(const std::string& name) 5067405867cSopenharmony_ci{ 5077405867cSopenharmony_ci return IsValidPropName(name, MAX_LENGTH_OF_USER_INFO_NAME); 5087405867cSopenharmony_ci} 5097405867cSopenharmony_ci 5107405867cSopenharmony_cibool IsValidUserIdValue(const std::string& value) 5117405867cSopenharmony_ci{ 5127405867cSopenharmony_ci return IsValidPropValue(value, MAX_LENGTH_OF_USER_ID_VALUE); 5137405867cSopenharmony_ci} 5147405867cSopenharmony_ci 5157405867cSopenharmony_cibool IsValidUserPropName(const std::string& name) 5167405867cSopenharmony_ci{ 5177405867cSopenharmony_ci return IsValidPropName(name, MAX_LENGTH_OF_USER_INFO_NAME); 5187405867cSopenharmony_ci} 5197405867cSopenharmony_ci 5207405867cSopenharmony_cibool IsValidUserPropValue(const std::string& value) 5217405867cSopenharmony_ci{ 5227405867cSopenharmony_ci return IsValidPropValue(value, MAX_LENGTH_OF_USER_PROPERTY_VALUE); 5237405867cSopenharmony_ci} 5247405867cSopenharmony_ci 5257405867cSopenharmony_cibool IsValidEventConfig(const EventConfig& eventCfg) 5267405867cSopenharmony_ci{ 5277405867cSopenharmony_ci if (eventCfg.domain.empty() && eventCfg.name.empty()) { 5287405867cSopenharmony_ci return false; 5297405867cSopenharmony_ci } 5307405867cSopenharmony_ci if (!eventCfg.domain.empty() && !IsValidDomain(eventCfg.domain)) { 5317405867cSopenharmony_ci return false; 5327405867cSopenharmony_ci } 5337405867cSopenharmony_ci if (!eventCfg.name.empty() && !IsValidEventName(eventCfg.name)) { 5347405867cSopenharmony_ci return false; 5357405867cSopenharmony_ci } 5367405867cSopenharmony_ci return true; 5377405867cSopenharmony_ci} 5387405867cSopenharmony_ci 5397405867cSopenharmony_cibool IsValidConfigId(int configId) 5407405867cSopenharmony_ci{ 5417405867cSopenharmony_ci return configId >= 0; 5427405867cSopenharmony_ci} 5437405867cSopenharmony_ci 5447405867cSopenharmony_cibool IsValidCustomConfigsNum(size_t num) 5457405867cSopenharmony_ci{ 5467405867cSopenharmony_ci return num <= MAX_NUM_OF_CUSTOM_CONFIGS; 5477405867cSopenharmony_ci} 5487405867cSopenharmony_ci 5497405867cSopenharmony_cibool IsValidCustomConfig(const std::string& name, const std::string& value) 5507405867cSopenharmony_ci{ 5517405867cSopenharmony_ci if (!IsValidName(name, MAX_LENGTH_OF_CUSTOM_CONFIG_NAME) || value.length() > MAX_LENGTH_OF_CUSTOM_CONFIG_VALUE) { 5527405867cSopenharmony_ci return false; 5537405867cSopenharmony_ci } 5547405867cSopenharmony_ci return true; 5557405867cSopenharmony_ci} 5567405867cSopenharmony_ci 5577405867cSopenharmony_ciint VerifyReportConfig(ReportConfig& config) 5587405867cSopenharmony_ci{ 5597405867cSopenharmony_ci const VerifyReportConfigFunc verifyFuncs[] = { 5607405867cSopenharmony_ci VerifyNameOfReportConfig, 5617405867cSopenharmony_ci VerifyRouteInfoOfReportConfig, 5627405867cSopenharmony_ci VerifyAppIdOfReportConfig, 5637405867cSopenharmony_ci VerifyTriggerCondOfReportConfig, 5647405867cSopenharmony_ci VerifyUserIdNamesOfReportConfig, 5657405867cSopenharmony_ci VerifyUserPropertyNamesOfReportConfig, 5667405867cSopenharmony_ci VerifyEventConfigsOfReportConfig, 5677405867cSopenharmony_ci VerifyConfigIdOfReportConfig, 5687405867cSopenharmony_ci VerifyCustomConfigsOfReportConfig, 5697405867cSopenharmony_ci }; 5707405867cSopenharmony_ci for (const auto verifyFunc : verifyFuncs) { 5717405867cSopenharmony_ci if (verifyFunc(config) != 0) { 5727405867cSopenharmony_ci return -1; 5737405867cSopenharmony_ci } 5747405867cSopenharmony_ci } 5757405867cSopenharmony_ci return 0; 5767405867cSopenharmony_ci} 5777405867cSopenharmony_ci 5787405867cSopenharmony_cibool IsApp() 5797405867cSopenharmony_ci{ 5807405867cSopenharmony_ci return getuid() >= MIN_APP_UID; 5817405867cSopenharmony_ci} 5827405867cSopenharmony_ci} // namespace HiviewDFX 5837405867cSopenharmony_ci} // namespace OHOS 584