#pragma once using namespace std; #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 KeypairOfflineAuthModule : public AuthModule { public: const wchar_t *schemeName() override { return L"mcconsoles:keypair_offline"; } vector supportedVariations() override { return {L"rsa2048", L"ed25519"}; } vector> getSettings(const wstring &variation) override { return {{L"key_type", variation}}; } bool onAuthData(const vector> &fields, wstring &outUid, wstring &outUsername) override { return extractIdentity(fields, outUid, outUsername); } }; class OfflineAuthModule : public AuthModule { public: const wchar_t *schemeName() override { return L"mcconsoles:offline"; } vector supportedVariations() override { return {}; } vector> getSettings(const wstring &) override { return {}; } bool onAuthData(const vector> &fields, wstring &outUid, wstring &outUsername) override { return extractIdentity(fields, outUid, outUsername); } };