secgateway/Product/user/user_manager/user.c

272 lines
6.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "common_user.h"
#include "array_index.h"
#include "user_mod.h"
#include "sg/user/user_manager/user_group.h"
#include "sg/user/user_manager/user.h"
extern ARRAY g_user_index_head;
extern USERGROUP g_group_table[];
extern exce_mod_user g_user_modfunc_table[];
USERACCOUNT g_user_table[USER_INDEX_MAX];
/*初始化参数*/
int init_user()
{
/* 初始化用户的index */
int init_result = init_array(&g_user_index_head, USER_INDEX_MAX);
if (INIT_FAIL == init_result)
{
return INIT_FAIL;
}
memset(g_user_table, 0, sizeof(g_user_table));
return INIT_SUCCESS;
}
/*添加元素-新增用户*/
void usermanager_add_user(char* uname, char* gname, USERADD* uaddres)
{
if (NULL == uaddres)
{
return;
}
uaddres->userID = INVALID_INDEX;
/* 校验用户名长度 */
if (NULL == uname || (UNAMESIZE) < strlen(uname) || 0 >= strlen(uname))
{
uaddres->result = ADD_FAIL_NAMELEN;
return;
}
/* 校验用户名中不含特殊字符 */
if (SPECHAR(uname))
{
uaddres->result = ADD_FAIL_NAMESPE;
return;
}
/* 根据用户组名查询用户组ID */
if(NULL == gname)
{
uaddres->result = ADD_FAIL_NOGROUP;
return;
}
unsigned short GID_temp = get_groupid_by_name(gname);
if(INVALID_INDEX == GID_temp)
{
uaddres->result = ADD_FAIL_NOGROUP;
return;
}
/* 校验重名 */
for (int i = 0; i < USER_INDEX_MAX; i++)
{
if (0 == strcmp(uname, g_user_table[i].uname))
{
uaddres->result = ADD_FAIL_NAMEDUP;
return;
}
}
/* 生成用户ID判断用户是否满 */
unsigned short ID = alloc_index(&g_user_index_head);
if (INVALID_INDEX == ID)
{
uaddres->result = ADD_FAIL_USERFULL;
return;
}
/* 存内存 */
g_user_table[ID].ID = ID;
g_user_table[ID].GID = GID_temp;
strcpy(g_user_table[ID].uname, uname);
strcpy(g_user_table[ID].passwd, "123456");
/* 连接数据库存user表 */
/* INSERT INTO `user` SET id = , group_id = , user_name = "", password = "", multi_player = , valid_always = */
uaddres->result = ADD_SUCCESS;
uaddres->userID = ID;
return;
}
/* 按用户ID查询用户 */
void get_user_by_id(unsigned short ID, USERLIST* ulist)
{
unsigned short temp_multi, temp_valid;
char temp_begin_time[UTIME] = { 0 };
char temp_end_time[UTIME] = { 0 };
if (NULL == ulist || INVALID_INDEX >= ID || (USER_INDEX_MAX - 1) <= ID)
{
return;
}
memset(ulist, 0, sizeof(ulist));
/* 内存查询用户 */
temp_multi = MULTI_GET(g_user_table[ID].multi_valid);
temp_valid = VALID_GET(g_user_table[ID].multi_valid);
ulist->ID = ID;
ulist->GID = g_user_table[ID].GID;
ulist->multi = temp_multi;
ulist->valid = temp_valid;
strcpy(ulist->uname, g_user_table[ID].uname);
strcpy(ulist->gname, g_group_table[ulist->GID].gname);
strcpy(ulist->udescription, g_user_table[ID].udescription);
strcpy(ulist->passwd, g_user_table[ID].passwd);
if (1 == temp_valid)
{
TIME_T2STRING(g_user_table[ID].valid_begin_time, temp_begin_time);
TIME_T2STRING(g_user_table[ID].valid_end_time, temp_end_time);
}
strcpy(ulist->valid_begin_time, temp_begin_time);
strcpy(ulist->valid_end_time, temp_end_time);
/* 查数据库,这里查数据库没上面快 */
/* SELECT id, group_id, multi_player, valid_always, user_name, udescription,valid_begin_time,valid_end_time FROM `user`WHERE id = */
return;
}
/* 修改用户-web */
bool mod_user_web(USERLIST* ulist)
{
USERLIST* temp_user;
time_t cur_time;
/* 可以修改的数据用户组ID、描述、密码、公用账号、永久有效、有效期开始时间、有效期结束时间 */
if (NULL == ulist || INVALID_INDEX == ulist->ID || INVALID_INDEX == ulist->GID)
{
return false;
}
/* 校验描述长度 */
if (NULL != ulist->udescription)
{
if (UDESIZE < strlen(ulist->udescription))
{
return false;
}
}
/* 校验密码长度 */
if (NULL != ulist->passwd)
{
if (8 >= strlen(ulist->passwd) || 24 <= strlen(ulist->passwd))
{
return false;
}
}
temp_user = (USERLIST*)malloc(sizeof(USERLIST));
if (NULL == temp_user)
{
return false;
}
get_user_by_id(ulist->ID, temp_user);
/* 更新内存数据 */
strcpy(g_user_table[ulist->ID].udescription, ulist->udescription);
strcpy(g_user_table[ulist->ID].passwd, ulist->passwd);
g_user_table[ulist->ID].GID = ulist->GID;
g_user_table[ulist->ID].multi_valid = MULTI_SET(g_user_table[ulist->ID].multi_valid, ulist->multi);
g_user_table[ulist->ID].multi_valid = VALID_SET(g_user_table[ulist->ID].multi_valid, ulist->valid);
/* 更新有效日期时间 */
if (1 == ulist->valid)
{
//if(判断是否符合格式)
STRING2TIME_T(ulist->valid_begin_time, g_user_table[ulist->ID].valid_begin_time);
STRING2TIME_T(ulist->valid_end_time, g_user_table[ulist->ID].valid_end_time);
return true;
}
/* 连接数据库更显user表 */
/* UPDATE `user` u SET u.group_id = ,u.udescription = "", u.`password` = "", u.multi_player = , u.valid_always = , u.valid_begin_time = "", u.valid_end_time = "" WHERE u.id = ; */
/* 调用接口查询该用户是否有在线IP */
/* 如果没有直接return */
/* 密码发生改变,下线用户 */
if (0 != strcmp(ulist->passwd, temp_user->passwd))
{
/* 下线用户return */
}
/* 公用账号改为单用户登陆,下线用户 */
if (1 == ulist->multi && 0 == temp_user->multi)
{
/* 下线用户return */
}
/* 当前时间不在有效期内,下线用户 */
if (1 == VALID_GET(g_user_table[ulist->ID].multi_valid))
{
cur_time = time(NULL);
if (cur_time < g_user_table[ulist->ID].valid_begin_time || cur_time > g_user_table[ulist->ID].valid_end_time)
{
/* 下线用户return */
}
}
return true;
}
unsigned short get_userid_by_name(char* uname)
{
/* 内存查询数据 */
unsigned short UID_temp = INVALID_INDEX;
if (NULL == uname)
{
return UID_temp;
}
for (int i = 0; i < USER_INDEX_MAX && UID_temp == INVALID_INDEX; i++)
{
UID_temp = GETID(g_user_table[i].ID, uname, g_user_table[i].uname);
}
/* 连接数据库根据用户组名查询user表中的id */
/* SELECT id FROM user WHERE user_name = "" */
return UID_temp;
}
/* 修改用户-命令行 */
bool mod_user_line(char* uname, const int intype, char* in)
{
unsigned short uid;
bool result = true;
if (NULL == uname || NULL == in)
{
return false;
}
/* 检查修改类型 */
if (intype < 0 || intype >= USER_ATTRIBUTE_NUM)
{
return false;
}
/* 根据用户名查询用户ID */
uid = get_userid_by_name(uname);
if (INVALID_INDEX == uid)
{
return false;
}
/*0描述、1所属组名、2登陆密码、3公用账号、4永久有效、5有效期开始时间、6有效期结束时间 */
result = g_user_modfunc_table[intype](uid, in);
return result;
}