chenluhua1980
2025-11-18 d60bb6116c698269d405fce3040bdc75128c6820
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#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);
}