Loading client/client.cpp +41 −14 Changes for client/client.cpp: 41 added lines, 14 removed lines. Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ #include <json_tokener.h> #include <httppp/exception.h> #include <netplus/exception.h> #include "client.h" Loading @@ -46,6 +47,32 @@ namespace authdb { namespace client { namespace { std::vector<char> safe_post(libhttppp::HttpClient& client, libhttppp::HttpRequest& req, const std::vector<char>& body, size_t maxTries) { try { return client.Post(req, body, maxTries); } catch (libhttppp::HTTPException&) { client.reconnect(); return client.Post(req, body, maxTries); } catch (netplus::NetException&) { client.reconnect(); return client.Post(req, body, maxTries); } } std::vector<char> safe_get(libhttppp::HttpClient& client, libhttppp::HttpRequest& req, size_t maxTries) { try { return client.Get(req, maxTries); } catch (libhttppp::HTTPException&) { client.reconnect(); return client.Get(req, maxTries); } catch (netplus::NetException&) { client.reconnect(); return client.Get(req, maxTries); } } std::string normalize_path(std::string path) { if (path.empty()) return "/"; // Strip scheme/host if someone passes a full URL by mistake. Loading Loading @@ -202,7 +229,7 @@ bool Client::ClientAuth() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -265,7 +292,7 @@ bool Client::UserAuth() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -330,7 +357,7 @@ void Client::SessionInfo(class SessionData& sdat) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -398,7 +425,7 @@ bool Client::remSession() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -464,7 +491,7 @@ void Client::changeUserPw(const std::string& oldpw, const std::string& newpw) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); (void)_Con._Client->Post(nreq, out, _Con._MaxTries); // Optionally: parse response if you care (void)safe_post(*_Con._Client, nreq, out, _Con._MaxTries); // Optionally: parse response if you care json_object_put(jresponse); } Loading Loading @@ -495,7 +522,7 @@ void Client::UserInfo(class UserData& udat) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -557,7 +584,7 @@ void Client::getAvatar(const ::uuid::uuid& did, const ::uuid::uuid& uid, resq.setHeaderData("accept")->push_back("image/jpeg"); resq.setRequestURL(url.str().c_str()); std::vector<char> avatar = _Con._Client->Get(resq, _Con._MaxTries); std::vector<char> avatar = safe_get(*_Con._Client, resq, _Con._MaxTries); resp.setState(HTTP200); resp.setContentType("image/jpeg"); Loading Loading @@ -591,7 +618,7 @@ bool Client::GPOcheck(class ::uuid::uuid gpoid) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -655,7 +682,7 @@ std::string Client::addConnection(const std::string& clientname, const std::stri nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -713,7 +740,7 @@ void Client::remConnection(const uuid::uuid& clientid) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); (void)_Con._Client->Post(nreq, out, _Con._MaxTries); (void)safe_post(*_Con._Client, nreq, out, _Con._MaxTries); json_object_put(jresponse); } Loading Loading @@ -749,7 +776,7 @@ void Client::editConnection(const uuid::uuid& clientid, nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); (void)_Con._Client->Post(nreq, out, _Con._MaxTries); (void)safe_post(*_Con._Client, nreq, out, _Con._MaxTries); json_object_put(jresponse); } Loading Loading @@ -792,7 +819,7 @@ std::string Client::GPOadd(const uuid::uuid& gpoid, const std::string& name, con nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -861,7 +888,7 @@ bool Client::GPOexits(class uuid::uuid gpoid) { // keeping name for compatibilit nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -922,7 +949,7 @@ std::vector<Client::GroupInfo> Client::listGroups() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading src/client.cpp +30 −0 Changes for src/client.cpp: 30 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -168,6 +168,7 @@ void authdb::Client::info(AuthBackend& backend, class ClientData& dat, size_t& p authdb::ClientConnections::ClientConnections(uuid::uuid sid, AuthBackend& bck, const class ClientData& clt) : _backend(bck) , _Data(clt){ _sessionId=sid; _next=nullptr; _created=std::chrono::steady_clock::now(); } authdb::ClientConnections *authdb::ClientConnections::next(){ Loading Loading @@ -225,6 +226,9 @@ authdb::Client::~Client(){ authdb::ClientConnections *authdb::Client::addConnection(AuthBackend &backend,const class ClientData &data){ std::lock_guard<std::mutex> guard(_lockConnection); cleanupExpiredConnections(); uuid::uuid ncid; ncid.generate(); Loading Loading @@ -264,6 +268,32 @@ void authdb::Client::delConnection(const uuid::uuid &conid){ } } void authdb::Client::cleanupExpiredConnections(){ auto now=std::chrono::steady_clock::now(); ClientConnections *prev=nullptr; ClientConnections *curdat=_firstConnection; while(curdat){ auto age=std::chrono::duration_cast<std::chrono::hours>(now - curdat->_created).count(); if(age >= 24){ ClientConnections *next=curdat->_next; if(prev){ prev->_next=next; }else{ _firstConnection=next; } if(curdat==_lastConnection){ _lastConnection=prev; } curdat->_next=nullptr; delete curdat; curdat=next; }else{ prev=curdat; curdat=curdat->_next; } } } bool authdb::Client::checkConnection(const uuid::uuid &conid) const{ std::lock_guard<std::mutex> guard(_lockConnection); for(ClientConnections *curdat=_firstConnection; curdat; curdat=curdat->_next){ Loading src/client.h +3 −0 Changes for src/client.h: 3 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <chrono> #include <uuidp.h> #include "authdb.h" Loading Loading @@ -77,6 +78,7 @@ namespace authdb { AuthBackend _backend; uuid::uuid _sessionId; class ClientData _Data; std::chrono::steady_clock::time_point _created; friend class Client; }; Loading @@ -93,6 +95,7 @@ namespace authdb { ClientConnections *addConnection(AuthBackend &backend,const class ClientData &data); void delConnection(const uuid::uuid &conid); void cleanupExpiredConnections(); bool checkConnection(const uuid::uuid &conid) const; ClientConnections *findConnection(const uuid::uuid &conid); Loading src/session.cpp +1 −0 Changes for src/session.cpp: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -289,6 +289,7 @@ const authdb::SessionData *authdb::Session::addSession(AuthBackend &backend,uuid const authdb::SessionData *authdb::Session::getSession(uuid::uuid sessionid){ std::lock_guard<std::mutex> guard(_SessionLock); cleanupExpired(); for(SessionData *cur=_firstData; cur; cur=cur->_next){ if(cur->_sid==sessionid) return cur; Loading Loading
client/client.cpp +41 −14 Changes for client/client.cpp: 41 added lines, 14 removed lines. Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ #include <json_tokener.h> #include <httppp/exception.h> #include <netplus/exception.h> #include "client.h" Loading @@ -46,6 +47,32 @@ namespace authdb { namespace client { namespace { std::vector<char> safe_post(libhttppp::HttpClient& client, libhttppp::HttpRequest& req, const std::vector<char>& body, size_t maxTries) { try { return client.Post(req, body, maxTries); } catch (libhttppp::HTTPException&) { client.reconnect(); return client.Post(req, body, maxTries); } catch (netplus::NetException&) { client.reconnect(); return client.Post(req, body, maxTries); } } std::vector<char> safe_get(libhttppp::HttpClient& client, libhttppp::HttpRequest& req, size_t maxTries) { try { return client.Get(req, maxTries); } catch (libhttppp::HTTPException&) { client.reconnect(); return client.Get(req, maxTries); } catch (netplus::NetException&) { client.reconnect(); return client.Get(req, maxTries); } } std::string normalize_path(std::string path) { if (path.empty()) return "/"; // Strip scheme/host if someone passes a full URL by mistake. Loading Loading @@ -202,7 +229,7 @@ bool Client::ClientAuth() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -265,7 +292,7 @@ bool Client::UserAuth() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -330,7 +357,7 @@ void Client::SessionInfo(class SessionData& sdat) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -398,7 +425,7 @@ bool Client::remSession() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -464,7 +491,7 @@ void Client::changeUserPw(const std::string& oldpw, const std::string& newpw) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); (void)_Con._Client->Post(nreq, out, _Con._MaxTries); // Optionally: parse response if you care (void)safe_post(*_Con._Client, nreq, out, _Con._MaxTries); // Optionally: parse response if you care json_object_put(jresponse); } Loading Loading @@ -495,7 +522,7 @@ void Client::UserInfo(class UserData& udat) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -557,7 +584,7 @@ void Client::getAvatar(const ::uuid::uuid& did, const ::uuid::uuid& uid, resq.setHeaderData("accept")->push_back("image/jpeg"); resq.setRequestURL(url.str().c_str()); std::vector<char> avatar = _Con._Client->Get(resq, _Con._MaxTries); std::vector<char> avatar = safe_get(*_Con._Client, resq, _Con._MaxTries); resp.setState(HTTP200); resp.setContentType("image/jpeg"); Loading Loading @@ -591,7 +618,7 @@ bool Client::GPOcheck(class ::uuid::uuid gpoid) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -655,7 +682,7 @@ std::string Client::addConnection(const std::string& clientname, const std::stri nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -713,7 +740,7 @@ void Client::remConnection(const uuid::uuid& clientid) { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); (void)_Con._Client->Post(nreq, out, _Con._MaxTries); (void)safe_post(*_Con._Client, nreq, out, _Con._MaxTries); json_object_put(jresponse); } Loading Loading @@ -749,7 +776,7 @@ void Client::editConnection(const uuid::uuid& clientid, nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); (void)_Con._Client->Post(nreq, out, _Con._MaxTries); (void)safe_post(*_Con._Client, nreq, out, _Con._MaxTries); json_object_put(jresponse); } Loading Loading @@ -792,7 +819,7 @@ std::string Client::GPOadd(const uuid::uuid& gpoid, const std::string& name, con nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -861,7 +888,7 @@ bool Client::GPOexits(class uuid::uuid gpoid) { // keeping name for compatibilit nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading Loading @@ -922,7 +949,7 @@ std::vector<Client::GroupInfo> Client::listGroups() { nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); std::vector<char> resp(safe_post(*_Con._Client, nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); Loading
src/client.cpp +30 −0 Changes for src/client.cpp: 30 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -168,6 +168,7 @@ void authdb::Client::info(AuthBackend& backend, class ClientData& dat, size_t& p authdb::ClientConnections::ClientConnections(uuid::uuid sid, AuthBackend& bck, const class ClientData& clt) : _backend(bck) , _Data(clt){ _sessionId=sid; _next=nullptr; _created=std::chrono::steady_clock::now(); } authdb::ClientConnections *authdb::ClientConnections::next(){ Loading Loading @@ -225,6 +226,9 @@ authdb::Client::~Client(){ authdb::ClientConnections *authdb::Client::addConnection(AuthBackend &backend,const class ClientData &data){ std::lock_guard<std::mutex> guard(_lockConnection); cleanupExpiredConnections(); uuid::uuid ncid; ncid.generate(); Loading Loading @@ -264,6 +268,32 @@ void authdb::Client::delConnection(const uuid::uuid &conid){ } } void authdb::Client::cleanupExpiredConnections(){ auto now=std::chrono::steady_clock::now(); ClientConnections *prev=nullptr; ClientConnections *curdat=_firstConnection; while(curdat){ auto age=std::chrono::duration_cast<std::chrono::hours>(now - curdat->_created).count(); if(age >= 24){ ClientConnections *next=curdat->_next; if(prev){ prev->_next=next; }else{ _firstConnection=next; } if(curdat==_lastConnection){ _lastConnection=prev; } curdat->_next=nullptr; delete curdat; curdat=next; }else{ prev=curdat; curdat=curdat->_next; } } } bool authdb::Client::checkConnection(const uuid::uuid &conid) const{ std::lock_guard<std::mutex> guard(_lockConnection); for(ClientConnections *curdat=_firstConnection; curdat; curdat=curdat->_next){ Loading
src/client.h +3 −0 Changes for src/client.h: 3 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <chrono> #include <uuidp.h> #include "authdb.h" Loading Loading @@ -77,6 +78,7 @@ namespace authdb { AuthBackend _backend; uuid::uuid _sessionId; class ClientData _Data; std::chrono::steady_clock::time_point _created; friend class Client; }; Loading @@ -93,6 +95,7 @@ namespace authdb { ClientConnections *addConnection(AuthBackend &backend,const class ClientData &data); void delConnection(const uuid::uuid &conid); void cleanupExpiredConnections(); bool checkConnection(const uuid::uuid &conid) const; ClientConnections *findConnection(const uuid::uuid &conid); Loading
src/session.cpp +1 −0 Changes for src/session.cpp: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -289,6 +289,7 @@ const authdb::SessionData *authdb::Session::addSession(AuthBackend &backend,uuid const authdb::SessionData *authdb::Session::getSession(uuid::uuid sessionid){ std::lock_guard<std::mutex> guard(_SessionLock); cleanupExpired(); for(SessionData *cur=_firstData; cur; cur=cur->_next){ if(cur->_sid==sessionid) return cur; Loading