64 lines
1.8 KiB
Python
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)
|