summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <git@the-compiler.org>2015-09-09 10:47:34 +0200
committerFlorian Bruhin <git@the-compiler.org>2015-09-09 19:31:52 +0200
commitb135569d5c6e68c735ea83f42e4baf51f7972281 (patch)
tree015f7135d86d046f17601eb325a78be7590f3623
parent69e735c42ee4ac9cda1018f33ebde9a235dac0a5 (diff)
downloadqutebrowser-b135569d5c6e68c735ea83f42e4baf51f7972281.tar.gz
qutebrowser-b135569d5c6e68c735ea83f42e4baf51f7972281.zip
ipc: Add workaround for NameError w/ SocketOptions.
-rw-r--r--qutebrowser/misc/ipc.py15
-rw-r--r--tests/unit/misc/test_ipc.py19
2 files changed, 31 insertions, 3 deletions
diff --git a/qutebrowser/misc/ipc.py b/qutebrowser/misc/ipc.py
index d3c98c69d..f44e90387 100644
--- a/qutebrowser/misc/ipc.py
+++ b/qutebrowser/misc/ipc.py
@@ -31,7 +31,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject
from PyQt5.QtNetwork import QLocalSocket, QLocalServer, QAbstractSocket
import qutebrowser
-from qutebrowser.utils import log, usertypes, error, objreg, standarddir
+from qutebrowser.utils import (log, usertypes, error, objreg, standarddir,
+ qtutils)
CONNECT_TIMEOUT = 100
@@ -143,6 +144,8 @@ class IPCServer(QObject):
_server: A QLocalServer to accept new connections.
_socket: The QLocalSocket we're currently connected to.
_socketname: The socketname to use.
+ _socketopts_ok: Set if using setSocketOptions is working with this
+ OS/Qt version.
Signals:
got_args: Emitted when there was an IPC connection and arguments were
@@ -169,9 +172,13 @@ class IPCServer(QObject):
self._timer.setInterval(READ_TIMEOUT)
self._timer.timeout.connect(self.on_timeout)
self._server = QLocalServer(self)
- self._server.setSocketOptions(QLocalServer.UserAccessOption)
self._server.newConnection.connect(self.handle_connection)
self._socket = None
+ self._socketopts_ok = os.name == 'nt' or qtutils.version_check('5.4')
+ if self._socketopts_ok: # pragma: no cover
+ # If we use setSocketOptions on Unix with Qt < 5.4, we get a
+ # NameError while listening...
+ self._server.setSocketOptions(QLocalServer.UserAccessOption)
def _remove_server(self):
"""Remove an existing server."""
@@ -190,6 +197,10 @@ class IPCServer(QObject):
raise AddressInUseError(self._server)
else:
raise ListenError(self._server)
+ if not self._socketopts_ok: # pragma: no cover
+ # If we use setSocketOptions on Unix with Qt < 5.4, we get a
+ # NameError while listening...
+ os.chmod(self._server.fullServerName(), 0o700)
@pyqtSlot(int)
def on_error(self, err):
diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py
index a7fe385ba..25e7f87cc 100644
--- a/tests/unit/misc/test_ipc.py
+++ b/tests/unit/misc/test_ipc.py
@@ -35,7 +35,7 @@ from PyQt5.QtTest import QSignalSpy
import qutebrowser
from qutebrowser.misc import ipc
-from qutebrowser.utils import objreg
+from qutebrowser.utils import objreg, qtutils
from helpers import stubs # pylint: disable=import-error
@@ -773,3 +773,20 @@ def test_connect_inexistant(qlocalsocket):
"""
qlocalsocket.connectToServer('qute-test-inexistent')
assert qlocalsocket.error() == QLocalSocket.ServerNotFoundError
+
+
+def test_socket_options_listen_problem(qlocalserver, tmpdir):
+ """In earlier versions of Qt, listening fails when using socketOptions.
+
+ With this test, we verify that this bug exists in the Qt version/OS
+ combinations we expect it to, and doesn't exist in other versions.
+ """
+ servername = str(tmpdir / 'x')
+ qlocalserver.setSocketOptions(QLocalServer.UserAccessOption)
+ ok = qlocalserver.listen(servername)
+ if os.name == 'nt' or qtutils.version_check('5.4'):
+ assert ok
+ else:
+ assert not ok
+ assert qlocalserver.serverError() == QAbstractSocket.HostNotFoundError
+ assert qlocalserver.errorString() == 'QLocalServer::listen: Name error'