Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/cwltool/secrets.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
1 """Minimal in memory storage of secrets.""" | |
2 import uuid | |
3 from typing import Dict, List, MutableMapping, MutableSequence, Optional, cast | |
4 | |
5 from .utils import CWLObjectType, CWLOutputType | |
6 | |
7 | |
8 class SecretStore: | |
9 """Minimal implementation of a secret storage.""" | |
10 | |
11 def __init__(self) -> None: | |
12 """Initialize the secret store.""" | |
13 self.secrets = {} # type: Dict[str, str] | |
14 | |
15 def add(self, value: Optional[CWLOutputType]) -> Optional[CWLOutputType]: | |
16 """ | |
17 Add the given value to the store. | |
18 | |
19 Returns a placeholder value to use until the real value is needed. | |
20 """ | |
21 if not isinstance(value, str): | |
22 raise Exception("Secret store only accepts strings") | |
23 | |
24 if value not in self.secrets: | |
25 placeholder = "(secret-%s)" % str(uuid.uuid4()) | |
26 self.secrets[placeholder] = value | |
27 return placeholder | |
28 return value | |
29 | |
30 def store(self, secrets: List[str], job: CWLObjectType) -> None: | |
31 """Sanitize the job object of any of the given secrets.""" | |
32 for j in job: | |
33 if j in secrets: | |
34 job[j] = self.add(job[j]) | |
35 | |
36 def has_secret(self, value: CWLOutputType) -> bool: | |
37 """Test if the provided document has any of our secrets.""" | |
38 if isinstance(value, str): | |
39 for k in self.secrets: | |
40 if k in value: | |
41 return True | |
42 elif isinstance(value, MutableMapping): | |
43 for this_value in value.values(): | |
44 if self.has_secret(cast(CWLOutputType, this_value)): | |
45 return True | |
46 elif isinstance(value, MutableSequence): | |
47 for this_value in value: | |
48 if self.has_secret(cast(CWLOutputType, this_value)): | |
49 return True | |
50 return False | |
51 | |
52 def retrieve(self, value: CWLOutputType) -> CWLOutputType: | |
53 """Replace placeholders with their corresponding secrets.""" | |
54 if isinstance(value, str): | |
55 for key, this_value in self.secrets.items(): | |
56 value = value.replace(key, this_value) | |
57 return value | |
58 elif isinstance(value, MutableMapping): | |
59 return {k: self.retrieve(cast(CWLOutputType, v)) for k, v in value.items()} | |
60 elif isinstance(value, MutableSequence): | |
61 return [self.retrieve(cast(CWLOutputType, v)) for v in value] | |
62 return value |