#pragma once #include #include #include #include #include class SaslMechanism { public: virtual ~SaslMechanism() {} virtual auto mechanism_name() const -> std::string = 0; virtual auto step(std::string_view msg) -> std::optional = 0; virtual auto is_complete() const -> bool = 0; }; class SaslPlain final : public SaslMechanism { std::string authcid_; std::string authzid_; std::string password_; bool complete_; public: SaslPlain(std::string authcid, std::string authzid, std::string password) : authcid_{std::move(authcid)} , authzid_{std::move(authzid)} , password_{std::move(password)} , complete_{false} {} auto mechanism_name() const -> std::string override { return "PLAIN"; } auto step(std::string_view msg) -> std::optional override; auto is_complete() const -> bool override { return complete_; } };