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 {
286QCryptographicHash::Algorithm ianaHashAlgorithmToQt(IanaHashAlgorithm alg);
292struct SaslScramMechanism {
293 static std::optional<SaslScramMechanism> fromString(QStringView str);
294 QString toString()
const;
296 QCryptographicHash::Algorithm qtAlgorithm()
const;
298 auto operator<=>(
const SaslScramMechanism &)
const =
default;
308struct SaslHtMechanism {
309 static std::optional<SaslHtMechanism> fromString(QStringView);
310 QString toString()
const;
312 auto operator<=>(
const SaslHtMechanism &)
const =
default;
314 enum ChannelBindingType {
321 IanaHashAlgorithm hashAlgorithm;
322 ChannelBindingType channelBindingType;
325struct SaslDigestMd5Mechanism {
326 auto operator<=>(
const SaslDigestMd5Mechanism &)
const =
default;
328struct SaslPlainMechanism {
329 auto operator<=>(
const SaslPlainMechanism &)
const =
default;
331struct SaslAnonymousMechanism {
332 auto operator<=>(
const SaslAnonymousMechanism &)
const =
default;
334struct SaslXFacebookMechanism {
335 auto operator<=>(
const SaslXFacebookMechanism &)
const =
default;
337struct SaslXWindowsLiveMechanism {
338 auto operator<=>(
const SaslXWindowsLiveMechanism &)
const =
default;
340struct SaslXGoogleMechanism {
341 auto operator<=>(
const SaslXGoogleMechanism &)
const =
default;
346 : std::variant<SaslXGoogleMechanism,
347 SaslXWindowsLiveMechanism,
348 SaslXFacebookMechanism,
349 SaslAnonymousMechanism,
351 SaslDigestMd5Mechanism,
354 static std::optional<SaslMechanism> fromString(QStringView str);
355 QString toString()
const;
358inline QDebug operator<<(QDebug dbg, SaslMechanism mechanism) {
return dbg << mechanism.toString(); }
365 static std::optional<HtToken> fromXml(QXmlStreamReader &);
366 void toXml(XmlWriter &)
const;
367 bool operator==(
const HtToken &other)
const =
default;
369 SaslHtMechanism mechanism;
376 std::optional<HtToken> htToken;
379 QString facebookAccessToken;
380 QString facebookAppId;
382 QString googleAccessToken;
384 QString windowsLiveAccessToken;
388struct Enums::Data<Sasl::ErrorCondition> {
389 using enum Sasl::ErrorCondition;
390 static inline constexpr auto Values = makeValues<Sasl::ErrorCondition>({
391 { Aborted, u
"aborted" },
392 { AccountDisabled, u
"account-disabled" },
393 { CredentialsExpired, u
"credentials-expired" },
394 { EncryptionRequired, u
"encryption-required" },
395 { IncorrectEncoding, u
"incorrect-encoding" },
396 { InvalidAuthzid, u
"invalid-authzid" },
397 { InvalidMechanism, u
"invalid-mechanism" },
398 { MalformedRequest, u
"malformed-request" },
399 { MechanismTooWeak, u
"mechanism-too-weak" },
400 { NotAuthorized, u
"not-authorized" },
401 { TemporaryAuthFailure, u
"temporary-auth-failure" },
407class QXMPP_AUTOTEST_EXPORT QXmppSaslClient :
public QXmppLoggable
413 QString host()
const {
return m_host; }
414 void setHost(
const QString &host) { m_host = host; }
416 QString serviceType()
const {
return m_serviceType; }
417 void setServiceType(
const QString &serviceType) { m_serviceType = serviceType; }
419 QString username()
const {
return m_username; }
420 void setUsername(
const QString &username) { m_username = username; }
422 virtual void setCredentials(
const QXmpp::Private::Credentials &) = 0;
423 virtual QXmpp::Private::SaslMechanism mechanism()
const = 0;
424 virtual std::optional<QByteArray> respond(
const QByteArray &challenge) = 0;
426 static bool isMechanismAvailable(QXmpp::Private::SaslMechanism,
const QXmpp::Private::Credentials &);
427 static std::unique_ptr<QXmppSaslClient> create(
const QString &mechanism, QObject *parent =
nullptr);
428 static std::unique_ptr<QXmppSaslClient> create(QXmpp::Private::SaslMechanism mechanism, QObject *parent =
nullptr);
431 friend class QXmpp::Private::SaslManager;
434 QString m_serviceType;
439class QXMPP_AUTOTEST_EXPORT QXmppSaslServer :
public QXmppLoggable
450 QXmppSaslServer(QObject *parent =
nullptr);
451 ~QXmppSaslServer()
override;
453 QString username()
const;
454 void setUsername(
const QString &username);
456 QString password()
const;
457 void setPassword(
const QString &password);
459 QByteArray passwordDigest()
const;
460 void setPasswordDigest(
const QByteArray &digest);
462 QString realm()
const;
463 void setRealm(
const QString &realm);
465 virtual QString mechanism()
const = 0;
466 virtual Response respond(
const QByteArray &challenge, QByteArray &response) = 0;
468 static std::unique_ptr<QXmppSaslServer> create(
const QString &mechanism, QObject *parent =
nullptr);
471 const std::unique_ptr<QXmppSaslServerPrivate> d;
474class QXMPP_AUTOTEST_EXPORT QXmppSaslDigestMd5
477 static void setNonce(
const QByteArray &nonce);
480 static QMap<QByteArray, QByteArray> parseMessage(
const QByteArray &ba);
481 static QByteArray serializeMessage(
const QMap<QByteArray, QByteArray> &map);
484class QXmppSaslClientAnonymous :
public QXmppSaslClient
488 QXmppSaslClientAnonymous(QObject *parent =
nullptr);
489 void setCredentials(
const QXmpp::Private::Credentials &)
override { }
490 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslAnonymousMechanism() }; }
491 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
497class QXmppSaslClientDigestMd5 :
public QXmppSaslClient
501 QXmppSaslClientDigestMd5(QObject *parent =
nullptr);
502 void setCredentials(
const QXmpp::Private::Credentials &)
override;
503 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslDigestMd5Mechanism() }; }
504 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
515class QXmppSaslClientFacebook :
public QXmppSaslClient
519 QXmppSaslClientFacebook(QObject *parent =
nullptr);
520 void setCredentials(
const QXmpp::Private::Credentials &)
override;
521 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslXFacebookMechanism() }; }
522 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
526 QString m_accessToken;
530class QXmppSaslClientGoogle :
public QXmppSaslClient
534 QXmppSaslClientGoogle(QObject *parent =
nullptr);
535 void setCredentials(
const QXmpp::Private::Credentials &)
override;
536 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslXGoogleMechanism() }; }
537 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
540 QString m_accessToken;
544class QXmppSaslClientPlain :
public QXmppSaslClient
548 QXmppSaslClientPlain(QObject *parent =
nullptr);
549 void setCredentials(
const QXmpp::Private::Credentials &)
override;
550 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslPlainMechanism() }; }
551 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
558class QXmppSaslClientScram :
public QXmppSaslClient
562 QXmppSaslClientScram(QXmpp::Private::SaslScramMechanism mechanism, QObject *parent =
nullptr);
563 void setCredentials(
const QXmpp::Private::Credentials &)
override;
564 QXmpp::Private::SaslMechanism mechanism()
const override {
return { m_mechanism }; }
565 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
568 QXmpp::Private::SaslScramMechanism m_mechanism;
572 QByteArray m_gs2Header;
573 QByteArray m_clientFirstMessageBare;
574 QByteArray m_serverSignature;
578class QXmppSaslClientHt :
public QXmppSaslClient
581 using HtMechanism = QXmpp::Private::SaslHtMechanism;
584 QXmppSaslClientHt(HtMechanism mechanism, QObject *parent)
585 : QXmppSaslClient(parent), m_mechanism(mechanism)
589 void setCredentials(
const QXmpp::Private::Credentials &credentials)
override { m_token = credentials.htToken; }
590 QXmpp::Private::SaslMechanism mechanism()
const override {
return { m_mechanism }; }
591 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
594 std::optional<QXmpp::Private::HtToken> m_token;
595 HtMechanism m_mechanism;
599class QXmppSaslClientWindowsLive :
public QXmppSaslClient
603 QXmppSaslClientWindowsLive(QObject *parent =
nullptr);
604 void setCredentials(
const QXmpp::Private::Credentials &)
override;
605 QXmpp::Private::SaslMechanism mechanism()
const override {
return { QXmpp::Private::SaslXWindowsLiveMechanism() }; }
606 std::optional<QByteArray> respond(
const QByteArray &challenge)
override;
609 QString m_accessToken;
613class QXmppSaslServerAnonymous :
public QXmppSaslServer
617 QXmppSaslServerAnonymous(QObject *parent =
nullptr);
618 QString mechanism()
const override;
620 Response respond(
const QByteArray &challenge, QByteArray &response)
override;
626class QXmppSaslServerDigestMd5 :
public QXmppSaslServer
630 QXmppSaslServerDigestMd5(QObject *parent =
nullptr);
631 QString mechanism()
const override;
633 Response respond(
const QByteArray &challenge, QByteArray &response)
override;
643class QXmppSaslServerPlain :
public QXmppSaslServer
647 QXmppSaslServerPlain(QObject *parent =
nullptr);
648 QString mechanism()
const override;
650 Response respond(
const QByteArray &challenge, QByteArray &response)
override;
The QXmppLoggable class represents a source of logging messages.
Definition QXmppLogger.h:109