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