Marco Ricci commited on 2024-10-14 22:31:40
Zeige 2 geänderte Dateien mit 51 Einfügungen und 33 Löschungen.
Excluding extensions due to `derivepassphrase`, in vault(1), the service settings are a superset of the global settings… though some settings might be weird in a global setting. The abstract data types don't accurately model this, though. So fix those. (The sole current `derivepassphrase` extension, the `unicode_normalization_form` setting, modifies the `phrase` setting, and so also makes sense to specify globally or locally. So use the same inheritance and scoping rules as `phrase`.) Incidentally, the command-line interface did not respect this inheritance either… in a more destructive way, asserting that some options require a service when they don't, or don't take a service when they do. Redo the categorization there into three groups instead of two: service name mandatory, forbidden, or optional (new).
... | ... |
@@ -50,26 +50,6 @@ class VaultConfigGlobalSettings(TypedDict, total=False): |
50 | 50 |
The preferred Unicode normalization form; we warn the user |
51 | 51 |
if textual passphrases do not match their normalized forms. |
52 | 52 |
Optional, and a `derivepassphrase` extension. |
53 |
- |
|
54 |
- """ |
|
55 |
- |
|
56 |
- key: NotRequired[str] |
|
57 |
- """""" |
|
58 |
- phrase: NotRequired[str] |
|
59 |
- """""" |
|
60 |
- unicode_normalization_form: NotRequired[ |
|
61 |
- Literal['NFC', 'NFD', 'NFKC', 'NFKD'] |
|
62 |
- ] |
|
63 |
- """""" |
|
64 |
- |
|
65 |
- |
|
66 |
-class VaultConfigServicesSettings(VaultConfigGlobalSettings, total=False): |
|
67 |
- r"""Configuration for vault: services settings. |
|
68 |
- |
|
69 |
- Attributes: |
|
70 |
- notes: |
|
71 |
- Optional notes for this service, to display to the user when |
|
72 |
- generating the passphrase. |
|
73 | 53 |
length: |
74 | 54 |
Desired passphrase length. |
75 | 55 |
repeat: |
... | ... |
@@ -95,7 +75,13 @@ class VaultConfigServicesSettings(VaultConfigGlobalSettings, total=False): |
95 | 75 |
|
96 | 76 |
""" |
97 | 77 |
|
98 |
- notes: NotRequired[str] |
|
78 |
+ key: NotRequired[str] |
|
79 |
+ """""" |
|
80 |
+ phrase: NotRequired[str] |
|
81 |
+ """""" |
|
82 |
+ unicode_normalization_form: NotRequired[ |
|
83 |
+ Literal['NFC', 'NFD', 'NFKC', 'NFKD'] |
|
84 |
+ ] |
|
99 | 85 |
"""""" |
100 | 86 |
length: NotRequired[int] |
101 | 87 |
"""""" |
... | ... |
@@ -115,6 +101,42 @@ class VaultConfigServicesSettings(VaultConfigGlobalSettings, total=False): |
115 | 101 |
"""""" |
116 | 102 |
|
117 | 103 |
|
104 |
+class VaultConfigServicesSettings(VaultConfigGlobalSettings, total=False): |
|
105 |
+ r"""Configuration for vault: services settings. |
|
106 |
+ |
|
107 |
+ Attributes: |
|
108 |
+ notes: |
|
109 |
+ Optional notes for this service, to display to the user when |
|
110 |
+ generating the passphrase. |
|
111 |
+ key: |
|
112 |
+ As per the global settings. |
|
113 |
+ phrase: |
|
114 |
+ As per the global settings. |
|
115 |
+ unicode_normalization_form: |
|
116 |
+ As per the global settings. |
|
117 |
+ length: |
|
118 |
+ As per the global settings. |
|
119 |
+ repeat: |
|
120 |
+ As per the global settings. |
|
121 |
+ lower: |
|
122 |
+ As per the global settings. |
|
123 |
+ upper: |
|
124 |
+ As per the global settings. |
|
125 |
+ number: |
|
126 |
+ As per the global settings. |
|
127 |
+ space: |
|
128 |
+ As per the global settings. |
|
129 |
+ dash: |
|
130 |
+ As per the global settings. |
|
131 |
+ symbol: |
|
132 |
+ As per the global settings. |
|
133 |
+ |
|
134 |
+ """ |
|
135 |
+ |
|
136 |
+ notes: NotRequired[str] |
|
137 |
+ """""" |
|
138 |
+ |
|
139 |
+ |
|
118 | 140 |
_VaultConfig = TypedDict( |
119 | 141 |
'_VaultConfig', |
120 | 142 |
{'global': NotRequired[VaultConfigGlobalSettings]}, |
... | ... |
@@ -1333,23 +1333,19 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
1333 | 1333 |
*options_in_group[ConfigurationOption], |
1334 | 1334 |
*options_in_group[StorageManagementOption], |
1335 | 1335 |
) |
1336 |
- sv_options = options_in_group[PasswordGenerationOption] + [ |
|
1337 |
- params_by_str['--notes'], |
|
1338 |
- params_by_str['--delete'], |
|
1339 |
- ] |
|
1340 |
- sv_options.remove(params_by_str['--key']) |
|
1341 |
- sv_options.remove(params_by_str['--phrase']) |
|
1342 |
- for param in sv_options: |
|
1343 |
- if is_param_set(param) and not service: |
|
1344 |
- opt_str = param.opts[0] |
|
1345 |
- msg = f'{opt_str} requires a SERVICE' |
|
1346 |
- raise click.UsageError(msg) # noqa: DOC501 |
|
1347 |
- for param in [params_by_str['--key'], params_by_str['--phrase']]: |
|
1336 |
+ sv_or_global_options = options_in_group[PasswordGenerationOption] |
|
1337 |
+ for param in sv_or_global_options: |
|
1348 | 1338 |
if is_param_set(param) and not ( |
1349 | 1339 |
service or is_param_set(params_by_str['--config']) |
1350 | 1340 |
): |
1351 | 1341 |
opt_str = param.opts[0] |
1352 | 1342 |
msg = f'{opt_str} requires a SERVICE or --config' |
1343 |
+ raise click.UsageError(msg) # noqa: DOC501 |
|
1344 |
+ sv_options = [params_by_str['--notes'], params_by_str['--delete']] |
|
1345 |
+ for param in sv_options: |
|
1346 |
+ if is_param_set(param) and not service: |
|
1347 |
+ opt_str = param.opts[0] |
|
1348 |
+ msg = f'{opt_str} requires a SERVICE' |
|
1353 | 1349 |
raise click.UsageError(msg) |
1354 | 1350 |
no_sv_options = [ |
1355 | 1351 |
params_by_str['--delete-globals'], |
1356 | 1352 |