f02b81ad6df6d92cdcbb3469a7010f5f340afe99
Marco Ricci Change the author e-mail ad...

Marco Ricci authored 4 months ago

1) # SPDX-FileCopyrightText: 2024 Marco Ricci <software@the13thletter.info>
Marco Ricci Import initial project files

Marco Ricci authored 8 months ago

2) #
3) # SPDX-License-Identifier: MIT
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

4) 
5) from __future__ import annotations
6) 
7) import base64
8) import contextlib
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

9) import copy
Marco Ricci Add test fixture for manual...

Marco Ricci authored 3 months ago

10) import enum
Marco Ricci Test exporter data loading...

Marco Ricci authored 4 months ago

11) import importlib.util
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

12) import json
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

13) import logging
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

14) import os
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

15) import re
Marco Ricci Add test fixture for manual...

Marco Ricci authored 3 months ago

16) import shlex
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 4 months ago

17) import stat
Marco Ricci Centralize settings for hyp...

Marco Ricci authored 3 months ago

18) import sys
Marco Ricci Add preliminary tests for t...

Marco Ricci authored 4 months ago

19) import tempfile
20) import zipfile
Marco Ricci Support Python 3.10 and PyP...

Marco Ricci authored 5 months ago

21) from typing import TYPE_CHECKING
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

22) 
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

23) import hypothesis
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

24) import pytest
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

25) from hypothesis import strategies
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

26) from typing_extensions import NamedTuple, Self, assert_never
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

27) 
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

28) from derivepassphrase import _types, cli, ssh_agent, vault
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

29) 
30) __all__ = ()
31) 
32) if TYPE_CHECKING:
Marco Ricci Fix user interface errors i...

Marco Ricci authored 3 weeks ago

33)     import socket
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

34)     from collections.abc import Callable, Iterator, Mapping, Sequence
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

35) 
36)     import click.testing
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

37)     from typing_extensions import Any, NotRequired, TypedDict
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

38) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

39)     class SSHTestKey(TypedDict):
40)         private_key: bytes
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

41)         private_key_blob: NotRequired[bytes]
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

42)         public_key: bytes | str
43)         public_key_data: bytes
44)         expected_signature: bytes | None
45)         derived_passphrase: bytes | str | None
46) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

47) 
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

48) class ValidationSettings(NamedTuple):
49)     allow_unknown_settings: bool
50)     allow_derivepassphrase_extensions: bool
51) 
52) 
53) class VaultTestConfig(NamedTuple):
54)     config: Any
55)     comment: str
56)     validation_settings: ValidationSettings | None
57) 
58) 
59) TEST_CONFIGS: list[VaultTestConfig] = [
60)     VaultTestConfig(None, 'not a dict', None),
61)     VaultTestConfig({}, 'missing required keys', None),
62)     VaultTestConfig(
63)         {'global': None, 'services': {}}, 'bad config value: global', None
64)     ),
65)     VaultTestConfig(
66)         {'global': {'key': 123}, 'services': {}},
67)         'bad config value: global.key',
68)         None,
69)     ),
70)     VaultTestConfig(
71)         {'global': {'phrase': 'abc', 'key': '...'}, 'services': {}},
72)         '',
73)         None,
74)     ),
75)     VaultTestConfig({'services': None}, 'bad config value: services', None),
76)     VaultTestConfig(
77)         {'services': {'1': {}, 2: {}}}, 'bad config value: services."2"', None
78)     ),
79)     VaultTestConfig(
80)         {'services': {'1': {}, '2': 2}}, 'bad config value: services."2"', None
81)     ),
82)     VaultTestConfig(
83)         {'services': {'sv': {'notes': ['sentinel', 'list']}}},
84)         'bad config value: services.sv.notes',
85)         None,
86)     ),
87)     VaultTestConfig(
88)         {'services': {'sv': {'notes': 'blah blah blah'}}}, '', None
89)     ),
90)     VaultTestConfig(
91)         {'services': {'sv': {'length': '200'}}},
92)         'bad config value: services.sv.length',
93)         None,
94)     ),
95)     VaultTestConfig(
96)         {'services': {'sv': {'length': 0.5}}},
97)         'bad config value: services.sv.length',
98)         None,
99)     ),
100)     VaultTestConfig(
101)         {'services': {'sv': {'length': ['sentinel', 'list']}}},
102)         'bad config value: services.sv.length',
103)         None,
104)     ),
105)     VaultTestConfig(
106)         {'services': {'sv': {'length': -10}}},
107)         'bad config value: services.sv.length',
108)         None,
109)     ),
110)     VaultTestConfig(
111)         {'services': {'sv': {'lower': '10'}}},
112)         'bad config value: services.sv.lower',
113)         None,
114)     ),
115)     VaultTestConfig(
116)         {'services': {'sv': {'upper': -10}}},
117)         'bad config value: services.sv.upper',
118)         None,
119)     ),
120)     VaultTestConfig(
121)         {'services': {'sv': {'number': ['sentinel', 'list']}}},
122)         'bad config value: services.sv.number',
123)         None,
124)     ),
125)     VaultTestConfig(
126)         {
127)             'global': {'phrase': 'my secret phrase'},
128)             'services': {'sv': {'length': 10}},
129)         },
130)         '',
131)         None,
132)     ),
133)     VaultTestConfig(
134)         {'services': {'sv': {'length': 10, 'phrase': '...'}}}, '', None
135)     ),
136)     VaultTestConfig(
137)         {'services': {'sv': {'length': 10, 'key': '...'}}}, '', None
138)     ),
139)     VaultTestConfig(
140)         {'services': {'sv': {'upper': 10, 'key': '...'}}}, '', None
141)     ),
142)     VaultTestConfig(
143)         {'services': {'sv': {'phrase': 'abc', 'key': '...'}}}, '', None
144)     ),
145)     VaultTestConfig(
146)         {
147)             'global': {'phrase': 'abc'},
148)             'services': {'sv': {'phrase': 'abc', 'length': 10}},
149)         },
150)         '',
151)         None,
152)     ),
153)     VaultTestConfig(
154)         {
155)             'global': {'key': '...'},
156)             'services': {'sv': {'phrase': 'abc', 'length': 10}},
157)         },
158)         '',
159)         None,
160)     ),
Marco Ricci Fix missing consideration o...

Marco Ricci authored 2 months ago

161)     VaultTestConfig(
162)         {
163)             'global': {'key': '...'},
164)             'services': {'sv': {'phrase': 'abc', 'key': '...', 'length': 10}},
165)         },
166)         '',
167)         None,
168)     ),
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

169)     VaultTestConfig(
170)         {
171)             'global': {'key': '...'},
172)             'services': {
173)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
174)                 'sv2': {'length': 10, 'repeat': 1, 'lower': 1},
175)             },
176)         },
177)         '',
178)         None,
179)     ),
180)     VaultTestConfig(
181)         {
182)             'global': {'key': '...', 'unicode_normalization_form': 'NFC'},
183)             'services': {
184)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
185)                 'sv2': {'length': 10, 'repeat': 1, 'lower': 1},
186)             },
187)         },
188)         '',
189)         None,
190)     ),
191)     VaultTestConfig(
192)         {
193)             'global': {'key': '...', 'unicode_normalization_form': True},
194)             'services': {},
195)         },
196)         'bad config value: global.unicode_normalization_form',
197)         None,
198)     ),
199)     VaultTestConfig(
200)         {
201)             'global': {'key': '...', 'unicode_normalization_form': 'NFC'},
202)             'services': {
203)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
204)                 'sv2': {'length': 10, 'repeat': 1, 'lower': 1},
205)             },
206)         },
207)         '',
208)         ValidationSettings(False, True),
209)     ),
210)     VaultTestConfig(
211)         {
212)             'global': {'key': '...', 'unicode_normalization_form': 'NFC'},
213)             'services': {
214)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
215)                 'sv2': {'length': 10, 'repeat': 1, 'lower': 1},
216)             },
217)         },
218)         'extension key: .global.unicode_normalization_form',
219)         ValidationSettings(False, False),
220)     ),
221)     VaultTestConfig(
222)         {
223)             'global': {'key': '...', 'unknown_key': True},
224)             'services': {
225)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
226)                 'sv2': {'length': 10, 'repeat': 1, 'lower': 1},
227)             },
228)         },
229)         '',
230)         ValidationSettings(True, False),
231)     ),
232)     VaultTestConfig(
233)         {
234)             'global': {'key': '...', 'unknown_key': True},
235)             'services': {
236)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
237)                 'sv2': {'length': 10, 'repeat': 1, 'lower': 1},
238)             },
239)         },
240)         'unknown key: .global.unknown_key',
241)         ValidationSettings(False, False),
242)     ),
243)     VaultTestConfig(
244)         {
245)             'global': {'key': '...'},
246)             'services': {
247)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
248)                 'sv2': {
249)                     'length': 10,
250)                     'repeat': 1,
251)                     'lower': 1,
252)                     'unknown_key': True,
253)                 },
254)             },
255)         },
256)         'unknown_key: .services.sv2.unknown_key',
257)         ValidationSettings(False, False),
258)     ),
259)     VaultTestConfig(
260)         {
261)             'global': {'key': '...', 'unicode_normalization_form': 'NFC'},
262)             'services': {
263)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
264)                 'sv2': {
265)                     'length': 10,
266)                     'repeat': 1,
267)                     'lower': 1,
268)                     'unknown_key': True,
269)                 },
270)             },
271)         },
272)         '',
273)         ValidationSettings(True, True),
274)     ),
275)     VaultTestConfig(
276)         {
277)             'global': {'key': '...', 'unicode_normalization_form': 'NFC'},
278)             'services': {
279)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
280)                 'sv2': {
281)                     'length': 10,
282)                     'repeat': 1,
283)                     'lower': 1,
284)                     'unknown_key': True,
285)                 },
286)             },
287)         },
288)         (
289)             'extension key (permitted): .global.unicode_normalization_form; '
290)             'unknown key: .services.sv2.unknown_key'
291)         ),
292)         ValidationSettings(False, True),
293)     ),
294)     VaultTestConfig(
295)         {
296)             'global': {'key': '...', 'unicode_normalization_form': 'NFC'},
297)             'services': {
298)                 'sv1': {'phrase': 'abc', 'length': 10, 'upper': 1},
299)                 'sv2': {
300)                     'length': 10,
301)                     'repeat': 1,
302)                     'lower': 1,
303)                     'unknown_key': True,
304)                 },
305)             },
306)         },
307)         (
308)             'unknown key (permitted): .services.sv2.unknown_key; '
309)             'extension key: .global.unicode_normalization_form'
310)         ),
311)         ValidationSettings(True, False),
312)     ),
313) ]
314) 
315) 
316) def is_valid_test_config(conf: VaultTestConfig, /) -> bool:
317)     """Return true if the test config is valid.
318) 
319)     Args:
320)         conf: The test config to check.
321) 
322)     """
323)     return not conf.comment and conf.validation_settings in {
324)         None,
325)         (True, True),
326)     }
327) 
328) 
329) def _test_config_ids(val: VaultTestConfig) -> Any:  # pragma: no cover
330)     """pytest id function for VaultTestConfig objects."""
331)     assert isinstance(val, VaultTestConfig)
332)     return val[1] or (val[0], val[1], val[2])
333) 
334) 
Marco Ricci Move vault service config g...

Marco Ricci authored 2 months ago

335) @strategies.composite
336) def vault_full_service_config(draw: strategies.DrawFn) -> dict[str, int]:
Marco Ricci Overhaul the state machine...

Marco Ricci authored 4 weeks ago

337)     repeat = draw(strategies.integers(min_value=0, max_value=10))
Marco Ricci Move vault service config g...

Marco Ricci authored 2 months ago

338)     lower = draw(strategies.integers(min_value=0, max_value=10))
339)     upper = draw(strategies.integers(min_value=0, max_value=10))
340)     number = draw(strategies.integers(min_value=0, max_value=10))
Marco Ricci Overhaul the state machine...

Marco Ricci authored 4 weeks ago

341)     space = draw(strategies.integers(min_value=0, max_value=repeat))
Marco Ricci Move vault service config g...

Marco Ricci authored 2 months ago

342)     dash = draw(strategies.integers(min_value=0, max_value=10))
343)     symbol = draw(strategies.integers(min_value=0, max_value=10))
344)     length = draw(
345)         strategies.integers(
346)             min_value=max(1, lower + upper + number + space + dash + symbol),
347)             max_value=70,
348)         )
349)     )
350)     hypothesis.assume(lower + upper + number + dash + symbol > 0)
351)     hypothesis.assume(lower + upper + number + space + symbol > 0)
352)     hypothesis.assume(repeat >= space)
353)     return {
354)         'lower': lower,
355)         'upper': upper,
356)         'number': number,
357)         'space': space,
358)         'dash': dash,
359)         'symbol': symbol,
360)         'repeat': repeat,
361)         'length': length,
362)     }
363) 
364) 
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

365) def is_smudgable_vault_test_config(conf: VaultTestConfig) -> bool:
366)     """Check whether this vault test config can be effectively smudged.
367) 
368)     A "smudged" test config is one where falsy values (in the JavaScript
369)     sense) can be replaced by other falsy values without changing the
370)     meaning of the config.
371) 
372)     Args:
373)         conf: A test config to check.
374) 
375)     Returns:
376)         True if the test config can be smudged, False otherwise.
377) 
378)     """
379)     config = conf.config
380)     return bool(
381)         isinstance(config, dict)
382)         and ('global' not in config or isinstance(config['global'], dict))
383)         and ('services' in config and isinstance(config['services'], dict))
384)         and all(isinstance(x, dict) for x in config['services'].values())
385)         and (config['services'] or config.get('global'))
386)     )
387) 
388) 
389) @strategies.composite
390) def smudged_vault_test_config(
391)     draw: strategies.DrawFn,
392)     config: Any = strategies.sampled_from(TEST_CONFIGS).filter(  # noqa: B008
393)         is_smudgable_vault_test_config
394)     ),
395) ) -> Any:
396)     """Hypothesis strategy to replace falsy values with other falsy values.
397) 
398)     Uses [`_types.js_truthiness`][] internally, which is tested
399)     separately by
400)     [`tests.test_derivepassphrase_types.test_100_js_truthiness`][].
401) 
402)     Args:
403)         draw:
404)             The hypothesis draw function.
405)         config:
406)             A strategy which generates [`VaultTestConfig`][] objects.
407) 
408)     Returns:
409)         A new [`VaultTestConfig`][] where some falsy values have been
410)         replaced or added.
411) 
412)     """
413) 
414)     falsy = (None, False, 0, 0.0, '', float('nan'))
415)     falsy_no_str = (None, False, 0, 0.0, float('nan'))
416)     falsy_no_zero = (None, False, '', float('nan'))
417)     conf = draw(config)
418)     hypothesis.assume(is_smudgable_vault_test_config(conf))
419)     obj = copy.deepcopy(conf.config)
420)     services: list[dict[str, Any]] = list(obj['services'].values())
421)     if 'global' in obj:
422)         services.append(obj['global'])
423)     assert all(isinstance(x, dict) for x in services), (
424)         'is_smudgable_vault_test_config guard failed to '
425)         'ensure each setings dict is a dict'
426)     )
427)     for service in services:
428)         for key in ('phrase',):
429)             value = service.get(key)
430)             if not _types.js_truthiness(value) and value != '':
431)                 service[key] = draw(strategies.sampled_from(falsy_no_str))
432)         for key in (
433)             'notes',
434)             'key',
435)             'length',
436)             'repeat',
437)         ):
438)             value = service.get(key)
439)             if not _types.js_truthiness(value):
440)                 service[key] = draw(strategies.sampled_from(falsy))
441)         for key in (
442)             'lower',
443)             'upper',
444)             'number',
445)             'space',
446)             'dash',
447)             'symbol',
448)         ):
449)             value = service.get(key)
450)             if not _types.js_truthiness(value) and value != 0:
451)                 service[key] = draw(strategies.sampled_from(falsy_no_zero))
452)     hypothesis.assume(obj != conf.config)
453)     return VaultTestConfig(obj, conf.comment, conf.validation_settings)
454) 
455) 
Marco Ricci Add test fixture for manual...

Marco Ricci authored 3 months ago

456) class KnownSSHAgent(str, enum.Enum):
457)     UNKNOWN: str = '(unknown)'
458)     Pageant: str = 'Pageant'
459)     OpenSSHAgent: str = 'OpenSSHAgent'
460) 
461) 
462) class SpawnedSSHAgentInfo(NamedTuple):
463)     agent_type: KnownSSHAgent
464)     client: ssh_agent.SSHAgentClient
465)     isolated: bool
466) 
467) 
Marco Ricci Let the `running_ssh_agent`...

Marco Ricci authored 1 month ago

468) class RunningSSHAgentInfo(NamedTuple):
469)     socket: str
470)     agent_type: KnownSSHAgent
471) 
472) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

473) SUPPORTED_KEYS: Mapping[str, SSHTestKey] = {
474)     'ed25519': {
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

475)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

476) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
477) QyNTUxOQAAACCBeIFoJtYCSF8P/zJIb+TBMIncHGpFBgnpCQ/7whJpdgAAAKDweO7H8Hju
478) xwAAAAtzc2gtZWQyNTUxOQAAACCBeIFoJtYCSF8P/zJIb+TBMIncHGpFBgnpCQ/7whJpdg
479) AAAEAbM/A869nkWZbe2tp3Dm/L6gitvmpH/aRZt8sBII3ExYF4gWgm1gJIXw//Mkhv5MEw
480) idwcakUGCekJD/vCEml2AAAAG3Rlc3Qga2V5IHdpdGhvdXQgcGFzc3BocmFzZQEC
481) -----END OPENSSH PRIVATE KEY-----
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

482) """,
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

483)         'private_key_blob': bytes.fromhex("""
484)             00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39
485)             00 00 00 20
486)             81 78 81 68 26 d6 02 48 5f 0f ff 32 48 6f e4 c1
487)             30 89 dc 1c 6a 45 06 09 e9 09 0f fb c2 12 69 76
488)             00 00 00 40
489)             1b 33 f0 3c eb d9 e4 59 96 de da da 77 0e 6f cb
490)             ea 08 ad be 6a 47 fd a4 59 b7 cb 01 20 8d c4 c5
491)             81 78 81 68 26 d6 02 48 5f 0f ff 32 48 6f e4 c1
492)             30 89 dc 1c 6a 45 06 09 e9 09 0f fb c2 12 69 76
493)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69 74
494)             68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
495) """),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

496)         'public_key': rb"""ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIF4gWgm1gJIXw//Mkhv5MEwidwcakUGCekJD/vCEml2 test key without passphrase
497) """,  # noqa: E501
498)         'public_key_data': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

499)             00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39
500)             00 00 00 20
501)             81 78 81 68 26 d6 02 48 5f 0f ff 32 48 6f e4 c1
502)             30 89 dc 1c 6a 45 06 09 e9 09 0f fb c2 12 69 76
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

503) """),
504)         'expected_signature': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

505)             00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39
506)             00 00 00 40
507)             f0 98 19 80 6c 1a 97 d5 26 03 6e cc e3 65 8f 86
508)             66 07 13 19 13 09 21 33 33 f9 e4 36 53 1d af fd
509)             0d 08 1f ec f8 73 9b 8c 5f 55 39 16 7c 53 54 2c
510)             1e 52 bb 30 ed 7f 89 e2 2f 69 51 55 d8 9e a6 02
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

511)         """),
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

512)         'derived_passphrase': rb'8JgZgGwal9UmA27M42WPhmYHExkTCSEzM/nkNlMdr/0NCB/s+HObjF9VORZ8U1QsHlK7MO1/ieIvaVFV2J6mAg==',  # noqa: E501
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

513)     },
514)     # Currently only supported by PuTTY (which is deficient in other
515)     # niceties of the SSH agent and the agent's client).
516)     'ed448': {
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

517)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

518) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAASgAAAAlz
519) c2gtZWQ0NDgAAAA54vZy009Wu8wExjvEb3hqtLz1GO/+d5vmGUbErWQ4AUO9mYLT
520) zHJHc2m4s+yWzP29Cc3EcxizLG8AAAAA8BdhfCcXYXwnAAAACXNzaC1lZDQ0OAAA
521) ADni9nLTT1a7zATGO8RveGq0vPUY7/53m+YZRsStZDgBQ72ZgtPMckdzabiz7JbM
522) /b0JzcRzGLMsbwAAAAByM7GIMRvWJB3YD6SIpAF2uudX4ozZe0X917wPwiBrs373
523) 9TM1n94Nib6hrxGNmCk2iBQDe2KALPgA4vZy009Wu8wExjvEb3hqtLz1GO/+d5vm
524) GUbErWQ4AUO9mYLTzHJHc2m4s+yWzP29Cc3EcxizLG8AAAAAG3Rlc3Qga2V5IHdp
525) dGhvdXQgcGFzc3BocmFzZQECAwQFBgcICQ==
526) -----END OPENSSH PRIVATE KEY-----
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

527) """,
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

528)         'private_key_blob': bytes.fromhex("""
529)             00 00 00 09 73 73 68 2d 65 64 34 34 38
530)             00 00 00 39 e2 f6 72 d3 4f 56 bb cc 04
531)             c6 3b c4 6f 78 6a b4 bc f5 18 ef fe 77 9b e6 19
532)             46 c4 ad 64 38 01 43 bd 99 82 d3 cc 72 47 73 69
533)             b8 b3 ec 96 cc fd bd 09 cd c4 73 18 b3 2c 6f 00
534)             00 00 00 72 33 b1
535)             88 31 1b d6 24 1d d8 0f a4 88 a4 01 76 ba e7 57
536)             e2 8c d9 7b 45 fd d7 bc 0f c2 20 6b b3 7e f7 f5
537)             33 35 9f de 0d 89 be a1 af 11 8d 98 29 36 88 14
538)             03 7b 62 80 2c f8 00 e2 f6 72 d3 4f 56 bb cc 04
539)             c6 3b c4 6f 78 6a b4 bc f5 18 ef fe 77 9b e6 19
540)             46 c4 ad 64 38 01 43 bd 99 82 d3 cc 72 47 73 69
541)             b8 b3 ec 96 cc fd bd 09 cd c4 73 18 b3 2c 6f 00
542)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69
543)             74 68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
544) """),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

545)         'public_key': rb"""ssh-ed448 AAAACXNzaC1lZDQ0OAAAADni9nLTT1a7zATGO8RveGq0vPUY7/53m+YZRsStZDgBQ72ZgtPMckdzabiz7JbM/b0JzcRzGLMsbwA= test key without passphrase
546) """,  # noqa: E501
547)         'public_key_data': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

548)             00 00 00 09 73 73 68 2d 65 64 34 34 38
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

549)             00 00 00 39 e2 f6 72 d3 4f 56 bb cc 04
550)             c6 3b c4 6f 78 6a b4 bc f5 18 ef fe 77 9b e6 19
551)             46 c4 ad 64 38 01 43 bd 99 82 d3 cc 72 47 73 69
552)             b8 b3 ec 96 cc fd bd 09 cd c4 73 18 b3 2c 6f 00
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

553)         """),
554)         'expected_signature': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

555)             00 00 00 09 73 73 68 2d 65 64 34 34 38
556)             00 00 00 72 06 86
557)             f4 64 a4 a6 ba d9 c3 22 c4 93 49 99 fc 11 de 67
558)             97 08 f2 d8 b7 3c 2c 13 e7 c5 1c 1e 92 a6 0e d8
559)             2f 6d 81 03 82 00 e3 72 e4 32 6d 72 d2 6d 32 84
560)             3f cc a9 1e 57 2c 00 9a b3 99 de 45 da ce 2e d1
561)             db e5 89 f3 35 be 24 58 90 c6 ca 04 f0 db 88 80
562)             db bd 77 7c 80 20 7f 3a 48 61 f6 1f ae a9 5e 53
563)             7b e0 9d 93 1e ea dc eb b5 cd 56 4c ea 8f 08 00
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

564)         """),
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

565)         'derived_passphrase': rb'Bob0ZKSmutnDIsSTSZn8Ed5nlwjy2Lc8LBPnxRwekqYO2C9tgQOCAONy5DJtctJtMoQ/zKkeVywAmrOZ3kXazi7R2+WJ8zW+JFiQxsoE8NuIgNu9d3yAIH86SGH2H66pXlN74J2THurc67XNVkzqjwgA',  # noqa: E501
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

566)     },
567)     'rsa': {
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

568)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

569) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
570) NhAAAAAwEAAQAAAYEAsaHu6Xs4cVsuDSNJlMCqoPVgmDgEviI8TfXmHKqX3JkIqI3LsvV7
571) Ijf8WCdTveEq7CkuZhImtsR52AOEVAoU8mDXDNr+nJ5wUPzf1UIaRjDe0lcXW4SlF01hQs
572) G4wYDuqxshwelraB/L3e0zhD7fjYHF8IbFsqGlFHWEwOtlfhhfbxJsTGguLm4A8/gdEJD5
573) 2rkqDcZpIXCHtJbCzW9aQpWcs/PDw5ylwl/3dB7jfxyfrGz4O3QrzsqhWEsip97mOmwl6q
574) CHbq8V8x9zu89D/H+bG5ijqxhijbjcVUW3lZfw/97gy9J6rG31HNar5H8GycLTFwuCFepD
575) mTEpNgQLKoe8ePIEPq4WHhFUovBdwlrOByUKKqxreyvWt5gkpTARz+9Lt8OjBO3rpqK8sZ
576) VKH3sE3de2RJM3V9PJdmZSs2b8EFK3PsUGdlMPM9pn1uk4uIItKWBmooOynuD8Ll6aPwuW
577) AFn3l8nLLyWdrmmEYzHWXiRjQJxy1Bi5AbHMOWiPAAAFkDPkuBkz5LgZAAAAB3NzaC1yc2
578) EAAAGBALGh7ul7OHFbLg0jSZTAqqD1YJg4BL4iPE315hyql9yZCKiNy7L1eyI3/FgnU73h
579) KuwpLmYSJrbEedgDhFQKFPJg1wza/pyecFD839VCGkYw3tJXF1uEpRdNYULBuMGA7qsbIc
580) Hpa2gfy93tM4Q+342BxfCGxbKhpRR1hMDrZX4YX28SbExoLi5uAPP4HRCQ+dq5Kg3GaSFw
581) h7SWws1vWkKVnLPzw8OcpcJf93Qe438cn6xs+Dt0K87KoVhLIqfe5jpsJeqgh26vFfMfc7
582) vPQ/x/mxuYo6sYYo243FVFt5WX8P/e4MvSeqxt9RzWq+R/BsnC0xcLghXqQ5kxKTYECyqH
583) vHjyBD6uFh4RVKLwXcJazgclCiqsa3sr1reYJKUwEc/vS7fDowTt66aivLGVSh97BN3Xtk
584) STN1fTyXZmUrNm/BBStz7FBnZTDzPaZ9bpOLiCLSlgZqKDsp7g/C5emj8LlgBZ95fJyy8l
585) na5phGMx1l4kY0CcctQYuQGxzDlojwAAAAMBAAEAAAF/cNVYT+Om4x9+SItcz5bOByGIOj
586) yWUH8f9rRjnr5ILuwabIDgvFaVG+xM1O1hWADqzMnSEcknHRkTYEsqYPykAtxFvjOFEh70
587) 6qRUJ+fVZkqRGEaI3oWyWKTOhcCIYImtONvb0LOv/HQ2H2AXCoeqjST1qr/xSuljBtcB8u
588) wxs3EqaO1yU7QoZpDcMX9plH7Rmc9nNfZcgrnktPk2deX2+Y/A5tzdVgG1IeqYp6CBMLNM
589) uhL0OPdDehgBoDujx+rhkZ1gpo1wcULIM94NL7VSHBPX0Lgh9T+3j1HVP+YnMAvhfOvfct
590) LlbJ06+TYGRAMuF2LPCAZM/m0FEyAurRgWxAjLXm+4kp2GAJXlw82deDkQ+P8cHNT6s9ZH
591) R5YSy3lpZ35594ZMOLR8KqVvhgJGF6i9019BiF91SDxjE+sp6dNGfN8W+64tHdDv2a0Mso
592) +8Qjyx7sTpi++EjLU8Iy73/e4B8qbXMyheyA/UUfgMtNKShh6sLlrD9h2Sm9RFTuEAAADA
593) Jh3u7WfnjhhKZYbAW4TsPNXDMrB0/t7xyAQgFmko7JfESyrJSLg1cO+QMOiDgD7zuQ9RSp
594) NIKdPsnIna5peh979mVjb2HgnikjyJECmBpLdwZKhX7MnIvgKw5lnQXHboEtWCa1N58l7f
595) srzwbi9pFUuUp9dShXNffmlUCjDRsVLbK5C6+iaIQyCWFYK8mc6dpNkIoPKf+Xg+EJCIFQ
596) oITqeu30Gc1+M+fdZc2ghq0b6XLthh/uHEry8b68M5KglMAAAAwQDw1i+IdcvPV/3u/q9O
597) /kzLpKO3tbT89sc1zhjZsDNjDAGluNr6n38iq/XYRZu7UTL9BG+EgFVfIUV7XsYT5e+BPf
598) 13VS94rzZ7maCsOlULX+VdMO2zBucHIoec9RUlRZrfB21B2W7YGMhbpoa5lN3lKJQ7afHo
599) dXZUMp0cTFbOmbzJgSzO2/NE7BhVwmvcUzTDJGMMKuxBO6w99YKDKRKm0PNLFDz26rWm9L
600) dNS2MVfVuPMTpzT26HQG4pFageq9cAAADBALzRBXdZF8kbSBa5MTUBVTTzgKQm1C772gJ8
601) T01DJEXZsVtOv7mUC1/m/by6Hk4tPyvDBuGj9hHq4N7dPqGutHb1q5n0ADuoQjRW7BXw5Q
602) vC2EAD91xexdorIA5BgXU+qltBqzzBVzVtF7+jOZOjfzOlaTX9I5I5veyeTaTxZj1XXUzi
603) btBNdMEJJp7ifucYmoYAAwE7K+VlWagDEK2y8Mte9y9E+N0uO2j+h85sQt/UIb2iE/vhcg
604) Bgp6142WnSCQAAABt0ZXN0IGtleSB3aXRob3V0IHBhc3NwaHJhc2UB
605) -----END OPENSSH PRIVATE KEY-----
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

