summaryrefslogtreecommitdiff
path: root/src/otp2289/__main__.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/otp2289/__main__.py')
-rw-r--r--src/otp2289/__main__.py46
1 files changed, 18 insertions, 28 deletions
diff --git a/src/otp2289/__main__.py b/src/otp2289/__main__.py
index d267b1b..9f1aab8 100644
--- a/src/otp2289/__main__.py
+++ b/src/otp2289/__main__.py
@@ -1,7 +1,6 @@
1# -*- coding: utf-8 -*-
2# SPDX-License-Identifier: BSD-2-Clause-FreeBSD 1# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3# 2#
4# Copyright (c) 2020-2023 Simeon Simeonov 3# Copyright (c) 2020-2025 Simeon Simeonov
5# All rights reserved. 4# All rights reserved.
6# 5#
7# Redistribution and use in source and binary forms, with or without 6# Redistribution and use in source and binary forms, with or without
@@ -32,10 +31,10 @@ python -m otp2289 --initiate-new-sequence -s TesT
32python -m otp2289 --generate-otp-response -c "otp-md5 499 TesT " -f token 31python -m otp2289 --generate-otp-response -c "otp-md5 499 TesT " -f token
33python -m otp2289 --generate-otp-response -s TesT -i 499 -f token 32python -m otp2289 --generate-otp-response -s TesT -i 499 -f token
34""" 33"""
34
35import argparse 35import argparse
36import errno 36import errno
37import getpass 37import getpass
38import io
39import os 38import os
40import secrets 39import secrets
41import string 40import string
@@ -56,17 +55,15 @@ def generate_otp_response(args: argparse.Namespace) -> str:
56 :param args: The arguments assigned from argparse 55 :param args: The arguments assigned from argparse
57 :type args: argparse.Namespace 56 :type args: argparse.Namespace
58 57
59 :raises otp2289.OTPChallengeException: If the challenge is invalid 58 :raises otp2289.OTPChallengeError: If the challenge is invalid
60 59
61 :raises otp2289.OTPGeneratorException: If generator parameters are wrong 60 :raises otp2289.OTPGeneratorError: If generator parameters are wrong
62 61
63 :return: The response string 62 :return: The response string
64 :rtype: str 63 :rtype: str
65 """ 64 """
66 generator = otp2289.generator.OTPGenerator( 65 generator = otp2289.generator.OTPGenerator(
67 args.password.encode(), 66 args.password.encode(), args.seed, args.hash_algo
68 args.seed,
69 args.hash_algo,
70 ) 67 )
71 if args.challenge_string: 68 if args.challenge_string:
72 if args.output_format == 'token': 69 if args.output_format == 'token':
@@ -95,27 +92,26 @@ def generate_otp_range(args: argparse.Namespace) -> str:
95 :param args: The arguments assigned from argparse 92 :param args: The arguments assigned from argparse
96 :type args: argparse.Namespace 93 :type args: argparse.Namespace
97 94
98 :raises otp2289.OTPChallengeException: If the challenge is invalid 95 :raises otp2289.OTPChallengeError: If the challenge is invalid
99 96
100 :raises otp2289.OTPGeneratorException: If generator parameters are wrong 97 :raises otp2289.OTPGeneratorError: If generator parameters are wrong
101 98
102 :return: The responses string 99 :return: The responses string
103 :rtype: str 100 :rtype: str
104 """ 101 """
105 generator = otp2289.generator.OTPGenerator( 102 generator = otp2289.generator.OTPGenerator(
106 args.password.encode(), 103 args.password.encode(), args.seed, args.hash_algo
107 args.seed,
108 args.hash_algo,
109 ) 104 )
110 if args.output_format == 'token': 105 if args.output_format == 'token':
111 method = generator.generate_otp_words 106 method = generator.generate_otp_words
112 else: 107 else:
113 method = generator.generate_otp_hexdigest 108 method = generator.generate_otp_hexdigest
109
114 # handle most cases explicitly 110 # handle most cases explicitly
115 if args.range == 1: 111 if args.range == 1:
116 return f'{args.step}: ' + method(args.step) 112 return f'{args.step}: ' + method(args.step)
117 if args.range > args.step + 1: 113 args.range = min(args.range, args.step + 1)
118 args.range = args.step + 1 114
119 # any need for quiet? 115 # any need for quiet?
120 header = '' 116 header = ''
121 if not args.quiet: 117 if not args.quiet:
@@ -126,11 +122,7 @@ def generate_otp_range(args: argparse.Namespace) -> str:
126 return header + os.linesep.join( 122 return header + os.linesep.join(
127 [ 123 [
128 f'{step}: ' + method(step) 124 f'{step}: ' + method(step)
129 for step in range( 125 for step in range(args.step, args.step - args.range, -1)
130 args.step,
131 args.step - args.range,
132 -1,
133 )
134 ] 126 ]
135 ) 127 )
136 128
@@ -171,7 +163,7 @@ def get_password(args: argparse.Namespace) -> str:
171 return password 163 return password
172 164
173 if os.path.isfile(args.password): 165 if os.path.isfile(args.password):
174 with io.open(args.password, 'r', encoding='utf-8') as fp: 166 with open(args.password, encoding='utf-8') as fp:
175 return fp.readline().strip() 167 return fp.readline().strip()
176 168
177 return args.password 169 return args.password
@@ -196,9 +188,9 @@ def initiate_new_sequence(args: argparse.Namespace) -> str:
196 :param args: The arguments assigned from argparse 188 :param args: The arguments assigned from argparse
197 :type args: argparse.Namespace 189 :type args: argparse.Namespace
198 190
199 :raises otp2289.OTPChallengeException: If the challenge is invalid 191 :raises otp2289.OTPChallengeError: If the challenge is invalid
200 192
201 :raises otp2289.OTPGeneratorException: If generator parameters are wrong 193 :raises otp2289.OTPGeneratorError: If generator parameters are wrong
202 194
203 :return: The response string 195 :return: The response string
204 :rtype: str 196 :rtype: str
@@ -212,9 +204,7 @@ def initiate_new_sequence(args: argparse.Namespace) -> str:
212 f'Hash: {args.hash_algo}{os.linesep}' 204 f'Hash: {args.hash_algo}{os.linesep}'
213 ) 205 )
214 generator = otp2289.generator.OTPGenerator( 206 generator = otp2289.generator.OTPGenerator(
215 args.password.encode(), 207 args.password.encode(), args.seed, args.hash_algo
216 args.seed,
217 args.hash_algo,
218 ) 208 )
219 if args.challenge_string: 209 if args.challenge_string:
220 return header + generator.generate_otp_hexdigest_from_challenge( 210 return header + generator.generate_otp_hexdigest_from_challenge(
@@ -372,9 +362,9 @@ def main(args=None):
372 if args.generate_otp_response: 362 if args.generate_otp_response:
373 print(generate_otp_response(args)) 363 print(generate_otp_response(args))
374 sys.exit(0) 364 sys.exit(0)
375 except otp2289.generator.OTPGeneratorException as exp: 365 except otp2289.generator.OTPGeneratorError as exp:
376 eprint(f'GeneratorException: {exp}') 366 eprint(f'GeneratorException: {exp}')
377 except otp2289.generator.OTPChallengeException as exp: 367 except otp2289.generator.OTPChallengeError as exp:
378 eprint(f'ChallengeException: {exp}') 368 eprint(f'ChallengeException: {exp}')
379 except Exception as exp: 369 except Exception as exp:
380 eprint(f'Unknown error: {exp}') 370 eprint(f'Unknown error: {exp}')