1518678f8Sopenharmony_ci/*
2518678f8Sopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
3518678f8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4518678f8Sopenharmony_ci * you may not use this file except in compliance with the License.
5518678f8Sopenharmony_ci * You may obtain a copy of the License at
6518678f8Sopenharmony_ci *
7518678f8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8518678f8Sopenharmony_ci *
9518678f8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10518678f8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11518678f8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12518678f8Sopenharmony_ci * See the License for the specific language governing permissions and
13518678f8Sopenharmony_ci * limitations under the License.
14518678f8Sopenharmony_ci */
15518678f8Sopenharmony_ci
16518678f8Sopenharmony_ci#include "dhcp_common_utils.h"
17518678f8Sopenharmony_ci#include <arpa/inet.h>
18518678f8Sopenharmony_ci#include <netinet/if_ether.h>
19518678f8Sopenharmony_ci#include <regex>
20518678f8Sopenharmony_ci#include "securec.h"
21518678f8Sopenharmony_ci#include "dhcp_logger.h"
22518678f8Sopenharmony_ci
23518678f8Sopenharmony_cinamespace OHOS {
24518678f8Sopenharmony_cinamespace DHCP {
25518678f8Sopenharmony_ciDEFINE_DHCPLOG_DHCP_LABEL("DhcpCommonUtils");
26518678f8Sopenharmony_ci
27518678f8Sopenharmony_ciconstexpr int32_t GATEWAY_MAC_LENTH = 18;
28518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_0 = 0;
29518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_1 = 1;
30518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_2 = 2;
31518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_3 = 3;
32518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_4 = 4;
33518678f8Sopenharmony_ciconstexpr int32_t MAC_INDEX_5 = 5;
34518678f8Sopenharmony_ci
35518678f8Sopenharmony_cistd::string Ipv4Anonymize(const std::string str)
36518678f8Sopenharmony_ci{
37518678f8Sopenharmony_ci    std::string strTemp = str;
38518678f8Sopenharmony_ci    std::string::size_type begin = strTemp.find_last_of('.');
39518678f8Sopenharmony_ci    while (begin < strTemp.length()) {
40518678f8Sopenharmony_ci        if (strTemp[begin] != '.') {
41518678f8Sopenharmony_ci            strTemp[begin] = '*';
42518678f8Sopenharmony_ci        }
43518678f8Sopenharmony_ci        begin++;
44518678f8Sopenharmony_ci    }
45518678f8Sopenharmony_ci    return strTemp;
46518678f8Sopenharmony_ci}
47518678f8Sopenharmony_ci
48518678f8Sopenharmony_cichar *UintIp4ToStr(uint32_t uIp, bool bHost)
49518678f8Sopenharmony_ci{
50518678f8Sopenharmony_ci    char bufIp4[INET_ADDRSTRLEN] = {0};
51518678f8Sopenharmony_ci    struct in_addr addr4;
52518678f8Sopenharmony_ci    if (bHost) {
53518678f8Sopenharmony_ci        addr4.s_addr = htonl(uIp);
54518678f8Sopenharmony_ci    } else {
55518678f8Sopenharmony_ci        addr4.s_addr = uIp;
56518678f8Sopenharmony_ci    }
57518678f8Sopenharmony_ci    const char *p = inet_ntop(AF_INET, &addr4, bufIp4, INET_ADDRSTRLEN);
58518678f8Sopenharmony_ci    if (p == nullptr) {
59518678f8Sopenharmony_ci        DHCP_LOGE("UintIp4ToStr inet_ntop p == nullptr!");
60518678f8Sopenharmony_ci        return nullptr;
61518678f8Sopenharmony_ci    }
62518678f8Sopenharmony_ci    char *strIp = static_cast<char *>(malloc(INET_ADDRSTRLEN));
63518678f8Sopenharmony_ci    if (strIp == nullptr) {
64518678f8Sopenharmony_ci        DHCP_LOGE("UintIp4ToStr strIp malloc failed!");
65518678f8Sopenharmony_ci        return nullptr;
66518678f8Sopenharmony_ci    }
67518678f8Sopenharmony_ci    if (strncpy_s(strIp, INET_ADDRSTRLEN, bufIp4, strlen(bufIp4)) != EOK) {
68518678f8Sopenharmony_ci        DHCP_LOGE("UintIp4ToStr strIp strncpy_s failed!");
69518678f8Sopenharmony_ci        free(strIp);
70518678f8Sopenharmony_ci        strIp = nullptr;
71518678f8Sopenharmony_ci        return nullptr;
72518678f8Sopenharmony_ci    }
73518678f8Sopenharmony_ci    return strIp;
74518678f8Sopenharmony_ci}
75518678f8Sopenharmony_ci
76518678f8Sopenharmony_cistd::string IntIpv4ToAnonymizeStr(uint32_t ip)
77518678f8Sopenharmony_ci{
78518678f8Sopenharmony_ci    std::string strTemp = "";
79518678f8Sopenharmony_ci    char *pIp = UintIp4ToStr(ip, false);
80518678f8Sopenharmony_ci    if (pIp != nullptr) {
81518678f8Sopenharmony_ci        strTemp = Ipv4Anonymize(pIp);
82518678f8Sopenharmony_ci        free(pIp);
83518678f8Sopenharmony_ci        pIp = nullptr;
84518678f8Sopenharmony_ci    }
85518678f8Sopenharmony_ci    return strTemp;
86518678f8Sopenharmony_ci}
87518678f8Sopenharmony_ci
88518678f8Sopenharmony_cistd::string MacArray2Str(uint8_t *macArray, int32_t len)
89518678f8Sopenharmony_ci{
90518678f8Sopenharmony_ci    if ((macArray == nullptr) || (len != ETH_ALEN)) {
91518678f8Sopenharmony_ci        DHCP_LOGE("MacArray2Str arg is invalid!");
92518678f8Sopenharmony_ci        return "";
93518678f8Sopenharmony_ci    }
94518678f8Sopenharmony_ci
95518678f8Sopenharmony_ci    char gwMacAddr[GATEWAY_MAC_LENTH] = {0};
96518678f8Sopenharmony_ci    if (sprintf_s(gwMacAddr, sizeof(gwMacAddr), "%02x:%02x:%02x:%02x:%02x:%02x", macArray[MAC_INDEX_0],
97518678f8Sopenharmony_ci        macArray[MAC_INDEX_1], macArray[MAC_INDEX_2], macArray[MAC_INDEX_3], macArray[MAC_INDEX_4],
98518678f8Sopenharmony_ci        macArray[MAC_INDEX_5]) < 0) {
99518678f8Sopenharmony_ci        DHCP_LOGE("MacArray2Str sprintf_s err");
100518678f8Sopenharmony_ci        return "";
101518678f8Sopenharmony_ci    }
102518678f8Sopenharmony_ci    std::string ret = gwMacAddr;
103518678f8Sopenharmony_ci    return ret;
104518678f8Sopenharmony_ci}
105518678f8Sopenharmony_ci
106518678f8Sopenharmony_ciint CheckDataLegal(std::string &data, int base)
107518678f8Sopenharmony_ci{
108518678f8Sopenharmony_ci    std::regex pattern("\\d+");
109518678f8Sopenharmony_ci    if (!std::regex_search(data, pattern)) {
110518678f8Sopenharmony_ci        return 0;
111518678f8Sopenharmony_ci    }
112518678f8Sopenharmony_ci    errno = 0;
113518678f8Sopenharmony_ci    char *endptr = nullptr;
114518678f8Sopenharmony_ci    long int num = std::strtol(data.c_str(), &endptr, base);
115518678f8Sopenharmony_ci    if (errno == ERANGE) {
116518678f8Sopenharmony_ci        DHCP_LOGE("CheckDataLegal errno == ERANGE, data:%{private}s", data.c_str());
117518678f8Sopenharmony_ci        return 0;
118518678f8Sopenharmony_ci    }
119518678f8Sopenharmony_ci    return static_cast<int>(num);
120518678f8Sopenharmony_ci}
121518678f8Sopenharmony_ci
122518678f8Sopenharmony_ciunsigned int CheckDataToUint(std::string &data, int base)
123518678f8Sopenharmony_ci{
124518678f8Sopenharmony_ci    std::regex pattern("\\d+");
125518678f8Sopenharmony_ci    std::regex patternTmp("-\\d+");
126518678f8Sopenharmony_ci    if (!std::regex_search(data, pattern) || std::regex_search(data, patternTmp)) {
127518678f8Sopenharmony_ci        DHCP_LOGE("CheckDataToUint regex unsigned int value fail, data:%{private}s", data.c_str());
128518678f8Sopenharmony_ci        return 0;
129518678f8Sopenharmony_ci    }
130518678f8Sopenharmony_ci    errno = 0;
131518678f8Sopenharmony_ci    char *endptr = nullptr;
132518678f8Sopenharmony_ci    unsigned long int num = std::strtoul(data.c_str(), &endptr, base);
133518678f8Sopenharmony_ci    if (errno == ERANGE) {
134518678f8Sopenharmony_ci        DHCP_LOGE("CheckDataToUint errno == ERANGE, data:%{private}s", data.c_str());
135518678f8Sopenharmony_ci        return 0;
136518678f8Sopenharmony_ci    }
137518678f8Sopenharmony_ci    return static_cast<unsigned int>(num);
138518678f8Sopenharmony_ci}
139518678f8Sopenharmony_ci
140518678f8Sopenharmony_cilong long CheckDataTolonglong(std::string &data, int base)
141518678f8Sopenharmony_ci{
142518678f8Sopenharmony_ci    std::regex pattern("\\d+");
143518678f8Sopenharmony_ci    if (!std::regex_search(data, pattern)) {
144518678f8Sopenharmony_ci        return 0;
145518678f8Sopenharmony_ci    }
146518678f8Sopenharmony_ci    errno = 0;
147518678f8Sopenharmony_ci    char *endptr = nullptr;
148518678f8Sopenharmony_ci    long long int num = std::strtoll(data.c_str(), &endptr, base);
149518678f8Sopenharmony_ci    if (errno == ERANGE) {
150518678f8Sopenharmony_ci        DHCP_LOGE("CheckDataTolonglong errno == ERANGE, data:%{private}s", data.c_str());
151518678f8Sopenharmony_ci        return 0;
152518678f8Sopenharmony_ci    }
153518678f8Sopenharmony_ci    return num;
154518678f8Sopenharmony_ci}
155518678f8Sopenharmony_ci
156518678f8Sopenharmony_ciint64_t GetElapsedSecondsSinceBoot()
157518678f8Sopenharmony_ci{
158518678f8Sopenharmony_ci    struct timespec times = {0, 0};
159518678f8Sopenharmony_ci    clock_gettime(CLOCK_BOOTTIME, &times);
160518678f8Sopenharmony_ci    return static_cast<int64_t>(times.tv_sec);
161518678f8Sopenharmony_ci}
162518678f8Sopenharmony_ci}
163518678f8Sopenharmony_ci}
164