Commit 5ab3f808 authored by jan.koester's avatar jan.koester
Browse files

test

parent a28cecdd
Loading
Loading
Loading
Loading
Loading
+53 −12
Changes for src/session.h: 53 added lines, 12 removed lines.
Original line number Diff line number Diff line
@@ -98,27 +98,68 @@ namespace authdb {

        SessionData        *_next;
        friend class Session;
        friend class LocalSession;
        friend class ClusterSession;
        friend class client::Client;
    };

    // Session listing info (used by listSessions)
    struct SessionInfo {
        uuid::uuid sid, uid, did;
        std::string username;
    };

    // Abstract session store interface
    class Session{
    public:
        Session();
        Session(const Session &src);
        ~Session();

        const SessionData *addSession(AuthBackend &backend,uuid::uuid domainid,uuid::uuid userid);
        void                         relSession(AuthBackend &backend,uuid::uuid sessionid);

        const SessionData *getSession(uuid::uuid sessionid);
        void                         remSession(uuid::uuid sessionid);
        Session() = default;
        virtual ~Session() = default;

        virtual const SessionData *addSession(AuthBackend &backend,uuid::uuid domainid,uuid::uuid userid) = 0;
        virtual void               relSession(AuthBackend &backend,uuid::uuid sessionid) = 0;
        virtual const SessionData *getSession(uuid::uuid sessionid) = 0;
        virtual void               remSession(uuid::uuid sessionid) = 0;
        virtual void               listSessions(std::vector<SessionInfo> &out) = 0;
        virtual void               clear() = 0;

        Session(const Session&) = delete;
        Session& operator=(const Session&) = delete;
    };

        void clear();
    // Single-node session store: in-memory linked list
    class LocalSession : public Session {
    public:
        LocalSession();
        ~LocalSession() override;

        const SessionData *addSession(AuthBackend &backend,uuid::uuid domainid,uuid::uuid userid) override;
        void               relSession(AuthBackend &backend,uuid::uuid sessionid) override;
        const SessionData *getSession(uuid::uuid sessionid) override;
        void               remSession(uuid::uuid sessionid) override;
        void               listSessions(std::vector<SessionInfo> &out) override;
        void               clear() override;

    protected:
        SessionData *findLocal(uuid::uuid sessionid);
        void         appendLocal(SessionData *sess);
        void         removeLocal(uuid::uuid sessionid);
        void         cleanupExpired();

        const SessionData *firstData() const;
    private:
        SessionData   *_firstData;
        SessionData   *_lastData;
        std::mutex     _lock;
    };

    // Cluster session store: uses cluster session_store_ as single source of truth
    class ClusterSession : public LocalSession {
    public:
        ClusterSession();
        ~ClusterSession() override;

        const SessionData *addSession(AuthBackend &backend,uuid::uuid domainid,uuid::uuid userid) override;
        void               relSession(AuthBackend &backend,uuid::uuid sessionid) override;
        const SessionData *getSession(uuid::uuid sessionid) override;
        void               remSession(uuid::uuid sessionid) override;
        void               listSessions(std::vector<SessionInfo> &out) override;
    };
};