#pragma once using namespace std; #include #include #include #include inline string narrowStr(const wstring &w) { return string(w.begin(), w.end()); } class AuthModule { public: virtual ~AuthModule() = default; virtual const wchar_t *schemeName() = 0; virtual vector supportedVariations() = 0; virtual vector> getSettings(const wstring &variation) = 0; virtual bool onAuthData(const vector> &fields, wstring &outUid, wstring &outUsername) = 0; bool validate(const wstring &uid, const wstring &username); protected: bool extractIdentity(const vector> &fields, wstring &outUid, wstring &outUsername); }; class SessionAuthModule : public AuthModule { public: struct EndpointPair { wstring authEndpoint; wstring sessionEndpoint; }; private: unordered_map endpoints; wstring activeSessionEndpoint; wstring activeServerId; public: SessionAuthModule(); const wchar_t *schemeName() override; vector supportedVariations() override; vector> getSettings(const wstring &variation) override; bool onAuthData(const vector> &fields, wstring &outUid, wstring &outUsername) override; }; class KeypairOfflineAuthModule : public AuthModule { public: const wchar_t *schemeName() override; vector supportedVariations() override; vector> getSettings(const wstring &variation) override; bool onAuthData(const vector> &fields, wstring &outUid, wstring &outUsername) override; }; class OfflineAuthModule : public AuthModule { public: const wchar_t *schemeName() override; vector supportedVariations() override; vector> getSettings(const wstring &variation) override; bool onAuthData(const vector> &fields, wstring &outUid, wstring &outUsername) override; };