24#define SECURITY_WIN32 1
26#elif QT_CONFIG(gssapi)
27#if defined(Q_OS_DARWIN)
30#include <gssapi/gssapi.h>
44static bool q_SSPI_library_load();
49#elif QT_CONFIG(gssapi)
50static bool qGssapiTestGetCredentials(
QStringView host);
360class QSSPIWindowsHandles
363 CredHandle credHandle;
364 CtxtHandle ctxHandle;
366#elif QT_CONFIG(gssapi)
370 gss_ctx_id_t gssCtx =
nullptr;
371 gss_name_t targetName;
391 int separatorPosn = 0;
395 if ((separatorPosn =
user.
indexOf(
"\\"_L1)) != -1) {
415 auto separator =
method.indexOf(
' ');
421 static const char methods[][10] = {
425#if QT_CONFIG(sspi) || QT_CONFIG(gssapi)
450#if !QT_CONFIG(gssapi)
453 const char *search = isProxy ?
"proxy-authenticate" :
"www-authenticate";
467 for (
int i = 0;
i <
values.size(); ++
i) {
474 headerVal = current.second.
mid(6);
477 headerVal = current.second.
mid(5);
484 headerVal = current.second.
mid(7);
486#if QT_CONFIG(sspi) || QT_CONFIG(gssapi)
491 if (!qGssapiTestGetCredentials(host))
495 headerVal = current.second.
mid(10);
507 auto privSetRealm = [
this](
QString newRealm) {
508 if (newRealm !=
realm) {
512 this->options[
"realm"_L1] =
realm;
546#if !QT_CONFIG(sspi) && !QT_CONFIG(gssapi)
550 const char* methodString =
nullptr;
557 methodString =
"Basic";
563 methodString =
"Digest";
568 methodString =
"NTLM";
573 phase1Token = qSspiStartup(
this,
method, host);
574 }
else if (!q_SSPI_library_load()) {
576 qWarning(
"Failed to load the SSPI libraries");
594 if (sspiWindowsHandles)
610 methodString =
"Negotiate";
614 phase1Token = qSspiStartup(
this,
method, host);
615#elif QT_CONFIG(gssapi)
616 phase1Token = qGssapiStartup(
this, host);
629 if (sspiWindowsHandles)
631#elif QT_CONFIG(gssapi)
662 while (
d <
end && (*
d ==
' ' || *
d ==
'\n' || *
d ==
'\r'))
665 while (
d <
end && *
d !=
'=')
678 bool backslash =
false;
679 if (*
d ==
'\\' &&
d <
end - 1) {
695 while (
d <
end && *
d !=
',')
744 hash.addData(userName);
748 hash.addData(password);
760 hash.addData(cNonce);
769 hash.addData(digestUri);
772 hash.addData(hEntity);
783 hash.addData(nonceCount);
785 hash.addData(cNonce);
790 hash.addData(ha2hex);
791 return hash.result().toHex();
801 while (nonceCountString.
size() < 8)
811 nonce, nonceCountString,
817 credentials +=
"username=\"" +
user.
toLatin1() +
"\", ";
819 credentials +=
"nonce=\"" + nonce +
"\", ";
820 credentials +=
"uri=\"" +
path +
"\", ";
822 credentials +=
"opaque=\"" + opaque +
"\", ";
823 credentials +=
"response=\"" + response +
'"';
825 credentials +=
", algorithm=" +
options.
value(
"algorithm");
827 credentials +=
", qop=" + qop +
", ";
828 credentials +=
"nc=" + nonceCountString +
", ";
829 credentials +=
"cnonce=\"" +
cnonce +
'"';
852#define NTLMSSP_NEGOTIATE_UNICODE 0x00000001
857#define NTLMSSP_NEGOTIATE_OEM 0x00000002
863#define NTLMSSP_REQUEST_TARGET 0x00000004
869#define NTLMSSP_NEGOTIATE_SIGN 0x00000010
875#define NTLMSSP_NEGOTIATE_SEAL 0x00000020
880#define NTLMSSP_NEGOTIATE_DATAGRAM 0x00000040
886#define NTLMSSP_NEGOTIATE_LM_KEY 0x00000080
891#define NTLMSSP_NEGOTIATE_NTLM 0x00000200
899#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED 0x00001000
906#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED 0x00002000
913#define NTLMSSP_NEGOTIATE_LOCAL_CALL 0x00004000
919#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN 0x00008000
925#define NTLMSSP_TARGET_TYPE_DOMAIN 0x00010000
931#define NTLMSSP_TARGET_TYPE_SERVER 0x00020000
938#define NTLMSSP_TARGET_TYPE_SHARE 0x00040000
946#define NTLMSSP_NEGOTIATE_NTLM2 0x00080000
953#define NTLMSSP_NEGOTIATE_TARGET_INFO 0x00800000
958#define NTLMSSP_NEGOTIATE_128 0x20000000
966#define NTLMSSP_NEGOTIATE_KEY_EXCHANGE 0x40000000
971#define NTLMSSP_NEGOTIATE_56 0x80000000
1074 return buf.offset +
buf.len;
1082 buf.len = 2 *
s.size();
1085 return buf.offset +
buf.len;
1091 s <<
b.len <<
b.maxLen <<
b.offset;
1097 s >>
b.len >>
b.maxLen >>
b.offset;
1154 if (!
b.domainStr.isEmpty())
1156 if (!
b.workstationStr.isEmpty())
1167 s <<
b.ntlmResponse;
1174 if (!
b.domainStr.isEmpty())
1179 if (!
b.workstationStr.isEmpty())
1205 unsigned short *
d = (
unsigned short*)rc.
data();
1216 unsigned short *
d = (
unsigned short*)
src.data();
1217 for (
int i = 0;
i <
src.size() / 2; ++
i) {
1249 Q_ASSERT_X(!(
key.isEmpty()),
"qEncodeHmacMd5",
"Empty key check");
1271 for(
int i = 0;
i<
key.size();
i++) {
1272 iKeyPad[
i] =
key[
i]^iKeyPad[
i];
1276 for(
int i = 0;
i<
key.size();
i++) {
1277 oKeyPad[
i] =
key[
i]^oKeyPad[
i];
1283 hash.addData(iKeyPad);
1290 hash.addData(oKeyPad);
1291 hmacDigest =
hash.result();
1383 if (
ch.targetInfo.len)
1389 if (timeArray.
size()) {
1410 if (
ch.targetInfo.len > 0) {
1412 ch.targetInfoBuff.size());
1423 ntChallengeResp.
append(temp);
1425 return ntChallengeResp;
1442 lmChallengeResp.
append(clientCh);
1444 return lmChallengeResp;
1458 if (strncmp(
ch.magic,
"NTLMSSP", 8) != 0)
1465 ds >>
ch.targetName;
1469 ds >>
ch.context[0] >>
ch.context[1];
1470 ds >>
ch.targetInfo;
1472 if (
ch.targetName.len > 0) {
1479 if (
ch.targetInfo.len > 0) {
1480 if (
ch.targetInfo.len +
ch.targetInfo.offset > (
unsigned)
data.size())
1483 ch.targetInfoBuff =
data.mid(
ch.targetInfo.offset,
ch.targetInfo.len);
1521 if (
ctx->userDomain.isEmpty() && !
ctx->extractedUser.contains(u
'@')) {
1536 if (
ch.targetInfo.len > 0) {
1562static PSecurityFunctionTableW pSecurityFunctionTable =
nullptr;
1564static bool q_SSPI_library_load()
1569 if (pSecurityFunctionTable ==
nullptr)
1570 pSecurityFunctionTable = InitSecurityInterfaceW();
1572 if (pSecurityFunctionTable ==
nullptr)
1581 if (!q_SSPI_library_load())
1586 if (!
ctx->sspiWindowsHandles)
1587 ctx->sspiWindowsHandles.reset(
new QSSPIWindowsHandles);
1588 SecInvalidateHandle(&
ctx->sspiWindowsHandles->credHandle);
1589 SecInvalidateHandle(&
ctx->sspiWindowsHandles->ctxHandle);
1591 SEC_WINNT_AUTH_IDENTITY auth;
1592 auth.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
1593 bool useAuth =
false;
1595 auth.Domain =
const_cast<ushort *
>(
reinterpret_cast<const ushort *
>(
ctx->userDomain.constData()));
1596 auth.DomainLength =
ctx->userDomain.size();
1597 auth.User =
const_cast<ushort *
>(
reinterpret_cast<const ushort *
>(
ctx->user.constData()));
1598 auth.UserLength =
ctx->user.size();
1599 auth.Password =
const_cast<ushort *
>(
reinterpret_cast<const ushort *
>(
ctx->password.constData()));
1600 auth.PasswordLength =
ctx->password.size();
1605 SECURITY_STATUS secStatus = pSecurityFunctionTable->AcquireCredentialsHandle(
1609 &
ctx->sspiWindowsHandles->credHandle, &expiry
1611 if (secStatus != SEC_E_OK) {
1612 ctx->sspiWindowsHandles.reset(
nullptr);
1616 return qSspiContinue(
ctx,
method, host);
1623 SecBuffer challengeBuf;
1624 SecBuffer responseBuf;
1625 SecBufferDesc challengeDesc;
1626 SecBufferDesc responseDesc;
1627 unsigned long attrs;
1633 challengeDesc.ulVersion = SECBUFFER_VERSION;
1634 challengeDesc.cBuffers = 1;
1635 challengeDesc.pBuffers = &challengeBuf;
1636 challengeBuf.BufferType = SECBUFFER_TOKEN;
1637 challengeBuf.pvBuffer = (PVOID)(challenge.
data());
1638 challengeBuf.cbBuffer = challenge.
length();
1642 responseDesc.ulVersion = SECBUFFER_VERSION;
1643 responseDesc.cBuffers = 1;
1644 responseDesc.pBuffers = &responseBuf;
1645 responseBuf.BufferType = SECBUFFER_TOKEN;
1646 responseBuf.pvBuffer =
nullptr;
1647 responseBuf.cbBuffer = 0;
1650 QString targetName =
ctx->options.value(
"spn"_L1).toString();
1652 targetName =
"HTTP/"_L1 + host;
1654 ? targetName :
QString()).toStdWString();
1657 SECURITY_STATUS secStatus = pSecurityFunctionTable->InitializeSecurityContext(
1658 &
ctx->sspiWindowsHandles->credHandle,
1659 !challenge.
isEmpty() ? &
ctx->sspiWindowsHandles->ctxHandle :
nullptr,
1660 const_cast<wchar_t*
>(targetNameW.data()),
1661 ISC_REQ_ALLOCATE_MEMORY,
1662 0, SECURITY_NATIVE_DREP,
1663 !challenge.
isEmpty() ? &challengeDesc :
nullptr,
1664 0, &
ctx->sspiWindowsHandles->ctxHandle,
1665 &responseDesc, &
attrs,
1669 if (secStatus == SEC_I_COMPLETE_NEEDED || secStatus == SEC_I_COMPLETE_AND_CONTINUE) {
1670 secStatus = pSecurityFunctionTable->CompleteAuthToken(&
ctx->sspiWindowsHandles->ctxHandle,
1674 if (secStatus != SEC_I_COMPLETE_AND_CONTINUE && secStatus != SEC_I_CONTINUE_NEEDED) {
1675 pSecurityFunctionTable->FreeCredentialsHandle(&
ctx->sspiWindowsHandles->credHandle);
1676 pSecurityFunctionTable->DeleteSecurityContext(&
ctx->sspiWindowsHandles->ctxHandle);
1677 ctx->sspiWindowsHandles.reset(
nullptr);
1680 result =
QByteArray((
const char*)responseBuf.pvBuffer, responseBuf.cbBuffer);
1681 pSecurityFunctionTable->FreeContextBuffer(responseBuf.pvBuffer);
1688#elif QT_CONFIG(gssapi)
1694static void q_GSSAPI_error_int(
const char *
message, OM_uint32 stat,
int type)
1696 OM_uint32 minStat, msgCtx = 0;
1697 gss_buffer_desc msg;
1700 gss_display_status(&minStat, stat,
type, GSS_C_NO_OID, &msgCtx, &msg);
1701 qCDebug(lcAuthenticator) <<
message <<
": " <<
reinterpret_cast<const char*
>(msg.value);
1702 gss_release_buffer(&minStat, &msg);
1707static void q_GSSAPI_error(
const char *
message, OM_uint32 majStat, OM_uint32 minStat)
1710 q_GSSAPI_error_int(
message, majStat, GSS_C_GSS_CODE);
1713 q_GSSAPI_error_int(
message, minStat, GSS_C_MECH_CODE);
1716static gss_name_t qGSsapiGetServiceName(
QStringView host)
1719 gss_buffer_desc nameDesc = {
static_cast<std::size_t
>(serviceName.
size()), serviceName.
data()};
1721 gss_name_t importedName;
1723 OM_uint32 majStat = gss_import_name(&minStat, &nameDesc,
1724 GSS_C_NT_HOSTBASED_SERVICE, &importedName);
1726 if (majStat != GSS_S_COMPLETE) {
1727 q_GSSAPI_error(
"gss_import_name error", majStat, minStat);
1730 return importedName;
1736 if (!
ctx->gssApiHandles)
1737 ctx->gssApiHandles.reset(
new QGssApiHandles);
1740 gss_name_t
name = qGSsapiGetServiceName(host);
1741 if (
name ==
nullptr) {
1742 ctx->gssApiHandles.reset(
nullptr);
1745 ctx->gssApiHandles->targetName =
name;
1748 ctx->gssApiHandles->gssCtx = GSS_C_NO_CONTEXT;
1749 return qGssapiContinue(
ctx);
1755 OM_uint32 majStat, minStat, ignored;
1757 gss_buffer_desc inBuf = {0,
nullptr};
1758 gss_buffer_desc outBuf;
1761 inBuf.value =
const_cast<char*
>(challenge.
data());
1762 inBuf.length = challenge.
size();
1765 majStat = gss_init_sec_context(&minStat,
1766 GSS_C_NO_CREDENTIAL,
1767 &
ctx->gssApiHandles->gssCtx,
1768 ctx->gssApiHandles->targetName,
1772 GSS_C_NO_CHANNEL_BINDINGS,
1773 challenge.
isEmpty() ? GSS_C_NO_BUFFER : &inBuf,
1779 if (outBuf.length != 0)
1780 result =
QByteArray(
reinterpret_cast<const char*
>(outBuf.value), outBuf.length);
1781 gss_release_buffer(&ignored, &outBuf);
1783 if (majStat != GSS_S_COMPLETE && majStat != GSS_S_CONTINUE_NEEDED) {
1784 q_GSSAPI_error(
"gss_init_sec_context error", majStat, minStat);
1785 gss_release_name(&ignored, &
ctx->gssApiHandles->targetName);
1786 if (
ctx->gssApiHandles->gssCtx)
1787 gss_delete_sec_context(&ignored, &
ctx->gssApiHandles->gssCtx, GSS_C_NO_BUFFER);
1788 ctx->gssApiHandles.reset(
nullptr);
1791 if (majStat == GSS_S_COMPLETE) {
1792 gss_release_name(&ignored, &
ctx->gssApiHandles->targetName);
1793 ctx->gssApiHandles.reset(
nullptr);
1799static bool qGssapiTestGetCredentials(
QStringView host)
1801 gss_name_t serviceName = qGSsapiGetServiceName(host);
1806 OM_uint32 majStat = gss_acquire_cred(&minStat, serviceName, GSS_C_INDEFINITE,
1807 GSS_C_NO_OID_SET, GSS_C_INITIATE, &cred,
nullptr,
1811 gss_release_name(&ignored, &serviceName);
1812 gss_release_cred(&ignored, &cred);
1814 if (majStat != GSS_S_COMPLETE) {
1815 q_GSSAPI_error(
"gss_acquire_cred", majStat, minStat);
static JNINativeMethod methods[]
static QHash< QByteArray, QByteArray > parseDigestAuthenticationChallenge(QByteArrayView challenge)
void parseHttpResponse(const QList< QPair< QByteArray, QByteArray > > &, bool isProxy, QStringView host)
QByteArray calculateResponse(QByteArrayView method, QByteArrayView path, QStringView host)
QByteArray digestMd5Response(QByteArrayView challenge, QByteArrayView method, QByteArrayView path)
static bool isMethodSupported(QByteArrayView method)
The QAuthenticator class provides an authentication object.
QString user() const
Returns the user used for authentication.
void setOption(const QString &opt, const QVariant &value)
~QAuthenticator()
Destructs the object.
void setPassword(const QString &password)
Sets the password used for authentication.
QAuthenticator & operator=(const QAuthenticator &other)
Assigns the contents of other to this authenticator.
QVariant option(const QString &opt) const
QAuthenticator()
Constructs an empty authentication object.
QString password() const
Returns the password used for authentication.
QString realm() const
Returns the realm requiring authentication.
bool isNull() const
Returns true if the object has not been initialized.
void setUser(const QString &user)
Sets the user used for authentication.
bool operator==(const QAuthenticator &other) const
Returns true if this authenticator is identical to other; otherwise returns false.
friend class QAuthenticatorPrivate
void setRealm(const QString &realm)
QVariantHash options() const
constexpr bool isNull() const noexcept
constexpr qsizetype length() const noexcept
constexpr QByteArrayView sliced(qsizetype pos) const
constexpr QByteArrayView first(qsizetype n) const
constexpr bool isEmpty() const noexcept
constexpr qsizetype size() const noexcept
int compare(QByteArrayView a, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
constexpr const_pointer data() const noexcept
QByteArray trimmed() const &
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
QByteArray & prepend(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
QList< QByteArray > split(char sep) const
Splits the byte array into subarrays wherever sep occurs, and returns the list of those arrays.
static QByteArray fromBase64(const QByteArray &base64, Base64Options options=Base64Encoding)
QByteArray right(qsizetype len) const
Returns a byte array that contains the last len bytes of this byte array.
char at(qsizetype i) const
Returns the byte at index position i in the byte array.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
void resize(qsizetype size)
Sets the size of the byte array to size bytes.
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QByteArray toBase64(Base64Options options=Base64Encoding) const
QByteArray toHex(char separator='\0') const
Returns a hex encoded copy of the byte array.
QByteArray mid(qsizetype index, qsizetype len=-1) const
Returns a byte array containing len bytes from this byte array, starting at position pos.
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
static QByteArray hash(QByteArrayView data, Algorithm method)
Returns the hash of data using method.
void addData(QByteArrayView data) noexcept
Adds the characters in bytes to the cryptographic hash.
QByteArray result() const
Returns the final hash value.
\inmodule QtCore\reentrant
int readRawData(char *, int len)
Reads at most len bytes from the stream into s and returns the number of bytes read.
int writeRawData(const char *, int len)
Writes len bytes from s to the stream.
void setByteOrder(ByteOrder)
Sets the serialization byte order to bo.
static qint64 currentSecsSinceEpoch() noexcept
T value(const Key &key) const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
unsigned char challenge[8]
QByteArray targetInfoBuff
QByteArray ntlmResponseBuf
static Q_DECL_CONST_FUNCTION QRandomGenerator * system()
\threadsafe
const_iterator cend() const noexcept
const_iterator constFind(const T &value) const
QByteArray toLocal8Bit() const
Returns a local 8-bit representation of the string as a QByteArray.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
void clear()
Clears the contents of the string and makes it null.
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QString toLower() const &
QString left(qsizetype n) const
Returns a substring that contains the n leftmost characters of the string.
static QString static QString qsizetype indexOf(QChar c, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
static QPartialOrdering compare(const QVariant &lhs, const QVariant &rhs)
Compares the objects at lhs and rhs for ordering.
QHash< int, QWidget * > hash
[35multi]
QSet< QString >::iterator it
Combined button and popup list for selecting options.
static QByteArray clientChallenge(const QAuthenticatorPrivate *ctx)
static QByteArray qNtlmPhase1()
static QDataStream & operator<<(QDataStream &s, const QNtlmBuffer &b)
#define NTLMSSP_NEGOTIATE_NTLM2
#define NTLMSSP_NEGOTIATE_TARGET_INFO
static QByteArray qStringAsUcs2Le(const QString &src)
static QByteArray qEncodeLmv2Response(const QAuthenticatorPrivate *ctx, const QNtlmPhase2Block &ch, QNtlmPhase3Block *phase3)
static bool verifyDigestMD5(QByteArrayView value)
static int qEncodeNtlmString(QNtlmBuffer &buf, int offset, const QString &s, bool unicode)
static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray &phase2data)
QByteArray qEncodeHmacMd5(QByteArray &key, QByteArrayView message)
#define NTLMSSP_NEGOTIATE_OEM
static QByteArray qEncodeNtlmv2Response(const QAuthenticatorPrivate *ctx, const QNtlmPhase2Block &ch, QNtlmPhase3Block *phase3)
static QByteArray digestMd5ResponseHelper(QByteArrayView alg, QByteArrayView userName, QByteArrayView realm, QByteArrayView password, QByteArrayView nonce, QByteArrayView nonceCount, QByteArrayView cNonce, QByteArrayView qop, QByteArrayView method, QByteArrayView digestUri, QByteArrayView hEntity)
static QDataStream & operator>>(QDataStream &s, QNtlmBuffer &b)
static QByteArray qCreatev2Hash(const QAuthenticatorPrivate *ctx, QNtlmPhase3Block *phase3)
static void qStreamNtlmBuffer(QDataStream &ds, const QByteArray &s)
#define NTLMSSP_REQUEST_TARGET
static QString qStringFromUcs2Le(QByteArray src)
static void qStreamNtlmString(QDataStream &ds, const QString &s, bool unicode)
#define NTLMSSP_NEGOTIATE_NTLM
static QByteArray qExtractServerTime(const QByteArray &targetInfoBuff)
#define NTLMSSP_NEGOTIATE_UNICODE
static int qEncodeNtlmBuffer(QNtlmBuffer &buf, int offset, const QByteArray &s)
const quint8 hirespversion
#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN
static bool qNtlmDecodePhase2(const QByteArray &data, QNtlmPhase2Block &ch)
size_t qstrlen(const char *str)
Q_CORE_EXPORT char * qstrncpy(char *dst, const char *src, size_t len)
QHash< QString, QVariant > QVariantHash
std::pair< T1, T2 > QPair
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
static struct AttrInfo attrs[]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
constexpr T qFromLittleEndian(T source)
constexpr T qToLittleEndian(T source)
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLenum GLsizei GLsizei GLint * values
[15]
GLboolean GLboolean GLboolean b
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLsizei const GLchar * message
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLsizei const GLchar *const * path
#define Q_ASSERT_X(cond, x, msg)
unsigned long long quint64
static QString quote(const QString &str)
bool contains(const AT &t) const noexcept