Commit 6177e24e authored by jan.koester's avatar jan.koester
Browse files

test

parent edab8838
Loading
Loading
Loading
Loading
Loading
+41 −14
Changes for client/client.cpp: 41 added lines, 14 removed lines.
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@
#include <json_tokener.h>

#include <httppp/exception.h>
#include <netplus/exception.h>

#include "client.h"

@@ -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.
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
}
@@ -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);
@@ -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");
@@ -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);
@@ -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);
@@ -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);
}
@@ -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);
}
@@ -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);
@@ -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);
@@ -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);
+30 −0
Changes for src/client.cpp: 30 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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(){
@@ -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();
@@ -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){
+3 −0
Changes for src/client.h: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

#include <chrono>
#include <uuidp.h>

#include "authdb.h"
@@ -77,6 +78,7 @@ namespace authdb {
        AuthBackend         _backend;
        uuid::uuid          _sessionId;
        class ClientData    _Data;
        std::chrono::steady_clock::time_point _created;
        friend class Client;
    };

@@ -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);
+1 −0
Changes for src/session.cpp: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -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;