606) """,
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

607)         'private_key_blob': bytes.fromhex("""
608)             00 00 00 07 73 73 68 2d 72 73 61
609)             00 00 01 81 00
610)             b1 a1 ee e9 7b 38 71 5b 2e 0d 23 49 94 c0 aa a0
611)             f5 60 98 38 04 be 22 3c 4d f5 e6 1c aa 97 dc 99
612)             08 a8 8d cb b2 f5 7b 22 37 fc 58 27 53 bd e1 2a
613)             ec 29 2e 66 12 26 b6 c4 79 d8 03 84 54 0a 14 f2
614)             60 d7 0c da fe 9c 9e 70 50 fc df d5 42 1a 46 30
615)             de d2 57 17 5b 84 a5 17 4d 61 42 c1 b8 c1 80 ee
616)             ab 1b 21 c1 e9 6b 68 1f cb dd ed 33 84 3e df 8d
617)             81 c5 f0 86 c5 b2 a1 a5 14 75 84 c0 eb 65 7e 18
618)             5f 6f 12 6c 4c 68 2e 2e 6e 00 f3 f8 1d 10 90 f9
619)             da b9 2a 0d c6 69 21 70 87 b4 96 c2 cd 6f 5a 42
620)             95 9c b3 f3 c3 c3 9c a5 c2 5f f7 74 1e e3 7f 1c
621)             9f ac 6c f8 3b 74 2b ce ca a1 58 4b 22 a7 de e6
622)             3a 6c 25 ea a0 87 6e af 15 f3 1f 73 bb cf 43 fc
623)             7f 9b 1b 98 a3 ab 18 62 8d b8 dc 55 45 b7 95 97
624)             f0 ff de e0 cb d2 7a ac 6d f5 1c d6 ab e4 7f 06
625)             c9 c2 d3 17 0b 82 15 ea 43 99 31 29 36 04 0b 2a
626)             87 bc 78 f2 04 3e ae 16 1e 11 54 a2 f0 5d c2 5a
627)             ce 07 25 0a 2a ac 6b 7b 2b d6 b7 98 24 a5 30 11
628)             cf ef 4b b7 c3 a3 04 ed eb a6 a2 bc b1 95 4a 1f
629)             7b 04 dd d7 b6 44 93 37 57 d3 c9 76 66 52 b3 66
630)             fc 10 52 b7 3e c5 06 76 53 0f 33 da 67 d6 e9 38
631)             b8 82 2d 29 60 66 a2 83 b2 9e e0 fc 2e 5e 9a 3f
632)             0b 96 00 59 f7 97 c9 cb 2f 25 9d ae 69 84 63 31
633)             d6 5e 24 63 40 9c 72 d4 18 b9 01 b1 cc 39 68 8f
634)             00 00 00 03 01 00 01
635)             00 00 01 7f
636)             70 d5 58 4f e3 a6 e3 1f 7e 48 8b 5c cf 96 ce
637)             07 21 88 3a 3c 96 50 7f 1f f6 b4 63 9e be 48 2e
638)             ec 1a 6c 80 e0 bc 56 95 1b ec 4c d4 ed 61 58 00
639)             ea cc c9 d2 11 c9 27 1d 19 13 60 4b 2a 60 fc a4
640)             02 dc 45 be 33 85 12 1e f4 ea a4 54 27 e7 d5 66
641)             4a 91 18 46 88 de 85 b2 58 a4 ce 85 c0 88 60 89
642)             ad 38 db db d0 b3 af fc 74 36 1f 60 17 0a 87 aa
643)             8d 24 f5 aa bf f1 4a e9 63 06 d7 01 f2 ec 31 b3
644)             71 2a 68 ed 72 53 b4 28 66 90 dc 31 7f 69 94 7e
645)             d1 99 cf 67 35 f6 5c 82 b9 e4 b4 f9 36 75 e5 f6
646)             f9 8f c0 e6 dc dd 56 01 b5 21 ea 98 a7 a0 81 30
647)             b3 4c ba 12 f4 38 f7 43 7a 18 01 a0 3b a3 c7 ea
648)             e1 91 9d 60 a6 8d 70 71 42 c8 33 de 0d 2f b5 52
649)             1c 13 d7 d0 b8 21 f5 3f b7 8f 51 d5 3f e6 27 30
650)             0b e1 7c eb df 72 d2 e5 6c 9d 3a f9 36 06 44 03
651)             2e 17 62 cf 08 06 4c fe 6d 05 13 20 2e ad 18 16
652)             c4 08 cb 5e 6f b8 92 9d 86 00 95 e5 c3 cd 9d 78
653)             39 10 f8 ff 1c 1c d4 fa b3 d6 47 47 96 12 cb 79
654)             69 67 7e 79 f7 86 4c 38 b4 7c 2a a5 6f 86 02 46
655)             17 a8 bd d3 5f 41 88 5f 75 48 3c 63 13 eb 29 e9
656)             d3 46 7c df 16 fb ae 2d 1d d0 ef d9 ad 0c b2 8f
657)             bc 42 3c b1 ee c4 e9 8b ef 84 8c b5 3c 23 2e f7
658)             fd ee 01 f2 a6 d7 33 28 5e c8 0f d4 51 f8 0c b4
659)             d2 92 86 1e ac 2e 5a c3 f6 1d 92 9b d4 45 4e e1
660)             00 00 00 c0
661)             26 1d ee ed 67 e7 8e 18 4a 65 86 c0 5b 84 ec 3c
662)             d5 c3 32 b0 74 fe de f1 c8 04 20 16 69 28 ec 97
663)             c4 4b 2a c9 48 b8 35 70 ef 90 30 e8 83 80 3e f3
664)             b9 0f 51 4a 93 48 29 d3 ec 9c 89 da e6 97 a1 f7
665)             bf 66 56 36 f6 1e 09 e2 92 3c 89 10 29 81 a4 b7
666)             70 64 a8 57 ec c9 c8 be 02 b0 e6 59 d0 5c 76 e8
667)             12 d5 82 6b 53 79 f2 5e df b2 bc f0 6e 2f 69 15
668)             4b 94 a7 d7 52 85 73 5f 7e 69 54 0a 30 d1 b1 52
669)             db 2b 90 ba fa 26 88 43 20 96 15 82 bc 99 ce 9d
670)             a4 d9 08 a0 f2 9f f9 78 3e 10 90 88 15 0a 08 4e
671)             a7 ae df 41 9c d7 e3 3e 7d d6 5c da 08 6a d1 be
672)             97 2e d8 61 fe e1 c4 af 2f 1b eb c3 39 2a 09 4c
673)             00 00 00 c1 00
674)             f0 d6 2f 88 75 cb cf 57 fd ee fe af 4e fe 4c cb
675)             a4 a3 b7 b5 b4 fc f6 c7 35 ce 18 d9 b0 33 63 0c
676)             01 a5 b8 da fa 9f 7f 22 ab f5 d8 45 9b bb 51 32
677)             fd 04 6f 84 80 55 5f 21 45 7b 5e c6 13 e5 ef 81
678)             3d fd 77 55 2f 78 af 36 7b 99 a0 ac 3a 55 0b 5f
679)             e5 5d 30 ed b3 06 e7 07 22 87 9c f5 15 25 45 9a
680)             df 07 6d 41 d9 6e d8 18 c8 5b a6 86 b9 94 dd e5
681)             28 94 3b 69 f1 e8 75 76 54 32 9d 1c 4c 56 ce 99
682)             bc c9 81 2c ce db f3 44 ec 18 55 c2 6b dc 53 34
683)             c3 24 63 0c 2a ec 41 3b ac 3d f5 82 83 29 12 a6
684)             d0 f3 4b 14 3c f6 ea b5 a6 f4 b7 4d 4b 63 15 7d
685)             5b 8f 31 3a 73 4f 6e 87 40 6e 29 15 a8 1e ab d7
686)             00 00 00 c1 00
687)             bc d1 05 77 59 17 c9 1b 48 16 b9 31 35 01 55 34
688)             f3 80 a4 26 d4 2e fb da 02 7c 4f 4d 43 24 45 d9
689)             b1 5b 4e bf b9 94 0b 5f e6 fd bc ba 1e 4e 2d 3f
690)             2b c3 06 e1 a3 f6 11 ea e0 de dd 3e a1 ae b4 76
691)             f5 ab 99 f4 00 3b a8 42 34 56 ec 15 f0 e5 0b c2
692)             d8 40 03 f7 5c 5e c5 da 2b 20 0e 41 81 75 3e aa
693)             5b 41 ab 3c c1 57 35 6d 17 bf a3 39 93 a3 7f 33
694)             a5 69 35 fd 23 92 39 bd ec 9e 4d a4 f1 66 3d 57
695)             5d 4c e2 6e d0 4d 74 c1 09 26 9e e2 7e e7 18 9a
696)             86 00 03 01 3b 2b e5 65 59 a8 03 10 ad b2 f0 cb
697)             5e f7 2f 44 f8 dd 2e 3b 68 fe 87 ce 6c 42 df d4
698)             21 bd a2 13 fb e1 72 00 60 a7 ad 78 d9 69 d2 09
699)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69
700)             74 68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
701) """),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

702)         'public_key': rb"""ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCxoe7pezhxWy4NI0mUwKqg9WCYOAS+IjxN9eYcqpfcmQiojcuy9XsiN/xYJ1O94SrsKS5mEia2xHnYA4RUChTyYNcM2v6cnnBQ/N/VQhpGMN7SVxdbhKUXTWFCwbjBgO6rGyHB6WtoH8vd7TOEPt+NgcXwhsWyoaUUdYTA62V+GF9vEmxMaC4ubgDz+B0QkPnauSoNxmkhcIe0lsLNb1pClZyz88PDnKXCX/d0HuN/HJ+sbPg7dCvOyqFYSyKn3uY6bCXqoIdurxXzH3O7z0P8f5sbmKOrGGKNuNxVRbeVl/D/3uDL0nqsbfUc1qvkfwbJwtMXC4IV6kOZMSk2BAsqh7x48gQ+rhYeEVSi8F3CWs4HJQoqrGt7K9a3mCSlMBHP70u3w6ME7eumoryxlUofewTd17ZEkzdX08l2ZlKzZvwQUrc+xQZ2Uw8z2mfW6Ti4gi0pYGaig7Ke4PwuXpo/C5YAWfeXycsvJZ2uaYRjMdZeJGNAnHLUGLkBscw5aI8= test key without passphrase
703) """,  # noqa: E501
704)         'public_key_data': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

705)             00 00 00 07 73 73 68 2d 72 73 61
706)             00 00 00 03 01 00 01
707)             00 00 01 81 00
708)             b1 a1 ee e9 7b 38 71 5b 2e 0d 23 49 94 c0 aa a0
709)             f5 60 98 38 04 be 22 3c 4d f5 e6 1c aa 97 dc 99
710)             08 a8 8d cb b2 f5 7b 22 37 fc 58 27 53 bd e1 2a
711)             ec 29 2e 66 12 26 b6 c4 79 d8 03 84 54 0a 14 f2
712)             60 d7 0c da fe 9c 9e 70 50 fc df d5 42 1a 46 30
713)             de d2 57 17 5b 84 a5 17 4d 61 42 c1 b8 c1 80 ee
714)             ab 1b 21 c1 e9 6b 68 1f cb dd ed 33 84 3e df 8d
715)             81 c5 f0 86 c5 b2 a1 a5 14 75 84 c0 eb 65 7e 18
716)             5f 6f 12 6c 4c 68 2e 2e 6e 00 f3 f8 1d 10 90 f9
717)             da b9 2a 0d c6 69 21 70 87 b4 96 c2 cd 6f 5a 42
718)             95 9c b3 f3 c3 c3 9c a5 c2 5f f7 74 1e e3 7f 1c
719)             9f ac 6c f8 3b 74 2b ce ca a1 58 4b 22 a7 de e6
720)             3a 6c 25 ea a0 87 6e af 15 f3 1f 73 bb cf 43 fc
721)             7f 9b 1b 98 a3 ab 18 62 8d b8 dc 55 45 b7 95 97
722)             f0 ff de e0 cb d2 7a ac 6d f5 1c d6 ab e4 7f 06
723)             c9 c2 d3 17 0b 82 15 ea 43 99 31 29 36 04 0b 2a
724)             87 bc 78 f2 04 3e ae 16 1e 11 54 a2 f0 5d c2 5a
725)             ce 07 25 0a 2a ac 6b 7b 2b d6 b7 98 24 a5 30 11
726)             cf ef 4b b7 c3 a3 04 ed eb a6 a2 bc b1 95 4a 1f
727)             7b 04 dd d7 b6 44 93 37 57 d3 c9 76 66 52 b3 66
728)             fc 10 52 b7 3e c5 06 76 53 0f 33 da 67 d6 e9 38
729)             b8 82 2d 29 60 66 a2 83 b2 9e e0 fc 2e 5e 9a 3f
730)             0b 96 00 59 f7 97 c9 cb 2f 25 9d ae 69 84 63 31
731)             d6 5e 24 63 40 9c 72 d4 18 b9 01 b1 cc 39 68 8f
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

732) """),
733)         'expected_signature': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

734)             00 00 00 07 73 73 68 2d 72 73 61
735)             00 00 01 80
736)             a2 10 7c 2e f6 bb 53 a8 74 2a a1 19 99 ad 81 be
737)             79 9c ed d6 9d 09 4e 6e c5 18 48 33 90 77 99 68
738)             f7 9e 03 5a cd 4e 18 eb 89 7d 85 a2 ee ae 4a 92
739)             f6 6f ce b9 fe 86 7f 2a 6b 31 da 6e 1a fe a2 a5
740)             88 b8 44 7f a1 76 73 b3 ec 75 b5 d0 a6 b9 15 97
741)             65 09 13 7d 94 21 d1 fb 5d 0f 8b 23 04 77 c2 c3
742)             55 22 b1 a0 09 8a f5 38 2a d6 7f 1b 87 29 a0 25
743)             d3 25 6f cb 64 61 07 98 dc 14 c5 84 f8 92 24 5e
744)             50 11 6b 49 e5 f0 cc 29 cb 29 a9 19 d8 a7 71 1f
745)             91 0b 05 b1 01 4b c2 5f 00 a5 b6 21 bf f8 2c 9d
746)             67 9b 47 3b 0a 49 6b 79 2d fc 1d ec 0c b0 e5 27
747)             22 d5 a9 f8 d3 c3 f9 df 48 68 e9 fb ef 3c dc 26
748)             bf cf ea 29 43 01 a6 e3 c5 51 95 f4 66 6d 8a 55
749)             e2 47 ec e8 30 45 4c ae 47 e7 c9 a4 21 8b 64 ba
750)             b6 88 f6 21 f8 73 b9 cb 11 a1 78 75 92 c6 5a e5
751)             64 fe ed 42 d9 95 99 e6 2b 6f 3c 16 3c 28 74 a4
752)             72 2f 0d 3f 2c 33 67 aa 35 19 8e e7 b5 11 2f b3
753)             f7 6a c5 02 e2 6f a3 42 e3 62 19 99 03 ea a5 20
754)             e7 a1 e3 bc c8 06 a3 b5 7c d6 76 5d df 6f 60 46
755)             83 2a 08 00 d6 d3 d9 a4 c1 41 8c f8 60 56 45 81
756)             da 3b a2 16 1f 9e 4e 75 83 17 da c3 53 c3 3e 19
757)             a4 1b bc d2 29 b8 78 61 2b 78 e6 b1 52 b0 d5 ec
758)             de 69 2c 48 62 d9 fd d1 9b 6b b0 49 db d3 ff 38
759)             e7 10 d9 2d ce 9f 0d 5e 09 7b 37 d2 7b c3 bf ce
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

760) """),
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

761)         'derived_passphrase': rb'ohB8Lva7U6h0KqEZma2Bvnmc7dadCU5uxRhIM5B3mWj3ngNazU4Y64l9haLurkqS9m/Ouf6GfyprMdpuGv6ipYi4RH+hdnOz7HW10Ka5FZdlCRN9lCHR+10PiyMEd8LDVSKxoAmK9Tgq1n8bhymgJdMlb8tkYQeY3BTFhPiSJF5QEWtJ5fDMKcspqRnYp3EfkQsFsQFLwl8ApbYhv/gsnWebRzsKSWt5Lfwd7Ayw5Sci1an408P530ho6fvvPNwmv8/qKUMBpuPFUZX0Zm2KVeJH7OgwRUyuR+fJpCGLZLq2iPYh+HO5yxGheHWSxlrlZP7tQtmVmeYrbzwWPCh0pHIvDT8sM2eqNRmO57URL7P3asUC4m+jQuNiGZkD6qUg56HjvMgGo7V81nZd329gRoMqCADW09mkwUGM+GBWRYHaO6IWH55OdYMX2sNTwz4ZpBu80im4eGEreOaxUrDV7N5pLEhi2f3Rm2uwSdvT/zjnENktzp8NXgl7N9J7w7/O',  # noqa: E501
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

762)     },
763) }
764) 
765) UNSUITABLE_KEYS: Mapping[str, SSHTestKey] = {
766)     'dsa1024': {
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

767)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

768) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABsQAAAAdzc2gtZH
769) NzAAAAgQC7KAZXqBGNVLBQPrcMYAoNW54BhD8aIhe7BDWYzJcsaMt72VKSkguZ8+XR7nRa
770) 0C/ZsBi+uJp0dpxy9ZMTOWX4u5YPMeQcXEdGExZIfimGqSOAsy6fCld2IfJZJZExcCmhe9
771) Ssjsd3YSAPJRluOXFQc95MZoR5hMwlIDD8QzrE7QAAABUA99nOZOgd7aHMVGoXpUEBcn7H
772) ossAAACALr2Ag3hxM3rKdxzVUw8fX0VVPXO+3+Kr8hGe0Kc/7NwVaBVL1GQ8fenBuWynpA
773) UbH0wo3h1wkB/8hX6p+S8cnu5rIBlUuVNwLw/bIYohK98LfqTYK/V+g6KD+8m34wvEiXZm
774) qywY54n2bksch1Nqvj/tNpLzExSx/XS0kSM1aigAAACAbQNRPcVEuGDrEcf+xg5tgAejPX
775) BPXr/Jss+Chk64km3mirMYjAWyWYtVcgT+7hOYxtYRin8LyMLqKRmqa0Q5UrvDfChgLhvs
776) G9YSb/Mpw5qm8PiHSafwhkaz/te3+8hKogqoe7sd+tCF06IpJr5k70ACiNtRGqssNF8Elr
777) l1efYAAAH4swlfVrMJX1YAAAAHc3NoLWRzcwAAAIEAuygGV6gRjVSwUD63DGAKDVueAYQ/
778) GiIXuwQ1mMyXLGjLe9lSkpILmfPl0e50WtAv2bAYvriadHaccvWTEzll+LuWDzHkHFxHRh
779) MWSH4phqkjgLMunwpXdiHyWSWRMXApoXvUrI7Hd2EgDyUZbjlxUHPeTGaEeYTMJSAw/EM6
780) xO0AAAAVAPfZzmToHe2hzFRqF6VBAXJ+x6LLAAAAgC69gIN4cTN6yncc1VMPH19FVT1zvt
781) /iq/IRntCnP+zcFWgVS9RkPH3pwblsp6QFGx9MKN4dcJAf/IV+qfkvHJ7uayAZVLlTcC8P
782) 2yGKISvfC36k2Cv1foOig/vJt+MLxIl2ZqssGOeJ9m5LHIdTar4/7TaS8xMUsf10tJEjNW
783) ooAAAAgG0DUT3FRLhg6xHH/sYObYAHoz1wT16/ybLPgoZOuJJt5oqzGIwFslmLVXIE/u4T
784) mMbWEYp/C8jC6ikZqmtEOVK7w3woYC4b7BvWEm/zKcOapvD4h0mn8IZGs/7Xt/vISqIKqH
785) u7HfrQhdOiKSa+ZO9AAojbURqrLDRfBJa5dXn2AAAAFQDJHfenj4EJ9WkehpdJatPBlqCW
786) 0gAAABt0ZXN0IGtleSB3aXRob3V0IHBhc3NwaHJhc2UBAgMEBQYH
787) -----END OPENSSH PRIVATE KEY-----
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

788) """,
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

