Mod aaa-12 修改获取客户端、服务端IP地址和端口号代码

RCA:
SOL:
修改人:chenling
检视人:
This commit is contained in:
ChenLing 2019-10-09 17:44:03 +08:00
parent daddffdb7e
commit 0cdecd1c7e
2 changed files with 328 additions and 279 deletions

View File

@ -23,10 +23,10 @@
#define PASSWORD_MAXLEN 63 #define PASSWORD_MAXLEN 63
#define LISTENQ 1024 #define LISTENQ 1024
#define MESSAGE_SIZE (63) #define MESSAGE_SIZE (63)
#define MAX_ONLINE_NUM 10 #define MAX_ONLINE_NUM 10
typedef void* pointer; typedef void *pointer;
#if 0 #if 0
typedef struct user_auth_list typedef struct user_auth_list
@ -65,33 +65,34 @@ typedef struct user_auth_ret
} USER_AUTH_RET; } USER_AUTH_RET;
#endif #endif
typedef struct { typedef struct
char username[USERNAME_SIZE + 1]; /*用户名*/ {
uint32_t userip; /*用户IP*/ char username[USERNAME_SIZE + 1]; /*用户名*/
time_t login_time; /*用户登录时间*/ uint32_t userip; /*用户IP*/
time_t remain_time; /*剩余实际*/ time_t login_time; /*用户登录时间*/
}USERDATA; time_t remain_time; /*剩余实际*/
} USERDATA;
/*输出函数结构体 */ /*输出函数结构体 */
typedef struct { typedef struct
auth_ret resultcode; {
char message[MESSAGE_SIZE + 1]; /*返回描述用指针表示数组 */ auth_ret resultcode;
USERDATA data; /*返回的数据内容*/ char message[MESSAGE_SIZE + 1]; /*返回描述用指针表示数组 */
}RESULT; USERDATA data; /*返回的数据内容*/
} RESULT;
/*函数指针*/ /*函数指针*/
typedef void (*mod_portal_cfg_exec_sync)(char* username, char* password, USER_AUTH_RET *auth_result); typedef void (*mod_portal_cfg_exec_sync)(char *username, char *password, USER_AUTH_RET *auth_result);
typedef struct { typedef struct
{
PLUGIN_DATA; PLUGIN_DATA;
void *cfgm_lib; void *cfgm_lib;
mod_portal_cfg_exec_sync portal_cfg_exec; mod_portal_cfg_exec_sync portal_cfg_exec;
USER_AUTH_LIST *portal_auth_list; USER_AUTH_LIST *portal_auth_list;
} mod_portal_plugin_data; } mod_portal_plugin_data;
char *mes[] = {"认证成功", "用户名或密码错误", "不在有效时间范围内", "只允许单个用户登录", "用户锁定", "缺少配置信息", "输入错误", "超过最大用户连接数", "其他错误", "连接数据库失败"};
char * mes[]={"认证成功", "用户名或密码错误", "不在有效时间范围内","只允许单个用户登录","用户锁定","缺少配置信息","输入错误","超过最大用户连接数","其他错误","连接数据库失败"};
/** /**
* the basic and digest auth framework * the basic and digest auth framework
@ -130,7 +131,8 @@ INIT_FUNC(mod_portal_init) {
} }
#endif #endif
INIT_FUNC(mod_portal_init) { INIT_FUNC(mod_portal_init)
{
mod_portal_plugin_data *p; mod_portal_plugin_data *p;
p = calloc(1, sizeof(*p)); p = calloc(1, sizeof(*p));
@ -140,10 +142,12 @@ INIT_FUNC(mod_portal_init) {
} }
/*认证模块释放*/ /*认证模块释放*/
FREE_FUNC(mod_portal_free) { FREE_FUNC(mod_portal_free)
{
mod_portal_plugin_data *p = p_d; mod_portal_plugin_data *p = p_d;
srv = srv; srv = srv;
if (!p) return HANDLER_GO_ON; if (!p)
return HANDLER_GO_ON;
//dlclose(p->cfgm_lib); //dlclose(p->cfgm_lib);
free(p); free(p);
@ -151,31 +155,70 @@ FREE_FUNC(mod_portal_free) {
return HANDLER_GO_ON; return HANDLER_GO_ON;
} }
void get_local_peer_ip(connection *con, uint32_t *serverip, in_port_t *serverport, uint32_t *clientip, in_port_t *clinetport)
{
char *tmp;
struct in_addr ipv4_addr;
buffer *p = con->request.http_host;
char *str = strdup(p->ptr);
if (clinetport)
{
*clinetport = ntohs(con->dst_addr.ipv4.sin_port);
}
if (clientip)
{
*clientip = con->dst_addr.ipv4.sin_addr.s_addr;
}
tmp = strrchr(str, ':');
if (tmp)
{
if (serverport)
{
*serverport = strtoul(&tmp[1], NULL, 10);
}
tmp[0] = 0;
}
inet_pton(AF_INET, str, &ipv4_addr);
if (serverip)
{
*serverip = ipv4_addr.s_addr;
}
free(str);
}
/*通过fd获取对端和远端的IP地址*/ /*通过fd获取对端和远端的IP地址*/
void get_local_peer_ip(int listenfd, uint32_t *serverip, uint32_t *clientip, in_port_t *serverport, in_port_t *clinetport) void get_local_peer_ip2(int listenfd, uint32_t *serverip, uint32_t *clientip, in_port_t *serverport, in_port_t *clinetport)
{ {
struct sockaddr_in listendAddr, connectedAddr, peerAddr;//分别表示监听的地址,连接的本地地址,连接的对端地址 struct sockaddr_in listendAddr, connectedAddr, peerAddr; //分别表示监听的地址,连接的本地地址,连接的对端地址
socklen_t peerLen; socklen_t peerLen;
char ipAddr[INET_ADDRSTRLEN];//保存点分十进制的地址 char ipAddr[INET_ADDRSTRLEN]; //保存点分十进制的地址
listen(listenfd, LISTENQ); listen(listenfd, LISTENQ);
socklen_t listendAddrLen = sizeof(listendAddr); socklen_t listendAddrLen = sizeof(listendAddr);
getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen);//获取监听的地址和端口 getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen); //获取监听的地址和端口
printf("listen address = %s:%d\n", inet_ntoa(listendAddr.sin_addr), ntohs(listendAddr.sin_port)); printf("listen address = %s:%d\n", inet_ntoa(listendAddr.sin_addr), ntohs(listendAddr.sin_port));
socklen_t connectedAddrLen = sizeof(connectedAddr); socklen_t connectedAddrLen = sizeof(connectedAddr);
getsockname(listenfd, (struct sockaddr *)&connectedAddr, &connectedAddrLen);//获取connfd表示的连接上的本地地址(服务端的地址) getsockname(listenfd, (struct sockaddr *)&connectedAddr, &connectedAddrLen); //获取connfd表示的连接上的本地地址(服务端的地址)
printf("connected server address = %s:%d\n", inet_ntoa(connectedAddr.sin_addr), ntohs(connectedAddr.sin_port)); printf("connected server address = %s:%d\n", inet_ntoa(connectedAddr.sin_addr), ntohs(connectedAddr.sin_port));
*serverip = connectedAddr.sin_addr.s_addr; *serverip = connectedAddr.sin_addr.s_addr;
*serverport = ntohs(connectedAddr.sin_port); *serverport = ntohs(connectedAddr.sin_port);
getpeername(listenfd, (struct sockaddr *)&peerAddr, &peerLen); //获取connfd表示的连接上的对端地址(客户端的地址) getpeername(listenfd, (struct sockaddr *)&peerAddr, &peerLen); //获取connfd表示的连接上的对端地址(客户端的地址)
printf("connected peer address = %s:%d\n", inet_ntop(AF_INET, &peerAddr.sin_addr, ipAddr, sizeof(ipAddr)), ntohs(peerAddr.sin_port)); printf("connected peer address = %s:%d\n", inet_ntop(AF_INET, &peerAddr.sin_addr, ipAddr, sizeof(ipAddr)), ntohs(peerAddr.sin_port));
*clientip = peerAddr.sin_addr.s_addr; *clientip = peerAddr.sin_addr.s_addr;
*clinetport = ntohs(peerAddr.sin_port); *clinetport = ntohs(peerAddr.sin_port);
return; return;
} }
static handler_t ouput_function(server *srv, connection *con, int resultcode, char *message, char *data) static handler_t ouput_function(server *srv, connection *con, int resultcode, char *message, char *data)
@ -191,12 +234,11 @@ static handler_t ouput_function(server *srv, connection *con, int resultcode, ch
cJSON_AddStringToObject(res, "message", message); cJSON_AddStringToObject(res, "message", message);
cJSON_AddStringToObject(res, "data", data); cJSON_AddStringToObject(res, "data", data);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s","test");
/*json对象转换为json字符串*/ /*json对象转换为json字符串*/
result_str = cJSON_PrintUnformatted(res); result_str = cJSON_PrintUnformatted(res);
buffer *result_info = buffer_init(); buffer *result_info = buffer_init_string(result_str);
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info); chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info); buffer_free(result_info);
con->http_status = 200; con->http_status = 200;
@ -205,37 +247,39 @@ static handler_t ouput_function(server *srv, connection *con, int resultcode, ch
return HANDLER_FINISHED; return HANDLER_FINISHED;
} }
/*post 先判断用户是否认证过 ip是唯一的*/ /*post 先判断用户是否认证过 ip是唯一的*/
/*用户认证过-返回resultcode=0 message data(username、user_ip、login_time)*/ /*用户认证过-返回resultcode=0 message data(username、user_ip、login_time)*/
/*用户未认证通过-返回resultcode=1 message data(null)*/ /*用户未认证通过-返回resultcode=1 message data(null)*/
static handler_t judge_user_auth(server *srv, connection *con, void* p_d) static handler_t judge_user_auth(server *srv, connection *con, void *p_d)
{ {
p_d = p_d; p_d = p_d;
USER_INFO *uinfo; USER_INFO *uinfo;
//cJSON *cjson; //cJSON *cjson;
//cJSON *uip; //cJSON *uip;
uint32_t serverip = 0;
uint32_t clientip = 0; uint32_t clientip = 0;
in_port_t serverport = 0;
in_port_t clientport = 0; in_port_t clientport = 0;
uint32_t serverip = 0;
in_port_t serverport = 0;
char str[INET_ADDRSTRLEN]; char str[INET_ADDRSTRLEN];
char dtr[INET_ADDRSTRLEN]; char dtr[INET_ADDRSTRLEN];
RESULT *uresult; RESULT *uresult;
uresult = ( RESULT *)malloc(sizeof(RESULT)); uresult = (RESULT *)malloc(sizeof(RESULT));
if(NULL == uresult) if(NULL == uresult)
{ {
return HANDLER_ERROR; return HANDLER_ERROR;
} }
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s","test");
get_local_peer_ip(con->fd, &serverip, &clientip, &serverport, &clientport); get_local_peer_ip(con, &serverip, &serverport, &clientip, &clientport);
memset(dtr, 0, INET_ADDRSTRLEN); memset(dtr, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET, &clientip, dtr, sizeof(dtr)); inet_ntop(AF_INET, &clientip, dtr, sizeof(dtr));
log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport); log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport);
memset(str, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET, &serverip, str, sizeof(str));
log_error_write(srv, __FILE__, __LINE__, "ssd", "test", str, serverport);
/*通过用户IP判断用户是否认证通过*/ /*通过用户IP判断用户是否认证通过*/
uinfo = ufind_user(clientip); uinfo = ufind_user(clientip);
@ -269,7 +313,7 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d)
} }
/*给data内容赋值认证成功给前端返回用户名、用户IP、当前登录时间*/ /*给data内容赋值认证成功给前端返回用户名、用户IP、当前登录时间*/
time(&tmpcal_ptr); time(&tmpcal_ptr);
log_error_write(srv, __FILE__, __LINE__, "d", tmpcal_ptr); log_error_write(srv, __FILE__, __LINE__, "d", tmpcal_ptr);
uresult->data.login_time = tmpcal_ptr; uresult->data.login_time = tmpcal_ptr;
@ -278,7 +322,7 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d)
strncpy(uresult->data.username, uinfo->auth_user.user_name, 32); strncpy(uresult->data.username, uinfo->auth_user.user_name, 32);
memset(str, 0, INET_ADDRSTRLEN); memset(str, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET,&uresult->data.userip, str, sizeof(str)); inet_ntop(AF_INET,&uresult->data.userip, str, sizeof(str));
cJSON_AddStringToObject(data, "username", uresult->data.username); cJSON_AddStringToObject(data, "username", uresult->data.username);
cJSON_AddStringToObject(data, "user_ip", str); cJSON_AddStringToObject(data, "user_ip", str);
@ -288,168 +332,166 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d)
res = cJSON_CreateObject(); res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR; if(!res) return HANDLER_ERROR;
uresult->resultcode = 1; /*表示用户已经认证成功*/ uresult->resultcode = 1; /*表示用户已经认证成功*/
strncpy(uresult->message, messgae, 60); /*用户已经认证通过*/ strncpy(uresult->message, messgae, 60); /*用户已经认证通过*/
cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode);
cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddStringToObject(res, "message", uresult->message);
cJSON_AddItemToObject(res, "data", data); cJSON_AddItemToObject(res, "data", data);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s","test");
/*json对象转换为json字符串*/ /*json对象转换为json字符串*/
result_str = cJSON_Print(res); result_str = cJSON_Print(res);
buffer *result_info = buffer_init(); buffer *result_info = buffer_init_string(result_str);
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info); chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info); buffer_free(result_info);
con->http_status = 200; con->http_status = 200;
con->file_finished = 1; con->file_finished = 1;
cJSON_Delete(res); cJSON_Delete(res);
return HANDLER_FINISHED; return HANDLER_FINISHED;
} }
return HANDLER_FINISHED; return HANDLER_FINISHED;
} }
/*判断用户名和密码是否正确*/ /*判断用户名和密码是否正确*/
static handler_t judge_account_pwd(server *srv, connection *con, void* p_d) static handler_t judge_account_pwd(server *srv, connection *con, void *p_d)
{ {
p_d = p_d; p_d = p_d;
//mod_portal_plugin_data *p = p_d; //mod_portal_plugin_data *p = p_d;
cJSON *cjson; cJSON *cjson;
USER_AUTH_RET *resultinfo; USER_AUTH_RET *resultinfo;
char *account = NULL; char *account = NULL;
char *pwd = NULL; char *pwd = NULL;
RESULT *uresult; RESULT *uresult;
uint32_t serverip = 0;
uint32_t clientip = 0; uint32_t clientip = 0;
in_port_t serverport = 0;
in_port_t clientport = 0; in_port_t clientport = 0;
uint32_t serverip = 0;
in_port_t serverport = 0;
char str[INET_ADDRSTRLEN]; char str[INET_ADDRSTRLEN];
char dtr[INET_ADDRSTRLEN]; char dtr[INET_ADDRSTRLEN];
get_local_peer_ip(con->fd, &serverip, &clientip, &serverport, &clientport); get_local_peer_ip(con, &serverip, &serverport, &clientip, &clientport);
memset(dtr, 0, INET_ADDRSTRLEN); memset(dtr, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET,&clientip, dtr, sizeof(dtr)); inet_ntop(AF_INET, &clientip, dtr, sizeof(dtr));
log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport); log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport);
uresult = ( RESULT *)malloc(sizeof(RESULT)); uresult = (RESULT *)malloc(sizeof(RESULT));
if(NULL == uresult) if(NULL == uresult)
{ {
return HANDLER_ERROR; return HANDLER_ERROR;
} }
resultinfo = (USER_AUTH_RET *)malloc(sizeof(USER_AUTH_RET)); resultinfo = (USER_AUTH_RET *)malloc(sizeof(USER_AUTH_RET));
if (NULL == resultinfo) if (NULL == resultinfo)
{ {
return HANDLER_ERROR; return HANDLER_ERROR;
} }
/*get payload*/ /*get payload*/
handler_t result = connection_handle_read_post_state(srv, con); handler_t result = connection_handle_read_post_state(srv, con);
if (result != HANDLER_GO_ON) if (result != HANDLER_GO_ON)
{ {
return result; return result;
} }
log_error_write(srv, __FILE__, __LINE__, "s","test");
buffer *b = buffer_init();
chunkqueue *dst_cq = con->request_content_queue;
chunk *c = dst_cq->first;
if (NULL == c) return HANDLER_ERROR;
while(c != NULL)
{
buffer_append_string(b, c->mem->ptr + c->offset);
c = c->next;
}
log_error_write(srv, __FILE__, __LINE__, "sb","test",b);
/*JSON字符串到JSON格式 */
cjson = cJSON_Parse(b->ptr);
if(!cjson)
{
return HANDLER_ERROR;
}
/*get username */
cJSON *uitem = cJSON_GetObjectItem(cjson , "account");
if(!uitem)
{
return HANDLER_ERROR;
}
account= uitem->valuestring;
log_error_write(srv, __FILE__, __LINE__, "ss","test",account);
if( strlen(account) > USERNAME_MAXLEN )
{
cJSON_Delete(uitem);
cJSON_Delete(cjson);
free(account);
return HANDLER_ERROR;
}
/*get password */
cJSON *pitem = cJSON_GetObjectItem(cjson , "pwd");
if(!pitem)
{
return HANDLER_ERROR;
}
pwd =pitem->valuestring;
log_error_write(srv, __FILE__, __LINE__, "ss","test", pwd);
if(strlen(pwd) > PASSWORD_MAXLEN)
{
cJSON_Delete(cjson);
cJSON_Delete(pitem);
free(pwd);
return HANDLER_ERROR;
}
log_error_write(srv, __FILE__, __LINE__, "s","test");
/*调用认证接口函数 */
user_auth_login(account, pwd, resultinfo);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s","test");
/*auth success*/ buffer *b = buffer_init();
if(resultinfo->ret == AUTH_SUCCESS) chunkqueue *dst_cq = con->request_content_queue;
{ chunk *c = dst_cq->first;
cJSON *res; if (NULL == c) return HANDLER_ERROR;
while(c != NULL)
{
buffer_append_string(b, c->mem->ptr + c->offset);
c = c->next;
}
log_error_write(srv, __FILE__, __LINE__, "sb","test",b);
/*JSON字符串到JSON格式 */
cjson = cJSON_Parse(b->ptr);
if(!cjson)
{
return HANDLER_ERROR;
}
/*get username */
cJSON *uitem = cJSON_GetObjectItem(cjson, "account");
if(!uitem)
{
return HANDLER_ERROR;
}
account = uitem->valuestring;
log_error_write(srv, __FILE__, __LINE__, "ss", "test", account);
if (strlen(account) > USERNAME_MAXLEN)
{
cJSON_Delete(uitem);
cJSON_Delete(cjson);
free(account);
return HANDLER_ERROR;
}
/*get password */
cJSON *pitem = cJSON_GetObjectItem(cjson, "pwd");
if (!pitem)
{
return HANDLER_ERROR;
}
pwd = pitem->valuestring;
log_error_write(srv, __FILE__, __LINE__, "ss", "test", pwd);
if (strlen(pwd) > PASSWORD_MAXLEN)
{
cJSON_Delete(cjson);
cJSON_Delete(pitem);
free(pwd);
return HANDLER_ERROR;
}
log_error_write(srv, __FILE__, __LINE__, "s", "test");
/*调用认证接口函数 */
user_auth_login(account, pwd, resultinfo);
log_error_write(srv, __FILE__, __LINE__, "s", "test");
/*auth success*/
if (resultinfo->ret == AUTH_SUCCESS)
{
cJSON *res;
cJSON *data; cJSON *data;
const char *result_str; const char *result_str;
time_t tmpcal_ptr; time_t tmpcal_ptr;
int num; int num;
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
/*获取目前在线用户数 超过最大在线用户数则失败*/ /*获取目前在线用户数 超过最大在线用户数则失败*/
num = uprintf_users(); num = uprintf_users();
log_error_write(srv, __FILE__, __LINE__, "sd","test", num); log_error_write(srv, __FILE__, __LINE__, "sd", "test", num);
int max_num = MAX_ONLINE_NUM; int max_num = MAX_ONLINE_NUM;
log_error_write(srv, __FILE__, __LINE__, "sd","test", max_num); log_error_write(srv, __FILE__, __LINE__, "sd", "test", max_num);
if(num >= MAX_ONLINE_NUM) if (num >= MAX_ONLINE_NUM)
{ {
log_error_write(srv, __FILE__, __LINE__, "sd","test", num); log_error_write(srv, __FILE__, __LINE__, "sd", "test", num);
log_error_write(srv, __FILE__, __LINE__, "sd","test", MAX_ONLINE_NUM); log_error_write(srv, __FILE__, __LINE__, "sd", "test", MAX_ONLINE_NUM);
/*创建json对象*/ /*创建json对象*/
res = cJSON_CreateObject(); res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR; if (!res)
return HANDLER_ERROR;
cJSON_AddNumberToObject(res, "resultcode", 8); cJSON_AddNumberToObject(res, "resultcode", 8);
cJSON_AddStringToObject(res, "message", "用户达到最大数量"); cJSON_AddStringToObject(res, "message", "用户达到最大数量");
cJSON_AddStringToObject(res, "data", ""); cJSON_AddStringToObject(res, "data", "");
/*json对象转换为json字符串*/ /*json对象转换为json字符串*/
result_str = cJSON_Print(res); result_str = cJSON_Print(res);
buffer *result_info = buffer_init(); buffer *result_info = buffer_init_string(result_str);
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info); chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info); buffer_free(result_info);
con->http_status = 200; con->http_status = 200;
@ -459,21 +501,21 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
return HANDLER_FINISHED; return HANDLER_FINISHED;
} }
/*auth success-用户信息保存在本地IP监测表*/ /*auth success-用户信息保存在本地IP监测表*/
/*获取下行报文数、字节数、在线时间 目前设置默认值为0*/ /*获取下行报文数、字节数、在线时间 目前设置默认值为0*/
uadd_user(clientip, account, resultinfo->user_id, resultinfo->group_id, 0, 0, 0); uadd_user(clientip, account, resultinfo->user_id, resultinfo->group_id, 0, 0, 0);
int num1 = uprintf_users(); int num1 = uprintf_users();
log_error_write(srv, __FILE__, __LINE__, "sd", "test", num1); log_error_write(srv, __FILE__, __LINE__, "sd", "test", num1);
/*创建json对象*/ /*创建json对象*/
data = cJSON_CreateObject(); data = cJSON_CreateObject();
if(!data) if (!data)
{ {
return HANDLER_ERROR; return HANDLER_ERROR;
} }
/*给data内容赋值认证成功给前端返回用户名、用户IP、当前登录时间*/ /*给data内容赋值认证成功给前端返回用户名、用户IP、当前登录时间*/
time(&tmpcal_ptr); time(&tmpcal_ptr);
log_error_write(srv, __FILE__, __LINE__, "d", tmpcal_ptr); log_error_write(srv, __FILE__, __LINE__, "d", tmpcal_ptr);
uresult->data.login_time = tmpcal_ptr; uresult->data.login_time = tmpcal_ptr;
@ -481,41 +523,40 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
strncpy(uresult->data.username, account, 32); strncpy(uresult->data.username, account, 32);
memset(str, 0, INET_ADDRSTRLEN); memset(str, 0, INET_ADDRSTRLEN);
inet_ntop(AF_INET,&uresult->data.userip, str, sizeof(str)); inet_ntop(AF_INET, &uresult->data.userip, str, sizeof(str));
cJSON_AddStringToObject(data, "username", uresult->data.username); cJSON_AddStringToObject(data, "username", uresult->data.username);
cJSON_AddStringToObject(data, "user_ip", str); cJSON_AddStringToObject(data, "user_ip", str);
cJSON_AddNumberToObject(data, "login_time", uresult->data.login_time); cJSON_AddNumberToObject(data, "login_time", uresult->data.login_time);
uresult->resultcode = resultinfo->ret;; /*表示用户未认证成功*/ uresult->resultcode = resultinfo->ret; /*表示用户未认证成功*/
strncpy(uresult->message, mes[resultinfo->ret], 60); strncpy(uresult->message, mes[resultinfo->ret], 60);
/*创建json对象*/ /*创建json对象*/
res = cJSON_CreateObject(); res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR; if (!res)
return HANDLER_ERROR;
cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode);
cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddStringToObject(res, "message", uresult->message);
cJSON_AddItemToObject(res, "data", data); cJSON_AddItemToObject(res, "data", data);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
/*json对象转换为json字符串*/ /*json对象转换为json字符串*/
result_str = cJSON_Print(res); result_str = cJSON_Print(res);
buffer *result_info = buffer_init(); buffer *result_info = buffer_init_string(result_str);
result_info = buffer_init_string(result_str); log_error_write(srv, __FILE__, __LINE__, "s", "test");
log_error_write(srv, __FILE__, __LINE__, "s","test");
chunkqueue_append_buffer(con->write_queue, result_info); chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info); buffer_free(result_info);
con->http_status = 200; con->http_status = 200;
con->file_finished = 1; con->file_finished = 1;
cJSON_Delete(cjson); cJSON_Delete(cjson);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
cJSON_Delete(res); cJSON_Delete(res);
return HANDLER_FINISHED; return HANDLER_FINISHED;
#if 0
#if 0
/*1.跳转到认证成功界面*/ /*1.跳转到认证成功界面*/
buffer *return_info = buffer_init(); buffer *return_info = buffer_init();
@ -530,20 +571,20 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
printf("page url:%s\n", page); printf("page url:%s\n", page);
window.location = *page; window.location = *page;
</script>*/ </script>*/
#endif #endif
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
} }
else if(resultinfo->ret == AUTH_FAIL_LOCK) /*用户锁定*/ else if (resultinfo->ret == AUTH_FAIL_LOCK) /*用户锁定*/
{ {
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
cJSON *res; cJSON *res;
cJSON *data; cJSON *data;
const char *result_str; const char *result_str;
/*创建json对象*/ /*创建json对象*/
data = cJSON_CreateObject(); data = cJSON_CreateObject();
if(!data) if (!data)
{ {
return HANDLER_ERROR; return HANDLER_ERROR;
} }
@ -551,21 +592,21 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
uresult->data.remain_time = resultinfo->remain_lock_time; uresult->data.remain_time = resultinfo->remain_lock_time;
cJSON_AddNumberToObject(data, "remain_lock_time", uresult->data.remain_time); cJSON_AddNumberToObject(data, "remain_lock_time", uresult->data.remain_time);
uresult->resultcode = resultinfo->ret;; /*表示用户未认证锁定*/ uresult->resultcode = resultinfo->ret; /*表示用户未认证锁定*/
strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE); strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE);
/*创建json对象*/ /*创建json对象*/
res = cJSON_CreateObject(); res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR; if (!res)
return HANDLER_ERROR;
cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode);
cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddStringToObject(res, "message", uresult->message);
cJSON_AddItemToObject(res, "data", data); cJSON_AddItemToObject(res, "data", data);
/*json对象转换为json字符串*/ /*json对象转换为json字符串*/
result_str = cJSON_Print(res); result_str = cJSON_Print(res);
buffer *result_info = buffer_init(); buffer *result_info = buffer_init_string(result_str);
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info); chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info); buffer_free(result_info);
con->http_status = 200; con->http_status = 200;
@ -573,36 +614,35 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
cJSON_Delete(cjson); cJSON_Delete(cjson);
cJSON_Delete(res); cJSON_Delete(res);
return HANDLER_FINISHED; return HANDLER_FINISHED;
}
} else /*认证失败*/
else /*认证失败*/ {
{ printf("auth fail\n");
printf("auth fail\n"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
log_error_write(srv, __FILE__, __LINE__, "s","test");
cJSON *res; cJSON *res;
const char *result_str; const char *result_str;
int num = uprintf_users(); int num = uprintf_users();
log_error_write(srv, __FILE__, __LINE__, "sd","test", num); log_error_write(srv, __FILE__, __LINE__, "sd", "test", num);
/*创建json对象*/ /*创建json对象*/
res = cJSON_CreateObject(); res = cJSON_CreateObject();
if(!res) return HANDLER_ERROR; if (!res)
return HANDLER_ERROR;
uresult->resultcode = resultinfo->ret;; /*表示用户认证失败*/ uresult->resultcode = resultinfo->ret; /*表示用户认证失败*/
strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE); strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE);
log_error_write(srv, __FILE__, __LINE__, "sd","test", uresult->resultcode); log_error_write(srv, __FILE__, __LINE__, "sd", "test", uresult->resultcode);
log_error_write(srv, __FILE__, __LINE__, "ss","test", uresult->message); log_error_write(srv, __FILE__, __LINE__, "ss", "test", uresult->message);
cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode);
cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddStringToObject(res, "message", uresult->message);
cJSON_AddStringToObject(res, "data", ""); cJSON_AddStringToObject(res, "data", "");
/*json对象转换为json字符串*/ /*json对象转换为json字符串*/
result_str = cJSON_PrintUnformatted(res); result_str = cJSON_PrintUnformatted(res);
buffer *result_info = buffer_init(); buffer *result_info = buffer_init_string(result_str);
result_info = buffer_init_string(result_str);
chunkqueue_append_buffer(con->write_queue, result_info); chunkqueue_append_buffer(con->write_queue, result_info);
buffer_free(result_info); buffer_free(result_info);
@ -611,8 +651,7 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
cJSON_Delete(cjson); cJSON_Delete(cjson);
cJSON_Delete(res); cJSON_Delete(res);
return HANDLER_FINISHED; return HANDLER_FINISHED;
}
}
cJSON_Delete(cjson); cJSON_Delete(cjson);
cJSON_Delete(uitem); cJSON_Delete(uitem);
@ -620,14 +659,13 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
return HANDLER_FINISHED; return HANDLER_FINISHED;
} }
/*认证模块处理函数*/ /*认证模块处理函数*/
/*根据传输过来的url分情况执行*/ /*根据传输过来的url分情况执行*/
static handler_t mod_portal_uri_handler(server *srv, connection *con, void* p_d) static handler_t mod_portal_uri_handler(server *srv, connection *con, void *p_d)
{ {
/*case 1 -判断认证 /*case 1 -判断认证
case 2 -*/ case 2 -*/
log_error_write(srv, __FILE__, __LINE__, "s","mod_portal_uri_handler"); log_error_write(srv, __FILE__, __LINE__, "s", "mod_portal_uri_handler");
handler_t t = HANDLER_GO_ON; handler_t t = HANDLER_GO_ON;
p_d = p_d; p_d = p_d;
@ -636,13 +674,16 @@ static handler_t mod_portal_uri_handler(server *srv, connection *con, void* p_d)
return HANDLER_GO_ON; return HANDLER_GO_ON;
} }
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
if (con->state == CON_STATE_READ_POST) { if (con->state == CON_STATE_READ_POST)
{
chunkqueue *cq = con->request_content_queue; chunkqueue *cq = con->request_content_queue;
if (cq->bytes_in != (off_t)con->request.content_length) { if (cq->bytes_in != (off_t)con->request.content_length)
{
handler_t r = connection_handle_read_post_state(srv, con); handler_t r = connection_handle_read_post_state(srv, con);
if (r != HANDLER_GO_ON) return r; if (r != HANDLER_GO_ON)
return r;
} }
} }
else if (0 == con->request.content_length) else if (0 == con->request.content_length)
@ -650,31 +691,30 @@ static handler_t mod_portal_uri_handler(server *srv, connection *con, void* p_d)
return HANDLER_GO_ON; return HANDLER_GO_ON;
} }
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
/*url 与"/ISG-login"匹配,判断用户是否认证过*/ /*url 与"/ISG-login"匹配,判断用户是否认证过*/
if (0 == strcmp(con->uri.path->ptr, "/ISG-login")) if (0 == strcmp(con->uri.path->ptr, "/ISG-login"))
{ {
t = judge_user_auth(srv, con, p_d); t = judge_user_auth(srv, con, p_d);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
} }
else if (0 == strcmp(con->uri.path->ptr, "/ISG-auth")) else if (0 == strcmp(con->uri.path->ptr, "/ISG-auth"))
{ {
t = judge_account_pwd(srv, con, p_d); t = judge_account_pwd(srv, con, p_d);
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
} }
log_error_write(srv, __FILE__, __LINE__, "s","test"); log_error_write(srv, __FILE__, __LINE__, "s", "test");
//http_header_response_set(con, HTTP_HEADER_CONTENT_TYPE, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/xml; charset=\"utf-8\""));
con->http_status = 200; con->http_status = 200;
con->file_finished = 1; con->file_finished = 1;
return t; return t;
} }
SETDEFAULTS_FUNC(mod_portal_set_defaults) SETDEFAULTS_FUNC(mod_portal_set_defaults)
{ {
mod_portal_plugin_data *p = p_d; mod_portal_plugin_data *p = p_d;
p = p;//解决编译告警; p = p; //解决编译告警;
//srv = srv;//解决编译告警; //srv = srv;//解决编译告警;
init_svr_ptr(srv); init_svr_ptr(srv);
@ -682,16 +722,16 @@ SETDEFAULTS_FUNC(mod_portal_set_defaults)
return HANDLER_GO_ON; return HANDLER_GO_ON;
} }
int mod_portal_plugin_init(plugin *p); int mod_portal_plugin_init(plugin *p);
int mod_portal_plugin_init(plugin *p) { int mod_portal_plugin_init(plugin *p)
p->version = LIGHTTPD_VERSION_ID; {
p->name = buffer_init_string("portal"); p->version = LIGHTTPD_VERSION_ID;
p->init = mod_portal_init; p->name = buffer_init_string("portal");
p->init = mod_portal_init;
p->set_defaults = mod_portal_set_defaults; p->set_defaults = mod_portal_set_defaults;
p->handle_uri_clean = mod_portal_uri_handler; p->handle_uri_clean = mod_portal_uri_handler;
p->cleanup = mod_portal_free; p->cleanup = mod_portal_free;
p->data = NULL; p->data = NULL;
return 0; return 0;
} }

