diff --git a/Makefile b/Makefile index ee27211ec..7e1bf6fbe 100755 --- a/Makefile +++ b/Makefile @@ -129,13 +129,13 @@ endif usermanager: ifeq ($(OPT), clean) $(MLOG)make $(MAKE_FLAGS) -C Product/build -f user.usermanager-auth.Makefile cleanall MLOG=$(MLOG) MAKE_TARGET=usermanager-auth - $(MLOG)make $(MAKE_FLAGS) -C Product/build -f user.usermanager-test.Makefile cleanall MLOG=$(MLOG) MAKE_TARGET=usermanager-test +# $(MLOG)make $(MAKE_FLAGS) -C Product/build -f user.usermanager-test.Makefile cleanall MLOG=$(MLOG) MAKE_TARGET=usermanager-test else ifeq ($(OPT), install) $(MLOG)make $(MAKE_FLAGS) -C Product/build -f user.usermanager-auth.Makefile install DIR=$(DIR) MLOG=$(MLOG) MAKE_TARGET=usermanager-auth - $(MLOG)make $(MAKE_FLAGS) -C Product/build -f user.usermanager-test.Makefile install DIR=$(DIR) MLOG=$(MLOG) MAKE_TARGET=usermanager-test +# $(MLOG)make $(MAKE_FLAGS) -C Product/build -f user.usermanager-test.Makefile install DIR=$(DIR) MLOG=$(MLOG) MAKE_TARGET=usermanager-test else $(MLOG)make all $(MAKE_FLAGS) -C Product/build -f user.usermanager-auth.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=usermanager-auth - $(MLOG)make all $(MAKE_FLAGS) -C Product/build -f user.usermanager-test.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=usermanager-test +# $(MLOG)make all $(MAKE_FLAGS) -C Product/build -f user.usermanager-test.Makefile MLOG=$(MLOG) DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=usermanager-test endif configm: diff --git a/Platform/user/configm/config-server/user_manager_config/user_recover_config.c b/Platform/user/configm/config-server/user_manager_config/user_recover_config.c index 153d547a6..bc4c76f6b 100644 --- a/Platform/user/configm/config-server/user_manager_config/user_recover_config.c +++ b/Platform/user/configm/config-server/user_manager_config/user_recover_config.c @@ -170,6 +170,7 @@ ret_code userecover_config_get_all(uint source, s2j_delete_struct_obj(temp_user); UCHAR_FREE(user_db); } - + + printf("success user_manager recovering ... \n"); return ret; } \ No newline at end of file diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/common_user.h b/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/common_user.h index 8263dc604..523a6d0d6 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/common_user.h +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/include/common_user.h @@ -1,7 +1,8 @@ #ifndef COMMON_USER_H_ #define COMMON_USER_H_ -#define SPECHAR(element) (strpbrk((element), "~!@#$%^&*()_+{}|:\"<>?\\,./;\'[]-=`")) //校验特殊字符 +//#define SPECHAR(element) (strpbrk((element), "~!@#$%^&*()_+{}|:\"<>?\\,./;\'[]-=`")) //校验特殊字符 +#define SPECHAR(element) (strpbrk((element), "@,;")) //校验特殊字符 #define GETID(ID, NAME1, NAME2) ((((ID) != 0) && (strcmp((NAME1), (NAME2)) == 0)) ? (ID) : 0) //根据name查询ID #define CHECKOUTARG(element) ((NULL == (element) || "" == (element) || SPECHAR(element)) ? true : false) //校验参数 #define INVALID_INDEX (0) @@ -91,4 +92,18 @@ do{ \ } else {*id_int_out = 0;} \ }while(0) +/* 去除字符串前后空格 */ +#define TRIM_NAME(in, out) \ +do { \ + char * c; \ + int i; \ + size_t nLen = strlen(in); \ + i = 0; \ + while(in[i] == ' ') {i++;} \ + c = &in[i]; \ + i = nLen - 1; \ + while(in[i] == ' ') {i--;} \ + memcpy(out, c, i + 1 - (c - in)); \ +} while (0) + #endif diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c index 3442fde5e..c4fb2b596 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user.c @@ -11,13 +11,11 @@ #include "database.h" #include "cjson/cJSON.h" #include "s2j/s2j.h" -//#include "sg/user/user_manager/user_auth.h" extern ARRAY g_user_index_head; extern USERGROUP g_group_table[GROUP_INDEX_MAX]; extern exce_mod_user g_user_modfunc_table[USER_ATTRIBUTE_NUM]; extern void * um_hdbc; -//extern USER_AUTH_LIST g_user_auth_ret_table[]; USERACCOUNT g_user_table[USER_INDEX_MAX]; /*初始化参数*/ @@ -35,10 +33,11 @@ int init_user() } /*添加元素-新增用户*/ -void usermanager_add_user(char* uname, char* gname, char* udesp, char* pwd, int multi, int valid, char* valid_begin_time, char* valid_end_time, USERADD* uaddres) +void usermanager_add_user(char* uname_in, char* gname, char* udesp, char* pwd, int multi, int valid, char* valid_begin_time, char* valid_end_time, USERADD* uaddres) { time_t begin_time; time_t end_time; + char uname[UNAMESIZE] = {0}; if (NULL == uaddres) { @@ -46,7 +45,7 @@ void usermanager_add_user(char* uname, char* gname, char* udesp, char* pwd, int } uaddres->userID = INVALID_INDEX; - if (NULL == uname || NULL == gname) + if (NULL == uname_in || NULL == gname) { uaddres->result = ADDGROUP_ERROR; return; @@ -58,19 +57,22 @@ void usermanager_add_user(char* uname, char* gname, char* udesp, char* pwd, int } /* 校验用户名和描述长度 */ - if (UNAMESIZE < strlen(uname) || 0 >= strlen(uname) || UDESIZE < strlen(udesp)) + if (UNAMESIZE < strlen(uname_in) || 0 >= strlen(uname_in) || UDESIZE < strlen(udesp)) { uaddres->result = ADDUSER_FAIL_LENGTH; return; } /* 校验用户名中不含特殊字符 */ - if (SPECHAR(uname)) + if (SPECHAR(uname_in)) { uaddres->result = ADDUSER_FAIL_NAMESPE; return; } + /* 去除用户名前后空格 */ + TRIM_NAME(uname_in, uname); + if (NULL == pwd || 0 == strcmp("",pwd)) { pwd = "A31as%4Gb"; @@ -957,7 +959,7 @@ void um_getuser_db(char ** user_db) UNIQUE KEY user_name (user_name) USING BTREE,\ KEY group_id (group_id) USING BTREE,\ CONSTRAINT user_account_ibfk_1 FOREIGN KEY (group_id) REFERENCES user_group (id) ON DELETE CASCADE ON UPDATE CASCADE\ - ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8"; + ) ENGINE=InnoDB DEFAULT CHARSET=utf8"; ret_create = create_database_table(USER_MANAGER_DBID, um_hdbc, USER_TABLE, create_user); if(DB_RET_OK != ret_create) { diff --git a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c index 3e753befa..44898c722 100644 --- a/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c +++ b/Platform/user/configm/config-server/user_manager_config/usermanager-server/user_group.c @@ -30,9 +30,11 @@ int init_group() } /* 新增用户组 */ -int add_group(char* name, char* description) +int add_group(char* name_in, char* description) { - if (NULL == name) + char name[GNAMESIZE] = {0}; + + if (NULL == name_in) { return ADDGROUP_ERROR; } @@ -43,17 +45,20 @@ int add_group(char* name, char* description) } /* 校验用户组名和描述的长度 */ - if (GNAMESIZE < strlen(name) || 0 >= strlen(name) || GDESIZE < strlen(description)) + if (GNAMESIZE < strlen(name_in) || 0 >= strlen(name_in) || GDESIZE < strlen(description)) { return ADDGROUP_FAIL_LENGTH; } /* 校验特殊字符 */ - if (SPECHAR(name)) + if (SPECHAR(name_in)) { return ADDGROUP_FAIL_SPECHARS; } + /* 去除用户组名前后空格 */ + TRIM_NAME(name_in, name); + /* 连接数据库 */ re_connect(); if(NULL == um_hdbc) @@ -461,7 +466,7 @@ void um_getgroup_db(char ** group_db) PRIMARY KEY (uuid),\ UNIQUE KEY id (id) USING BTREE,\ UNIQUE KEY gname (gname) USING BTREE\ - ) ENGINE=InnoDB AUTO_INCREMENT=1059 DEFAULT CHARSET=utf8"; + ) ENGINE=InnoDB DEFAULT CHARSET=utf8"; ret_create = create_database_table(USER_MANAGER_DBID, um_hdbc, USER_GROUP_TABLE, create_group); if(DB_RET_OK != ret_create) { diff --git a/Product/user/user_manager/usermanager-auth/user_auth.c b/Product/user/user_manager/usermanager-auth/user_auth.c index f3883a686..43665d9f4 100644 --- a/Product/user/user_manager/usermanager-auth/user_auth.c +++ b/Product/user/user_manager/usermanager-auth/user_auth.c @@ -239,7 +239,7 @@ bool get_config_data(void * auth_hdbc, int * config_data) return false; } - char * select_sql = "SELECT locktime config_lock_time, failcount config_fail_num, timehorizon config_fail_time FROM `authparas` LIMIT 0,1"; + char * select_sql = "SELECT locktime config_lock_time, failcount config_fail_num, timehorizon config_fail_time FROM authparas LIMIT 0,1"; char * ret_sql = select_datebase_by_number(20, auth_hdbc, "authparas", select_sql, 1, 0, &num, 0); if(0 == num || NULL == ret_sql) @@ -311,7 +311,7 @@ bool get_user_from_database(char* username, void* hdbc, USERACCOUNT* user_info, return false; } - char * select_sql = "SELECT id, group_id, multi_player, valid_always, user_name,password, udescription,valid_begin_time,valid_end_time FROM `user_account`WHERE user_name = ?"; + char * select_sql = "SELECT id, group_id, multi_player, valid_always, user_name,password, udescription,valid_begin_time,valid_end_time FROM user_account WHERE user_name = ?"; ret_sql = select_datebase_by_number(20, hdbc, "user_account", select_sql, 1, 0, num_sql, 1, DB_DATA_STRING_TYPE, strlen(username)+1, username); @@ -455,6 +455,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) unsigned short user_id, group_id; int init_queue_ret; //初始化循环列表的结果 int user_valid; //数据库中的数据 + int user_multi; int config_lock_time = 0; //锁定后的锁定时间,锁定后 int config_fail_num = 0; //规定时间内允许失败的次数,锁定次数,锁定前 int config_fail_time = 0; //规定时间,失败的时间范围,锁定前 @@ -498,24 +499,6 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) /* 校验上述的三个参数都要大于0 */ //3、根据用户名查询用户信息-用户id和用户组id - // user_info = (USERACCOUNT*)malloc(sizeof(USERACCOUNT)); - // memset(user_info, 0, sizeof(USERACCOUNT)); - // if (NULL == user_info) - // { - // /* 记录日志 */ - // //printf("user_auth()->user_auth->user_info:error. \n"); - // auth_result->ret = AUTH_ERR; - // return; - // } - //读取json文件获取数据 - // get_from_json(username, user_info); - // if (NULL == user_info) - // { - // auth_result->ret = AUTH_FAIL_PASSWD; - // xfree(user_info); - // return; - // } - /* 数据库查询 */ bool ret_getuser = get_user_from_database(username, auth_hdbc, &user_info, &sql_num); if(!ret_getuser) @@ -598,7 +581,21 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) } } - //7、判断在线用户是否到最大值 + //7、判断是否允许多用户登陆 + user_multi = AUTH_MULTI_GET(user_info.multi_valid); + if(1 == user_multi) + { + if(1 == AUTH_RECORD.online_num) + { + auth_result->ret = AUTH_FAIL_MULTI; + + /* 认证失败处理 */ + auth_fail_operate(user_id, login_time, config_fail_time); + return; + } + } + + //8、判断在线用户是否到最大值(100) if (AUTH_USER_INDEX_MAX - 2 <= AUTH_RECORD.online_num) { auth_result->ret = AUTH_FAIL_OVER; @@ -608,7 +605,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) return; } - //8、匹配密码 + //9、匹配密码 if (0 != strcmp(password, user_info.passwd)) { auth_result->ret = AUTH_FAIL_PASSWD; @@ -618,7 +615,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) return; } - //9、认证成功处理 + //10、认证成功处理 AUTH_RECORD.group_id = group_id; //更新用户组id empty_fail_time_queue(user_id); AUTH_RECORD.online_num++; diff --git a/Product/user/user_manager/usermanager-test/test_usermanager.c b/Product/user/user_manager/usermanager-test/test_usermanager.c index 307c7a445..aff9cc66e 100644 --- a/Product/user/user_manager/usermanager-test/test_usermanager.c +++ b/Product/user/user_manager/usermanager-test/test_usermanager.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "common_user.h" #include "array_index.h" #include "user_group.h" @@ -70,22 +71,8 @@ int main6(void) return 0; } -void test() +int main5(void) { - char *a = "和家亲"; - char *b = "asd"; - char *c = "123"; - printf("%ld .\n",strlen(a)); - printf("%ld .\n",strlen(b)); - printf("%ld .\n",strlen(c)); - return; -} - -int main(void) -{ - - //test(); - char * testrec; int testnum; userecover_config_get_all(CONFIG_FROM_RECOVER1,testrec, &testnum); @@ -96,6 +83,14 @@ int main(void) ret_code ret_pro; //执行结果 int outlen = 1; //out数据长度 + printf("\n************************************user uuid -> user 详情*******************************************\n"); + testin = "{\"type\": 3,\"data\":{\"user_id\": 15}}"; + ret_pro = user_config_get(1, testin, strlen(testin)+1, testout, &outlen); + printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); + + return 0; + + printf("\n************************************修改 group 描述*******************************************\n"); testin = "{\"type\": 2,\"data\": {\"gid\": 1013,\"gdescription\": \"修改修改用户组的描述修改修改用户组的描述一二\"}}"; ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); @@ -107,8 +102,6 @@ int main(void) printf("执行结果:%d, 返回数据:%s .\n", ret_pro, testout); - return 0; - printf("************************************新增 group*******************************************\n"); testin = "{\"type\": 0,\"data\": {\"gname\": \"group011\",\"gdescription\": \"描述group011\"}}"; ret_pro = usergroup_config_proc(1, 1, testin, strlen(testin)+1, testout, &outlen); @@ -133,12 +126,44 @@ int main(void) return 0; } -int main4(void) +void trim(char *out, char *in) { + char * c; + int i; + size_t nLen = strlen(in); + i = 0; + while(in[i] == ' ') + { + i++; + } + c = &in[i]; // 找到第一个非空字符指针 + i = nLen - 1; + while(in[i] == ' ') + { + i--; // 找到最后一个非空字符 + } + memcpy(out, c, i + 1 - (c - in)); + return; +} + + +int main(void) +{ + + + char *name1 = " xi阿斯蒂芬就aom ig "; + int len = strlen(name1); + char name2[100] = {0}; + printf("name1=%s.\n",name1); + TRIM_NAME(name1, name2); + printf("name1=%s.\n",name2); + + return 0; + USER_AUTH_RET user_ret; - user_auth_login("user04", "A31as%4G", &user_ret); - user_auth_login("user04", "A31as%4G", &user_ret); + user_auth_login("user04", "A31as%4Gb", &user_ret); + user_auth_login("user04", "A31as%4Gb", &user_ret); user_auth_login("user04", "A31as%4G", &user_ret); user_auth_login("user04", "A31as%4G", &user_ret); user_auth_login("user04", "A31as%4G", &user_ret); diff --git a/libs/src/lighttpd-1.4.51/src/user_auth.c b/libs/src/lighttpd-1.4.51/src/user_auth.c index 23f31adb8..2d34d513a 100644 --- a/libs/src/lighttpd-1.4.51/src/user_auth.c +++ b/libs/src/lighttpd-1.4.51/src/user_auth.c @@ -63,9 +63,9 @@ do { \ USER_AUTH_LIST g_user_auth_ret_table[AUTH_USER_INDEX_MAX] = { 0 }; /* -* config_lock_time 锁定后-时间,单位(分钟) -* config_fail_num 锁定前-次数 -* config_fail_time 锁定前-时间,单位(分钟) +* g_config_lock_time 锁定后-时间,单位(分钟) +* g_config_fail_num 锁定前-次数 +* g_config_fail_time 锁定前-时间,单位(分钟) */ static int g_config_lock_time, g_config_fail_num, g_config_fail_time; @@ -231,6 +231,77 @@ static void auth_fail_operate(unsigned short user_id, time_t login_time, int con // user_info = NULL; // } +bool get_config_data(void * auth_hdbc, int * config_data) +{ + int num; + if(NULL == auth_hdbc || NULL == config_data) + { + return false; + } + + char * select_sql = "SELECT locktime config_lock_time, failcount config_fail_num, timehorizon config_fail_time FROM authparas LIMIT 0,1"; + char * ret_sql = select_datebase_by_number(20, auth_hdbc, "authparas", select_sql, 1, 0, &num, 0); + + if(0 == num || NULL == ret_sql) + { + return false; + } + + cJSON * root = cJSON_Parse(ret_sql); + if(!root) + { + return false; + } + + cJSON * data = cJSON_GetObjectItem(root, "data"); + if(!data) + { + cJSON_Delete(root); + return false; + } + + int data_num = cJSON_GetArraySize(data); + if (1 != data_num) + { + cJSON_Delete(root); + return false; + } + + cJSON * user_json = cJSON_GetArrayItem(data, 0); + if(!user_json) + { + cJSON_Delete(root); + return false; + } + + /* 解析各个数据项 */ + cJSON * config_lock_time = cJSON_GetObjectItem(user_json, "config_lock_time"); + if(!config_lock_time) + { + cJSON_Delete(root); + return false; + } + config_data[0] = config_lock_time->valueint; + + cJSON * config_fail_num = cJSON_GetObjectItem(user_json, "config_fail_num"); + if(!config_fail_num) + { + cJSON_Delete(root); + return false; + } + config_data[1] = config_fail_num->valueint; + + cJSON * config_fail_time = cJSON_GetObjectItem(user_json, "config_fail_time"); + if(!config_fail_time) + { + cJSON_Delete(root); + return false; + } + config_data[2] = config_fail_time->valueint; + + return true; +} + bool get_user_from_database(char* username, void* hdbc, USERACCOUNT* user_info, int* num_sql) { char * ret_sql = NULL; @@ -240,7 +311,7 @@ bool get_user_from_database(char* username, void* hdbc, USERACCOUNT* user_info, return false; } - char * select_sql = "SELECT id, group_id, multi_player, valid_always, user_name,password, udescription,valid_begin_time,valid_end_time FROM `user_account`WHERE user_name = ?"; + char * select_sql = "SELECT id, group_id, multi_player, valid_always, user_name,password, udescription,valid_begin_time,valid_end_time FROM user_account WHERE user_name = ?"; ret_sql = select_datebase_by_number(20, hdbc, "user_account", select_sql, 1, 0, num_sql, 1, DB_DATA_STRING_TYPE, strlen(username)+1, username); @@ -384,6 +455,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) unsigned short user_id, group_id; int init_queue_ret; //初始化循环列表的结果 int user_valid; //数据库中的数据 + int user_multi; int config_lock_time = 0; //锁定后的锁定时间,锁定后 int config_fail_num = 0; //规定时间内允许失败的次数,锁定次数,锁定前 int config_fail_time = 0; //规定时间,失败的时间范围,锁定前 @@ -412,15 +484,18 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) } //2、数据库查询配置数据 - /*if (false) + int config_data[3] = {0,0,0}; + + bool ret_getconfig = get_config_data(auth_hdbc, config_data); + if (!ret_getconfig) { auth_result->ret = AUTH_FAIL_LACKINFO; - return auth_result; - }*/ + return; + } - config_lock_time = 2; - config_fail_num = 5; - config_fail_time = 40; + config_lock_time = config_data[0]; + config_fail_num = config_data[1]; + config_fail_time = config_data[2]; /* 校验上述的三个参数都要大于0 */ //3、根据用户名查询用户信息-用户id和用户组id @@ -507,7 +582,21 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) } } - //7、判断在线用户是否到最大值 + //7、判断是否允许多用户登陆 + user_multi = AUTH_MULTI_GET(user_info.multi_valid); + if(1 == user_multi) + { + if(1 == AUTH_RECORD.online_num) + { + auth_result->ret = AUTH_FAIL_MULTI; + + /* 认证失败处理 */ + auth_fail_operate(user_id, login_time, config_fail_time); + return; + } + } + + //8、判断在线用户是否到最大值(100) if (AUTH_USER_INDEX_MAX - 2 <= AUTH_RECORD.online_num) { auth_result->ret = AUTH_FAIL_OVER; @@ -517,7 +606,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) return; } - //8、匹配密码 + //9、匹配密码 if (0 != strcmp(password, user_info.passwd)) { auth_result->ret = AUTH_FAIL_PASSWD; @@ -527,7 +616,7 @@ void user_auth_login(char* username, char* password, USER_AUTH_RET *auth_result) return; } - //9、认证成功处理 + //10、认证成功处理 AUTH_RECORD.group_id = group_id; //更新用户组id empty_fail_time_queue(user_id); AUTH_RECORD.online_num++;