Skip to content

Commit 552d7b4

Browse files
python-common/cryptotools: unify and organize all endpoint functions
Lightly reorganize and make the "endpoint" functions in cryptotools.py more consistent and uniform. Use small functions for input and output handling so that the handling is done the same way throughout. Pass a pre-constructed crypto caller via the args to then endpoint functions. Make generating the private key it's own named function rather than one single (and only) function with overloaded behavior controlled by a cli switch. Signed-off-by: John Mulligan <jmulligan@redhat.com>
1 parent c98e53f commit 552d7b4

File tree

2 files changed

+53
-48
lines changed

2 files changed

+53
-48
lines changed

src/python-common/ceph/cryptotools/cryptotools.py

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -138,80 +138,88 @@ def verify_tls(self, crt: str, key: str) -> None:
138138
self.fail(f'Invalid cert/key pair: {e}')
139139

140140

141-
# subcommand functions
142-
def password_hash(args: Namespace) -> None:
143-
data = json.loads(sys.stdin.read())
141+
def _read() -> str:
142+
return sys.stdin.read()
143+
144+
145+
def _load() -> Dict[str, Any]:
146+
return json.loads(_read())
147+
148+
149+
def _respond(data: Dict[str, Any]) -> None:
150+
json.dump(data, sys.stdout)
151+
152+
153+
def _write(content: str) -> None:
154+
sys.stdout.write(content)
155+
sys.stdout.flush()
156+
157+
158+
def _fail(msg: str, code: int = 0) -> Any:
159+
json.dump({'error': msg}, sys.stdout)
160+
sys.exit(code)
161+
144162

163+
def password_hash(args: Namespace) -> None:
164+
data = _load()
145165
password = data['password']
146166
salt_password = data['salt_password']
147-
148-
hash_str = InternalCryptoCaller().password_hash(password, salt_password)
149-
json.dump({'hash': hash_str}, sys.stdout)
167+
hash_str = args.crypto.password_hash(password, salt_password)
168+
_respond({'hash': hash_str})
150169

151170

152171
def verify_password(args: Namespace) -> None:
153-
icc = InternalCryptoCaller()
154-
data = json.loads(sys.stdin.read())
172+
data = _load()
155173
password = data.get('password', '')
156174
hashed_password = data.get('hashed_password', '')
157175
try:
158-
icc.verify_password(password, hashed_password)
176+
ok = args.crypto.verify_password(password, hashed_password)
159177
except ValueError as err:
160-
_fail_message(str(err))
161-
json.dump({'ok': ok}, sys.stdout)
178+
_fail(str(err))
179+
_respond({'ok': ok})
180+
181+
182+
def create_private_key(args: Namespace) -> None:
183+
_write(args.crypto.create_private_key())
162184

163185

164186
def create_self_signed_cert(args: Namespace) -> None:
165-
icc = InternalCryptoCaller()
166-
# Generate private key
167-
if args.private_key:
168-
# create a key pair
169-
print(icc.create_private_key())
170-
return
171-
172-
data = json.loads(sys.stdin.read())
187+
data = _load()
173188
dname = data['dname']
174-
print(icc.create_self_signed_cert(dname, data['private_key']))
189+
private_key = data['private_key']
190+
_write(args.crypto.create_self_signed_cert(dname, private_key))
175191

176192

177193
def certificate_days_to_expire(args: Namespace) -> None:
178-
icc = InternalCryptoCaller()
179-
crt = sys.stdin.read()
194+
crt = _read()
180195
try:
181-
days_until_exp = icc.certificate_days_to_expire(crt)
196+
days_until_exp = args.crypto.certificate_days_to_expire(crt)
182197
except InternalError as err:
183-
print(str(err), file=sys.stderr)
184-
sys.exit(1)
185-
json.dump({'days_until_expiration': days_until_exp}, sys.stdout)
198+
_fail(str(err))
199+
_respond({'days_until_expiration': days_until_exp})
186200

187201

188202
def get_cert_issuer_info(args: Namespace) -> None:
189-
crt = sys.stdin.read()
190-
org_name, cn = InternalCryptoCaller().get_cert_issuer_info(crt)
191-
json.dump({'org_name': org_name, 'cn': cn}, sys.stdout)
192-
193-
194-
def _fail_message(msg: str) -> None:
195-
json.dump({'error': msg}, sys.stdout)
196-
sys.exit(0)
203+
crt = _read()
204+
org_name, cn = args.crypto.get_cert_issuer_info(crt)
205+
_respond({'org_name': org_name, 'cn': cn})
197206

198207

199208
def verify_tls(args: Namespace) -> None:
200-
data = json.loads(sys.stdin.read())
201-
209+
data = _load()
202210
crt = data['crt']
203211
key = data['key']
204-
205212
try:
206-
InternalCryptoCaller().verify_tls(crt, key)
213+
args.crypto.verify_tls(crt, key)
207214
except ValueError as err:
208-
json.dump({'error': str(err)}, sys.stdout)
209-
json.dump({'ok': True}, sys.stdout) # need to emit something on success
215+
_fail(str(err))
216+
_respond({'ok': True}) # need to emit something on success
210217

211218

212-
def main():
219+
def main() -> None:
213220
# create the top-level parser
214221
parser = argparse.ArgumentParser(prog='cryptotools.py')
222+
parser.set_defaults(crypto=InternalCryptoCaller())
215223
subparsers = parser.add_subparsers(required=True)
216224

217225
# create the parser for the "password_hash" command
@@ -220,14 +228,11 @@ def main():
220228

221229
# create the parser for the "create_self_signed_cert" command
222230
parser_cssc = subparsers.add_parser('create_self_signed_cert')
223-
parser_cssc.add_argument(
224-
'--private_key', required=False, action='store_true'
225-
)
226-
parser_cssc.add_argument(
227-
'--certificate', required=False, action='store_true'
228-
)
229231
parser_cssc.set_defaults(func=create_self_signed_cert)
230232

233+
parser_cpk = subparsers.add_parser('create_private_key')
234+
parser_cpk.set_defaults(func=create_private_key)
235+
231236
# create the parser for the "certificate_days_to_expire" command
232237
parser_dte = subparsers.add_parser('certificate_days_to_expire')
233238
parser_dte.set_defaults(func=certificate_days_to_expire)

src/python-common/ceph/cryptotools/remote.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def map_error(self, err: Exception) -> Optional[Exception]:
9797
def create_private_key(self) -> str:
9898
"""Create a new TLS private key, returning it as a string."""
9999
result = self._run(
100-
['create_self_signed_cert', '--private_key'],
100+
['create_private_key'],
101101
capture_output=True,
102102
check=True,
103103
)

0 commit comments

Comments
 (0)