1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "dm_anonymous.h"
17 #include "dm_log.h"
18 #include <sstream>
19 namespace OHOS {
20 namespace DistributedHardware {
21 namespace {
22 constexpr uint32_t MAX_MESSAGE_LEN = 40 * 1024 * 1024;
23 constexpr int32_t INT32_SHORT_ID_LENGTH = 20;
24 constexpr int32_t INT32_PLAINTEXT_LENGTH = 4;
25 constexpr int32_t INT32_MIN_ID_LENGTH = 3;
26 constexpr int32_t MIN_ASCLL_NUM = 48;
27 constexpr int32_t MAX_ASCLL_NUM = 57;
28 }
29 
GetAnonyString(const std::string & value)30 std::string GetAnonyString(const std::string &value)
31 {
32     std::string tmpStr("******");
33     size_t strLen = value.length();
34     if (strLen < INT32_MIN_ID_LENGTH) {
35         return tmpStr;
36     }
37 
38     std::string res;
39     if (strLen <= INT32_SHORT_ID_LENGTH) {
40         res += value[0];
41         res += tmpStr;
42         res += value[strLen - 1];
43     } else {
44         res.append(value, 0, INT32_PLAINTEXT_LENGTH);
45         res += tmpStr;
46         res.append(value, strLen - INT32_PLAINTEXT_LENGTH, INT32_PLAINTEXT_LENGTH);
47     }
48 
49     return res;
50 }
51 
GetAnonyInt32(const int32_t value)52 std::string GetAnonyInt32(const int32_t value)
53 {
54     std::string tempString = std::to_string(value);
55     size_t length = tempString.length();
56     if (length == 0x01) {
57         tempString[0] = '*';
58         return tempString;
59     }
60     for (size_t i = 1; i < length - 1; i++) {
61         tempString[i] = '*';
62     }
63     return tempString;
64 }
65 
IsNumberString(const std::string & inputString)66 bool IsNumberString(const std::string &inputString)
67 {
68     LOGI("IsNumberString for DeviceManagerNapi");
69     if (inputString.length() == 0) {
70         LOGE("inputString is Null");
71         return false;
72     }
73     for (size_t i = 0; i < inputString.length(); i++) {
74         int num = (int)inputString[i];
75         if (num >= MIN_ASCLL_NUM && num <= MAX_ASCLL_NUM) {
76             continue;
77         } else {
78             return false;
79         }
80     }
81     return true;
82 }
83 
IsString(const nlohmann::json & jsonObj,const std::string & key)84 bool IsString(const nlohmann::json &jsonObj, const std::string &key)
85 {
86     bool res = jsonObj.contains(key) && jsonObj[key].is_string() && jsonObj[key].size() <= MAX_MESSAGE_LEN;
87     if (!res) {
88         LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
89     }
90     return res;
91 }
92 
IsInt32(const nlohmann::json & jsonObj,const std::string & key)93 bool IsInt32(const nlohmann::json &jsonObj, const std::string &key)
94 {
95     bool res = jsonObj.contains(key) && jsonObj[key].is_number_integer() && jsonObj[key] >= INT32_MIN &&
96         jsonObj[key] <= INT32_MAX;
97     if (!res) {
98         LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
99     }
100     return res;
101 }
102 
IsUint32(const nlohmann::json & jsonObj,const std::string & key)103 bool IsUint32(const nlohmann::json &jsonObj, const std::string &key)
104 {
105     bool res = jsonObj.contains(key) && jsonObj[key].is_number_unsigned() && jsonObj[key] >= 0 &&
106         jsonObj[key] <= UINT32_MAX;
107     if (!res) {
108         LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
109     }
110     return res;
111 }
112 
IsInt64(const nlohmann::json & jsonObj,const std::string & key)113 bool IsInt64(const nlohmann::json &jsonObj, const std::string &key)
114 {
115     bool res = jsonObj.contains(key) && jsonObj[key].is_number_integer() && jsonObj[key] >= INT64_MIN &&
116         jsonObj[key] <= INT64_MAX;
117     if (!res) {
118         LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
119     }
120     return res;
121 }
122 
IsArray(const nlohmann::json & jsonObj,const std::string & key)123 bool IsArray(const nlohmann::json &jsonObj, const std::string &key)
124 {
125     bool res = jsonObj.contains(key) && jsonObj[key].is_array();
126     if (!res) {
127         LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
128     }
129     return res;
130 }
131 
IsBool(const nlohmann::json & jsonObj,const std::string & key)132 bool IsBool(const nlohmann::json &jsonObj, const std::string &key)
133 {
134     bool res = jsonObj.contains(key) && jsonObj[key].is_boolean();
135     if (!res) {
136         LOGE("the key %{public}s in jsonObj is invalid.", key.c_str());
137     }
138     return res;
139 }
140 
ConvertMapToJsonString(const std::map<std::string,std::string> & paramMap)141 std::string ConvertMapToJsonString(const std::map<std::string, std::string> &paramMap)
142 {
143     std::string jsonStr = "";
144     if (!paramMap.empty()) {
145         nlohmann::json jsonObj;
146         for (const auto &it : paramMap) {
147             jsonObj[it.first] = it.second;
148         }
149         jsonStr = jsonObj.dump();
150     }
151     return jsonStr;
152 }
153 
ParseMapFromJsonString(const std::string & jsonStr,std::map<std::string,std::string> & paramMap)154 void ParseMapFromJsonString(const std::string &jsonStr, std::map<std::string, std::string> &paramMap)
155 {
156     if (jsonStr.empty()) {
157         return;
158     }
159     nlohmann::json paramJson = nlohmann::json::parse(jsonStr, nullptr, false);
160     if (paramJson.is_discarded()) {
161         return;
162     }
163     for (auto &element : paramJson.items()) {
164         if (element.value().is_string()) {
165             paramMap.insert(std::pair<std::string, std::string>(element.key(), element.value()));
166         }
167     }
168 }
169 
IsInvalidPeerTargetId(const PeerTargetId & targetId)170 bool IsInvalidPeerTargetId(const PeerTargetId &targetId)
171 {
172     return targetId.deviceId.empty() && targetId.brMac.empty() && targetId.bleMac.empty() && targetId.wifiIp.empty();
173 }
174 
ConvertCharArray2String(const char * srcData,uint32_t srcLen)175 std::string ConvertCharArray2String(const char *srcData, uint32_t srcLen)
176 {
177     if (srcData == nullptr || srcLen == 0 || srcLen >= MAX_MESSAGE_LEN) {
178         LOGE("Invalid parameter.");
179         return "";
180     }
181     char *dstData = new char[srcLen + 1]();
182     if (memcpy_s(dstData, srcLen + 1, srcData, srcLen) != 0) {
183         LOGE("memcpy_s failed.");
184         delete[] dstData;
185         return "";
186     }
187     std::string temp(dstData);
188     delete[] dstData;
189     return temp;
190 }
191 
VersionSplitToInt(const std::string & str,const char split,std::vector<int> & numVec)192 void VersionSplitToInt(const std::string &str, const char split, std::vector<int> &numVec)
193 {
194     std::istringstream iss(str);
195     std::string item = "";
196     while (getline(iss, item, split)) {
197         numVec.push_back(atoi(item.c_str()));
198     }
199 }
200 
CompareVecNum(const std::vector<int32_t> & srcVecNum,const std::vector<int32_t> & sinkVecNum)201 bool CompareVecNum(const std::vector<int32_t> &srcVecNum, const std::vector<int32_t> &sinkVecNum)
202 {
203     for (uint32_t index = 0; index < std::min(srcVecNum.size(), sinkVecNum.size()); index++) {
204         if (srcVecNum[index] > sinkVecNum[index]) {
205             return true;
206         } else if (srcVecNum[index] < sinkVecNum[index]) {
207             return false;
208         } else {
209             continue;
210         }
211     }
212     if (srcVecNum.size() > sinkVecNum.size()) {
213         return true;
214     }
215     return false;
216 }
217 
StringToInt(const std::string & str,int32_t base)218 int32_t StringToInt(const std::string &str, int32_t base)
219 {
220     if (str.empty()) {
221         LOGE("Str is empty.");
222         return 0;
223     }
224     char *nextPtr = nullptr;
225     long result = strtol(str.c_str(), &nextPtr, base);
226     if (errno == ERANGE || *nextPtr != '\0') {
227         LOGE("parse int error");
228         return 0;
229     }
230     return static_cast<int32_t>(result);
231 }
232 } // namespace DistributedHardware
233 } // namespace OHOS