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 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,7 +131,8 @@ 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));
@ -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;
srv = srv;
if (!p) return HANDLER_GO_ON;
if (!p)
return HANDLER_GO_ON;
//dlclose(p->cfgm_lib);
free(p);
@ -151,31 +155,70 @@ 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)
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];//保存点分十进制的地址
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));
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)
@ -191,12 +234,11 @@ 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);
con->http_status = 200;
@ -205,37 +247,39 @@ static handler_t ouput_function(server *srv, connection *con, int resultcode, ch
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);
@ -269,7 +313,7 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d)
}
/*给data内容赋值认证成功给前端返回用户名、用户IP、当前登录时间*/
time(&tmpcal_ptr);
time(&tmpcal_ptr);
log_error_write(srv, __FILE__, __LINE__, "d", 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);
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);
@ -288,168 +332,166 @@ static handler_t judge_user_auth(server *srv, connection *con, void* p_d)
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);
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;
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);
con->http_status = 200;
@ -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);
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,20 +571,20 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
printf("page url:%s\n", page);
window.location = *page;
</script>*/
#endif
#endif
log_error_write(srv, __FILE__, __LINE__, "s","test");
}
else if(resultinfo->ret == AUTH_FAIL_LOCK) /*用户锁定*/
{
log_error_write(srv, __FILE__, __LINE__, "s","test");
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;
}
@ -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;
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);
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(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;
if (!res)
return HANDLER_ERROR;
uresult->resultcode = resultinfo->ret;; /*表示用户认证失败*/
strncpy(uresult->message, mes[resultinfo->ret], MESSAGE_SIZE);
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);
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);
@ -611,8 +651,7 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
cJSON_Delete(cjson);
cJSON_Delete(res);
return HANDLER_FINISHED;
}
}
cJSON_Delete(cjson);
cJSON_Delete(uitem);
@ -620,14 +659,13 @@ static handler_t judge_account_pwd(server *srv, connection *con, void* p_d)
return HANDLER_FINISHED;
}
/*认证模块处理函数*/
/*根据传输过来的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 -*/
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;
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;
}
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)
@ -650,31 +691,30 @@ 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");
/*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)
{
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;
}

View File

@ -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)
void get_local_peer_ip(connection *con, uint32_t *serverip, uint32_t *clientip)
{
struct sockaddr_in listendAddr, connectedAddr, peerAddr;//分别表示监听的地址,连接的本地地址,连接的对端地址
socklen_t peerLen;
char ipAddr[INET_ADDRSTRLEN];//保存点分十进制的地址
char *tmp;
struct in_addr ipv4_addr;
buffer *p = con->request.http_host;
char *str = strdup(p->ptr);
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));
if (clientip)
{
*clientip = con->dst_addr.ipv4.sin_addr.s_addr;
}
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;
tmp = strrchr(str, ':');
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;