2019-07-25 04:13:25 +00:00
|
|
|
|
#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");
|
2019-07-25 07:37:53 +00:00
|
|
|
|
uint32_t client_ip=10001; /*解析报文拿到用户IP */
|
|
|
|
|
printf("client_ip :%d\n", client_ip);
|
|
|
|
|
Init_hash(); /*初始化hash表放在配置恢复处 */
|
|
|
|
|
|
|
|
|
|
|
2019-07-25 04:13:25 +00:00
|
|
|
|
/*重定向到认证成功界面-调用web server提供的接口,发送url地址给接口,实现重定向 */
|
|
|
|
|
|
|
|
|
|
|
2019-07-25 07:37:53 +00:00
|
|
|
|
/*客户端访问认证成功界面方法:GET */
|
2019-07-25 04:13:25 +00:00
|
|
|
|
char method[10] = {"GET"};
|
|
|
|
|
|
|
|
|
|
|
2019-07-25 07:37:53 +00:00
|
|
|
|
/*如果method是GET,判断这个用户是否认证过*/
|
2019-07-25 04:13:25 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-25 07:37:53 +00:00
|
|
|
|
/*用户认证过则跳出语句,不访问认证成功界面 */
|
2019-07-25 04:13:25 +00:00
|
|
|
|
uinfo = ufind_user(client_ip);
|
|
|
|
|
|
|
|
|
|
if ( NULL != uinfo )
|
|
|
|
|
{
|
|
|
|
|
printf("用户已经认证过\n");
|
|
|
|
|
free(uinfo);
|
|
|
|
|
cJSON_Delete(cjson);
|
|
|
|
|
ret = RET_ERR;
|
|
|
|
|
return ret ;
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-25 07:37:53 +00:00
|
|
|
|
uadd_user(client_ip,resultinfo->user_id);
|
|
|
|
|
uprintf_users();
|
|
|
|
|
|
2019-07-25 04:13:25 +00:00
|
|
|
|
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 );
|
2019-07-25 07:37:53 +00:00
|
|
|
|
|
2019-07-25 04:13:25 +00:00
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-29 02:50:38 +00:00
|
|
|
|
int main(int args, char** argv)
|
|
|
|
|
{
|
|
|
|
|
RESULT *output;
|
|
|
|
|
ret_code ret;
|
2019-07-25 04:13:25 +00:00
|
|
|
|
|
2019-07-29 02:50:38 +00:00
|
|
|
|
/*创建内存地址 */
|
|
|
|
|
output = (RESULT*)malloc(sizeof(RESULT));
|
|
|
|
|
if (NULL == output)
|
|
|
|
|
{
|
|
|
|
|
ret = RET_NOMEM;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2019-07-25 04:13:25 +00:00
|
|
|
|
|
2019-07-29 02:50:38 +00:00
|
|
|
|
char *test = "{\"username\": \"用户02\",\"password\": \"123456\"}";
|
|
|
|
|
ret = user_auth(test, output);
|
|
|
|
|
|
|
|
|
|
printf("%d\n", ret);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2019-07-25 04:13:25 +00:00
|
|
|
|
|