secgateway/Product/user/user_auth/web_auth.c

189 lines
5.2 KiB
C
Raw Normal View History

#include <stdio.h>
#include <string.h>
#include <cjson/cJSON.h>
#include "web_auth.h"
#include "user_hashtable.h"
/*输入参数:用户名、密码,json格式*/
/*输出参数resultcode、描述信息message、剩余锁定时间remain_lock_time(认证成功和失败的情况下剩余锁定时间默认为0) */
/*location:url location之后get方法判断是否是get方法 url的时候要判断下这个用户是否已经认证过*/
/* 用户认证 */
void user_auth_login(char* username, char* password, USER_AUTH_RET* auth_result);
char * mes[]={"SUCCESS", "ErrorUsernameOrpassword", "NotInVaildTime",
"OutMaxOnlineNum", "UserIsLocked", "LackConfigInfo",
"OverMaxOnlineNum", "OtherErr"};
/*content形式 {"username":"adimn", "password":"admin"} */
ret_code user_auth(pointer content, RESULT *uresult)
{
ret_code ret = RET_OK;
cJSON *cjson;
USER_AUTH_RET *resultinfo;
time_t time = 0;
memset(uresult, 0, sizeof(RESULT));
/*创建内存地址 */
resultinfo = (USER_AUTH_RET *)malloc(sizeof(USER_AUTH_RET));
if (NULL == resultinfo)
{
ret = RET_NOMEM;
return ret;
}
/*JSON字符串到JSON格式 */
cjson = cJSON_Parse(content);
if(!cjson)
{
ret = RET_INPUTERR;
return ret;
}
/*获取用户名 */
char *uname = cJSON_GetObjectItem(cjson , "username")->valuestring;
printf("username :%s\n", uname);
/*判断username长度是否正确*/
if( strlen(uname) > USERNAME_MAXLEN )
{
cJSON_Delete(cjson);
ret = RET_IPINVALID;
return ret;
}
/*获取密码 */
char *upwd = cJSON_GetObjectItem(cjson, "password")->valuestring;
printf("password :%s\n", upwd);
/*判断password长度是否正确 */
if( strlen(upwd) > PASSWORD_MAXLEN )
{
cJSON_Delete(cjson);
ret = RET_IPINVALID;
return ret;
}
/*调用认证接口函数 */
user_auth_login(uname, upwd, resultinfo);
printf("认证结束\n");
/*认证成功 */
if (resultinfo->ret == 0)
{
printf("认证成功\n");
uint32_t client_ip=10001; /*解析报文拿到用户IP */
printf("client_ip :%d\n", client_ip);
Init_hash(); /*初始化hash表放在配置恢复处 */
/*重定向到认证成功界面-调用web server提供的接口发送url地址给接口实现重定向 */
/*客户端访问认证成功界面方法:GET */
char method[10] = {"GET"};
/*如果method是GET,判断这个用户是否认证过*/
if(0 == strncmp(method, "GET",10))
{
struct user_info * uinfo;
uinfo = (struct user_info *)malloc(sizeof(struct user_info));
if (NULL == uinfo)
{
cJSON_Delete(cjson);
ret = RET_NOMEM;
return ret;
}
/*用户认证过则跳出语句,不访问认证成功界面 */
uinfo = ufind_user(client_ip);
if ( NULL != uinfo )
{
printf("用户已经认证过\n");
free(uinfo);
cJSON_Delete(cjson);
ret = RET_ERR;
return ret ;
}
uadd_user(client_ip,resultinfo->user_id);
uprintf_users();
uresult->resultcode = resultinfo->ret;
uresult->remain_lock_time = time;
uresult->message = mes[resultinfo->ret];
printf("resultcode:%d remain_lock_time:%d message:%s\n",uresult->resultcode,
uresult->remain_lock_time, uresult->message );
free(uinfo);
cJSON_Delete(cjson);
return ret;
}
}
/*认证锁定*/
if (resultinfo->ret == 4)
{
time = resultinfo->remain_lock_time;
uresult->resultcode = resultinfo->ret;
uresult->remain_lock_time = time;
uresult->message = mes[resultinfo->ret];
printf("resultcode:%d remain_lock_time:%d message:%s\n",uresult->resultcode,
uresult->remain_lock_time, uresult->message );
cJSON_Delete(cjson);
ret = RET_ERR;
return ret;
}
/*认证失败*/
if ( (resultinfo->ret != 4) && (resultinfo->ret != 0))
{
printf("the value of resultcode is %d\n", resultinfo->ret);
uresult->resultcode = resultinfo->ret;
uresult->remain_lock_time = time;
uresult->message = mes[resultinfo->ret];
printf("resultcode:%d remain_lock_time:%d message:%s\n",uresult->resultcode,
uresult->remain_lock_time, uresult->message );
cJSON_Delete(cjson);
ret = RET_ERR;
return ret;
}
cJSON_Delete(cjson);
return ret;
}
int main(int args, char** argv)
{
RESULT *output;
ret_code ret;
/*创建内存地址 */
output = (RESULT*)malloc(sizeof(RESULT));
if (NULL == output)
{
ret = RET_NOMEM;
return -1;
}
char *test = "{\"username\": \"用户02\",\"password\": \"123456\"}";
ret = user_auth(test, output);
printf("%d\n", ret);
return 0;
}