#include "stdafx.h"
|
#include "CUserManager2.h"
|
#include "ToolUnits.h"
|
#include <sstream>
|
#include <cwchar>
|
|
std::vector<std::wstring> SplitLines(const std::wstring& text)
|
{
|
std::wstringstream ss(text); std::vector<std::wstring> v; std::wstring line; while (std::getline(ss, line)) v.push_back(line); return v;
|
}
|
|
template<typename Fn>
|
std::wstring ReadBufferVia(Fn fn)
|
{
|
int need = fn(nullptr, 0); if (need <= 0) return L"";
|
std::wstring buf; buf.resize((size_t)need);
|
int rc = fn(buf.data(), need);
|
if (rc == 0) { if (!buf.empty() && buf.back() == L'\0') buf.pop_back(); return buf; }
|
return L"";
|
}
|
|
// »ñÈ¡µ¥ÀýʵÀý
|
CUserManager2& CUserManager2::getInstance() {
|
static CUserManager2 instance;
|
return instance;
|
}
|
|
CUserManager2::CUserManager2()
|
{
|
|
}
|
|
CUserManager2::~CUserManager2()
|
{
|
|
}
|
|
void CUserManager2::init(const char* pszDir)
|
{
|
std::wstring dir = CToolUnits::AnsiToWString(std::string(pszDir));
|
UX_Init(dir.c_str());
|
|
wchar_t buffer[1024];
|
UX_GetUsers(buffer, 1024);
|
bool hasAny = false;
|
for (auto& ln : SplitLines(buffer)) { if (!ln.empty()) { hasAny = true; break; } }
|
if (!hasAny) {
|
const wchar_t* roles = L"Admin:100\nEngineer:50\nOperator:10\n";
|
(void)UX_SetRoleDefinitions(roles);
|
(void)UX_AddUser(L"admin", L"Administrator", L"admin123", L"Admin");
|
}
|
}
|
|
bool CUserManager2::login(const char* pszAccount, const char* pszPwd)
|
{
|
std::wstring strUser, strPwd;
|
strUser = CToolUnits::AnsiToWString(std::string(pszAccount));
|
strPwd = CToolUnits::AnsiToWString(std::string(pszPwd));
|
int rc = UX_Login(strUser.c_str(), strPwd.c_str());
|
return rc == UX_OK;
|
}
|
|
bool CUserManager2::isLoggedIn()
|
{
|
return UX_IsLoggedIn();
|
}
|
|
std::string CUserManager2::getCurrentUserName()
|
{
|
std::string strName;
|
|
int need = UX_GetCurrentUser(nullptr, 0);
|
std::wstring buf; buf.resize((size_t)need);
|
if (UX_GetCurrentUser(buf.data(), need) == UX_OK) {
|
if (!buf.empty() && buf.back() == L'\0')
|
buf.pop_back();
|
|
strName = CToolUnits::WStringToAnsi(buf);
|
}
|
|
return strName;
|
}
|
|
bool CUserManager2::IsAdminCurrent()
|
{
|
if (UX_IsLoggedIn() != 1) return false;
|
int need = UX_GetCurrentUser(nullptr, 0); if (need <= 0) return false;
|
std::wstring user; user.resize((size_t)need);
|
if (UX_GetCurrentUser(user.data(), need) != 0) return false;
|
if (!user.empty() && user.back() == L'\0') user.pop_back();
|
int maxLvl = 0; auto rolesTxt = ReadBufferVia([](wchar_t* b, int n) { return UX_GetRoles(b, n); });
|
for (auto& ln : SplitLines(rolesTxt)) { size_t p = ln.find(L':'); if (p != std::wstring::npos) { int lvl = _wtoi(ln.substr(p + 1).c_str()); if (lvl > maxLvl) maxLvl = lvl; } }
|
int myLvl = 0; auto usersTxt = ReadBufferVia([](wchar_t* b, int n) { return UX_GetUsers(b, n); });
|
for (auto& ln : SplitLines(usersTxt)) {
|
if (ln.empty()) continue; size_t p1 = ln.find(L','), p2 = ln.find(L',', p1 == std::wstring::npos ? 0 : p1 + 1), p3 = ln.find(L',', p2 == std::wstring::npos ? 0 : p2 + 1);
|
std::wstring name = (p1 == std::wstring::npos ? ln : ln.substr(0, p1)); if (name == user) { if (p2 != std::wstring::npos) { std::wstring lvlS = ln.substr(p2 + 1, (p3 == std::wstring::npos ? ln.size() : p3) - (p2 + 1)); myLvl = _wtoi(lvlS.c_str()); } break; }
|
}
|
|
return (maxLvl > 0) && (myLvl >= maxLvl);
|
}
|