|
3 | 3 | import logging |
4 | 4 | import sys |
5 | 5 | import time |
6 | | -from typing import Callable, Dict, Tuple |
| 6 | +from functools import partial |
| 7 | +from typing import Callable, Dict, List, Tuple |
7 | 8 |
|
8 | 9 | import click |
9 | 10 |
|
@@ -38,34 +39,37 @@ def authenticator( |
38 | 39 | ) -> PyiCloudService: |
39 | 40 | """Authenticate with iCloud username and password""" |
40 | 41 | logger.debug("Authenticating...") |
41 | | - icloud: PyiCloudService | None = None |
42 | | - _valid_password: str | None = None |
43 | | - for _, _pair in password_providers.items(): |
44 | | - _reader, _ = _pair |
45 | | - _password = _reader(username) |
46 | | - if _password: |
47 | | - icloud = PyiCloudService( |
48 | | - filename_cleaner, |
49 | | - lp_filename_generator, |
50 | | - domain, |
51 | | - raw_policy, |
52 | | - file_match_policy, |
53 | | - username, |
54 | | - _password, |
55 | | - cookie_directory=cookie_directory, |
56 | | - client_id=client_id, |
57 | | - ) |
58 | | - _valid_password = _password |
59 | | - break |
| 42 | + valid_password: List[str] = [] |
| 43 | + |
| 44 | + def password_provider(username: str, valid_password: List[str]) -> str | None: |
| 45 | + for _, _pair in password_providers.items(): |
| 46 | + reader, _ = _pair |
| 47 | + password = reader(username) |
| 48 | + if password: |
| 49 | + valid_password.append(password) |
| 50 | + return password |
| 51 | + return None |
| 52 | + |
| 53 | + icloud = PyiCloudService( |
| 54 | + filename_cleaner, |
| 55 | + lp_filename_generator, |
| 56 | + domain, |
| 57 | + raw_policy, |
| 58 | + file_match_policy, |
| 59 | + username, |
| 60 | + partial(password_provider, username, valid_password), |
| 61 | + cookie_directory=cookie_directory, |
| 62 | + client_id=client_id, |
| 63 | + ) |
60 | 64 |
|
61 | 65 | if not icloud: |
62 | 66 | raise NotImplementedError("None of providers gave password") |
63 | 67 |
|
64 | | - if _valid_password: |
| 68 | + if valid_password: |
65 | 69 | # save valid password to all providers |
66 | 70 | for _, _pair in password_providers.items(): |
67 | | - _, _writer = _pair |
68 | | - _writer(username, _valid_password) |
| 71 | + _, writer = _pair |
| 72 | + writer(username, valid_password[0]) |
69 | 73 |
|
70 | 74 | if icloud.requires_2fa: |
71 | 75 | if raise_error_on_2sa: |
|
0 commit comments