diff --git a/cura/OAuth2/KeyringAttribute.py b/cura/OAuth2/KeyringAttribute.py index 12cdb94dd5..1d6f329ea9 100644 --- a/cura/OAuth2/KeyringAttribute.py +++ b/cura/OAuth2/KeyringAttribute.py @@ -1,10 +1,10 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Type, TYPE_CHECKING, Optional, List +from typing import Type, TYPE_CHECKING, Optional, List, Union import keyring from keyring.backend import KeyringBackend -from keyring.errors import NoKeyringError, PasswordSetError +from keyring.errors import NoKeyringError, PasswordSetError, KeyringError from UM.Logger import Logger @@ -14,13 +14,24 @@ if TYPE_CHECKING: # Need to do some extra workarounds on windows: import sys from UM.Platform import Platform + + +class _KeychainDenied(Exception): + pass + + if Platform.isWindows() and hasattr(sys, "frozen"): import win32timezone from keyring.backends.Windows import WinVaultKeyring keyring.set_keyring(WinVaultKeyring()) if Platform.isOSX() and hasattr(sys, "frozen"): from keyring.backends.macOS import Keyring + from keyring.backends.macOS.api import KeychainDenied as _KeychainDeniedMacOS + KeychainDenied: Union[Type[_KeychainDenied], Type[_KeychainDeniedMacOS]] = _KeychainDeniedMacOS keyring.set_keyring(Keyring()) +else: + KeychainDenied = _KeychainDenied + # Even if errors happen, we don't want this stored locally: DONT_EVER_STORE_LOCALLY: List[str] = ["refresh_token"] @@ -39,6 +50,10 @@ class KeyringAttribute: self._store_secure = False Logger.logException("w", "No keyring backend present") return getattr(instance, self._name) + except KeychainDenied: + self._store_secure = False + Logger.log("i", "Access to the keyring was denied.") + return getattr(instance, self._name) else: return getattr(instance, self._name)