789)         'private_key_blob': bytes.fromhex("""
790)             00 00 00 07 73 73 68 2d 64 73 73
791)             00 00 00 81 00
792)             bb 28 06 57 a8 11 8d 54 b0 50 3e b7 0c 60 0a 0d
793)             5b 9e 01 84 3f 1a 22 17 bb 04 35 98 cc 97 2c 68
794)             cb 7b d9 52 92 92 0b 99 f3 e5 d1 ee 74 5a d0 2f
795)             d9 b0 18 be b8 9a 74 76 9c 72 f5 93 13 39 65 f8
796)             bb 96 0f 31 e4 1c 5c 47 46 13 16 48 7e 29 86 a9
797)             23 80 b3 2e 9f 0a 57 76 21 f2 59 25 91 31 70 29
798)             a1 7b d4 ac 8e c7 77 61 20 0f 25 19 6e 39 71 50
799)             73 de 4c 66 84 79 84 cc 25 20 30 fc 43 3a c4 ed
800)             00 00 00 15 00 f7 d9 ce 64
801)             e8 1d ed a1 cc 54 6a 17 a5 41 01 72 7e c7 a2 cb
802)             00 00 00 80
803)             2e bd 80 83 78 71 33 7a ca 77 1c d5 53 0f 1f 5f
804)             45 55 3d 73 be df e2 ab f2 11 9e d0 a7 3f ec dc
805)             15 68 15 4b d4 64 3c 7d e9 c1 b9 6c a7 a4 05 1b
806)             1f 4c 28 de 1d 70 90 1f fc 85 7e a9 f9 2f 1c 9e
807)             ee 6b 20 19 54 b9 53 70 2f 0f db 21 8a 21 2b df
808)             0b 7e a4 d8 2b f5 7e 83 a2 83 fb c9 b7 e3 0b c4
809)             89 76 66 ab 2c 18 e7 89 f6 6e 4b 1c 87 53 6a be
810)             3f ed 36 92 f3 13 14 b1 fd 74 b4 91 23 35 6a 28
811)             00 00 00 80
812)             6d 03 51 3d c5 44 b8 60 eb 11 c7 fe c6 0e 6d 80
813)             07 a3 3d 70 4f 5e bf c9 b2 cf 82 86 4e b8 92 6d
814)             e6 8a b3 18 8c 05 b2 59 8b 55 72 04 fe ee 13 98
815)             c6 d6 11 8a 7f 0b c8 c2 ea 29 19 aa 6b 44 39 52
816)             bb c3 7c 28 60 2e 1b ec 1b d6 12 6f f3 29 c3 9a
817)             a6 f0 f8 87 49 a7 f0 86 46 b3 fe d7 b7 fb c8 4a
818)             a2 0a a8 7b bb 1d fa d0 85 d3 a2 29 26 be 64 ef
819)             40 02 88 db 51 1a ab 2c 34 5f 04 96 b9 75 79 f6
820)             00 00 00 15 00 c9 1d f7 a7
821)             8f 81 09 f5 69 1e 86 97 49 6a d3 c1 96 a0 96 d2
822)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69
823)             74 68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
824) """),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

825)         'public_key': rb"""ssh-dss AAAAB3NzaC1kc3MAAACBALsoBleoEY1UsFA+twxgCg1bngGEPxoiF7sENZjMlyxoy3vZUpKSC5nz5dHudFrQL9mwGL64mnR2nHL1kxM5Zfi7lg8x5BxcR0YTFkh+KYapI4CzLp8KV3Yh8lklkTFwKaF71KyOx3dhIA8lGW45cVBz3kxmhHmEzCUgMPxDOsTtAAAAFQD32c5k6B3tocxUahelQQFyfseiywAAAIAuvYCDeHEzesp3HNVTDx9fRVU9c77f4qvyEZ7Qpz/s3BVoFUvUZDx96cG5bKekBRsfTCjeHXCQH/yFfqn5Lxye7msgGVS5U3AvD9shiiEr3wt+pNgr9X6DooP7ybfjC8SJdmarLBjnifZuSxyHU2q+P+02kvMTFLH9dLSRIzVqKAAAAIBtA1E9xUS4YOsRx/7GDm2AB6M9cE9ev8myz4KGTriSbeaKsxiMBbJZi1VyBP7uE5jG1hGKfwvIwuopGaprRDlSu8N8KGAuG+wb1hJv8ynDmqbw+IdJp/CGRrP+17f7yEqiCqh7ux360IXToikmvmTvQAKI21Eaqyw0XwSWuXV59g== test key without passphrase
826) """,  # noqa: E501
827)         'public_key_data': bytes.fromhex("""
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

828)             00 00 00 07 73 73 68 2d 64 73 73
829)             00 00 00 81 00
830)             bb 28 06 57 a8 11 8d 54 b0 50 3e b7 0c 60 0a 0d
831)             5b 9e 01 84 3f 1a 22 17 bb 04 35 98 cc 97 2c 68
832)             cb 7b d9 52 92 92 0b 99 f3 e5 d1 ee 74 5a d0 2f
833)             d9 b0 18 be b8 9a 74 76 9c 72 f5 93 13 39 65 f8
834)             bb 96 0f 31 e4 1c 5c 47 46 13 16 48 7e 29 86 a9
835)             23 80 b3 2e 9f 0a 57 76 21 f2 59 25 91 31 70 29
836)             a1 7b d4 ac 8e c7 77 61 20 0f 25 19 6e 39 71 50
837)             73 de 4c 66 84 79 84 cc 25 20 30 fc 43 3a c4 ed
838)             00 00 00 15 00 f7 d9 ce 64
839)             e8 1d ed a1 cc 54 6a 17 a5 41 01 72 7e c7 a2 cb
840)             00 00 00 80
841)             2e bd 80 83 78 71 33 7a ca 77 1c d5 53 0f 1f 5f
842)             45 55 3d 73 be df e2 ab f2 11 9e d0 a7 3f ec dc
843)             15 68 15 4b d4 64 3c 7d e9 c1 b9 6c a7 a4 05 1b
844)             1f 4c 28 de 1d 70 90 1f fc 85 7e a9 f9 2f 1c 9e
845)             ee 6b 20 19 54 b9 53 70 2f 0f db 21 8a 21 2b df
846)             0b 7e a4 d8 2b f5 7e 83 a2 83 fb c9 b7 e3 0b c4
847)             89 76 66 ab 2c 18 e7 89 f6 6e 4b 1c 87 53 6a be
848)             3f ed 36 92 f3 13 14 b1 fd 74 b4 91 23 35 6a 28
849)             00 00 00 80
850)             6d 03 51 3d c5 44 b8 60 eb 11 c7 fe c6 0e 6d 80
851)             07 a3 3d 70 4f 5e bf c9 b2 cf 82 86 4e b8 92 6d
852)             e6 8a b3 18 8c 05 b2 59 8b 55 72 04 fe ee 13 98
853)             c6 d6 11 8a 7f 0b c8 c2 ea 29 19 aa 6b 44 39 52
854)             bb c3 7c 28 60 2e 1b ec 1b d6 12 6f f3 29 c3 9a
855)             a6 f0 f8 87 49 a7 f0 86 46 b3 fe d7 b7 fb c8 4a
856)             a2 0a a8 7b bb 1d fa d0 85 d3 a2 29 26 be 64 ef
857)             40 02 88 db 51 1a ab 2c 34 5f 04 96 b9 75 79 f6
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

858) """),
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

859)         'expected_signature': None,
860)         'derived_passphrase': None,
861)     },
862)     'ecdsa256': {
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

863)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

864) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS
865) 1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTLbU0zDwsk2Dvp+VYIrsNVf5gWwz2S
866) 3SZ8TbxiQRkpnGSVqyIoHJOJc+NQItAa7xlJ/8Z6gfz57Z3apUkaMJm6AAAAuKeY+YinmP
867) mIAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMttTTMPCyTYO+n5
868) Vgiuw1V/mBbDPZLdJnxNvGJBGSmcZJWrIigck4lz41Ai0BrvGUn/xnqB/PntndqlSRowmb
869) oAAAAhAKIl/3n0pKVIxpZkXTGtii782Qr4yIcvHdpxjO/QsIqKAAAAG3Rlc3Qga2V5IHdp
870) dGhvdXQgcGFzc3BocmFzZQECAwQ=
871) -----END OPENSSH PRIVATE KEY-----
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

872) """,
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

873)         'private_key_blob': bytes.fromhex("""
874)             00 00 00 13 65 63 64
875)             73 61 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36
876)             00 00 00 08 6e 69 73 74 70 32 35 36
877)             00 00 00 41 04
878)             cb 6d 4d 33 0f 0b 24 d8 3b e9 f9 56 08 ae c3 55
879)             7f 98 16 c3 3d 92 dd 26 7c 4d bc 62 41 19 29 9c
880)             64 95 ab 22 28 1c 93 89 73 e3 50 22 d0 1a ef 19
881)             49 ff c6 7a 81 fc f9 ed 9d da a5 49 1a 30 99 ba
882)             00 00 00 21 00
883)             a2 25 ff 79 f4 a4 a5 48 c6 96 64 5d 31 ad 8a 2e
884)             fc d9 0a f8 c8 87 2f 1d da 71 8c ef d0 b0 8a 8a
885)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69
886)             74 68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
887) """),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

888)         'public_key': rb"""ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMttTTMPCyTYO+n5Vgiuw1V/mBbDPZLdJnxNvGJBGSmcZJWrIigck4lz41Ai0BrvGUn/xnqB/PntndqlSRowmbo= test key without passphrase
889) """,  # noqa: E501
890)         'public_key_data': bytes.fromhex("""
Marco Ricci Add an ecdsa-sha2-nistp521...

Marco Ricci authored 1 month ago

891)             00 00 00 13 65 63 64
892)             73 61 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

893)             00 00 00 08 6e 69 73 74 70 32 35 36
894)             00 00 00 41 04
895)             cb 6d 4d 33 0f 0b 24 d8 3b e9 f9 56 08 ae c3 55
896)             7f 98 16 c3 3d 92 dd 26 7c 4d bc 62 41 19 29 9c
897)             64 95 ab 22 28 1c 93 89 73 e3 50 22 d0 1a ef 19
898)             49 ff c6 7a 81 fc f9 ed 9d da a5 49 1a 30 99 ba
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

899) """),
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

900)         'expected_signature': None,
901)         'derived_passphrase': None,
902)     },
903)     'ecdsa384': {
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

904)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

905) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAiAAAABNlY2RzYS
906) 1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQSgkOjkAvq7v5vHuj3KBL4/EAWcn5hZ
907) DyKcbyV0eBMGFq7hKXQlZqIahLVqeMR0QqmkxNJ2rly2VHcXneq3vZ+9fIsWCOdYk5WP3N
908) ZPzv911Xn7wbEkC7QndD5zKlm4pBUAAADomhj+IZoY/iEAAAATZWNkc2Etc2hhMi1uaXN0
909) cDM4NAAAAAhuaXN0cDM4NAAAAGEEoJDo5AL6u7+bx7o9ygS+PxAFnJ+YWQ8inG8ldHgTBh
910) au4Sl0JWaiGoS1anjEdEKppMTSdq5ctlR3F53qt72fvXyLFgjnWJOVj9zWT87/ddV5+8Gx
911) JAu0J3Q+cypZuKQVAAAAMQD5sTy8p+B1cn/DhOmXquui1BcxvASqzzevkBlbQoBa73y04B
912) 2OdqVOVRkwZWRROz0AAAAbdGVzdCBrZXkgd2l0aG91dCBwYXNzcGhyYXNlAQIDBA==
913) -----END OPENSSH PRIVATE KEY-----
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

914) """,
Marco Ricci Add principal support for u...

Marco Ricci authored 3 months ago

915)         'private_key_blob': bytes.fromhex("""
916)             00 00 00 13 65 63 64
917)             73 61 2d 73 68 61 32 2d 6e 69 73 74 70 33 38 34
918)             00 00 00 08 6e 69 73 74 70 33 38 34
919)             00 00 00 61 04
920)             a0 90 e8 e4 02 fa bb bf 9b c7 ba 3d ca 04 be 3f
921)             10 05 9c 9f 98 59 0f 22 9c 6f 25 74 78 13 06 16
922)             ae e1 29 74 25 66 a2 1a 84 b5 6a 78 c4 74 42 a9
923)             a4 c4 d2 76 ae 5c b6 54 77 17 9d ea b7 bd 9f bd
924)             7c 8b 16 08 e7 58 93 95 8f dc d6 4f ce ff 75 d5
925)             79 fb c1 b1 24 0b b4 27 74 3e 73 2a 59 b8 a4 15
926)             00 00 00 31 00
927)             f9 b1 3c bc a7 e0 75 72 7f c3 84 e9 97 aa eb a2
928)             d4 17 31 bc 04 aa cf 37 af 90 19 5b 42 80 5a ef
929)             7c b4 e0 1d 8e 76 a5 4e 55 19 30 65 64 51 3b 3d
930)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69
931)             74 68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
932) """),
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

933)         'public_key': rb"""ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBKCQ6OQC+ru/m8e6PcoEvj8QBZyfmFkPIpxvJXR4EwYWruEpdCVmohqEtWp4xHRCqaTE0nauXLZUdxed6re9n718ixYI51iTlY/c1k/O/3XVefvBsSQLtCd0PnMqWbikFQ== test key without passphrase
934) """,  # noqa: E501
935)         'public_key_data': bytes.fromhex("""
Marco Ricci Add an ecdsa-sha2-nistp521...

Marco Ricci authored 1 month ago

936)             00 00 00 13 65 63 64
937)             73 61 2d 73 68 61 32 2d 6e 69 73 74 70 33 38 34
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

938)             00 00 00 08 6e 69 73 74 70 33 38 34
939)             00 00 00 61 04
940)             a0 90 e8 e4 02 fa bb bf 9b c7 ba 3d ca 04 be 3f
941)             10 05 9c 9f 98 59 0f 22 9c 6f 25 74 78 13 06 16
942)             ae e1 29 74 25 66 a2 1a 84 b5 6a 78 c4 74 42 a9
943)             a4 c4 d2 76 ae 5c b6 54 77 17 9d ea b7 bd 9f bd
944)             7c 8b 16 08 e7 58 93 95 8f dc d6 4f ce ff 75 d5
945)             79 fb c1 b1 24 0b b4 27 74 3e 73 2a 59 b8 a4 15
Marco Ricci Add an ecdsa-sha2-nistp521...

Marco Ricci authored 1 month ago

946) """),
947)         'expected_signature': None,
948)         'derived_passphrase': None,
949)     },
950)     'ecdsa521': {
951)         'private_key': rb"""-----BEGIN OPENSSH PRIVATE KEY-----
952) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAArAAAABNlY2RzYS
953) 1zaGEyLW5pc3RwNTIxAAAACG5pc3RwNTIxAAAAhQQASVOdwDznmlcGqiLvFtYeVtrAEiVz
954) iIfsL7jEM8Utu/m8WSkPFQtjwqdFw+WfZ0mi6qMbEFgi/ELzZSKVteCSbcMAhqAkOMFKiD
955) u4bxvsM6bT02Ru7q2yT41ySyGhUD0QySBnI6Ckt/wnQ1TEpj8zDKiRErxs9e6QLGElNRkz
956) LPMs+mMAAAEY2FXeh9hV3ocAAAATZWNkc2Etc2hhMi1uaXN0cDUyMQAAAAhuaXN0cDUyMQ
957) AAAIUEAElTncA855pXBqoi7xbWHlbawBIlc4iH7C+4xDPFLbv5vFkpDxULY8KnRcPln2dJ
958) ouqjGxBYIvxC82UilbXgkm3DAIagJDjBSog7uG8b7DOm09Nkbu6tsk+NckshoVA9EMkgZy
959) OgpLf8J0NUxKY/MwyokRK8bPXukCxhJTUZMyzzLPpjAAAAQSFqUmKK7lGQzxT6GKZSLDju
960) U3otwLYnuj+/5AdzuB/zotu95UdFv9I2DNXzd9E4WAyz6IqBBNcsMkxrzHAdqsYDAAAAG3
961) Rlc3Qga2V5IHdpdGhvdXQgcGFzc3BocmFzZQ==
962) -----END OPENSSH PRIVATE KEY-----
963) """,
964)         'private_key_blob': bytes.fromhex("""
965)             00 00 00 13 65 63 64
966)             73 61 2d 73 68 61 32 2d 6e 69 73 74 70 35 32 31
967)             00 00 00 08 6e 69 73 74 70 35 32 31
968)             00 00 00 85 04 00 49 53 9d
969)             c0 3c e7 9a 57 06 aa 22 ef 16 d6 1e 56 da c0 12
970)             25 73 88 87 ec 2f b8 c4 33 c5 2d bb f9 bc 59 29
971)             0f 15 0b 63 c2 a7 45 c3 e5 9f 67 49 a2 ea a3 1b
972)             10 58 22 fc 42 f3 65 22 95 b5 e0 92 6d c3 00 86
973)             a0 24 38 c1 4a 88 3b b8 6f 1b ec 33 a6 d3 d3 64
974)             6e ee ad b2 4f 8d 72 4b 21 a1 50 3d 10 c9 20 67
975)             23 a0 a4 b7 fc 27 43 54 c4 a6 3f 33 0c a8 91 12
976)             bc 6c f5 ee 90 2c 61 25 35 19 33 2c f3 2c fa 63
977)             00 00 00 41 21
978)             6a 52 62 8a ee 51 90 cf 14 fa 18 a6 52 2c 38 ee
979)             53 7a 2d c0 b6 27 ba 3f bf e4 07 73 b8 1f f3 a2
980)             db bd e5 47 45 bf d2 36 0c d5 f3 77 d1 38 58 0c
981)             b3 e8 8a 81 04 d7 2c 32 4c 6b cc 70 1d aa c6 03
982)             00 00 00 1b 74 65 73 74 20 6b 65 79 20 77 69
983)             74 68 6f 75 74 20 70 61 73 73 70 68 72 61 73 65
984) """),
985)         'public_key': rb"""ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBABJU53APOeaVwaqIu8W1h5W2sASJXOIh+wvuMQzxS27+bxZKQ8VC2PCp0XD5Z9nSaLqoxsQWCL8QvNlIpW14JJtwwCGoCQ4wUqIO7hvG+wzptPTZG7urbJPjXJLIaFQPRDJIGcjoKS3/CdDVMSmPzMMqJESvGz17pAsYSU1GTMs8yz6Yw== test key without passphrase
986) """,  # noqa: E501
987)         'public_key_data': bytes.fromhex("""
988)             00 00 00 13 65 63 64
989)             73 61 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36
990)             00 00 00 08 6e 69 73 74 70 35 32 31
991)             00 00 00 85 04 00 49 53 9d
992)             c0 3c e7 9a 57 06 aa 22 ef 16 d6 1e 56 da c0 12
993)             25 73 88 87 ec 2f b8 c4 33 c5 2d bb f9 bc 59 29
994)             0f 15 0b 63 c2 a7 45 c3 e5 9f 67 49 a2 ea a3 1b
995)             10 58 22 fc 42 f3 65 22 95 b5 e0 92 6d c3 00 86
996)             a0 24 38 c1 4a 88 3b b8 6f 1b ec 33 a6 d3 d3 64
997)             6e ee ad b2 4f 8d 72 4b 21 a1 50 3d 10 c9 20 67
998)             23 a0 a4 b7 fc 27 43 54 c4 a6 3f 33 0c a8 91 12
999)             bc 6c f5 ee 90 2c 61 25 35 19 33 2c f3 2c fa 63
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1000) """),
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1001)         'expected_signature': None,
1002)         'derived_passphrase': None,
1003)     },
1004) }
1005) 
1006) DUMMY_SERVICE = 'service1'
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1007) DUMMY_PASSPHRASE = 'my secret passphrase'
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1008) DUMMY_KEY1 = SUPPORTED_KEYS['ed25519']['public_key_data']
1009) DUMMY_KEY1_B64 = base64.standard_b64encode(DUMMY_KEY1).decode('ASCII')
1010) DUMMY_KEY2 = SUPPORTED_KEYS['rsa']['public_key_data']
1011) DUMMY_KEY2_B64 = base64.standard_b64encode(DUMMY_KEY2).decode('ASCII')
Marco Ricci Avoid crashing when overrid...

