From 7687e2a4295fedd844c46f921b78f21102d26685 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 17 Dec 2020 12:47:02 +0100 Subject: [PATCH] Port QLocalServer to the new property system Task-number: QTBUG-85520 Change-Id: Iee43a2e9e2d4847dad3b8be345d562af9aa3b690 Reviewed-by: Sona Kurazyan --- src/network/socket/qlocalserver.cpp | 6 ++++++ src/network/socket/qlocalserver.h | 5 ++++- src/network/socket/qlocalserver_p.h | 3 ++- src/network/socket/qlocalserver_unix.cpp | 13 +++++++------ src/network/socket/qlocalserver_win.cpp | 8 ++++---- .../socket/qlocalsocket/tst_qlocalsocket.cpp | 16 ++++++++++++++++ 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp index bce5b9a1a4f..16dc907149d 100644 --- a/src/network/socket/qlocalserver.cpp +++ b/src/network/socket/qlocalserver.cpp @@ -185,6 +185,12 @@ QLocalServer::SocketOptions QLocalServer::socketOptions() const return d->socketOptions; } +QBindable QLocalServer::bindableSocketOptions() +{ + Q_D(QLocalServer); + return &d->socketOptions; +} + /*! \since 5.10 Returns the native socket descriptor the server uses to listen diff --git a/src/network/socket/qlocalserver.h b/src/network/socket/qlocalserver.h index 211aa94d855..22b99d3e670 100644 --- a/src/network/socket/qlocalserver.h +++ b/src/network/socket/qlocalserver.h @@ -43,6 +43,8 @@ #include #include +#include + QT_REQUIRE_CONFIG(localserver); QT_BEGIN_NAMESPACE @@ -54,7 +56,7 @@ class Q_NETWORK_EXPORT QLocalServer : public QObject { Q_OBJECT Q_DECLARE_PRIVATE(QLocalServer) - Q_PROPERTY(SocketOptions socketOptions READ socketOptions WRITE setSocketOptions) + Q_PROPERTY(SocketOptions socketOptions READ socketOptions WRITE setSocketOptions BINDABLE bindableSocketOptions) Q_SIGNALS: void newConnection(); @@ -91,6 +93,7 @@ public: void setSocketOptions(SocketOptions options); SocketOptions socketOptions() const; + QBindable bindableSocketOptions(); qintptr socketDescriptor() const; diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h index f331a3f10db..5907874b600 100644 --- a/src/network/socket/qlocalserver_p.h +++ b/src/network/socket/qlocalserver_p.h @@ -126,7 +126,8 @@ public: QQueue pendingConnections; QString errorString; QAbstractSocket::SocketError error; - QLocalServer::SocketOptions socketOptions; + + Q_OBJECT_BINDABLE_PROPERTY(QLocalServerPrivate, QLocalServer::SocketOptions, socketOptions) }; QT_END_NAMESPACE diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp index ea7e8e1e0e3..45fdc6dd741 100644 --- a/src/network/socket/qlocalserver_unix.cpp +++ b/src/network/socket/qlocalserver_unix.cpp @@ -94,7 +94,8 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) QScopedPointer tempDir; // Check any of the flags - if (socketOptions & QLocalServer::WorldAccessOption) { + const auto options = socketOptions.value(); + if (options & QLocalServer::WorldAccessOption) { QFileInfo serverNameFileInfo(fullServerName); tempDir.reset(new QTemporaryDir(serverNameFileInfo.absolutePath() + QLatin1Char('/'))); if (!tempDir->isValid()) { @@ -121,7 +122,7 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) return false; } - if (socketOptions & QLocalServer::WorldAccessOption) { + if (options & QLocalServer::WorldAccessOption) { if (sizeof(addr.sun_path) < (uint)encodedTempPath.size() + 1) { setError(QLatin1String("QLocalServer::listen")); closeServer(); @@ -157,16 +158,16 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) return false; } - if (socketOptions & QLocalServer::WorldAccessOption) { + if (options & QLocalServer::WorldAccessOption) { mode_t mode = 000; - if (socketOptions & QLocalServer::UserAccessOption) + if (options & QLocalServer::UserAccessOption) mode |= S_IRWXU; - if (socketOptions & QLocalServer::GroupAccessOption) + if (options & QLocalServer::GroupAccessOption) mode |= S_IRWXG; - if (socketOptions & QLocalServer::OtherAccessOption) + if (options & QLocalServer::OtherAccessOption) mode |= S_IRWXO; if (::chmod(encodedTempPath.constData(), mode) == -1) { diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp index 6d92ebe93a2..a05722987c2 100644 --- a/src/network/socket/qlocalserver_win.cpp +++ b/src/network/socket/qlocalserver_win.cpp @@ -77,7 +77,7 @@ bool QLocalServerPrivate::addListener() QByteArray tokenGroupBuffer; // create security descriptor if access options were specified - if ((socketOptions & QLocalServer::WorldAccessOption)) { + if ((socketOptions.value() & QLocalServer::WorldAccessOption)) { pSD.reset(new SECURITY_DESCRIPTOR); if (!InitializeSecurityDescriptor(pSD.data(), SECURITY_DESCRIPTOR_REVISION)) { setError(QLatin1String("QLocalServerPrivate::addListener")); @@ -143,21 +143,21 @@ bool QLocalServerPrivate::addListener() auto acl = reinterpret_cast(aclBuffer.data()); InitializeAcl(acl, aclSize, ACL_REVISION_DS); - if (socketOptions & QLocalServer::UserAccessOption) { + if (socketOptions.value() & QLocalServer::UserAccessOption) { if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, pTokenUser->User.Sid)) { setError(QLatin1String("QLocalServerPrivate::addListener")); FreeSid(worldSID); return false; } } - if (socketOptions & QLocalServer::GroupAccessOption) { + if (socketOptions.value() & QLocalServer::GroupAccessOption) { if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, pTokenGroup->PrimaryGroup)) { setError(QLatin1String("QLocalServerPrivate::addListener")); FreeSid(worldSID); return false; } } - if (socketOptions & QLocalServer::OtherAccessOption) { + if (socketOptions.value() & QLocalServer::OtherAccessOption) { if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, worldSID)) { setError(QLatin1String("QLocalServerPrivate::addListener")); FreeSid(worldSID); diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index 4a0f0a27edb..a5559cab707 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -126,6 +127,7 @@ private slots: void verifyListenWithDescriptor(); void verifyListenWithDescriptor_data(); + void serverBindingsAndProperties(); }; tst_QLocalSocket::tst_QLocalSocket() @@ -1426,6 +1428,20 @@ void tst_QLocalSocket::verifyListenWithDescriptor_data() } +void tst_QLocalSocket::serverBindingsAndProperties() +{ + QLocalServer server; + + QProperty sockOpts; + server.bindableSocketOptions().setBinding(Qt::makePropertyBinding(sockOpts)); + sockOpts = QLocalServer::GroupAccessOption | QLocalServer::UserAccessOption; + QCOMPARE(server.socketOptions(), sockOpts.value()); + + sockOpts.setBinding(server.bindableSocketOptions().makeBinding()); + server.setSocketOptions(QLocalServer::OtherAccessOption); + QCOMPARE(sockOpts.value(), QLocalServer::OtherAccessOption); +} + QTEST_MAIN(tst_QLocalSocket) #include "tst_qlocalsocket.moc"