Add initiating new stream after SASL

This commit is contained in:
sha512sum 2024-10-08 18:14:04 +00:00
parent 0636e1c234
commit ba03f3fe6f
3 changed files with 14 additions and 10 deletions

View file

@ -235,7 +235,7 @@ struct ClientCreateVisitor {
auto Auth(XmlStream<Socket>& stream, ServerToUserStream streamHeader, StreamFeatures features) -> boost::asio::awaitable<void> { auto Auth(XmlStream<Socket>& stream, ServerToUserStream streamHeader, StreamFeatures features) -> boost::asio::awaitable<void> {
co_return co_await std::visit( co_return co_await std::visit(
[&](auto& account) -> boost::asio::awaitable<void> { [&](auto& account) -> boost::asio::awaitable<void> {
return this->Auth(std::move(account), stream, std::move(streamHeader), std::move(features)); return this->Auth(account, stream, std::move(streamHeader), std::move(features));
}, },
this->account); this->account);
} }
@ -293,7 +293,10 @@ struct ClientCreateVisitor {
} }
co_await this->Auth(stream, std::move(sToUStream), std::move(features)); co_await this->Auth(stream, std::move(sToUStream), std::move(features));
co_return Client{std::move(this->account).Jid(), std::move(stream)}; co_await stream.Send(UserStream{.from = this->account.Jid(), .to = account.Jid().server, .version = "1.0", .xmlLang = "en"});
ServerToUserStream secondSToUStream = co_await ReadStartStream(stream);
StreamFeatures secondFeatures = co_await stream.template Read<StreamFeatures>();
co_return Client{std::move(this->account.Jid()), std::move(stream)};
} }
template <typename Socket> template <typename Socket>
@ -301,7 +304,9 @@ struct ClientCreateVisitor {
-> boost::asio::awaitable<std::variant<Client<Socket>, Client<boost::asio::ssl::stream<Socket>>>> { -> boost::asio::awaitable<std::variant<Client<Socket>, Client<boost::asio::ssl::stream<Socket>>>> {
auto& socket = stream.next_layer(); auto& socket = stream.next_layer();
co_await this->Connect(socket.next_layer(), co_await this->Resolve()); co_await this->Connect(socket.next_layer(), co_await this->Resolve());
co_await stream.Send(UserStream{.from = account.Jid().Username("anonymous"), .to = account.Jid().server}, socket.next_layer()); co_await stream.Send(
UserStream{.from = account.Jid().Username("anonymous"), .to = account.Jid().server, .version = "1.0", .xmlLang = "en"},
socket.next_layer());
SPDLOG_DEBUG("UserStream sended"); SPDLOG_DEBUG("UserStream sended");
auto streamHeader = co_await this->ReadStartStream(stream); auto streamHeader = co_await this->ReadStartStream(stream);
StreamFeatures features = co_await stream.template Read<StreamFeatures>(); StreamFeatures features = co_await stream.template Read<StreamFeatures>();
@ -318,7 +323,9 @@ struct ClientCreateVisitor {
auto newStreamHeader = co_await this->ReadStartStream(stream); auto newStreamHeader = co_await this->ReadStartStream(stream);
auto newFeatures = co_await stream.template Read<StreamFeatures>(); auto newFeatures = co_await stream.template Read<StreamFeatures>();
co_await this->Auth(stream, std::move(newStreamHeader), std::move(newFeatures)); co_await this->Auth(stream, std::move(newStreamHeader), std::move(newFeatures));
co_return Client{std::move(this->account).Jid(), XmlStream{std::move(socket)}}; ServerToUserStream secondSToUStream = co_await ReadStartStream(stream);
StreamFeatures secondFeatures = co_await stream.template Read<StreamFeatures>();
co_return Client{std::move(this->account.Jid()), std::move(stream)};
} }
}; };

View file

@ -107,7 +107,7 @@ struct Serialization : SerializationBase<T> {
try { try {
return Serialization::StartCheck(element) ? std::optional{T::Parse(element)} : std::nullopt; return Serialization::StartCheck(element) ? std::optional{T::Parse(element)} : std::nullopt;
} catch(const std::exception& e) { } catch(const std::exception& e) {
SPDLOG_WARN("Type {}: Failed Parse but no TryParse found: {}", e.what(), nameof::nameof_type<T>()); SPDLOG_WARN("Type {}: Failed Parse but no TryParse found: {}", nameof::nameof_type<T>(), e.what());
} catch(...) { } catch(...) {
SPDLOG_WARN("Type {}: Failed Parse but no TryParse found", nameof::nameof_type<T>()); SPDLOG_WARN("Type {}: Failed Parse but no TryParse found", nameof::nameof_type<T>());
} }

View file

@ -36,13 +36,10 @@ auto StreamFeatures::BindType::Parse(const xmlpp::Element* node) -> StreamFeatur
auto StreamFeatures::Parse(const xmlpp::Element* node) -> StreamFeatures { auto StreamFeatures::Parse(const xmlpp::Element* node) -> StreamFeatures {
auto ptr = dynamic_cast<const xmlpp::Element*>(node->get_first_child("mechanisms")); auto ptr = dynamic_cast<const xmlpp::Element*>(node->get_first_child("mechanisms"));
if(!ptr) { using SaslMechanisms = struct SaslMechanisms;
throw std::runtime_error("Not found or invalid node mechanisms for StreamFeatures");
}
return {.startTls = ToOptional<StartTlsType>(node->get_first_child("starttls")), return {.startTls = ToOptional<StartTlsType>(node->get_first_child("starttls")),
.bind = ToOptional<BindType>(node->get_first_child("bind")), .bind = ToOptional<BindType>(node->get_first_child("bind")),
.saslMechanisms = SaslMechanisms::Parse(ptr), .saslMechanisms = ptr ? SaslMechanisms::Parse(ptr) : SaslMechanisms{.mechanisms = {}},
.others = node->get_children() | std::views::filter([](const xmlpp::Node* node) -> bool { .others = node->get_children() | std::views::filter([](const xmlpp::Node* node) -> bool {
auto name = node->get_name(); auto name = node->get_name();
return name != "starttls" && name != "mechanisms" && name != "bind"; return name != "starttls" && name != "mechanisms" && name != "bind";