SecretStorage.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from typing import Optional
  2. import keyring # TODO: Add to about as dependency
  3. from UM.Logger import Logger
  4. class SecretStorage:
  5. def __init__(self, preferences: Optional["Preferences"] = None):
  6. self._stored_secrets = set()
  7. if preferences:
  8. self._preferences = preferences
  9. keys = self._preferences.getValue("general/keyring")
  10. if keys is not None and keys != '':
  11. self._stored_secrets = set(keys.split(";"))
  12. else:
  13. self._preferences.addPreference("general/keyring", "{}")
  14. def __delitem__(self, key):
  15. if key in self._stored_secrets:
  16. self._stored_secrets.remove(key)
  17. self._preferences.setValue("general/keyring", ";".join(self._stored_secrets))
  18. keyring.delete_password("cura", key)
  19. else:
  20. # TODO: handle removal of secret from preferences
  21. pass
  22. def __setitem__(self, key, value):
  23. try:
  24. keyring.set_password("cura", key, value)
  25. self._stored_secrets.add(key)
  26. self._preferences.setValue(f"general/{key}", None)
  27. except:
  28. Logger.logException("w", f"Could not store {key} in keyring.")
  29. if key in self._stored_secrets:
  30. self._stored_secrets.remove(key)
  31. self._preferences.addPreference("general/{key}".format(key=key), "{}")
  32. self._preferences.setValue("general/{key}".format(key=key), value)
  33. self._preferences.setValue("general/keyring", ";".join(self._stored_secrets))
  34. def __getitem__(self, key):
  35. secret = self._preferences.getValue(f"general/{key}")
  36. if key in self._stored_secrets:
  37. try:
  38. secret = keyring.get_password("cura", key)
  39. except:
  40. if secret:
  41. Logger.logException("w",
  42. f"{key} obtained from preferences, consider giving Cura access to the keyring")
  43. if secret is None or secret == 'null':
  44. Logger.logException("w", f"Could not load {key}")
  45. return secret