#include "../../../../common/rpc/rpc.h" #include "../include/parsefile.h" #include "../include/configm.h" #include "../../../netlink_uapi/libnetlinku.h" #include #include "../../../../../Common/s2j/s2j.h" #include "../../../../../Common/commuapinl.h" #include "../include/userlock.h" /*全局变量,存放锁定功能的信息 */ userlock_configure_t *userlock; /*全局变量初始化 失败为1 成功为0*/ int Init(userlock_configure_t **userlock) { *userlock = (userlock_configure_t *)malloc(sizeof(userlock_configure_t)); if (NULL == *userlock) { return 1; } return 0; } /*判断锁定配置信息是否有效,时间范围大于0,失败的次数大于0,锁定时间大于0 */ /*input格式 "{\"type\":0, \"failcount\":10, \"locktime\":30, \"timehorizon\":30, \"logintime\":3213250}"*/ ret_code userlock_config_chk(uint source, uint *config_type, pointer input, int *input_len, pointer output, int *output_len) { ret_code ret = RET_OK; cJSON *cjson; /*JSON字符串到JSON格式 */ cjson = cJSON_Parse(input); if(!cjson) { ret = RET_INPUTERR; ASSERT_RET(ret); return ret; } /*创建freeauth_configure_t结构体对象 */ s2j_create_struct_obj(struct_userlock, userlock_configure_t); /*反序列化数据到freeauth_configure_t结构体对象 */ s2j_struct_get_basic_element(struct_userlock, cjson, int, failcount); s2j_struct_get_basic_element(struct_userlock, cjson, int, locktime); s2j_struct_get_basic_element(struct_userlock, cjson, int, timehorizon); s2j_struct_get_basic_element(struct_userlock, cjson, int, logintime); rpc_log_info("userlock configure: 登录时间: %d 用户认证失败次数: %d 用户认证的时间范围: %d 用户锁定时间: %ld\n", struct_userlock->logintime, struct_userlock->failcount, struct_userlock->timehorizon, struct_userlock->locktime); if((*input_len < sizeof(userlock_configure_t)) || (*input_len > sizeof(userlock_configure_t))) { free(struct_userlock); cJSON_Delete(cjson); ret = RET_INPUTERR; ASSERT_RET(ret); return ret; } /*配置的用户失败次数如果小于0,则配置错误 */ if(struct_userlock->failcount < FAIL_MIN_NUM ) { free(struct_userlock); cJSON_Delete(cjson); ret = RET_ERR; ASSERT_RET(ret); return ret; printf("userlock configure error\n"); } /*配置的用户锁定时间如果小于0,则配置错误 */ if(struct_userlock->locktime < LOCK_MIN_TIME ) { free(struct_userlock); cJSON_Delete(cjson); ret = RET_ERR; ASSERT_RET(ret); return ret; printf("locktime configure error\n"); } /*配置的用户认证时间范围如果小于0,则配置错误 */ if(struct_userlock->timehorizon < HORIZON_MIN_VALUE ) { free(struct_userlock); cJSON_Delete(cjson); ret = RET_ERR; ASSERT_RET(ret); return ret; printf("timehorizon configure error\n"); } ASSERT_RET(ret); free(struct_userlock); cJSON_Delete(cjson); return RET_OK; } /*系统管理模块将数据内容(IP地址、端口号)发送给web server */ ret_code userlock_config_proc(uint source, uint config_type, pointer input, int input_len, pointer output, int *output_len) { ret_code ret = RET_OK; cJSON *cjson, *res; char *ret_char = NULL; unsigned int ret_int = 0; /*JSON字符串到JSON格式 */ cjson = cJSON_Parse(input); if(!cjson) { ret = RET_INPUTERR; ASSERT_RET(ret); return ret; } /*创建freeauth_configure_t结构体对象 */ s2j_create_struct_obj(struct_userlock, userlock_configure_t); /*反序列化数据到freeauth_configure_t结构体对象 */ s2j_struct_get_basic_element(struct_userlock, cjson, int, failcount); s2j_struct_get_basic_element(struct_userlock, cjson, int, locktime); s2j_struct_get_basic_element(struct_userlock, cjson, int, timehorizon); s2j_struct_get_basic_element(struct_userlock, cjson, int, logintime); rpc_log_info("userlock configure: 登录时间: %d 用户认证失败次数: %d 用户认证的时间范围: %d 用户锁定时间: %ld\n", struct_userlock->logintime, struct_userlock->failcount, struct_userlock->timehorizon, struct_userlock->locktime); /*将配置信息struct_userlock发送到数据库 发送结果int类型表示,0表示发送成功,-1表示发送失败 */ int r; /*创建json对象 */ res = cJSON_CreateObject(); if(!res) { ret = RET_ERR; ASSERT_RET(ret); return ret; } cJSON_AddNumberToObject(res, "result", r); /*将json对象转换成json字符串 */ ret_char = cJSON_PrintUnformatted(res); ret_int = strlen(ret_char); if(output_len) { *output_len = ret_int; } /*超出2k的内存,报错 */ if(ret_int >= 1024 * 2) { free(struct_userlock); cJSON_Delete(cjson); free(ret_char); cJSON_Delete(res); return RET_NOMEM; } memcpy(output, 0, ret_int + 1); strcpy(output, ret_char); free(ret_char); cJSON_Delete(res); cJSON_Delete(cjson); /*把本地Portal server的配置信息存入全局变量 */ userlock->failcount = struct_userlock->failcount; free(struct_userlock); return RET_OK; }