创建账号表来注册账号,而不是直接使用mysql的账号

This commit is contained in:
luoliangyi 2022-12-12 17:05:43 +08:00
parent 4f568b20ab
commit 2e40fd0de0
2 changed files with 82 additions and 67 deletions

View File

@ -117,28 +117,36 @@ HGResult HGPdtToolDbUserMgrImpl::Create(const HGChar* host, HGUShort port, const
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (NULL == userName || 0 == *userName || NULL == pwd || 0 == *pwd)
{
return HGBASE_ERR_INVALIDARG;
}
MYSQL* sql = mysql_init(NULL); MYSQL* sql = mysql_init(NULL);
if (NULL == sql) if (NULL == sql)
{ {
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (NULL == mysql_real_connect(sql, host, userName, pwd, NULL, port, NULL, 0)) if (NULL == mysql_real_connect(sql, host, "huago", "huago", "huago_production_tool", port, NULL, 0))
{ {
// 连接错误
mysql_close(sql); mysql_close(sql);
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
int ret = mysql_query(sql, "create database if not exists huago_production_tool;"); std::string password = GetPassword(sql, userName);
if (0 != ret) if (password.empty())
{ {
// 用户不存在
mysql_close(sql); mysql_close(sql);
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
ret = mysql_select_db(sql, "huago_production_tool"); std::string authString = GetAuthString(sql, pwd);
if (0 != ret) if (password != authString)
{ {
// 密码不正确
mysql_close(sql); mysql_close(sql);
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
@ -229,7 +237,7 @@ HGResult HGPdtToolDbUserMgrImpl::GetUserList(HGChar** userNameList, HGUInt maxLe
} }
char sqlCmd[1024] = {0}; char sqlCmd[1024] = {0};
sprintf(sqlCmd, "select user, host from mysql.user;"); sprintf(sqlCmd, "select user from user_list;");
int ret = mysql_query(m_sql, sqlCmd); int ret = mysql_query(m_sql, sqlCmd);
if (0 != ret) if (0 != ret)
{ {
@ -251,14 +259,11 @@ HGResult HGPdtToolDbUserMgrImpl::GetUserList(HGChar** userNameList, HGUInt maxLe
break; break;
} }
assert(NULL != row[0] && NULL != row[1]); assert(NULL != row && NULL != row[0]);
if (0 == strcmp(row[1], "%")) userNameList[*count] = (HGChar*)malloc(strlen(row[0]) + 1);
{ assert(NULL != userNameList[*count]);
userNameList[*count] = (HGChar*)malloc(strlen(row[0]) + 1); strcpy(userNameList[*count], row[0]);
assert(NULL != userNameList[*count]); ++(*count);
strcpy(userNameList[*count], row[0]);
++(*count);
}
} }
mysql_free_result(sqlRes); mysql_free_result(sqlRes);
@ -305,20 +310,9 @@ HGResult HGPdtToolDbUserMgrImpl::CreateUser(const HGChar* userName, const HGChar
} }
char sqlCmd[1024] = {0}; char sqlCmd[1024] = {0};
sprintf(sqlCmd, "create user '%s'@'%%' identified by '%s';", userName, defPwd); sprintf(sqlCmd, "insert into user_list (user, password) values ('%s', password('%s'));", userName, defPwd);
int ret = mysql_query(m_sql, sqlCmd); int ret = mysql_query(m_sql, sqlCmd);
if (0 != ret) return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL;
{
return HGBASE_ERR_FAIL;
}
sprintf(sqlCmd, "grant create, insert, select, update on huago_production_tool.* to '%s'@'%%';", userName);
ret = mysql_query(m_sql, sqlCmd);
assert(0 == ret);
sprintf(sqlCmd, "grant select on mysql.user to '%s'@'%%';", userName);
ret = mysql_query(m_sql, sqlCmd);
assert(0 == ret);
return HGBASE_ERR_OK;
} }
HGResult HGPdtToolDbUserMgrImpl::DestroyUser(const HGChar* userName) HGResult HGPdtToolDbUserMgrImpl::DestroyUser(const HGChar* userName)
@ -349,7 +343,7 @@ HGResult HGPdtToolDbUserMgrImpl::DestroyUser(const HGChar* userName)
sprintf(sqlCmd, "drop table %s_config;", userName); sprintf(sqlCmd, "drop table %s_config;", userName);
mysql_query(m_sql, sqlCmd); mysql_query(m_sql, sqlCmd);
sprintf(sqlCmd, "drop user '%s'@'%%';", userName); sprintf(sqlCmd, "delete from user_list where user = '%s';", userName);
int ret = mysql_query(m_sql, sqlCmd); int ret = mysql_query(m_sql, sqlCmd);
return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL; return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL;
} }
@ -374,7 +368,7 @@ HGResult HGPdtToolDbUserMgrImpl::SetPassword(const HGChar* userName, const HGCha
} }
char sqlCmd[1024] = { 0 }; char sqlCmd[1024] = { 0 };
sprintf(sqlCmd, "set password for '%s'@'%%' = password('%s');", userName, pwd); sprintf(sqlCmd, "update user_list set password = password('%s') where user = '%s';", pwd, userName);
int ret = mysql_query(m_sql, sqlCmd); int ret = mysql_query(m_sql, sqlCmd);
return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL; return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL;
} }
@ -391,49 +385,19 @@ HGResult HGPdtToolDbUserMgrImpl::ModifyPassword(const HGChar* oldPwd, const HGCh
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
std::string oldAuthStr; std::string password = GetPassword(m_sql, m_userName.c_str());
char sqlCmd[1024] = { 0 }; assert(!password.empty());
sprintf(sqlCmd, "select authentication_string from mysql.user where user = '%s' and host = '%%';", m_userName.c_str());
int ret = mysql_query(m_sql, sqlCmd);
if (0 == ret)
{
MYSQL_RES* sqlRes = mysql_use_result(m_sql);
if (NULL != sqlRes)
{
MYSQL_ROW row = mysql_fetch_row(sqlRes);
assert(NULL != row[0]);
oldAuthStr = row[0];
mysql_free_result(sqlRes);
}
}
if (oldAuthStr.empty()) std::string authString = GetAuthString(m_sql, oldPwd);
{ if (password != authString)
return HGBASE_ERR_ACCESSDENIED;
}
std::string oldAuthStr2;
sprintf(sqlCmd, "select password('%s');", oldPwd);
ret = mysql_query(m_sql, sqlCmd);
if (0 == ret)
{
MYSQL_RES* sqlRes = mysql_use_result(m_sql);
if (NULL != sqlRes)
{
MYSQL_ROW row = mysql_fetch_row(sqlRes);
assert(NULL != row[0]);
oldAuthStr2 = row[0];
mysql_free_result(sqlRes);
}
}
if (0 != strcmp(oldAuthStr.c_str(), oldAuthStr2.c_str()))
{ {
// 旧密码错误
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
sprintf(sqlCmd, "set password for '%s'@'%%' = password('%s');", m_userName.c_str(), newPwd); char sqlCmd[1024] = {0};
ret = mysql_query(m_sql, sqlCmd); sprintf(sqlCmd, "update user_list set password = password('%s') where user = '%s';", newPwd, m_userName.c_str());
int ret = mysql_query(m_sql, sqlCmd);
return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL; return (0 == ret) ? HGBASE_ERR_OK : HGBASE_ERR_FAIL;
} }
@ -730,6 +694,54 @@ const HGChar* HGPdtToolDbUserMgrImpl::GetEntryNameCnStr(HGUInt entryName)
return NULL; return NULL;
} }
std::string HGPdtToolDbUserMgrImpl::GetPassword(MYSQL* sql, const HGChar* userName)
{
assert(NULL != sql);
assert(NULL != userName && 0 != *userName);
std::string password;
char sqlCmd[1024] = { 0 };
sprintf(sqlCmd, "select password from user_list where user = '%s';", userName);
int ret = mysql_query(sql, sqlCmd);
if (0 == ret)
{
MYSQL_RES* sqlRes = mysql_use_result(sql);
if (NULL != sqlRes)
{
MYSQL_ROW row = mysql_fetch_row(sqlRes);
assert(NULL != row && NULL != row[0]);
password = row[0];
mysql_free_result(sqlRes);
}
}
return password;
}
std::string HGPdtToolDbUserMgrImpl::GetAuthString(MYSQL* sql, const HGChar* pwd)
{
assert(NULL != sql);
assert(NULL != pwd && 0 != *pwd);
std::string authString;
char sqlCmd[1024] = {0};
sprintf(sqlCmd, "select password('%s');", pwd);
int ret = mysql_query(sql, sqlCmd);
if (0 == ret)
{
MYSQL_RES* sqlRes = mysql_use_result(sql);
if (NULL != sqlRes)
{
MYSQL_ROW row = mysql_fetch_row(sqlRes);
assert(NULL != row && NULL != row[0]);
authString = row[0];
mysql_free_result(sqlRes);
}
}
return authString;
}
int HGPdtToolDbUserMgrImpl::CreateUserConfigTable(MYSQL* sql, const HGChar* user) int HGPdtToolDbUserMgrImpl::CreateUserConfigTable(MYSQL* sql, const HGChar* user)
{ {
assert(NULL != sql); assert(NULL != sql);

View File

@ -33,6 +33,9 @@ private:
void RemoveDevice(class HGPdtToolDbDeviceImpl* deviceImpl); void RemoveDevice(class HGPdtToolDbDeviceImpl* deviceImpl);
static const HGChar* GetEntryNameCnStr(HGUInt entryName); static const HGChar* GetEntryNameCnStr(HGUInt entryName);
static std::string GetPassword(MYSQL* sql, const HGChar* userName);
static std::string GetAuthString(MYSQL* sql, const HGChar* pwd);
int CreateUserConfigTable(MYSQL* sql, const HGChar *user); int CreateUserConfigTable(MYSQL* sql, const HGChar *user);
int CreateMainTestTable(MYSQL *sql); int CreateMainTestTable(MYSQL *sql);
int CreateInitInspTestTable(MYSQL* sql); int CreateInitInspTestTable(MYSQL* sql);