xbot/myirc/include/sasl_mechanism.hpp

77 lines
1.5 KiB
C++
Raw Normal View History

2025-01-25 12:25:38 -08:00
#pragma once
#include <boost/signals2.hpp>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
2025-01-30 09:28:28 -08:00
#include <variant>
2025-01-25 12:25:38 -08:00
class SaslMechanism
{
public:
2025-01-30 09:28:28 -08:00
struct NoReply {};
struct Failure {};
using StepResult = std::variant<std::string, NoReply, Failure>;
2025-01-25 12:25:38 -08:00
virtual ~SaslMechanism() {}
virtual auto mechanism_name() const -> std::string = 0;
2025-01-30 09:28:28 -08:00
virtual auto step(std::string_view msg) -> StepResult = 0;
2025-01-25 12:25:38 -08:00
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";
}
2025-01-30 09:28:28 -08:00
auto step(std::string_view msg) -> StepResult override;
2025-01-25 12:25:38 -08:00
auto is_complete() const -> bool override
{
return complete_;
}
};
2025-01-28 20:01:51 -08:00
class SaslExternal final : public SaslMechanism
{
std::string authzid_;
bool complete_;
public:
SaslExternal(std::string authzid)
: authzid_{std::move(authzid)}
, complete_{false}
{}
auto mechanism_name() const -> std::string override
{
return "EXTERNAL";
}
2025-01-30 09:28:28 -08:00
auto step(std::string_view msg) -> StepResult override;
2025-01-28 20:01:51 -08:00
auto is_complete() const -> bool override
{
return complete_;
}
};