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