Fix QDesktopServices.openUrl() for AppImage on Linux

This commit is contained in:
Lipu Fei 2019-08-20 08:24:43 +02:00
parent 53efad7e6f
commit f4dc9cc6a2

View File

@ -3,6 +3,7 @@
import json import json
from datetime import datetime, timedelta from datetime import datetime, timedelta
import os
from typing import Optional, TYPE_CHECKING from typing import Optional, TYPE_CHECKING
from urllib.parse import urlencode from urllib.parse import urlencode
@ -13,6 +14,7 @@ from PyQt5.QtGui import QDesktopServices
from UM.Logger import Logger from UM.Logger import Logger
from UM.Message import Message from UM.Message import Message
from UM.Platform import Platform
from UM.Signal import Signal from UM.Signal import Signal
from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer
@ -164,9 +166,24 @@ class AuthorizationService:
"code_challenge_method": "S512" "code_challenge_method": "S512"
}) })
# GITHUB issue #6194: https://github.com/Ultimaker/Cura/issues/6194
# With AppImage 2 on Linux, the current working directory will be somewhere in /tmp/<rand>/usr, which is owned
# by root. For some reason, QDesktopServices.openUrl() requires to have a usable current working directory,
# otherwise it doesn't work. This is a workaround on Linux that before we call QDesktopServices.openUrl(), we
# switch to a directory where the user has the ownership.
old_work_dir = ""
if Platform.isLinux():
# Change the working directory to user home
old_work_dir = os.getcwd()
os.chdir(os.path.expanduser("~"))
# Open the authorization page in a new browser window. # Open the authorization page in a new browser window.
QDesktopServices.openUrl(QUrl("{}?{}".format(self._auth_url, query_string))) QDesktopServices.openUrl(QUrl("{}?{}".format(self._auth_url, query_string)))
if Platform.isLinux():
# Change the working directory back
os.chdir(old_work_dir)
# Start a local web server to receive the callback URL on. # Start a local web server to receive the callback URL on.
self._server.start(verification_code) self._server.start(verification_code)