Marco Ricci commited on 2024-12-25 17:15:23
Zeige 4 geänderte Dateien mit 56 Einfügungen und 51 Löschungen.
... | ... |
@@ -8,14 +8,18 @@ |
8 | 8 |
|
9 | 9 |
### Changed |
10 | 10 |
|
11 |
- - Calling [`derivepassphrase.cli.derivepassphrase_export`][], |
|
12 |
- [`derivepassphrase.cli.derivepassphrase_export_vault`][] or |
|
13 |
- [`derivepassphrase.cli.derivepassphrase_vault`][], or calling |
|
14 |
- [`derivepassphrase.cli.derivepassphrase`][] via its |
|
11 |
+ - Calling [`derivepassphrase_export`] |
|
12 |
+ [derivepassphrase.cli.derivepassphrase_export], |
|
13 |
+ [`derivepassphrase_export_vault`] |
|
14 |
+ [derivepassphrase.cli.derivepassphrase_export_vault] or |
|
15 |
+ [`derivepassphrase_vault`] |
|
16 |
+ [derivepassphrase.cli.derivepassphrase_vault], or calling |
|
17 |
+ [`derivepassphrase`] [derivepassphrase.cli.derivepassphrase] via its |
|
15 | 18 |
[`.main`][click.BaseCommand.main] method, causes those functions to use |
16 | 19 |
the standard Python [logging][] and [warnings][] facilities to issue |
17 | 20 |
diagnostic messages, without output to standard error. (This includes |
18 | 21 |
using [`click.testing.CliRunner`][], which uses `.main` calls under the |
19 |
- hood.) Calling [`derivepassphrase.cli.derivepassphrase`][] directly as |
|
20 |
- a function diverts diagnostic messages to standard error. |
|
22 |
+ hood.) Calling [`derivepassphrase`] |
|
23 |
+ [derivepassphrase.cli.derivepassphrase] directly as a function diverts |
|
24 |
+ diagnostic messages to standard error. |
|
21 | 25 |
|
... | ... |
@@ -6,8 +6,8 @@ |
6 | 6 |
files are user-editable, the data files are `derivepassphrase`-editable. |
7 | 7 |
|
8 | 8 |
The configuration files are in TOML format, so installing |
9 |
- `derivepassphrase` on Python 3.10 and older requires the [`tomli`][] |
|
10 |
- package. |
|
9 |
+ `derivepassphrase` on Python 3.10 and older requires the |
|
10 |
+ [`tomli`][tomli] package. |
|
11 | 11 |
|
12 | 12 |
[tomli]: https://pypi.org/project/tomli/ |
13 | 13 |
|
... | ... |
@@ -5,9 +5,9 @@ title: Reference overview |
5 | 5 |
## Man pages |
6 | 6 |
|
7 | 7 |
* [`derivepassphrase(1)`][top_man]: Derive a strong passphrase, deterministically, from a master secret. |
8 |
- * [`derivepassphrase-vault(1)`][top_man]: Derive a passphrase using the vault(1) derivation scheme. |
|
8 |
+ * [`derivepassphrase-vault(1)`][vault_man]: Derive a passphrase using the vault(1) derivation scheme. |
|
9 | 9 |
* [`derivepassphrase-export(1)`][export_man]: Export a foreign configuration to standard output. |
10 |
- * [`derivepassphrase-export-vault(1)`][export_man]: Export a vault-native configuration to standard output. |
|
10 |
+ * [`derivepassphrase-export-vault(1)`][export_vault_man]: Export a vault-native configuration to standard output. |
|
11 | 11 |
|
12 | 12 |
## Modules and packages (API docs) |
13 | 13 |
|
... | ... |
@@ -146,7 +146,8 @@ class CLIofPackageFormatter(logging.Formatter): |
146 | 146 |
`PKG.deprecation` (where `PKG` is the package name), else |
147 | 147 |
`"Warning: "`. |
148 | 148 |
* For records at level [`logging.ERROR`][] and |
149 |
- [`logging.CRITICAL`][] `"Error: "`, `LABEL` is `"ERROR: "`. |
|
149 |
+ [`logging.CRITICAL`][] `"Error: "`, `LABEL` is the empty |
|
150 |
+ string. |
|
150 | 151 |
|
151 | 152 |
The level indication strings at level `WARNING` or above are |
152 | 153 |
highlighted. Use [`click.echo`][] to output them and remove |
... | ... |
@@ -516,8 +517,8 @@ def standard_logging_options(f: Callable[P, R]) -> Callable[P, R]: |
516 | 517 |
"""Decorate the function with standard logging click options. |
517 | 518 |
|
518 | 519 |
Adds the three click options `-v`/`--verbose`, `-q`/`--quiet` and |
519 |
- `--debug`, which issue callbacks to the [`log_info`][], |
|
520 |
- [`silence_warnings`][] and [`log_debug`][] functions, respectively. |
|
520 |
+ `--debug`, which calls back into the [`adjust_logging_level`][] |
|
521 |
+ function (with different argument values). |
|
521 | 522 |
|
522 | 523 |
Args: |
523 | 524 |
f: A callable to decorate. |
... | ... |
@@ -1084,8 +1085,8 @@ def _get_suitable_ssh_keys( |
1084 | 1085 |
with ssh_agent.SSHAgentClient.ensure_agent_subcontext(conn) as client: |
1085 | 1086 |
try: |
1086 | 1087 |
all_key_comment_pairs = list(client.list_keys()) |
1087 |
- except EOFError as e: # pragma: no cover |
|
1088 |
- raise RuntimeError(_AGENT_COMMUNICATION_ERROR) from e |
|
1088 |
+ except EOFError as exc: # pragma: no cover |
|
1089 |
+ raise RuntimeError(_AGENT_COMMUNICATION_ERROR) from exc |
|
1089 | 1090 |
suitable_keys = copy.copy(all_key_comment_pairs) |
1090 | 1091 |
for pair in all_key_comment_pairs: |
1091 | 1092 |
key, _comment = pair |
... | ... |
@@ -1337,13 +1338,13 @@ def _key_to_phrase( |
1337 | 1338 |
with ssh_agent.SSHAgentClient.ensure_agent_subcontext() as client: |
1338 | 1339 |
try: |
1339 | 1340 |
return vault.Vault.phrase_from_key(key, conn=client) |
1340 |
- except ssh_agent.SSHAgentFailedError as e: |
|
1341 |
+ except ssh_agent.SSHAgentFailedError as exc: |
|
1341 | 1342 |
try: |
1342 | 1343 |
keylist = client.list_keys() |
1343 | 1344 |
except ssh_agent.SSHAgentFailedError: |
1344 | 1345 |
pass |
1345 |
- except Exception as e2: # noqa: BLE001 |
|
1346 |
- e.__context__ = e2 |
|
1346 |
+ except Exception as exc2: # noqa: BLE001 |
|
1347 |
+ exc.__context__ = exc2 |
|
1347 | 1348 |
else: |
1348 | 1349 |
if not any( # pragma: no branch |
1349 | 1350 |
k == key for k, _ in keylist |
... | ... |
@@ -1352,7 +1353,7 @@ def _key_to_phrase( |
1352 | 1353 |
'The requested SSH key is not loaded ' |
1353 | 1354 |
'into the agent.' |
1354 | 1355 |
) |
1355 |
- error_callback(e) |
|
1356 |
+ error_callback(exc) |
|
1356 | 1357 |
except KeyError: |
1357 | 1358 |
error_callback('Cannot find running SSH agent; check SSH_AUTH_SOCK') |
1358 | 1359 |
except NotImplementedError: |
... | ... |
@@ -1360,8 +1361,8 @@ def _key_to_phrase( |
1360 | 1361 |
'Cannot connect to SSH agent because ' |
1361 | 1362 |
'this Python version does not support UNIX domain sockets' |
1362 | 1363 |
) |
1363 |
- except OSError as e: |
|
1364 |
- error_callback('Cannot connect to SSH agent: %s', e.strerror) |
|
1364 |
+ except OSError as exc: |
|
1365 |
+ error_callback('Cannot connect to SSH agent: %s', exc.strerror) |
|
1365 | 1366 |
|
1366 | 1367 |
|
1367 | 1368 |
def _print_config_as_sh_script( |
... | ... |
@@ -1500,9 +1501,9 @@ def _validate_occurrence_constraint( |
1500 | 1501 |
else: |
1501 | 1502 |
try: |
1502 | 1503 |
int_value = int(value, 10) |
1503 |
- except ValueError as e: |
|
1504 |
+ except ValueError as exc: |
|
1504 | 1505 |
msg = 'not an integer' |
1505 |
- raise click.BadParameter(msg) from e |
|
1506 |
+ raise click.BadParameter(msg) from exc |
|
1506 | 1507 |
if int_value < 0: |
1507 | 1508 |
msg = 'not a non-negative integer' |
1508 | 1509 |
raise click.BadParameter(msg) |
... | ... |
@@ -1537,9 +1538,9 @@ def _validate_length( |
1537 | 1538 |
else: |
1538 | 1539 |
try: |
1539 | 1540 |
int_value = int(value, 10) |
1540 |
- except ValueError as e: |
|
1541 |
+ except ValueError as exc: |
|
1541 | 1542 |
msg = 'not an integer' |
1542 |
- raise click.BadParameter(msg) from e |
|
1543 |
+ raise click.BadParameter(msg) from exc |
|
1543 | 1544 |
if int_value < 1: |
1544 | 1545 |
msg = 'not a positive integer' |
1545 | 1546 |
raise click.BadParameter(msg) |
... | ... |
@@ -1734,8 +1735,8 @@ DEFAULT_NOTES_MARKER = '# - - - - - >8 - - - - -' |
1734 | 1735 |
) |
1735 | 1736 |
@click.option( |
1736 | 1737 |
'--export-as', |
1737 |
- type=click.Choice(['JSON', 'sh']), |
|
1738 |
- default='JSON', |
|
1738 |
+ type=click.Choice(['json', 'sh']), |
|
1739 |
+ default='json', |
|
1739 | 1740 |
help='when exporting, export as JSON (default) or POSIX sh', |
1740 | 1741 |
cls=CompatibilityOption, |
1741 | 1742 |
) |
... | ... |
@@ -1963,10 +1964,10 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
1963 | 1964 |
else: |
1964 | 1965 |
deprecation.info('Successfully migrated to %r.', new_name) |
1965 | 1966 |
return backup_config |
1966 |
- except OSError as e: |
|
1967 |
- err('Cannot load config: %s: %r', e.strerror, e.filename) |
|
1968 |
- except Exception as e: # noqa: BLE001 |
|
1969 |
- err('Cannot load config: %s', str(e), exc_info=e) |
|
1967 |
+ except OSError as exc: |
|
1968 |
+ err('Cannot load config: %s: %r', exc.strerror, exc.filename) |
|
1969 |
+ except Exception as exc: # noqa: BLE001 |
|
1970 |
+ err('Cannot load config: %s', str(exc), exc_info=exc) |
|
1970 | 1971 |
|
1971 | 1972 |
def put_config(config: _types.VaultConfig, /) -> None: |
1972 | 1973 |
try: |
... | ... |
@@ -1981,10 +1982,10 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
1981 | 1982 |
return _load_user_config() |
1982 | 1983 |
except FileNotFoundError: |
1983 | 1984 |
return {} |
1984 |
- except OSError as e: |
|
1985 |
- err('Cannot load user config: %s: %r', e.strerror, e.filename) |
|
1986 |
- except Exception as e: # noqa: BLE001 |
|
1987 |
- err('Cannot load user config: %s', str(e), exc_info=e) |
|
1985 |
+ except OSError as exc: |
|
1986 |
+ err('Cannot load user config: %s: %r', exc.strerror, exc.filename) |
|
1987 |
+ except Exception as exc: # noqa: BLE001 |
|
1988 |
+ err('Cannot load user config: %s', str(exc), exc_info=exc) |
|
1988 | 1989 |
|
1989 | 1990 |
configuration: _types.VaultConfig |
1990 | 1991 |
|
... | ... |
@@ -2089,10 +2090,10 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2089 | 2090 |
# error information. |
2090 | 2091 |
with infile: |
2091 | 2092 |
maybe_config = json.load(infile) |
2092 |
- except json.JSONDecodeError as e: |
|
2093 |
- err('Cannot load config: cannot decode JSON: %s', e) |
|
2094 |
- except OSError as e: |
|
2095 |
- err('Cannot load config: %s: %r', e.strerror, e.filename) |
|
2093 |
+ except json.JSONDecodeError as exc: |
|
2094 |
+ err('Cannot load config: cannot decode JSON: %s', exc) |
|
2095 |
+ except OSError as exc: |
|
2096 |
+ err('Cannot load config: %s: %r', exc.strerror, exc.filename) |
|
2096 | 2097 |
cleaned = _types.clean_up_falsy_vault_config_values(maybe_config) |
2097 | 2098 |
if not _types.is_vault_config(maybe_config): |
2098 | 2099 |
err('Cannot load config: %s', _INVALID_VAULT_CONFIG) |
... | ... |
@@ -2137,8 +2138,8 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2137 | 2138 |
cast(dict[str, Any], value), |
2138 | 2139 |
main_config=user_config, |
2139 | 2140 |
) |
2140 |
- except AssertionError as e: |
|
2141 |
- err('The configuration file is invalid. ' + str(e)) |
|
2141 |
+ except AssertionError as exc: |
|
2142 |
+ err('The configuration file is invalid. ' + str(exc)) |
|
2142 | 2143 |
global_obj = maybe_config.get('global', {}) |
2143 | 2144 |
has_key = _types.js_truthiness(global_obj.get('key')) |
2144 | 2145 |
has_phrase = _types.js_truthiness(global_obj.get('phrase')) |
... | ... |
@@ -2225,8 +2226,8 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2225 | 2226 |
) |
2226 | 2227 |
else: |
2227 | 2228 |
json.dump(configuration, outfile) |
2228 |
- except OSError as e: |
|
2229 |
- err('Cannot store config: %s: %r', e.strerror, e.filename) |
|
2229 |
+ except OSError as exc: |
|
2230 |
+ err('Cannot store config: %s: %r', exc.strerror, exc.filename) |
|
2230 | 2231 |
else: |
2231 | 2232 |
configuration = get_config() |
2232 | 2233 |
# This block could be type checked more stringently, but this |
... | ... |
@@ -2272,14 +2273,14 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2272 | 2273 |
'Cannot connect to SSH agent because ' |
2273 | 2274 |
'this Python version does not support UNIX domain sockets' |
2274 | 2275 |
) |
2275 |
- except OSError as e: |
|
2276 |
- err('Cannot connect to SSH agent: %s', e.strerror) |
|
2276 |
+ except OSError as exc: |
|
2277 |
+ err('Cannot connect to SSH agent: %s', exc.strerror) |
|
2277 | 2278 |
except ( |
2278 | 2279 |
LookupError, |
2279 | 2280 |
RuntimeError, |
2280 | 2281 |
ssh_agent.SSHAgentFailedError, |
2281 |
- ) as e: |
|
2282 |
- err(str(e)) |
|
2282 |
+ ) as exc: |
|
2283 |
+ err(str(exc)) |
|
2283 | 2284 |
elif use_phrase: |
2284 | 2285 |
maybe_phrase = _prompt_for_passphrase() |
2285 | 2286 |
if not maybe_phrase: |
... | ... |
@@ -2304,8 +2305,8 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2304 | 2305 |
{'phrase': phrase}, |
2305 | 2306 |
main_config=user_config, |
2306 | 2307 |
) |
2307 |
- except AssertionError as e: |
|
2308 |
- err('The configuration file is invalid. ' + str(e)) |
|
2308 |
+ except AssertionError as exc: |
|
2309 |
+ err('The configuration file is invalid. ' + str(exc)) |
|
2309 | 2310 |
if 'key' in settings: |
2310 | 2311 |
if service: |
2311 | 2312 |
logger.warning( |
... | ... |
@@ -2366,8 +2367,8 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
2366 | 2367 |
{'phrase': phrase}, |
2367 | 2368 |
main_config=user_config, |
2368 | 2369 |
) |
2369 |
- except AssertionError as e: |
|
2370 |
- err('The configuration file is invalid. ' + str(e)) |
|
2370 |
+ except AssertionError as exc: |
|
2371 |
+ err('The configuration file is invalid. ' + str(exc)) |
|
2371 | 2372 |
|
2372 | 2373 |
# If either --key or --phrase are given, use that setting. |
2373 | 2374 |
# Otherwise, if both key and phrase are set in the config, |
2374 | 2375 |