Marco Ricci authored 5 months ago

1012) DUMMY_KEY3 = SUPPORTED_KEYS['ed448']['public_key_data']
1013) DUMMY_KEY3_B64 = base64.standard_b64encode(DUMMY_KEY3).decode('ASCII')
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1014) DUMMY_CONFIG_SETTINGS = {
1015)     'length': 10,
1016)     'upper': 1,
1017)     'lower': 1,
1018)     'repeat': 5,
1019)     'number': 1,
1020)     'space': 1,
1021)     'dash': 1,
1022)     'symbol': 1,
1023) }
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1024) DUMMY_RESULT_PASSPHRASE = b'.2V_QJkd o'
1025) DUMMY_RESULT_KEY1 = b'E<b<{ -7iG'
1026) DUMMY_PHRASE_FROM_KEY1_RAW = (
1027)     b'\x00\x00\x00\x0bssh-ed25519'
1028)     b'\x00\x00\x00@\xf0\x98\x19\x80l\x1a\x97\xd5&\x03n'
1029)     b'\xcc\xe3e\x8f\x86f\x07\x13\x19\x13\t!33\xf9\xe46S'
1030)     b'\x1d\xaf\xfd\r\x08\x1f\xec\xf8s\x9b\x8c_U9\x16|ST,'
1031)     b'\x1eR\xbb0\xed\x7f\x89\xe2/iQU\xd8\x9e\xa6\x02'
1032) )
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

1033) DUMMY_PHRASE_FROM_KEY1 = b'8JgZgGwal9UmA27M42WPhmYHExkTCSEzM/nkNlMdr/0NCB/s+HObjF9VORZ8U1QsHlK7MO1/ieIvaVFV2J6mAg=='  # noqa: E501
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1034) 
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1035) VAULT_MASTER_KEY = 'vault key'
1036) VAULT_V02_CONFIG = 'P7xeh5y4jmjpJ2pFq4KUcTVoaE9ZOEkwWmpVTURSSWQxbGt6emN4aFE4eFM3anVPbDRNTGpOLzY3eDF5aE1YTm5LNWh5Q1BwWTMwM3M5S083MWRWRFlmOXNqSFJNcStGMWFOS3c2emhiOUNNenZYTmNNMnZxaUErdlRoOGF2ZHdGT1ZLNTNLOVJQcU9jWmJrR3g5N09VcVBRZ0ZnSFNUQy9HdFVWWnFteVhRVkY3MHNBdnF2ZWFEbFBseWRGelE1c3BFTnVUckRQdWJSL29wNjFxd2Y2ZVpob3VyVzRod3FKTElTenJ1WTZacTJFOFBtK3BnVzh0QWVxcWtyWFdXOXYyenNQeFNZbWt1MDU2Vm1kVGtISWIxWTBpcWRFbyswUVJudVVhZkVlNVpGWDA4WUQ2Q2JTWW81SnlhQ2Zxa3cxNmZoQjJES0Uyd29rNXpSck5iWVBrVmEwOXFya1NpMi9saU5LL3F0M3N3MjZKekNCem9ER2svWkZ0SUJLdmlHRno0VlQzQ3pqZTBWcTM3YmRiNmJjTkhqUHZoQ0NxMW1ldW1XOFVVK3pQMEtUMkRMVGNvNHFlOG40ck5KcGhsYXg1b1VzZ1NYU1B2T3RXdEkwYzg4NWE3YWUzOWI1MDI0MThhMWZjODQ3MDA2OTJmNDQ0MDkxNGFiNmRlMGQ2YjZiNjI5NGMwN2IwMmI4MGZi'  # noqa: E501
1037) VAULT_V02_CONFIG_DATA = {
1038)     'global': {
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1039)         'phrase': DUMMY_PASSPHRASE.rstrip('\n'),
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1040)     },
1041)     'services': {
1042)         '(meta)': {
1043)             'notes': 'This config was originally in v0.2 format.',
1044)         },
1045)         DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS.copy(),
1046)     },
1047) }
1048) VAULT_V03_CONFIG = 'sBPBrr8BFHPxSJkV/A53zk9zwDQHFxLe6UIusCVvzFQre103pcj5xxmE11lMTA0U2QTYjkhRXKkH5WegSmYpAnzReuRsYZlWWp6N4kkubf+twZ9C3EeggPm7as2Af4TICHVbX4uXpIHeQJf9y1OtqrO+SRBrgPBzgItoxsIxebxVKgyvh1CZQOSkn7BIzt9xKhDng3ubS4hQ91fB0QCumlldTbUl8tj4Xs5JbvsSlUMxRlVzZ0OgAOrSsoWELXmsp6zXFa9K6wIuZa4wQuMLQFHiA64JO1CR3I+rviWCeMlbTOuJNx6vMB5zotKJqA2hIUpN467TQ9vI4g/QTo40m5LT2EQKbIdTvBQAzcV4lOcpr5Lqt4LHED5mKvm/4YfpuuT3I3XCdWfdG5SB7ciiB4Go+xQdddy3zZMiwm1fEwIB8XjFf2cxoJdccLQ2yxf+9diedBP04EsMHrvxKDhQ7/vHl7xF2MMFTDKl3WFd23vvcjpR1JgNAKYprG/e1p/7'  # noqa: E501
1049) VAULT_V03_CONFIG_DATA = {
1050)     'global': {
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1051)         'phrase': DUMMY_PASSPHRASE.rstrip('\n'),
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1052)     },
1053)     'services': {
1054)         '(meta)': {
1055)             'notes': 'This config was originally in v0.3 format.',
1056)         },
1057)         DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS.copy(),
1058)     },
1059) }
1060) VAULT_STOREROOM_CONFIG_ZIPPED = b"""
1061) UEsDBBQAAAAIAJ1WGVnTVFGT0gAAAOYAAAAFAAAALmtleXMFwclSgzAAANC7n9GrBzBldcYDE5Al
1062) EKbFAvGWklBAtqYsBcd/973fw8LFox76w/vb34tzhD5OATeEAk6tJ6Fbp3WrvkJO7l0KIjtxCLfY
1063) ORm8ScEDPbNkyVwGLmZNTuQzXPMl/GnLO0I2PmUhRcxSj2Iy6PUy57up4thL6zndYwtyORpyCTGy
1064) ibbjIeq/K/9atsHkl680nwsKFVk1i97gbGhG4gC5CMS8aUx8uebuToRCDsAT61UQVp0yEjw1bhm1
1065) 6UPWzM2wyfMGMyY1ox5HH/9QSwMEFAAAAAgAnVYZWd1pX+EFAwAA1AMAAAIAAAAwMA3ON7abQAAA
1066) wP4fwy0FQUR3ZASLYEkCOnKOEtHPd7e7KefPr71YP800/vqN//3hAywvUaCcTYb6TbKS/kYcVnvG
1067) wGA5N8ksjpFNCu5BZGu953GdoVnOfN6PNXoluWOS2JzO23ELNJ2m9nDn0uDhwC39VHJT1pQdejIw
1068) CovQTEWmBH53FJufhNSZKQG5s1fMcw9hqn3NbON6wRDquOjLe/tqWkG1yiQDSF5Ail8Wd2UaA7vo
1069) 40QorG1uOBU7nPlDx/cCTDpSqwTZDkkAt6Zy9RT61NUZqHSMIgKMerj3njXOK+1q5sA/upSGvMrN
1070) 7/JpSEhcmu7GDvQJ8TyLos6vPCSmxO6RRG3X4BLpqHkTgeqHz+YDZwTV+6y5dvSmTSsCP5uPCmi+
1071) 7r9irZ1m777iL2R8NFH0QDIo1GFsy1NrUvWq4TGuvVIbkHrML5mFdR6ajNhRjL/6//1crYAMLHxo
1072) qkjGz2Wck2dmRd96mFFAfdQ1/BqDgi6X/KRwHL9VmhpdjcKJhuE04xLYgTCyKLv8TkFfseNAbN3N
1073) 7KvVW7QVF97W50pzXzy3Ea3CatNQkJ1DnkR0vc0dsHd1Zr0o1acUaAa65B2yjYXCk3TFlMo9TNce
1074) OWBXzJrpaZ4N7bscdwCF9XYesSMpxBDpwyCIVyJ8tHZVf/iS4pE6u+XgvD42yef+ujhM/AyboqPk
1075) sFNV/XoNpmWIySdkTMmwu72q1GfPqr01ze/TzCVrCe0KkFcZhe77jrLPOnRCIarF2c9MMHNfmguU
1076) A0tJ8HodQb/zehL6C9KSiNWfG+NlK1Dro1sGKhiJETLMFru272CNlwQJmzTHuKAXuUvJmQCfmLfL
1077) EPrxoE08fu+v6DKnSopnG8GTkbscPZ+K5q2kC6m7pCizKO1sLKG7fMBRnJxnel/vmpY2lFCB4ADy
1078) no+dvqBl6z3X/ji9AFXC9X8HRd+8u57OS1zV4OhiVd7hMy1U8F5qbIBms+FS6QbL9NhIb2lFN4VO
1079) 3+ITZz1sPJBl68ZgJWOV6O4F5cAHGKl/UEsDBBQAAAAIAJ1WGVn9pqLBygEAACsCAAACAAAAMDMN
1080) z8mWa0AAANB9f0ZvLZQhyDsnC0IMJShDBTuzJMZoktLn/ft79w/u7/dWvZb7OHz/Yf5+yYUBMTNK
1081) RrCI1xIQs67d6yI6bM75waX0gRLdKMGyC5O2SzBLs57V4+bqxo5xI2DraLTVeniUXLxkLyjRnC4u
1082) 24Vp+7p+ppt9DlVNNZp7rskQDOe47mbgViNeE5oXpg/oDgTcfQYNvt8V0OoyKbIiNymOW/mB3hze
1083) D1EHqTWQvFZB5ANGpLMM0U10xWYAClzuVJXKm/n/8JgVaobY38IjzxXyk4iPkQUuYtws73Kan871
1084) R3mZa7/j0pO6Wu0LuoV+czp9yZEH/SU42lCgjEsZ9Mny3tHaF09QWU4oB7HI+LBhKnFJ9c0bHEky
1085) OooHgzgTIa0y8fbpst30PEUwfUAS+lYzPXG3y+QUiy5nrJFPb0IwESd9gIIOVSfZK63wvD5ueoxj
1086) O9bn2gutSFT6GO17ibguhXtItAjPbZWfyyQqHRyeBcpT7qbzQ6H1Of5clEqVdNcetAg8ZMKoWTbq
1087) /vSSQ2lpkEqT0tEQo7zwKBzeB37AysB5hhDCPn1gUTER6d+1S4dzwO7HhDf9kG+3botig2Xm1Dz9
1088) A1BLAwQUAAAACACdVhlZs14oCcgBAAArAgAAAgAAADA5BcHJkqIwAADQe39GXz2wE5gqDxAGQRZF
1089) QZZbDIFG2YwIga7593nv93sm9N0M/fcf4d+XcUlVE+kvustz3BU7FjHOaW+u6TRsfNKzLh74mO1w
1090) IXUlM/2sGKKuY5sYrW5N+oGqit2zLBYv57mFvH/S8pWGYDGzUnU1CdTL3B4Yix+Hk8E/+m0cSi2E
1091) dnAibw1brWVXM++8iYcUg84TMbJXntFYCyrNw1NF+008I02PeH4C8oDID6fIoKvsw3p7WJJ/I9Yp
1092) a6oJzlJiP5JGxRxZPj50N6EMtzNB+tZoIGxgtOFVpiJ05yMQFztY6I6LKIgvXW/s919GIjGshqdM
1093) XVPFxaKG4p9Iux/xazf48FY8O7SMmbQC1VsXIYo+7eSpIY67VzrCoh41wXPklOWS6CV8RR/JBSqq
1094) 8lHkcz8L21lMCOrVR1Cs0ls4HLIhUkqr9YegTJ67VM7xevUsgOI7BkPDldiulRgX+sdPheCyCacu
1095) e7/b/nk0SXWF7ZBxsR1awYqwkFKz41/1bZDsETsmd8n1DHycGIvRULv3yYhKcvWQ4asAMhP1ks5k
1096) AgOcrM+JFvpYA86Ja8HCqCg8LihEI1e7+m8F71Lpavv/UEsDBBQAAAAIAJ1WGVnKO2Ji+AEAAGsC
1097) AAACAAAAMWENx7dyo0AAANDen+GWAonMzbggLsJakgGBOhBLlGBZsjz373eve7+fKyJTM/Sff85/
1098) P5QMwMFfAWipfXwvFPWU582cd3t7JVV5pBV0Y1clL4eKUd0w1m1M5JrkgW5PlfpOVedgABSe4zPY
1099) LnSIZVuen5Eua9QY8lQ7rxW7YIqeajhgLfL54BIcY90fd8ANixlcM8V23Z03U35Txba0BbSguc0f
1100) NRF83cWp+7rOYgNO9wWLs915oQmWAqAtqRYCiWlgAtxYFg0MnNS4/G80FvFmQTh0cjwcF1xEVPeW
1101) l72ky84PEA0QMgRtQW+HXWtE0/vQTtNKzvNqPfrGZCldL5nk9PWhhPEQ/azyW11bz2eB+aM0g0r7
1102) 0/5YkO9er10YonsBT1rEn0lfBXDHwtwbxG2bdqELTuEtX2+OEih7K43rN2EvpXX47azaNpe/drIz
1103) wgAdhpfZ/mZwaGFX0c7r5HCTnroNRi5Bx/vu7m1A7Nt1dix4Gl/aPLCWQzpwmdIMJDiqD1RGpc5v
1104) +pDLrpfhZOVhLjAPSQ0V7mm/XNSca8oIsDjwdvR438RQCU56mrlypklS4/tJAe0JZNZIgBmJszjG
1105) AFbsmNYTJ9GmULB9lXmTWmrME592S285iWU5SsJcE1s+3oQw9QrvWB+e3bGAd9e+VFmFqr6+/gFQ
1106) SwECHgMUAAAACACdVhlZ01RRk9IAAADmAAAABQAAAAAAAAABAAAApIEAAAAALmtleXNQSwECHgMU
1107) AAAACACdVhlZ3Wlf4QUDAADUAwAAAgAAAAAAAAABAAAApIH1AAAAMDBQSwECHgMUAAAACACdVhlZ
1108) /aaiwcoBAAArAgAAAgAAAAAAAAABAAAApIEaBAAAMDNQSwECHgMUAAAACACdVhlZs14oCcgBAAAr
1109) AgAAAgAAAAAAAAABAAAApIEEBgAAMDlQSwECHgMUAAAACACdVhlZyjtiYvgBAABrAgAAAgAAAAAA
1110) AAABAAAApIHsBwAAMWFQSwUGAAAAAAUABQDzAAAABAoAAAAA
1111) """
1112) VAULT_STOREROOM_CONFIG_DATA = {
1113)     'global': {
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1114)         'phrase': DUMMY_PASSPHRASE.rstrip('\n'),
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1115)     },
1116)     'services': {
1117)         '(meta)': {
1118)             'notes': 'This config was originally in storeroom format.',
1119)         },
1120)         DUMMY_SERVICE: DUMMY_CONFIG_SETTINGS.copy(),
1121)     },
1122) }
1123) 
Marco Ricci Add more tests of the store...

