#include "stdafx.h" #include "CUserManager2.h" #include "ToolUnits.h" #include #include std::vector SplitLines(const std::wstring& text) { std::wstringstream ss(text); std::vector v; std::wstring line; while (std::getline(ss, line)) v.push_back(line); return v; } template 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); }