这个是通过网页设置time setting的函数,其在设置ntp_svr1和ntp_svr2的时候没有对地址的合法性进行检测,现在需要对其进行合法性检测,该怎么修改?后面是我使用CLI进行设置time setting的函数,其具有地址的合法性检测,模仿其合法性检测即可
APPL_ERRCODE sysTimeSettingSetHandle(UI_CTX *ctx)
{
int ret = ERR_NO_ERROR;
TIMESET_LOG_DBG_INFO("Enter sysTimeSettingSetHandle");
JSON_Value *rspVal = json_value_init_object();
JSON_Object *rspObj = json_value_get_object(rspVal);
JSON_Value *retVal = json_value_init_object();
JSON_Object *retObj = json_value_get_object(retVal);
char setTimeStr[SYSTIME_STR_LENGTH] = {0};
ret = httpConvertForm2Json(ctx, &ctx->param);
if (ERR_OK != ret)
{
DBG_ALZ("failed(%d) to httpConvertForm2Json", ret);
return ret;
}
JSON_Object *params = json_object_get_object(ctx->param, SYSTIME_REQ_PARAMS);
params = params ? params : NULL;
const char *systimeType = json_object_get_string(params, SYSTIME_REQ_TYPE);
systimeType = systimeType ? systimeType : "";
// 不需要区分manual或同步PC
if (0 == strcmp(systimeType, "manual"))
{
const char *date = json_object_get_string(params, SYSTIME_REQ_DATE);
date = date ? date : "";
const char *time = json_object_get_string(params, SYSTIME_REQ_TIME);
time = time ? time : "";
TIMESET_LOG_DBG_INFO("systimeType[%s], date[%s], time[%s]", systimeType, date, time);
// 手动设置时间
if (0 == strcmp(date, "") || 0 == strcmp(time, ""))
{
DBG_ALZ("Bad param. date[%s],time[%s]", date, time);
ret = ERR_BAD_PARAM;
goto done;
}
// /* MM/DD/YYYY-HH:MM:SS format */
snprintf(setTimeStr, SYSTIME_STR_LENGTH, "%s-%s", date, time);
TIMESET_LOG_DBG_INFO("set configDB TimeStr[%s]", setTimeStr);
APPL_IF_ERR_DONE(ret, sysTimeManuallySet(TIME_MANUAL, setTimeStr));
APPL_IF_ERR_DONE(ret, _fillSystimeRetObj(retObj));
json_object_set_string(retObj, SYSTIME_RSP_TYPE, systimeType);
json_object_set_string(retObj, SYSTIME_RSP_DATE, date);
json_object_set_string(retObj, SYSTIME_RSP_TIME, time);
}
else if (0 == strcmp(systimeType, "auto"))
{
// 通过ntp设置时间
SNTP_CFG_T ntpSet = {0};
const char *timeZoneStr = json_object_get_string(params, SYSTIME_REQ_NTP_ZONE);
timeZoneStr = timeZoneStr ? timeZoneStr : "";
const char *ntpSrv1 = json_object_get_string(params, SYSTIME_REQ_NTP_SVR1);
ntpSrv1 = ntpSrv1 ? ntpSrv1 : "";
const char *ntpSrv2 = json_object_get_string(params, SYSTIME_REQ_NTP_SVR2);
ntpSrv2 = ntpSrv2 ? ntpSrv2 : "";
int timezone = atoi(timeZoneStr);
APPL_ENSURE_DONE(ret, SYSTIME_TIMEZONE_IS_VALID(timezone), ERR_BAD_PARAM);
APPL_ENSURE_DONE(ret, (0!=strcmp(ntpSrv1,"")) && (0!=strcmp(ntpSrv2,"")), ERR_BAD_PARAM);
memset(&ntpSet, 0, sizeof(SNTP_CFG_T));
ntpSet.updateRate = DEFAULT_UPDATE_PEROID;
ntpSet.timeZone = SYSTIME_TIMEZONE_TO_UTC(timezone);
TIMESET_LOG_DBG_INFO("timezone web to utc[%d]", ntpSet.timeZone);
ntpSet.timeZone = SYSTIME_TIMEZONE_TO_SET(ntpSet.timeZone);
TIMESET_LOG_DBG_INFO("timezone uct to set configDB[%d]", ntpSet.timeZone);
ntpSet.cfgServerNum = 2;
snprintf(ntpSet.cfgServer[0], NTPSERVER_MAX_LEN, "%s", ntpSrv1);
snprintf(ntpSet.cfgServer[1], NTPSERVER_MAX_LEN, "%s", ntpSrv2);
APPL_IF_ERR_DONE(ret, sysTimeNtpCfgSet(ntpSet, TRUE));
APPL_IF_ERR_DONE(ret, _fillSysdate(retObj));
APPL_IF_ERR_DONE(ret, _fillSystimeRetObj(retObj));
json_object_set_string(retObj, SYSTIME_RSP_TYPE, systimeType);
}
else
{
DBG_ALZ("Bad param. systimeType[%s]", systimeType);
ret = ERR_BAD_PARAM;
goto done;
}
json_object_set_value(rspObj, SYSTIME_RSP_RESULT, retVal);
json_object_set_string(rspObj, SYSTIME_RSP_ERRCODE, "0");
json_object_set_number(rspObj, SYSTIME_RSP_ID, 1);
ctx->rsp = rspVal;
done:
return ret;
}
这是CLI的函数
int cli_sysTimeNtpSetCpn(IN cli_env *pCliEnv, IN int timeZone, IN char *server1, IN char *server2, IN int period)
{
DBG_INFO_DEBUG("Enter cli_sysTimeNtpSetCpn");
DBG_INFO_DEBUG("timeZone:%d, server1:%s, server2:%s, period:%d", timeZone, server1, server2, period);
int ret = ERR_NO_ERROR;
SNTP_CFG_T sntpCfg = {0};
APPL_ENSURE_DONE(ret, pCliEnv && server1 && server2, ERR_BAD_PARAM);
memset(&sntpCfg, 0, sizeof(SNTP_CFG_T));
/* required parameters */
if (!IS_SYSTIME_NTP_PERIOD_VALID(period))
{
DBG_INFO_ERROR("invalid NTP period");
ret = ERR_SYSTIME_INVALID_NTP_PERIOD;
goto done;
}
sntpCfg.updateRate = period;
// TODO: 改成标准协议的时区后再校验合法性
sntpCfg.timeZone = SYSTIME_TIME_ZONE_STANDARDIZE(timeZone);
DBG_INFO_DEBUG("set to configDB timezone[%d]", sntpCfg.timeZone);
APPL_IF_ERR_DONE(ret, sysTimeNtpServeraddrIsValidCpn(server1));
APPL_IF_ERR_DONE(ret, sysTimeNtpServeraddrIsValidCpn(server2));
sntpCfg.cfgServerNum = 2;
snprintf(sntpCfg.cfgServer[0], NTPSERVER_MAX_LEN, "%s", server1);
snprintf(sntpCfg.cfgServer[1], NTPSERVER_MAX_LEN, "%s", server2);
APPL_IF_ERR_DONE(ret, sysTimeNtpCfgSet(sntpCfg, TRUE));
done:
cli_sysTimePrintError(pCliEnv, ret);
return ERR_NO_ERROR;
}
static int sysTimeNtpServeraddrIsValidCpn(IN const char *ntpServerAddr)
{
DBG_INFO_DEBUG("ntpServerAddr:%s", ntpServerAddr);
int i = 0;
int letterFlag = 0;
struct in6_addr ipv6Addr = {0};
unsigned int ipv4Addr = 0;
APPL_ENSURE_RET(ntpServerAddr);
/* IPv6 addr */
if (strchr(ntpServerAddr,':'))
{
if (GL_OK == ip6HostIpStrToNet((char *)ntpServerAddr, &ipv6Addr))
{
DBG("it's valid IPv6 addr");
return ERR_NO_ERROR;
}
return ERR_SYSTIME_INVALID_NTP_IPV6;
}
else
{
for (i = 0; i < strlen(ntpServerAddr); i++)
{
if ((ntpServerAddr[i] >= 'a' && ntpServerAddr[i] <= 'z')
|| (ntpServerAddr[i] >= 'A' && ntpServerAddr[i] <= 'Z'))
{
letterFlag = 1;
break;
}
}
/* include letter, it's domain name */
if (letterFlag)
{
/* domain name */
if (GL_OK == sysTimeIsDomainNameValidCpn(ntpServerAddr))
{
DBG_INFO_DEBUG("it's valid domain name addr");
return ERR_NO_ERROR;
}
return ERR_SYSTIME_INVALID_NTP_DOMAIN_NAME;
}
else /* IPv4 addr */
{
if (GL_OK == ip4HostIpStrToNet((char *)ntpServerAddr, &ipv4Addr))
{
DBG_INFO_DEBUG("it's valid IPv4 addr");
return ERR_NO_ERROR;
}
else
{
if (0 == ipv4Addr)
{
DBG_INFO_DEBUG("netServerAddr[%s] is valid addr", ntpServerAddr);
return ERR_NO_ERROR;
}
}
return ERR_SYSTIME_INVALID_NTP_IPV4;
}
}
DBG_INFO_DEBUG("it's invalid addr");
return ERR_SYSTIME_INVALID_NTP_SERVER_ADDR;
}