Marco Ricci authored 4 months ago

1124) _VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED_JAVASCRIPT_SOURCE = """
1125) // Executed in the top-level directory of the vault project code, in Node.js.
1126) const storeroom = require('storeroom')
1127) const Store = require('./lib/store.js')
Marco Ricci Add remaining tests to the...

Marco Ricci authored 3 months ago

1128) let store = new Store(storeroom.createFileAdapter('./broken-dir'), 'vault key')
Marco Ricci Add more tests of the store...

Marco Ricci authored 4 months ago

1129) await store._storeroom.put('/services/array/', ['entry1','entry2'])
1130) // The resulting "broken-dir" was then zipped manually.
1131) """
1132) VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED = b"""
1133) UEsDBBQAAgAIAHijH1kjc0ql0gAAAOYAAAAFAAAALmtleXMFwclygjAAANB7P8Mrh7LIYmd6oGxC
1134) HKwTJJgbNpBKCpGAhNTpv/e952ZpxHTjw+bN+HuJJABEikvHecD0pLgpgYKWjue0CZGk19mKF+4f
1135) 0AoLrXKh+ckk13nmxVk/KFE28eEHkBgJTISvRUVMQ0N5aRapLgWs/M7NSXV7qs0s2aIEstUG5FHv
1136) fo/HKjpdUJMGK86vs2rOJFGyrx9ZK4iWW+LefwSTYxhYOlWpb0PpgXsV4dHNTz5skcJqpPUudZf9
1137) jCFD0vxChL6ajm0P0prY+z9QSwMEFAACAAgAeKMfWX4L7vDYAQAAPwIAAAIAAAAwNQXByZKiMAAA
1138) 0Ht/Rl85sIR1qvqAouxbJAG8kWYxgCKICEzNv897f7+XanrR4fH9h//3pVdF8qmVeWjW+STwSbak
1139) 4e3CS00h2AcrQIcghm0lOcrLdJfuaOFqg5zEsW9lTbJMtIId5ezNGM9jPKaxeriXXm45pGuHCwFP
1140) /gmcXKWGeU3sHfj93iIf6p0xrfQIGGJOvayKjzypUqb99Bllo9IwNP2FZjxmBWDw0NRzJrxr/4Qj
1141) qp4ted4f91ZaR8+64C0BJBzDngElJEFLdA2WBcip2R/VZIG219WT3JlkbFrYSjhHWeb47igytTpo
1142) USPjEJWVol0cVpD6iX1/mGM2BpHAFa+fLx3trXgbXaVmjyZVzUKDh/XqnovnLs529UGYCAdj8Xnx
1143) vWwfWclm5uIB8cHbElx6G82Zs8RQnkDsyGVDbNaMOO7lMQF7o1Uy7Q9GuSWcFMK4KBAbcwm4l8RY
1144) +2ema46H3/S31IW1LOFpoZxjwyBS69dWS7/ulVxJfbuydMvZMeWpmerjUHnKaQdumibSeSOXh+zg
1145) XU6w6SsKAjHWXCTjRehWmyNnI7z3+epr1RzUlnDcUMiYQ/seaNefgNx4jIbOw92FC2hxnZOJupK9
1146) M1WVdH3+8x9QSwMEFAACAAgAeKMfWUXRU2i7AQAAFwIAAAIAAAAxYQ3QyZZjUAAA0H19Rm2zCGLs
1147) c2rxzDMxBTtTEA8hnqlO/3v3/YT7+71W86cdh+8/+N8vUMGNNAjWlNHgsyBlwCpgBd/a2rrW0qwg
1148) p/CmvT4PTpwjHztJ2T10Jc2Fc8O7eHQb9MawAbxSKscxFAjz5wnJviaOMT5kEIZS+ibU6GgqU61P
1149) lbeYRIiNCfK1VeHMFCpUhZ1ipnh50kux5N2jph5aMvc+HOR3lQgx9MJpMzQ2oNxSfEm7wZ5s0GYb
1150) Bgy2xwaEMXNRnbzlbijZJi0M7yXNKS7nS1uFMtsapEc204YOBbOY4VK6L/9jS2ez56ybGkQPfn6+
1151) QCwTqvkR5ieuRhF0zcoPLld+OUlI0RfEPnYHKEG7gtSya/Z1Hh77Xq4ytJHdr7WmXt7BUFA8Sffm
1152) obXI31UOyVNLW0y4WMKDWq+atKGbU5BDUayoITMqvCteAZfJvnR4kZftMaFEG5ln7ptpdzpl10m3
1153) G2rgUwTjPBJKomnOtJpdwm1tXm6IMPQ6IPy7oMDC5JjrmxAPXwdPnY/i07Go6EKSYjbkj8vdj/BR
1154) rAMe2wnzdJaRhKv8kPVG1VqNdzm6xLb/Cf8AUEsDBBQAAgAIAHijH1kaCPeauQEAABcCAAACAAAA
1155) MWUFwTmyokAAAND8H+OnBAKyTpVBs8iOIG2zZM0OigJCg07N3ee9v7+kmt/d6/n7h/n3AyJEvoaD
1156) gtd8f4RxATnaHVeGNjyuolVVL+mY8Tms5ldfgYseNYMzRYJj3+i3iUgqlT5D1r7j1Bh5qVzi14X0
1157) jpuH7DBKeeot2jWI5mPubptvV567pX2U3OC6ccxWmyo2Dd3ehUkbPP4uiDgWDZzFg/fFETIawMng
1158) ahWHB2cfc2bM2kugNhWLS4peUBp36UWqMpF6+sLeUxAVZ24u08MDNMpNk81VDgiftnfBTBBhBGm0
1159) RNpzxMMOPnCx3RRFgttiJTydfkB9MeZ9pvxP9jUm/fndQfJI83CsBxcEWhbjzlEparc3VS2s4LjR
1160) 3Xafw3HLSlPqylHOWK2vc2ZJoObwqrCaFRg7kz1+z08SGu8pe0EHaII6FSxL7VM+rfVgpc1045Ut
1161) 6ayCQ0TwRL5m4oMYkZbFnivCBTY3Cdji2SQ+gh8m3A6YkFxXUH0Vz9Is8JZaLFyi24GjyZZ9rGuk
1162) Y6w53oLyTF/fSzG24ghCDZ6pOgB5qyfk4z2mUmH7pwxNCoHZ1oaxeTSn039QSwECHgMUAAIACAB4
1163) ox9ZI3NKpdIAAADmAAAABQAAAAAAAAABAAAApIEAAAAALmtleXNQSwECHgMUAAIACAB4ox9Zfgvu
1164) 8NgBAAA/AgAAAgAAAAAAAAABAAAApIH1AAAAMDVQSwECHgMUAAIACAB4ox9ZRdFTaLsBAAAXAgAA
1165) AgAAAAAAAAABAAAApIHtAgAAMWFQSwECHgMUAAIACAB4ox9ZGgj3mrkBAAAXAgAAAgAAAAAAAAAB
1166) AAAApIHIBAAAMWVQSwUGAAAAAAQABADDAAAAoQYAAAAA
1167) """
1168) 
Marco Ricci Add remaining tests to the...

Marco Ricci authored 3 months ago

