bars-icloud-drive/icloudpy/utils.py

64 lines
1.8 KiB
Python

"""Utils."""
import getpass
from sys import stdout
import keyring
from .exceptions import ICloudPyNoStoredPasswordAvailableException
KEYRING_SYSTEM = "icloudpy://icloud-password"
def get_password(username, interactive=stdout.isatty() if stdout else False):
"""Get the password from a username."""
try:
return get_password_from_keyring(username)
except ICloudPyNoStoredPasswordAvailableException:
if not interactive:
raise
return getpass.getpass(f"Enter iCloud password for {username}: ")
def password_exists_in_keyring(username):
"""Return true if the password of a username exists in the keyring."""
try:
get_password_from_keyring(username)
except ICloudPyNoStoredPasswordAvailableException:
return False
return True
def get_password_from_keyring(username):
"""Get the password from a username."""
result = keyring.get_password(KEYRING_SYSTEM, username)
if result is None:
raise ICloudPyNoStoredPasswordAvailableException(
f"No iCloudPy password for {username} could be found "
"in the system keychain. Use the `--store-in-keyring` "
"command-line option for storing a password for this "
"username."
)
return result
def store_password_in_keyring(username, password):
"""Store the password of a username."""
return keyring.set_password(KEYRING_SYSTEM, username, password)
def delete_password_in_keyring(username):
"""Delete the password of a username."""
return keyring.delete_password(KEYRING_SYSTEM, username)
def underscore_to_camelcase(word, initial_capital=False):
"""Transform a word to camelCase."""
words = [x.capitalize() or "_" for x in word.split("_")]
if not initial_capital:
words[0] = words[0].lower()
return "".join(words)