diff --git a/libs/src/lighttpd-1.4.51/src/mod_portal.c b/libs/src/lighttpd-1.4.51/src/mod_portal.c index 637a13954..776350bf7 100644 --- a/libs/src/lighttpd-1.4.51/src/mod_portal.c +++ b/libs/src/lighttpd-1.4.51/src/mod_portal.c @@ -13,20 +13,20 @@ #include #include #include -#include "user_auth.h" +#include "user_auth.h" #include "arpa/inet.h" #include "unistd.h" #include "stddef.h" -#include "/usr/include/x86_64-linux-gnu/sys/socket.h" +#include "/usr/include/x86_64-linux-gnu/sys/socket.h" #define USERNAME_MAXLEN 63 #define PASSWORD_MAXLEN 63 #define LISTENQ 1024 -#define MESSAGE_SIZE (63) -#define MAX_ONLINE_NUM 10 +#define MESSAGE_SIZE (63) +#define MAX_ONLINE_NUM 10 -typedef void* pointer; +typedef void *pointer; #if 0 typedef struct user_auth_list @@ -65,33 +65,34 @@ typedef struct user_auth_ret } USER_AUTH_RET; #endif -typedef struct { - char username[USERNAME_SIZE + 1]; /*用户名*/ - uint32_t userip; /*用户IP*/ - time_t login_time; /*用户登录时间*/ - time_t remain_time; /*剩余实际*/ -}USERDATA; +typedef struct +{ + char username[USERNAME_SIZE + 1]; /*用户名*/ + uint32_t userip; /*用户IP*/ + time_t login_time; /*用户登录时间*/ + time_t remain_time; /*剩余实际*/ +} USERDATA; /*输出函数结构体 */ -typedef struct { - auth_ret resultcode; - char message[MESSAGE_SIZE + 1]; /*返回描述用指针表示数组 */ - USERDATA data; /*返回的数据内容*/ -}RESULT; +typedef struct +{ + auth_ret resultcode; + char message[MESSAGE_SIZE + 1]; /*返回描述用指针表示数组 */ + 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; void *cfgm_lib; mod_portal_cfg_exec_sync portal_cfg_exec; USER_AUTH_LIST *portal_auth_list; } mod_portal_plugin_data; - -char * mes[]={"认证成功", "用户名或密码错误", "不在有效时间范围内","只允许单个用户登录","用户锁定","缺少配置信息","输入错误","超过最大用户连接数","其他错误","连接数据库失败"}; - +char *mes[] = {"认证成功", "用户名或密码错误", "不在有效时间范围内", "只允许单个用户登录", "用户锁定", "缺少配置信息", "输入错误", "超过最大用户连接数", "其他错误", "连接数据库失败"}; /** * the basic and digest auth framework @@ -130,20 +131,23 @@ INIT_FUNC(mod_portal_init) { } #endif -INIT_FUNC(mod_portal_init) { +INIT_FUNC(mod_portal_init) +{ mod_portal_plugin_data *p; p = calloc(1, sizeof(*p)); - + //Init_hash(); /*初始化hash表 */ return p; } /*认证模块释放*/ -FREE_FUNC(mod_portal_free) { +FREE_FUNC(mod_portal_free) +{ mod_portal_plugin_data *p = p_d; srv = srv; - if (!p) return HANDLER_GO_ON; + if (!p) + return HANDLER_GO_ON; //dlclose(p->cfgm_lib); free(p); @@ -151,37 +155,76 @@ FREE_FUNC(mod_portal_free) { 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地址*/ -void get_local_peer_ip(int listenfd, uint32_t *serverip, uint32_t *clientip, in_port_t *serverport, in_port_t *clinetport) -{ - struct sockaddr_in listendAddr, connectedAddr, peerAddr;//分别表示监听的地址,连接的本地地址,连接的对端地址 - socklen_t peerLen; - char ipAddr[INET_ADDRSTRLEN];//保存点分十进制的地址 - - listen(listenfd, LISTENQ); - socklen_t listendAddrLen = sizeof(listendAddr); - getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen);//获取监听的地址和端口 - printf("listen address = %s:%d\n", inet_ntoa(listendAddr.sin_addr), ntohs(listendAddr.sin_port)); +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; //分别表示监听的地址,连接的本地地址,连接的对端地址 + socklen_t peerLen; + char ipAddr[INET_ADDRSTRLEN]; //保存点分十进制的地址 + + listen(listenfd, LISTENQ); + socklen_t listendAddrLen = sizeof(listendAddr); + getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen); //获取监听的地址和端口 + printf("listen address = %s:%d\n", inet_ntoa(listendAddr.sin_addr), ntohs(listendAddr.sin_port)); socklen_t connectedAddrLen = sizeof(connectedAddr); - getsockname(listenfd, (struct sockaddr *)&connectedAddr, &connectedAddrLen);//获取connfd表示的连接上的本地地址(服务端的地址) - printf("connected server address = %s:%d\n", inet_ntoa(connectedAddr.sin_addr), ntohs(connectedAddr.sin_port)); + 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; *serverport = ntohs(connectedAddr.sin_port); - 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)); + 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; *clinetport = ntohs(peerAddr.sin_port); - return; + return; } static handler_t ouput_function(server *srv, connection *con, int resultcode, char *message, char *data) { cJSON *res; - const char *result_str; + const char *result_str; /*创建json对象*/ res = cJSON_CreateObject(); @@ -191,63 +234,64 @@ static handler_t ouput_function(server *srv, connection *con, int resultcode, ch cJSON_AddStringToObject(res, "message", message); cJSON_AddStringToObject(res, "data", data); - log_error_write(srv, __FILE__, __LINE__, "s","test"); - + log_error_write(srv, __FILE__, __LINE__, "s","test"); + /*json对象转换为json字符串*/ - result_str = cJSON_PrintUnformatted(res); - buffer *result_info = buffer_init(); - result_info = buffer_init_string(result_str); + result_str = cJSON_PrintUnformatted(res); + buffer *result_info = buffer_init_string(result_str); chunkqueue_append_buffer(con->write_queue, result_info); - buffer_free(result_info); + buffer_free(result_info); con->http_status = 200; con->file_finished = 1; cJSON_Delete(res); return HANDLER_FINISHED; } - /*post 先判断用户是否认证过 ip是唯一的*/ /*用户认证过-返回resultcode=0 message data(username、user_ip、login_time)*/ /*用户未认证通过-返回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; USER_INFO *uinfo; //cJSON *cjson; //cJSON *uip; - uint32_t serverip = 0; uint32_t clientip = 0; - in_port_t serverport = 0; in_port_t clientport = 0; + uint32_t serverip = 0; + in_port_t serverport = 0; char str[INET_ADDRSTRLEN]; char dtr[INET_ADDRSTRLEN]; RESULT *uresult; - uresult = ( RESULT *)malloc(sizeof(RESULT)); + uresult = (RESULT *)malloc(sizeof(RESULT)); if(NULL == uresult) { - return HANDLER_ERROR; + return HANDLER_ERROR; } 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); - inet_ntop(AF_INET, &clientip, dtr, sizeof(dtr)); - log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport); + inet_ntop(AF_INET, &clientip, dtr, sizeof(dtr)); + 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判断用户是否认证通过*/ uinfo = ufind_user(clientip); if (NULL == uinfo) - { + { char *name = ""; char *messgae = "用户未认证成功"; uresult->resultcode = 0; /*表示用户未认证成功*/ strncpy(uresult->message, messgae, MESSAGE_SIZE); - + ouput_function(srv, con, uresult->resultcode, uresult->message, name); return HANDLER_FINISHED; @@ -267,9 +311,9 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d) { return HANDLER_ERROR; } - + /*给data内容赋值,认证成功,给前端返回用户名、用户IP、当前登录时间*/ - time(&tmpcal_ptr); + time(&tmpcal_ptr); log_error_write(srv, __FILE__, __LINE__, "d", tmpcal_ptr); uresult->data.login_time = tmpcal_ptr; @@ -278,180 +322,178 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d) strncpy(uresult->data.username, uinfo->auth_user.user_name, 32); 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, "user_ip", str); cJSON_AddNumberToObject(data, "login_time", uresult->data.login_time); - + /*创建json对象*/ res = cJSON_CreateObject(); if(!res) return HANDLER_ERROR; - uresult->resultcode = 1; /*表示用户已经认证成功*/ + uresult->resultcode = 1; /*表示用户已经认证成功*/ strncpy(uresult->message, messgae, 60); /*用户已经认证通过*/ cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddItemToObject(res, "data", data); - - log_error_write(srv, __FILE__, __LINE__, "s","test"); - + + log_error_write(srv, __FILE__, __LINE__, "s","test"); + /*json对象转换为json字符串*/ - result_str = cJSON_Print(res); - buffer *result_info = buffer_init(); - result_info = buffer_init_string(result_str); + result_str = cJSON_Print(res); + buffer *result_info = buffer_init_string(result_str); chunkqueue_append_buffer(con->write_queue, result_info); - buffer_free(result_info); + buffer_free(result_info); con->http_status = 200; con->file_finished = 1; cJSON_Delete(res); 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; //mod_portal_plugin_data *p = p_d; cJSON *cjson; - USER_AUTH_RET *resultinfo; + USER_AUTH_RET *resultinfo; char *account = NULL; - char *pwd = NULL; + char *pwd = NULL; RESULT *uresult; - uint32_t serverip = 0; uint32_t clientip = 0; - in_port_t serverport = 0; in_port_t clientport = 0; + uint32_t serverip = 0; + in_port_t serverport = 0; char str[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); - inet_ntop(AF_INET,&clientip, dtr, sizeof(dtr)); - log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport); + inet_ntop(AF_INET, &clientip, dtr, sizeof(dtr)); + log_error_write(srv, __FILE__, __LINE__, "ssd","test", dtr, clientport); - uresult = ( RESULT *)malloc(sizeof(RESULT)); + uresult = (RESULT *)malloc(sizeof(RESULT)); if(NULL == uresult) { - return HANDLER_ERROR; + return HANDLER_ERROR; } - resultinfo = (USER_AUTH_RET *)malloc(sizeof(USER_AUTH_RET)); - if (NULL == resultinfo) - { - return HANDLER_ERROR; - } + resultinfo = (USER_AUTH_RET *)malloc(sizeof(USER_AUTH_RET)); + if (NULL == resultinfo) + { + return HANDLER_ERROR; + } /*get payload*/ - handler_t result = connection_handle_read_post_state(srv, con); - if (result != HANDLER_GO_ON) + handler_t result = connection_handle_read_post_state(srv, con); + if (result != HANDLER_GO_ON) { 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"); - /*auth success*/ - if(resultinfo->ret == AUTH_SUCCESS) - { - cJSON *res; + 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"); + + /*auth success*/ + if (resultinfo->ret == AUTH_SUCCESS) + { + cJSON *res; cJSON *data; - const char *result_str; + const char *result_str; time_t tmpcal_ptr; int num; - log_error_write(srv, __FILE__, __LINE__, "s","test"); + log_error_write(srv, __FILE__, __LINE__, "s", "test"); /*获取目前在线用户数 超过最大在线用户数则失败*/ 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; - log_error_write(srv, __FILE__, __LINE__, "sd","test", max_num); - if(num >= MAX_ONLINE_NUM) + log_error_write(srv, __FILE__, __LINE__, "sd", "test", max_num); + if (num >= MAX_ONLINE_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", num); + log_error_write(srv, __FILE__, __LINE__, "sd", "test", MAX_ONLINE_NUM); /*创建json对象*/ res = cJSON_CreateObject(); - if(!res) return HANDLER_ERROR; + if (!res) + return HANDLER_ERROR; cJSON_AddNumberToObject(res, "resultcode", 8); cJSON_AddStringToObject(res, "message", "用户达到最大数量"); cJSON_AddStringToObject(res, "data", ""); /*json对象转换为json字符串*/ - result_str = cJSON_Print(res); - buffer *result_info = buffer_init(); - result_info = buffer_init_string(result_str); + result_str = cJSON_Print(res); + buffer *result_info = buffer_init_string(result_str); chunkqueue_append_buffer(con->write_queue, result_info); - buffer_free(result_info); + buffer_free(result_info); con->http_status = 200; con->file_finished = 1; cJSON_Delete(cjson); @@ -459,21 +501,21 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d) return HANDLER_FINISHED; } - /*auth success-用户信息保存在本地IP监测表*/ + /*auth success-用户信息保存在本地IP监测表*/ /*获取下行报文数、字节数、在线时间 目前设置默认值为0*/ - uadd_user(clientip, account, resultinfo->user_id, resultinfo->group_id, 0, 0, 0); - int num1 = uprintf_users(); + uadd_user(clientip, account, resultinfo->user_id, resultinfo->group_id, 0, 0, 0); + int num1 = uprintf_users(); log_error_write(srv, __FILE__, __LINE__, "sd", "test", num1); - + /*创建json对象*/ data = cJSON_CreateObject(); - if(!data) + if (!data) { return HANDLER_ERROR; } - + /*给data内容赋值,认证成功,给前端返回用户名、用户IP、当前登录时间*/ - time(&tmpcal_ptr); + time(&tmpcal_ptr); log_error_write(srv, __FILE__, __LINE__, "d", 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); 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, "user_ip", str); cJSON_AddNumberToObject(data, "login_time", uresult->data.login_time); - uresult->resultcode = resultinfo->ret;; /*表示用户未认证成功*/ + uresult->resultcode = resultinfo->ret; /*表示用户未认证成功*/ strncpy(uresult->message, mes[resultinfo->ret], 60); /*创建json对象*/ res = cJSON_CreateObject(); - if(!res) return HANDLER_ERROR; + if (!res) + return HANDLER_ERROR; cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddItemToObject(res, "data", data); - - log_error_write(srv, __FILE__, __LINE__, "s","test"); - + + log_error_write(srv, __FILE__, __LINE__, "s", "test"); + /*json对象转换为json字符串*/ - result_str = cJSON_Print(res); - buffer *result_info = buffer_init(); - result_info = buffer_init_string(result_str); - log_error_write(srv, __FILE__, __LINE__, "s","test"); + result_str = cJSON_Print(res); + buffer *result_info = buffer_init_string(result_str); + log_error_write(srv, __FILE__, __LINE__, "s", "test"); chunkqueue_append_buffer(con->write_queue, result_info); - buffer_free(result_info); + buffer_free(result_info); con->http_status = 200; con->file_finished = 1; cJSON_Delete(cjson); - log_error_write(srv, __FILE__, __LINE__, "s","test"); + log_error_write(srv, __FILE__, __LINE__, "s", "test"); cJSON_Delete(res); return HANDLER_FINISHED; - - - #if 0 + +#if 0 /*1.跳转到认证成功界面*/ buffer *return_info = buffer_init(); @@ -530,105 +571,102 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d) printf("page url:%s\n", page); window.location = *page; */ - #endif - - log_error_write(srv, __FILE__, __LINE__, "s","test"); - } - else if(resultinfo->ret == AUTH_FAIL_LOCK) /*用户锁定*/ - { - log_error_write(srv, __FILE__, __LINE__, "s","test"); +#endif + + log_error_write(srv, __FILE__, __LINE__, "s", "test"); + } + else if (resultinfo->ret == AUTH_FAIL_LOCK) /*用户锁定*/ + { + log_error_write(srv, __FILE__, __LINE__, "s", "test"); cJSON *res; cJSON *data; - const char *result_str; + const char *result_str; - /*创建json对象*/ + /*创建json对象*/ data = cJSON_CreateObject(); - if(!data) + if (!data) { return HANDLER_ERROR; } - + uresult->data.remain_time = resultinfo->remain_lock_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); /*创建json对象*/ res = cJSON_CreateObject(); - if(!res) return HANDLER_ERROR; + if (!res) + return HANDLER_ERROR; cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddItemToObject(res, "data", data); /*json对象转换为json字符串*/ - result_str = cJSON_Print(res); - buffer *result_info = buffer_init(); - result_info = buffer_init_string(result_str); + result_str = cJSON_Print(res); + buffer *result_info = buffer_init_string(result_str); chunkqueue_append_buffer(con->write_queue, result_info); - buffer_free(result_info); + buffer_free(result_info); con->http_status = 200; con->file_finished = 1; cJSON_Delete(cjson); cJSON_Delete(res); return HANDLER_FINISHED; - - } - else /*认证失败*/ - { - printf("auth fail\n"); - log_error_write(srv, __FILE__, __LINE__, "s","test"); + } + else /*认证失败*/ + { + printf("auth fail\n"); + log_error_write(srv, __FILE__, __LINE__, "s", "test"); cJSON *res; - const char *result_str; - + const char *result_str; + int num = uprintf_users(); - log_error_write(srv, __FILE__, __LINE__, "sd","test", num); + log_error_write(srv, __FILE__, __LINE__, "sd", "test", num); /*创建json对象*/ res = cJSON_CreateObject(); - if(!res) return HANDLER_ERROR; - - uresult->resultcode = resultinfo->ret;; /*表示用户认证失败*/ - strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE); + if (!res) + return HANDLER_ERROR; - log_error_write(srv, __FILE__, __LINE__, "sd","test", uresult->resultcode); - log_error_write(srv, __FILE__, __LINE__, "ss","test", uresult->message); + uresult->resultcode = resultinfo->ret; /*表示用户认证失败*/ + strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE); + + log_error_write(srv, __FILE__, __LINE__, "sd", "test", uresult->resultcode); + log_error_write(srv, __FILE__, __LINE__, "ss", "test", uresult->message); cJSON_AddNumberToObject(res, "resultcode", uresult->resultcode); cJSON_AddStringToObject(res, "message", uresult->message); cJSON_AddStringToObject(res, "data", ""); /*json对象转换为json字符串*/ - result_str = cJSON_PrintUnformatted(res); - buffer *result_info = buffer_init(); - result_info = buffer_init_string(result_str); + result_str = cJSON_PrintUnformatted(res); + buffer *result_info = buffer_init_string(result_str); chunkqueue_append_buffer(con->write_queue, result_info); - buffer_free(result_info); + buffer_free(result_info); con->http_status = 200; con->file_finished = 1; - cJSON_Delete(cjson); + cJSON_Delete(cjson); cJSON_Delete(res); return HANDLER_FINISHED; - - } - + } + cJSON_Delete(cjson); cJSON_Delete(uitem); cJSON_Delete(pitem); return HANDLER_FINISHED; } - /*认证模块处理函数*/ /*根据传输过来的url分情况执行*/ -static handler_t mod_portal_uri_handler(server *srv, connection *con, void* p_d) -{ - /*case 1 -判断认证 - case 2 -判断用户名和密码*/ - log_error_write(srv, __FILE__, __LINE__, "s","mod_portal_uri_handler"); - +static handler_t mod_portal_uri_handler(server *srv, connection *con, void *p_d) +{ + /*case 1 -判断认证 + case 2 -判断用户名和密码*/ + log_error_write(srv, __FILE__, __LINE__, "s", "mod_portal_uri_handler"); + handler_t t = HANDLER_GO_ON; p_d = p_d; if (con->request.http_method == HTTP_METHOD_GET) @@ -636,45 +674,47 @@ static handler_t mod_portal_uri_handler(server *srv, connection *con, void* p_d) 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; - 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); - if (r != HANDLER_GO_ON) return r; + if (r != HANDLER_GO_ON) + return r; } } else if (0 == con->request.content_length) { return HANDLER_GO_ON; - } + } - log_error_write(srv, __FILE__, __LINE__, "s","test"); - /*url 与"/ISG-login"匹配,判断用户是否认证过*/ + log_error_write(srv, __FILE__, __LINE__, "s", "test"); + /*url 与"/ISG-login"匹配,判断用户是否认证过*/ if (0 == strcmp(con->uri.path->ptr, "/ISG-login")) { 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")) { 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->file_finished = 1; return t; } - -SETDEFAULTS_FUNC(mod_portal_set_defaults) +SETDEFAULTS_FUNC(mod_portal_set_defaults) { mod_portal_plugin_data *p = p_d; - p = p;//解决编译告警; + p = p; //解决编译告警; //srv = srv;//解决编译告警; init_svr_ptr(srv); @@ -682,16 +722,16 @@ SETDEFAULTS_FUNC(mod_portal_set_defaults) return HANDLER_GO_ON; } - 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->init = mod_portal_init; +int mod_portal_plugin_init(plugin *p) +{ + p->version = LIGHTTPD_VERSION_ID; + p->name = buffer_init_string("portal"); + p->init = mod_portal_init; p->set_defaults = mod_portal_set_defaults; p->handle_uri_clean = mod_portal_uri_handler; - p->cleanup = mod_portal_free; - p->data = NULL; + p->cleanup = mod_portal_free; + p->data = NULL; return 0; } diff --git a/libs/src/lighttpd-1.4.51/src/mod_redirect.c b/libs/src/lighttpd-1.4.51/src/mod_redirect.c index 511255d59..398882491 100644 --- a/libs/src/lighttpd-1.4.51/src/mod_redirect.c +++ b/libs/src/lighttpd-1.4.51/src/mod_redirect.c @@ -153,28 +153,37 @@ static int mod_redirect_patch_connection(server *srv, connection *con, plugin_da } /*通过fd获取对端和远端的IP地址*/ -void get_local_peer_ip(int listenfd, uint32_t *serverip, uint32_t *clientip) -{ - struct sockaddr_in listendAddr, connectedAddr, peerAddr;//分别表示监听的地址,连接的本地地址,连接的对端地址 - socklen_t peerLen; - char ipAddr[INET_ADDRSTRLEN];//保存点分十进制的地址 - - listen(listenfd, LISTENQ); - socklen_t listendAddrLen = sizeof(listendAddr); - getsockname(listenfd, (struct sockaddr *)&listendAddr, &listendAddrLen);//获取监听的地址和端口 - printf("listen address = %s:%d\n", inet_ntoa(listendAddr.sin_addr), ntohs(listendAddr.sin_port)); +void get_local_peer_ip(connection *con, uint32_t *serverip, uint32_t *clientip) +{ + char *tmp; + struct in_addr ipv4_addr; + buffer *p = con->request.http_host; + char *str = strdup(p->ptr); + + if (clientip) + { + *clientip = con->dst_addr.ipv4.sin_addr.s_addr; + } + + tmp = strrchr(str, ':'); - socklen_t connectedAddrLen = sizeof(connectedAddr); - 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) { plugin_data *p = p_d; //struct burl_parts_t burl; @@ -184,7 +193,7 @@ URIHANDLER_FUNC(mod_redirect_uri_handler) { uint32_t clientip = 0; 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); if (!p->conf.redirect->used) return HANDLER_GO_ON;