1169) _VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED2_JAVASCRIPT_SOURCE = """
1170) // Executed in the top-level directory of the vault project code, in Node.js.
1171) const storeroom = require('storeroom')
1172) const Store = require('./lib/store.js')
1173) let store = new Store(storeroom.createFileAdapter('./broken-dir'), 'vault key')
1174) await store._storeroom.put('/services/array/', 'not a directory index')
1175) // The resulting "broken-dir" was then zipped manually.
1176) """
1177) VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED2 = b"""
1178) UEsDBAoAAAAAAM6NSVmrcHdV5gAAAOYAAAAFAAAALmtleXN7InZlcnNpb24iOjF9CkV3ZS9LZkJp
1179) L0V0OUcrZmxYM3gxaFU4ZjE4YlE3S253bHoxN0IxSDE3cUhVOGdWK2RpWWY5MTdFZ0YrSStidEpZ
1180) VXBzWVZVck45OC9uLzdsZnl2NUdGVEg2NWZxVy93YjlOc2MxeEZ4ck43Q3p4eTZ5MVAxZzFPb2VK
1181) b0RZU3J6YXlwT0E2M3pidmk0ZTRiREMyNXhPTXl5NHBoMDFGeGdnQmpSNnpUcmR2UDk2UlZQd0I5
1182) WitOZkZWZUlXT1NQN254ZFNYMGdFbkZ4SDBmWDkzNTFaTTZnPVBLAwQKAAAAAADOjUlZJg3/BhcC
1183) AAAXAgAAAgAAADBieyJ2ZXJzaW9uIjoxfQpBVXJJMjNDQ2VpcW14cUZRMlV4SUpBaUoxNEtyUzh2
1184) SXpIa2xROURBaFRlVHNFMmxPVUg4WUhTcUk1cXRGSHBqY3c1WkRkZmRtUlEwQXVGRjllY3lkam14
1185) dDdUemRYLzNmNFUvTGlVV2dLRmQ1K1FEN3BlVlE1bWpqeHNlUEpHTDlhTWlKaGxSUVB4SmtUbjBx
1186) U2poM1RUT0ZZbVAzV0JkdlUyWnF2RzhaSDk2cU1WcnZsQ0dMRmZTc2svVXlvcHZKdENONUVXcTRZ
1187) SDUwNFNiejFIUVhWd2RjejlrS1BuR3J6SVA4ZmZtZnhXQ0U0TmtLb0ZPQXZuNkZvS3FZdGlGbFE9
1188) PQpBVXBMUVMrMG9VeEZTeCtxbTB3SUtyM1MvTVJxYWJJTFlEUnY0aHlBMVE2TGR2Nlk0UmJ0enVz
1189) NzRBc0cxbVhhenlRU2hlZVowdk0xM2ZyTFA4YlV0VHBaRyszNXF1eUhLM2NaWVJRZUxKM0JzejZz
1190) b0xaQjNZTkpNenFxTTQrdzM1U0FZZ2lMU1NkN05NeWVrTHNhRUIzRDFOajlTRk85K3NGNEpFMWVL
1191) UXpNMkltNk9qOUNVQjZUSTV3UitibksxN1BnY2RaeTZUMVRMWElVREVxcDg4dWdsWmRFTVcrNU9k
1192) aE5ZbXEzZERWVWV4UnJpM1AwUmVBSi9KMGdJNkNoUUE9PVBLAwQKAAAAAADOjUlZTNfdphcCAAAX
1193) AgAAAgAAADBmeyJ2ZXJzaW9uIjoxfQpBWVJqOVpIUktGUEVKOHM2YVY2TkRoTk5jQlZ5cGVYUmdz
1194) cnBldFQ0cGhJRGROWFdGYzRia0daYkJxMngwRDFkcVNjYWk5UzEveDZ2K28zRE0rVEF2OVE3ZFVR
1195) QWVKR3RmRkhJZDZxWW0ybEdNSnF5WTRNWm14aE9YdXliend0V3Q4Mnhvb041QTZNcWpINmxKQllD
1196) UUN3ZEJjb3RER0EwRnlnVTEzeHV2WnIzT1puZnFFRGRqbzMxNkw5aExDN1RxMTYwUHpBOXJOSDMz
1197) ZkNBcUhIVXZiYlFQQWErekw1d3dEN3FlWkY2MHdJaEwvRmk5L3JhNGJDcHZRNC9ORWpRd3c9PQpB
1198) WWNGUDB1Y2xMMHh3ZDM2UXZXbm4wWXFsOU5WV0s3c05CMTdjdmM3N3VDZ0J2OE9XYkR5UHk5d05h
1199) R2NQQzdzcVdZdHpZRlBHR0taVjhVUzA1YTVsV1BabDNGVFNuQXNtekxPelBlcFZxaitleDU3aEsx
1200) QnV1bHkrUCtYQkE0YUtsaDM3c0RJL3I0UE1BVlJuMDNoSDJ5dEhDMW9PbjF0V1M5Q1NLV1pSMThh
1201) djdTT0RBMVBNRnFYTmZKZVNTaVJiQ2htbDdOcFVLbjlXSGJZandybDlqN0JSdy9kWjhNQldCb3Ns
1202) Nlc1dGZtdnJMVHhGRFBXYUgzSUp0T0czMEI1M3c9PVBLAwQKAAAAAADOjUlZn9rNID8CAAA/AgAA
1203) AgAAADFkeyJ2ZXJzaW9uIjoxfQpBYWFBb3lqaGljVDZ4eXh1c0U0RVlDZCtxbE81Z0dEYTBNSFVS
1204) MmgrSW9QMHV4UkY3b1BRS2czOHlQUEN3Ny9MYVJLQ0dQZ0RyZ2RpTWJTeUwzZ3ZNMFhseVpVMVBW
1205) QVJvNEFETU9lbXgrOWhtS0hjQWNKMG5EeW5oSkhGYTYyb2xyQUNxekZzblhKNVBSeEVTVzVEbUh0
1206) Ui9nRm5Wa1FvalhyVW4ybmpYMjVVanZQaXhlMU96Y0daMmQ0MjdVTGdnY1hqMkhSdjJiZldDNDUw
1207) SGFXS3FDckZlYWlrQ2xkUUM2WGV3SkxZUjdvQUY3UjVha2ttK3M2MXNCRTVCaTg0QmJLWHluc1NG
1208) ejE0TXFrd2JMK1VMYVk9CkFUT3dqTUFpa3Q4My9NTW5KRXQ2b3EyNFN4KzJKNDc2K2gyTmEzbHUr
1209) MDg0cjlBT25aaUk0TmlYV0N1Q0lzakEzcTBwUHFJS1VXZHlPQW9uM2VHY0huZUppWUtVYllBaUJI
1210) MVNmbnhQQkMzZkFMRklybkQ4Y0VqeGpPcUFUaTQ5dE1mRmtib0dNQ3dEdFY0V3NJL0tLUlRCOFd1
1211) MnNXK2J0V3QzVWlvZG9ZeUVLTDk3ekNNemZqdGptejF4SDhHTXY5WDVnaG9NSW5RQVNvYlRreVZ4
1212) dWo5YnlDazdNbU0vK21ZL3AwZE9oYVY0Nncwcm04UGlvWEtzdzR4bXB3ditDWC9PRXV3Uy9meDJT
1213) Y0lOQnNuYVRiWT1QSwECHgMKAAAAAADOjUlZq3B3VeYAAADmAAAABQAAAAAAAAAAAAAApIEAAAAA
1214) LmtleXNQSwECHgMKAAAAAADOjUlZJg3/BhcCAAAXAgAAAgAAAAAAAAAAAAAApIEJAQAAMGJQSwEC
1215) HgMKAAAAAADOjUlZTNfdphcCAAAXAgAAAgAAAAAAAAAAAAAApIFAAwAAMGZQSwECHgMKAAAAAADO
1216) jUlZn9rNID8CAAA/AgAAAgAAAAAAAAAAAAAApIF3BQAAMWRQSwUGAAAAAAQABADDAAAA1gcAAAAA
1217) """
1218) 
1219) _VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED3_JAVASCRIPT_SOURCE = """
1220) // Executed in the top-level directory of the vault project code, in Node.js.
1221) const storeroom = require('storeroom')
1222) const Store = require('./lib/store.js')
1223) let store = new Store(storeroom.createFileAdapter('./broken-dir'), 'vault key')
1224) await store._storeroom.put('/services/array/', [null, 1, true, [], {}])
1225) // The resulting "broken-dir" was then zipped manually.
1226) """
1227) VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED3 = b"""
1228) UEsDBAoAAAAAAEOPSVnVlcff5gAAAOYAAAAFAAAALmtleXN7InZlcnNpb24iOjF9CkV4dVBHUDBi
1229) YkxrUVdvWnV5ZUJQRy8xdmM2MCt6MThOa3BsS09ydFAvUTVnQmxkYVpIOG10dTE5VWZFNGdGRGRj
1230) eHJtWUd4eXZDZFNqcVlOaDh4cTlzM3VydkdRTWFwcnhtdlZGZUxoSW4zZnVlTDAweEk0ZmlLenZN
1231) MmthUlRsNWNORGh3eUNlWVk4dzhBcXNhYjNyVWVsOEE0eVQ0cHU2d2tmQ3dTWUdqeG5HR29EcWJK
1232) VnVJVWNpZVBEcU9PTzU2b0MyMG9lT01adFVkTUtxV28zYnFZPVBLAwQKAAAAAABDj0lZ77OVHxcC
1233) AAAXAgAAAgAAADBjeyJ2ZXJzaW9uIjoxfQpBZllFQVVobEkyU2lZeGlrdWh0RzRNbUN3L1V2THBN
1234) VVhwVlB0NlRwdzRyNGdocVJhbGZWZ0hxUHFtbTczSnltdFFrNnZnR2JRdUpiQmVlYjYwOHNrMGk4
1235) ZFJVZjNwdlc2SnUyejljQkdwOG5mTFpTdlNad1lLN09UK2gzSDNDcmoxbXNicEZUcHVldW81NXc1
1236) dGdYMnBuWXNWTVcrczdjaHEyMUIya2lIVEZrdGt1MXlaRzhPYkVUQjNCOFNGODVVbi9CUjFEMHJ1
1237) ME9zOWl4ZWM2VmNTMitTZndtNnNtSlk2ZW9ZNTJzOGJNRGdYMndjQ0srREdkOEo2VWp0NG5OQVE9
1238) PQpBUWlPRnRZcmJybWUycEwxRFpGT1BjU0RHOUN2cVkvbHhTWGIwaVJUdmtIWFc2bEtHL0p4RUtU
1239) d3RTc0RTeDhsMTUvaHRmbWpOQ2tuTzhLVEFoKzhRQm5FbjZ0a2x5Y3BmeEIrTUxLRjFCM1Q1bjcv
1240) T0VUMExMdmgxU2k1bnRRNXhTUHZZNWtXeUMyZjhXUXFZb3FSNU5JVENMeDV6dWNsQ3dGb2kvVXc4
1241) OWNNWjM1MHBSbThzUktJbjJFeDUrQ1JwS3ZHdnBHbFJaTmk5VHZmVkNic1FCalR3MC9aeklTdzVQ
1242) NW9BVWE2U1ExUVFnNHg4VUNkY0s2QUNLaFluY0d4TVE9PVBLAwQKAAAAAABDj0lZGk9LVj8CAAA/
1243) AgAAAgAAADE0eyJ2ZXJzaW9uIjoxfQpBY1g2NVpMUWk4ck9pUlIyWGEwQlFHQVhQVWF2aHNJVGVY
1244) c2dzRk9OUmFTRzJCQlg0SGxJRHpwRUd5aDUrZ2czZVRwWDFNOERua3pMeTVzcWRkMFpmK3padTgz
1245) Qm52Y1JPREVIVDllUW91YUtPTWltdlRYanNuSXAxUHo5VGY1TlRkRjNJVTd2V1lhUDg4WTI5NG1i
1246) c1VVL2RKVTZqZ3ZDbUw2cE1VZ28xUU12bGJnaVp3cDV1RDFQZXlrSXdKVWdJSEgxTEpnYi9xU2tW
1247) c25leW1XY1RXR0NobzRvZGx3S2hJWmFCelhvNFhlN2U1V2I2VHA3Rkk5VUpVcmZIRTAvcVdrZUZE
1248) VmxlazY3cUx3ZFZXcU9DdFk9CkFhSGR0QjhydmQ0U3N4ZmJ5eU1OOHIzZEoxeHA5NmFIRTQvalNi
1249) Z05hZWttaDkyb2ROM1F4MUlqYXZsYVkxeEt1eFF3KzlwTHFIcTF5a1JSRjQzL2RVWGFIRk5UU0NX
1250) OVFsdmd3KzMwa1ZhSEdXRllvbFRnRWE4djQ3b3VrbGlmc01PZGM0YVNKb2R4ZUFJcVc3Q1cwdDVR
1251) b2RUbWREUXpqc3phZkQ4R2VOd2NFQjdGMHI2RzNoZEJlQndxd3Z6eENVYnpSUmU5bEQ3NjQ3RFp1
1252) bEo1U3c4amlvV0paTW40NlZhV3BYUXk4UnNva3hHaW00WUpybUZIQ2JkVU9qSWJsUmQ1Z3VhUDNU
1253) M0NxeHRPdC94b1BhOD1QSwMECgAAAAAAQ49JWVJM8QYXAgAAFwIAAAIAAAAxNnsidmVyc2lvbiI6
1254) MX0KQVlCWDF6M21qUlQrand4M2FyNkFpemxnalJZbUM0ZHg5NkxVQVBTVHNMWXJKVHFtWnd5N0Jy
1255) OFlCcElVamorMHdlT3lNaUtLVnFwaER3RXExNWFqUmlSZUVEQURTVHZwWmlLZUlnZjR5elUzZXNP
1256) eDJ2U2J1bXhTK0swUGZVa2tsSy9TRmRiU3EvUHFMRjBDRTVCMXNyKzJLYTB2WlJmak94R3VFeFRD
1257) RXozN0ZlWDNNR3NCNkhZVHEzaUJWcUR6NVB6eHpCWWM5Kyt6RitLS1RnMVp2NGRtRmVQTC9JSEY5
1258) WnV6TWlqRXdCRkE3WnJ0dkRqd3ZYcWtsMVpsR0c4eUV3PT0KQVhUWkRLVnNleldpR1RMUVZqa2hX
1259) bXBnK05MYlM0M2MxZEpvK2xGcC9yWUJYZkw3Wll5cGdjWE5IWXNzd01nc2VSSTAzNmt6bGZkdGNa
1260) bTdiUUN6M2JuQmZ6ZlorZFFuT2Y5STVSU2l0QzB2UmsydkQrOFdwbmRPSzNucGY5S0VpWklOSzVq
1261) TEZGTTJDTkNmQzBabXNRUlF3T0k2N3l5ZHhjVnFDMXBnWHV6QXRXamlsSUpnN0p6eUtsY3BJUGJu
1262) SUc0UzRSUlhIdW1wZnpoeWFZWkd6T0FDamRSYTZIMWJxYkJkZXFaSHMvQXJvM25mVjdlbjhxSUE5
1263) aVUrbnNweXFnPT1QSwECHgMKAAAAAABDj0lZ1ZXH3+YAAADmAAAABQAAAAAAAAAAAAAApIEAAAAA
1264) LmtleXNQSwECHgMKAAAAAABDj0lZ77OVHxcCAAAXAgAAAgAAAAAAAAAAAAAApIEJAQAAMGNQSwEC
1265) HgMKAAAAAABDj0lZGk9LVj8CAAA/AgAAAgAAAAAAAAAAAAAApIFAAwAAMTRQSwECHgMKAAAAAABD
1266) j0lZUkzxBhcCAAAXAgAAAgAAAAAAAAAAAAAApIGfBQAAMTZQSwUGAAAAAAQABADDAAAA1gcAAAAA
1267) """
1268) 
1269) _VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED4_JAVASCRIPT_SOURCE = """
1270) // Executed in the top-level directory of the vault project code, in Node.js.
1271) const storeroom = require('storeroom')
1272) const Store = require('./lib/store.js')
1273) let store = new Store(storeroom.createFileAdapter('./broken-dir'), 'vault key')
1274) await store._storeroom.put('/dir/subdir/', [])
1275) await store._storeroom.put('/dir/', [])
1276) // The resulting "broken-dir" was then zipped manually.
1277) """
1278) VAULT_STOREROOM_BROKEN_DIR_CONFIG_ZIPPED4 = b"""
1279) UEsDBAoAAAAAAE+5SVloORS+5gAAAOYAAAAFAAAALmtleXN7InZlcnNpb24iOjF9CkV6dWRoNkRQ
1280) YTlNSWFabHZ5TytVYTFuamhjV2hIaTFBU0lKYW5zcXBxVlA0blN2V0twUzdZOUc2bjFSbi8vUnVM
1281) VitwcHp5SC9RQk83R0hFenNVMzdCUzFwUmVVeGhxUVlVTE56OXZvQ0crM1ZaL3VncU44dDJiU05m
1282) Nyt5K3hiNng2aVlFUmNZYTJ0UkhzZVdIc0laTE9ha2lDb0lRVGV3cndwYjVMM2pnd0E3SXBzaDkz
1283) QkxHSzM5dXNYNmo0R0I2WkRUeW5JcGk4V3JkbDhnWVZCN0tVPVBLAwQKAAAAAABPuUlZ663uUhcC
1284) AAAXAgAAAgAAADAzeyJ2ZXJzaW9uIjoxfQpBV2wzS2gzd21ZSFVZZU1RR3BLSVowdVd1VXFna09h
1285) YmRjNzNYYXVsZTNtVS9sN2Zvd1AyS21jbFp3ZDM5V3lYVzRTcEw4R0l4YStDZW51S3V0Wm5nb0FR
1286) bWlnaUJUbkFaais5TENCcGNIWlZNY2RBVkgxKzBFNGpsanZ1UkVwZ0tPS05LZjRsTUl1QnZ4VmFB
1287) ZkdwNHJYNEZ4MmpPSlk1Y3NQZzBBRFBoZVAwN29GWVQ3alorSUNEK1AxNGZPdWpwMGRUeDRrTDIy
1288) LzlqalRDNXBCNVF5NW5iOUx3Zk5DUWViSUVpaTZpbU0vRmFrK1dtV05tMndqMERSTEc4RHY3ZkE9
1289) PQpBU0c3NTNGTVVwWmxjK3E1YXRzcC93OUNqN2JPOFlpY24wZHg2UGloTmwzUS9WSjVVeGJmU3l0
1290) ZDFDNDBRU2xXeTJqOTJDWUd3VER6eEdBMXVnb0FCYi9kTllTelVwbHJFb3BuUVphYXdsdTVwV2x0
1291) Y1E5WTcveWN4S2E4b0JaaGY3RkFYcGo2c01wUW9zNzI5VFVabFd4UmI4VFRtN2FrVnR1OXcvYXlK
1292) RS9reDh4ZUYxSGJlc3Q4N1IxTGg2ODd3dS9XVUN2ZjNXYXo1VjNnZWY0RnpUTXg0bkpqSlZOd0U0
1293) SzAxUTlaVzQ0bmVvbExPUVI1MkZDeDZvbml3RW9tenc9PVBLAwQKAAAAAABPuUlZRXky4CsCAAAr
1294) AgAAAgAAADEweyJ2ZXJzaW9uIjoxfQpBWmlYWVlvNUdCY2d5dkFRaGtyK2ZjUkdVSkdabDd2dE5w
1295) T2Mrd1VzbXJhQWhRN3dKdlYraGhKcTlrcWNKQnBWU0gyUTBTTVVhb29iNjBJM1NYNUNtTkJRU2FH
1296) M3prd0Y0T2F4TnpCZUh0NFlpaDd4Y3p2ak4xR0hISDJQYW0xam05K09ja3JLVmNMVURtNXRKb2ZC
1297) Z1E4Q2NwMGZMVkdEaURjNWF0MjVMc2piQVcvNkZFSnJ5VVBHWis4UVdYRmlWMGdtVVZybVc3VUFy
1298) dGhJQitWNTdZS1BORi95Nng2OU43UTFQbmp1cUczdlpybzljMEJ3d012NWoyc3BMMTJHcTdzTDZE
1299) alB1d0dHbnB2MkVZQTFLbmc9CkFTdjQwUkgzRmxzbGVlU1NjRlZNRmh3dEx6eEYxK2xpcmxEL29X
1300) alJLQ05qVWZhUVpJTWpqMWRoVkhOakNUTWhWZ1ZONkl3b04xTnFOMEV6cmdhaTFBWnNiMm9UczYw
1301) QkI1UGh0U0hhQ2U2WllUeE1JemFPS2FIK0w2eHhtaXIrTlQxNTRXS0x5amJMams3MU1na3Nwa0Yy
1302) WDBJMnlaWW5IUUM0bmdEL24yZzRtSVI2Q1hWL0JOUXNzeTBEeXdGLzN6eGRRYWw5cFBtVk1qYnFu
1303) cHY5SFNqRTg4S25naVpBWFhJWU1OVGF2L3Q3Y3dEWGdNekhKTlU0Y2xnVUtIQVZ3QT09UEsDBAoA
1304) AAAAAE+5SVkPfKx9FwIAABcCAAACAAAAMWR7InZlcnNpb24iOjF9CkFYbHNLRzQwZG5ibTJvcXdY
1305) U2ZrSWp3Mmxpa0lDS3hVOXU3TU52VkZ1NEJ2R1FVVitSVVdsS3MxL25TSlBtM2U2OTRvVHdoeDFo
1306) RFF3U0M5U0QvbXd5bnpjSTloUnRCUWVXMkVMOVU5L1ZGcHFsVWY3Z1ZOMHZ0ZWpXYnV4QnhsZlRD
1307) Tys4SFBwU2Zaa2VOUld5R2JNdzBFSU9LTmxRYjk3OUF0c1g3THR0NytaTkJnakZHYkZxaHdwa3kx
1308) WUNDVng1UmNZZ2tma2ZjWnVncGpzc1RzNVFvK1p3QXBEcDZ4V3JjSHMxUDhvNktBRzAwcjZZbkNM
1309) N2ErU1dwZmVNTUJhZz09CkFadVF0cFZMWmVvb292NkdyQlpnb3B6VmRGUXBlK1h6QXZuZ2dPVnZM
1310) VWtCYVF2akl5K1VLdXVUVlFoQ1JiMVp6dGZQL2dsNnoxOEsyZW5sQlo2bGJTZnoxTlBWeUVzYXB3
1311) dDVpUVh4azd5UkJlZks1cFlsNTduUXlmcFZQbzlreFpnOVdHTkV3NVJ5MkExemhnNGl6TWxLRmJh
1312) UjZFZ0FjQ3NFOXAveGRLa29ZNjhOUlZmNXJDM3lMQjc3ZWgyS1hCUld2WDNZcE9XdW00OGtsbmtI
1313) akJjMFpiQmUrT3NZb3d5cXpoRFA2ZGQxRlFnMlFjK09vc3B4V0sycld4M01HZz09UEsBAh4DCgAA
1314) AAAAT7lJWWg5FL7mAAAA5gAAAAUAAAAAAAAAAAAAAKSBAAAAAC5rZXlzUEsBAh4DCgAAAAAAT7lJ
1315) Weut7lIXAgAAFwIAAAIAAAAAAAAAAAAAAKSBCQEAADAzUEsBAh4DCgAAAAAAT7lJWUV5MuArAgAA
1316) KwIAAAIAAAAAAAAAAAAAAKSBQAMAADEwUEsBAh4DCgAAAAAAT7lJWQ98rH0XAgAAFwIAAAIAAAAA
1317) AAAAAAAAAKSBiwUAADFkUEsFBgAAAAAEAAQAwwAAAMIHAAAAAA==
1318) """
1319) 
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1320) CANNOT_LOAD_CRYPTOGRAPHY = (
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1321)     'Cannot load the required Python module "cryptography".'
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1322) )
1323) 
Marco Ricci Test exporter data loading...

Marco Ricci authored 4 months ago

1324) skip_if_cryptography_support = pytest.mark.skipif(
1325)     importlib.util.find_spec('cryptography') is not None,
1326)     reason='cryptography support available; cannot test "no support" scenario',
1327) )
1328) skip_if_no_cryptography_support = pytest.mark.skipif(
1329)     importlib.util.find_spec('cryptography') is None,
1330)     reason='no "cryptography" support',
1331) )
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1332) 
Marco Ricci Actually correctly implemen...

Marco Ricci authored 4 weeks ago

1333) 
1334) def hypothesis_settings_coverage_compatible(
1335)     f: Any = None,
1336) ) -> Any:
1337)     settings = (
1338)         hypothesis.settings(
1339)             # Running under coverage with the Python tracer increases
1340)             # running times 40-fold, on my machines.  Sadly, not every
1341)             # Python version offers the C tracer, so sometimes the Python
1342)             # tracer is used anyway.
1343)             deadline=(
1344)                 40 * deadline
1345)                 if (deadline := hypothesis.settings().deadline) is not None
1346)                 else None
1347)             ),
1348)             stateful_step_count=32,
1349)             suppress_health_check=(hypothesis.HealthCheck.too_slow,),
1350)         )
1351)         if sys.gettrace() is not None
1352)         else hypothesis.settings()
Marco Ricci Centralize settings for hyp...

Marco Ricci authored 3 months ago

1353)     )
Marco Ricci Actually correctly implemen...

Marco Ricci authored 4 weeks ago

1354)     return settings if f is None else settings(f)
Marco Ricci Centralize settings for hyp...

Marco Ricci authored 3 months ago

1355) 
Marco Ricci Actually correctly implemen...

Marco Ricci authored 4 weeks ago

1356) 
1357) def hypothesis_settings_coverage_compatible_with_caplog(
1358)     f: Any = None,
1359) ) -> Any:
1360)     parent_settings = hypothesis_settings_coverage_compatible()
1361)     settings = hypothesis.settings(
1362)         parent=parent_settings,
1363)         suppress_health_check={
1364)             hypothesis.HealthCheck.function_scoped_fixture,
1365)         }
1366)         | set(parent_settings.suppress_health_check),
1367)     )
1368)     return settings if f is None else settings(f)
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

1369) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1370) 
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1371) def list_keys(self: Any = None) -> list[_types.KeyCommentPair]:
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

