7
7
#include "../../../services/convert/convert.h"
8
8
#include "../../cli_helpers.h"
9
9
#include "../../../ui/scene_director.h"
10
-
11
- #define TOTP_CLI_COMMAND_ADD_ARG_NAME "name"
12
- #define TOTP_CLI_COMMAND_ADD_ARG_ALGO "algo"
13
- #define TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX "-a"
14
- #define TOTP_CLI_COMMAND_ADD_ARG_DIGITS "digits"
15
- #define TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX "-d"
16
- #define TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX "-u"
17
- #define TOTP_CLI_COMMAND_ADD_ARG_DURATION "duration"
18
- #define TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX "-l"
19
-
20
- static bool token_info_set_algo_from_str (TokenInfo * token_info , const FuriString * str ) {
21
- if (furi_string_cmpi_str (str , TOTP_CONFIG_TOKEN_ALGO_SHA1_NAME ) == 0 ) {
22
- token_info -> algo = SHA1 ;
23
- return true;
24
- }
25
-
26
- if (furi_string_cmpi_str (str , TOTP_CONFIG_TOKEN_ALGO_SHA256_NAME ) == 0 ) {
27
- token_info -> algo = SHA256 ;
28
- return true;
29
- }
30
-
31
- if (furi_string_cmpi_str (str , TOTP_CONFIG_TOKEN_ALGO_SHA512_NAME ) == 0 ) {
32
- token_info -> algo = SHA512 ;
33
- return true;
34
- }
35
-
36
- return false;
37
- }
38
-
39
- static bool args_read_uint8_and_trim (FuriString * args , uint8_t * value ) {
40
- int int_value ;
41
- if (!args_read_int_and_trim (args , & int_value ) || int_value < 0 || int_value > UINT8_MAX ) {
42
- return false;
43
- }
44
-
45
- * value = (uint8_t )int_value ;
46
- return true;
47
- }
10
+ #include "../../common_command_arguments.h"
48
11
49
12
void totp_cli_command_add_docopt_commands () {
50
13
TOTP_CLI_PRINTF (" " TOTP_CLI_COMMAND_ADD ", " TOTP_CLI_COMMAND_ADD_ALT
@@ -54,42 +17,46 @@ void totp_cli_command_add_docopt_commands() {
54
17
void totp_cli_command_add_docopt_usage () {
55
18
TOTP_CLI_PRINTF (
56
19
" " TOTP_CLI_COMMAND_NAME
57
- " " DOCOPT_REQUIRED (TOTP_CLI_COMMAND_ADD " | " TOTP_CLI_COMMAND_ADD_ALT " | " TOTP_CLI_COMMAND_ADD_ALT2 ) " " DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_NAME ) " " DOCOPT_OPTIONAL(DOCOPT_OPTION(TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX , DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_ALGO ))) " " DOCOPT_OPTIONAL(
20
+ " " DOCOPT_REQUIRED (TOTP_CLI_COMMAND_ADD " | " TOTP_CLI_COMMAND_ADD_ALT " | " TOTP_CLI_COMMAND_ADD_ALT2 ) " " DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ARG_NAME ) " " DOCOPT_OPTIONAL(DOCOPT_OPTION(TOTP_CLI_COMMAND_ARG_ALGO_PREFIX , DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ARG_ALGO))) " " DOCOPT_OPTIONAL(DOCOPT_OPTION(TOTP_CLI_COMMAND_ARG_DIGITS_PREFIX, DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ARG_DIGITS ))) " " DOCOPT_OPTIONAL(
58
21
DOCOPT_OPTION (
59
- TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX ,
22
+ TOTP_CLI_COMMAND_ARG_DURATION_PREFIX ,
60
23
DOCOPT_ARGUMENT (
61
- TOTP_CLI_COMMAND_ADD_ARG_DIGITS ))) " " DOCOPT_OPTIONAL (DOCOPT_OPTION ( TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX , DOCOPT_ARGUMENT ( TOTP_CLI_COMMAND_ADD_ARG_DURATION ))) " " DOCOPT_OPTIONAL (DOCOPT_SWITCH ( TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX )) "\r\n" );
24
+ TOTP_CLI_COMMAND_ARG_DURATION ))) " " DOCOPT_OPTIONAL (DOCOPT_SWITCH ( TOTP_CLI_COMMAND_ARG_UNSECURE_PREFIX )) " " DOCOPT_MULTIPLE ( DOCOPT_OPTIONAL (DOCOPT_OPTION ( TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE_PREFIX , DOCOPT_ARGUMENT ( TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE )) )) "\r\n" );
62
25
}
63
26
64
27
void totp_cli_command_add_docopt_arguments () {
65
- TOTP_CLI_PRINTF (" " TOTP_CLI_COMMAND_ADD_ARG_NAME " Token name\r\n" );
28
+ TOTP_CLI_PRINTF (" " TOTP_CLI_COMMAND_ARG_NAME " Token name\r\n" );
66
29
}
67
30
68
31
void totp_cli_command_add_docopt_options () {
69
32
TOTP_CLI_PRINTF (" " DOCOPT_OPTION (
70
- TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX ,
71
- DOCOPT_ARGUMENT (TOTP_CLI_COMMAND_ADD_ARG_ALGO )) " Token hashing algorithm.\r\n" );
72
- TOTP_CLI_PRINTF (
73
- " Could be one of: sha1, sha256, sha512 " DOCOPT_DEFAULT ("sha1" ) "\r\n" );
74
- cli_nl ();
33
+ TOTP_CLI_COMMAND_ARG_ALGO_PREFIX ,
34
+ DOCOPT_ARGUMENT (
35
+ TOTP_CLI_COMMAND_ARG_ALGO )) " Token hashing algorithm. Must be one of: " TOTP_TOKEN_ALGO_SHA1_NAME
36
+ ", " TOTP_TOKEN_ALGO_SHA256_NAME
37
+ ", " TOTP_TOKEN_ALGO_SHA512_NAME
38
+ " " DOCOPT_DEFAULT (TOTP_TOKEN_ALGO_SHA1_NAME ) "\r\n" );
75
39
TOTP_CLI_PRINTF (" " DOCOPT_OPTION (
76
- TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX ,
40
+ TOTP_CLI_COMMAND_ARG_DIGITS_PREFIX ,
77
41
DOCOPT_ARGUMENT (
78
- TOTP_CLI_COMMAND_ADD_ARG_DIGITS )) " Number of digits to generate, one of: 6, 8 " DOCOPT_DEFAULT ("6" ) "\r\n" );
42
+ TOTP_CLI_COMMAND_ARG_DIGITS )) " Number of digits to generate, one of: 6, 8 " DOCOPT_DEFAULT ("6" ) "\r\n" );
79
43
TOTP_CLI_PRINTF (" " DOCOPT_OPTION (
80
- TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX ,
44
+ TOTP_CLI_COMMAND_ARG_DURATION_PREFIX ,
81
45
DOCOPT_ARGUMENT (
82
- TOTP_CLI_COMMAND_ADD_ARG_DURATION )) " Token lifetime duration in seconds, between: 15 and 255 " DOCOPT_DEFAULT ("30" ) "\r\n" );
46
+ TOTP_CLI_COMMAND_ARG_DURATION )) " Token lifetime duration in seconds, between: 15 and 255 " DOCOPT_DEFAULT ("30" ) "\r\n" );
83
47
TOTP_CLI_PRINTF (" " DOCOPT_SWITCH (
84
- TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX ) " Show console user input as-is without masking\r\n" );
85
- }
86
-
87
- static void furi_string_secure_free (FuriString * str ) {
88
- for (long i = furi_string_size (str ) - 1 ; i >= 0 ; i -- ) {
89
- furi_string_set_char (str , i , '\0' );
90
- }
91
-
92
- furi_string_free (str );
48
+ TOTP_CLI_COMMAND_ARG_UNSECURE_PREFIX ) " Show console user input as-is without masking\r\n" );
49
+ TOTP_CLI_PRINTF (" " DOCOPT_OPTION (
50
+ TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE_PREFIX ,
51
+ DOCOPT_ARGUMENT (
52
+ TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE )) " Token automation features to be enabled. Must be one of: " TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME
53
+ ", " TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME
54
+ " " DOCOPT_DEFAULT (
55
+ TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME ) "\r\n" );
56
+ TOTP_CLI_PRINTF (" # " TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME
57
+ " - No features\r\n" );
58
+ TOTP_CLI_PRINTF (" # " TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME
59
+ " - Type <Enter> key at the end of token input automation\r\n" );
93
60
}
94
61
95
62
void totp_cli_command_add_handle (PluginState * plugin_state , FuriString * args , Cli * cli ) {
@@ -113,53 +80,12 @@ void totp_cli_command_add_handle(PluginState* plugin_state, FuriString* args, Cl
113
80
bool mask_user_input = true;
114
81
while (args_read_string_and_trim (args , temp_str )) {
115
82
bool parsed = false;
116
- if (furi_string_cmpi_str (temp_str , TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX ) == 0 ) {
117
- if (!args_read_string_and_trim (args , temp_str )) {
118
- TOTP_CLI_PRINTF_ERROR (
119
- "Missed value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX "\"\r\n" );
120
- } else if (!token_info_set_algo_from_str (token_info , temp_str )) {
121
- TOTP_CLI_PRINTF_ERROR (
122
- "\"%s\" is incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX
123
- "\"\r\n" ,
124
- furi_string_get_cstr (temp_str ));
125
- } else {
126
- parsed = true;
127
- }
128
- } else if (furi_string_cmpi_str (temp_str , TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX ) == 0 ) {
129
- uint8_t digit_value ;
130
- if (!args_read_uint8_and_trim (args , & digit_value )) {
131
- TOTP_CLI_PRINTF_ERROR (
132
- "Missed or incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX
133
- "\"\r\n" );
134
- } else if (!token_info_set_digits_from_int (token_info , digit_value )) {
135
- TOTP_CLI_PRINTF_ERROR (
136
- "\"%" PRIu8
137
- "\" is incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX
138
- "\"\r\n" ,
139
- digit_value );
140
- } else {
141
- parsed = true;
142
- }
143
- } else if (furi_string_cmpi_str (temp_str , TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX ) == 0 ) {
144
- uint8_t duration_value ;
145
- if (!args_read_uint8_and_trim (args , & duration_value )) {
146
- TOTP_CLI_PRINTF_ERROR (
147
- "Missed or incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX
148
- "\"\r\n" );
149
- } else if (!token_info_set_duration_from_int (token_info , duration_value )) {
150
- TOTP_CLI_PRINTF_ERROR (
151
- "\"%" PRIu8
152
- "\" is incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX
153
- "\"\r\n" ,
154
- duration_value );
155
- } else {
156
- parsed = true;
157
- }
158
- } else if (furi_string_cmpi_str (temp_str , TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX ) == 0 ) {
159
- mask_user_input = false;
160
- parsed = true;
161
- } else {
162
- TOTP_CLI_PRINTF_ERROR ("Unknown argument \"%s\"\r\n" , furi_string_get_cstr (temp_str ));
83
+ if (!totp_cli_try_read_algo (token_info , temp_str , args , & parsed ) &&
84
+ !totp_cli_try_read_digits (token_info , temp_str , args , & parsed ) &&
85
+ !totp_cli_try_read_duration (token_info , temp_str , args , & parsed ) &&
86
+ !totp_cli_try_read_unsecure_flag (temp_str , & parsed , & mask_user_input ) &&
87
+ !totp_cli_try_read_automation_features (token_info , temp_str , args , & parsed )) {
88
+ totp_cli_printf_unknown_argument (temp_str );
163
89
}
164
90
165
91
if (!parsed ) {
0 commit comments