#ifndef __UserInfo_h_ #define __UserInfo_h_ #include "../../shared/ThreadClass.h" #include "../../shared/TwoDLookup.h" #include "../../shared/DatabaseWithRetry.h" #include "CurlThread.h" class UserInfoThread : public ThreadClass { private: enum { mtLogin, mtSmbLogin, mtReload, mtShowAllUsers, mtDisconnectUser, mtDisconnectAll, mtQuit }; RequestQueue _incoming; DatabaseWithRetry _database; UserInfoThread(); ~UserInfoThread(); void loadFile(std::string fileName = ""); static UserInfoThread *instance; pthread_mutex_t _mutex; TwoDArray _data; // Protected by _mutex std::map< SocketInfo *, std::string > _socketToUser; // Protected by _mutex std::map< std::string, SocketInfo * > _userToSocket; struct LoginInfo { SocketInfo *socket; std::string username; std::string password; std::string sessionId; ExternalRequest::MessageId responseMessageId; LoginInfo() : socket(NULL) { } LoginInfo(ExternalRequest *request); }; class SmbLoginRequest : public CurlRequest { private: LoginInfo _loginInfo; public: SmbLoginRequest(LoginInfo const &loginInfo); bool success() const; LoginInfo const &getLoginInfo() const { return _loginInfo; } }; void loginRequest(ExternalRequest *request); void tryLogin(LoginInfo const &loginInfo); CurlThread _curlThread; std::string _resetCounter; int64_t _sessionCounter; void resetSessions(); std::string getSessionId(); protected: virtual void threadFunction(); public: // All public methods are thread safe. void getInfo(SocketInfo *socket, PropertyList &info); std::string getField(SocketInfo *socket, std::string const &name); bool loggedIn(SocketInfo *socket); bool hasAdminPermission(SocketInfo *socket); static UserInfoThread &getInstance(); static void init() { getInstance(); } }; #endif