179a732c7Sopenharmony_ci/*
279a732c7Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
379a732c7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
479a732c7Sopenharmony_ci * you may not use this file except in compliance with the License.
579a732c7Sopenharmony_ci * You may obtain a copy of the License at
679a732c7Sopenharmony_ci *
779a732c7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
879a732c7Sopenharmony_ci *
979a732c7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1079a732c7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1179a732c7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1279a732c7Sopenharmony_ci * See the License for the specific language governing permissions and
1379a732c7Sopenharmony_ci * limitations under the License.
1479a732c7Sopenharmony_ci */
1579a732c7Sopenharmony_ci
1679a732c7Sopenharmony_ci#include "dm_anonymous.h"
1779a732c7Sopenharmony_ci#include "dm_log.h"
1879a732c7Sopenharmony_ci#include <sstream>
1979a732c7Sopenharmony_cinamespace OHOS {
2079a732c7Sopenharmony_cinamespace DistributedHardware {
2179a732c7Sopenharmony_cinamespace {
2279a732c7Sopenharmony_ciconstexpr uint32_t MAX_MESSAGE_LEN = 40 * 1024 * 1024;
2379a732c7Sopenharmony_ciconstexpr uint32_t MAX_MAP_LEN = 1000;
2479a732c7Sopenharmony_ciconstexpr uint32_t MAX_INT_LEN = 20;
2579a732c7Sopenharmony_ci}
2679a732c7Sopenharmony_ci
2779a732c7Sopenharmony_cistd::string GetAnonyString(const std::string &value)
2879a732c7Sopenharmony_ci{
2979a732c7Sopenharmony_ci    const int32_t INT32_SHORT_ID_LENGTH = 20;
3079a732c7Sopenharmony_ci    const int32_t INT32_PLAINTEXT_LENGTH = 4;
3179a732c7Sopenharmony_ci    const int32_t INT32_MIN_ID_LENGTH = 3;
3279a732c7Sopenharmony_ci
3379a732c7Sopenharmony_ci    std::string tmpStr("******");
3479a732c7Sopenharmony_ci    size_t strLen = value.length();
3579a732c7Sopenharmony_ci    if (strLen < INT32_MIN_ID_LENGTH) {
3679a732c7Sopenharmony_ci        return tmpStr;
3779a732c7Sopenharmony_ci    }
3879a732c7Sopenharmony_ci
3979a732c7Sopenharmony_ci    std::string res;
4079a732c7Sopenharmony_ci    if (strLen <= INT32_SHORT_ID_LENGTH) {
4179a732c7Sopenharmony_ci        res += value[0];
4279a732c7Sopenharmony_ci        res += tmpStr;
4379a732c7Sopenharmony_ci        res += value[strLen - 1];
4479a732c7Sopenharmony_ci    } else {
4579a732c7Sopenharmony_ci        res.append(value, 0, INT32_PLAINTEXT_LENGTH);
4679a732c7Sopenharmony_ci        res += tmpStr;
4779a732c7Sopenharmony_ci        res.append(value, strLen - INT32_PLAINTEXT_LENGTH, INT32_PLAINTEXT_LENGTH);
4879a732c7Sopenharmony_ci    }
4979a732c7Sopenharmony_ci
5079a732c7Sopenharmony_ci    return res;
5179a732c7Sopenharmony_ci}
5279a732c7Sopenharmony_ci
5379a732c7Sopenharmony_cistd::string GetAnonyInt32(const int32_t value)
5479a732c7Sopenharmony_ci{
5579a732c7Sopenharmony_ci    std::string tempString = std::to_string(value);
5679a732c7Sopenharmony_ci    size_t length = tempString.length();
5779a732c7Sopenharmony_ci    if (length == 0x01) {
5879a732c7Sopenharmony_ci        tempString[0] = '*';
5979a732c7Sopenharmony_ci        return tempString;
6079a732c7Sopenharmony_ci    }
6179a732c7Sopenharmony_ci    for (size_t i = 1; i < length - 1; i++) {
6279a732c7Sopenharmony_ci        tempString[i] = '*';
6379a732c7Sopenharmony_ci    }
6479a732c7Sopenharmony_ci    return tempString;
6579a732c7Sopenharmony_ci}
6679a732c7Sopenharmony_ci
6779a732c7Sopenharmony_cibool IsNumberString(const std::string &inputString)
6879a732c7Sopenharmony_ci{
6979a732c7Sopenharmony_ci    LOGI("IsNumberString for DeviceManagerNapi");
7079a732c7Sopenharmony_ci    if (inputString.length() == 0 || inputString.length() > MAX_INT_LEN) {
7179a732c7Sopenharmony_ci        LOGE("inputString is Null or inputString length is too long");
7279a732c7Sopenharmony_ci        return false;
7379a732c7Sopenharmony_ci    }
7479a732c7Sopenharmony_ci    const int32_t MIN_ASCII_NUM = 48;
7579a732c7Sopenharmony_ci    const int32_t MAX_ASCII_NUM = 57;
7679a732c7Sopenharmony_ci    for (size_t i = 0; i < inputString.length(); i++) {
7779a732c7Sopenharmony_ci        int num = (int)inputString[i];
7879a732c7Sopenharmony_ci        if (num >= MIN_ASCII_NUM && num <= MAX_ASCII_NUM) {
7979a732c7Sopenharmony_ci            continue;
8079a732c7Sopenharmony_ci        } else {
8179a732c7Sopenharmony_ci            return false;
8279a732c7Sopenharmony_ci        }
8379a732c7Sopenharmony_ci    }
8479a732c7Sopenharmony_ci    return true;
8579a732c7Sopenharmony_ci}
8679a732c7Sopenharmony_ci
8779a732c7Sopenharmony_cibool IsString(const nlohmann::json &jsonObj, const std::string &key)
8879a732c7Sopenharmony_ci{
8979a732c7Sopenharmony_ci    bool res = jsonObj.contains(key) && jsonObj[key].is_string() && jsonObj[key].size() <= MAX_MESSAGE_LEN;
9079a732c7Sopenharmony_ci    if (!res) {
9179a732c7Sopenharmony_ci        LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
9279a732c7Sopenharmony_ci    }
9379a732c7Sopenharmony_ci    return res;
9479a732c7Sopenharmony_ci}
9579a732c7Sopenharmony_ci
9679a732c7Sopenharmony_cibool IsInt32(const nlohmann::json &jsonObj, const std::string &key)
9779a732c7Sopenharmony_ci{
9879a732c7Sopenharmony_ci    bool res = jsonObj.contains(key) && jsonObj[key].is_number_integer() && jsonObj[key] >= INT32_MIN &&
9979a732c7Sopenharmony_ci        jsonObj[key] <= INT32_MAX;
10079a732c7Sopenharmony_ci    if (!res) {
10179a732c7Sopenharmony_ci        LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
10279a732c7Sopenharmony_ci    }
10379a732c7Sopenharmony_ci    return res;
10479a732c7Sopenharmony_ci}
10579a732c7Sopenharmony_ci
10679a732c7Sopenharmony_cibool IsUint32(const nlohmann::json &jsonObj, const std::string &key)
10779a732c7Sopenharmony_ci{
10879a732c7Sopenharmony_ci    bool res = jsonObj.contains(key) && jsonObj[key].is_number_unsigned() && jsonObj[key] >= 0 &&
10979a732c7Sopenharmony_ci        jsonObj[key] <= UINT32_MAX;
11079a732c7Sopenharmony_ci    if (!res) {
11179a732c7Sopenharmony_ci        LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
11279a732c7Sopenharmony_ci    }
11379a732c7Sopenharmony_ci    return res;
11479a732c7Sopenharmony_ci}
11579a732c7Sopenharmony_ci
11679a732c7Sopenharmony_cibool IsInt64(const nlohmann::json &jsonObj, const std::string &key)
11779a732c7Sopenharmony_ci{
11879a732c7Sopenharmony_ci    bool res = jsonObj.contains(key) && jsonObj[key].is_number_integer() && jsonObj[key] >= INT64_MIN &&
11979a732c7Sopenharmony_ci        jsonObj[key] <= INT64_MAX;
12079a732c7Sopenharmony_ci    if (!res) {
12179a732c7Sopenharmony_ci        LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
12279a732c7Sopenharmony_ci    }
12379a732c7Sopenharmony_ci    return res;
12479a732c7Sopenharmony_ci}
12579a732c7Sopenharmony_ci
12679a732c7Sopenharmony_cibool IsArray(const nlohmann::json &jsonObj, const std::string &key)
12779a732c7Sopenharmony_ci{
12879a732c7Sopenharmony_ci    bool res = jsonObj.contains(key) && jsonObj[key].is_array();
12979a732c7Sopenharmony_ci    if (!res) {
13079a732c7Sopenharmony_ci        LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
13179a732c7Sopenharmony_ci    }
13279a732c7Sopenharmony_ci    return res;
13379a732c7Sopenharmony_ci}
13479a732c7Sopenharmony_ci
13579a732c7Sopenharmony_cibool IsBool(const nlohmann::json &jsonObj, const std::string &key)
13679a732c7Sopenharmony_ci{
13779a732c7Sopenharmony_ci    bool res = jsonObj.contains(key) && jsonObj[key].is_boolean();
13879a732c7Sopenharmony_ci    if (!res) {
13979a732c7Sopenharmony_ci        LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
14079a732c7Sopenharmony_ci    }
14179a732c7Sopenharmony_ci    return res;
14279a732c7Sopenharmony_ci}
14379a732c7Sopenharmony_ci
14479a732c7Sopenharmony_cistd::string ConvertMapToJsonString(const std::map<std::string, std::string> &paramMap)
14579a732c7Sopenharmony_ci{
14679a732c7Sopenharmony_ci    std::string jsonStr = "";
14779a732c7Sopenharmony_ci    if (paramMap.size() > MAX_MAP_LEN) {
14879a732c7Sopenharmony_ci        LOGE("invalid paramMap");
14979a732c7Sopenharmony_ci        return jsonStr;
15079a732c7Sopenharmony_ci    }
15179a732c7Sopenharmony_ci    if (!paramMap.empty()) {
15279a732c7Sopenharmony_ci        nlohmann::json jsonObj;
15379a732c7Sopenharmony_ci        for (const auto &it : paramMap) {
15479a732c7Sopenharmony_ci            jsonObj[it.first] = it.second;
15579a732c7Sopenharmony_ci        }
15679a732c7Sopenharmony_ci        jsonStr = jsonObj.dump();
15779a732c7Sopenharmony_ci    }
15879a732c7Sopenharmony_ci    return jsonStr;
15979a732c7Sopenharmony_ci}
16079a732c7Sopenharmony_ci
16179a732c7Sopenharmony_civoid ParseMapFromJsonString(const std::string &jsonStr, std::map<std::string, std::string> &paramMap)
16279a732c7Sopenharmony_ci{
16379a732c7Sopenharmony_ci    if (jsonStr.empty()) {
16479a732c7Sopenharmony_ci        return;
16579a732c7Sopenharmony_ci    }
16679a732c7Sopenharmony_ci    if (paramMap.size() > MAX_MAP_LEN) {
16779a732c7Sopenharmony_ci        LOGE("invalid paramMap");
16879a732c7Sopenharmony_ci        return;
16979a732c7Sopenharmony_ci    }
17079a732c7Sopenharmony_ci    nlohmann::json paramJson = nlohmann::json::parse(jsonStr, nullptr, false);
17179a732c7Sopenharmony_ci    if (paramJson.is_discarded()) {
17279a732c7Sopenharmony_ci        return;
17379a732c7Sopenharmony_ci    }
17479a732c7Sopenharmony_ci    for (auto &element : paramJson.items()) {
17579a732c7Sopenharmony_ci        if (element.value().is_string()) {
17679a732c7Sopenharmony_ci            paramMap.insert(std::pair<std::string, std::string>(element.key(), element.value()));
17779a732c7Sopenharmony_ci        }
17879a732c7Sopenharmony_ci    }
17979a732c7Sopenharmony_ci}
18079a732c7Sopenharmony_ci
18179a732c7Sopenharmony_cibool IsInvalidPeerTargetId(const PeerTargetId &targetId)
18279a732c7Sopenharmony_ci{
18379a732c7Sopenharmony_ci    return targetId.deviceId.empty() && targetId.brMac.empty() && targetId.bleMac.empty() && targetId.wifiIp.empty();
18479a732c7Sopenharmony_ci}
18579a732c7Sopenharmony_ci
18679a732c7Sopenharmony_cistd::string ConvertCharArray2String(const char *srcData, uint32_t srcLen)
18779a732c7Sopenharmony_ci{
18879a732c7Sopenharmony_ci    if (srcData == nullptr || srcLen == 0 || srcLen >= MAX_MESSAGE_LEN) {
18979a732c7Sopenharmony_ci        LOGE("Invalid parameter.");
19079a732c7Sopenharmony_ci        return "";
19179a732c7Sopenharmony_ci    }
19279a732c7Sopenharmony_ci    char *dstData = new char[srcLen + 1]();
19379a732c7Sopenharmony_ci    if (memcpy_s(dstData, srcLen + 1, srcData, srcLen) != 0) {
19479a732c7Sopenharmony_ci        LOGE("memcpy_s failed.");
19579a732c7Sopenharmony_ci        delete[] dstData;
19679a732c7Sopenharmony_ci        return "";
19779a732c7Sopenharmony_ci    }
19879a732c7Sopenharmony_ci    std::string temp(dstData);
19979a732c7Sopenharmony_ci    delete[] dstData;
20079a732c7Sopenharmony_ci    return temp;
20179a732c7Sopenharmony_ci}
20279a732c7Sopenharmony_ci
20379a732c7Sopenharmony_ciint32_t StringToInt(const std::string &str, int32_t base)
20479a732c7Sopenharmony_ci{
20579a732c7Sopenharmony_ci    if (str.empty()) {
20679a732c7Sopenharmony_ci        LOGE("Str is empty.");
20779a732c7Sopenharmony_ci        return 0;
20879a732c7Sopenharmony_ci    }
20979a732c7Sopenharmony_ci    char *nextPtr = nullptr;
21079a732c7Sopenharmony_ci    long result = strtol(str.c_str(), &nextPtr, base);
21179a732c7Sopenharmony_ci    if (errno == ERANGE || *nextPtr != '\0') {
21279a732c7Sopenharmony_ci        LOGE("parse int error");
21379a732c7Sopenharmony_ci        return 0;
21479a732c7Sopenharmony_ci    }
21579a732c7Sopenharmony_ci    return static_cast<int32_t>(result);
21679a732c7Sopenharmony_ci}
21779a732c7Sopenharmony_ci
21879a732c7Sopenharmony_ciint64_t StringToInt64(const std::string &str, int32_t base)
21979a732c7Sopenharmony_ci{
22079a732c7Sopenharmony_ci    if (str.empty()) {
22179a732c7Sopenharmony_ci        LOGE("Str is empty.");
22279a732c7Sopenharmony_ci        return 0;
22379a732c7Sopenharmony_ci    }
22479a732c7Sopenharmony_ci    char *nextPtr = nullptr;
22579a732c7Sopenharmony_ci    int64_t result = strtoll(str.c_str(), &nextPtr, base);
22679a732c7Sopenharmony_ci    if (errno == ERANGE || nextPtr == nullptr || nextPtr == str.c_str() || *nextPtr != '\0') {
22779a732c7Sopenharmony_ci        LOGE("parse int error");
22879a732c7Sopenharmony_ci        return 0;
22979a732c7Sopenharmony_ci    }
23079a732c7Sopenharmony_ci    return result;
23179a732c7Sopenharmony_ci}
23279a732c7Sopenharmony_ci
23379a732c7Sopenharmony_civoid VersionSplitToInt(const std::string &str, const char split, std::vector<int> &numVec)
23479a732c7Sopenharmony_ci{
23579a732c7Sopenharmony_ci    std::istringstream iss(str);
23679a732c7Sopenharmony_ci    std::string item = "";
23779a732c7Sopenharmony_ci    while (getline(iss, item, split)) {
23879a732c7Sopenharmony_ci        numVec.push_back(atoi(item.c_str()));
23979a732c7Sopenharmony_ci    }
24079a732c7Sopenharmony_ci}
24179a732c7Sopenharmony_ci
24279a732c7Sopenharmony_cibool CompareVecNum(const std::vector<int32_t> &srcVecNum, const std::vector<int32_t> &sinkVecNum)
24379a732c7Sopenharmony_ci{
24479a732c7Sopenharmony_ci    for (uint32_t index = 0; index < std::min(srcVecNum.size(), sinkVecNum.size()); index++) {
24579a732c7Sopenharmony_ci        if (srcVecNum[index] > sinkVecNum[index]) {
24679a732c7Sopenharmony_ci            return true;
24779a732c7Sopenharmony_ci        } else if (srcVecNum[index] < sinkVecNum[index]) {
24879a732c7Sopenharmony_ci            return false;
24979a732c7Sopenharmony_ci        } else {
25079a732c7Sopenharmony_ci            continue;
25179a732c7Sopenharmony_ci        }
25279a732c7Sopenharmony_ci    }
25379a732c7Sopenharmony_ci    if (srcVecNum.size() > sinkVecNum.size()) {
25479a732c7Sopenharmony_ci        return true;
25579a732c7Sopenharmony_ci    }
25679a732c7Sopenharmony_ci    return false;
25779a732c7Sopenharmony_ci}
25879a732c7Sopenharmony_ci
25979a732c7Sopenharmony_cibool CompareVersion(const std::string &remoteVersion, const std::string &oldVersion)
26079a732c7Sopenharmony_ci{
26179a732c7Sopenharmony_ci    LOGI("remoteVersion %{public}s, oldVersion %{public}s.", remoteVersion.c_str(), oldVersion.c_str());
26279a732c7Sopenharmony_ci    std::vector<int32_t> remoteVersionVec;
26379a732c7Sopenharmony_ci    std::vector<int32_t> oldVersionVec;
26479a732c7Sopenharmony_ci    VersionSplitToInt(remoteVersion, '.', remoteVersionVec);
26579a732c7Sopenharmony_ci    VersionSplitToInt(oldVersion, '.', oldVersionVec);
26679a732c7Sopenharmony_ci    return CompareVecNum(remoteVersionVec, oldVersionVec);
26779a732c7Sopenharmony_ci}
26879a732c7Sopenharmony_ci} // namespace DistributedHardware
26979a732c7Sopenharmony_ci} // namespace OHOS