1372)     del self  # Unused.
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1373)     Pair = _types.KeyCommentPair  # noqa: N806
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1374)     list1 = [
1375)         Pair(value['public_key_data'], f'{key} test key'.encode('ASCII'))
1376)         for key, value in SUPPORTED_KEYS.items()
1377)     ]
1378)     list2 = [
1379)         Pair(value['public_key_data'], f'{key} test key'.encode('ASCII'))
1380)         for key, value in UNSUITABLE_KEYS.items()
1381)     ]
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1382)     return list1 + list2
1383) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1384) 
Marco Ricci Align behavior with vault c...

Marco Ricci authored 3 months ago

1385) def sign(
1386)     self: Any, key: bytes | bytearray, message: bytes | bytearray
1387) ) -> bytes:
1388)     del self  # Unused.
1389)     assert message == vault.Vault._UUID
1390)     for value in SUPPORTED_KEYS.values():
1391)         if value['public_key_data'] == key:  # pragma: no branch
1392)             assert value['expected_signature'] is not None
1393)             return value['expected_signature']
1394)     raise AssertionError
1395) 
1396) 
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1397) def list_keys_singleton(self: Any = None) -> list[_types.KeyCommentPair]:
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

1398)     del self  # Unused.
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1399)     Pair = _types.KeyCommentPair  # noqa: N806
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1400)     list1 = [
1401)         Pair(value['public_key_data'], f'{key} test key'.encode('ASCII'))
1402)         for key, value in SUPPORTED_KEYS.items()
1403)     ]
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1404)     return list1[:1]
1405) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1406) 
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1407) def suitable_ssh_keys(conn: Any) -> Iterator[_types.KeyCommentPair]:
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

1408)     del conn  # Unused.
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1409)     Pair = _types.KeyCommentPair  # noqa: N806
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1410)     yield from [
Marco Ricci Move `sequin` and `ssh_agen...

Marco Ricci authored 5 months ago

1411)         Pair(DUMMY_KEY1, b'no comment'),
1412)         Pair(DUMMY_KEY2, b'a comment'),
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1413)     ]
1414) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1415) 
Marco Ricci Fix user interface errors i...

Marco Ricci authored 3 weeks ago

1416) def phrase_from_key(
1417)     key: bytes,
1418)     /,
1419)     *,
1420)     conn: ssh_agent.SSHAgentClient | socket.socket | None = None,
1421) ) -> bytes:
1422)     del conn
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1423)     if key == DUMMY_KEY1:  # pragma: no branch
1424)         return DUMMY_PHRASE_FROM_KEY1
1425)     raise KeyError(key)  # pragma: no cover
1426) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1427) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1428) @contextlib.contextmanager
1429) def isolated_config(
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1430)     monkeypatch: pytest.MonkeyPatch,
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1431)     runner: click.testing.CliRunner,
Marco Ricci Introduce a central user co...

Marco Ricci authored 3 weeks ago

1432)     main_config_str: str | None = None,
Marco Ricci Fix typing issues in mypy s...

Marco Ricci authored 5 months ago

1433) ) -> Iterator[None]:
Marco Ricci Consolidate `types` submodu...

Marco Ricci authored 5 months ago

1434)     prog_name = cli.PROG_NAME
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1435)     env_name = prog_name.replace(' ', '_').upper() + '_PATH'
Marco Ricci Refactor code to run under...

Marco Ricci authored 1 month ago

1436)     # Use parenthesized context manager expressions once Python 3.9
1437)     # becomes unsupported.
1438)     with contextlib.ExitStack() as stack:
1439)         stack.enter_context(runner.isolated_filesystem())
1440)         stack.enter_context(cli.StandardCLILogging.ensure_standard_logging())
1441)         stack.enter_context(
1442)             cli.StandardCLILogging.ensure_standard_warnings_logging()
1443)         )
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1444)         monkeypatch.setenv('HOME', os.getcwd())
1445)         monkeypatch.setenv('USERPROFILE', os.getcwd())
1446)         monkeypatch.delenv(env_name, raising=False)
Marco Ricci Rename the configuration fi...

Marco Ricci authored 3 months ago

1447)         config_dir = cli._config_filename(subsystem=None)
1448)         os.makedirs(config_dir, exist_ok=True)
Marco Ricci Introduce a central user co...

Marco Ricci authored 3 weeks ago

1449)         if isinstance(main_config_str, str):
1450)             with open(
1451)                 cli._config_filename('user configuration'),
1452)                 'w',
1453)                 encoding='UTF-8',
1454)             ) as outfile:
1455)                 outfile.write(main_config_str)
Marco Ricci Modularize test helpers to...

Marco Ricci authored 3 months ago

1456)         yield
1457) 
1458) 
1459) @contextlib.contextmanager
1460) def isolated_vault_config(
1461)     monkeypatch: pytest.MonkeyPatch,
1462)     runner: click.testing.CliRunner,
Marco Ricci Introduce a central user co...

Marco Ricci authored 3 weeks ago

1463)     vault_config: Any,
1464)     main_config_str: str | None = None,
Marco Ricci Modularize test helpers to...

Marco Ricci authored 3 months ago

1465) ) -> Iterator[None]:
Marco Ricci Introduce a central user co...

Marco Ricci authored 3 weeks ago

1466)     with isolated_config(
1467)         monkeypatch=monkeypatch, runner=runner, main_config_str=main_config_str
1468)     ):
Marco Ricci Rename the configuration fi...

Marco Ricci authored 3 months ago

1469)         config_filename = cli._config_filename(subsystem='vault')
1470)         with open(config_filename, 'w', encoding='UTF-8') as outfile:
Marco Ricci Introduce a central user co...

Marco Ricci authored 3 weeks ago

1471)             json.dump(vault_config, outfile)
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1472)         yield
1473) 
Marco Ricci Reformat everything with ruff

Marco Ricci authored 5 months ago

1474) 
Marco Ricci Add preliminary tests for t...

Marco Ricci authored 4 months ago

1475) @contextlib.contextmanager
1476) def isolated_vault_exporter_config(
1477)     monkeypatch: pytest.MonkeyPatch,
1478)     runner: click.testing.CliRunner,
1479)     vault_config: str | bytes | None = None,
1480)     vault_key: str | None = None,
1481) ) -> Iterator[None]:
1482)     if TYPE_CHECKING:
1483)         chdir = contextlib.chdir
1484)     else:
1485)         try:
1486)             chdir = contextlib.chdir
1487)         except AttributeError:
1488) 
1489)             @contextlib.contextmanager
Marco Ricci Move exporter command-line...

Marco Ricci authored 4 months ago

1490)             def chdir(newpath: str) -> Iterator[None]:  # pragma: no branch
Marco Ricci Add preliminary tests for t...

Marco Ricci authored 4 months ago

1491)                 oldpath = os.getcwd()
1492)                 os.chdir(newpath)
1493)                 yield
1494)                 os.chdir(oldpath)
1495) 
1496)     with runner.isolated_filesystem():
1497)         monkeypatch.setenv('HOME', os.getcwd())
1498)         monkeypatch.setenv('USERPROFILE', os.getcwd())
1499)         monkeypatch.delenv('VAULT_PATH', raising=False)
1500)         monkeypatch.delenv('VAULT_KEY', raising=False)
1501)         monkeypatch.delenv('LOGNAME', raising=False)
1502)         monkeypatch.delenv('USER', raising=False)
1503)         monkeypatch.delenv('USERNAME', raising=False)
1504)         if vault_key is not None:
1505)             monkeypatch.setenv('VAULT_KEY', vault_key)
Marco Ricci Add support for Python 3.9

Marco Ricci authored 3 months ago

1506)         # Use match/case here once Python 3.9 becomes unsupported.
1507)         if isinstance(vault_config, str):
1508)             with open('.vault', 'w', encoding='UTF-8') as outfile:
1509)                 print(vault_config, file=outfile)
1510)         elif isinstance(vault_config, bytes):
1511)             os.makedirs('.vault', mode=0o700, exist_ok=True)
Marco Ricci Refactor code to run under...

Marco Ricci authored 1 month ago

1512)             # Use parenthesized context manager expressions here once
1513)             # Python 3.9 becomes unsupported.
1514)             with contextlib.ExitStack() as stack:
1515)                 stack.enter_context(chdir('.vault'))
1516)                 tmpzipfile = stack.enter_context(
1517)                     tempfile.NamedTemporaryFile(suffix='.zip')
1518)                 )
Marco Ricci Add support for Python 3.9

Marco Ricci authored 3 months ago

1519)                 for line in vault_config.splitlines():
1520)                     tmpzipfile.write(base64.standard_b64decode(line))
1521)                 tmpzipfile.flush()
1522)                 tmpzipfile.seek(0, 0)
1523)                 with zipfile.ZipFile(tmpzipfile.file) as zipfileobj:
1524)                     zipfileobj.extractall()
1525)         elif vault_config is None:
1526)             pass
1527)         else:  # pragma: no cover
1528)             assert_never(vault_config)
Marco Ricci Add preliminary tests for t...

Marco Ricci authored 4 months ago

1529)         yield
1530) 
1531) 
Marco Ricci Rename and regroup all test...

Marco Ricci authored 6 months ago

1532) def auto_prompt(*args: Any, **kwargs: Any) -> str:
Marco Ricci Fix style issues with ruff...

Marco Ricci authored 5 months ago

1533)     del args, kwargs  # Unused.
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1534)     return DUMMY_PASSPHRASE
Marco Ricci Add missing tests for rewor...

Marco Ricci authored 4 months ago

1535) 
1536) 
1537) def make_file_readonly(
1538)     pathname: str | bytes | os.PathLike[str],
1539)     /,
1540)     *,
1541)     try_race_free_implementation: bool = True,
1542) ) -> None:
1543)     """Mark a file as read-only.
1544) 
1545)     On POSIX, this entails removing the write permission bits for user,
1546)     group and other, and ensuring the read permission bit for user is
1547)     set.
1548) 
1549)     Unfortunately, Windows has its own rules: Set exactly(?) the read
1550)     permission bit for user to make the file read-only, and set
1551)     exactly(?) the write permission bit for user to make the file
1552)     read/write; all other permission bit settings are ignored.
1553) 
1554)     The cross-platform procedure therefore is:
1555) 
1556)     1. Call `os.stat` on the file, noting the permission bits.
1557)     2. Calculate the new permission bits POSIX-style.
1558)     3. Call `os.chmod` with permission bit `stat.S_IREAD`.
1559)     4. Call `os.chmod` with the correct POSIX-style permissions.
1560) 
1561)     If the platform supports it, we use a file descriptor instead of
1562)     a path name.  Otherwise, we use the same path name multiple times,
1563)     and are susceptible to race conditions.
1564) 
1565)     """
1566)     fname: int | str | bytes | os.PathLike[str]
1567)     if try_race_free_implementation and {os.stat, os.chmod} <= os.supports_fd:
1568)         fname = os.open(
1569)             pathname,
1570)             os.O_RDONLY
1571)             | getattr(os, 'O_CLOEXEC', 0)
1572)             | getattr(os, 'O_NOCTTY', 0),
1573)         )
1574)     else:
1575)         fname = pathname
1576)     try:
1577)         orig_mode = os.stat(fname).st_mode
1578)         new_mode = (
1579)             orig_mode & ~stat.S_IWUSR & ~stat.S_IWGRP & ~stat.S_IWOTH
1580)             | stat.S_IREAD
1581)         )
1582)         os.chmod(fname, stat.S_IREAD)
1583)         os.chmod(fname, new_mode)
1584)     finally:
1585)         if isinstance(fname, int):
1586)             os.close(fname)
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1587) 
1588) 
1589) class ReadableResult(NamedTuple):
1590)     """Helper class for formatting and testing click.testing.Result objects."""
1591) 
1592)     exception: BaseException | None
1593)     exit_code: int
1594)     output: str
1595)     stderr: str
1596) 
1597)     @classmethod
1598)     def parse(cls, r: click.testing.Result, /) -> Self:
1599)         try:
1600)             stderr = r.stderr
1601)         except ValueError:
1602)             stderr = r.output
1603)         return cls(r.exception, r.exit_code, r.output or '', stderr or '')
1604) 
1605)     def clean_exit(
1606)         self, *, output: str = '', empty_stderr: bool = False
1607)     ) -> bool:
1608)         """Return whether the invocation exited cleanly.
1609) 
1610)         Args:
1611)             output:
1612)                 An expected output string.
1613) 
1614)         """
1615)         return (
1616)             (
1617)                 not self.exception
1618)                 or (
1619)                     isinstance(self.exception, SystemExit)
1620)                     and self.exit_code == 0
1621)                 )
1622)             )
1623)             and (not output or output in self.output)
1624)             and (not empty_stderr or not self.stderr)
1625)         )
1626) 
1627)     def error_exit(
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

1628)         self,
1629)         *,
1630)         error: str | re.Pattern[str] | type[BaseException] = BaseException,
1631)         record_tuples: Sequence[tuple[str, int, str]] = (),
Marco Ricci Clean up testing machinery...

Marco Ricci authored 4 months ago

1632)     ) -> bool:
1633)         """Return whether the invocation exited uncleanly.
1634) 
1635)         Args:
1636)             error:
1637)                 An expected error message, or an expected numeric error
1638)                 code, or an expected exception type.
1639) 
1640)         """
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

1641) 
1642)         def error_match(error: str | re.Pattern[str], line: str) -> bool:
1643)             return (
1644)                 error in line
1645)                 if isinstance(error, str)
1646)                 else error.match(line) is not None
1647)             )
1648) 
Marco Ricci Add support for Python 3.9

Marco Ricci authored 3 months ago

1649)         # Use match/case here once Python 3.9 becomes unsupported.
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

1650)         if isinstance(error, type):
1651)             return isinstance(self.exception, error)
1652)         else:  # noqa: RET505
1653)             assert isinstance(error, (str, re.Pattern))
Marco Ricci Add support for Python 3.9

Marco Ricci authored 3 months ago

1654)             return (
1655)                 isinstance(self.exception, SystemExit)
1656)                 and self.exit_code > 0
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

1657)                 and (
1658)                     not error
1659)                     or any(
1660)                         error_match(error, line)
1661)                         for line in self.stderr.splitlines(True)
1662)                     )
1663)                     or error_emitted(error, record_tuples)
1664)                 )
Marco Ricci Add support for Python 3.9

Marco Ricci authored 3 months ago

1665)             )
Marco Ricci Add test fixture for manual...

Marco Ricci authored 3 months ago

1666) 
1667) 
1668) def parse_sh_export_line(line: str, *, env_name: str) -> str:
1669)     line = line.rstrip('\r\n')
1670)     shlex_parser = shlex.shlex(
1671)         instream=line, posix=True, punctuation_chars=True
1672)     )
1673)     shlex_parser.whitespace = ' \t'
1674)     tokens = list(shlex_parser)
1675)     orig_tokens = tokens.copy()
1676)     if tokens[-1] == ';':
1677)         tokens.pop()
1678)     if tokens[-3:] == [';', 'export', env_name]:
1679)         tokens[-3:] = []
1680)         tokens[:0] = ['export']
1681)     if not (
1682)         len(tokens) == 2
1683)         and tokens[0] == 'export'
1684)         and tokens[1].startswith(f'{env_name}=')
1685)     ):
1686)         msg = f'Cannot parse sh line: {orig_tokens!r} -> {tokens!r}'
1687)         raise ValueError(msg)
1688)     return tokens[1].split('=', 1)[1]
Marco Ricci Adapt the test suite to use...

Marco Ricci authored 1 month ago

1689) 
1690) 
1691) def message_emitted_factory(
1692)     level: int,
1693)     *,
1694)     logger_name: str = cli.PROG_NAME,
1695) ) -> Callable[[str | re.Pattern[str], Sequence[tuple[str, int, str]]], bool]:
1696)     """Return a function to test if a matching message was emitted.
1697) 
1698)     Args:
1699)         level: The level to match messages at.
1700)         logger_name: The name of the logger to match against.
1701) 
1702)     """
1703) 
1704)     def message_emitted(
1705)         text: str | re.Pattern[str],
1706)         record_tuples: Sequence[tuple[str, int, str]],
1707)     ) -> bool:
1708)         """Return true if a matching message was emitted.
1709) 
1710)         Args:
1711)             text: Substring or pattern to match against.
1712)             record_tuples: Items to match.
1713) 
1714)         """
1715) 
1716)         def check_record(record: tuple[str, int, str]) -> bool:
1717)             if record[:2] != (logger_name, level):
1718)                 return False
1719)             if isinstance(text, str):
1720)                 return text in record[2]
1721)             return text.match(record[2]) is not None  # pragma: no cover
1722) 
1723)         return any(map(check_record, record_tuples))
1724) 
1725)     return message_emitted
1726) 
1727) 
1728) # No need to assert debug messages as of yet.
1729) info_emitted = message_emitted_factory(logging.INFO)
1730) warning_emitted = message_emitted_factory(logging.WARNING)
1731) deprecation_warning_emitted = message_emitted_factory(
1732)     logging.WARNING, logger_name=f'{cli.PROG_NAME}.deprecation'
1733) )
Marco Ricci Fix usage of `--debug`, `--...

Marco Ricci authored 3 weeks ago

1734) deprecation_info_emitted = message_emitted_factory(
1735)     logging.INFO, logger_name=f'{cli.PROG_NAME}.deprecation'
1736) )