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> ¶mMap) 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> ¶mMap) 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