// UserX Óû§¹ÜÀí¿â£¨C ½Ó¿Ú£©/ UserX user management library (C API) // ¸²¸Ç¹¦ÄÜ / Features: users, roles, actions, auth, logs£¨¹Ì¶¨ SQLite3 ³Ö¾Ã»¯ / SQLite3 persistence£© #pragma once #if defined(_WIN32) # ifdef USERXLIBRARY_EXPORTS # define UX_API extern "C" __declspec(dllexport) # else # define UX_API extern "C" __declspec(dllimport) # endif #else # define UX_API extern "C" #endif #include #ifdef _COMPILE_AS_LIB #warning "compiling as lib!" #else #ifdef _DEBUG #ifndef _WIN64 #pragma comment(lib, "../USERXLibrary/lib/Win32/Debug/UserXLibrary.lib") #else #pragma comment(lib, "../USERXLibrary/lib/x64/Debug/UserXLibrary.lib") #endif #else #ifndef _WIN64 #pragma comment(lib, "../USERXLibrary/lib/Win32/Release/UserXLibrary.lib") #else #pragma comment(lib, "../USERXLibrary/lib/x64/Release/UserXLibrary.lib") #endif #endif #endif // !BUILD_AS_LIB // ¶îÍâ´íÎóÂë / Extra error code #ifndef UX_ERR_BAD_PASSWORD #define UX_ERR_BAD_PASSWORD -10 // ÃÜÂë´íÎó / bad password #endif // ´íÎóÂëºê¶¨Òå / Error code macros #define UX_OK 0 // ³É¹¦ / success #define UX_ERR_INVALID_ARGS -1 // ²ÎÊý´íÎó / invalid arguments #define UX_ERR_NOT_FOUND -2 // δÕÒµ½ / not found #define UX_ERR_EXISTS -3 // ÒÑ´æÔÚ / already exists #define UX_ERR_PERMISSION -4 // ȨÏÞ²»×ã / permission denied #define UX_ERR_NOT_LOGGED_IN -5 // δµÇ¼ / not logged in #define UX_ERR_BUFFER_TOO_SMALL -6 // »º³åÇø²»×ã / buffer too small #define UX_ERR_DB -7 // I/O »òÊý¾Ý¿â´íÎó / I/O or database error #define UX_ERR_NOT_DEFINED -8 // 䶨Ò壨È綯×÷²»´æÔÚ£©/ not defined #define UX_ERR_DB_NOT_EMPTY -9 // Êý¾Ý¿â·Ç¿Õ£¨Òѳõʼ»¯£©/ database not empty // ·µ»ØÂë / Return codes£¨Ïê¼ûÉÏ·½ºê£© // UX_OK, UX_ERR_INVALID_ARGS, UX_ERR_NOT_FOUND, UX_ERR_EXISTS, // UX_ERR_PERMISSION, UX_ERR_NOT_LOGGED_IN, UX_ERR_BUFFER_TOO_SMALL, // UX_ERR_DB, UX_ERR_NOT_DEFINED, UX_ERR_DB_NOT_EMPTY // ³õʼ»¯£ºÖ¸¶¨Êý¾ÝĿ¼£¬ÄÚ²¿½«´ò¿ª/´´½¨ SQLite Êý¾Ý¿âÎļþ UserX.db // Init: provide data directory; opens/creates SQLite DB file UserX.db UX_API int UX_Init(const wchar_t* storage_dir); // ¿ÉÑ¡£º¸²¸ÇÊý¾Ý¿â·¾¶£¨½öʹÓõÚÒ»¸ö²ÎÊý×÷Ϊ .db Îļþ·¾¶£¬ÆäËûºöÂÔ£© // Optional: override DB path (use first arg as .db path; others ignored) UX_API int UX_SetStorage(const wchar_t* users_db_path, const wchar_t* /*unused_logs*/, const wchar_t* /*unused_roles*/, const wchar_t* /*unused_actions*/); // ÅäÖýÇÉ«£¨name:level °´ÐУ©/ Configure roles from lines "name:level" // ½öÔÊÐíÔÚ¡°¿ÕÊý¾Ý¿â¡±£¨roles/users/actions/logs Ëıí¾ùÎÞÊý¾Ý£©Ê±µ÷Óã»·ñÔò·µ»Ø -9¡£ // Only allowed when DB is empty (roles/users/actions/logs all zero rows); otherwise returns -9. // e.g. L"Admin:100\nEngineer:50\nOperator:10\n" UX_API int UX_SetRoleDefinitions(const wchar_t* roles_text); // »ñÈ¡½ÇÉ«ÁÐ±í£¨name:level °´ÐУ©£»buffer Ϊ¿Õ»ò²»×ãʱ·µ»ØËùÐè´óС // Get roles list as lines; returns required size if buffer is null/too small UX_API int UX_GetRoles(wchar_t* buffer, int buffer_chars); // Óû§¹ÜÀí / User management UX_API int UX_AddUser(const wchar_t* username, const wchar_t* display_name, const wchar_t* password, const wchar_t* role_name); UX_API int UX_DeleteUser(const wchar_t* username); // ¸üÐÂÈÎÒâ×ֶΣ¨´« nullptr ±íʾ±£³Ö²»±ä£©/ Update subset; nullptr keeps field UX_API int UX_UpdateUser(const wchar_t* username, const wchar_t* new_display_name, const wchar_t* new_password, const wchar_t* new_role_name, int enabled /* -1 keep, 0 disable, 1 enable */); UX_API int UX_EnableUser(const wchar_t* username, int enabled /*0/1*/); UX_API int UX_ResetPassword(const wchar_t* username, const wchar_t* new_password); UX_API int UX_RenameUser(const wchar_t* username, const wchar_t* new_display_name); // ¹ÜÀíԱȨÏÞ£ºÉ¾³ýËùÓÐÓû§ / Admin-only UX_API int UX_DeleteAllUsers(); // »ñÈ¡Óû§ÁÐ±í£¨Ã¿ÐУºusername,display,level,enabled£©/ Query users UX_API int UX_GetUsers(wchar_t* buffer, int buffer_chars); // ÈÏÖ¤ / Authentication UX_API int UX_Login(const wchar_t* username, const wchar_t* password); UX_API void UX_Logout(); UX_API int UX_IsLoggedIn(); UX_API void UX_Shutdown(); // ÊÍ·Å×ÊÔ´ / shutdown and free resources UX_API int UX_GetCurrentUser(wchar_t* buffer, int buffer_chars); // ¶¯×÷ÓëȨÏÞ / Actions & permissions // ¶¨Òå/¸²¸Ç¶¯×÷£¨Ãû³Æ¡¢ÃèÊö¡¢×îµÍ½ÇÉ«£©/ Define/overwrite action UX_API int UX_DefineAction(const wchar_t* action_name, const wchar_t* description, const wchar_t* min_role_name); // ¿ÉÖ´Ðзµ»Ø1£¬²»¿ÉÖ´Ðзµ»Ø0£»¸ºÊýΪ´íÎó / 1 allowed, 0 denied UX_API int UX_CanExecute(const wchar_t* action_name); // ¼Ç¼¶¯×÷µ½ÈÕÖ¾£¨Ê±¼ä¡¢Óû§¡¢¶¯×÷¡¢ÃèÊö£©/ Record action to logs UX_API int UX_RecordAction(const wchar_t* action_name); // »ñÈ¡¶¯×÷ÁÐ±í£¨Ã¿ÐУºname,desc,minlevel£©/ Get actions list UX_API int UX_GetActions(wchar_t* buffer, int buffer_chars); // ¼Ç¼³¢ÊÔ£¨ÔÊÐí/¾Ü¾ø£©/ record an attempt with allowed flag (1 allowed, 0 denied) UX_API int UX_RecordAttempt(const wchar_t* action_name, int allowed /*1/0*/); // ²éѯ×î½ü N ÌõÈÕÖ¾£¨Ã¿ÐУºISO8601ʱ¼ä,Óû§Ãû,¶¯×÷,ÃèÊö£©/ Query logs UX_API int UX_QueryLogs(int last_n, wchar_t* buffer, int buffer_chars); // ¸ù¾Ý´íÎóÂë·µ»ØÎÄ×ÖÃèÊö£¨ÖÐÎÄ/English£© // Return a human-readable message for an error code UX_API const wchar_t* UX_ErrorMessage(int code);