Marco Ricci commited on 2024-09-12 21:23:13
Zeige 5 geänderte Dateien mit 77 Einfügungen und 40 Löschungen.
This includes formatting, typos and missing/wrong links. Most of these are in non-public documentation parts which don't get rendered by default.
| ... | ... |
@@ -176,9 +176,11 @@ class SSH_AGENTC(enum.Enum): # noqa: N801 |
| 176 | 176 |
|
| 177 | 177 |
Attributes: |
| 178 | 178 |
REQUEST_IDENTITIES: |
| 179 |
- List identities. Expecting `SSH_AGENT.IDENTITIES_ANSWER`. |
|
| 179 |
+ List identities. Expecting [`SSH_AGENT.IDENTITIES_ANSWER`] |
|
| 180 |
+ [derivepassphrase._types.SSH_AGENT]. |
|
| 180 | 181 |
SIGN_REQUEST: |
| 181 |
- Sign data. Expecting `SSH_AGENT.SIGN_RESPONSE`. |
|
| 182 |
+ Sign data. Expecting [`SSH_AGENT.SIGN_RESPONSE`] |
|
| 183 |
+ [derivepassphrase._types.SSH_AGENT]. |
|
| 182 | 184 |
|
| 183 | 185 |
""" |
| 184 | 186 |
|
| ... | ... |
@@ -195,9 +197,11 @@ class SSH_AGENT(enum.Enum): # noqa: N801 |
| 195 | 197 |
SUCCESS: |
| 196 | 198 |
Generic success code. |
| 197 | 199 |
IDENTITIES_ANSWER: |
| 198 |
- Successful answer to `SSH_AGENTC.REQUEST_IDENTITIES`. |
|
| 200 |
+ Successful answer to [`SSH_AGENTC.REQUEST_IDENTITIES`] |
|
| 201 |
+ [derivepassphrase._types.SSH_AGENTC]. |
|
| 199 | 202 |
SIGN_RESPONSE: |
| 200 |
- Successful answer to `SSH_AGENTC.SIGN_REQUEST`. |
|
| 203 |
+ Successful answer to [`SSH_AGENTC.SIGN_REQUEST`] |
|
| 204 |
+ [derivepassphrase._types.SSH_AGENTC]. |
|
| 201 | 205 |
|
| 202 | 206 |
""" |
| 203 | 207 |
|
| ... | ... |
@@ -393,7 +393,7 @@ def _load_config() -> _types.VaultConfig: |
| 393 | 393 |
|
| 394 | 394 |
Returns: |
| 395 | 395 |
The vault settings. See |
| 396 |
- [`derivepassphrase.types.VaultConfig`][] for details. |
|
| 396 |
+ [`derivepassphrase._types.VaultConfig`][] for details. |
|
| 397 | 397 |
|
| 398 | 398 |
Raises: |
| 399 | 399 |
OSError: |
| ... | ... |
@@ -423,7 +423,7 @@ def _migrate_and_load_old_config() -> ( |
| 423 | 423 |
|
| 424 | 424 |
Returns: |
| 425 | 425 |
The vault settings, and an optional exception encountered during |
| 426 |
- migration. See [`derivepassphrase.types.VaultConfig`][] for |
|
| 426 |
+ migration. See [`derivepassphrase._types.VaultConfig`][] for |
|
| 427 | 427 |
details on the former. |
| 428 | 428 |
|
| 429 | 429 |
Raises: |
| ... | ... |
@@ -485,7 +485,7 @@ def _get_suitable_ssh_keys( |
| 485 | 485 |
"""Yield all SSH keys suitable for passphrase derivation. |
| 486 | 486 |
|
| 487 | 487 |
Suitable SSH keys are queried from the running SSH agent (see |
| 488 |
- [`ssh_agent.SSHAgentClient.list_keys`][]). |
|
| 488 |
+ [`derivepassphrase.ssh_agent.SSHAgentClient.list_keys`][]). |
|
| 489 | 489 |
|
| 490 | 490 |
Args: |
| 491 | 491 |
conn: |
| ... | ... |
@@ -521,7 +521,7 @@ def _get_suitable_ssh_keys( |
| 521 | 521 |
SSH agent. |
| 522 | 522 |
RuntimeError: |
| 523 | 523 |
There was an error communicating with the SSH agent. |
| 524 |
- SSHAgentFailedError: |
|
| 524 |
+ ssh_agent.SSHAgentFailedError: |
|
| 525 | 525 |
The agent failed to supply a list of loaded keys. |
| 526 | 526 |
|
| 527 | 527 |
""" |
| ... | ... |
@@ -629,8 +629,9 @@ def _select_ssh_key( |
| 629 | 629 |
"""Interactively select an SSH key for passphrase derivation. |
| 630 | 630 |
|
| 631 | 631 |
Suitable SSH keys are queried from the running SSH agent (see |
| 632 |
- [`ssh_agent.SSHAgentClient.list_keys`][]), then the user is |
|
| 633 |
- prompted interactively (see [`click.prompt`][]) for a selection. |
|
| 632 |
+ [`derivepassphrase.ssh_agent.SSHAgentClient.list_keys`][]), then the |
|
| 633 |
+ user is prompted interactively (see [`click.prompt`][]) for |
|
| 634 |
+ a selection. |
|
| 634 | 635 |
|
| 635 | 636 |
Args: |
| 636 | 637 |
conn: |
| ... | ... |
@@ -17,10 +17,11 @@ __all__ = () |
| 17 | 17 |
|
| 18 | 18 |
|
| 19 | 19 |
def get_vault_key() -> bytes: |
| 20 |
- """Automatically determine the vault master key/password. |
|
| 20 |
+ """Automatically determine the vault(1) master key/password. |
|
| 21 | 21 |
|
| 22 | 22 |
Query the `VAULT_KEY`, `LOGNAME`, `USER` and `USERNAME` environment |
| 23 |
- variables, in that order. This is the same algorithm as vault uses. |
|
| 23 |
+ variables, in that order. This is the same algorithm that vault |
|
| 24 |
+ uses. |
|
| 24 | 25 |
|
| 25 | 26 |
Returns: |
| 26 | 27 |
The master key/password. This is generally used as input to |
| ... | ... |
@@ -46,10 +47,10 @@ def get_vault_key() -> bytes: |
| 46 | 47 |
|
| 47 | 48 |
|
| 48 | 49 |
def get_vault_path() -> str | bytes | os.PathLike: |
| 49 |
- """Automatically determine the vault configuration path. |
|
| 50 |
+ """Automatically determine the vault(1) configuration path. |
|
| 50 | 51 |
|
| 51 | 52 |
Query the `VAULT_PATH` environment variable, or default to |
| 52 |
- `~/.vault`. This is the same algorithm as vault uses. If not |
|
| 53 |
+ `~/.vault`. This is the same algorithm that vault uses. If not |
|
| 53 | 54 |
absolute, then `VAULT_PATH` is relative to the home directory. |
| 54 | 55 |
|
| 55 | 56 |
Returns: |
| ... | ... |
@@ -285,21 +285,21 @@ class Sequin: |
| 285 | 285 |
take `k` numbers from the base `base` sequence (or bail if not |
| 286 | 286 |
possible). If the resulting number `v` is out of range for |
| 287 | 287 |
base `n`, then push `v - n` onto the rejection queue for |
| 288 |
- base `r` = `base` ** `k` - `n`, and attempt to generate the |
|
| 289 |
- requested base `n` integer from the sequence of base `r` numbers |
|
| 290 |
- next. (This recursion is not attempted if `r` = 1.) Otherwise, |
|
| 291 |
- return the number. |
|
| 288 |
+ base `r` (where `r = base ** k - n`), and attempt to generate |
|
| 289 |
+ the requested base `n` integer from the sequence of base `r` |
|
| 290 |
+ numbers next. (This recursion is not attempted if `r` = 1.) |
|
| 291 |
+ Otherwise, return the number. |
|
| 292 | 292 |
|
| 293 | 293 |
Args: |
| 294 | 294 |
n: |
| 295 |
- Generate numbers in the range 0, ..., `n` - 1. |
|
| 295 |
+ Generate numbers in the range 0, ..., `n - 1`. |
|
| 296 | 296 |
(Inclusive.) Must be larger than 0. |
| 297 | 297 |
base: |
| 298 | 298 |
Use the base `base` sequence as a source for |
| 299 | 299 |
pseudorandom numbers. |
| 300 | 300 |
|
| 301 | 301 |
Returns: |
| 302 |
- A pseudorandom number in the range 0, ..., `n` - 1 if |
|
| 302 |
+ A pseudorandom number in the range 0, ..., `n - 1` if |
|
| 303 | 303 |
possible, or `n` if the stream is exhausted. |
| 304 | 304 |
|
| 305 | 305 |
Raises: |
| ... | ... |
@@ -377,7 +377,11 @@ class Sequin: |
| 377 | 377 |
return v |
| 378 | 378 |
|
| 379 | 379 |
def _stash(self, value: int, /, *, base: int = 2) -> None: |
| 380 |
- """Stash `value` on the base `base` sequence.""" |
|
| 380 |
+ """Stash `value` on the base `base` sequence. |
|
| 381 |
+ |
|
| 382 |
+ Sets up the base `base` sequence if it does not yet exist. |
|
| 383 |
+ |
|
| 384 |
+ """ |
|
| 381 | 385 |
if base not in self.bases: |
| 382 | 386 |
self.bases[base] = collections.deque() |
| 383 | 387 |
self.bases[base].append(value) |
| ... | ... |
@@ -10,6 +10,7 @@ import base64 |
| 10 | 10 |
import collections |
| 11 | 11 |
import hashlib |
| 12 | 12 |
import math |
| 13 |
+import types |
|
| 13 | 14 |
from collections.abc import Callable |
| 14 | 15 |
from typing import TypeAlias |
| 15 | 16 |
|
| ... | ... |
@@ -20,24 +21,6 @@ from derivepassphrase import sequin, ssh_agent |
| 20 | 21 |
__author__ = 'Marco Ricci <software@the13thletter.info>' |
| 21 | 22 |
|
| 22 | 23 |
|
| 23 |
-_CHARSETS = collections.OrderedDict([ |
|
| 24 |
- ('lower', b'abcdefghijklmnopqrstuvwxyz'),
|
|
| 25 |
- ('upper', b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
|
|
| 26 |
- ('alpha', b''), # Placeholder.
|
|
| 27 |
- ('number', b'0123456789'),
|
|
| 28 |
- ('alphanum', b''), # Placeholder.
|
|
| 29 |
- ('space', b' '),
|
|
| 30 |
- ('dash', b'-_'),
|
|
| 31 |
- ('symbol', b'!"#$%&\'()*+,./:;<=>?@[\\]^{|}~-_'),
|
|
| 32 |
- ('all', b''), # Placeholder.
|
|
| 33 |
-]) |
|
| 34 |
-_CHARSETS['alpha'] = _CHARSETS['lower'] + _CHARSETS['upper'] |
|
| 35 |
-_CHARSETS['alphanum'] = _CHARSETS['alpha'] + _CHARSETS['number'] |
|
| 36 |
-_CHARSETS['all'] = ( |
|
| 37 |
- _CHARSETS['alphanum'] + _CHARSETS['space'] + _CHARSETS['symbol'] |
|
| 38 |
-) |
|
| 39 |
- |
|
| 40 |
- |
|
| 41 | 24 |
class Vault: |
| 42 | 25 |
"""A work-alike of James Coglan's vault. |
| 43 | 26 |
|
| ... | ... |
@@ -63,7 +46,51 @@ class Vault: |
| 63 | 46 |
|
| 64 | 47 |
_UUID = b'e87eb0f4-34cb-46b9-93ad-766c5ab063e7' |
| 65 | 48 |
"""A tag used by vault in the bit stream generation.""" |
| 66 |
- _CHARSETS = _CHARSETS |
|
| 49 |
+ _CHARSETS = types.MappingProxyType( |
|
| 50 |
+ collections.OrderedDict([ |
|
| 51 |
+ ('lower', b'abcdefghijklmnopqrstuvwxyz'),
|
|
| 52 |
+ ('upper', b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
|
|
| 53 |
+ ( |
|
| 54 |
+ 'alpha', |
|
| 55 |
+ ( |
|
| 56 |
+ # _CHARSETS['lower'] |
|
| 57 |
+ b'abcdefghijklmnopqrstuvwxyz' |
|
| 58 |
+ # _CHARSETS['upper'] |
|
| 59 |
+ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|
| 60 |
+ ), |
|
| 61 |
+ ), |
|
| 62 |
+ ('number', b'0123456789'),
|
|
| 63 |
+ ( |
|
| 64 |
+ 'alphanum', |
|
| 65 |
+ ( |
|
| 66 |
+ # _CHARSETS['lower'] |
|
| 67 |
+ b'abcdefghijklmnopqrstuvwxyz' |
|
| 68 |
+ # _CHARSETS['upper'] |
|
| 69 |
+ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|
| 70 |
+ # _CHARSETS['number'] |
|
| 71 |
+ b'0123456789' |
|
| 72 |
+ ), |
|
| 73 |
+ ), |
|
| 74 |
+ ('space', b' '),
|
|
| 75 |
+ ('dash', b'-_'),
|
|
| 76 |
+ ('symbol', b'!"#$%&\'()*+,./:;<=>?@[\\]^{|}~-_'),
|
|
| 77 |
+ ( |
|
| 78 |
+ 'all', |
|
| 79 |
+ ( |
|
| 80 |
+ # _CHARSETS['lower'] |
|
| 81 |
+ b'abcdefghijklmnopqrstuvwxyz' |
|
| 82 |
+ # _CHARSETS['upper'] |
|
| 83 |
+ b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|
| 84 |
+ # _CHARSETS['number'] |
|
| 85 |
+ b'0123456789' |
|
| 86 |
+ # _CHARSETS['space'] |
|
| 87 |
+ b' ' |
|
| 88 |
+ # _CHARSETS['symbol'] |
|
| 89 |
+ b'!"#$%&\'()*+,./:;<=>?@[\\]^{|}~-_'
|
|
| 90 |
+ ), |
|
| 91 |
+ ), |
|
| 92 |
+ ]) |
|
| 93 |
+ ) |
|
| 67 | 94 |
""" |
| 68 | 95 |
Known character sets from which to draw passphrase characters. |
| 69 | 96 |
Relies on a certain, fixed order for their definition and their |
| 70 | 97 |