Mod aaa-12 修改获取客户端、服务端IP地址和端口号代码
RCA: SOL: 修改人:chenling 检视人:
This commit is contained in:
parent
daddffdb7e
commit
0cdecd1c7e
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue