11#include "QXmppConstants_p.h"
12#include "QXmppGlobal.h"
13#include "QXmppLogger.h"
14#include "QXmppNonza.h"
15#include "QXmppStreamManagement_p.h"
16#include "QXmppUtils_p.h"
22#include <QCryptographicHash>
28class QXmlStreamWriter;
29class QXmppSaslServerPrivate;
31namespace QXmpp::Private {
48namespace QXmpp::Private {
54enum class ErrorCondition {
69 static constexpr std::tuple XmlTag = { u
"auth", ns_sasl };
70 static std::optional<Auth> fromDom(
const QDomElement &);
71 void toXml(XmlWriter &)
const;
78 static constexpr std::tuple XmlTag = { u
"challenge", ns_sasl };
79 static std::optional<Challenge> fromDom(
const QDomElement &);
80 void toXml(XmlWriter &)
const;
86 static constexpr std::tuple XmlTag = { u
"failure", ns_sasl };
87 static std::optional<Failure> fromDom(
const QDomElement &);
88 void toXml(XmlWriter &)
const;
90 std::optional<ErrorCondition> condition;
95 static constexpr std::tuple XmlTag = { u
"response", ns_sasl };
96 static std::optional<Response> fromDom(
const QDomElement &);
97 void toXml(XmlWriter &)
const;
103 static constexpr std::tuple XmlTag = { u
"success", ns_sasl };
104 static std::optional<Success> fromDom(
const QDomElement &);
105 void toXml(XmlWriter &)
const;
111 static constexpr std::tuple XmlTag = { u
"bind", ns_bind2 };
112 static std::optional<Bind2Feature> fromDom(
const QDomElement &);
113 void toXml(XmlWriter &)
const;
115 std::vector<QString> features;
119 static constexpr std::tuple XmlTag = { u
"bind", ns_bind2 };
120 static std::optional<Bind2Request> fromDom(
const QDomElement &);
121 void toXml(XmlWriter &)
const;
125 bool csiInactive =
false;
126 bool carbonsEnable =
false;
127 std::optional<SmEnable> smEnable;
131 static constexpr std::tuple XmlTag = { u
"bound", ns_bind2 };
132 static std::optional<Bind2Bound> fromDom(
const QDomElement &);
133 void toXml(XmlWriter &)
const;
136 std::optional<SmFailed> smFailed;
137 std::optional<SmEnabled> smEnabled;
141 static constexpr std::tuple XmlTag = { u
"fast", ns_fast };
142 static std::optional<FastFeature> fromDom(
const QDomElement &);
143 void toXml(XmlWriter &)
const;
145 std::vector<QString> mechanisms;
146 bool tls0rtt =
false;
149struct FastTokenRequest {
150 static constexpr std::tuple XmlTag = { u
"request-token", ns_fast };
151 static std::optional<FastTokenRequest> fromDom(
const QDomElement &);
152 void toXml(XmlWriter &)
const;
158 static constexpr std::tuple XmlTag = { u
"token", ns_fast };
159 static std::optional<FastToken> fromDom(
const QDomElement &);
160 void toXml(XmlWriter &)
const;
167 static constexpr std::tuple XmlTag = { u
"fast", ns_fast };
168 static std::optional<FastRequest> fromDom(
const QDomElement &);
169 void toXml(XmlWriter &)
const;
171 std::optional<uint64_t> count;
172 bool invalidate =
false;
177struct StreamFeature {
178 static constexpr std::tuple XmlTag = { u
"authentication", QXmpp::Private::ns_sasl_2 };
179 static std::optional<StreamFeature> fromDom(
const QDomElement &);
180 void toXml(XmlWriter &)
const;
182 QList<QString> mechanisms;
183 std::optional<Bind2Feature> bind2Feature;
184 std::optional<FastFeature> fast;
185 bool streamResumptionAvailable =
false;
189 static constexpr std::tuple XmlTag = { u
"user-agent", QXmpp::Private::ns_sasl_2 };
190 static std::optional<UserAgent> fromDom(
const QDomElement &);
191 void toXml(XmlWriter &)
const;
199 static constexpr std::tuple XmlTag = { u
"authenticate", QXmpp::Private::ns_sasl_2 };
200 static std::optional<Authenticate> fromDom(
const QDomElement &);
201 void toXml(XmlWriter &)
const;
204 QByteArray initialResponse;
205 std::optional<UserAgent> userAgent;
206 std::optional<Bind2Request> bindRequest;
207 std::optional<SmResume> smResume;
208 std::optional<FastTokenRequest> tokenRequest;
209 std::optional<FastRequest> fast;
213 static constexpr std::tuple XmlTag = { u
"challenge", QXmpp::Private::ns_sasl_2 };
214 static std::optional<Challenge> fromDom(
const QDomElement &);
215 void toXml(XmlWriter &)
const;
221 static constexpr std::tuple XmlTag = { u
"response", QXmpp::Private::ns_sasl_2 };
222 static std::optional<Response> fromDom(
const QDomElement &);
223 void toXml(XmlWriter &)
const;
229 static constexpr std::tuple XmlTag = { u
"success", QXmpp::Private::ns_sasl_2 };
230 static std::optional<Success> fromDom(
const QDomElement &);
231 void toXml(XmlWriter &)
const;
233 std::optional<QByteArray> additionalData;
234 QString authorizationIdentifier;
236 std::optional<Bind2Bound> bound;
237 std::optional<SmResumed> smResumed;
238 std::optional<SmFailed> smFailed;
239 std::optional<FastToken> token;
243 static constexpr std::tuple XmlTag = { u
"failure", QXmpp::Private::ns_sasl_2 };
244 static std::optional<Failure> fromDom(
const QDomElement &);
245 void toXml(XmlWriter &)
const;
247 Sasl::ErrorCondition condition;
253 static constexpr std::tuple XmlTag = { u
"continue", QXmpp::Private::ns_sasl_2 };
254 static std::optional<Continue> fromDom(
const QDomElement &);
255 void toXml(XmlWriter &)
const;
257 QByteArray additionalData;
258 std::vector<QString> tasks;
263 static constexpr std::tuple XmlTag = { u
"abort", QXmpp::Private::ns_sasl_2 };
264 static std::optional<Abort> fromDom(
const QDomElement &);
265 void toXml(XmlWriter &)
const;
272enum class IanaHashAlgorithm {
280#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
290QCryptographicHash::Algorithm ianaHashAlgorithmToQt(IanaHashAlgorithm alg);
296struct SaslScramMechanism {
297 static std::optional<SaslScramMechanism> fromString(QStringView str);
298 QString toString()
const;
300 QCryptographicHash::Algorithm qtAlgorithm()
const;
302 auto operator<=>(
const SaslScramMechanism &)
const =
default;
312struct SaslHtMechanism {
313 static std::optional<SaslHtMechanism> fromString(QStringView);
314 QString toString()
const;
316 auto operator<=>(
const SaslHtMechanism &)
const =
default;
318 enum ChannelBindingType {
325 IanaHashAlgorithm hashAlgorithm;
326 ChannelBindingType channelBindingType;
329struct SaslDigestMd5Mechanism {
330 auto operator<=>(
const SaslDigestMd5Mechanism &)
const =
default;
332struct SaslPlainMechanism {
333 auto operator<=>(
const SaslPlainMechanism &)
const =
default;
335struct SaslAnonymousMechanism {
336 auto operator<=>(
const SaslAnonymousMechanism &)
const =
default;
338struct SaslXFacebookMechanism {
339 auto operator<=>(
const SaslXFacebookMechanism &)
const =
default;
341struct SaslXWindowsLiveMechanism {
342 auto operator<=>(
const SaslXWindowsLiveMechanism &)
const =
default;
344struct SaslXGoogleMechanism {
345 auto operator<=>(
const SaslXGoogleMechanism &)
const =
default;
350 : std::variant<SaslXGoogleMechanism,
351 SaslXWindowsLiveMechanism,
352 SaslXFacebookMechanism,
353 SaslAnonymousMechanism,
355 SaslDigestMd5Mechanism,
358 static std::optional<SaslMechanism> fromString(QStringView str);
359 QString toString()
const;
362inline QDebug operator<<(QDebug dbg, SaslMechanism mechanism) {
return dbg << mechanism.toString(); }
369 static std::optional<HtToken> fromXml(QXmlStreamReader &);
370 void toXml(XmlWriter &)
const;
371 bool operator==(
const HtToken &other)
const =
default;
373 SaslHtMechanism mechanism;
380 std::optional<HtToken> htToken;
383 QString facebookAccessToken;
384 QString facebookAppId;
386 QString googleAccessToken;
388 QString windowsLiveAccessToken;
392struct Enums::Data<Sasl::ErrorCondition> {
393 using enum Sasl::ErrorCondition;
394 static inline constexpr auto Values = makeValues<Sasl::ErrorCondition>({
395 { Aborted, u
"aborted" },
396 { AccountDisabled, u
"account-disabled" },
397 { CredentialsExpired, u
"credentials-expired" },
398 { EncryptionRequired, u
"encryption-required" },
399 { IncorrectEncoding, u
"incorrect-encoding" },
400 { InvalidAuthzid, u
"invalid-authzid" },
401 { InvalidMechanism, u
"invalid-mechanism" },
402 { MalformedRequest, u
"malformed-request" },
403 { MechanismTooWeak, u
"mechanism-too-weak" },
404 { NotAuthorized, u
"not-authorized" },
405 { TemporaryAuthFailure, u
"temporary-auth-failure" },
411class QXMPP_AUTOTEST_EXPORT QXmppSaslClient :
public QXmppLoggable
417 QString host()
const {
return m_host; }
418 void setHost(
const QString &host) { m_host = host; }
420 QString serviceType()
const {
return m_serviceType; }
421 void setServiceType(
const QString &serviceType) { m_serviceType = serviceType; }
423 QString username()
const {
return m_username; }
424 void setUsername(
const QString &username) { m_username = username; }
426 virtual void setCredentials(
const QXmpp::Private::Credentials &) = 0;
427 virtual QXmpp::Private::SaslMechanism mechanism()
const = 0;
428 virtual std::optional<QByteArray> respond(
const QByteArray &challenge) = 0;
430 static bool isMechanismAvailable(QXmpp::Private::SaslMechanism,
const QXmpp::Private::Credentials &);
431 static std::unique_ptr<QXmppSaslClient> create(
const QString &mechanism, QObject *parent =
nullptr);
432 static std::unique_ptr<QXmppSaslClient> create(QXmpp::Private::SaslMechanism mechanism, QObject *parent =
nullptr);
435 friend class QXmpp::Private::SaslManager;
438 QString m_serviceType;
443class QXMPP_AUTOTEST_EXPORT QXmppSaslServer :
public QXmppLoggable
454 QXmppSaslServer(QObject *parent =
nullptr);
455 ~QXmppSaslServer()
override;
457 QString username()
const;
458 void setUsername(
const QString &username);
460 QString password()
const;
461 void setPassword(
const QString &password);
463 QByteArray passwordDigest()
const;
464 void setPasswordDigest(
const QByteArray &digest);
466 QString realm()
const;
467 void setRealm(
const QString &realm);
469 virtual QString mechanism()
const = 0;
470 virtual Response respond(
const QByteArray &challenge, QByteArray &response) = 0;
472 static std::unique_ptr<QXmppSaslServer> create(
const QString &mechanism, QObject *parent =
nullptr);
475 const std::unique_ptr<QXmppSaslServerPrivate> d;
478class QXMPP_AUTOTEST_EXPORT QXmppSaslDigestMd5
481 static void setNonce(
const QByteArray &nonce);
484 static QMap<QByteArray, QByteArray> parseMessage(
const QByteArray &ba);
485 static QByteArray serializeMessage(
const QMap<QByteArray, QByteArray> &map);
488class QXmppSaslClientAnonymous :
public QXmppSaslClient
492 QXmppSaslClientAnonymous(QObject *parent =
nullptr);
493 void setCredentials(
const QXmpp::Private::Credentials &)
override { }
494 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslAnonymousMechanism() }; }
495 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
501class QXmppSaslClientDigestMd5 :
public QXmppSaslClient
505 QXmppSaslClientDigestMd5(QObject *parent =
nullptr);
506 void setCredentials(
const QXmpp::Private::Credentials &)
override;
507 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslDigestMd5Mechanism() }; }
508 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
519class QXmppSaslClientFacebook :
public QXmppSaslClient
523 QXmppSaslClientFacebook(QObject *parent =
nullptr);
524 void setCredentials(
const QXmpp::Private::Credentials &)
override;
525 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslXFacebookMechanism() }; }
526 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
530 QString m_accessToken;
534class QXmppSaslClientGoogle :
public QXmppSaslClient
538 QXmppSaslClientGoogle(QObject *parent =
nullptr);
539 void setCredentials(
const QXmpp::Private::Credentials &)
override;
540 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslXGoogleMechanism() }; }
541 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
544 QString m_accessToken;
548class QXmppSaslClientPlain :
public QXmppSaslClient
552 QXmppSaslClientPlain(QObject *parent =
nullptr);
553 void setCredentials(
const QXmpp::Private::Credentials &)
override;
554 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslPlainMechanism() }; }
555 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
562class QXmppSaslClientScram :
public QXmppSaslClient
566 QXmppSaslClientScram(QXmpp::Private::SaslScramMechanism mechanism, QObject *parent =
nullptr);
567 void setCredentials(
const QXmpp::Private::Credentials &)
override;
568 QXmpp::Private::SaslMechanism mechanism()
const override {
return { m_mechanism }; }
569 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
572 QXmpp::Private::SaslScramMechanism m_mechanism;
576 QByteArray m_gs2Header;
577 QByteArray m_clientFirstMessageBare;
578 QByteArray m_serverSignature;
582class QXmppSaslClientHt :
public QXmppSaslClient
585 using HtMechanism = QXmpp::Private::SaslHtMechanism;
588 QXmppSaslClientHt(HtMechanism mechanism, QObject *parent)
589 : QXmppSaslClient(parent), m_mechanism(mechanism)
593 void setCredentials(
const QXmpp::Private::Credentials &credentials)
override { m_token = credentials.htToken; }
594 QXmpp::Private::SaslMechanism mechanism()
const override {
return { m_mechanism }; }
595 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
598 std::optional<QXmpp::Private::HtToken> m_token;
599 HtMechanism m_mechanism;
603class QXmppSaslClientWindowsLive :
public QXmppSaslClient
607 QXmppSaslClientWindowsLive(QObject *parent =
nullptr);
608 void setCredentials(
const QXmpp::Private::Credentials &)
override;
609 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslXWindowsLiveMechanism() }; }
610 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
613 QString m_accessToken;
617class QXmppSaslServerAnonymous :
public QXmppSaslServer
621 QXmppSaslServerAnonymous(QObject *parent =
nullptr);
622 QString mechanism()
const override;
624 Response respond(
const QByteArray &challenge, QByteArray &response)
override;
630class QXmppSaslServerDigestMd5 :
public QXmppSaslServer
634 QXmppSaslServerDigestMd5(QObject *parent =
nullptr);
635 QString mechanism()
const override;
637 Response respond(
const QByteArray &challenge, QByteArray &response)
override;
647class QXmppSaslServerPlain :
public QXmppSaslServer
651 QXmppSaslServerPlain(QObject *parent =
nullptr);
652 QString mechanism()
const override;
654 Response respond(
const QByteArray &challenge, QByteArray &response)
override;
The QXmppLoggable class represents a source of logging messages.
Definition QXmppLogger.h:110