secgateway/Product/user/user_auth/web_auth.c

191 lines
5.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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, uname, resultinfo->user_id, resultinfo->group_id, 100, 100 ,200);
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;
}