View File

@ -153,28 +153,37 @@ static int mod_redirect_patch_connection(server *srv, connection *con, plugin_da
} }
/*通过fd获取对端和远端的IP地址*/ /*通过fd获取对端和远端的IP地址*/
void get_local_peer_ip(int listenfd, uint32_t *serverip, uint32_t *clientip) void get_local_peer_ip(connection *con, uint32_t *serverip, uint32_t *clientip)
{ {
struct sockaddr_in listendAddr, connectedAddr, peerAddr;//分别表示监听的地址,连接的本地地址,连接的对端地址 char *tmp;
socklen_t peerLen; struct in_addr ipv4_addr;
char ipAddr[INET_ADDRSTRLEN];//保存点分十进制的地址 buffer *p = con->request.http_host;
char *str = strdup(p->ptr);
listen(listenfd, LISTENQ); if (clientip)
socklen_t listendAddrLen = sizeof(listendAddr); {
getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen);//获取监听的地址和端口 *clientip = con->dst_addr.ipv4.sin_addr.s_addr;
printf("listen address = %s:%d\n", inet_ntoa(listendAddr.sin_addr), ntohs(listendAddr.sin_port)); }
socklen_t connectedAddrLen = sizeof(connectedAddr); tmp = strrchr(str, ':');
getsockname(listenfd, (struct sockaddr *)&connectedAddr, &connectedAddrLen);//获取connfd表示的连接上的本地地址(服务端的地址)
printf("connected server address = %s:%d\n", inet_ntoa(connectedAddr.sin_addr), ntohs(connectedAddr.sin_port));
*serverip = connectedAddr.sin_addr.s_addr;
getpeername(listenfd, (struct sockaddr *)&peerAddr, &peerLen); //获取connfd表示的连接上的对端地址(客户端的地址)
printf("connected peer address = %s:%d\n", inet_ntop(AF_INET, &peerAddr.sin_addr, ipAddr, sizeof(ipAddr)), ntohs(peerAddr.sin_port));
*clientip = peerAddr.sin_addr.s_addr;
return; if (tmp)
{
tmp[0] = 0;
}
inet_pton(AF_INET, str, &ipv4_addr);
if (serverip)
{
*serverip = ipv4_addr.s_addr;
}
free(str);
} }
URIHANDLER_FUNC(mod_redirect_uri_handler) { URIHANDLER_FUNC(mod_redirect_uri_handler) {
plugin_data *p = p_d; plugin_data *p = p_d;
//struct burl_parts_t burl; //struct burl_parts_t burl;
@ -184,7 +193,7 @@ URIHANDLER_FUNC(mod_redirect_uri_handler) {
uint32_t clientip = 0; uint32_t clientip = 0;
struct sockaddr_in ip_addr; struct sockaddr_in ip_addr;
get_local_peer_ip(con->fd, &serverip, &clientip); get_local_peer_ip(con, &serverip, &clientip);
mod_redirect_patch_connection(srv, con, p); mod_redirect_patch_connection(srv, con, p);
if (!p->conf.redirect->used) return HANDLER_GO_ON; if (!p->conf.redirect->used) return HANDLER_GO_ON;